From f88cec92ab7cbd6f37b24a9616fad6f3a0652af3 Mon Sep 17 00:00:00 2001 From: Michael Shipman Date: Tue, 7 Nov 2023 19:56:53 -0500 Subject: [PATCH] radio test code that compiles? --- .../XBee_Joint-2023-10-17_144100.zip | Bin 111398 -> 0 bytes .../XBee_Joint-2023-11-07_185025.zip | Bin 0 -> 121968 bytes Code/.DS_Store | Bin 8196 -> 8196 bytes Code/BITS/.DS_Store | Bin 8196 -> 8196 bytes Code/BITS/BITSv5/.vscode/settings.json | 5 + .../Arduino-DRF1262T-RX.ino | 165 - .../Arduino-DRF1262T-RX/radio.cpp | 1016 - .../Arduino-DRF1262T-RX/radio.h | 376 - .../Arduino-DRF1262T-RX/sx126x-board.cpp | 225 - .../Arduino-DRF1262T-RX/sx126x-board.h | 137 - .../Arduino-DRF1262T-RX/sx126x.cpp | 693 - .../Arduino-DRF1262T-RX/sx126x.h | 1115 - .../Arduino-DRF1262T-RX/timer.cpp | 29 - .../Arduino-DRF1262T-RX/timer1.h | 5 - .../Arduino-DRF1262T-TX.ino | 161 - .../Arduino-DRF1262T-TX/radio.cpp | 1016 - .../Arduino-DRF1262T-TX/radio.h | 376 - .../Arduino-DRF1262T-TX/sx126x-board.cpp | 225 - .../Arduino-DRF1262T-TX/sx126x-board.h | 137 - .../Arduino-DRF1262T-TX/sx126x.cpp | 693 - .../Arduino-DRF1262T-TX/sx126x.h | 1115 - .../Arduino-DRF1262T-TX/timer.cpp | 29 - .../Arduino-DRF1262T-TX/timer1.h | 5 - .../BITSv5/radio-test/build/CMakeCache.txt | 2 +- .../radio-test/build/CMakeFiles/Progress/1 | 1 + .../radio-test/build/CMakeFiles/Progress/17 | 1 + .../radio-test/build/CMakeFiles/Progress/18 | 1 + .../radio-test/build/CMakeFiles/Progress/2 | 1 + .../radio-test/build/CMakeFiles/Progress/20 | 1 + .../radio-test/build/CMakeFiles/Progress/21 | 1 + .../radio-test/build/CMakeFiles/Progress/23 | 1 + .../radio-test/build/CMakeFiles/Progress/3 | 1 + .../radio-test/build/CMakeFiles/Progress/4 | 1 + .../radio-test/build/CMakeFiles/Progress/5 | 1 + .../radio-test/build/CMakeFiles/Progress/6 | 1 + .../radio-test/build/CMakeFiles/Progress/7 | 1 + .../radio-test/build/CMakeFiles/Progress/8 | 1 + .../radio-test/build/CMakeFiles/Progress/97 | 1 + .../build/CMakeFiles/Progress/count.txt | 1 + .../radio-test.dir/compiler_depend.internal | 73 + .../radio-test.dir/compiler_depend.make | 78 +- .../radio-test.dir/radio_test.cpp.obj | Bin 2052 -> 3576 bytes .../BITSv5/radio-test/build/radio-test.elf | Bin 57588 -> 0 bytes .../radio-test/build/radio-test.elf.map | 1827 +- Code/BITS/BITSv5/radio-test/radio_test.cpp | 57 + .../BITSv5/radio-test/radiolib-src/BuildOpt.h | 519 + .../radio-test/radiolib-src/BuildOptUser.h | 11 + .../BITSv5/radio-test/radiolib-src/Hal.cpp | 82 + .../BITS/BITSv5/radio-test/radiolib-src/Hal.h | 305 + .../BITSv5/radio-test/radiolib-src/Module.cpp | 540 + .../BITSv5/radio-test/radiolib-src/Module.h | 510 + .../radio-test/radiolib-src/RP2040Hal.cpp | 189 + .../radio-test/radiolib-src/RP2040Hal.h | 73 + .../BITSv5/radio-test/radiolib-src/RadioLib.h | 159 + .../BITSv5/radio-test/radiolib-src/TypeDef.h | 560 + .../radiolib-src/modules/CC1101/CC1101.cpp | 1107 + .../radiolib-src/modules/CC1101/CC1101.h | 990 + .../radiolib-src/modules/LLCC68/LLCC68.cpp | 56 + .../radiolib-src/modules/LLCC68/LLCC68.h | 67 + .../radiolib-src/modules/RF69/RF69.cpp | 1080 + .../radiolib-src/modules/RF69/RF69.h | 1038 + .../radiolib-src/modules/RFM2x/RFM22.h | 20 + .../radiolib-src/modules/RFM2x/RFM23.h | 20 + .../radiolib-src/modules/SX1231/SX1231.cpp | 91 + .../radiolib-src/modules/SX1231/SX1231.h | 121 + .../radiolib-src/modules/SX126x/STM32WLx.cpp | 153 + .../radiolib-src/modules/SX126x/STM32WLx.h | 168 + .../modules/SX126x/STM32WLx_Module.cpp | 106 + .../modules/SX126x/STM32WLx_Module.h | 38 + .../radiolib-src/modules/SX126x/SX1261.cpp | 29 + .../radiolib-src/modules/SX126x/SX1261.h | 45 + .../radiolib-src/modules/SX126x/SX1262.cpp | 105 + .../radiolib-src/modules/SX126x/SX1262.h | 98 + .../radiolib-src/modules/SX126x/SX1268.cpp | 100 + .../radiolib-src/modules/SX126x/SX1268.h | 96 + .../radiolib-src/modules/SX126x/SX126x.cpp | 2137 ++ .../radiolib-src/modules/SX126x/SX126x.h | 1167 + .../SX126x/patches/SX126x_patch_scan.h | 110 + .../radiolib-src/modules/SX127x/SX1272.cpp | 529 + .../radiolib-src/modules/SX127x/SX1272.h | 295 + .../radiolib-src/modules/SX127x/SX1273.cpp | 95 + .../radiolib-src/modules/SX127x/SX1273.h | 67 + .../radiolib-src/modules/SX127x/SX1276.cpp | 82 + .../radiolib-src/modules/SX127x/SX1276.h | 80 + .../radiolib-src/modules/SX127x/SX1277.cpp | 137 + .../radiolib-src/modules/SX127x/SX1277.h | 94 + .../radiolib-src/modules/SX127x/SX1278.cpp | 644 + .../radiolib-src/modules/SX127x/SX1278.h | 312 + .../radiolib-src/modules/SX127x/SX1279.cpp | 82 + .../radiolib-src/modules/SX127x/SX1279.h | 74 + .../radiolib-src/modules/SX127x/SX127x.cpp | 1679 + .../radiolib-src/modules/SX127x/SX127x.h | 1241 + .../radiolib-src/modules/SX128x/SX1280.cpp | 182 + .../radiolib-src/modules/SX128x/SX1280.h | 56 + .../radiolib-src/modules/SX128x/SX1281.cpp | 8 + .../radiolib-src/modules/SX128x/SX1281.h | 31 + .../radiolib-src/modules/SX128x/SX1282.cpp | 9 + .../radiolib-src/modules/SX128x/SX1282.h | 32 + .../radiolib-src/modules/SX128x/SX128x.cpp | 1514 + .../radiolib-src/modules/SX128x/SX128x.h | 853 + .../radiolib-src/modules/Si443x/Si4430.cpp | 38 + .../radiolib-src/modules/Si443x/Si4430.h | 67 + .../radiolib-src/modules/Si443x/Si4431.cpp | 31 + .../radiolib-src/modules/Si443x/Si4431.h | 60 + .../radiolib-src/modules/Si443x/Si4432.cpp | 38 + .../radiolib-src/modules/Si443x/Si4432.h | 67 + .../radiolib-src/modules/Si443x/Si443x.cpp | 813 + .../radiolib-src/modules/Si443x/Si443x.h | 861 + .../radiolib-src/modules/nRF24/nRF24.cpp | 657 + .../radiolib-src/modules/nRF24/nRF24.h | 492 + .../radiolib-src/protocols/AFSK/AFSK.cpp | 42 + .../radiolib-src/protocols/AFSK/AFSK.h | 70 + .../radiolib-src/protocols/APRS/APRS.cpp | 267 + .../radiolib-src/protocols/APRS/APRS.h | 148 + .../radiolib-src/protocols/AX25/AX25.cpp | 450 + .../radiolib-src/protocols/AX25/AX25.h | 326 + .../protocols/BellModem/BellModem.cpp | 98 + .../protocols/BellModem/BellModem.h | 131 + .../protocols/ExternalRadio/ExternalRadio.cpp | 47 + .../protocols/ExternalRadio/ExternalRadio.h | 69 + .../radiolib-src/protocols/FSK4/FSK4.cpp | 129 + .../radiolib-src/protocols/FSK4/FSK4.h | 99 + .../protocols/Hellschreiber/Hellschreiber.cpp | 102 + .../protocols/Hellschreiber/Hellschreiber.h | 156 + .../protocols/LoRaWAN/LoRaWAN.cpp | 1829 + .../radiolib-src/protocols/LoRaWAN/LoRaWAN.h | 532 + .../protocols/LoRaWAN/LoRaWANBands.cpp | 731 + .../radiolib-src/protocols/Morse/Morse.cpp | 187 + .../radiolib-src/protocols/Morse/Morse.h | 181 + .../radiolib-src/protocols/Pager/Pager.cpp | 556 + .../radiolib-src/protocols/Pager/Pager.h | 191 + .../protocols/PhysicalLayer/PhysicalLayer.cpp | 475 + .../protocols/PhysicalLayer/PhysicalLayer.h | 501 + .../protocols/Print/ITA2String.cpp | 113 + .../radiolib-src/protocols/Print/ITA2String.h | 70 + .../radiolib-src/protocols/Print/Print.cpp | 312 + .../radiolib-src/protocols/Print/Print.h | 67 + .../radiolib-src/protocols/RTTY/RTTY.cpp | 127 + .../radiolib-src/protocols/RTTY/RTTY.h | 85 + .../radiolib-src/protocols/SSTV/SSTV.cpp | 307 + .../radiolib-src/protocols/SSTV/SSTV.h | 202 + .../radio-test/radiolib-src/utils/CRC.cpp | 35 + .../radio-test/radiolib-src/utils/CRC.h | 68 + .../radiolib-src/utils/Cryptography.cpp | 294 + .../radiolib-src/utils/Cryptography.h | 174 + .../radio-test/radiolib-src/utils/FEC.cpp | 293 + .../radio-test/radiolib-src/utils/FEC.h | 69 + Code/BITS/BITSv5/test/CMakeLists.txt | 5 +- Code/BITS/BITSv5/test/SX126x.cpp | 842 + Code/BITS/BITSv5/test/SX126x.h | 512 + Code/BITS/BITSv5/test/build/CMakeCache.txt | 2 +- .../BITSv5/test/build/CMakeFiles/Makefile2 | 4 +- .../test/build/CMakeFiles/progress.marks | 2 +- .../CMakeFiles/test.dir/DependInfo.cmake | 5 +- .../build/CMakeFiles/test.dir/SX126x.cpp.obj | Bin 0 -> 18672 bytes .../CMakeFiles/test.dir/SX126x.cpp.obj.d | 109 + .../test/build/CMakeFiles/test.dir/build.make | 204 +- .../CMakeFiles/test.dir/cmake_clean.cmake | 8 +- .../test.dir/compiler_depend.internal | 163 +- .../CMakeFiles/test.dir/compiler_depend.make | 613 +- .../test/build/CMakeFiles/test.dir/flags.make | 6 +- .../test/build/CMakeFiles/test.dir/link.txt | 2 +- .../build/CMakeFiles/test.dir/progress.make | 2 + .../build/CMakeFiles/test.dir/test.c.obj.d | 3 +- .../build/CMakeFiles/test.dir/test.cpp.obj | Bin 0 -> 2052 bytes .../build/CMakeFiles/test.dir/test.cpp.obj.d | 83 + Code/BITS/BITSv5/test/build/Makefile | 78 +- Code/BITS/BITSv5/test/build/test.bin | Bin 33204 -> 37072 bytes Code/BITS/BITSv5/test/build/test.dis | 28571 ++++++++-------- Code/BITS/BITSv5/test/build/test.elf | Bin 74516 -> 80368 bytes Code/BITS/BITSv5/test/build/test.elf.map | 1454 +- Code/BITS/BITSv5/test/build/test.hex | 4319 +-- Code/BITS/BITSv5/test/build/test.uf2 | Bin 66560 -> 74240 bytes Code/BITS/BITSv5/test/test.c | 44 - Code/BITS/BITSv5/test/test.cpp | 87 + 175 files changed, 54558 insertions(+), 24778 deletions(-) delete mode 100644 Boards/XBee Joint/XBee_Joint/XBee_Joint-backups/XBee_Joint-2023-10-17_144100.zip create mode 100644 Boards/XBee Joint/XBee_Joint/XBee_Joint-backups/XBee_Joint-2023-11-07_185025.zip create mode 100644 Code/BITS/BITSv5/.vscode/settings.json delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/Arduino-DRF1262T-RX.ino delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/radio.cpp delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/radio.h delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x-board.cpp delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x-board.h delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x.cpp delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x.h delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/timer.cpp delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/timer1.h delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/Arduino-DRF1262T-TX.ino delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/radio.cpp delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/radio.h delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x-board.cpp delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x-board.h delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x.cpp delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x.h delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/timer.cpp delete mode 100644 Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/timer1.h create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/1 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/17 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/18 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/2 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/20 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/21 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/23 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/3 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/4 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/5 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/6 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/7 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/8 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/97 create mode 100644 Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/count.txt delete mode 100755 Code/BITS/BITSv5/radio-test/build/radio-test.elf create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/BuildOpt.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/BuildOptUser.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/Hal.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/Hal.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/Module.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/Module.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/RP2040Hal.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/RP2040Hal.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/RadioLib.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/TypeDef.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/CC1101/CC1101.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/CC1101/CC1101.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/LLCC68/LLCC68.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/LLCC68/LLCC68.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/RF69/RF69.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/RF69/RF69.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/RFM2x/RFM22.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/RFM2x/RFM23.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX1231/SX1231.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX1231/SX1231.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx_Module.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx_Module.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1261.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1261.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1262.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1262.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1268.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1268.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX126x.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX126x.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/patches/SX126x_patch_scan.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1272.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1272.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1273.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1273.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1276.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1276.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1277.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1277.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1278.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1278.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1279.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1279.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX127x.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX127x.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1280.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1280.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1281.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1281.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1282.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1282.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX128x.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX128x.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4430.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4430.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4431.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4431.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4432.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4432.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si443x.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si443x.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/nRF24/nRF24.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/modules/nRF24/nRF24.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AFSK/AFSK.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AFSK/AFSK.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/APRS/APRS.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/APRS/APRS.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AX25/AX25.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AX25/AX25.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/BellModem/BellModem.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/BellModem/BellModem.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/ExternalRadio/ExternalRadio.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/ExternalRadio/ExternalRadio.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/FSK4/FSK4.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/FSK4/FSK4.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Hellschreiber/Hellschreiber.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Hellschreiber/Hellschreiber.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWAN.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWAN.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWANBands.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Morse/Morse.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Morse/Morse.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Pager/Pager.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Pager/Pager.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/PhysicalLayer/PhysicalLayer.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/PhysicalLayer/PhysicalLayer.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/ITA2String.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/ITA2String.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/Print.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/Print.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/RTTY/RTTY.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/RTTY/RTTY.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/SSTV/SSTV.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/protocols/SSTV/SSTV.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/utils/CRC.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/utils/CRC.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/utils/Cryptography.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/utils/Cryptography.h create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/utils/FEC.cpp create mode 100644 Code/BITS/BITSv5/radio-test/radiolib-src/utils/FEC.h create mode 100644 Code/BITS/BITSv5/test/SX126x.cpp create mode 100644 Code/BITS/BITSv5/test/SX126x.h create mode 100644 Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/SX126x.cpp.obj create mode 100644 Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/SX126x.cpp.obj.d create mode 100644 Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.cpp.obj create mode 100644 Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.cpp.obj.d delete mode 100644 Code/BITS/BITSv5/test/test.c create mode 100644 Code/BITS/BITSv5/test/test.cpp diff --git a/Boards/XBee Joint/XBee_Joint/XBee_Joint-backups/XBee_Joint-2023-10-17_144100.zip b/Boards/XBee Joint/XBee_Joint/XBee_Joint-backups/XBee_Joint-2023-10-17_144100.zip deleted file mode 100644 index 5a91be25d06a1f9dde5be36e58080c9254f2203f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111398 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
    dk=3EE&&N`oSqS8*Iu0iKsJ`>2 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 literal 0 HcmV?d00001 diff --git a/Code/.DS_Store b/Code/.DS_Store index 09dacefa9bd117d9c8ec9fb13acd7d9965540cd0..16c55d4932160544f25026e3a7a28a5424dbc454 100644 GIT binary patch delta 25 gcmZp1XmQwZK!C%@&_GAQ*vNEpoQVBqcEP`V0B2SQqyPW_ delta 25 gcmZp1XmQwZK!C%<#85}U*wk`zoQVBqcEP`V0B8UQu>b%7 diff --git a/Code/BITS/.DS_Store b/Code/BITS/.DS_Store index 79a9f1f23ff0a5bdb6fcaf612a6deb29ab552f1e..fe590c71ee1537b4f0cc58f55c95885c6a56856a 100644 GIT binary patch delta 25 gcmZp1XmQw(B*I~2XrQBDY-Bolj-dDEts?&10AtSwkpKVy delta 25 gcmZp1XmQw(B*I~0VyL5FY-%}qj-dDEts?&10AzUwo&W#< diff --git a/Code/BITS/BITSv5/.vscode/settings.json b/Code/BITS/BITSv5/.vscode/settings.json new file mode 100644 index 00000000..c547ee72 --- /dev/null +++ b/Code/BITS/BITSv5/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "sx126x.h": "c" + } +} \ No newline at end of file diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/Arduino-DRF1262T-RX.ino b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/Arduino-DRF1262T-RX.ino deleted file mode 100644 index beaa3899..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/Arduino-DRF1262T-RX.ino +++ /dev/null @@ -1,165 +0,0 @@ -#include -#include -#include -#include "radio.h" -#include "timer1.h" -#include "sx126x.h" -#include "sx126x-board.h" -#define Get_NIRQ() digitalRead(Dio1Pin) -/* - * if you want to use TCXO please open sx1262.h line 29 -*/ - -uint8_t mode = USER_MODE_RX; /*mode SET current work mode: TX or RX*/ -/*Default frequency:868MHZ Bandwidth:125KHZ,RF_FACTOR:11 */ - -#define RF_FREQUENCY 868000000 // Hz center frequency -#define TX_OUTPUT_POWER 22 // dBm tx output power -#define LORA_BANDWIDTH 1 // bandwidth=125khz 0:250kHZ,1:125kHZ,2:62kHZ,3:20kHZ.... look for radio line 392 -#define LORA_SPREADING_FACTOR 11 // spreading factor=11 [SF5..SF12] -#define LORA_CODINGRATE 1 // [1: 4/5, - // 2: 4/6, - // 3: 4/7, - // 4: 4/8] -#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx -#define LORA_SYMBOL_TIMEOUT 0 // Symbols -#define LORA_FIX_LENGTH_PAYLOAD_ON false // variable data payload -#define LORA_IQ_INVERSION_ON false - -typedef enum -{ - LOWPOWER, - RX, - RX_TIMEOUT, - RX_ERROR, - TX, - TX_TIMEOUT, -}States_t; - -#define RX_TIMEOUT_VALUE 1000 -#define BUFFER_SIZE 64 // Define the payload size here -States_t State = LOWPOWER; - -RadioEvents_t RadioEvents; -uint16_t BufferSize = BUFFER_SIZE; -uint8_t Buffer[BUFFER_SIZE]; -int8_t RssiValue = 0; -int8_t SnrValue = 0; - -void OnTxDone( void ); -void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); -void OnTxTimeout( void ); -void OnRxTimeout( void ); -void OnRxError( void ); - -uint8_t i = 0; - -void setup() -{ - timer1_init(); - SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); - Serial.begin(9600); // set baud rate - SX126xIoInit(); //Initializes the radio I/Os pins - SPI.begin(); - - pinMode (Led1BluePin, OUTPUT); - pinMode (Led1RedPin, OUTPUT); - digitalWrite(Led1BluePin,1); - digitalWrite(Led1RedPin,1); - - // Radio initialization - RadioEvents.TxDone = OnTxDone; - RadioEvents.RxDone = OnRxDone; - RadioEvents.TxTimeout = OnTxTimeout; - RadioEvents.RxTimeout = OnRxTimeout; - RadioEvents.RxError = OnRxError; - - Radio.Init( &RadioEvents ); - Radio.SetChannel( RF_FREQUENCY ); - - Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0,LORA_BANDWIDTH, - LORA_SPREADING_FACTOR, LORA_CODINGRATE, - LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, - true, 0, 0, LORA_IQ_INVERSION_ON, 3000 ); - - Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH,LORA_SPREADING_FACTOR, - LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, - LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, - 0, true, 0, 0, LORA_IQ_INVERSION_ON, true ); - - if(USER_MODE_RX == mode) - { - - Radio.Rx(0); - digitalWrite(Led1BluePin,0); - Serial.println("Now is RX"); - }else - { - Radio.Send((uint8_t*)&i, 1 ); - } -} - -void loop() -{ - // put your main code here, to run repeatedly: - if(USER_MODE_RX == mode) - { - if( 0 != State ) - { - Serial.println(Buffer[0],DEC); // print received characters - - digitalWrite(Led1BluePin,digitalRead(Led1BluePin)^1); - State = LOWPOWER; - - } - }else if(TX == State) - { - delay(500); - i++; - Radio.Send((uint8_t*)&i, 1 ); //send one testing character, users can change the content - digitalWrite(Led1RedPin,digitalRead(Led1RedPin)^1); - } - // Process Radio IRQ - if(Get_NIRQ()) - { - Radio.IrqProcess( ); - } - - } - - - - -void OnTxDone( void ) -{ -// Radio.Sleep( ); - State = TX; -} - -void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) -{ -// Radio.Sleep( ); - BufferSize = size; - memcpy( Buffer, payload, BufferSize ); - RssiValue = rssi; - SnrValue = snr; - State = RX; -} - -void OnTxTimeout( void ) -{ - // Radio.Sleep( ); - State = TX_TIMEOUT; -} - -void OnRxTimeout( void ) -{ - // Radio.Sleep( ); - State = RX_TIMEOUT; -} - -void OnRxError( void ) -{ - // Radio.Sleep( ); - State = RX_ERROR; -} diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/radio.cpp b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/radio.cpp deleted file mode 100644 index 1ca1b623..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/radio.cpp +++ /dev/null @@ -1,1016 +0,0 @@ -/*! - * \file radio.c - * - * \brief Radio driver API definition - * - * \copyright Revised BSD License, see section \ref LICENSE. - * - * \code - * ______ _ - * / _____) _ | | - * ( (____ _____ ____ _| |_ _____ ____| |__ - * \____ \| ___ | (_ _) ___ |/ ___) _ \ - * _____) ) ____| | | || |_| ____( (___| | | | - * (______/|_____)_|_|_| \__)_____)\____)_| |_| - * (C)2013-2017 Semtech - * - * \endcode - * - * \author Miguel Luis ( Semtech ) - * - * \author Gregory Cristian ( Semtech ) - */ -#include -#include -#include "sx126x.h" -#include "radio.h" -#include "sx126x-board.h" - -/*! - * \brief Initializes the radio - * - * \param [IN] events Structure containing the driver callback functions - */ -void RadioInit( RadioEvents_t *events ); - -/*! - * Return current radio status - * - * \param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING] - */ -RadioState_t RadioGetStatus( void ); - -/*! - * \brief Configures the radio with the given modem - * - * \param [IN] modem Modem to be used [0: FSK, 1: LoRa] - */ -void RadioSetModem( uint8_t modem ); - -/*! - * \brief Sets the channel frequency - * - * \param [IN] freq Channel RF frequency - */ -void RadioSetChannel( uint32_t freq ); - -/*! - * \brief Checks if the channel is free for the given time - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] freq Channel RF frequency - * \param [IN] rssiThresh RSSI threshold - * \param [IN] maxCarrierSenseTime Max time while the RSSI is measured - * - * \retval isFree [true: Channel is free, false: Channel is not free] - */ -bool RadioIsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh, uint32_t maxCarrierSenseTime ); - -/*! - * \brief Generates a 32 bits random value based on the RSSI readings - * - * \remark This function sets the radio in LoRa modem mode and disables - * all interrupts. - * After calling this function either Radio.SetRxConfig or - * Radio.SetTxConfig functions must be called. - * - * \retval randomValue 32 bits random value - */ -uint32_t RadioRandom( void ); - -/*! - * \brief Sets the reception parameters - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] bandwidth Sets the bandwidth - * FSK : >= 2600 and <= 250000 Hz - * LoRa: [0: 125 kHz, 1: 250 kHz, - * 2: 500 kHz, 3: Reserved] - * \param [IN] datarate Sets the Datarate - * FSK : 600..300000 bits/s - * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, - * 10: 1024, 11: 2048, 12: 4096 chips] - * \param [IN] coderate Sets the coding rate (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] - * \param [IN] bandwidthAfc Sets the AFC Bandwidth (FSK only) - * FSK : >= 2600 and <= 250000 Hz - * LoRa: N/A ( set to 0 ) - * \param [IN] preambleLen Sets the Preamble length - * FSK : Number of bytes - * LoRa: Length in symbols (the hardware adds 4 more symbols) - * \param [IN] symbTimeout Sets the RxSingle timeout value - * FSK : timeout in number of bytes - * LoRa: timeout in symbols - * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] - * \param [IN] payloadLen Sets payload length when fixed length is used - * \param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON] - * \param [IN] FreqHopOn Enables disables the intra-packet frequency hopping - * FSK : N/A ( set to 0 ) - * LoRa: [0: OFF, 1: ON] - * \param [IN] HopPeriod Number of symbols between each hop - * FSK : N/A ( set to 0 ) - * LoRa: Number of symbols - * \param [IN] iqInverted Inverts IQ signals (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [0: not inverted, 1: inverted] - * \param [IN] rxContinuous Sets the reception in continuous mode - * [false: single mode, true: continuous mode] - */ -void RadioSetRxConfig( uint8_t modem, uint32_t bandwidth, - uint32_t datarate, uint8_t coderate, - uint32_t bandwidthAfc, uint16_t preambleLen, - uint16_t symbTimeout, bool fixLen, - uint8_t payloadLen, - bool crcOn, bool FreqHopOn, uint8_t HopPeriod, - bool iqInverted, bool rxContinuous ); - -/*! - * \brief Sets the transmission parameters - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] power Sets the output power [dBm] - * \param [IN] fdev Sets the frequency deviation (FSK only) - * FSK : [Hz] - * LoRa: 0 - * \param [IN] bandwidth Sets the bandwidth (LoRa only) - * FSK : 0 - * LoRa: [0: 125 kHz, 1: 250 kHz, - * 2: 500 kHz, 3: Reserved] - * \param [IN] datarate Sets the Datarate - * FSK : 600..300000 bits/s - * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, - * 10: 1024, 11: 2048, 12: 4096 chips] - * \param [IN] coderate Sets the coding rate (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] - * \param [IN] preambleLen Sets the preamble length - * FSK : Number of bytes - * LoRa: Length in symbols (the hardware adds 4 more symbols) - * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] - * \param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON] - * \param [IN] FreqHopOn Enables disables the intra-packet frequency hopping - * FSK : N/A ( set to 0 ) - * LoRa: [0: OFF, 1: ON] - * \param [IN] HopPeriod Number of symbols between each hop - * FSK : N/A ( set to 0 ) - * LoRa: Number of symbols - * \param [IN] iqInverted Inverts IQ signals (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [0: not inverted, 1: inverted] - * \param [IN] timeout Transmission timeout [ms] - */ -void RadioSetTxConfig( uint8_t modem, int8_t power, uint32_t fdev, - uint32_t bandwidth, uint32_t datarate, - uint8_t coderate, uint16_t preambleLen, - bool fixLen, bool crcOn, bool FreqHopOn, - uint8_t HopPeriod, bool iqInverted, uint32_t timeout ); - -/*! - * \brief Checks if the given RF frequency is supported by the hardware - * - * \param [IN] frequency RF frequency to be checked - * \retval isSupported [true: supported, false: unsupported] - */ -bool RadioCheckRfFrequency( uint32_t frequency ); - -/*! - * \brief Computes the packet time on air in ms for the given payload - * - * \Remark Can only be called once SetRxConfig or SetTxConfig have been called - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] pktLen Packet payload length - * - * \retval airTime Computed airTime (ms) for the given packet payload length - */ -uint32_t RadioTimeOnAir( RadioModems_t modem, uint8_t pktLen ); - -/*! - * \brief Sends the buffer of size. Prepares the packet to be sent and sets - * the radio in transmission - * - * \param [IN]: buffer Buffer pointer - * \param [IN]: size Buffer size - */ -void RadioSend( uint8_t *buffer, uint8_t size ); - -/*! - * \brief Sets the radio in sleep mode - */ -void RadioSleep( void ); - -/*! - * \brief Sets the radio in standby mode - */ -void RadioStandby( void ); - -/*! - * \brief Sets the radio in reception mode for the given time - * \param [IN] timeout Reception timeout [ms] - * [0: continuous, others timeout] - */ -void RadioRx( uint32_t timeout ); - -/*! - * \brief Start a Channel Activity Detection - */ -void RadioStartCad( void ); - -/*! - * \brief Sets the radio in continuous wave transmission mode - * - * \param [IN]: freq Channel RF frequency - * \param [IN]: power Sets the output power [dBm] - * \param [IN]: time Transmission mode timeout [s] - */ -void RadioSetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ); - -/*! - * \brief Reads the current RSSI value - * - * \retval rssiValue Current RSSI value in [dBm] - */ -int16_t RadioRssi( RadioModems_t modem ); - -/*! - * \brief Writes the radio register at the specified address - * - * \param [IN]: addr Register address - * \param [IN]: data New register value - */ -void RadioWrite( uint16_t addr, uint8_t data ); - -/*! - * \brief Reads the radio register at the specified address - * - * \param [IN]: addr Register address - * \retval data Register value - */ -uint8_t RadioRead( uint16_t addr ); - -/*! - * \brief Writes multiple radio registers starting at address - * - * \param [IN] addr First Radio register address - * \param [IN] buffer Buffer containing the new register's values - * \param [IN] size Number of registers to be written - */ -void RadioWriteBuffer( uint16_t addr, uint8_t *buffer, uint8_t size ); - -/*! - * \brief Reads multiple radio registers starting at address - * - * \param [IN] addr First Radio register address - * \param [OUT] buffer Buffer where to copy the registers data - * \param [IN] size Number of registers to be read - */ -void RadioReadBuffer( uint16_t addr, uint8_t *buffer, uint8_t size ); - -/*! - * \brief Sets the maximum payload length. - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] max Maximum payload length in bytes - */ -void RadioSetMaxPayloadLength( RadioModems_t modem, uint8_t max ); - -/*! - * \brief Sets the network to public or private. Updates the sync byte. - * - * \remark Applies to LoRa modem only - * - * \param [IN] enable if true, it enables a public network - */ -void RadioSetPublicNetwork( bool enable ); - -/*! - * \brief Gets the time required for the board plus radio to get out of sleep.[ms] - * - * \retval time Radio plus board wakeup time in ms. - */ -uint32_t RadioGetWakeupTime( void ); - -/*! - * \brief Process radio irq - */ -void RadioIrqProcess( void ); - -/*! - * \brief Sets the radio in reception mode with Max LNA gain for the given time - * \param [IN] timeout Reception timeout [ms] - * [0: continuous, others timeout] - */ -void RadioRxBoosted( uint32_t timeout ); - -/*! - * \brief Sets the Rx duty cycle management parameters - * - * \param [in] rxTime Structure describing reception timeout value - * \param [in] sleepTime Structure describing sleep timeout value - */ -void RadioSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ); - -/*! - * Radio driver structure initialization - */ - struct Radio_s Radio = -{ - RadioInit, - RadioGetStatus, - RadioSetModem, - RadioSetChannel, - RadioIsChannelFree, - RadioRandom, - RadioSetRxConfig, - RadioSetTxConfig, - RadioCheckRfFrequency, - RadioTimeOnAir, - RadioSend, - RadioSleep, - RadioStandby, - RadioRx, - RadioStartCad, - RadioSetTxContinuousWave, - RadioRssi, - RadioWrite, - RadioRead, - RadioWriteBuffer, - RadioReadBuffer, - RadioSetMaxPayloadLength, - RadioSetPublicNetwork, - RadioGetWakeupTime, - RadioIrqProcess, - // Available on SX126x only - RadioRxBoosted, - RadioSetRxDutyCycle -}; - -/* - * Local types definition - */ - - - /*! - * FSK bandwidth definition - */ -typedef struct -{ - uint32_t bandwidth; - uint8_t RegValue; -}FskBandwidth_t; - -/*! - * Precomputed FSK bandwidth registers values - */ -const FskBandwidth_t FskBandwidths[] = -{ - { 4800 , 0x1F }, - { 5800 , 0x17 }, - { 7300 , 0x0F }, - { 9700 , 0x1E }, - { 11700 , 0x16 }, - { 14600 , 0x0E }, - { 19500 , 0x1D }, - { 23400 , 0x15 }, - { 29300 , 0x0D }, - { 39000 , 0x1C }, - { 46900 , 0x14 }, - { 58600 , 0x0C }, - { 78200 , 0x1B }, - { 93800 , 0x13 }, - { 117300, 0x0B }, - { 156200, 0x1A }, - { 187200, 0x12 }, - { 234300, 0x0A }, - { 312000, 0x19 }, - { 373600, 0x11 }, - { 467000, 0x09 }, - { 500000, 0x00 }, // Invalid Bandwidth -}; - -const RadioLoRaBandwidths_t Bandwidths[] = {LORA_BW_250,LORA_BW_125, LORA_BW_062,LORA_BW_020,\ - LORA_BW_041,LORA_BW_015,LORA_BW_007,LORA_BW_500,\ - LORA_BW_031,LORA_BW_010,LORA_BW_500,LORA_BW_500,\ - LORA_BW_500,LORA_BW_500,LORA_BW_500,LORA_BW_500}; - -// SF12 SF11 SF10 SF9 SF8 SF7 -static double RadioLoRaSymbTime[3][6] = {{ 32.768, 16.384, 8.192, 4.096, 2.048, 1.024 }, // 125 KHz - { 16.384, 8.192, 4.096, 2.048, 1.024, 0.512 }, // 250 KHz - { 8.192, 4.096, 2.048, 1.024, 0.512, 0.256 }}; // 500 KHz - -uint8_t MaxPayloadLength = 0xFF; - -uint32_t TxTimeout = 0; -uint32_t RxTimeout = 0; - -bool RxContinuous = false; - - -PacketStatus_t RadioPktStatus; -uint8_t RadioRxPayload[255]; - -bool IrqFired = false; - -/* - * SX126x DIO IRQ callback functions prototype - */ - -/*! - * \brief DIO 0 IRQ callback - */ -void RadioOnDioIrq( void ); - -/*! - * \brief Tx timeout timer callback - */ -void RadioOnTxTimeoutIrq( void ); - -/*! - * \brief Rx timeout timer callback - */ -void RadioOnRxTimeoutIrq( void ); - -/* - * Private global variables - */ - - -/*! - * Holds the current network type for the radio - */ -typedef struct -{ - bool Previous; - bool Current; -}RadioPublicNetwork_t; - -static RadioPublicNetwork_t RadioPublicNetwork = { false }; - -/*! - * Radio callbacks variable - */ - RadioEvents_t* RadioEvents_Ptr; - -/* - * Public global variables - */ - -/*! - * Radio hardware and global parameters - */ -SX126x_t SX126x; - - - - -void RadioInit( RadioEvents_t *events ) -{ - RadioEvents_Ptr = events; - - SX126xInit( ); - SX126xSetStandby( STDBY_RC ); - SX126xSetRegulatorMode( USE_DCDC ); - - SX126xSetBufferBaseAddress( 0x00, 0x00 ); - SX126xSetTxParams( 0, RADIO_RAMP_200_US ); - SX126xSetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); - - - IrqFired = false; -} - -RadioState_t RadioGetStatus( void ) -{ - switch( SX126xGetOperatingMode( ) ) - { - case MODE_TX: - return RF_TX_RUNNING; - case MODE_RX: - return RF_RX_RUNNING; - case RF_CAD: - return RF_CAD; - default: - return RF_IDLE; - } -} - -void RadioSetModem( uint8_t modem ) -{ - switch( modem ) - { - default: - case MODEM_FSK: - SX126xSetPacketType( PACKET_TYPE_GFSK ); - // When switching to GFSK mode the LoRa SyncWord register value is reset - // Thus, we also reset the RadioPublicNetwork variable - RadioPublicNetwork.Current = false; - break; - case MODEM_LORA: - SX126xSetPacketType( PACKET_TYPE_LORA ); - // Public/Private network register is reset when switching modems - if( RadioPublicNetwork.Current != RadioPublicNetwork.Previous ) - { - RadioPublicNetwork.Current = RadioPublicNetwork.Previous; - RadioSetPublicNetwork( RadioPublicNetwork.Current ); - } - break; - } -} - -void RadioSetChannel( uint32_t freq ) -{ - SX126xSetRfFrequency( freq ); -} - -bool RadioIsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh, uint32_t maxCarrierSenseTime ) -{ - bool status = true; - int16_t rssi = 0; - uint32_t carrierSenseTime = 0; - - RadioSetModem( modem ); - - RadioSetChannel( freq ); - - RadioRx( 0 ); - - DelayMs( 1 ); - - carrierSenseTime = GET_TICK_COUNT( ); - - // Perform carrier sense for maxCarrierSenseTime - while( GET_TICK_COUNT()-carrierSenseTime< maxCarrierSenseTime ) - { - rssi = RadioRssi( modem ); - - if( rssi > rssiThresh ) - { - status = false; - break; - } - } - RadioSleep( ); - return status; -} - -uint32_t RadioRandom( void ) -{ - uint8_t i; - uint32_t rnd = 0; - - /* - * Radio setup for random number generation - */ - // Set LoRa modem ON - RadioSetModem( MODEM_LORA ); - - // Set radio in continuous reception - SX126xSetRx( 0 ); - - for( i = 0; i < 32; i++ ) - { - DelayMs( 1 ); - // Unfiltered RSSI value reading. Only takes the LSB value - rnd |= ( ( uint32_t )SX126xGetRssiInst( ) & 0x01 ) << i; - } - - RadioSleep( ); - - return rnd; -} - -void RadioSetRxConfig( uint8_t modem, uint32_t bandwidth, - uint32_t datarate, uint8_t coderate, - uint32_t bandwidthAfc, uint16_t preambleLen, - uint16_t symbTimeout, bool fixLen, - uint8_t payloadLen, - bool crcOn, bool freqHopOn, uint8_t hopPeriod, - bool iqInverted, bool rxContinuous ) -{ - - RxContinuous = rxContinuous; - - if( fixLen == true ) - { - MaxPayloadLength = payloadLen; - } - else - { - MaxPayloadLength = 0xFF; - } - - SX126xSetStopRxTimerOnPreambleDetect( false ); - SX126xSetLoRaSymbNumTimeout( symbTimeout ); - SX126x.ModulationParams.PacketType = PACKET_TYPE_LORA; - SX126x.ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t )datarate; - SX126x.ModulationParams.Params.LoRa.Bandwidth = Bandwidths[bandwidth]; - SX126x.ModulationParams.Params.LoRa.CodingRate = ( RadioLoRaCodingRates_t )coderate; - - if( ( ( bandwidth == 0 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) || - ( ( bandwidth == 1 ) && ( datarate == 12 ) ) ) - { - SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize = 0x01; - } - else - { - SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize = 0x00; - } - - SX126x.PacketParams.PacketType = PACKET_TYPE_LORA; - - if( ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF5 ) || - ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF6 ) ) - { - if( preambleLen < 12 ) - { - SX126x.PacketParams.Params.LoRa.PreambleLength = 12; - } - else - { - SX126x.PacketParams.Params.LoRa.PreambleLength = preambleLen; - } - } - else - { - SX126x.PacketParams.Params.LoRa.PreambleLength = preambleLen; - } - - SX126x.PacketParams.Params.LoRa.HeaderType = ( RadioLoRaPacketLengthsMode_t )fixLen; - - SX126x.PacketParams.Params.LoRa.PayloadLength = MaxPayloadLength; - SX126x.PacketParams.Params.LoRa.CrcMode = ( RadioLoRaCrcModes_t )crcOn; - SX126x.PacketParams.Params.LoRa.InvertIQ = ( RadioLoRaIQModes_t )iqInverted; - - RadioSetModem( ( SX126x.ModulationParams.PacketType == PACKET_TYPE_GFSK ) ? MODEM_FSK : MODEM_LORA ); - SX126xSetModulationParams( &SX126x.ModulationParams ); - SX126xSetPacketParams( &SX126x.PacketParams ); - - // Timeout Max, Timeout handled directly in SetRx function - RxTimeout = 0xFFFF; - -} - -void RadioSetTxConfig( uint8_t modem, int8_t power, uint32_t fdev, - uint32_t bandwidth, uint32_t datarate, - uint8_t coderate, uint16_t preambleLen, - bool fixLen, bool crcOn, bool freqHopOn, - uint8_t hopPeriod, bool iqInverted, uint32_t timeout ) -{ - - SX126x.ModulationParams.PacketType = PACKET_TYPE_LORA; - SX126x.ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) datarate; - SX126x.ModulationParams.Params.LoRa.Bandwidth = Bandwidths[bandwidth]; - SX126x.ModulationParams.Params.LoRa.CodingRate= ( RadioLoRaCodingRates_t )coderate; - - if( ( ( bandwidth == 0 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) || - ( ( bandwidth == 1 ) && ( datarate == 12 ) ) ) - { - SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize = 0x01; - } - else - { - SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize = 0x00; - } - - SX126x.PacketParams.PacketType = PACKET_TYPE_LORA; - - if( ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF5 ) || - ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF6 ) ) - { - if( preambleLen < 12 ) - { - SX126x.PacketParams.Params.LoRa.PreambleLength = 12; - } - else - { - SX126x.PacketParams.Params.LoRa.PreambleLength = preambleLen; - } - } - else - { - SX126x.PacketParams.Params.LoRa.PreambleLength = preambleLen; - } - - SX126x.PacketParams.Params.LoRa.HeaderType = ( RadioLoRaPacketLengthsMode_t )fixLen; - SX126x.PacketParams.Params.LoRa.PayloadLength = MaxPayloadLength; - SX126x.PacketParams.Params.LoRa.CrcMode = ( RadioLoRaCrcModes_t )crcOn; - SX126x.PacketParams.Params.LoRa.InvertIQ = ( RadioLoRaIQModes_t )iqInverted; - - RadioStandby( ); - RadioSetModem( ( SX126x.ModulationParams.PacketType == PACKET_TYPE_GFSK ) ? MODEM_FSK : MODEM_LORA ); - SX126xSetModulationParams( &SX126x.ModulationParams ); - SX126xSetPacketParams( &SX126x.PacketParams ); - - - SX126xSetRfTxPower( power ); - TxTimeout = timeout; -} - -bool RadioCheckRfFrequency( uint32_t frequency ) -{ - return true; -} - -uint32_t RadioTimeOnAir( RadioModems_t modem, uint8_t pktLen ) -{ - uint32_t airTime = 0; - double ts = RadioLoRaSymbTime[SX126x.ModulationParams.Params.LoRa.Bandwidth - 4][12 - SX126x.ModulationParams.Params.LoRa.SpreadingFactor]; - // time of preamble - double tPreamble = ( SX126x.PacketParams.Params.LoRa.PreambleLength + 4.25 ) * ts; - // Symbol length of payload and time - double tmp = ceil( ( 8 * pktLen - 4 * SX126x.ModulationParams.Params.LoRa.SpreadingFactor + - 28 + 16 * SX126x.PacketParams.Params.LoRa.CrcMode - - ( ( SX126x.PacketParams.Params.LoRa.HeaderType == LORA_PACKET_FIXED_LENGTH ) ? 20 : 0 ) ) / - ( double )( 4 * ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor - - ( ( SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) ) * - ( ( SX126x.ModulationParams.Params.LoRa.CodingRate % 4 ) + 4 ); - double nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 ); - double tPayload = nPayload * ts; - // Time on air - double tOnAir = tPreamble + tPayload; - // return milli seconds - airTime = floor( tOnAir + 0.999 ); - - - return airTime; -} - -void RadioSend( uint8_t *buffer, uint8_t size ) -{ - SX126xSetDioIrqParams( IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_NONE, - IRQ_RADIO_NONE ); - - if( SX126xGetPacketType( ) == PACKET_TYPE_LORA ) - { - SX126x.PacketParams.Params.LoRa.PayloadLength = size; - } - else - { - SX126x.PacketParams.Params.Gfsk.PayloadLength = size; - } - SX126xSetPacketParams( &SX126x.PacketParams ); - - SX126xSendPayload( buffer, size, 0 ); - -} - -void RadioSleep( void ) -{ - SleepParams_t params = { 0 }; - - params.Fields.WarmStart = 1; - SX126xSetSleep( params.Value ); - - DelayMs( 2 ); -} - -void RadioStandby( void ) -{ - SX126xSetStandby( STDBY_RC ); -} - -void RadioRx( uint32_t timeout ) -{ - SX126xSetDioIrqParams( IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_NONE, - IRQ_RADIO_NONE ); - - - if( RxContinuous == true ) - { - SX126xSetRx( 0xFFFFFF ); // Rx Continuous - } - else - { - SX126xSetRx( RxTimeout << 6 ); - } -} - -void RadioRxBoosted( uint32_t timeout ) -{ - SX126xSetDioIrqParams( IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_NONE, - IRQ_RADIO_NONE ); - - if( RxContinuous == true ) - { - SX126xSetRxBoosted( 0xFFFFFF ); // Rx Continuous - } - else - { - SX126xSetRxBoosted( RxTimeout << 6 ); - } -} - -void RadioSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ) -{ - SX126xSetRxDutyCycle( rxTime, sleepTime ); -} - -void RadioStartCad( void ) -{ - SX126xSetCad( ); -} - -void RadioTx( uint32_t timeout ) -{ - SX126xSetTx( timeout << 6 ); -} - -void RadioSetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ) -{ - SX126xSetRfFrequency( freq ); - SX126xSetRfTxPower( power ); - SX126xSetTxContinuousWave( ); - -} - -int16_t RadioRssi( RadioModems_t modem ) -{ - return SX126xGetRssiInst( ); -} - -void RadioWrite( uint16_t addr, uint8_t data ) -{ - SX126xWriteRegister( addr, data ); -} - -uint8_t RadioRead( uint16_t addr ) -{ - return SX126xReadRegister( addr ); -} - -void RadioWriteBuffer( uint16_t addr, uint8_t *buffer, uint8_t size ) -{ - SX126xWriteRegisters( addr, buffer, size ); -} - -void RadioReadBuffer( uint16_t addr, uint8_t *buffer, uint8_t size ) -{ - SX126xReadRegisters( addr, buffer, size ); -} - -void RadioWriteFifo( uint8_t *buffer, uint8_t size ) -{ - SX126xWriteBuffer( 0, buffer, size ); -} - -void RadioReadFifo( uint8_t *buffer, uint8_t size ) -{ - SX126xReadBuffer( 0, buffer, size ); -} - -void RadioSetMaxPayloadLength( uint8_t modem, uint8_t max ) -{ - if( modem == MODEM_LORA ) - { - SX126x.PacketParams.Params.LoRa.PayloadLength = MaxPayloadLength = max; - SX126xSetPacketParams( &SX126x.PacketParams ); - } - else - { - if( SX126x.PacketParams.Params.Gfsk.HeaderType == RADIO_PACKET_VARIABLE_LENGTH ) - { - SX126x.PacketParams.Params.Gfsk.PayloadLength = MaxPayloadLength = max; - SX126xSetPacketParams( &SX126x.PacketParams ); - } - } -} - -void RadioSetPublicNetwork( bool enable ) -{ - RadioPublicNetwork.Current = RadioPublicNetwork.Previous = enable; - - RadioSetModem( MODEM_LORA ); - if( enable == true ) - { - // Change LoRa modem SyncWord - SX126xWriteRegister( REG_LR_SYNCWORD, ( LORA_MAC_PUBLIC_SYNCWORD >> 8 ) & 0xFF ); - SX126xWriteRegister( REG_LR_SYNCWORD + 1, LORA_MAC_PUBLIC_SYNCWORD & 0xFF ); - } - else - { - // Change LoRa modem SyncWord - SX126xWriteRegister( REG_LR_SYNCWORD, ( LORA_MAC_PRIVATE_SYNCWORD >> 8 ) & 0xFF ); - SX126xWriteRegister( REG_LR_SYNCWORD + 1, LORA_MAC_PRIVATE_SYNCWORD & 0xFF ); - } -} - -uint32_t RadioGetWakeupTime( void ) -{ - return( RADIO_TCXO_SETUP_TIME + RADIO_WAKEUP_TIME ); -} - -void RadioOnTxTimeoutIrq( void ) -{ - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->TxTimeout != NULL ) ) - { - RadioEvents_Ptr->TxTimeout( ); - } -} - -void RadioOnRxTimeoutIrq( void ) -{ - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxTimeout != NULL ) ) - { - RadioEvents_Ptr->RxTimeout( ); - } -} - -void RadioOnDioIrq( void ) -{ - IrqFired = true; -} - -void RadioIrqProcess( void ) -{ - - BoardDisableIrq( ); - IrqFired = false; - BoardEnableIrq( ); - - uint16_t irqRegs = SX126xGetIrqStatus( ); - SX126xClearIrqStatus( IRQ_RADIO_ALL ); - - if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->TxDone != NULL ) ) - { - RadioEvents_Ptr->TxDone( ); - } - } - - if( ( irqRegs & IRQ_RX_DONE ) == IRQ_RX_DONE ) - { - uint8_t size; - - SX126xGetPayload( RadioRxPayload, &size , 255 ); - SX126xGetPacketStatus( &RadioPktStatus ); - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxDone != NULL ) ) - { - RadioEvents_Ptr->RxDone( RadioRxPayload, size, RadioPktStatus.Params.LoRa.RssiPkt, RadioPktStatus.Params.LoRa.SnrPkt ); - } - } - - if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxError ) ) - { - RadioEvents_Ptr->RxError( ); - } - } - - if( ( irqRegs & IRQ_CAD_DONE ) == IRQ_CAD_DONE ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->CadDone != NULL ) ) - { - RadioEvents_Ptr->CadDone( ( ( irqRegs & IRQ_CAD_ACTIVITY_DETECTED ) == IRQ_CAD_ACTIVITY_DETECTED ) ); - } - } - - if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT ) - { - if( SX126xGetOperatingMode( ) == MODE_TX ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->TxTimeout != NULL ) ) - { - RadioEvents_Ptr->TxTimeout( ); - } - } - else if( SX126xGetOperatingMode( ) == MODE_RX ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxTimeout != NULL ) ) - { - RadioEvents_Ptr->RxTimeout( ); - } - } - } - - if( ( irqRegs & IRQ_PREAMBLE_DETECTED ) == IRQ_PREAMBLE_DETECTED ) - { - //__NOP( ); - } - - if( ( irqRegs & IRQ_SYNCWORD_VALID ) == IRQ_SYNCWORD_VALID ) - { - //__NOP( ); - } - - if( ( irqRegs & IRQ_HEADER_VALID ) == IRQ_HEADER_VALID ) - { - //__NOP( ); - } - - if( ( irqRegs & IRQ_HEADER_ERROR ) == IRQ_HEADER_ERROR ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxTimeout != NULL ) ) - { - RadioEvents_Ptr->RxTimeout( ); - } - } -} diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/radio.h b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/radio.h deleted file mode 100644 index b7fa8a25..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/radio.h +++ /dev/null @@ -1,376 +0,0 @@ -/*! - * \file radio.h - * - * \brief Radio driver API definition - * - * \copyright Revised BSD License, see section \ref LICENSE. - * - * \code - * ______ _ - * / _____) _ | | - * ( (____ _____ ____ _| |_ _____ ____| |__ - * \____ \| ___ | (_ _) ___ |/ ___) _ \ - * _____) ) ____| | | || |_| ____( (___| | | | - * (______/|_____)_|_|_| \__)_____)\____)_| |_| - * (C)2013-2017 Semtech - * - * \endcode - * - * \author Miguel Luis ( Semtech ) - * - * \author Gregory Cristian ( Semtech ) - */ -#ifndef __RADIO_H__ -#define __RADIO_H__ -#include "sx126x-board.h" - -/*! - * Radio driver supported modems - */ -typedef enum -{ - MODEM_FSK = 0, - MODEM_LORA, -}RadioModems_t; - -/*! - * Radio driver internal state machine states definition - */ -typedef enum -{ - RF_IDLE = 0, //!< The radio is idle - RF_RX_RUNNING, //!< The radio is in reception state - RF_TX_RUNNING, //!< The radio is in transmission state - RF_CAD, //!< The radio is doing channel activity detection -}RadioState_t; - -/*! - * \brief Radio driver callback functions - */ -typedef struct -{ - /*! - * \brief Tx Done callback prototype. - */ - void ( *TxDone )( void ); - /*! - * \brief Tx Timeout callback prototype. - */ - void ( *TxTimeout )( void ); - /*! - * \brief Rx Done callback prototype. - * - * \param [IN] payload Received buffer pointer - * \param [IN] size Received buffer size - * \param [IN] rssi RSSI value computed while receiving the frame [dBm] - * \param [IN] snr Raw SNR value given by the radio hardware - * FSK : N/A ( set to 0 ) - * LoRa: SNR value in dB - */ - void ( *RxDone )( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); - /*! - * \brief Rx Timeout callback prototype. - */ - void ( *RxTimeout )( void ); - /*! - * \brief Rx Error callback prototype. - */ - void ( *RxError )( void ); - /*! - * \brief FHSS Change Channel callback prototype. - * - * \param [IN] currentChannel Index number of the current channel - */ - void ( *FhssChangeChannel )( uint8_t currentChannel ); - - /*! - * \brief CAD Done callback prototype. - * - * \param [IN] channelDetected Channel Activity detected during the CAD - */ - void ( *CadDone ) ( bool channelActivityDetected ); -}RadioEvents_t; - -/*! - * \brief Radio driver definition - */ -struct Radio_s -{ - /*! - * \brief Initializes the radio - * - * \param [IN] events Structure containing the driver callback functions - */ - void ( *Init )( RadioEvents_t *events ); - /*! - * Return current radio status - * - * \param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING] - */ - RadioState_t ( *GetStatus )( void ); - /*! - * \brief Configures the radio with the given modem - * - * \param [IN] modem Modem to be used [0: FSK, 1: LoRa] - */ - void ( *SetModem )( uint8_t modem ); - /*! - * \brief Sets the channel frequency - * - * \param [IN] freq Channel RF frequency - */ - void ( *SetChannel )( uint32_t freq ); - /*! - * \brief Checks if the channel is free for the given time - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] freq Channel RF frequency - * \param [IN] rssiThresh RSSI threshold - * \param [IN] maxCarrierSenseTime Max time while the RSSI is measured - * - * \retval isFree [true: Channel is free, false: Channel is not free] - */ - bool ( *IsChannelFree )( RadioModems_t modem, uint32_t freq, int16_t rssiThresh, uint32_t maxCarrierSenseTime ); - /*! - * \brief Generates a 32 bits random value based on the RSSI readings - * - * \remark This function sets the radio in LoRa modem mode and disables - * all interrupts. - * After calling this function either Radio.SetRxConfig or - * Radio.SetTxConfig functions must be called. - * - * \retval randomValue 32 bits random value - */ - uint32_t ( *Random )( void ); - /*! - * \brief Sets the reception parameters - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] bandwidth Sets the bandwidth - * FSK : >= 2600 and <= 250000 Hz - * LoRa: [0: 125 kHz, 1: 250 kHz, - * 2: 500 kHz, 3: Reserved] - * \param [IN] datarate Sets the Datarate - * FSK : 600..300000 bits/s - * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, - * 10: 1024, 11: 2048, 12: 4096 chips] - * \param [IN] coderate Sets the coding rate (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] - * \param [IN] bandwidthAfc Sets the AFC Bandwidth (FSK only) - * FSK : >= 2600 and <= 250000 Hz - * LoRa: N/A ( set to 0 ) - * \param [IN] preambleLen Sets the Preamble length - * FSK : Number of bytes - * LoRa: Length in symbols (the hardware adds 4 more symbols) - * \param [IN] symbTimeout Sets the RxSingle timeout value - * FSK : timeout in number of bytes - * LoRa: timeout in symbols - * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] - * \param [IN] payloadLen Sets payload length when fixed length is used - * \param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON] - * \param [IN] freqHopOn Enables disables the intra-packet frequency hopping - * FSK : N/A ( set to 0 ) - * LoRa: [0: OFF, 1: ON] - * \param [IN] hopPeriod Number of symbols between each hop - * FSK : N/A ( set to 0 ) - * LoRa: Number of symbols - * \param [IN] iqInverted Inverts IQ signals (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [0: not inverted, 1: inverted] - * \param [IN] rxContinuous Sets the reception in continuous mode - * [false: single mode, true: continuous mode] - */ - void ( *SetRxConfig )( uint8_t modem, uint32_t bandwidth, - uint32_t datarate, uint8_t coderate, - uint32_t bandwidthAfc, uint16_t preambleLen, - uint16_t symbTimeout, bool fixLen, - uint8_t payloadLen, - bool crcOn, bool freqHopOn, uint8_t hopPeriod, - bool iqInverted, bool rxContinuous ); - /*! - * \brief Sets the transmission parameters - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] power Sets the output power [dBm] - * \param [IN] fdev Sets the frequency deviation (FSK only) - * FSK : [Hz] - * LoRa: 0 - * \param [IN] bandwidth Sets the bandwidth (LoRa only) - * FSK : 0 - * LoRa: [0: 125 kHz, 1: 250 kHz, - * 2: 500 kHz, 3: Reserved] - * \param [IN] datarate Sets the Datarate - * FSK : 600..300000 bits/s - * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, - * 10: 1024, 11: 2048, 12: 4096 chips] - * \param [IN] coderate Sets the coding rate (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] - * \param [IN] preambleLen Sets the preamble length - * FSK : Number of bytes - * LoRa: Length in symbols (the hardware adds 4 more symbols) - * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] - * \param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON] - * \param [IN] freqHopOn Enables disables the intra-packet frequency hopping - * FSK : N/A ( set to 0 ) - * LoRa: [0: OFF, 1: ON] - * \param [IN] hopPeriod Number of symbols between each hop - * FSK : N/A ( set to 0 ) - * LoRa: Number of symbols - * \param [IN] iqInverted Inverts IQ signals (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [0: not inverted, 1: inverted] - * \param [IN] timeout Transmission timeout [ms] - */ - void ( *SetTxConfig )( uint8_t modem, int8_t power, uint32_t fdev, - uint32_t bandwidth, uint32_t datarate, - uint8_t coderate, uint16_t preambleLen, - bool fixLen, bool crcOn, bool freqHopOn, - uint8_t hopPeriod, bool iqInverted, uint32_t timeout ); - /*! - * \brief Checks if the given RF frequency is supported by the hardware - * - * \param [IN] frequency RF frequency to be checked - * \retval isSupported [true: supported, false: unsupported] - */ - bool ( *CheckRfFrequency )( uint32_t frequency ); - /*! - * \brief Computes the packet time on air in ms for the given payload - * - * \Remark Can only be called once SetRxConfig or SetTxConfig have been called - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] pktLen Packet payload length - * - * \retval airTime Computed airTime (ms) for the given packet payload length - */ - uint32_t ( *TimeOnAir )( RadioModems_t modem, uint8_t pktLen ); - /*! - * \brief Sends the buffer of size. Prepares the packet to be sent and sets - * the radio in transmission - * - * \param [IN]: buffer Buffer pointer - * \param [IN]: size Buffer size - */ - void ( *Send )( uint8_t *buffer, uint8_t size ); - /*! - * \brief Sets the radio in sleep mode - */ - void ( *Sleep )( void ); - /*! - * \brief Sets the radio in standby mode - */ - void ( *Standby )( void ); - /*! - * \brief Sets the radio in reception mode for the given time - * \param [IN] timeout Reception timeout [ms] - * [0: continuous, others timeout] - */ - void ( *Rx )( uint32_t timeout ); - /*! - * \brief Start a Channel Activity Detection - */ - void ( *StartCad )( void ); - /*! - * \brief Sets the radio in continuous wave transmission mode - * - * \param [IN]: freq Channel RF frequency - * \param [IN]: power Sets the output power [dBm] - * \param [IN]: time Transmission mode timeout [s] - */ - void ( *SetTxContinuousWave )( uint32_t freq, int8_t power, uint16_t time ); - /*! - * \brief Reads the current RSSI value - * - * \retval rssiValue Current RSSI value in [dBm] - */ - int16_t ( *Rssi )( RadioModems_t modem ); - /*! - * \brief Writes the radio register at the specified address - * - * \param [IN]: addr Register address - * \param [IN]: data New register value - */ - void ( *Write )( uint16_t addr, uint8_t data ); - /*! - * \brief Reads the radio register at the specified address - * - * \param [IN]: addr Register address - * \retval data Register value - */ - uint8_t ( *Read )( uint16_t addr ); - /*! - * \brief Writes multiple radio registers starting at address - * - * \param [IN] addr First Radio register address - * \param [IN] buffer Buffer containing the new register's values - * \param [IN] size Number of registers to be written - */ - void ( *WriteBuffer )( uint16_t addr, uint8_t *buffer, uint8_t size ); - /*! - * \brief Reads multiple radio registers starting at address - * - * \param [IN] addr First Radio register address - * \param [OUT] buffer Buffer where to copy the registers data - * \param [IN] size Number of registers to be read - */ - void ( *ReadBuffer )( uint16_t addr, uint8_t *buffer, uint8_t size ); - /*! - * \brief Sets the maximum payload length. - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] max Maximum payload length in bytes - */ - void ( *SetMaxPayloadLength )( RadioModems_t modem, uint8_t max ); - /*! - * \brief Sets the network to public or private. Updates the sync byte. - * - * \remark Applies to LoRa modem only - * - * \param [IN] enable if true, it enables a public network - */ - void ( *SetPublicNetwork )( bool enable ); - /*! - * \brief Gets the time required for the board plus radio to get out of sleep.[ms] - * - * \retval time Radio plus board wakeup time in ms. - */ - uint32_t ( *GetWakeupTime )( void ); - /*! - * \brief Process radio irq - */ - void ( *IrqProcess )( void ); - /* - * The next functions are available only on SX126x radios. - */ - /*! - * \brief Sets the radio in reception mode with Max LNA gain for the given time - * - * \remark Available on SX126x radios only. - * - * \param [IN] timeout Reception timeout [ms] - * [0: continuous, others timeout] - */ - void ( *RxBoosted )( uint32_t timeout ); - /*! - * \brief Sets the Rx duty cycle management parameters - * - * \remark Available on SX126x radios only. - * - * \param [in] rxTime Structure describing reception timeout value - * \param [in] sleepTime Structure describing sleep timeout value - */ - void ( *SetRxDutyCycle ) ( uint32_t rxTime, uint32_t sleepTime ); -}; - -/*! - * \brief Radio driver - * - * \remark This variable is defined and initialized in the specific radio - * board implementation - */ -extern struct Radio_s Radio; -void RadioOnDioIrq( void ); - -#endif // __RADIO_H__ diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x-board.cpp b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x-board.cpp deleted file mode 100644 index bd5e4cbe..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x-board.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* - ______ _ - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - (C)2013 Semtech - -Description: SX126x driver specific target board functions implementation - -License: Revised BSD License, see LICENSE.TXT file include in the project - -Maintainer: Miguel Luis and Gregory Cristian -*/ -#include "sx126x-board.h" -#include "sx126x.h" -#include -static uint8_t IrqNestLevel = 0; - -void DelayMs( uint32_t ms ) -{ - delay( ms ); -} - - void BoardDisableIrq( void ) -{ - noInterrupts(); - IrqNestLevel++; -} - - void BoardEnableIrq( void ) -{ - IrqNestLevel--; - if( IrqNestLevel == 0 ) - { - interrupts(); - } -} - -static uint16_t SpiInOut( uint16_t outData ) -{ - uint8_t rxData = 0; - - rxData = SPI.transfer(outData); - return( rxData ); -} - -/*! - * Antenna switch GPIO pins objects - */ - -void SX126xIoInit( void ) -{ - pinMode (NssPin, OUTPUT); - pinMode (NResetPin, OUTPUT); - pinMode (SwPin, OUTPUT); - - pinMode (BusyPin, INPUT); - pinMode (Dio1Pin, INPUT); - - digitalWrite(NssPin,1); - digitalWrite(NResetPin,1); - digitalWrite(SwPin,1); -} - -void SX126xReset( void ) -{ - delay( 10 ); - digitalWrite(NResetPin,0); - delay( 20 ); - digitalWrite(NResetPin,1); - delay( 10 ); -} - -void SX126xWaitOnBusy( void ) -{ - while( digitalRead(BusyPin) == 1 ); -} - -void SX126xWakeup( void ) -{ - BoardDisableIrq( ); - - digitalWrite(NssPin,0); - - SpiInOut( RADIO_GET_STATUS ); - SpiInOut( 0x00 ); - - digitalWrite(NssPin,1); - - // Wait for chip to be ready. - SX126xWaitOnBusy( ); - - BoardEnableIrq( ); -} -void SX126xWriteCommand( uint8_t command, uint8_t *buffer, uint16_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut( (uint8_t )command ); - - for( uint16_t i = 0; i < size; i++ ) - { - SpiInOut( buffer[i] ); - } - - digitalWrite(NssPin,1); - - if( command != RADIO_SET_SLEEP ) - { - SX126xWaitOnBusy( ); - } -} - -void SX126xReadCommand( uint8_t command, uint8_t *buffer, uint16_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut(( uint8_t )command ); - SpiInOut( 0x00 ); - for( uint16_t i = 0; i < size; i++ ) - { - buffer[i] = SpiInOut( 0 ); - } - - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} - -void SX126xWriteRegisters( uint16_t address, uint8_t *buffer, uint16_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - digitalWrite(NssPin,0); - SpiInOut( RADIO_WRITE_REGISTER ); - SpiInOut( ( address & 0xFF00 ) >> 8 ); - SpiInOut( address & 0x00FF ); - - for( uint16_t i = 0; i < size; i++ ) - { - SpiInOut( buffer[i] ); - } - - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} - -void SX126xWriteRegister( uint16_t address, uint8_t value ) -{ - SX126xWriteRegisters( address, &value, 1 ); -} - -void SX126xReadRegisters( uint16_t address, uint8_t *buffer, uint16_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut( RADIO_READ_REGISTER ); - SpiInOut( ( address & 0xFF00 ) >> 8 ); - SpiInOut( address & 0x00FF ); - SpiInOut( 0 ); - for( uint16_t i = 0; i < size; i++ ) - { - buffer[i] = SpiInOut( 0 ); - } - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} -uint8_t SX126xReadRegister( uint16_t address ) -{ - uint8_t data; - SX126xReadRegisters( address, &data, 1 ); - return data; -} - -void SX126xWriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut( RADIO_WRITE_BUFFER ); - SpiInOut( offset ); - for( uint16_t i = 0; i < size; i++ ) - { - SpiInOut( buffer[i] ); - } - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} -void SX126xReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut( RADIO_READ_BUFFER ); - SpiInOut( offset ); - SpiInOut( 0 ); - for( uint16_t i = 0; i < size; i++ ) - { - buffer[i] = SpiInOut( 0 ); - } - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} -void SX126xSetRfTxPower( int8_t power ) -{ - SX126xSetTxParams( power, RADIO_RAMP_40_US ); -} -bool SX126xCheckRfFrequency( uint32_t frequency ) -{ - // Implement check. Currently all frequencies are supported - return true; -} \ No newline at end of file diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x-board.h b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x-board.h deleted file mode 100644 index 4c54175b..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x-board.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - ______ _ - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - (C)2013 Semtech - -Description: SX126x driver specific target board functions implementation - -License: Revised BSD License, see LICENSE.TXT file include in the project - -Maintainer: Miguel Luis and Gregory Cristian -*/ -#ifndef __SX126x_ARCH_H__ -#define __SX126x_ARCH_H__ -#include -#include -#include "sx126x.h" - -#define USER_MODE_TX 1 -#define USER_MODE_RX 0 - -extern uint32_t TickCounter; - - -const int BusyPin = 3; -const int Dio2Pin = 4; -const int Dio1Pin = 5; -const int NssPin = 7; -const int SwPin = 8; - -const int Led1RedPin = 16; -const int Led1BluePin = 15; -const int NResetPin = 14; - - -#define GET_TICK_COUNT() TickCounter -#define TICK_RATE_MS( ms ) ( ms ) - -void DelayMs( uint32_t ms ); -void BoardDisableIrq( void ); -void BoardEnableIrq( void ); - -/*! - * \brief Initializes the radio I/Os pins interface - */ -void SX126xIoInit( void ); - -/*! - * \brief Initializes DIO IRQ handlers - * - * \param [IN] irqHandlers Array containing the IRQ callback functions - */ -void SX126xIoIrqInit( void ); - -/*! - * \brief De-initializes the radio I/Os pins interface. - * - * \remark Useful when going in MCU low power modes - */ -void SX126xIoDeInit( void ); - -/*! - * \brief HW Reset of the radio - */ -void SX126xReset( void ); - -/*! - * \brief Blocking loop to wait while the Busy pin in high - */ -void SX126xWaitOnBusy( void ); - -/*! - * \brief Wakes up the radio - */ -void SX126xWakeup( void ); - -/*! - * \brief Send a command that write data to the radio - * - * \param [in] opcode Opcode of the command - * \param [in] buffer Buffer to be send to the radio - * \param [in] size Size of the buffer to send - */ -void SX126xWriteCommand( uint8_t opcode, uint8_t *buffer, uint16_t size ); - -/*! - * \brief Send a command that read data from the radio - * - * \param [in] opcode Opcode of the command - * \param [out] buffer Buffer holding data from the radio - * \param [in] size Size of the buffer - */ -void SX126xReadCommand( uint8_t opcode, uint8_t *buffer, uint16_t size ); - -/*! - * \brief Write a single byte of data to the radio memory - * - * \param [in] address The address of the first byte to write in the radio - * \param [in] value The data to be written in radio's memory - */ -void SX126xWriteRegister( uint16_t address, uint8_t value ); - -/*! - * \brief Read a single byte of data from the radio memory - * - * \param [in] address The address of the first byte to write in the radio - * - * \retval value The value of the byte at the given address in radio's memory - */ -uint8_t SX126xReadRegister( uint16_t address ); - -/*! - * \brief Sets the radio output power. - * - * \param [IN] power Sets the RF output power - */ -void SX126xSetRfTxPower( int8_t power ); - - -/*! - * \brief Checks if the given RF frequency is supported by the hardware - * - * \param [IN] frequency RF frequency to be checked - * \retval isSupported [true: supported, false: unsupported] - */ -bool SX126xCheckRfFrequency( uint32_t frequency ); - -/*! - * Radio hardware and global parameters - */ -extern SX126x_t SX126x; - - -#endif // __SX126x_ARCH_H__ diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x.cpp b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x.cpp deleted file mode 100644 index e728dd28..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x.cpp +++ /dev/null @@ -1,693 +0,0 @@ -/*! - * \file sx126x.c - * - * \brief SX126x driver implementation - * - * \copyright Revised BSD License, see section \ref LICENSE. - * - * \code - * ______ _ - * / _____) _ | | - * ( (____ _____ ____ _| |_ _____ ____| |__ - * \____ \| ___ | (_ _) ___ |/ ___) _ \ - * _____) ) ____| | | || |_| ____( (___| | | | - * (______/|_____)_|_|_| \__)_____)\____)_| |_| - * (C)2013-2017 Semtech - * - * \endcode - * - * \author Miguel Luis ( Semtech ) - * - * \author Gregory Cristian ( Semtech ) - */ -#include -#include -#include "sx126x.h" -#include "sx126x-board.h" - -/*! - * \brief Radio registers definition - */ -typedef struct -{ - uint16_t Addr; //!< The address of the register - uint8_t Value; //!< The value of the register -}RadioRegisters_t; - -/*! - * \brief Holds the internal operating mode of the radio - */ -static RadioOperatingModes_t OperatingMode; - -/*! - * \brief Stores the current packet type set in the radio - */ -static RadioPacketTypes_t PacketType; - -/*! - * \brief Stores the last frequency error measured on LoRa received packet - */ -volatile uint32_t FrequencyError = 0; - -/*! - * \brief Hold the status of the Image calibration - */ -static bool ImageCalibrated = false; - -/* - * SX126x DIO IRQ callback functions prototype - */ - -/*! - * \brief DIO 0 IRQ callback - */ -void SX126xOnDioIrq( void ); - -/*! - * \brief DIO 0 IRQ callback - */ -void SX126xSetPollingMode( void ); - -/*! - * \brief DIO 0 IRQ callback - */ -void SX126xSetInterruptMode( void ); - -/* - * \brief Process the IRQ if handled by the driver - */ -void SX126xProcessIrqs( void ); - - -void SX126xInit( void ) -{ - SX126xReset( ); - SX126xWakeup( ); - SX126xSetStandby( STDBY_RC ); - -#ifdef USE_TCXO - CalibrationParams_t calibParam; - - SX126xSetDio3AsTcxoCtrl( TCXO_CTRL_3_3V, RADIO_TCXO_SETUP_TIME << 6 ); // convert from ms to SX126x time base - calibParam.Value = 0x7F; - SX126xCalibrate( calibParam.Value ); -#endif - - SX126xSetDio2AsRfSwitchCtrl( true ); - OperatingMode = MODE_STDBY_RC; -} - -uint8_t SX126xGetOperatingMode( void ) -{ - return OperatingMode; -} - -void SX126xCheckDeviceReady( void ) -{ - if( ( SX126xGetOperatingMode( ) == MODE_SLEEP ) || ( SX126xGetOperatingMode( ) == MODE_RX_DC ) ) - { - SX126xWakeup( ); - - } - SX126xWaitOnBusy( ); -} - -void SX126xSetPayload( uint8_t *payload, uint8_t size ) -{ - SX126xWriteBuffer( 0x00, payload, size ); -} - -uint8_t SX126xGetPayload( uint8_t *buffer, uint8_t *size, uint8_t maxSize ) -{ - uint8_t offset = 0; - - SX126xGetRxBufferStatus( size, &offset ); - if( *size > maxSize ) - { - return 1; - } - SX126xReadBuffer( offset, buffer, *size ); - return 0; -} - -void SX126xSendPayload( uint8_t *payload, uint8_t size, uint32_t timeout ) -{ - SX126xSetPayload( payload, size ); - SX126xSetTx( timeout ); -} - -uint8_t SX126xSetSyncWord( uint8_t *syncWord ) -{ - SX126xWriteRegisters( REG_LR_SYNCWORDBASEADDRESS, syncWord, 8 ); - return 0; -} - -void SX126xSetCrcSeed( uint16_t seed ) -{ - uint8_t buf[2]; - - buf[0] = ( uint8_t )( ( seed >> 8 ) & 0xFF ); - buf[1] = ( uint8_t )( seed & 0xFF ); - - switch( SX126xGetPacketType( ) ) - { - case PACKET_TYPE_GFSK: - SX126xWriteRegisters( REG_LR_CRCSEEDBASEADDR, buf, 2 ); - break; - - default: - break; - } -} - -void SX126xSetCrcPolynomial( uint16_t polynomial ) -{ - uint8_t buf[2]; - - buf[0] = ( uint8_t )( ( polynomial >> 8 ) & 0xFF ); - buf[1] = ( uint8_t )( polynomial & 0xFF ); - - switch( SX126xGetPacketType( ) ) - { - case PACKET_TYPE_GFSK: - SX126xWriteRegisters( REG_LR_CRCPOLYBASEADDR, buf, 2 ); - break; - - default: - break; - } -} - -void SX126xSetWhiteningSeed( uint16_t seed ) -{ - uint8_t regValue = 0; - - switch( SX126xGetPacketType( ) ) - { - case PACKET_TYPE_GFSK: - regValue = SX126xReadRegister( REG_LR_WHITSEEDBASEADDR_MSB ) & 0xFE; - regValue = ( ( seed >> 8 ) & 0x01 ) | regValue; - SX126xWriteRegister( REG_LR_WHITSEEDBASEADDR_MSB, regValue ); // only 1 bit. - SX126xWriteRegister( REG_LR_WHITSEEDBASEADDR_LSB, ( uint8_t )seed ); - break; - - default: - break; - } -} - -uint32_t SX126xGetRandom( void ) -{ - uint8_t buf[] = { 0, 0, 0, 0 }; - uint32_t ret_val = 0; - // Set radio in continuous reception - SX126xSetRx( 0 ); - - DelayMs( 1 ); - - SX126xReadRegisters( RANDOM_NUMBER_GENERATORBASEADDR, buf, 4 ); - - SX126xSetStandby( STDBY_RC ); - ret_val |= buf[0]; - ret_val = (ret_val<<8)+buf[1] ; - ret_val = (ret_val<<8)+buf[2] ; - ret_val = (ret_val<<8)+buf[3] ; - - return ret_val; -} - -void SX126xSetSleep( uint8_t sleepConfig ) -{ - - SX126xWriteCommand( RADIO_SET_SLEEP, &sleepConfig, 1 ); - OperatingMode = MODE_SLEEP; -} - -void SX126xSetStandby( uint8_t standbyConfig ) -{ - SX126xWriteCommand( RADIO_SET_STANDBY, ( uint8_t* )&standbyConfig, 1 ); - if( standbyConfig == STDBY_RC ) - { - OperatingMode = MODE_STDBY_RC; - } - else - { - OperatingMode = MODE_STDBY_XOSC; - } -} - -void SX126xSetFs( void ) -{ - SX126xWriteCommand( RADIO_SET_FS, 0, 0 ); - OperatingMode = MODE_FS; -} - -void SX126xSetTx( uint32_t timeout ) -{ - uint8_t buf[3]; - - OperatingMode = MODE_TX; - - buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); - buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); - buf[2] = ( uint8_t )( timeout & 0xFF ); - SX126xWriteCommand( RADIO_SET_TX, buf, 3 ); -} - -void SX126xSetRx( uint32_t timeout ) -{ - uint8_t buf[3]; - - OperatingMode = MODE_RX; - - buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); - buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); - buf[2] = ( uint8_t )( timeout & 0xFF ); - SX126xWriteCommand( RADIO_SET_RX, buf, 3 ); -} - -void SX126xSetRxBoosted( uint32_t timeout ) -{ - uint8_t buf[3]; - - OperatingMode = MODE_RX; - - SX126xWriteRegister( REG_RX_GAIN, 0x96 ); // max LNA gain, increase current by ~2mA for around ~3dB in sensivity - - buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); - buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); - buf[2] = ( uint8_t )( timeout & 0xFF ); - SX126xWriteCommand( RADIO_SET_RX, buf, 3 ); -} - -void SX126xSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ) -{ - uint8_t buf[6]; - - buf[0] = ( uint8_t )( ( rxTime >> 16 ) & 0xFF ); - buf[1] = ( uint8_t )( ( rxTime >> 8 ) & 0xFF ); - buf[2] = ( uint8_t )( rxTime & 0xFF ); - buf[3] = ( uint8_t )( ( sleepTime >> 16 ) & 0xFF ); - buf[4] = ( uint8_t )( ( sleepTime >> 8 ) & 0xFF ); - buf[5] = ( uint8_t )( sleepTime & 0xFF ); - SX126xWriteCommand( RADIO_SET_RXDUTYCYCLE, buf, 6 ); - OperatingMode = MODE_RX_DC; -} - -void SX126xSetCad( void ) -{ - SX126xWriteCommand( RADIO_SET_CAD, 0, 0 ); - OperatingMode = MODE_CAD; -} - -void SX126xSetTxContinuousWave( void ) -{ - SX126xWriteCommand( RADIO_SET_TXCONTINUOUSWAVE, 0, 0 ); -} - -void SX126xSetTxInfinitePreamble( void ) -{ - SX126xWriteCommand( RADIO_SET_TXCONTINUOUSPREAMBLE, 0, 0 ); -} - -void SX126xSetStopRxTimerOnPreambleDetect( bool enable ) -{ - SX126xWriteCommand( RADIO_SET_STOPRXTIMERONPREAMBLE, ( uint8_t* )&enable, 1 ); -} - -void SX126xSetLoRaSymbNumTimeout( uint8_t SymbNum ) -{ - SX126xWriteCommand( RADIO_SET_LORASYMBTIMEOUT, &SymbNum, 1 ); -} - -void SX126xSetRegulatorMode( uint8_t mode ) -{ - SX126xWriteCommand( RADIO_SET_REGULATORMODE, ( uint8_t* )&mode, 1 ); -} - -void SX126xCalibrate( uint8_t calibParam ) -{ - SX126xWriteCommand( RADIO_CALIBRATE, ( uint8_t* )&calibParam, 1 ); -} - -void SX126xCalibrateImage( uint32_t freq ) -{ - uint8_t calFreq[2]; - - if( freq > 900000000 ) - { - calFreq[0] = 0xE1; - calFreq[1] = 0xE9; - } - else if( freq > 850000000 ) - { - calFreq[0] = 0xD7; - calFreq[1] = 0xD8; - } - else if( freq > 770000000 ) - { - calFreq[0] = 0xC1; - calFreq[1] = 0xC5; - } - else if( freq > 460000000 ) - { - calFreq[0] = 0x75; - calFreq[1] = 0x81; - } - else if( freq > 425000000 ) - { - calFreq[0] = 0x6B; - calFreq[1] = 0x6F; - } - SX126xWriteCommand( RADIO_CALIBRATEIMAGE, calFreq, 2 ); -} - -void SX126xSetPaConfig( uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, uint8_t paLut ) -{ - uint8_t buf[4]; - - buf[0] = paDutyCycle; - buf[1] = hpMax; - buf[2] = deviceSel; - buf[3] = paLut; - SX126xWriteCommand( RADIO_SET_PACONFIG, buf, 4 ); -} - -void SX126xSetRxTxFallbackMode( uint8_t fallbackMode ) -{ - SX126xWriteCommand( RADIO_SET_TXFALLBACKMODE, &fallbackMode, 1 ); -} - -void SX126xSetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask ) -{ - uint8_t buf[8]; - - buf[0] = ( uint8_t )( ( irqMask >> 8 ) & 0x00FF ); - buf[1] = ( uint8_t )( irqMask & 0x00FF ); - buf[2] = ( uint8_t )( ( dio1Mask >> 8 ) & 0x00FF ); - buf[3] = ( uint8_t )( dio1Mask & 0x00FF ); - buf[4] = ( uint8_t )( ( dio2Mask >> 8 ) & 0x00FF ); - buf[5] = ( uint8_t )( dio2Mask & 0x00FF ); - buf[6] = ( uint8_t )( ( dio3Mask >> 8 ) & 0x00FF ); - buf[7] = ( uint8_t )( dio3Mask & 0x00FF ); - SX126xWriteCommand( RADIO_CFG_DIOIRQ, buf, 8 ); -} - -uint16_t SX126xGetIrqStatus( void ) -{ - uint8_t irqStatus[2]; - - SX126xReadCommand( RADIO_GET_IRQSTATUS, irqStatus, 2 ); - return ( irqStatus[0] << 8 ) | irqStatus[1]; -} - -void SX126xSetDio2AsRfSwitchCtrl( uint8_t enable ) -{ - SX126xWriteCommand( RADIO_SET_RFSWITCHMODE, &enable, 1 ); -} - -void SX126xSetDio3AsTcxoCtrl( uint8_t tcxoVoltage, uint32_t timeout ) -{ - uint8_t buf[4]; - - buf[0] = tcxoVoltage & 0x07; - buf[1] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); - buf[2] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); - buf[3] = ( uint8_t )( timeout & 0xFF ); - - SX126xWriteCommand( RADIO_SET_TCXOMODE, buf, 4 ); -} - -void SX126xSetRfFrequency( uint32_t frequency ) -{ - uint8_t buf[4]; - uint32_t freq = 0; - - if( ImageCalibrated == false ) - { - SX126xCalibrateImage( frequency ); - ImageCalibrated = true; - } - - freq = ( uint32_t )( ( double )frequency / ( double )FREQ_STEP ); - buf[0] = ( uint8_t )( ( freq >> 24 ) & 0xFF ); - buf[1] = ( uint8_t )( ( freq >> 16 ) & 0xFF ); - buf[2] = ( uint8_t )( ( freq >> 8 ) & 0xFF ); - buf[3] = ( uint8_t )( freq & 0xFF ); - SX126xWriteCommand( RADIO_SET_RFFREQUENCY, buf, 4 ); -} - -void SX126xSetPacketType( RadioPacketTypes_t packetType ) -{ - // Save packet type internally to avoid questioning the radio - PacketType = packetType; - SX126xWriteCommand( RADIO_SET_PACKETTYPE, ( uint8_t* )&packetType, 1 ); -} - -RadioPacketTypes_t SX126xGetPacketType( void ) -{ - return PacketType; -} - -void SX126xSetTxParams( int8_t power, uint8_t rampTime ) -{ - uint8_t buf[2]; - - - SX126xSetPaConfig( 0x04, 0x07, 0x00, 0x01 ); - if( power > 22 ) - { - power = 22; - } - else if( power < -3 ) - { - power = -3; - } - SX126xWriteRegister( REG_OCP, 0x38 ); // current max 160mA for the whole device - buf[0] = power; - buf[1] = ( uint8_t )rampTime; - SX126xWriteCommand( RADIO_SET_TXPARAMS, buf, 2 ); -} - -void SX126xSetModulationParams( void *input_ptr ) -{ - uint8_t n; - uint32_t tempVal = 0; - uint8_t buf[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - ModulationParams_t* modulationParams = (ModulationParams_t*)input_ptr; - // Check if required configuration corresponds to the stored packet type - // If not, silently update radio packet type - if( PacketType != modulationParams->PacketType ) - { - SX126xSetPacketType( modulationParams->PacketType ); - } - - switch( modulationParams->PacketType ) - { - case PACKET_TYPE_GFSK: - n = 8; - tempVal = ( uint32_t )( 32 * ( ( double )XTAL_FREQ / ( double )modulationParams->Params.Gfsk.BitRate ) ); - buf[0] = ( tempVal >> 16 ) & 0xFF; - buf[1] = ( tempVal >> 8 ) & 0xFF; - buf[2] = tempVal & 0xFF; - buf[3] = modulationParams->Params.Gfsk.ModulationShaping; - buf[4] = modulationParams->Params.Gfsk.Bandwidth; - tempVal = ( uint32_t )( ( double )modulationParams->Params.Gfsk.Fdev / ( double )FREQ_STEP ); - buf[5] = ( tempVal >> 16 ) & 0xFF; - buf[6] = ( tempVal >> 8 ) & 0xFF; - buf[7] = ( tempVal& 0xFF ); - SX126xWriteCommand( RADIO_SET_MODULATIONPARAMS, buf, n ); - break; - case PACKET_TYPE_LORA: - n = 4; - buf[0] = modulationParams->Params.LoRa.SpreadingFactor; - buf[1] = modulationParams->Params.LoRa.Bandwidth; - buf[2] = modulationParams->Params.LoRa.CodingRate; - buf[3] = modulationParams->Params.LoRa.LowDatarateOptimize; - - SX126xWriteCommand( RADIO_SET_MODULATIONPARAMS, buf, n ); - - break; - default: - case PACKET_TYPE_NONE: - return; - } -} - -void SX126xSetPacketParams( void* input_ptr ) -{ - uint8_t n; - uint8_t crcVal = 0; - uint8_t buf[9] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - PacketParams_t* packetParams = (PacketParams_t*)input_ptr; - // Check if required configuration corresponds to the stored packet type - // If not, silently update radio packet type - if( PacketType != packetParams->PacketType ) - { - SX126xSetPacketType( packetParams->PacketType ); - } - - switch( packetParams->PacketType ) - { - case PACKET_TYPE_GFSK: - if( packetParams->Params.Gfsk.CrcLength == RADIO_CRC_2_BYTES_IBM ) - { - SX126xSetCrcSeed( CRC_IBM_SEED ); - SX126xSetCrcPolynomial( CRC_POLYNOMIAL_IBM ); - crcVal = RADIO_CRC_2_BYTES; - } - else if( packetParams->Params.Gfsk.CrcLength == RADIO_CRC_2_BYTES_CCIT ) - { - SX126xSetCrcSeed( CRC_CCITT_SEED ); - SX126xSetCrcPolynomial( CRC_POLYNOMIAL_CCITT ); - crcVal = RADIO_CRC_2_BYTES_INV; - } - else - { - crcVal = packetParams->Params.Gfsk.CrcLength; - } - n = 9; - buf[0] = ( packetParams->Params.Gfsk.PreambleLength >> 8 ) & 0xFF; - buf[1] = packetParams->Params.Gfsk.PreambleLength; - buf[2] = packetParams->Params.Gfsk.PreambleMinDetect; - buf[3] = ( packetParams->Params.Gfsk.SyncWordLength /*<< 3*/ ); // convert from byte to bit - buf[4] = packetParams->Params.Gfsk.AddrComp; - buf[5] = packetParams->Params.Gfsk.HeaderType; - buf[6] = packetParams->Params.Gfsk.PayloadLength; - buf[7] = crcVal; - buf[8] = packetParams->Params.Gfsk.DcFree; - break; - case PACKET_TYPE_LORA: - n = 6; - buf[0] = ( packetParams->Params.LoRa.PreambleLength >> 8 ) & 0xFF; - buf[1] = packetParams->Params.LoRa.PreambleLength; - buf[2] = packetParams->Params.LoRa.HeaderType; - buf[3] = packetParams->Params.LoRa.PayloadLength; - buf[4] = packetParams->Params.LoRa.CrcMode; - buf[5] = packetParams->Params.LoRa.InvertIQ; - break; - default: - case PACKET_TYPE_NONE: - return; - } - SX126xWriteCommand( RADIO_SET_PACKETPARAMS, buf, n ); -} - -void SX126xSetCadParams( uint8_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, uint8_t cadExitMode, uint32_t cadTimeout ) -{ - uint8_t buf[7]; - - buf[0] = ( uint8_t )cadSymbolNum; - buf[1] = cadDetPeak; - buf[2] = cadDetMin; - buf[3] = ( uint8_t )cadExitMode; - buf[4] = ( uint8_t )( ( cadTimeout >> 16 ) & 0xFF ); - buf[5] = ( uint8_t )( ( cadTimeout >> 8 ) & 0xFF ); - buf[6] = ( uint8_t )( cadTimeout & 0xFF ); - SX126xWriteCommand( RADIO_SET_CADPARAMS, buf, 5 ); - OperatingMode = MODE_CAD; -} - -void SX126xSetBufferBaseAddress( uint8_t txBaseAddress, uint8_t rxBaseAddress ) -{ - uint8_t buf[2]; - - buf[0] = txBaseAddress; - buf[1] = rxBaseAddress; - SX126xWriteCommand( RADIO_SET_BUFFERBASEADDRESS, buf, 2 ); -} - -uint8_t SX126xGetStatus( void ) -{ - uint8_t stat = 0; - - SX126xReadCommand( RADIO_GET_STATUS, ( uint8_t * )&stat, 1 ); - - return stat; -} - -int8_t SX126xGetRssiInst( void ) -{ - uint8_t buf[1]; - int8_t rssi = 0; - - SX126xReadCommand( RADIO_GET_RSSIINST, buf, 1 ); - rssi = -buf[0] >> 1; - return rssi; -} - -void SX126xGetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBufferPointer ) -{ - uint8_t status[2]; - - SX126xReadCommand( RADIO_GET_RXBUFFERSTATUS, status, 2 ); - - // In case of LORA fixed header, the payloadLength is obtained by reading - // the register REG_LR_PAYLOADLENGTH - if( ( SX126xGetPacketType( ) == PACKET_TYPE_LORA ) && ( SX126xReadRegister( REG_LR_PACKETPARAMS ) >> 7 == 1 ) ) - { - *payloadLength = SX126xReadRegister( REG_LR_PAYLOADLENGTH ); - } - else - { - *payloadLength = status[0]; - } - *rxStartBufferPointer = status[1]; -} - -void SX126xGetPacketStatus( void* input_ptr ) -{ - uint8_t status[3]; - PacketStatus_t *pktStatus = (PacketStatus_t *)input_ptr; - - SX126xReadCommand( RADIO_GET_PACKETSTATUS, status, 3 ); - - pktStatus->packetType = SX126xGetPacketType( ); - switch( pktStatus->packetType ) - { - case PACKET_TYPE_GFSK: - pktStatus->Params.Gfsk.RxStatus = status[0]; - pktStatus->Params.Gfsk.RssiSync = -status[1] >> 1; - pktStatus->Params.Gfsk.RssiAvg = -status[2] >> 1; - pktStatus->Params.Gfsk.FreqError = 0; - break; - - case PACKET_TYPE_LORA: - pktStatus->Params.LoRa.RssiPkt = -status[0] >> 1; - ( status[1] < 128 ) ? ( pktStatus->Params.LoRa.SnrPkt = status[1] >> 2 ) : ( pktStatus->Params.LoRa.SnrPkt = ( ( status[1] - 256 ) >> 2 ) ); - pktStatus->Params.LoRa.SignalRssiPkt = -status[2] >> 1; - pktStatus->Params.LoRa.FreqError = FrequencyError; - break; - - default: - case PACKET_TYPE_NONE: - // In that specific case, we set everything in the pktStatus to zeros - // and reset the packet type accordingly - memset( pktStatus, 0, sizeof( PacketStatus_t ) ); - pktStatus->packetType = PACKET_TYPE_NONE; - break; - } -} - -uint16_t SX126xGetDeviceErrors( void ) -{ - uint16_t error; - - SX126xReadCommand( RADIO_GET_ERROR, ( uint8_t * )&error, 2 ); - return error; -} - -void SX126xClearDeviceErrors( void ) -{ - uint8_t buf[2] = { 0x00, 0x00 }; - SX126xWriteCommand( RADIO_CLR_ERROR, buf, 2 ); -} - -void SX126xClearIrqStatus( uint16_t irq ) -{ - uint8_t buf[2]; - - buf[0] = ( uint8_t )( ( ( uint16_t )irq >> 8 ) & 0x00FF ); - buf[1] = ( uint8_t )( ( uint16_t )irq & 0x00FF ); - SX126xWriteCommand( RADIO_CLR_IRQSTATUS, buf, 2 ); -} diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x.h b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x.h deleted file mode 100644 index 012124dc..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/sx126x.h +++ /dev/null @@ -1,1115 +0,0 @@ -/*! - * \file sx126x.h - * - * \brief SX126x driver implementation - * - * \copyright Revised BSD License, see section \ref LICENSE. - * - * \code - * ______ _ - * / _____) _ | | - * ( (____ _____ ____ _| |_ _____ ____| |__ - * \____ \| ___ | (_ _) ___ |/ ___) _ \ - * _____) ) ____| | | || |_| ____( (___| | | | - * (______/|_____)_|_|_| \__)_____)\____)_| |_| - * (C)2013-2017 Semtech - * - * \endcode - * - * \author Miguel Luis ( Semtech ) - * - * \author Gregory Cristian ( Semtech ) - */ -#ifndef __SX126x_H__ -#define __SX126x_H__ -#include "stdint.h" -#include "stdbool.h" - - -#define USE_TCXO -#define SX1261 1 -#define SX1262 2 - -#ifdef USE_TCXO - /*! - * Radio complete Wake-up Time with TCXO stabilisation time - */ - #define RADIO_TCXO_SETUP_TIME 5 // [ms] -#else - /*! - * Radio complete Wake-up Time with TCXO stabilisation time - */ - #define RADIO_TCXO_SETUP_TIME 0 // No Used -#endif - -/*! - * Radio complete Wake-up Time with margin for temperature compensation - */ -#define RADIO_WAKEUP_TIME 3 // [ms] - -/*! - * \brief Compensation delay for SetAutoTx/Rx functions in 15.625 microseconds - */ -#define AUTO_RX_TX_OFFSET 2 - -/*! - * \brief LFSR initial value to compute IBM type CRC - */ -#define CRC_IBM_SEED 0xFFFF - -/*! - * \brief LFSR initial value to compute CCIT type CRC - */ -#define CRC_CCITT_SEED 0x1D0F - -/*! - * \brief Polynomial used to compute IBM CRC - */ -#define CRC_POLYNOMIAL_IBM 0x8005 - -/*! - * \brief Polynomial used to compute CCIT CRC - */ -#define CRC_POLYNOMIAL_CCITT 0x1021 - -/*! - * \brief The address of the register holding the first byte defining the CRC seed - * - */ -#define REG_LR_CRCSEEDBASEADDR 0x06BC - -/*! - * \brief The address of the register holding the first byte defining the CRC polynomial - */ -#define REG_LR_CRCPOLYBASEADDR 0x06BE - -/*! - * \brief The address of the register holding the first byte defining the whitening seed - */ -#define REG_LR_WHITSEEDBASEADDR_MSB 0x06B8 -#define REG_LR_WHITSEEDBASEADDR_LSB 0x06B9 - -/*! - * \brief The address of the register holding the packet configuration - */ -#define REG_LR_PACKETPARAMS 0x0704 - -/*! - * \brief The address of the register holding the payload size - */ -#define REG_LR_PAYLOADLENGTH 0x0702 - -/*! - * \brief The addresses of the registers holding SyncWords values - */ -#define REG_LR_SYNCWORDBASEADDRESS 0x06C0 - -/*! - * \brief The addresses of the register holding LoRa Modem SyncWord value - */ -#define REG_LR_SYNCWORD 0x0740 - -/*! - * Syncword for Private LoRa networks - */ -#define LORA_MAC_PRIVATE_SYNCWORD 0x1424 - -/*! - * Syncword for Public LoRa networks - */ -#define LORA_MAC_PUBLIC_SYNCWORD 0x3444 - -/*! - * The address of the register giving a 4 bytes random number - */ -#define RANDOM_NUMBER_GENERATORBASEADDR 0x0819 - -/*! - * The address of the register holding RX Gain value (0x94: power saving, 0x96: rx boosted) - */ -#define REG_RX_GAIN 0x08AC - -/*! - * Change the value on the device internal trimming capacitor - */ -#define REG_XTA_TRIM 0x0911 - -/*! - * Set the current max value in the over current protection - */ -#define REG_OCP 0x08E7 - -/*! - * \brief Structure describing the radio status - */ -typedef union RadioStatus_u -{ - uint8_t Value; - struct - { //bit order is lsb -> msb - uint8_t Reserved : 1; //!< Reserved - uint8_t CmdStatus : 3; //!< Command status - uint8_t ChipMode : 3; //!< Chip mode - uint8_t CpuBusy : 1; //!< Flag for CPU radio busy - }Fields; -}RadioStatus_t; - -/*! - * \brief Structure describing the error codes for callback functions - */ -typedef enum -{ - IRQ_HEADER_ERROR_CODE = 0x01, - IRQ_SYNCWORD_ERROR_CODE = 0x02, - IRQ_CRC_ERROR_CODE = 0x04, -}IrqErrorCode_t; - -enum IrqPblSyncHeaderCode_t -{ - IRQ_PBL_DETECT_CODE = 0x01, - IRQ_SYNCWORD_VALID_CODE = 0x02, - IRQ_HEADER_VALID_CODE = 0x04, -}; - -/*! - * \brief Represents the operating mode the radio is actually running - */ -typedef enum -{ - MODE_SLEEP = 0x00, //! The radio is in sleep mode - MODE_STDBY_RC, //! The radio is in standby mode with RC oscillator - MODE_STDBY_XOSC, //! The radio is in standby mode with XOSC oscillator - MODE_FS, //! The radio is in frequency synthesis mode - MODE_TX, //! The radio is in transmit mode - MODE_RX, //! The radio is in receive mode - MODE_RX_DC, //! The radio is in receive duty cycle mode - MODE_CAD //! The radio is in channel activity detection mode -}RadioOperatingModes_t; - -/*! - * \brief Declares the oscillator in use while in standby mode - * - * Using the STDBY_RC standby mode allow to reduce the energy consumption - * STDBY_XOSC should be used for time critical applications - */ -typedef enum -{ - STDBY_RC = 0x00, - STDBY_XOSC = 0x01, -}RadioStandbyModes_t; - -/*! - * \brief Declares the power regulation used to power the device - * - * This command allows the user to specify if DC-DC or LDO is used for power regulation. - * Using only LDO implies that the Rx or Tx current is doubled - */ -typedef enum -{ - USE_LDO = 0x00, // default - USE_DCDC = 0x01, -}RadioRegulatorMode_t; - -/*! - * \brief Represents the possible packet type (i.e. modem) used - */ -typedef enum -{ - PACKET_TYPE_GFSK = 0x00, - PACKET_TYPE_LORA = 0x01, - PACKET_TYPE_NONE = 0x0F, -}RadioPacketTypes_t; - -/*! - * \brief Represents the ramping time for power amplifier - */ -typedef enum -{ - RADIO_RAMP_10_US = 0x00, - RADIO_RAMP_20_US = 0x01, - RADIO_RAMP_40_US = 0x02, - RADIO_RAMP_80_US = 0x03, - RADIO_RAMP_200_US = 0x04, - RADIO_RAMP_800_US = 0x05, - RADIO_RAMP_1700_US = 0x06, - RADIO_RAMP_3400_US = 0x07, -}RadioRampTimes_t; - -/*! - * \brief Represents the number of symbols to be used for channel activity detection operation - */ -typedef enum -{ - LORA_CAD_01_SYMBOL = 0x00, - LORA_CAD_02_SYMBOL = 0x01, - LORA_CAD_04_SYMBOL = 0x02, - LORA_CAD_08_SYMBOL = 0x03, - LORA_CAD_16_SYMBOL = 0x04, -}RadioLoRaCadSymbols_t; - -/*! - * \brief Represents the Channel Activity Detection actions after the CAD operation is finished - */ -typedef enum -{ - LORA_CAD_ONLY = 0x00, - LORA_CAD_RX = 0x01, - LORA_CAD_LBT = 0x10, -}RadioCadExitModes_t; - -/*! - * \brief Represents the modulation shaping parameter - */ -typedef enum -{ - MOD_SHAPING_OFF = 0x00, - MOD_SHAPING_G_BT_03 = 0x08, - MOD_SHAPING_G_BT_05 = 0x09, - MOD_SHAPING_G_BT_07 = 0x0A, - MOD_SHAPING_G_BT_1 = 0x0B, -}RadioModShapings_t; - -/*! - * \brief Represents the modulation shaping parameter - */ -typedef enum -{ - RX_BW_4800 = 0x1F, - RX_BW_5800 = 0x17, - RX_BW_7300 = 0x0F, - RX_BW_9700 = 0x1E, - RX_BW_11700 = 0x16, - RX_BW_14600 = 0x0E, - RX_BW_19500 = 0x1D, - RX_BW_23400 = 0x15, - RX_BW_29300 = 0x0D, - RX_BW_39000 = 0x1C, - RX_BW_46900 = 0x14, - RX_BW_58600 = 0x0C, - RX_BW_78200 = 0x1B, - RX_BW_93800 = 0x13, - RX_BW_117300 = 0x0B, - RX_BW_156200 = 0x1A, - RX_BW_187200 = 0x12, - RX_BW_234300 = 0x0A, - RX_BW_312000 = 0x19, - RX_BW_373600 = 0x11, - RX_BW_467000 = 0x09, -}RadioRxBandwidth_t; - -/*! - * \brief Represents the possible spreading factor values in LoRa packet types - */ -typedef enum -{ - LORA_SF5 = 0x05, - LORA_SF6 = 0x06, - LORA_SF7 = 0x07, - LORA_SF8 = 0x08, - LORA_SF9 = 0x09, - LORA_SF10 = 0x0A, - LORA_SF11 = 0x0B, - LORA_SF12 = 0x0C, -}RadioLoRaSpreadingFactors_t; - -/*! - * \brief Represents the bandwidth values for LoRa packet type - */ -typedef enum -{ - LORA_BW_500 = 6, - LORA_BW_250 = 5, - LORA_BW_125 = 4, - LORA_BW_062 = 3, - LORA_BW_041 = 10, - LORA_BW_031 = 2, - LORA_BW_020 = 9, - LORA_BW_015 = 1, - LORA_BW_010 = 8, - LORA_BW_007 = 0, -}RadioLoRaBandwidths_t; - -/*! - * \brief Represents the coding rate values for LoRa packet type - */ -typedef enum -{ - LORA_CR_4_5 = 0x01, - LORA_CR_4_6 = 0x02, - LORA_CR_4_7 = 0x03, - LORA_CR_4_8 = 0x04, -}RadioLoRaCodingRates_t; - -/*! - * \brief Represents the preamble length used to detect the packet on Rx side - */ -typedef enum -{ - RADIO_PREAMBLE_DETECTOR_OFF = 0x00, //!< Preamble detection length off - RADIO_PREAMBLE_DETECTOR_08_BITS = 0x04, //!< Preamble detection length 8 bits - RADIO_PREAMBLE_DETECTOR_16_BITS = 0x05, //!< Preamble detection length 16 bits - RADIO_PREAMBLE_DETECTOR_24_BITS = 0x06, //!< Preamble detection length 24 bits - RADIO_PREAMBLE_DETECTOR_32_BITS = 0x07, //!< Preamble detection length 32 bit -}RadioPreambleDetection_t; - -/*! - * \brief Represents the possible combinations of SyncWord correlators activated - */ -typedef enum -{ - RADIO_ADDRESSCOMP_FILT_OFF = 0x00, //!< No correlator turned on, i.e. do not search for SyncWord - RADIO_ADDRESSCOMP_FILT_NODE = 0x01, - RADIO_ADDRESSCOMP_FILT_NODE_BROAD = 0x02, -}RadioAddressComp_t; - -/*! - * \brief Radio GFSK packet length mode - */ -typedef enum -{ - RADIO_PACKET_FIXED_LENGTH = 0x00, //!< The packet is known on both sides, no header included in the packet - RADIO_PACKET_VARIABLE_LENGTH = 0x01, //!< The packet is on variable size, header included -}RadioPacketLengthModes_t; - -/*! - * \brief Represents the CRC length - */ -typedef enum -{ - RADIO_CRC_OFF = 0x01, //!< No CRC in use - RADIO_CRC_1_BYTES = 0x00, - RADIO_CRC_2_BYTES = 0x02, - RADIO_CRC_1_BYTES_INV = 0x04, - RADIO_CRC_2_BYTES_INV = 0x06, - RADIO_CRC_2_BYTES_IBM = 0xF1, - RADIO_CRC_2_BYTES_CCIT = 0xF2, -}RadioCrcTypes_t; - -/*! - * \brief Radio whitening mode activated or deactivated - */ -typedef enum -{ - RADIO_DC_FREE_OFF = 0x00, - RADIO_DC_FREEWHITENING = 0x01, -}RadioDcFree_t; - -/*! - * \brief Holds the Radio lengths mode for the LoRa packet type - */ -typedef enum -{ - LORA_PACKET_VARIABLE_LENGTH = 0x00, //!< The packet is on variable size, header included - LORA_PACKET_FIXED_LENGTH = 0x01, //!< The packet is known on both sides, no header included in the packet - LORA_PACKET_EXPLICIT = LORA_PACKET_VARIABLE_LENGTH, - LORA_PACKET_IMPLICIT = LORA_PACKET_FIXED_LENGTH, -}RadioLoRaPacketLengthsMode_t; - -/*! - * \brief Represents the CRC mode for LoRa packet type - */ -typedef enum -{ - LORA_CRC_ON = 0x01, //!< CRC activated - LORA_CRC_OFF = 0x00, //!< CRC not used -}RadioLoRaCrcModes_t; - -/*! - * \brief Represents the IQ mode for LoRa packet type - */ -typedef enum -{ - LORA_IQ_NORMAL = 0x00, - LORA_IQ_INVERTED = 0x01, -}RadioLoRaIQModes_t; - -/*! - * \brief Represents the voltage used to control the TCXO on/off from DIO3 - */ -typedef enum -{ - TCXO_CTRL_1_6V = 0x00, - TCXO_CTRL_1_7V = 0x01, - TCXO_CTRL_1_8V = 0x02, - TCXO_CTRL_2_2V = 0x03, - TCXO_CTRL_2_4V = 0x04, - TCXO_CTRL_2_7V = 0x05, - TCXO_CTRL_3_0V = 0x06, - TCXO_CTRL_3_3V = 0x07, -}RadioTcxoCtrlVoltage_t; - -/*! - * \brief Represents the interruption masks available for the radio - * - * \remark Note that not all these interruptions are available for all packet types - */ -typedef enum -{ - IRQ_RADIO_NONE = 0x0000, - IRQ_TX_DONE = 0x0001, - IRQ_RX_DONE = 0x0002, - IRQ_PREAMBLE_DETECTED = 0x0004, - IRQ_SYNCWORD_VALID = 0x0008, - IRQ_HEADER_VALID = 0x0010, - IRQ_HEADER_ERROR = 0x0020, - IRQ_CRC_ERROR = 0x0040, - IRQ_CAD_DONE = 0x0080, - IRQ_CAD_ACTIVITY_DETECTED = 0x0100, - IRQ_RX_TX_TIMEOUT = 0x0200, - IRQ_RADIO_ALL = 0xFFFF, -}RadioIrqMasks_t; - -/*! - * \brief Represents all possible opcode understood by the radio - */ -typedef enum RadioCommands_e -{ - RADIO_GET_STATUS = 0xC0, - RADIO_WRITE_REGISTER = 0x0D, - RADIO_READ_REGISTER = 0x1D, - RADIO_WRITE_BUFFER = 0x0E, - RADIO_READ_BUFFER = 0x1E, - RADIO_SET_SLEEP = 0x84, - RADIO_SET_STANDBY = 0x80, - RADIO_SET_FS = 0xC1, - RADIO_SET_TX = 0x83, - RADIO_SET_RX = 0x82, - RADIO_SET_RXDUTYCYCLE = 0x94, - RADIO_SET_CAD = 0xC5, - RADIO_SET_TXCONTINUOUSWAVE = 0xD1, - RADIO_SET_TXCONTINUOUSPREAMBLE = 0xD2, - RADIO_SET_PACKETTYPE = 0x8A, - RADIO_GET_PACKETTYPE = 0x11, - RADIO_SET_RFFREQUENCY = 0x86, - RADIO_SET_TXPARAMS = 0x8E, - RADIO_SET_PACONFIG = 0x95, - RADIO_SET_CADPARAMS = 0x88, - RADIO_SET_BUFFERBASEADDRESS = 0x8F, - RADIO_SET_MODULATIONPARAMS = 0x8B, - RADIO_SET_PACKETPARAMS = 0x8C, - RADIO_GET_RXBUFFERSTATUS = 0x13, - RADIO_GET_PACKETSTATUS = 0x14, - RADIO_GET_RSSIINST = 0x15, - RADIO_GET_STATS = 0x10, - RADIO_RESET_STATS = 0x00, - RADIO_CFG_DIOIRQ = 0x08, - RADIO_GET_IRQSTATUS = 0x12, - RADIO_CLR_IRQSTATUS = 0x02, - RADIO_CALIBRATE = 0x89, - RADIO_CALIBRATEIMAGE = 0x98, - RADIO_SET_REGULATORMODE = 0x96, - RADIO_GET_ERROR = 0x17, - RADIO_CLR_ERROR = 0x07, - RADIO_SET_TCXOMODE = 0x97, - RADIO_SET_TXFALLBACKMODE = 0x93, - RADIO_SET_RFSWITCHMODE = 0x9D, - RADIO_SET_STOPRXTIMERONPREAMBLE = 0x9F, - RADIO_SET_LORASYMBTIMEOUT = 0xA0, -}RadioCommands_t; - -/*! - * \brief The type describing the modulation parameters for every packet types - */ -typedef struct -{ - RadioPacketTypes_t PacketType; //!< Packet to which the modulation parameters are referring to. - struct - { - struct - { - uint32_t BitRate; - uint32_t Fdev; - RadioModShapings_t ModulationShaping; - uint8_t Bandwidth; - }Gfsk; - struct - { - RadioLoRaSpreadingFactors_t SpreadingFactor; //!< Spreading Factor for the LoRa modulation - RadioLoRaBandwidths_t Bandwidth; //!< Bandwidth for the LoRa modulation - RadioLoRaCodingRates_t CodingRate; //!< Coding rate for the LoRa modulation - uint8_t LowDatarateOptimize; //!< Indicates if the modem uses the low datarate optimization - }LoRa; - }Params; //!< Holds the modulation parameters structure -}ModulationParams_t; - -/*! - * \brief The type describing the packet parameters for every packet types - */ -typedef struct -{ - RadioPacketTypes_t PacketType; //!< Packet to which the packet parameters are referring to. - struct - { - /*! - * \brief Holds the GFSK packet parameters - */ - struct - { - uint16_t PreambleLength; //!< The preamble Tx length for GFSK packet type in bit - RadioPreambleDetection_t PreambleMinDetect; //!< The preamble Rx length minimal for GFSK packet type - uint8_t SyncWordLength; //!< The synchronization word length for GFSK packet type - RadioAddressComp_t AddrComp; //!< Activated SyncWord correlators - RadioPacketLengthModes_t HeaderType; //!< If the header is explicit, it will be transmitted in the GFSK packet. If the header is implicit, it will not be transmitted - uint8_t PayloadLength; //!< Size of the payload in the GFSK packet - RadioCrcTypes_t CrcLength; //!< Size of the CRC block in the GFSK packet - RadioDcFree_t DcFree; - }Gfsk; - /*! - * \brief Holds the LoRa packet parameters - */ - struct - { - uint16_t PreambleLength; //!< The preamble length is the number of LoRa symbols in the preamble - RadioLoRaPacketLengthsMode_t HeaderType; //!< If the header is explicit, it will be transmitted in the LoRa packet. If the header is implicit, it will not be transmitted - uint8_t PayloadLength; //!< Size of the payload in the LoRa packet - RadioLoRaCrcModes_t CrcMode; //!< Size of CRC block in LoRa packet - RadioLoRaIQModes_t InvertIQ; //!< Allows to swap IQ for LoRa packet - }LoRa; - }Params; //!< Holds the packet parameters structure -}PacketParams_t; - -/*! - * \brief Represents the packet status for every packet type - */ -typedef struct -{ - RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to. - struct - { - struct - { - uint8_t RxStatus; - int8_t RssiAvg; //!< The averaged RSSI - int8_t RssiSync; //!< The RSSI measured on last packet - uint32_t FreqError; - }Gfsk; - struct - { - int8_t RssiPkt; //!< The RSSI of the last packet - int8_t SnrPkt; //!< The SNR of the last packet - int8_t SignalRssiPkt; - uint32_t FreqError; - }LoRa; - }Params; -}PacketStatus_t; - -/*! - * \brief Represents the Rx internal counters values when GFSK or LoRa packet type is used - */ -typedef struct -{ - RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to. - uint16_t PacketReceived; - uint16_t CrcOk; - uint16_t LengthError; -}RxCounter_t; - -/*! - * \brief Represents a calibration configuration - */ -typedef union -{ - struct - { - uint8_t RC64KEnable : 1; //!< Calibrate RC64K clock - uint8_t RC13MEnable : 1; //!< Calibrate RC13M clock - uint8_t PLLEnable : 1; //!< Calibrate PLL - uint8_t ADCPulseEnable : 1; //!< Calibrate ADC Pulse - uint8_t ADCBulkNEnable : 1; //!< Calibrate ADC bulkN - uint8_t ADCBulkPEnable : 1; //!< Calibrate ADC bulkP - uint8_t ImgEnable : 1; - uint8_t : 1; - }Fields; - uint8_t Value; -}CalibrationParams_t; - -/*! - * \brief Represents a sleep mode configuration - */ -typedef union -{ - struct - { - uint8_t WakeUpRTC : 1; //!< Get out of sleep mode if wakeup signal received from RTC - uint8_t Reset : 1; - uint8_t WarmStart : 1; - uint8_t Reserved : 5; - }Fields; - uint8_t Value; -}SleepParams_t; - -/*! - * \brief Represents the possible radio system error states - */ -typedef union -{ - struct - { - uint8_t Rc64kCalib : 1; //!< RC 64kHz oscillator calibration failed - uint8_t Rc13mCalib : 1; //!< RC 13MHz oscillator calibration failed - uint8_t PllCalib : 1; //!< PLL calibration failed - uint8_t AdcCalib : 1; //!< ADC calibration failed - uint8_t ImgCalib : 1; //!< Image calibration failed - uint8_t XoscStart : 1; //!< XOSC oscillator failed to start - uint8_t PllLock : 1; //!< PLL lock failed - uint8_t BuckStart : 1; //!< Buck converter failed to start - uint8_t PaRamp : 1; //!< PA ramp failed - uint8_t : 7; //!< Reserved - }Fields; - uint16_t Value; -}RadioError_t; - -/*! - * Radio hardware and global parameters - */ -typedef struct SX126x_s -{ -// Gpio_t Reset; -// Gpio_t BUSY; -// Gpio_t DIO1; -// Gpio_t DIO2; -// Gpio_t DIO3; -// Spi_t Spi; - PacketParams_t PacketParams; - PacketStatus_t PacketStatus; - ModulationParams_t ModulationParams; -}SX126x_t; - -/*! - * Hardware IO IRQ callback function definition - */ -typedef void ( DioIrqHandler )( void ); - -/*! - * SX126x definitions - */ - -/*! - * \brief Provides the frequency of the chip running on the radio and the frequency step - * - * \remark These defines are used for computing the frequency divider to set the RF frequency - */ -#define XTAL_FREQ ( double )32000000 -#define FREQ_DIV ( double )pow( 2.0, 25.0 ) -#define FREQ_STEP ( double )( XTAL_FREQ / FREQ_DIV ) - -#define RX_BUFFER_SIZE 256 - -/*! - * \brief The radio callbacks structure - * Holds function pointers to be called on radio interrupts - */ -typedef struct -{ - void ( *txDone )( void ); //!< Pointer to a function run on successful transmission - void ( *rxDone )( void ); //!< Pointer to a function run on successful reception - void ( *rxPreambleDetect )( void ); //!< Pointer to a function run on successful Preamble detection - void ( *rxSyncWordDone )( void ); //!< Pointer to a function run on successful SyncWord reception - void ( *rxHeaderDone )( bool isOk ); //!< Pointer to a function run on successful Header reception - void ( *txTimeout )( void ); //!< Pointer to a function run on transmission timeout - void ( *rxTimeout )( void ); //!< Pointer to a function run on reception timeout - void ( *rxError )( IrqErrorCode_t errCode ); //!< Pointer to a function run on reception error - void ( *cadDone )( bool cadFlag ); //!< Pointer to a function run on channel activity detected -}SX126xCallbacks_t; - -/*! - * ============================================================================ - * Public functions prototypes - * ============================================================================ - */ - -/*! - * \brief Initializes the radio driver - */ -void SX126xInit( void ); - -/*! - * \brief Gets the current Operation Mode of the Radio - * - * \retval RadioOperatingModes_t last operating mode - */ -uint8_t SX126xGetOperatingMode( void ); - -/*! - * \brief Wakeup the radio if it is in Sleep mode and check that Busy is low - */ -void SX126xCheckDeviceReady( void ); - -/*! - * \brief Saves the payload to be send in the radio buffer - * - * \param [in] payload A pointer to the payload - * \param [in] size The size of the payload - */ -void SX126xSetPayload( uint8_t *payload, uint8_t size ); - -/*! - * \brief Reads the payload received. If the received payload is longer - * than maxSize, then the method returns 1 and do not set size and payload. - * - * \param [out] payload A pointer to a buffer into which the payload will be copied - * \param [out] size A pointer to the size of the payload received - * \param [in] maxSize The maximal size allowed to copy into the buffer - */ -uint8_t SX126xGetPayload( uint8_t *payload, uint8_t *size, uint8_t maxSize ); - -/*! - * \brief Sends a payload - * - * \param [in] payload A pointer to the payload to send - * \param [in] size The size of the payload to send - * \param [in] timeout The timeout for Tx operation - */ -void SX126xSendPayload( uint8_t *payload, uint8_t size, uint32_t timeout ); - -/*! - * \brief Sets the Sync Word given by index used in GFSK - * - * \param [in] syncWord SyncWord bytes ( 8 bytes ) - * - * \retval status [0: OK, 1: NOK] - */ -uint8_t SX126xSetSyncWord( uint8_t *syncWord ); - -/*! - * \brief Sets the Initial value for the LFSR used for the CRC calculation - * - * \param [in] seed Initial LFSR value ( 2 bytes ) - * - */ -void SX126xSetCrcSeed( uint16_t seed ); - -/*! - * \brief Sets the seed used for the CRC calculation - * - * \param [in] seed The seed value - * - */ -void SX126xSetCrcPolynomial( uint16_t polynomial ); - -/*! - * \brief Sets the Initial value of the LFSR used for the whitening in GFSK protocols - * - * \param [in] seed Initial LFSR value - */ -void SX126xSetWhiteningSeed( uint16_t seed ); - -/*! - * \brief Gets a 32 bits random value generated by the radio - * - * \remark The radio must be in reception mode before executing this function - * - * \retval randomValue 32 bits random value - */ -uint32_t SX126xGetRandom( void ); - -/*! - * \brief Sets the radio in sleep mode - * - * \param [in] sleepConfig The sleep configuration describing data - * retention and RTC wake-up - */ -void SX126xSetSleep( uint8_t sleepConfig ); - -/*! - * \brief Sets the radio in configuration mode - * - * \param [in] mode The standby mode to put the radio into - */ -void SX126xSetStandby( uint8_t mode ); - -/*! - * \brief Sets the radio in FS mode - */ -void SX126xSetFs( void ); - -/*! - * \brief Sets the radio in transmission mode - * - * \param [in] timeout Structure describing the transmission timeout value - */ -void SX126xSetTx( uint32_t timeout ); - -/*! - * \brief Sets the radio in reception mode - * - * \param [in] timeout Structure describing the reception timeout value - */ -void SX126xSetRx( uint32_t timeout ); - -/*! - * \brief Sets the radio in reception mode with Boosted LNA gain - * - * \param [in] timeout Structure describing the reception timeout value - */ -void SX126xSetRxBoosted( uint32_t timeout ); - -/*! - * \brief Sets the Rx duty cycle management parameters - * - * \param [in] rxTime Structure describing reception timeout value - * \param [in] sleepTime Structure describing sleep timeout value - */ -void SX126xSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ); - -/*! - * \brief Sets the radio in CAD mode - */ -void SX126xSetCad( void ); - -/*! - * \brief Sets the radio in continuous wave transmission mode - */ -void SX126xSetTxContinuousWave( void ); - -/*! - * \brief Sets the radio in continuous preamble transmission mode - */ -void SX126xSetTxInfinitePreamble( void ); - -/*! - * \brief Decide which interrupt will stop the internal radio rx timer. - * - * \param [in] enable [0: Timer stop after header/syncword detection - * 1: Timer stop after preamble detection] - */ -void SX126xSetStopRxTimerOnPreambleDetect( bool enable ); - -/*! - * \brief Set the number of symbol the radio will wait to validate a reception - * - * \param [in] SymbNum number of LoRa symbols - */ -void SX126xSetLoRaSymbNumTimeout( uint8_t SymbNum ); - -/*! - * \brief Sets the power regulators operating mode - * - * \param [in] mode [0: LDO, 1:DC_DC] - */ -void SX126xSetRegulatorMode( uint8_t mode ); - -/*! - * \brief Calibrates the given radio block - * - * \param [in] calibParam The description of blocks to be calibrated - */ -void SX126xCalibrate( uint8_t calibParam ); - -/*! - * \brief Calibrates the Image rejection depending of the frequency - * - * \param [in] freq The operating frequency - */ -void SX126xCalibrateImage( uint32_t freq ); - -/*! - * \brief Activate the extention of the timeout when long preamble is used - * - * \param [in] enable The radio will extend the timeout to cope with long preamble - */ -void SX126xSetLongPreamble( uint8_t enable ); - -/*! - * \brief Sets the transmission parameters - * - * \param [in] paDutyCycle Duty Cycle for the PA - * \param [in] hpMax 0 for sx1261, 7 for sx1262 - * \param [in] deviceSel 1 for sx1261, 0 for sx1262 - * \param [in] paLut 0 for 14dBm LUT, 1 for 22dBm LUT - */ -void SX126xSetPaConfig( uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, uint8_t paLut ); - -/*! - * \brief Defines into which mode the chip goes after a TX / RX done - * - * \param [in] fallbackMode The mode in which the radio goes - */ -void SX126xSetRxTxFallbackMode( uint8_t fallbackMode ); - -/*! - * \brief Write data to the radio memory - * - * \param [in] address The address of the first byte to write in the radio - * \param [in] buffer The data to be written in radio's memory - * \param [in] size The number of bytes to write in radio's memory - */ -void SX126xWriteRegisters( uint16_t address, uint8_t *buffer, uint16_t size ); - -/*! - * \brief Read data from the radio memory - * - * \param [in] address The address of the first byte to read from the radio - * \param [out] buffer The buffer that holds data read from radio - * \param [in] size The number of bytes to read from radio's memory - */ -void SX126xReadRegisters( uint16_t address, uint8_t *buffer, uint16_t size ); - -/*! - * \brief Write data to the buffer holding the payload in the radio - * - * \param [in] offset The offset to start writing the payload - * \param [in] buffer The data to be written (the payload) - * \param [in] size The number of byte to be written - */ -void SX126xWriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ); - -/*! - * \brief Read data from the buffer holding the payload in the radio - * - * \param [in] offset The offset to start reading the payload - * \param [out] buffer A pointer to a buffer holding the data from the radio - * \param [in] size The number of byte to be read - */ -void SX126xReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ); - -/*! - * \brief Sets the IRQ mask and DIO masks - * - * \param [in] irqMask General IRQ mask - * \param [in] dio1Mask DIO1 mask - * \param [in] dio2Mask DIO2 mask - * \param [in] dio3Mask DIO3 mask - */ -void SX126xSetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask ); - -/*! - * \brief Returns the current IRQ status - * - * \retval irqStatus IRQ status - */ -uint16_t SX126xGetIrqStatus( void ); - -/*! - * \brief Indicates if DIO2 is used to control an RF Switch - * - * \param [in] enable true of false - */ -void SX126xSetDio2AsRfSwitchCtrl( uint8_t enable ); - -/*! - * \brief Indicates if the Radio main clock is supplied from a tcxo - * - * \param [in] tcxoVoltage voltage used to control the TCXO - * \param [in] timeout time given to the TCXO to go to 32MHz - */ -void SX126xSetDio3AsTcxoCtrl( uint8_t tcxoVoltage, uint32_t timeout ); - -/*! - * \brief Sets the RF frequency - * - * \param [in] frequency RF frequency [Hz] - */ -void SX126xSetRfFrequency( uint32_t frequency ); - -/*! - * \brief Sets the radio for the given protocol - * - * \param [in] packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA] - * - * \remark This method has to be called before SetRfFrequency, - * SetModulationParams and SetPacketParams - */ -void SX126xSetPacketType( RadioPacketTypes_t packetType ); - -/*! - * \brief Gets the current radio protocol - * - * \retval packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA] - */ -RadioPacketTypes_t SX126xGetPacketType( void ); - -/*! - * \brief Sets the transmission parameters - * - * \param [in] power RF output power [-18..13] dBm - * \param [in] rampTime Transmission ramp up time - */ -void SX126xSetTxParams( int8_t power, uint8_t rampTime ); - -/*! - * \brief Set the modulation parameters - * - * \param [in] modParams A structure describing the modulation parameters - */ -void SX126xSetModulationParams( void *input_ptr ); - -/*! - * \brief Sets the packet parameters - * - * \param [in] packetParams A structure describing the packet parameters - */ -void SX126xSetPacketParams( void *packetParams ); - -/*! - * \brief Sets the Channel Activity Detection (CAD) parameters - * - * \param [in] cadSymbolNum The number of symbol to use for CAD operations - * [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL, - * LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL, - * LORA_CAD_16_SYMBOL] - * \param [in] cadDetPeak Limit for detection of SNR peak used in the CAD - * \param [in] cadDetMin Set the minimum symbol recognition for CAD - * \param [in] cadExitMode Operation to be done at the end of CAD action - * [LORA_CAD_ONLY, LORA_CAD_RX, LORA_CAD_LBT] - * \param [in] cadTimeout Defines the timeout value to abort the CAD activity - */ -void SX126xSetCadParams( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, RadioCadExitModes_t cadExitMode, uint32_t cadTimeout ); - -/*! - * \brief Sets the data buffer base address for transmission and reception - * - * \param [in] txBaseAddress Transmission base address - * \param [in] rxBaseAddress Reception base address - */ -void SX126xSetBufferBaseAddress( uint8_t txBaseAddress, uint8_t rxBaseAddress ); - -/*! - * \brief Gets the current radio status - * - * \retval status Radio status - */ -uint8_t SX126xGetStatus( void ); - -/*! - * \brief Returns the instantaneous RSSI value for the last packet received - * - * \retval rssiInst Instantaneous RSSI - */ -int8_t SX126xGetRssiInst( void ); - -/*! - * \brief Gets the last received packet buffer status - * - * \param [out] payloadLength Last received packet payload length - * \param [out] rxStartBuffer Last received packet buffer address pointer - */ -void SX126xGetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBuffer ); - -/*! - * \brief Gets the last received packet payload length - * - * \param [out] pktStatus A structure of packet status - */ -void SX126xGetPacketStatus( void *pktStatus ); - -/*! - * \brief Returns the possible system errors - * - * \retval sysErrors Value representing the possible sys failures - */ -uint16_t SX126xGetDeviceErrors( void ); - -/*! - * \brief Clear all the errors in the device - */ -void SX126xClearDeviceErrors( void ); - -/*! - * \brief Clears the IRQs - * - * \param [in] irq IRQ(s) to be cleared - */ -void SX126xClearIrqStatus( uint16_t irq ); - -#endif // __SX126x_H__ diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/timer.cpp b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/timer.cpp deleted file mode 100644 index 96b22367..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/timer.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include "timer1.h" -unsigned int timer1_counter = 0; -uint32_t TickCounter = 0; - -void timer1_init(void) -{ - // Initializing timer1 - cli(); //disable global interrupt - TCCR1A = 0; //set TCCR1A to 0 - TCCR1B = 0; - - timer1_counter = 64911; - TCNT1 = timer1_counter; - - TCCR1B |= (1 << CS12); //256 frequency divider - - // enable overflow interrupt for timer - TIMSK1 = (1 << TOIE1); - //enable global interrupt - sei(); -} - -ISR(TIMER1_OVF_vect) -{ - TCNT1 = timer1_counter; - TickCounter++; -} \ No newline at end of file diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/timer1.h b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/timer1.h deleted file mode 100644 index d59c9193..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-RX/timer1.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _TIMER1_H_ -#define _TIMER1_H_ -void timer1_init(void); - -#endif diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/Arduino-DRF1262T-TX.ino b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/Arduino-DRF1262T-TX.ino deleted file mode 100644 index 59c288ad..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/Arduino-DRF1262T-TX.ino +++ /dev/null @@ -1,161 +0,0 @@ -#include -#include -#include -#include "radio.h" -#include "timer1.h" -#include "sx126x.h" -#include "sx126x-board.h" -#define Get_NIRQ() digitalRead(Dio1Pin) -/* - * if you want to use TCXO please open sx1262.h line 29 - */ - -uint8_t mode = USER_MODE_TX; /*mode SET current work mode: TX or RX*/ -/*Default frequency:868MHZ Bandwidth:125KHZ,RF_FACTOR:11 */ -#define RF_FREQUENCY 868000000 // Hz center frequency -#define TX_OUTPUT_POWER 22 // dBm tx output power -#define LORA_BANDWIDTH 1 // bandwidth=125khz 0:250kHZ,1:125kHZ,2:62kHZ,3:20kHZ.... lookfor radio line 392 -#define LORA_SPREADING_FACTOR 11 // spreading factor=11 [SF5..SF12] -#define LORA_CODINGRATE 1 // [1: 4/5, - // 2: 4/6, - // 3: 4/7, - // 4: 4/8] -#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx -#define LORA_SYMBOL_TIMEOUT 0 // Symbols -#define LORA_FIX_LENGTH_PAYLOAD_ON false // variable data payload -#define LORA_IQ_INVERSION_ON false - -typedef enum -{ - LOWPOWER, - RX, - RX_TIMEOUT, - RX_ERROR, - TX, - TX_TIMEOUT, -} States_t; - -#define RX_TIMEOUT_VALUE 1000 -#define BUFFER_SIZE 64 // Define the payload size here -States_t State = LOWPOWER; - -RadioEvents_t RadioEvents; -uint16_t BufferSize = BUFFER_SIZE; -uint8_t Buffer[BUFFER_SIZE]; -int8_t RssiValue = 0; -int8_t SnrValue = 0; - -void OnTxDone(void); -void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr); -void OnTxTimeout(void); -void OnRxTimeout(void); -void OnRxError(void); - -uint8_t i = 0; - -void setup() -{ - timer1_init(); - SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); - Serial.begin(9600); // set baud rate - SX126xIoInit(); // Initializes the radio I/Os pins - SPI.begin(); - - pinMode(Led1BluePin, OUTPUT); - pinMode(Led1RedPin, OUTPUT); - digitalWrite(Led1BluePin, 1); - digitalWrite(Led1RedPin, 1); - - // Radio initialization - RadioEvents.TxDone = OnTxDone; - RadioEvents.RxDone = OnRxDone; - RadioEvents.TxTimeout = OnTxTimeout; - RadioEvents.RxTimeout = OnRxTimeout; - RadioEvents.RxError = OnRxError; - - Radio.Init(&RadioEvents); - Radio.SetChannel(RF_FREQUENCY); - - Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, - LORA_SPREADING_FACTOR, LORA_CODINGRATE, - LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, - true, 0, 0, LORA_IQ_INVERSION_ON, 3000); - - Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, - LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, - LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, - 0, true, 0, 0, LORA_IQ_INVERSION_ON, true); - - if (USER_MODE_RX == mode) - { - - Radio.Rx(0); - digitalWrite(Led1BluePin, 0); - Serial.println("Now is RX"); - } - else - { - Radio.Send((uint8_t *)&i, 1); - } -} - -void loop() -{ - // put your main code here, to run repeatedly: - if (USER_MODE_RX == mode) - { - if (0 != State) - { - Serial.println(Buffer[0], DEC); // print received characters - - digitalWrite(Led1BluePin, digitalRead(Led1BluePin) ^ 1); - State = LOWPOWER; - } - } - else if (TX == State) - { - delay(500); - i++; - Radio.Send((uint8_t *)&i, 1); // send one testing character, users can change the content - digitalWrite(Led1RedPin, digitalRead(Led1RedPin) ^ 1); - } - // Process Radio IRQ - if (Get_NIRQ()) - { - Radio.IrqProcess(); - } -} - -void OnTxDone(void) -{ - // Radio.Sleep( ); - State = TX; -} - -void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) -{ - // Radio.Sleep( ); - BufferSize = size; - memcpy(Buffer, payload, BufferSize); - RssiValue = rssi; - SnrValue = snr; - State = RX; -} - -void OnTxTimeout(void) -{ - // Radio.Sleep( ); - State = TX_TIMEOUT; -} - -void OnRxTimeout(void) -{ - // Radio.Sleep( ); - State = RX_TIMEOUT; -} - -void OnRxError(void) -{ - // Radio.Sleep( ); - State = RX_ERROR; -} diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/radio.cpp b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/radio.cpp deleted file mode 100644 index 1ca1b623..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/radio.cpp +++ /dev/null @@ -1,1016 +0,0 @@ -/*! - * \file radio.c - * - * \brief Radio driver API definition - * - * \copyright Revised BSD License, see section \ref LICENSE. - * - * \code - * ______ _ - * / _____) _ | | - * ( (____ _____ ____ _| |_ _____ ____| |__ - * \____ \| ___ | (_ _) ___ |/ ___) _ \ - * _____) ) ____| | | || |_| ____( (___| | | | - * (______/|_____)_|_|_| \__)_____)\____)_| |_| - * (C)2013-2017 Semtech - * - * \endcode - * - * \author Miguel Luis ( Semtech ) - * - * \author Gregory Cristian ( Semtech ) - */ -#include -#include -#include "sx126x.h" -#include "radio.h" -#include "sx126x-board.h" - -/*! - * \brief Initializes the radio - * - * \param [IN] events Structure containing the driver callback functions - */ -void RadioInit( RadioEvents_t *events ); - -/*! - * Return current radio status - * - * \param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING] - */ -RadioState_t RadioGetStatus( void ); - -/*! - * \brief Configures the radio with the given modem - * - * \param [IN] modem Modem to be used [0: FSK, 1: LoRa] - */ -void RadioSetModem( uint8_t modem ); - -/*! - * \brief Sets the channel frequency - * - * \param [IN] freq Channel RF frequency - */ -void RadioSetChannel( uint32_t freq ); - -/*! - * \brief Checks if the channel is free for the given time - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] freq Channel RF frequency - * \param [IN] rssiThresh RSSI threshold - * \param [IN] maxCarrierSenseTime Max time while the RSSI is measured - * - * \retval isFree [true: Channel is free, false: Channel is not free] - */ -bool RadioIsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh, uint32_t maxCarrierSenseTime ); - -/*! - * \brief Generates a 32 bits random value based on the RSSI readings - * - * \remark This function sets the radio in LoRa modem mode and disables - * all interrupts. - * After calling this function either Radio.SetRxConfig or - * Radio.SetTxConfig functions must be called. - * - * \retval randomValue 32 bits random value - */ -uint32_t RadioRandom( void ); - -/*! - * \brief Sets the reception parameters - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] bandwidth Sets the bandwidth - * FSK : >= 2600 and <= 250000 Hz - * LoRa: [0: 125 kHz, 1: 250 kHz, - * 2: 500 kHz, 3: Reserved] - * \param [IN] datarate Sets the Datarate - * FSK : 600..300000 bits/s - * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, - * 10: 1024, 11: 2048, 12: 4096 chips] - * \param [IN] coderate Sets the coding rate (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] - * \param [IN] bandwidthAfc Sets the AFC Bandwidth (FSK only) - * FSK : >= 2600 and <= 250000 Hz - * LoRa: N/A ( set to 0 ) - * \param [IN] preambleLen Sets the Preamble length - * FSK : Number of bytes - * LoRa: Length in symbols (the hardware adds 4 more symbols) - * \param [IN] symbTimeout Sets the RxSingle timeout value - * FSK : timeout in number of bytes - * LoRa: timeout in symbols - * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] - * \param [IN] payloadLen Sets payload length when fixed length is used - * \param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON] - * \param [IN] FreqHopOn Enables disables the intra-packet frequency hopping - * FSK : N/A ( set to 0 ) - * LoRa: [0: OFF, 1: ON] - * \param [IN] HopPeriod Number of symbols between each hop - * FSK : N/A ( set to 0 ) - * LoRa: Number of symbols - * \param [IN] iqInverted Inverts IQ signals (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [0: not inverted, 1: inverted] - * \param [IN] rxContinuous Sets the reception in continuous mode - * [false: single mode, true: continuous mode] - */ -void RadioSetRxConfig( uint8_t modem, uint32_t bandwidth, - uint32_t datarate, uint8_t coderate, - uint32_t bandwidthAfc, uint16_t preambleLen, - uint16_t symbTimeout, bool fixLen, - uint8_t payloadLen, - bool crcOn, bool FreqHopOn, uint8_t HopPeriod, - bool iqInverted, bool rxContinuous ); - -/*! - * \brief Sets the transmission parameters - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] power Sets the output power [dBm] - * \param [IN] fdev Sets the frequency deviation (FSK only) - * FSK : [Hz] - * LoRa: 0 - * \param [IN] bandwidth Sets the bandwidth (LoRa only) - * FSK : 0 - * LoRa: [0: 125 kHz, 1: 250 kHz, - * 2: 500 kHz, 3: Reserved] - * \param [IN] datarate Sets the Datarate - * FSK : 600..300000 bits/s - * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, - * 10: 1024, 11: 2048, 12: 4096 chips] - * \param [IN] coderate Sets the coding rate (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] - * \param [IN] preambleLen Sets the preamble length - * FSK : Number of bytes - * LoRa: Length in symbols (the hardware adds 4 more symbols) - * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] - * \param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON] - * \param [IN] FreqHopOn Enables disables the intra-packet frequency hopping - * FSK : N/A ( set to 0 ) - * LoRa: [0: OFF, 1: ON] - * \param [IN] HopPeriod Number of symbols between each hop - * FSK : N/A ( set to 0 ) - * LoRa: Number of symbols - * \param [IN] iqInverted Inverts IQ signals (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [0: not inverted, 1: inverted] - * \param [IN] timeout Transmission timeout [ms] - */ -void RadioSetTxConfig( uint8_t modem, int8_t power, uint32_t fdev, - uint32_t bandwidth, uint32_t datarate, - uint8_t coderate, uint16_t preambleLen, - bool fixLen, bool crcOn, bool FreqHopOn, - uint8_t HopPeriod, bool iqInverted, uint32_t timeout ); - -/*! - * \brief Checks if the given RF frequency is supported by the hardware - * - * \param [IN] frequency RF frequency to be checked - * \retval isSupported [true: supported, false: unsupported] - */ -bool RadioCheckRfFrequency( uint32_t frequency ); - -/*! - * \brief Computes the packet time on air in ms for the given payload - * - * \Remark Can only be called once SetRxConfig or SetTxConfig have been called - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] pktLen Packet payload length - * - * \retval airTime Computed airTime (ms) for the given packet payload length - */ -uint32_t RadioTimeOnAir( RadioModems_t modem, uint8_t pktLen ); - -/*! - * \brief Sends the buffer of size. Prepares the packet to be sent and sets - * the radio in transmission - * - * \param [IN]: buffer Buffer pointer - * \param [IN]: size Buffer size - */ -void RadioSend( uint8_t *buffer, uint8_t size ); - -/*! - * \brief Sets the radio in sleep mode - */ -void RadioSleep( void ); - -/*! - * \brief Sets the radio in standby mode - */ -void RadioStandby( void ); - -/*! - * \brief Sets the radio in reception mode for the given time - * \param [IN] timeout Reception timeout [ms] - * [0: continuous, others timeout] - */ -void RadioRx( uint32_t timeout ); - -/*! - * \brief Start a Channel Activity Detection - */ -void RadioStartCad( void ); - -/*! - * \brief Sets the radio in continuous wave transmission mode - * - * \param [IN]: freq Channel RF frequency - * \param [IN]: power Sets the output power [dBm] - * \param [IN]: time Transmission mode timeout [s] - */ -void RadioSetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ); - -/*! - * \brief Reads the current RSSI value - * - * \retval rssiValue Current RSSI value in [dBm] - */ -int16_t RadioRssi( RadioModems_t modem ); - -/*! - * \brief Writes the radio register at the specified address - * - * \param [IN]: addr Register address - * \param [IN]: data New register value - */ -void RadioWrite( uint16_t addr, uint8_t data ); - -/*! - * \brief Reads the radio register at the specified address - * - * \param [IN]: addr Register address - * \retval data Register value - */ -uint8_t RadioRead( uint16_t addr ); - -/*! - * \brief Writes multiple radio registers starting at address - * - * \param [IN] addr First Radio register address - * \param [IN] buffer Buffer containing the new register's values - * \param [IN] size Number of registers to be written - */ -void RadioWriteBuffer( uint16_t addr, uint8_t *buffer, uint8_t size ); - -/*! - * \brief Reads multiple radio registers starting at address - * - * \param [IN] addr First Radio register address - * \param [OUT] buffer Buffer where to copy the registers data - * \param [IN] size Number of registers to be read - */ -void RadioReadBuffer( uint16_t addr, uint8_t *buffer, uint8_t size ); - -/*! - * \brief Sets the maximum payload length. - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] max Maximum payload length in bytes - */ -void RadioSetMaxPayloadLength( RadioModems_t modem, uint8_t max ); - -/*! - * \brief Sets the network to public or private. Updates the sync byte. - * - * \remark Applies to LoRa modem only - * - * \param [IN] enable if true, it enables a public network - */ -void RadioSetPublicNetwork( bool enable ); - -/*! - * \brief Gets the time required for the board plus radio to get out of sleep.[ms] - * - * \retval time Radio plus board wakeup time in ms. - */ -uint32_t RadioGetWakeupTime( void ); - -/*! - * \brief Process radio irq - */ -void RadioIrqProcess( void ); - -/*! - * \brief Sets the radio in reception mode with Max LNA gain for the given time - * \param [IN] timeout Reception timeout [ms] - * [0: continuous, others timeout] - */ -void RadioRxBoosted( uint32_t timeout ); - -/*! - * \brief Sets the Rx duty cycle management parameters - * - * \param [in] rxTime Structure describing reception timeout value - * \param [in] sleepTime Structure describing sleep timeout value - */ -void RadioSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ); - -/*! - * Radio driver structure initialization - */ - struct Radio_s Radio = -{ - RadioInit, - RadioGetStatus, - RadioSetModem, - RadioSetChannel, - RadioIsChannelFree, - RadioRandom, - RadioSetRxConfig, - RadioSetTxConfig, - RadioCheckRfFrequency, - RadioTimeOnAir, - RadioSend, - RadioSleep, - RadioStandby, - RadioRx, - RadioStartCad, - RadioSetTxContinuousWave, - RadioRssi, - RadioWrite, - RadioRead, - RadioWriteBuffer, - RadioReadBuffer, - RadioSetMaxPayloadLength, - RadioSetPublicNetwork, - RadioGetWakeupTime, - RadioIrqProcess, - // Available on SX126x only - RadioRxBoosted, - RadioSetRxDutyCycle -}; - -/* - * Local types definition - */ - - - /*! - * FSK bandwidth definition - */ -typedef struct -{ - uint32_t bandwidth; - uint8_t RegValue; -}FskBandwidth_t; - -/*! - * Precomputed FSK bandwidth registers values - */ -const FskBandwidth_t FskBandwidths[] = -{ - { 4800 , 0x1F }, - { 5800 , 0x17 }, - { 7300 , 0x0F }, - { 9700 , 0x1E }, - { 11700 , 0x16 }, - { 14600 , 0x0E }, - { 19500 , 0x1D }, - { 23400 , 0x15 }, - { 29300 , 0x0D }, - { 39000 , 0x1C }, - { 46900 , 0x14 }, - { 58600 , 0x0C }, - { 78200 , 0x1B }, - { 93800 , 0x13 }, - { 117300, 0x0B }, - { 156200, 0x1A }, - { 187200, 0x12 }, - { 234300, 0x0A }, - { 312000, 0x19 }, - { 373600, 0x11 }, - { 467000, 0x09 }, - { 500000, 0x00 }, // Invalid Bandwidth -}; - -const RadioLoRaBandwidths_t Bandwidths[] = {LORA_BW_250,LORA_BW_125, LORA_BW_062,LORA_BW_020,\ - LORA_BW_041,LORA_BW_015,LORA_BW_007,LORA_BW_500,\ - LORA_BW_031,LORA_BW_010,LORA_BW_500,LORA_BW_500,\ - LORA_BW_500,LORA_BW_500,LORA_BW_500,LORA_BW_500}; - -// SF12 SF11 SF10 SF9 SF8 SF7 -static double RadioLoRaSymbTime[3][6] = {{ 32.768, 16.384, 8.192, 4.096, 2.048, 1.024 }, // 125 KHz - { 16.384, 8.192, 4.096, 2.048, 1.024, 0.512 }, // 250 KHz - { 8.192, 4.096, 2.048, 1.024, 0.512, 0.256 }}; // 500 KHz - -uint8_t MaxPayloadLength = 0xFF; - -uint32_t TxTimeout = 0; -uint32_t RxTimeout = 0; - -bool RxContinuous = false; - - -PacketStatus_t RadioPktStatus; -uint8_t RadioRxPayload[255]; - -bool IrqFired = false; - -/* - * SX126x DIO IRQ callback functions prototype - */ - -/*! - * \brief DIO 0 IRQ callback - */ -void RadioOnDioIrq( void ); - -/*! - * \brief Tx timeout timer callback - */ -void RadioOnTxTimeoutIrq( void ); - -/*! - * \brief Rx timeout timer callback - */ -void RadioOnRxTimeoutIrq( void ); - -/* - * Private global variables - */ - - -/*! - * Holds the current network type for the radio - */ -typedef struct -{ - bool Previous; - bool Current; -}RadioPublicNetwork_t; - -static RadioPublicNetwork_t RadioPublicNetwork = { false }; - -/*! - * Radio callbacks variable - */ - RadioEvents_t* RadioEvents_Ptr; - -/* - * Public global variables - */ - -/*! - * Radio hardware and global parameters - */ -SX126x_t SX126x; - - - - -void RadioInit( RadioEvents_t *events ) -{ - RadioEvents_Ptr = events; - - SX126xInit( ); - SX126xSetStandby( STDBY_RC ); - SX126xSetRegulatorMode( USE_DCDC ); - - SX126xSetBufferBaseAddress( 0x00, 0x00 ); - SX126xSetTxParams( 0, RADIO_RAMP_200_US ); - SX126xSetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); - - - IrqFired = false; -} - -RadioState_t RadioGetStatus( void ) -{ - switch( SX126xGetOperatingMode( ) ) - { - case MODE_TX: - return RF_TX_RUNNING; - case MODE_RX: - return RF_RX_RUNNING; - case RF_CAD: - return RF_CAD; - default: - return RF_IDLE; - } -} - -void RadioSetModem( uint8_t modem ) -{ - switch( modem ) - { - default: - case MODEM_FSK: - SX126xSetPacketType( PACKET_TYPE_GFSK ); - // When switching to GFSK mode the LoRa SyncWord register value is reset - // Thus, we also reset the RadioPublicNetwork variable - RadioPublicNetwork.Current = false; - break; - case MODEM_LORA: - SX126xSetPacketType( PACKET_TYPE_LORA ); - // Public/Private network register is reset when switching modems - if( RadioPublicNetwork.Current != RadioPublicNetwork.Previous ) - { - RadioPublicNetwork.Current = RadioPublicNetwork.Previous; - RadioSetPublicNetwork( RadioPublicNetwork.Current ); - } - break; - } -} - -void RadioSetChannel( uint32_t freq ) -{ - SX126xSetRfFrequency( freq ); -} - -bool RadioIsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh, uint32_t maxCarrierSenseTime ) -{ - bool status = true; - int16_t rssi = 0; - uint32_t carrierSenseTime = 0; - - RadioSetModem( modem ); - - RadioSetChannel( freq ); - - RadioRx( 0 ); - - DelayMs( 1 ); - - carrierSenseTime = GET_TICK_COUNT( ); - - // Perform carrier sense for maxCarrierSenseTime - while( GET_TICK_COUNT()-carrierSenseTime< maxCarrierSenseTime ) - { - rssi = RadioRssi( modem ); - - if( rssi > rssiThresh ) - { - status = false; - break; - } - } - RadioSleep( ); - return status; -} - -uint32_t RadioRandom( void ) -{ - uint8_t i; - uint32_t rnd = 0; - - /* - * Radio setup for random number generation - */ - // Set LoRa modem ON - RadioSetModem( MODEM_LORA ); - - // Set radio in continuous reception - SX126xSetRx( 0 ); - - for( i = 0; i < 32; i++ ) - { - DelayMs( 1 ); - // Unfiltered RSSI value reading. Only takes the LSB value - rnd |= ( ( uint32_t )SX126xGetRssiInst( ) & 0x01 ) << i; - } - - RadioSleep( ); - - return rnd; -} - -void RadioSetRxConfig( uint8_t modem, uint32_t bandwidth, - uint32_t datarate, uint8_t coderate, - uint32_t bandwidthAfc, uint16_t preambleLen, - uint16_t symbTimeout, bool fixLen, - uint8_t payloadLen, - bool crcOn, bool freqHopOn, uint8_t hopPeriod, - bool iqInverted, bool rxContinuous ) -{ - - RxContinuous = rxContinuous; - - if( fixLen == true ) - { - MaxPayloadLength = payloadLen; - } - else - { - MaxPayloadLength = 0xFF; - } - - SX126xSetStopRxTimerOnPreambleDetect( false ); - SX126xSetLoRaSymbNumTimeout( symbTimeout ); - SX126x.ModulationParams.PacketType = PACKET_TYPE_LORA; - SX126x.ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t )datarate; - SX126x.ModulationParams.Params.LoRa.Bandwidth = Bandwidths[bandwidth]; - SX126x.ModulationParams.Params.LoRa.CodingRate = ( RadioLoRaCodingRates_t )coderate; - - if( ( ( bandwidth == 0 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) || - ( ( bandwidth == 1 ) && ( datarate == 12 ) ) ) - { - SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize = 0x01; - } - else - { - SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize = 0x00; - } - - SX126x.PacketParams.PacketType = PACKET_TYPE_LORA; - - if( ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF5 ) || - ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF6 ) ) - { - if( preambleLen < 12 ) - { - SX126x.PacketParams.Params.LoRa.PreambleLength = 12; - } - else - { - SX126x.PacketParams.Params.LoRa.PreambleLength = preambleLen; - } - } - else - { - SX126x.PacketParams.Params.LoRa.PreambleLength = preambleLen; - } - - SX126x.PacketParams.Params.LoRa.HeaderType = ( RadioLoRaPacketLengthsMode_t )fixLen; - - SX126x.PacketParams.Params.LoRa.PayloadLength = MaxPayloadLength; - SX126x.PacketParams.Params.LoRa.CrcMode = ( RadioLoRaCrcModes_t )crcOn; - SX126x.PacketParams.Params.LoRa.InvertIQ = ( RadioLoRaIQModes_t )iqInverted; - - RadioSetModem( ( SX126x.ModulationParams.PacketType == PACKET_TYPE_GFSK ) ? MODEM_FSK : MODEM_LORA ); - SX126xSetModulationParams( &SX126x.ModulationParams ); - SX126xSetPacketParams( &SX126x.PacketParams ); - - // Timeout Max, Timeout handled directly in SetRx function - RxTimeout = 0xFFFF; - -} - -void RadioSetTxConfig( uint8_t modem, int8_t power, uint32_t fdev, - uint32_t bandwidth, uint32_t datarate, - uint8_t coderate, uint16_t preambleLen, - bool fixLen, bool crcOn, bool freqHopOn, - uint8_t hopPeriod, bool iqInverted, uint32_t timeout ) -{ - - SX126x.ModulationParams.PacketType = PACKET_TYPE_LORA; - SX126x.ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) datarate; - SX126x.ModulationParams.Params.LoRa.Bandwidth = Bandwidths[bandwidth]; - SX126x.ModulationParams.Params.LoRa.CodingRate= ( RadioLoRaCodingRates_t )coderate; - - if( ( ( bandwidth == 0 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) || - ( ( bandwidth == 1 ) && ( datarate == 12 ) ) ) - { - SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize = 0x01; - } - else - { - SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize = 0x00; - } - - SX126x.PacketParams.PacketType = PACKET_TYPE_LORA; - - if( ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF5 ) || - ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF6 ) ) - { - if( preambleLen < 12 ) - { - SX126x.PacketParams.Params.LoRa.PreambleLength = 12; - } - else - { - SX126x.PacketParams.Params.LoRa.PreambleLength = preambleLen; - } - } - else - { - SX126x.PacketParams.Params.LoRa.PreambleLength = preambleLen; - } - - SX126x.PacketParams.Params.LoRa.HeaderType = ( RadioLoRaPacketLengthsMode_t )fixLen; - SX126x.PacketParams.Params.LoRa.PayloadLength = MaxPayloadLength; - SX126x.PacketParams.Params.LoRa.CrcMode = ( RadioLoRaCrcModes_t )crcOn; - SX126x.PacketParams.Params.LoRa.InvertIQ = ( RadioLoRaIQModes_t )iqInverted; - - RadioStandby( ); - RadioSetModem( ( SX126x.ModulationParams.PacketType == PACKET_TYPE_GFSK ) ? MODEM_FSK : MODEM_LORA ); - SX126xSetModulationParams( &SX126x.ModulationParams ); - SX126xSetPacketParams( &SX126x.PacketParams ); - - - SX126xSetRfTxPower( power ); - TxTimeout = timeout; -} - -bool RadioCheckRfFrequency( uint32_t frequency ) -{ - return true; -} - -uint32_t RadioTimeOnAir( RadioModems_t modem, uint8_t pktLen ) -{ - uint32_t airTime = 0; - double ts = RadioLoRaSymbTime[SX126x.ModulationParams.Params.LoRa.Bandwidth - 4][12 - SX126x.ModulationParams.Params.LoRa.SpreadingFactor]; - // time of preamble - double tPreamble = ( SX126x.PacketParams.Params.LoRa.PreambleLength + 4.25 ) * ts; - // Symbol length of payload and time - double tmp = ceil( ( 8 * pktLen - 4 * SX126x.ModulationParams.Params.LoRa.SpreadingFactor + - 28 + 16 * SX126x.PacketParams.Params.LoRa.CrcMode - - ( ( SX126x.PacketParams.Params.LoRa.HeaderType == LORA_PACKET_FIXED_LENGTH ) ? 20 : 0 ) ) / - ( double )( 4 * ( SX126x.ModulationParams.Params.LoRa.SpreadingFactor - - ( ( SX126x.ModulationParams.Params.LoRa.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) ) * - ( ( SX126x.ModulationParams.Params.LoRa.CodingRate % 4 ) + 4 ); - double nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 ); - double tPayload = nPayload * ts; - // Time on air - double tOnAir = tPreamble + tPayload; - // return milli seconds - airTime = floor( tOnAir + 0.999 ); - - - return airTime; -} - -void RadioSend( uint8_t *buffer, uint8_t size ) -{ - SX126xSetDioIrqParams( IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_NONE, - IRQ_RADIO_NONE ); - - if( SX126xGetPacketType( ) == PACKET_TYPE_LORA ) - { - SX126x.PacketParams.Params.LoRa.PayloadLength = size; - } - else - { - SX126x.PacketParams.Params.Gfsk.PayloadLength = size; - } - SX126xSetPacketParams( &SX126x.PacketParams ); - - SX126xSendPayload( buffer, size, 0 ); - -} - -void RadioSleep( void ) -{ - SleepParams_t params = { 0 }; - - params.Fields.WarmStart = 1; - SX126xSetSleep( params.Value ); - - DelayMs( 2 ); -} - -void RadioStandby( void ) -{ - SX126xSetStandby( STDBY_RC ); -} - -void RadioRx( uint32_t timeout ) -{ - SX126xSetDioIrqParams( IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_NONE, - IRQ_RADIO_NONE ); - - - if( RxContinuous == true ) - { - SX126xSetRx( 0xFFFFFF ); // Rx Continuous - } - else - { - SX126xSetRx( RxTimeout << 6 ); - } -} - -void RadioRxBoosted( uint32_t timeout ) -{ - SX126xSetDioIrqParams( IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT, - IRQ_RADIO_NONE, - IRQ_RADIO_NONE ); - - if( RxContinuous == true ) - { - SX126xSetRxBoosted( 0xFFFFFF ); // Rx Continuous - } - else - { - SX126xSetRxBoosted( RxTimeout << 6 ); - } -} - -void RadioSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ) -{ - SX126xSetRxDutyCycle( rxTime, sleepTime ); -} - -void RadioStartCad( void ) -{ - SX126xSetCad( ); -} - -void RadioTx( uint32_t timeout ) -{ - SX126xSetTx( timeout << 6 ); -} - -void RadioSetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ) -{ - SX126xSetRfFrequency( freq ); - SX126xSetRfTxPower( power ); - SX126xSetTxContinuousWave( ); - -} - -int16_t RadioRssi( RadioModems_t modem ) -{ - return SX126xGetRssiInst( ); -} - -void RadioWrite( uint16_t addr, uint8_t data ) -{ - SX126xWriteRegister( addr, data ); -} - -uint8_t RadioRead( uint16_t addr ) -{ - return SX126xReadRegister( addr ); -} - -void RadioWriteBuffer( uint16_t addr, uint8_t *buffer, uint8_t size ) -{ - SX126xWriteRegisters( addr, buffer, size ); -} - -void RadioReadBuffer( uint16_t addr, uint8_t *buffer, uint8_t size ) -{ - SX126xReadRegisters( addr, buffer, size ); -} - -void RadioWriteFifo( uint8_t *buffer, uint8_t size ) -{ - SX126xWriteBuffer( 0, buffer, size ); -} - -void RadioReadFifo( uint8_t *buffer, uint8_t size ) -{ - SX126xReadBuffer( 0, buffer, size ); -} - -void RadioSetMaxPayloadLength( uint8_t modem, uint8_t max ) -{ - if( modem == MODEM_LORA ) - { - SX126x.PacketParams.Params.LoRa.PayloadLength = MaxPayloadLength = max; - SX126xSetPacketParams( &SX126x.PacketParams ); - } - else - { - if( SX126x.PacketParams.Params.Gfsk.HeaderType == RADIO_PACKET_VARIABLE_LENGTH ) - { - SX126x.PacketParams.Params.Gfsk.PayloadLength = MaxPayloadLength = max; - SX126xSetPacketParams( &SX126x.PacketParams ); - } - } -} - -void RadioSetPublicNetwork( bool enable ) -{ - RadioPublicNetwork.Current = RadioPublicNetwork.Previous = enable; - - RadioSetModem( MODEM_LORA ); - if( enable == true ) - { - // Change LoRa modem SyncWord - SX126xWriteRegister( REG_LR_SYNCWORD, ( LORA_MAC_PUBLIC_SYNCWORD >> 8 ) & 0xFF ); - SX126xWriteRegister( REG_LR_SYNCWORD + 1, LORA_MAC_PUBLIC_SYNCWORD & 0xFF ); - } - else - { - // Change LoRa modem SyncWord - SX126xWriteRegister( REG_LR_SYNCWORD, ( LORA_MAC_PRIVATE_SYNCWORD >> 8 ) & 0xFF ); - SX126xWriteRegister( REG_LR_SYNCWORD + 1, LORA_MAC_PRIVATE_SYNCWORD & 0xFF ); - } -} - -uint32_t RadioGetWakeupTime( void ) -{ - return( RADIO_TCXO_SETUP_TIME + RADIO_WAKEUP_TIME ); -} - -void RadioOnTxTimeoutIrq( void ) -{ - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->TxTimeout != NULL ) ) - { - RadioEvents_Ptr->TxTimeout( ); - } -} - -void RadioOnRxTimeoutIrq( void ) -{ - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxTimeout != NULL ) ) - { - RadioEvents_Ptr->RxTimeout( ); - } -} - -void RadioOnDioIrq( void ) -{ - IrqFired = true; -} - -void RadioIrqProcess( void ) -{ - - BoardDisableIrq( ); - IrqFired = false; - BoardEnableIrq( ); - - uint16_t irqRegs = SX126xGetIrqStatus( ); - SX126xClearIrqStatus( IRQ_RADIO_ALL ); - - if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->TxDone != NULL ) ) - { - RadioEvents_Ptr->TxDone( ); - } - } - - if( ( irqRegs & IRQ_RX_DONE ) == IRQ_RX_DONE ) - { - uint8_t size; - - SX126xGetPayload( RadioRxPayload, &size , 255 ); - SX126xGetPacketStatus( &RadioPktStatus ); - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxDone != NULL ) ) - { - RadioEvents_Ptr->RxDone( RadioRxPayload, size, RadioPktStatus.Params.LoRa.RssiPkt, RadioPktStatus.Params.LoRa.SnrPkt ); - } - } - - if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxError ) ) - { - RadioEvents_Ptr->RxError( ); - } - } - - if( ( irqRegs & IRQ_CAD_DONE ) == IRQ_CAD_DONE ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->CadDone != NULL ) ) - { - RadioEvents_Ptr->CadDone( ( ( irqRegs & IRQ_CAD_ACTIVITY_DETECTED ) == IRQ_CAD_ACTIVITY_DETECTED ) ); - } - } - - if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT ) - { - if( SX126xGetOperatingMode( ) == MODE_TX ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->TxTimeout != NULL ) ) - { - RadioEvents_Ptr->TxTimeout( ); - } - } - else if( SX126xGetOperatingMode( ) == MODE_RX ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxTimeout != NULL ) ) - { - RadioEvents_Ptr->RxTimeout( ); - } - } - } - - if( ( irqRegs & IRQ_PREAMBLE_DETECTED ) == IRQ_PREAMBLE_DETECTED ) - { - //__NOP( ); - } - - if( ( irqRegs & IRQ_SYNCWORD_VALID ) == IRQ_SYNCWORD_VALID ) - { - //__NOP( ); - } - - if( ( irqRegs & IRQ_HEADER_VALID ) == IRQ_HEADER_VALID ) - { - //__NOP( ); - } - - if( ( irqRegs & IRQ_HEADER_ERROR ) == IRQ_HEADER_ERROR ) - { - if( ( RadioEvents_Ptr != NULL ) && ( RadioEvents_Ptr->RxTimeout != NULL ) ) - { - RadioEvents_Ptr->RxTimeout( ); - } - } -} diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/radio.h b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/radio.h deleted file mode 100644 index b7fa8a25..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/radio.h +++ /dev/null @@ -1,376 +0,0 @@ -/*! - * \file radio.h - * - * \brief Radio driver API definition - * - * \copyright Revised BSD License, see section \ref LICENSE. - * - * \code - * ______ _ - * / _____) _ | | - * ( (____ _____ ____ _| |_ _____ ____| |__ - * \____ \| ___ | (_ _) ___ |/ ___) _ \ - * _____) ) ____| | | || |_| ____( (___| | | | - * (______/|_____)_|_|_| \__)_____)\____)_| |_| - * (C)2013-2017 Semtech - * - * \endcode - * - * \author Miguel Luis ( Semtech ) - * - * \author Gregory Cristian ( Semtech ) - */ -#ifndef __RADIO_H__ -#define __RADIO_H__ -#include "sx126x-board.h" - -/*! - * Radio driver supported modems - */ -typedef enum -{ - MODEM_FSK = 0, - MODEM_LORA, -}RadioModems_t; - -/*! - * Radio driver internal state machine states definition - */ -typedef enum -{ - RF_IDLE = 0, //!< The radio is idle - RF_RX_RUNNING, //!< The radio is in reception state - RF_TX_RUNNING, //!< The radio is in transmission state - RF_CAD, //!< The radio is doing channel activity detection -}RadioState_t; - -/*! - * \brief Radio driver callback functions - */ -typedef struct -{ - /*! - * \brief Tx Done callback prototype. - */ - void ( *TxDone )( void ); - /*! - * \brief Tx Timeout callback prototype. - */ - void ( *TxTimeout )( void ); - /*! - * \brief Rx Done callback prototype. - * - * \param [IN] payload Received buffer pointer - * \param [IN] size Received buffer size - * \param [IN] rssi RSSI value computed while receiving the frame [dBm] - * \param [IN] snr Raw SNR value given by the radio hardware - * FSK : N/A ( set to 0 ) - * LoRa: SNR value in dB - */ - void ( *RxDone )( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); - /*! - * \brief Rx Timeout callback prototype. - */ - void ( *RxTimeout )( void ); - /*! - * \brief Rx Error callback prototype. - */ - void ( *RxError )( void ); - /*! - * \brief FHSS Change Channel callback prototype. - * - * \param [IN] currentChannel Index number of the current channel - */ - void ( *FhssChangeChannel )( uint8_t currentChannel ); - - /*! - * \brief CAD Done callback prototype. - * - * \param [IN] channelDetected Channel Activity detected during the CAD - */ - void ( *CadDone ) ( bool channelActivityDetected ); -}RadioEvents_t; - -/*! - * \brief Radio driver definition - */ -struct Radio_s -{ - /*! - * \brief Initializes the radio - * - * \param [IN] events Structure containing the driver callback functions - */ - void ( *Init )( RadioEvents_t *events ); - /*! - * Return current radio status - * - * \param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING] - */ - RadioState_t ( *GetStatus )( void ); - /*! - * \brief Configures the radio with the given modem - * - * \param [IN] modem Modem to be used [0: FSK, 1: LoRa] - */ - void ( *SetModem )( uint8_t modem ); - /*! - * \brief Sets the channel frequency - * - * \param [IN] freq Channel RF frequency - */ - void ( *SetChannel )( uint32_t freq ); - /*! - * \brief Checks if the channel is free for the given time - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] freq Channel RF frequency - * \param [IN] rssiThresh RSSI threshold - * \param [IN] maxCarrierSenseTime Max time while the RSSI is measured - * - * \retval isFree [true: Channel is free, false: Channel is not free] - */ - bool ( *IsChannelFree )( RadioModems_t modem, uint32_t freq, int16_t rssiThresh, uint32_t maxCarrierSenseTime ); - /*! - * \brief Generates a 32 bits random value based on the RSSI readings - * - * \remark This function sets the radio in LoRa modem mode and disables - * all interrupts. - * After calling this function either Radio.SetRxConfig or - * Radio.SetTxConfig functions must be called. - * - * \retval randomValue 32 bits random value - */ - uint32_t ( *Random )( void ); - /*! - * \brief Sets the reception parameters - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] bandwidth Sets the bandwidth - * FSK : >= 2600 and <= 250000 Hz - * LoRa: [0: 125 kHz, 1: 250 kHz, - * 2: 500 kHz, 3: Reserved] - * \param [IN] datarate Sets the Datarate - * FSK : 600..300000 bits/s - * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, - * 10: 1024, 11: 2048, 12: 4096 chips] - * \param [IN] coderate Sets the coding rate (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] - * \param [IN] bandwidthAfc Sets the AFC Bandwidth (FSK only) - * FSK : >= 2600 and <= 250000 Hz - * LoRa: N/A ( set to 0 ) - * \param [IN] preambleLen Sets the Preamble length - * FSK : Number of bytes - * LoRa: Length in symbols (the hardware adds 4 more symbols) - * \param [IN] symbTimeout Sets the RxSingle timeout value - * FSK : timeout in number of bytes - * LoRa: timeout in symbols - * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] - * \param [IN] payloadLen Sets payload length when fixed length is used - * \param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON] - * \param [IN] freqHopOn Enables disables the intra-packet frequency hopping - * FSK : N/A ( set to 0 ) - * LoRa: [0: OFF, 1: ON] - * \param [IN] hopPeriod Number of symbols between each hop - * FSK : N/A ( set to 0 ) - * LoRa: Number of symbols - * \param [IN] iqInverted Inverts IQ signals (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [0: not inverted, 1: inverted] - * \param [IN] rxContinuous Sets the reception in continuous mode - * [false: single mode, true: continuous mode] - */ - void ( *SetRxConfig )( uint8_t modem, uint32_t bandwidth, - uint32_t datarate, uint8_t coderate, - uint32_t bandwidthAfc, uint16_t preambleLen, - uint16_t symbTimeout, bool fixLen, - uint8_t payloadLen, - bool crcOn, bool freqHopOn, uint8_t hopPeriod, - bool iqInverted, bool rxContinuous ); - /*! - * \brief Sets the transmission parameters - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] power Sets the output power [dBm] - * \param [IN] fdev Sets the frequency deviation (FSK only) - * FSK : [Hz] - * LoRa: 0 - * \param [IN] bandwidth Sets the bandwidth (LoRa only) - * FSK : 0 - * LoRa: [0: 125 kHz, 1: 250 kHz, - * 2: 500 kHz, 3: Reserved] - * \param [IN] datarate Sets the Datarate - * FSK : 600..300000 bits/s - * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, - * 10: 1024, 11: 2048, 12: 4096 chips] - * \param [IN] coderate Sets the coding rate (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] - * \param [IN] preambleLen Sets the preamble length - * FSK : Number of bytes - * LoRa: Length in symbols (the hardware adds 4 more symbols) - * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed] - * \param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON] - * \param [IN] freqHopOn Enables disables the intra-packet frequency hopping - * FSK : N/A ( set to 0 ) - * LoRa: [0: OFF, 1: ON] - * \param [IN] hopPeriod Number of symbols between each hop - * FSK : N/A ( set to 0 ) - * LoRa: Number of symbols - * \param [IN] iqInverted Inverts IQ signals (LoRa only) - * FSK : N/A ( set to 0 ) - * LoRa: [0: not inverted, 1: inverted] - * \param [IN] timeout Transmission timeout [ms] - */ - void ( *SetTxConfig )( uint8_t modem, int8_t power, uint32_t fdev, - uint32_t bandwidth, uint32_t datarate, - uint8_t coderate, uint16_t preambleLen, - bool fixLen, bool crcOn, bool freqHopOn, - uint8_t hopPeriod, bool iqInverted, uint32_t timeout ); - /*! - * \brief Checks if the given RF frequency is supported by the hardware - * - * \param [IN] frequency RF frequency to be checked - * \retval isSupported [true: supported, false: unsupported] - */ - bool ( *CheckRfFrequency )( uint32_t frequency ); - /*! - * \brief Computes the packet time on air in ms for the given payload - * - * \Remark Can only be called once SetRxConfig or SetTxConfig have been called - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] pktLen Packet payload length - * - * \retval airTime Computed airTime (ms) for the given packet payload length - */ - uint32_t ( *TimeOnAir )( RadioModems_t modem, uint8_t pktLen ); - /*! - * \brief Sends the buffer of size. Prepares the packet to be sent and sets - * the radio in transmission - * - * \param [IN]: buffer Buffer pointer - * \param [IN]: size Buffer size - */ - void ( *Send )( uint8_t *buffer, uint8_t size ); - /*! - * \brief Sets the radio in sleep mode - */ - void ( *Sleep )( void ); - /*! - * \brief Sets the radio in standby mode - */ - void ( *Standby )( void ); - /*! - * \brief Sets the radio in reception mode for the given time - * \param [IN] timeout Reception timeout [ms] - * [0: continuous, others timeout] - */ - void ( *Rx )( uint32_t timeout ); - /*! - * \brief Start a Channel Activity Detection - */ - void ( *StartCad )( void ); - /*! - * \brief Sets the radio in continuous wave transmission mode - * - * \param [IN]: freq Channel RF frequency - * \param [IN]: power Sets the output power [dBm] - * \param [IN]: time Transmission mode timeout [s] - */ - void ( *SetTxContinuousWave )( uint32_t freq, int8_t power, uint16_t time ); - /*! - * \brief Reads the current RSSI value - * - * \retval rssiValue Current RSSI value in [dBm] - */ - int16_t ( *Rssi )( RadioModems_t modem ); - /*! - * \brief Writes the radio register at the specified address - * - * \param [IN]: addr Register address - * \param [IN]: data New register value - */ - void ( *Write )( uint16_t addr, uint8_t data ); - /*! - * \brief Reads the radio register at the specified address - * - * \param [IN]: addr Register address - * \retval data Register value - */ - uint8_t ( *Read )( uint16_t addr ); - /*! - * \brief Writes multiple radio registers starting at address - * - * \param [IN] addr First Radio register address - * \param [IN] buffer Buffer containing the new register's values - * \param [IN] size Number of registers to be written - */ - void ( *WriteBuffer )( uint16_t addr, uint8_t *buffer, uint8_t size ); - /*! - * \brief Reads multiple radio registers starting at address - * - * \param [IN] addr First Radio register address - * \param [OUT] buffer Buffer where to copy the registers data - * \param [IN] size Number of registers to be read - */ - void ( *ReadBuffer )( uint16_t addr, uint8_t *buffer, uint8_t size ); - /*! - * \brief Sets the maximum payload length. - * - * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] - * \param [IN] max Maximum payload length in bytes - */ - void ( *SetMaxPayloadLength )( RadioModems_t modem, uint8_t max ); - /*! - * \brief Sets the network to public or private. Updates the sync byte. - * - * \remark Applies to LoRa modem only - * - * \param [IN] enable if true, it enables a public network - */ - void ( *SetPublicNetwork )( bool enable ); - /*! - * \brief Gets the time required for the board plus radio to get out of sleep.[ms] - * - * \retval time Radio plus board wakeup time in ms. - */ - uint32_t ( *GetWakeupTime )( void ); - /*! - * \brief Process radio irq - */ - void ( *IrqProcess )( void ); - /* - * The next functions are available only on SX126x radios. - */ - /*! - * \brief Sets the radio in reception mode with Max LNA gain for the given time - * - * \remark Available on SX126x radios only. - * - * \param [IN] timeout Reception timeout [ms] - * [0: continuous, others timeout] - */ - void ( *RxBoosted )( uint32_t timeout ); - /*! - * \brief Sets the Rx duty cycle management parameters - * - * \remark Available on SX126x radios only. - * - * \param [in] rxTime Structure describing reception timeout value - * \param [in] sleepTime Structure describing sleep timeout value - */ - void ( *SetRxDutyCycle ) ( uint32_t rxTime, uint32_t sleepTime ); -}; - -/*! - * \brief Radio driver - * - * \remark This variable is defined and initialized in the specific radio - * board implementation - */ -extern struct Radio_s Radio; -void RadioOnDioIrq( void ); - -#endif // __RADIO_H__ diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x-board.cpp b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x-board.cpp deleted file mode 100644 index bd5e4cbe..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x-board.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* - ______ _ - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - (C)2013 Semtech - -Description: SX126x driver specific target board functions implementation - -License: Revised BSD License, see LICENSE.TXT file include in the project - -Maintainer: Miguel Luis and Gregory Cristian -*/ -#include "sx126x-board.h" -#include "sx126x.h" -#include -static uint8_t IrqNestLevel = 0; - -void DelayMs( uint32_t ms ) -{ - delay( ms ); -} - - void BoardDisableIrq( void ) -{ - noInterrupts(); - IrqNestLevel++; -} - - void BoardEnableIrq( void ) -{ - IrqNestLevel--; - if( IrqNestLevel == 0 ) - { - interrupts(); - } -} - -static uint16_t SpiInOut( uint16_t outData ) -{ - uint8_t rxData = 0; - - rxData = SPI.transfer(outData); - return( rxData ); -} - -/*! - * Antenna switch GPIO pins objects - */ - -void SX126xIoInit( void ) -{ - pinMode (NssPin, OUTPUT); - pinMode (NResetPin, OUTPUT); - pinMode (SwPin, OUTPUT); - - pinMode (BusyPin, INPUT); - pinMode (Dio1Pin, INPUT); - - digitalWrite(NssPin,1); - digitalWrite(NResetPin,1); - digitalWrite(SwPin,1); -} - -void SX126xReset( void ) -{ - delay( 10 ); - digitalWrite(NResetPin,0); - delay( 20 ); - digitalWrite(NResetPin,1); - delay( 10 ); -} - -void SX126xWaitOnBusy( void ) -{ - while( digitalRead(BusyPin) == 1 ); -} - -void SX126xWakeup( void ) -{ - BoardDisableIrq( ); - - digitalWrite(NssPin,0); - - SpiInOut( RADIO_GET_STATUS ); - SpiInOut( 0x00 ); - - digitalWrite(NssPin,1); - - // Wait for chip to be ready. - SX126xWaitOnBusy( ); - - BoardEnableIrq( ); -} -void SX126xWriteCommand( uint8_t command, uint8_t *buffer, uint16_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut( (uint8_t )command ); - - for( uint16_t i = 0; i < size; i++ ) - { - SpiInOut( buffer[i] ); - } - - digitalWrite(NssPin,1); - - if( command != RADIO_SET_SLEEP ) - { - SX126xWaitOnBusy( ); - } -} - -void SX126xReadCommand( uint8_t command, uint8_t *buffer, uint16_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut(( uint8_t )command ); - SpiInOut( 0x00 ); - for( uint16_t i = 0; i < size; i++ ) - { - buffer[i] = SpiInOut( 0 ); - } - - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} - -void SX126xWriteRegisters( uint16_t address, uint8_t *buffer, uint16_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - digitalWrite(NssPin,0); - SpiInOut( RADIO_WRITE_REGISTER ); - SpiInOut( ( address & 0xFF00 ) >> 8 ); - SpiInOut( address & 0x00FF ); - - for( uint16_t i = 0; i < size; i++ ) - { - SpiInOut( buffer[i] ); - } - - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} - -void SX126xWriteRegister( uint16_t address, uint8_t value ) -{ - SX126xWriteRegisters( address, &value, 1 ); -} - -void SX126xReadRegisters( uint16_t address, uint8_t *buffer, uint16_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut( RADIO_READ_REGISTER ); - SpiInOut( ( address & 0xFF00 ) >> 8 ); - SpiInOut( address & 0x00FF ); - SpiInOut( 0 ); - for( uint16_t i = 0; i < size; i++ ) - { - buffer[i] = SpiInOut( 0 ); - } - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} -uint8_t SX126xReadRegister( uint16_t address ) -{ - uint8_t data; - SX126xReadRegisters( address, &data, 1 ); - return data; -} - -void SX126xWriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut( RADIO_WRITE_BUFFER ); - SpiInOut( offset ); - for( uint16_t i = 0; i < size; i++ ) - { - SpiInOut( buffer[i] ); - } - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} -void SX126xReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) -{ - // SX126xCheckDeviceReady( ); // undetermined - - digitalWrite(NssPin,0); - - SpiInOut( RADIO_READ_BUFFER ); - SpiInOut( offset ); - SpiInOut( 0 ); - for( uint16_t i = 0; i < size; i++ ) - { - buffer[i] = SpiInOut( 0 ); - } - digitalWrite(NssPin,1); - - SX126xWaitOnBusy( ); -} -void SX126xSetRfTxPower( int8_t power ) -{ - SX126xSetTxParams( power, RADIO_RAMP_40_US ); -} -bool SX126xCheckRfFrequency( uint32_t frequency ) -{ - // Implement check. Currently all frequencies are supported - return true; -} \ No newline at end of file diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x-board.h b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x-board.h deleted file mode 100644 index 4c54175b..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x-board.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - ______ _ - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - (C)2013 Semtech - -Description: SX126x driver specific target board functions implementation - -License: Revised BSD License, see LICENSE.TXT file include in the project - -Maintainer: Miguel Luis and Gregory Cristian -*/ -#ifndef __SX126x_ARCH_H__ -#define __SX126x_ARCH_H__ -#include -#include -#include "sx126x.h" - -#define USER_MODE_TX 1 -#define USER_MODE_RX 0 - -extern uint32_t TickCounter; - - -const int BusyPin = 3; -const int Dio2Pin = 4; -const int Dio1Pin = 5; -const int NssPin = 7; -const int SwPin = 8; - -const int Led1RedPin = 16; -const int Led1BluePin = 15; -const int NResetPin = 14; - - -#define GET_TICK_COUNT() TickCounter -#define TICK_RATE_MS( ms ) ( ms ) - -void DelayMs( uint32_t ms ); -void BoardDisableIrq( void ); -void BoardEnableIrq( void ); - -/*! - * \brief Initializes the radio I/Os pins interface - */ -void SX126xIoInit( void ); - -/*! - * \brief Initializes DIO IRQ handlers - * - * \param [IN] irqHandlers Array containing the IRQ callback functions - */ -void SX126xIoIrqInit( void ); - -/*! - * \brief De-initializes the radio I/Os pins interface. - * - * \remark Useful when going in MCU low power modes - */ -void SX126xIoDeInit( void ); - -/*! - * \brief HW Reset of the radio - */ -void SX126xReset( void ); - -/*! - * \brief Blocking loop to wait while the Busy pin in high - */ -void SX126xWaitOnBusy( void ); - -/*! - * \brief Wakes up the radio - */ -void SX126xWakeup( void ); - -/*! - * \brief Send a command that write data to the radio - * - * \param [in] opcode Opcode of the command - * \param [in] buffer Buffer to be send to the radio - * \param [in] size Size of the buffer to send - */ -void SX126xWriteCommand( uint8_t opcode, uint8_t *buffer, uint16_t size ); - -/*! - * \brief Send a command that read data from the radio - * - * \param [in] opcode Opcode of the command - * \param [out] buffer Buffer holding data from the radio - * \param [in] size Size of the buffer - */ -void SX126xReadCommand( uint8_t opcode, uint8_t *buffer, uint16_t size ); - -/*! - * \brief Write a single byte of data to the radio memory - * - * \param [in] address The address of the first byte to write in the radio - * \param [in] value The data to be written in radio's memory - */ -void SX126xWriteRegister( uint16_t address, uint8_t value ); - -/*! - * \brief Read a single byte of data from the radio memory - * - * \param [in] address The address of the first byte to write in the radio - * - * \retval value The value of the byte at the given address in radio's memory - */ -uint8_t SX126xReadRegister( uint16_t address ); - -/*! - * \brief Sets the radio output power. - * - * \param [IN] power Sets the RF output power - */ -void SX126xSetRfTxPower( int8_t power ); - - -/*! - * \brief Checks if the given RF frequency is supported by the hardware - * - * \param [IN] frequency RF frequency to be checked - * \retval isSupported [true: supported, false: unsupported] - */ -bool SX126xCheckRfFrequency( uint32_t frequency ); - -/*! - * Radio hardware and global parameters - */ -extern SX126x_t SX126x; - - -#endif // __SX126x_ARCH_H__ diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x.cpp b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x.cpp deleted file mode 100644 index e728dd28..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x.cpp +++ /dev/null @@ -1,693 +0,0 @@ -/*! - * \file sx126x.c - * - * \brief SX126x driver implementation - * - * \copyright Revised BSD License, see section \ref LICENSE. - * - * \code - * ______ _ - * / _____) _ | | - * ( (____ _____ ____ _| |_ _____ ____| |__ - * \____ \| ___ | (_ _) ___ |/ ___) _ \ - * _____) ) ____| | | || |_| ____( (___| | | | - * (______/|_____)_|_|_| \__)_____)\____)_| |_| - * (C)2013-2017 Semtech - * - * \endcode - * - * \author Miguel Luis ( Semtech ) - * - * \author Gregory Cristian ( Semtech ) - */ -#include -#include -#include "sx126x.h" -#include "sx126x-board.h" - -/*! - * \brief Radio registers definition - */ -typedef struct -{ - uint16_t Addr; //!< The address of the register - uint8_t Value; //!< The value of the register -}RadioRegisters_t; - -/*! - * \brief Holds the internal operating mode of the radio - */ -static RadioOperatingModes_t OperatingMode; - -/*! - * \brief Stores the current packet type set in the radio - */ -static RadioPacketTypes_t PacketType; - -/*! - * \brief Stores the last frequency error measured on LoRa received packet - */ -volatile uint32_t FrequencyError = 0; - -/*! - * \brief Hold the status of the Image calibration - */ -static bool ImageCalibrated = false; - -/* - * SX126x DIO IRQ callback functions prototype - */ - -/*! - * \brief DIO 0 IRQ callback - */ -void SX126xOnDioIrq( void ); - -/*! - * \brief DIO 0 IRQ callback - */ -void SX126xSetPollingMode( void ); - -/*! - * \brief DIO 0 IRQ callback - */ -void SX126xSetInterruptMode( void ); - -/* - * \brief Process the IRQ if handled by the driver - */ -void SX126xProcessIrqs( void ); - - -void SX126xInit( void ) -{ - SX126xReset( ); - SX126xWakeup( ); - SX126xSetStandby( STDBY_RC ); - -#ifdef USE_TCXO - CalibrationParams_t calibParam; - - SX126xSetDio3AsTcxoCtrl( TCXO_CTRL_3_3V, RADIO_TCXO_SETUP_TIME << 6 ); // convert from ms to SX126x time base - calibParam.Value = 0x7F; - SX126xCalibrate( calibParam.Value ); -#endif - - SX126xSetDio2AsRfSwitchCtrl( true ); - OperatingMode = MODE_STDBY_RC; -} - -uint8_t SX126xGetOperatingMode( void ) -{ - return OperatingMode; -} - -void SX126xCheckDeviceReady( void ) -{ - if( ( SX126xGetOperatingMode( ) == MODE_SLEEP ) || ( SX126xGetOperatingMode( ) == MODE_RX_DC ) ) - { - SX126xWakeup( ); - - } - SX126xWaitOnBusy( ); -} - -void SX126xSetPayload( uint8_t *payload, uint8_t size ) -{ - SX126xWriteBuffer( 0x00, payload, size ); -} - -uint8_t SX126xGetPayload( uint8_t *buffer, uint8_t *size, uint8_t maxSize ) -{ - uint8_t offset = 0; - - SX126xGetRxBufferStatus( size, &offset ); - if( *size > maxSize ) - { - return 1; - } - SX126xReadBuffer( offset, buffer, *size ); - return 0; -} - -void SX126xSendPayload( uint8_t *payload, uint8_t size, uint32_t timeout ) -{ - SX126xSetPayload( payload, size ); - SX126xSetTx( timeout ); -} - -uint8_t SX126xSetSyncWord( uint8_t *syncWord ) -{ - SX126xWriteRegisters( REG_LR_SYNCWORDBASEADDRESS, syncWord, 8 ); - return 0; -} - -void SX126xSetCrcSeed( uint16_t seed ) -{ - uint8_t buf[2]; - - buf[0] = ( uint8_t )( ( seed >> 8 ) & 0xFF ); - buf[1] = ( uint8_t )( seed & 0xFF ); - - switch( SX126xGetPacketType( ) ) - { - case PACKET_TYPE_GFSK: - SX126xWriteRegisters( REG_LR_CRCSEEDBASEADDR, buf, 2 ); - break; - - default: - break; - } -} - -void SX126xSetCrcPolynomial( uint16_t polynomial ) -{ - uint8_t buf[2]; - - buf[0] = ( uint8_t )( ( polynomial >> 8 ) & 0xFF ); - buf[1] = ( uint8_t )( polynomial & 0xFF ); - - switch( SX126xGetPacketType( ) ) - { - case PACKET_TYPE_GFSK: - SX126xWriteRegisters( REG_LR_CRCPOLYBASEADDR, buf, 2 ); - break; - - default: - break; - } -} - -void SX126xSetWhiteningSeed( uint16_t seed ) -{ - uint8_t regValue = 0; - - switch( SX126xGetPacketType( ) ) - { - case PACKET_TYPE_GFSK: - regValue = SX126xReadRegister( REG_LR_WHITSEEDBASEADDR_MSB ) & 0xFE; - regValue = ( ( seed >> 8 ) & 0x01 ) | regValue; - SX126xWriteRegister( REG_LR_WHITSEEDBASEADDR_MSB, regValue ); // only 1 bit. - SX126xWriteRegister( REG_LR_WHITSEEDBASEADDR_LSB, ( uint8_t )seed ); - break; - - default: - break; - } -} - -uint32_t SX126xGetRandom( void ) -{ - uint8_t buf[] = { 0, 0, 0, 0 }; - uint32_t ret_val = 0; - // Set radio in continuous reception - SX126xSetRx( 0 ); - - DelayMs( 1 ); - - SX126xReadRegisters( RANDOM_NUMBER_GENERATORBASEADDR, buf, 4 ); - - SX126xSetStandby( STDBY_RC ); - ret_val |= buf[0]; - ret_val = (ret_val<<8)+buf[1] ; - ret_val = (ret_val<<8)+buf[2] ; - ret_val = (ret_val<<8)+buf[3] ; - - return ret_val; -} - -void SX126xSetSleep( uint8_t sleepConfig ) -{ - - SX126xWriteCommand( RADIO_SET_SLEEP, &sleepConfig, 1 ); - OperatingMode = MODE_SLEEP; -} - -void SX126xSetStandby( uint8_t standbyConfig ) -{ - SX126xWriteCommand( RADIO_SET_STANDBY, ( uint8_t* )&standbyConfig, 1 ); - if( standbyConfig == STDBY_RC ) - { - OperatingMode = MODE_STDBY_RC; - } - else - { - OperatingMode = MODE_STDBY_XOSC; - } -} - -void SX126xSetFs( void ) -{ - SX126xWriteCommand( RADIO_SET_FS, 0, 0 ); - OperatingMode = MODE_FS; -} - -void SX126xSetTx( uint32_t timeout ) -{ - uint8_t buf[3]; - - OperatingMode = MODE_TX; - - buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); - buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); - buf[2] = ( uint8_t )( timeout & 0xFF ); - SX126xWriteCommand( RADIO_SET_TX, buf, 3 ); -} - -void SX126xSetRx( uint32_t timeout ) -{ - uint8_t buf[3]; - - OperatingMode = MODE_RX; - - buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); - buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); - buf[2] = ( uint8_t )( timeout & 0xFF ); - SX126xWriteCommand( RADIO_SET_RX, buf, 3 ); -} - -void SX126xSetRxBoosted( uint32_t timeout ) -{ - uint8_t buf[3]; - - OperatingMode = MODE_RX; - - SX126xWriteRegister( REG_RX_GAIN, 0x96 ); // max LNA gain, increase current by ~2mA for around ~3dB in sensivity - - buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); - buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); - buf[2] = ( uint8_t )( timeout & 0xFF ); - SX126xWriteCommand( RADIO_SET_RX, buf, 3 ); -} - -void SX126xSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ) -{ - uint8_t buf[6]; - - buf[0] = ( uint8_t )( ( rxTime >> 16 ) & 0xFF ); - buf[1] = ( uint8_t )( ( rxTime >> 8 ) & 0xFF ); - buf[2] = ( uint8_t )( rxTime & 0xFF ); - buf[3] = ( uint8_t )( ( sleepTime >> 16 ) & 0xFF ); - buf[4] = ( uint8_t )( ( sleepTime >> 8 ) & 0xFF ); - buf[5] = ( uint8_t )( sleepTime & 0xFF ); - SX126xWriteCommand( RADIO_SET_RXDUTYCYCLE, buf, 6 ); - OperatingMode = MODE_RX_DC; -} - -void SX126xSetCad( void ) -{ - SX126xWriteCommand( RADIO_SET_CAD, 0, 0 ); - OperatingMode = MODE_CAD; -} - -void SX126xSetTxContinuousWave( void ) -{ - SX126xWriteCommand( RADIO_SET_TXCONTINUOUSWAVE, 0, 0 ); -} - -void SX126xSetTxInfinitePreamble( void ) -{ - SX126xWriteCommand( RADIO_SET_TXCONTINUOUSPREAMBLE, 0, 0 ); -} - -void SX126xSetStopRxTimerOnPreambleDetect( bool enable ) -{ - SX126xWriteCommand( RADIO_SET_STOPRXTIMERONPREAMBLE, ( uint8_t* )&enable, 1 ); -} - -void SX126xSetLoRaSymbNumTimeout( uint8_t SymbNum ) -{ - SX126xWriteCommand( RADIO_SET_LORASYMBTIMEOUT, &SymbNum, 1 ); -} - -void SX126xSetRegulatorMode( uint8_t mode ) -{ - SX126xWriteCommand( RADIO_SET_REGULATORMODE, ( uint8_t* )&mode, 1 ); -} - -void SX126xCalibrate( uint8_t calibParam ) -{ - SX126xWriteCommand( RADIO_CALIBRATE, ( uint8_t* )&calibParam, 1 ); -} - -void SX126xCalibrateImage( uint32_t freq ) -{ - uint8_t calFreq[2]; - - if( freq > 900000000 ) - { - calFreq[0] = 0xE1; - calFreq[1] = 0xE9; - } - else if( freq > 850000000 ) - { - calFreq[0] = 0xD7; - calFreq[1] = 0xD8; - } - else if( freq > 770000000 ) - { - calFreq[0] = 0xC1; - calFreq[1] = 0xC5; - } - else if( freq > 460000000 ) - { - calFreq[0] = 0x75; - calFreq[1] = 0x81; - } - else if( freq > 425000000 ) - { - calFreq[0] = 0x6B; - calFreq[1] = 0x6F; - } - SX126xWriteCommand( RADIO_CALIBRATEIMAGE, calFreq, 2 ); -} - -void SX126xSetPaConfig( uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, uint8_t paLut ) -{ - uint8_t buf[4]; - - buf[0] = paDutyCycle; - buf[1] = hpMax; - buf[2] = deviceSel; - buf[3] = paLut; - SX126xWriteCommand( RADIO_SET_PACONFIG, buf, 4 ); -} - -void SX126xSetRxTxFallbackMode( uint8_t fallbackMode ) -{ - SX126xWriteCommand( RADIO_SET_TXFALLBACKMODE, &fallbackMode, 1 ); -} - -void SX126xSetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask ) -{ - uint8_t buf[8]; - - buf[0] = ( uint8_t )( ( irqMask >> 8 ) & 0x00FF ); - buf[1] = ( uint8_t )( irqMask & 0x00FF ); - buf[2] = ( uint8_t )( ( dio1Mask >> 8 ) & 0x00FF ); - buf[3] = ( uint8_t )( dio1Mask & 0x00FF ); - buf[4] = ( uint8_t )( ( dio2Mask >> 8 ) & 0x00FF ); - buf[5] = ( uint8_t )( dio2Mask & 0x00FF ); - buf[6] = ( uint8_t )( ( dio3Mask >> 8 ) & 0x00FF ); - buf[7] = ( uint8_t )( dio3Mask & 0x00FF ); - SX126xWriteCommand( RADIO_CFG_DIOIRQ, buf, 8 ); -} - -uint16_t SX126xGetIrqStatus( void ) -{ - uint8_t irqStatus[2]; - - SX126xReadCommand( RADIO_GET_IRQSTATUS, irqStatus, 2 ); - return ( irqStatus[0] << 8 ) | irqStatus[1]; -} - -void SX126xSetDio2AsRfSwitchCtrl( uint8_t enable ) -{ - SX126xWriteCommand( RADIO_SET_RFSWITCHMODE, &enable, 1 ); -} - -void SX126xSetDio3AsTcxoCtrl( uint8_t tcxoVoltage, uint32_t timeout ) -{ - uint8_t buf[4]; - - buf[0] = tcxoVoltage & 0x07; - buf[1] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); - buf[2] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); - buf[3] = ( uint8_t )( timeout & 0xFF ); - - SX126xWriteCommand( RADIO_SET_TCXOMODE, buf, 4 ); -} - -void SX126xSetRfFrequency( uint32_t frequency ) -{ - uint8_t buf[4]; - uint32_t freq = 0; - - if( ImageCalibrated == false ) - { - SX126xCalibrateImage( frequency ); - ImageCalibrated = true; - } - - freq = ( uint32_t )( ( double )frequency / ( double )FREQ_STEP ); - buf[0] = ( uint8_t )( ( freq >> 24 ) & 0xFF ); - buf[1] = ( uint8_t )( ( freq >> 16 ) & 0xFF ); - buf[2] = ( uint8_t )( ( freq >> 8 ) & 0xFF ); - buf[3] = ( uint8_t )( freq & 0xFF ); - SX126xWriteCommand( RADIO_SET_RFFREQUENCY, buf, 4 ); -} - -void SX126xSetPacketType( RadioPacketTypes_t packetType ) -{ - // Save packet type internally to avoid questioning the radio - PacketType = packetType; - SX126xWriteCommand( RADIO_SET_PACKETTYPE, ( uint8_t* )&packetType, 1 ); -} - -RadioPacketTypes_t SX126xGetPacketType( void ) -{ - return PacketType; -} - -void SX126xSetTxParams( int8_t power, uint8_t rampTime ) -{ - uint8_t buf[2]; - - - SX126xSetPaConfig( 0x04, 0x07, 0x00, 0x01 ); - if( power > 22 ) - { - power = 22; - } - else if( power < -3 ) - { - power = -3; - } - SX126xWriteRegister( REG_OCP, 0x38 ); // current max 160mA for the whole device - buf[0] = power; - buf[1] = ( uint8_t )rampTime; - SX126xWriteCommand( RADIO_SET_TXPARAMS, buf, 2 ); -} - -void SX126xSetModulationParams( void *input_ptr ) -{ - uint8_t n; - uint32_t tempVal = 0; - uint8_t buf[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - ModulationParams_t* modulationParams = (ModulationParams_t*)input_ptr; - // Check if required configuration corresponds to the stored packet type - // If not, silently update radio packet type - if( PacketType != modulationParams->PacketType ) - { - SX126xSetPacketType( modulationParams->PacketType ); - } - - switch( modulationParams->PacketType ) - { - case PACKET_TYPE_GFSK: - n = 8; - tempVal = ( uint32_t )( 32 * ( ( double )XTAL_FREQ / ( double )modulationParams->Params.Gfsk.BitRate ) ); - buf[0] = ( tempVal >> 16 ) & 0xFF; - buf[1] = ( tempVal >> 8 ) & 0xFF; - buf[2] = tempVal & 0xFF; - buf[3] = modulationParams->Params.Gfsk.ModulationShaping; - buf[4] = modulationParams->Params.Gfsk.Bandwidth; - tempVal = ( uint32_t )( ( double )modulationParams->Params.Gfsk.Fdev / ( double )FREQ_STEP ); - buf[5] = ( tempVal >> 16 ) & 0xFF; - buf[6] = ( tempVal >> 8 ) & 0xFF; - buf[7] = ( tempVal& 0xFF ); - SX126xWriteCommand( RADIO_SET_MODULATIONPARAMS, buf, n ); - break; - case PACKET_TYPE_LORA: - n = 4; - buf[0] = modulationParams->Params.LoRa.SpreadingFactor; - buf[1] = modulationParams->Params.LoRa.Bandwidth; - buf[2] = modulationParams->Params.LoRa.CodingRate; - buf[3] = modulationParams->Params.LoRa.LowDatarateOptimize; - - SX126xWriteCommand( RADIO_SET_MODULATIONPARAMS, buf, n ); - - break; - default: - case PACKET_TYPE_NONE: - return; - } -} - -void SX126xSetPacketParams( void* input_ptr ) -{ - uint8_t n; - uint8_t crcVal = 0; - uint8_t buf[9] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - PacketParams_t* packetParams = (PacketParams_t*)input_ptr; - // Check if required configuration corresponds to the stored packet type - // If not, silently update radio packet type - if( PacketType != packetParams->PacketType ) - { - SX126xSetPacketType( packetParams->PacketType ); - } - - switch( packetParams->PacketType ) - { - case PACKET_TYPE_GFSK: - if( packetParams->Params.Gfsk.CrcLength == RADIO_CRC_2_BYTES_IBM ) - { - SX126xSetCrcSeed( CRC_IBM_SEED ); - SX126xSetCrcPolynomial( CRC_POLYNOMIAL_IBM ); - crcVal = RADIO_CRC_2_BYTES; - } - else if( packetParams->Params.Gfsk.CrcLength == RADIO_CRC_2_BYTES_CCIT ) - { - SX126xSetCrcSeed( CRC_CCITT_SEED ); - SX126xSetCrcPolynomial( CRC_POLYNOMIAL_CCITT ); - crcVal = RADIO_CRC_2_BYTES_INV; - } - else - { - crcVal = packetParams->Params.Gfsk.CrcLength; - } - n = 9; - buf[0] = ( packetParams->Params.Gfsk.PreambleLength >> 8 ) & 0xFF; - buf[1] = packetParams->Params.Gfsk.PreambleLength; - buf[2] = packetParams->Params.Gfsk.PreambleMinDetect; - buf[3] = ( packetParams->Params.Gfsk.SyncWordLength /*<< 3*/ ); // convert from byte to bit - buf[4] = packetParams->Params.Gfsk.AddrComp; - buf[5] = packetParams->Params.Gfsk.HeaderType; - buf[6] = packetParams->Params.Gfsk.PayloadLength; - buf[7] = crcVal; - buf[8] = packetParams->Params.Gfsk.DcFree; - break; - case PACKET_TYPE_LORA: - n = 6; - buf[0] = ( packetParams->Params.LoRa.PreambleLength >> 8 ) & 0xFF; - buf[1] = packetParams->Params.LoRa.PreambleLength; - buf[2] = packetParams->Params.LoRa.HeaderType; - buf[3] = packetParams->Params.LoRa.PayloadLength; - buf[4] = packetParams->Params.LoRa.CrcMode; - buf[5] = packetParams->Params.LoRa.InvertIQ; - break; - default: - case PACKET_TYPE_NONE: - return; - } - SX126xWriteCommand( RADIO_SET_PACKETPARAMS, buf, n ); -} - -void SX126xSetCadParams( uint8_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, uint8_t cadExitMode, uint32_t cadTimeout ) -{ - uint8_t buf[7]; - - buf[0] = ( uint8_t )cadSymbolNum; - buf[1] = cadDetPeak; - buf[2] = cadDetMin; - buf[3] = ( uint8_t )cadExitMode; - buf[4] = ( uint8_t )( ( cadTimeout >> 16 ) & 0xFF ); - buf[5] = ( uint8_t )( ( cadTimeout >> 8 ) & 0xFF ); - buf[6] = ( uint8_t )( cadTimeout & 0xFF ); - SX126xWriteCommand( RADIO_SET_CADPARAMS, buf, 5 ); - OperatingMode = MODE_CAD; -} - -void SX126xSetBufferBaseAddress( uint8_t txBaseAddress, uint8_t rxBaseAddress ) -{ - uint8_t buf[2]; - - buf[0] = txBaseAddress; - buf[1] = rxBaseAddress; - SX126xWriteCommand( RADIO_SET_BUFFERBASEADDRESS, buf, 2 ); -} - -uint8_t SX126xGetStatus( void ) -{ - uint8_t stat = 0; - - SX126xReadCommand( RADIO_GET_STATUS, ( uint8_t * )&stat, 1 ); - - return stat; -} - -int8_t SX126xGetRssiInst( void ) -{ - uint8_t buf[1]; - int8_t rssi = 0; - - SX126xReadCommand( RADIO_GET_RSSIINST, buf, 1 ); - rssi = -buf[0] >> 1; - return rssi; -} - -void SX126xGetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBufferPointer ) -{ - uint8_t status[2]; - - SX126xReadCommand( RADIO_GET_RXBUFFERSTATUS, status, 2 ); - - // In case of LORA fixed header, the payloadLength is obtained by reading - // the register REG_LR_PAYLOADLENGTH - if( ( SX126xGetPacketType( ) == PACKET_TYPE_LORA ) && ( SX126xReadRegister( REG_LR_PACKETPARAMS ) >> 7 == 1 ) ) - { - *payloadLength = SX126xReadRegister( REG_LR_PAYLOADLENGTH ); - } - else - { - *payloadLength = status[0]; - } - *rxStartBufferPointer = status[1]; -} - -void SX126xGetPacketStatus( void* input_ptr ) -{ - uint8_t status[3]; - PacketStatus_t *pktStatus = (PacketStatus_t *)input_ptr; - - SX126xReadCommand( RADIO_GET_PACKETSTATUS, status, 3 ); - - pktStatus->packetType = SX126xGetPacketType( ); - switch( pktStatus->packetType ) - { - case PACKET_TYPE_GFSK: - pktStatus->Params.Gfsk.RxStatus = status[0]; - pktStatus->Params.Gfsk.RssiSync = -status[1] >> 1; - pktStatus->Params.Gfsk.RssiAvg = -status[2] >> 1; - pktStatus->Params.Gfsk.FreqError = 0; - break; - - case PACKET_TYPE_LORA: - pktStatus->Params.LoRa.RssiPkt = -status[0] >> 1; - ( status[1] < 128 ) ? ( pktStatus->Params.LoRa.SnrPkt = status[1] >> 2 ) : ( pktStatus->Params.LoRa.SnrPkt = ( ( status[1] - 256 ) >> 2 ) ); - pktStatus->Params.LoRa.SignalRssiPkt = -status[2] >> 1; - pktStatus->Params.LoRa.FreqError = FrequencyError; - break; - - default: - case PACKET_TYPE_NONE: - // In that specific case, we set everything in the pktStatus to zeros - // and reset the packet type accordingly - memset( pktStatus, 0, sizeof( PacketStatus_t ) ); - pktStatus->packetType = PACKET_TYPE_NONE; - break; - } -} - -uint16_t SX126xGetDeviceErrors( void ) -{ - uint16_t error; - - SX126xReadCommand( RADIO_GET_ERROR, ( uint8_t * )&error, 2 ); - return error; -} - -void SX126xClearDeviceErrors( void ) -{ - uint8_t buf[2] = { 0x00, 0x00 }; - SX126xWriteCommand( RADIO_CLR_ERROR, buf, 2 ); -} - -void SX126xClearIrqStatus( uint16_t irq ) -{ - uint8_t buf[2]; - - buf[0] = ( uint8_t )( ( ( uint16_t )irq >> 8 ) & 0x00FF ); - buf[1] = ( uint8_t )( ( uint16_t )irq & 0x00FF ); - SX126xWriteCommand( RADIO_CLR_IRQSTATUS, buf, 2 ); -} diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x.h b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x.h deleted file mode 100644 index 012124dc..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/sx126x.h +++ /dev/null @@ -1,1115 +0,0 @@ -/*! - * \file sx126x.h - * - * \brief SX126x driver implementation - * - * \copyright Revised BSD License, see section \ref LICENSE. - * - * \code - * ______ _ - * / _____) _ | | - * ( (____ _____ ____ _| |_ _____ ____| |__ - * \____ \| ___ | (_ _) ___ |/ ___) _ \ - * _____) ) ____| | | || |_| ____( (___| | | | - * (______/|_____)_|_|_| \__)_____)\____)_| |_| - * (C)2013-2017 Semtech - * - * \endcode - * - * \author Miguel Luis ( Semtech ) - * - * \author Gregory Cristian ( Semtech ) - */ -#ifndef __SX126x_H__ -#define __SX126x_H__ -#include "stdint.h" -#include "stdbool.h" - - -#define USE_TCXO -#define SX1261 1 -#define SX1262 2 - -#ifdef USE_TCXO - /*! - * Radio complete Wake-up Time with TCXO stabilisation time - */ - #define RADIO_TCXO_SETUP_TIME 5 // [ms] -#else - /*! - * Radio complete Wake-up Time with TCXO stabilisation time - */ - #define RADIO_TCXO_SETUP_TIME 0 // No Used -#endif - -/*! - * Radio complete Wake-up Time with margin for temperature compensation - */ -#define RADIO_WAKEUP_TIME 3 // [ms] - -/*! - * \brief Compensation delay for SetAutoTx/Rx functions in 15.625 microseconds - */ -#define AUTO_RX_TX_OFFSET 2 - -/*! - * \brief LFSR initial value to compute IBM type CRC - */ -#define CRC_IBM_SEED 0xFFFF - -/*! - * \brief LFSR initial value to compute CCIT type CRC - */ -#define CRC_CCITT_SEED 0x1D0F - -/*! - * \brief Polynomial used to compute IBM CRC - */ -#define CRC_POLYNOMIAL_IBM 0x8005 - -/*! - * \brief Polynomial used to compute CCIT CRC - */ -#define CRC_POLYNOMIAL_CCITT 0x1021 - -/*! - * \brief The address of the register holding the first byte defining the CRC seed - * - */ -#define REG_LR_CRCSEEDBASEADDR 0x06BC - -/*! - * \brief The address of the register holding the first byte defining the CRC polynomial - */ -#define REG_LR_CRCPOLYBASEADDR 0x06BE - -/*! - * \brief The address of the register holding the first byte defining the whitening seed - */ -#define REG_LR_WHITSEEDBASEADDR_MSB 0x06B8 -#define REG_LR_WHITSEEDBASEADDR_LSB 0x06B9 - -/*! - * \brief The address of the register holding the packet configuration - */ -#define REG_LR_PACKETPARAMS 0x0704 - -/*! - * \brief The address of the register holding the payload size - */ -#define REG_LR_PAYLOADLENGTH 0x0702 - -/*! - * \brief The addresses of the registers holding SyncWords values - */ -#define REG_LR_SYNCWORDBASEADDRESS 0x06C0 - -/*! - * \brief The addresses of the register holding LoRa Modem SyncWord value - */ -#define REG_LR_SYNCWORD 0x0740 - -/*! - * Syncword for Private LoRa networks - */ -#define LORA_MAC_PRIVATE_SYNCWORD 0x1424 - -/*! - * Syncword for Public LoRa networks - */ -#define LORA_MAC_PUBLIC_SYNCWORD 0x3444 - -/*! - * The address of the register giving a 4 bytes random number - */ -#define RANDOM_NUMBER_GENERATORBASEADDR 0x0819 - -/*! - * The address of the register holding RX Gain value (0x94: power saving, 0x96: rx boosted) - */ -#define REG_RX_GAIN 0x08AC - -/*! - * Change the value on the device internal trimming capacitor - */ -#define REG_XTA_TRIM 0x0911 - -/*! - * Set the current max value in the over current protection - */ -#define REG_OCP 0x08E7 - -/*! - * \brief Structure describing the radio status - */ -typedef union RadioStatus_u -{ - uint8_t Value; - struct - { //bit order is lsb -> msb - uint8_t Reserved : 1; //!< Reserved - uint8_t CmdStatus : 3; //!< Command status - uint8_t ChipMode : 3; //!< Chip mode - uint8_t CpuBusy : 1; //!< Flag for CPU radio busy - }Fields; -}RadioStatus_t; - -/*! - * \brief Structure describing the error codes for callback functions - */ -typedef enum -{ - IRQ_HEADER_ERROR_CODE = 0x01, - IRQ_SYNCWORD_ERROR_CODE = 0x02, - IRQ_CRC_ERROR_CODE = 0x04, -}IrqErrorCode_t; - -enum IrqPblSyncHeaderCode_t -{ - IRQ_PBL_DETECT_CODE = 0x01, - IRQ_SYNCWORD_VALID_CODE = 0x02, - IRQ_HEADER_VALID_CODE = 0x04, -}; - -/*! - * \brief Represents the operating mode the radio is actually running - */ -typedef enum -{ - MODE_SLEEP = 0x00, //! The radio is in sleep mode - MODE_STDBY_RC, //! The radio is in standby mode with RC oscillator - MODE_STDBY_XOSC, //! The radio is in standby mode with XOSC oscillator - MODE_FS, //! The radio is in frequency synthesis mode - MODE_TX, //! The radio is in transmit mode - MODE_RX, //! The radio is in receive mode - MODE_RX_DC, //! The radio is in receive duty cycle mode - MODE_CAD //! The radio is in channel activity detection mode -}RadioOperatingModes_t; - -/*! - * \brief Declares the oscillator in use while in standby mode - * - * Using the STDBY_RC standby mode allow to reduce the energy consumption - * STDBY_XOSC should be used for time critical applications - */ -typedef enum -{ - STDBY_RC = 0x00, - STDBY_XOSC = 0x01, -}RadioStandbyModes_t; - -/*! - * \brief Declares the power regulation used to power the device - * - * This command allows the user to specify if DC-DC or LDO is used for power regulation. - * Using only LDO implies that the Rx or Tx current is doubled - */ -typedef enum -{ - USE_LDO = 0x00, // default - USE_DCDC = 0x01, -}RadioRegulatorMode_t; - -/*! - * \brief Represents the possible packet type (i.e. modem) used - */ -typedef enum -{ - PACKET_TYPE_GFSK = 0x00, - PACKET_TYPE_LORA = 0x01, - PACKET_TYPE_NONE = 0x0F, -}RadioPacketTypes_t; - -/*! - * \brief Represents the ramping time for power amplifier - */ -typedef enum -{ - RADIO_RAMP_10_US = 0x00, - RADIO_RAMP_20_US = 0x01, - RADIO_RAMP_40_US = 0x02, - RADIO_RAMP_80_US = 0x03, - RADIO_RAMP_200_US = 0x04, - RADIO_RAMP_800_US = 0x05, - RADIO_RAMP_1700_US = 0x06, - RADIO_RAMP_3400_US = 0x07, -}RadioRampTimes_t; - -/*! - * \brief Represents the number of symbols to be used for channel activity detection operation - */ -typedef enum -{ - LORA_CAD_01_SYMBOL = 0x00, - LORA_CAD_02_SYMBOL = 0x01, - LORA_CAD_04_SYMBOL = 0x02, - LORA_CAD_08_SYMBOL = 0x03, - LORA_CAD_16_SYMBOL = 0x04, -}RadioLoRaCadSymbols_t; - -/*! - * \brief Represents the Channel Activity Detection actions after the CAD operation is finished - */ -typedef enum -{ - LORA_CAD_ONLY = 0x00, - LORA_CAD_RX = 0x01, - LORA_CAD_LBT = 0x10, -}RadioCadExitModes_t; - -/*! - * \brief Represents the modulation shaping parameter - */ -typedef enum -{ - MOD_SHAPING_OFF = 0x00, - MOD_SHAPING_G_BT_03 = 0x08, - MOD_SHAPING_G_BT_05 = 0x09, - MOD_SHAPING_G_BT_07 = 0x0A, - MOD_SHAPING_G_BT_1 = 0x0B, -}RadioModShapings_t; - -/*! - * \brief Represents the modulation shaping parameter - */ -typedef enum -{ - RX_BW_4800 = 0x1F, - RX_BW_5800 = 0x17, - RX_BW_7300 = 0x0F, - RX_BW_9700 = 0x1E, - RX_BW_11700 = 0x16, - RX_BW_14600 = 0x0E, - RX_BW_19500 = 0x1D, - RX_BW_23400 = 0x15, - RX_BW_29300 = 0x0D, - RX_BW_39000 = 0x1C, - RX_BW_46900 = 0x14, - RX_BW_58600 = 0x0C, - RX_BW_78200 = 0x1B, - RX_BW_93800 = 0x13, - RX_BW_117300 = 0x0B, - RX_BW_156200 = 0x1A, - RX_BW_187200 = 0x12, - RX_BW_234300 = 0x0A, - RX_BW_312000 = 0x19, - RX_BW_373600 = 0x11, - RX_BW_467000 = 0x09, -}RadioRxBandwidth_t; - -/*! - * \brief Represents the possible spreading factor values in LoRa packet types - */ -typedef enum -{ - LORA_SF5 = 0x05, - LORA_SF6 = 0x06, - LORA_SF7 = 0x07, - LORA_SF8 = 0x08, - LORA_SF9 = 0x09, - LORA_SF10 = 0x0A, - LORA_SF11 = 0x0B, - LORA_SF12 = 0x0C, -}RadioLoRaSpreadingFactors_t; - -/*! - * \brief Represents the bandwidth values for LoRa packet type - */ -typedef enum -{ - LORA_BW_500 = 6, - LORA_BW_250 = 5, - LORA_BW_125 = 4, - LORA_BW_062 = 3, - LORA_BW_041 = 10, - LORA_BW_031 = 2, - LORA_BW_020 = 9, - LORA_BW_015 = 1, - LORA_BW_010 = 8, - LORA_BW_007 = 0, -}RadioLoRaBandwidths_t; - -/*! - * \brief Represents the coding rate values for LoRa packet type - */ -typedef enum -{ - LORA_CR_4_5 = 0x01, - LORA_CR_4_6 = 0x02, - LORA_CR_4_7 = 0x03, - LORA_CR_4_8 = 0x04, -}RadioLoRaCodingRates_t; - -/*! - * \brief Represents the preamble length used to detect the packet on Rx side - */ -typedef enum -{ - RADIO_PREAMBLE_DETECTOR_OFF = 0x00, //!< Preamble detection length off - RADIO_PREAMBLE_DETECTOR_08_BITS = 0x04, //!< Preamble detection length 8 bits - RADIO_PREAMBLE_DETECTOR_16_BITS = 0x05, //!< Preamble detection length 16 bits - RADIO_PREAMBLE_DETECTOR_24_BITS = 0x06, //!< Preamble detection length 24 bits - RADIO_PREAMBLE_DETECTOR_32_BITS = 0x07, //!< Preamble detection length 32 bit -}RadioPreambleDetection_t; - -/*! - * \brief Represents the possible combinations of SyncWord correlators activated - */ -typedef enum -{ - RADIO_ADDRESSCOMP_FILT_OFF = 0x00, //!< No correlator turned on, i.e. do not search for SyncWord - RADIO_ADDRESSCOMP_FILT_NODE = 0x01, - RADIO_ADDRESSCOMP_FILT_NODE_BROAD = 0x02, -}RadioAddressComp_t; - -/*! - * \brief Radio GFSK packet length mode - */ -typedef enum -{ - RADIO_PACKET_FIXED_LENGTH = 0x00, //!< The packet is known on both sides, no header included in the packet - RADIO_PACKET_VARIABLE_LENGTH = 0x01, //!< The packet is on variable size, header included -}RadioPacketLengthModes_t; - -/*! - * \brief Represents the CRC length - */ -typedef enum -{ - RADIO_CRC_OFF = 0x01, //!< No CRC in use - RADIO_CRC_1_BYTES = 0x00, - RADIO_CRC_2_BYTES = 0x02, - RADIO_CRC_1_BYTES_INV = 0x04, - RADIO_CRC_2_BYTES_INV = 0x06, - RADIO_CRC_2_BYTES_IBM = 0xF1, - RADIO_CRC_2_BYTES_CCIT = 0xF2, -}RadioCrcTypes_t; - -/*! - * \brief Radio whitening mode activated or deactivated - */ -typedef enum -{ - RADIO_DC_FREE_OFF = 0x00, - RADIO_DC_FREEWHITENING = 0x01, -}RadioDcFree_t; - -/*! - * \brief Holds the Radio lengths mode for the LoRa packet type - */ -typedef enum -{ - LORA_PACKET_VARIABLE_LENGTH = 0x00, //!< The packet is on variable size, header included - LORA_PACKET_FIXED_LENGTH = 0x01, //!< The packet is known on both sides, no header included in the packet - LORA_PACKET_EXPLICIT = LORA_PACKET_VARIABLE_LENGTH, - LORA_PACKET_IMPLICIT = LORA_PACKET_FIXED_LENGTH, -}RadioLoRaPacketLengthsMode_t; - -/*! - * \brief Represents the CRC mode for LoRa packet type - */ -typedef enum -{ - LORA_CRC_ON = 0x01, //!< CRC activated - LORA_CRC_OFF = 0x00, //!< CRC not used -}RadioLoRaCrcModes_t; - -/*! - * \brief Represents the IQ mode for LoRa packet type - */ -typedef enum -{ - LORA_IQ_NORMAL = 0x00, - LORA_IQ_INVERTED = 0x01, -}RadioLoRaIQModes_t; - -/*! - * \brief Represents the voltage used to control the TCXO on/off from DIO3 - */ -typedef enum -{ - TCXO_CTRL_1_6V = 0x00, - TCXO_CTRL_1_7V = 0x01, - TCXO_CTRL_1_8V = 0x02, - TCXO_CTRL_2_2V = 0x03, - TCXO_CTRL_2_4V = 0x04, - TCXO_CTRL_2_7V = 0x05, - TCXO_CTRL_3_0V = 0x06, - TCXO_CTRL_3_3V = 0x07, -}RadioTcxoCtrlVoltage_t; - -/*! - * \brief Represents the interruption masks available for the radio - * - * \remark Note that not all these interruptions are available for all packet types - */ -typedef enum -{ - IRQ_RADIO_NONE = 0x0000, - IRQ_TX_DONE = 0x0001, - IRQ_RX_DONE = 0x0002, - IRQ_PREAMBLE_DETECTED = 0x0004, - IRQ_SYNCWORD_VALID = 0x0008, - IRQ_HEADER_VALID = 0x0010, - IRQ_HEADER_ERROR = 0x0020, - IRQ_CRC_ERROR = 0x0040, - IRQ_CAD_DONE = 0x0080, - IRQ_CAD_ACTIVITY_DETECTED = 0x0100, - IRQ_RX_TX_TIMEOUT = 0x0200, - IRQ_RADIO_ALL = 0xFFFF, -}RadioIrqMasks_t; - -/*! - * \brief Represents all possible opcode understood by the radio - */ -typedef enum RadioCommands_e -{ - RADIO_GET_STATUS = 0xC0, - RADIO_WRITE_REGISTER = 0x0D, - RADIO_READ_REGISTER = 0x1D, - RADIO_WRITE_BUFFER = 0x0E, - RADIO_READ_BUFFER = 0x1E, - RADIO_SET_SLEEP = 0x84, - RADIO_SET_STANDBY = 0x80, - RADIO_SET_FS = 0xC1, - RADIO_SET_TX = 0x83, - RADIO_SET_RX = 0x82, - RADIO_SET_RXDUTYCYCLE = 0x94, - RADIO_SET_CAD = 0xC5, - RADIO_SET_TXCONTINUOUSWAVE = 0xD1, - RADIO_SET_TXCONTINUOUSPREAMBLE = 0xD2, - RADIO_SET_PACKETTYPE = 0x8A, - RADIO_GET_PACKETTYPE = 0x11, - RADIO_SET_RFFREQUENCY = 0x86, - RADIO_SET_TXPARAMS = 0x8E, - RADIO_SET_PACONFIG = 0x95, - RADIO_SET_CADPARAMS = 0x88, - RADIO_SET_BUFFERBASEADDRESS = 0x8F, - RADIO_SET_MODULATIONPARAMS = 0x8B, - RADIO_SET_PACKETPARAMS = 0x8C, - RADIO_GET_RXBUFFERSTATUS = 0x13, - RADIO_GET_PACKETSTATUS = 0x14, - RADIO_GET_RSSIINST = 0x15, - RADIO_GET_STATS = 0x10, - RADIO_RESET_STATS = 0x00, - RADIO_CFG_DIOIRQ = 0x08, - RADIO_GET_IRQSTATUS = 0x12, - RADIO_CLR_IRQSTATUS = 0x02, - RADIO_CALIBRATE = 0x89, - RADIO_CALIBRATEIMAGE = 0x98, - RADIO_SET_REGULATORMODE = 0x96, - RADIO_GET_ERROR = 0x17, - RADIO_CLR_ERROR = 0x07, - RADIO_SET_TCXOMODE = 0x97, - RADIO_SET_TXFALLBACKMODE = 0x93, - RADIO_SET_RFSWITCHMODE = 0x9D, - RADIO_SET_STOPRXTIMERONPREAMBLE = 0x9F, - RADIO_SET_LORASYMBTIMEOUT = 0xA0, -}RadioCommands_t; - -/*! - * \brief The type describing the modulation parameters for every packet types - */ -typedef struct -{ - RadioPacketTypes_t PacketType; //!< Packet to which the modulation parameters are referring to. - struct - { - struct - { - uint32_t BitRate; - uint32_t Fdev; - RadioModShapings_t ModulationShaping; - uint8_t Bandwidth; - }Gfsk; - struct - { - RadioLoRaSpreadingFactors_t SpreadingFactor; //!< Spreading Factor for the LoRa modulation - RadioLoRaBandwidths_t Bandwidth; //!< Bandwidth for the LoRa modulation - RadioLoRaCodingRates_t CodingRate; //!< Coding rate for the LoRa modulation - uint8_t LowDatarateOptimize; //!< Indicates if the modem uses the low datarate optimization - }LoRa; - }Params; //!< Holds the modulation parameters structure -}ModulationParams_t; - -/*! - * \brief The type describing the packet parameters for every packet types - */ -typedef struct -{ - RadioPacketTypes_t PacketType; //!< Packet to which the packet parameters are referring to. - struct - { - /*! - * \brief Holds the GFSK packet parameters - */ - struct - { - uint16_t PreambleLength; //!< The preamble Tx length for GFSK packet type in bit - RadioPreambleDetection_t PreambleMinDetect; //!< The preamble Rx length minimal for GFSK packet type - uint8_t SyncWordLength; //!< The synchronization word length for GFSK packet type - RadioAddressComp_t AddrComp; //!< Activated SyncWord correlators - RadioPacketLengthModes_t HeaderType; //!< If the header is explicit, it will be transmitted in the GFSK packet. If the header is implicit, it will not be transmitted - uint8_t PayloadLength; //!< Size of the payload in the GFSK packet - RadioCrcTypes_t CrcLength; //!< Size of the CRC block in the GFSK packet - RadioDcFree_t DcFree; - }Gfsk; - /*! - * \brief Holds the LoRa packet parameters - */ - struct - { - uint16_t PreambleLength; //!< The preamble length is the number of LoRa symbols in the preamble - RadioLoRaPacketLengthsMode_t HeaderType; //!< If the header is explicit, it will be transmitted in the LoRa packet. If the header is implicit, it will not be transmitted - uint8_t PayloadLength; //!< Size of the payload in the LoRa packet - RadioLoRaCrcModes_t CrcMode; //!< Size of CRC block in LoRa packet - RadioLoRaIQModes_t InvertIQ; //!< Allows to swap IQ for LoRa packet - }LoRa; - }Params; //!< Holds the packet parameters structure -}PacketParams_t; - -/*! - * \brief Represents the packet status for every packet type - */ -typedef struct -{ - RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to. - struct - { - struct - { - uint8_t RxStatus; - int8_t RssiAvg; //!< The averaged RSSI - int8_t RssiSync; //!< The RSSI measured on last packet - uint32_t FreqError; - }Gfsk; - struct - { - int8_t RssiPkt; //!< The RSSI of the last packet - int8_t SnrPkt; //!< The SNR of the last packet - int8_t SignalRssiPkt; - uint32_t FreqError; - }LoRa; - }Params; -}PacketStatus_t; - -/*! - * \brief Represents the Rx internal counters values when GFSK or LoRa packet type is used - */ -typedef struct -{ - RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to. - uint16_t PacketReceived; - uint16_t CrcOk; - uint16_t LengthError; -}RxCounter_t; - -/*! - * \brief Represents a calibration configuration - */ -typedef union -{ - struct - { - uint8_t RC64KEnable : 1; //!< Calibrate RC64K clock - uint8_t RC13MEnable : 1; //!< Calibrate RC13M clock - uint8_t PLLEnable : 1; //!< Calibrate PLL - uint8_t ADCPulseEnable : 1; //!< Calibrate ADC Pulse - uint8_t ADCBulkNEnable : 1; //!< Calibrate ADC bulkN - uint8_t ADCBulkPEnable : 1; //!< Calibrate ADC bulkP - uint8_t ImgEnable : 1; - uint8_t : 1; - }Fields; - uint8_t Value; -}CalibrationParams_t; - -/*! - * \brief Represents a sleep mode configuration - */ -typedef union -{ - struct - { - uint8_t WakeUpRTC : 1; //!< Get out of sleep mode if wakeup signal received from RTC - uint8_t Reset : 1; - uint8_t WarmStart : 1; - uint8_t Reserved : 5; - }Fields; - uint8_t Value; -}SleepParams_t; - -/*! - * \brief Represents the possible radio system error states - */ -typedef union -{ - struct - { - uint8_t Rc64kCalib : 1; //!< RC 64kHz oscillator calibration failed - uint8_t Rc13mCalib : 1; //!< RC 13MHz oscillator calibration failed - uint8_t PllCalib : 1; //!< PLL calibration failed - uint8_t AdcCalib : 1; //!< ADC calibration failed - uint8_t ImgCalib : 1; //!< Image calibration failed - uint8_t XoscStart : 1; //!< XOSC oscillator failed to start - uint8_t PllLock : 1; //!< PLL lock failed - uint8_t BuckStart : 1; //!< Buck converter failed to start - uint8_t PaRamp : 1; //!< PA ramp failed - uint8_t : 7; //!< Reserved - }Fields; - uint16_t Value; -}RadioError_t; - -/*! - * Radio hardware and global parameters - */ -typedef struct SX126x_s -{ -// Gpio_t Reset; -// Gpio_t BUSY; -// Gpio_t DIO1; -// Gpio_t DIO2; -// Gpio_t DIO3; -// Spi_t Spi; - PacketParams_t PacketParams; - PacketStatus_t PacketStatus; - ModulationParams_t ModulationParams; -}SX126x_t; - -/*! - * Hardware IO IRQ callback function definition - */ -typedef void ( DioIrqHandler )( void ); - -/*! - * SX126x definitions - */ - -/*! - * \brief Provides the frequency of the chip running on the radio and the frequency step - * - * \remark These defines are used for computing the frequency divider to set the RF frequency - */ -#define XTAL_FREQ ( double )32000000 -#define FREQ_DIV ( double )pow( 2.0, 25.0 ) -#define FREQ_STEP ( double )( XTAL_FREQ / FREQ_DIV ) - -#define RX_BUFFER_SIZE 256 - -/*! - * \brief The radio callbacks structure - * Holds function pointers to be called on radio interrupts - */ -typedef struct -{ - void ( *txDone )( void ); //!< Pointer to a function run on successful transmission - void ( *rxDone )( void ); //!< Pointer to a function run on successful reception - void ( *rxPreambleDetect )( void ); //!< Pointer to a function run on successful Preamble detection - void ( *rxSyncWordDone )( void ); //!< Pointer to a function run on successful SyncWord reception - void ( *rxHeaderDone )( bool isOk ); //!< Pointer to a function run on successful Header reception - void ( *txTimeout )( void ); //!< Pointer to a function run on transmission timeout - void ( *rxTimeout )( void ); //!< Pointer to a function run on reception timeout - void ( *rxError )( IrqErrorCode_t errCode ); //!< Pointer to a function run on reception error - void ( *cadDone )( bool cadFlag ); //!< Pointer to a function run on channel activity detected -}SX126xCallbacks_t; - -/*! - * ============================================================================ - * Public functions prototypes - * ============================================================================ - */ - -/*! - * \brief Initializes the radio driver - */ -void SX126xInit( void ); - -/*! - * \brief Gets the current Operation Mode of the Radio - * - * \retval RadioOperatingModes_t last operating mode - */ -uint8_t SX126xGetOperatingMode( void ); - -/*! - * \brief Wakeup the radio if it is in Sleep mode and check that Busy is low - */ -void SX126xCheckDeviceReady( void ); - -/*! - * \brief Saves the payload to be send in the radio buffer - * - * \param [in] payload A pointer to the payload - * \param [in] size The size of the payload - */ -void SX126xSetPayload( uint8_t *payload, uint8_t size ); - -/*! - * \brief Reads the payload received. If the received payload is longer - * than maxSize, then the method returns 1 and do not set size and payload. - * - * \param [out] payload A pointer to a buffer into which the payload will be copied - * \param [out] size A pointer to the size of the payload received - * \param [in] maxSize The maximal size allowed to copy into the buffer - */ -uint8_t SX126xGetPayload( uint8_t *payload, uint8_t *size, uint8_t maxSize ); - -/*! - * \brief Sends a payload - * - * \param [in] payload A pointer to the payload to send - * \param [in] size The size of the payload to send - * \param [in] timeout The timeout for Tx operation - */ -void SX126xSendPayload( uint8_t *payload, uint8_t size, uint32_t timeout ); - -/*! - * \brief Sets the Sync Word given by index used in GFSK - * - * \param [in] syncWord SyncWord bytes ( 8 bytes ) - * - * \retval status [0: OK, 1: NOK] - */ -uint8_t SX126xSetSyncWord( uint8_t *syncWord ); - -/*! - * \brief Sets the Initial value for the LFSR used for the CRC calculation - * - * \param [in] seed Initial LFSR value ( 2 bytes ) - * - */ -void SX126xSetCrcSeed( uint16_t seed ); - -/*! - * \brief Sets the seed used for the CRC calculation - * - * \param [in] seed The seed value - * - */ -void SX126xSetCrcPolynomial( uint16_t polynomial ); - -/*! - * \brief Sets the Initial value of the LFSR used for the whitening in GFSK protocols - * - * \param [in] seed Initial LFSR value - */ -void SX126xSetWhiteningSeed( uint16_t seed ); - -/*! - * \brief Gets a 32 bits random value generated by the radio - * - * \remark The radio must be in reception mode before executing this function - * - * \retval randomValue 32 bits random value - */ -uint32_t SX126xGetRandom( void ); - -/*! - * \brief Sets the radio in sleep mode - * - * \param [in] sleepConfig The sleep configuration describing data - * retention and RTC wake-up - */ -void SX126xSetSleep( uint8_t sleepConfig ); - -/*! - * \brief Sets the radio in configuration mode - * - * \param [in] mode The standby mode to put the radio into - */ -void SX126xSetStandby( uint8_t mode ); - -/*! - * \brief Sets the radio in FS mode - */ -void SX126xSetFs( void ); - -/*! - * \brief Sets the radio in transmission mode - * - * \param [in] timeout Structure describing the transmission timeout value - */ -void SX126xSetTx( uint32_t timeout ); - -/*! - * \brief Sets the radio in reception mode - * - * \param [in] timeout Structure describing the reception timeout value - */ -void SX126xSetRx( uint32_t timeout ); - -/*! - * \brief Sets the radio in reception mode with Boosted LNA gain - * - * \param [in] timeout Structure describing the reception timeout value - */ -void SX126xSetRxBoosted( uint32_t timeout ); - -/*! - * \brief Sets the Rx duty cycle management parameters - * - * \param [in] rxTime Structure describing reception timeout value - * \param [in] sleepTime Structure describing sleep timeout value - */ -void SX126xSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ); - -/*! - * \brief Sets the radio in CAD mode - */ -void SX126xSetCad( void ); - -/*! - * \brief Sets the radio in continuous wave transmission mode - */ -void SX126xSetTxContinuousWave( void ); - -/*! - * \brief Sets the radio in continuous preamble transmission mode - */ -void SX126xSetTxInfinitePreamble( void ); - -/*! - * \brief Decide which interrupt will stop the internal radio rx timer. - * - * \param [in] enable [0: Timer stop after header/syncword detection - * 1: Timer stop after preamble detection] - */ -void SX126xSetStopRxTimerOnPreambleDetect( bool enable ); - -/*! - * \brief Set the number of symbol the radio will wait to validate a reception - * - * \param [in] SymbNum number of LoRa symbols - */ -void SX126xSetLoRaSymbNumTimeout( uint8_t SymbNum ); - -/*! - * \brief Sets the power regulators operating mode - * - * \param [in] mode [0: LDO, 1:DC_DC] - */ -void SX126xSetRegulatorMode( uint8_t mode ); - -/*! - * \brief Calibrates the given radio block - * - * \param [in] calibParam The description of blocks to be calibrated - */ -void SX126xCalibrate( uint8_t calibParam ); - -/*! - * \brief Calibrates the Image rejection depending of the frequency - * - * \param [in] freq The operating frequency - */ -void SX126xCalibrateImage( uint32_t freq ); - -/*! - * \brief Activate the extention of the timeout when long preamble is used - * - * \param [in] enable The radio will extend the timeout to cope with long preamble - */ -void SX126xSetLongPreamble( uint8_t enable ); - -/*! - * \brief Sets the transmission parameters - * - * \param [in] paDutyCycle Duty Cycle for the PA - * \param [in] hpMax 0 for sx1261, 7 for sx1262 - * \param [in] deviceSel 1 for sx1261, 0 for sx1262 - * \param [in] paLut 0 for 14dBm LUT, 1 for 22dBm LUT - */ -void SX126xSetPaConfig( uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, uint8_t paLut ); - -/*! - * \brief Defines into which mode the chip goes after a TX / RX done - * - * \param [in] fallbackMode The mode in which the radio goes - */ -void SX126xSetRxTxFallbackMode( uint8_t fallbackMode ); - -/*! - * \brief Write data to the radio memory - * - * \param [in] address The address of the first byte to write in the radio - * \param [in] buffer The data to be written in radio's memory - * \param [in] size The number of bytes to write in radio's memory - */ -void SX126xWriteRegisters( uint16_t address, uint8_t *buffer, uint16_t size ); - -/*! - * \brief Read data from the radio memory - * - * \param [in] address The address of the first byte to read from the radio - * \param [out] buffer The buffer that holds data read from radio - * \param [in] size The number of bytes to read from radio's memory - */ -void SX126xReadRegisters( uint16_t address, uint8_t *buffer, uint16_t size ); - -/*! - * \brief Write data to the buffer holding the payload in the radio - * - * \param [in] offset The offset to start writing the payload - * \param [in] buffer The data to be written (the payload) - * \param [in] size The number of byte to be written - */ -void SX126xWriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ); - -/*! - * \brief Read data from the buffer holding the payload in the radio - * - * \param [in] offset The offset to start reading the payload - * \param [out] buffer A pointer to a buffer holding the data from the radio - * \param [in] size The number of byte to be read - */ -void SX126xReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ); - -/*! - * \brief Sets the IRQ mask and DIO masks - * - * \param [in] irqMask General IRQ mask - * \param [in] dio1Mask DIO1 mask - * \param [in] dio2Mask DIO2 mask - * \param [in] dio3Mask DIO3 mask - */ -void SX126xSetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask ); - -/*! - * \brief Returns the current IRQ status - * - * \retval irqStatus IRQ status - */ -uint16_t SX126xGetIrqStatus( void ); - -/*! - * \brief Indicates if DIO2 is used to control an RF Switch - * - * \param [in] enable true of false - */ -void SX126xSetDio2AsRfSwitchCtrl( uint8_t enable ); - -/*! - * \brief Indicates if the Radio main clock is supplied from a tcxo - * - * \param [in] tcxoVoltage voltage used to control the TCXO - * \param [in] timeout time given to the TCXO to go to 32MHz - */ -void SX126xSetDio3AsTcxoCtrl( uint8_t tcxoVoltage, uint32_t timeout ); - -/*! - * \brief Sets the RF frequency - * - * \param [in] frequency RF frequency [Hz] - */ -void SX126xSetRfFrequency( uint32_t frequency ); - -/*! - * \brief Sets the radio for the given protocol - * - * \param [in] packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA] - * - * \remark This method has to be called before SetRfFrequency, - * SetModulationParams and SetPacketParams - */ -void SX126xSetPacketType( RadioPacketTypes_t packetType ); - -/*! - * \brief Gets the current radio protocol - * - * \retval packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA] - */ -RadioPacketTypes_t SX126xGetPacketType( void ); - -/*! - * \brief Sets the transmission parameters - * - * \param [in] power RF output power [-18..13] dBm - * \param [in] rampTime Transmission ramp up time - */ -void SX126xSetTxParams( int8_t power, uint8_t rampTime ); - -/*! - * \brief Set the modulation parameters - * - * \param [in] modParams A structure describing the modulation parameters - */ -void SX126xSetModulationParams( void *input_ptr ); - -/*! - * \brief Sets the packet parameters - * - * \param [in] packetParams A structure describing the packet parameters - */ -void SX126xSetPacketParams( void *packetParams ); - -/*! - * \brief Sets the Channel Activity Detection (CAD) parameters - * - * \param [in] cadSymbolNum The number of symbol to use for CAD operations - * [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL, - * LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL, - * LORA_CAD_16_SYMBOL] - * \param [in] cadDetPeak Limit for detection of SNR peak used in the CAD - * \param [in] cadDetMin Set the minimum symbol recognition for CAD - * \param [in] cadExitMode Operation to be done at the end of CAD action - * [LORA_CAD_ONLY, LORA_CAD_RX, LORA_CAD_LBT] - * \param [in] cadTimeout Defines the timeout value to abort the CAD activity - */ -void SX126xSetCadParams( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, RadioCadExitModes_t cadExitMode, uint32_t cadTimeout ); - -/*! - * \brief Sets the data buffer base address for transmission and reception - * - * \param [in] txBaseAddress Transmission base address - * \param [in] rxBaseAddress Reception base address - */ -void SX126xSetBufferBaseAddress( uint8_t txBaseAddress, uint8_t rxBaseAddress ); - -/*! - * \brief Gets the current radio status - * - * \retval status Radio status - */ -uint8_t SX126xGetStatus( void ); - -/*! - * \brief Returns the instantaneous RSSI value for the last packet received - * - * \retval rssiInst Instantaneous RSSI - */ -int8_t SX126xGetRssiInst( void ); - -/*! - * \brief Gets the last received packet buffer status - * - * \param [out] payloadLength Last received packet payload length - * \param [out] rxStartBuffer Last received packet buffer address pointer - */ -void SX126xGetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBuffer ); - -/*! - * \brief Gets the last received packet payload length - * - * \param [out] pktStatus A structure of packet status - */ -void SX126xGetPacketStatus( void *pktStatus ); - -/*! - * \brief Returns the possible system errors - * - * \retval sysErrors Value representing the possible sys failures - */ -uint16_t SX126xGetDeviceErrors( void ); - -/*! - * \brief Clear all the errors in the device - */ -void SX126xClearDeviceErrors( void ); - -/*! - * \brief Clears the IRQs - * - * \param [in] irq IRQ(s) to be cleared - */ -void SX126xClearIrqStatus( uint16_t irq ); - -#endif // __SX126x_H__ diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/timer.cpp b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/timer.cpp deleted file mode 100644 index 96b22367..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/timer.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include "timer1.h" -unsigned int timer1_counter = 0; -uint32_t TickCounter = 0; - -void timer1_init(void) -{ - // Initializing timer1 - cli(); //disable global interrupt - TCCR1A = 0; //set TCCR1A to 0 - TCCR1B = 0; - - timer1_counter = 64911; - TCNT1 = timer1_counter; - - TCCR1B |= (1 << CS12); //256 frequency divider - - // enable overflow interrupt for timer - TIMSK1 = (1 << TOIE1); - //enable global interrupt - sei(); -} - -ISR(TIMER1_OVF_vect) -{ - TCNT1 = timer1_counter; - TickCounter++; -} \ No newline at end of file diff --git a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/timer1.h b/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/timer1.h deleted file mode 100644 index d59c9193..00000000 --- a/Code/BITS/BITSv5/Arduino_code_for_sx1262_tcxo_module_DRF1262T_EN/Arduino-DRF1262T-TX/timer1.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _TIMER1_H_ -#define _TIMER1_H_ -void timer1_init(void); - -#endif diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeCache.txt b/Code/BITS/BITSv5/radio-test/build/CMakeCache.txt index d3aa7e0e..c5038de2 100644 --- a/Code/BITS/BITSv5/radio-test/build/CMakeCache.txt +++ b/Code/BITS/BITSv5/radio-test/build/CMakeCache.txt @@ -503,7 +503,7 @@ PICO_BOOT_STAGE2_DIR:INTERNAL=/Users/michaelshipman/Developer/command_module/Cod PICO_CMAKE_PRELOAD_PLATFORM_DIR:INTERNAL=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/cmake/preload/platforms PICO_CMAKE_PRELOAD_PLATFORM_FILE:INTERNAL=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/cmake/preload/platforms/rp2040.cmake PICO_COMPILER_ASM:INTERNAL=/opt/homebrew/bin/arm-none-eabi-gcc -PICO_DOXYGEN_EXCLUDE_PATHS:INTERNAL= /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs +PICO_DOXYGEN_EXCLUDE_PATHS:INTERNAL= /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs PICO_DOXYGEN_PATHS:INTERNAL= /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/cyw43-driver/src /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040 PICO_NO_HARDWARE:INTERNAL=0 PICO_ON_DEVICE:INTERNAL=1 diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/1 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/1 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/1 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/17 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/17 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/17 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/18 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/18 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/18 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/2 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/2 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/2 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/20 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/20 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/20 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/21 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/21 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/21 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/23 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/23 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/23 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/3 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/3 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/3 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/4 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/4 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/4 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/5 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/5 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/5 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/6 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/6 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/6 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/7 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/7 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/7 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/8 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/8 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/8 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/97 b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/97 new file mode 100644 index 00000000..7b4d68d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/97 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/count.txt b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/count.txt new file mode 100644 index 00000000..5595fa46 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/Progress/count.txt @@ -0,0 +1 @@ +95 diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/compiler_depend.internal b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/compiler_depend.internal index 0f05d1f4..570e5153 100644 --- a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/compiler_depend.internal +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/compiler_depend.internal @@ -2939,6 +2939,7 @@ CMakeFiles/radio-test.dir/radio_test.cpp.obj /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/radio.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x-board.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/timer1.h CMakeFiles/radio-test.dir/sx126x-board.cpp.obj /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x-board.cpp @@ -3005,3 +3006,75 @@ CMakeFiles/radio-test.dir/sx126x-board.cpp.obj /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x-board.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.h +CMakeFiles/radio-test.dir/sx126x.cpp.obj + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.cpp + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/cpu_defines.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bit + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/concept_check.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/cpp_type_traits.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/exception_defines.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/functexcept.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/move.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/predefined_ops.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/ptr_traits.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/requires_hosted.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/specfun.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_algobase.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_funcs.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_pair.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/utility.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cmath + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/assertions.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/debug.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/numeric_traits.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/type_traits.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/limits + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/math.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/bessel_function.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/beta_function.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/ell_integral.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/exp_integral.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/gamma.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/hypergeometric.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/legendre_function.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/modified_bessel_func.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_hermite.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_laguerre.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/riemann_zeta.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/special_function_util.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/type_traits + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/stdlib.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/math.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdlib.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/string.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/strings.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_locale.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/lock.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/reent.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/string.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x-board.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.h + diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/compiler_depend.make b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/compiler_depend.make index 1d163548..400515fb 100644 --- a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/compiler_depend.make +++ b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/compiler_depend.make @@ -2877,7 +2877,8 @@ CMakeFiles/radio-test.dir/radio_test.cpp.obj: /Users/michaelshipman/Developer/co generated/pico_base/pico/version.h \ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/radio.h \ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x-board.h \ - /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/timer1.h CMakeFiles/radio-test.dir/sx126x-board.cpp.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x-board.cpp \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ @@ -2943,6 +2944,79 @@ CMakeFiles/radio-test.dir/sx126x-board.cpp.obj: /Users/michaelshipman/Developer/ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x-board.h \ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.h +CMakeFiles/radio-test.dir/sx126x.cpp.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.cpp \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/cpu_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bit \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/concept_check.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/cpp_type_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/exception_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/functexcept.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/move.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/predefined_ops.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/ptr_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/requires_hosted.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/specfun.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_algobase.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_funcs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_pair.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/utility.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cmath \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/assertions.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/debug.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/numeric_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/type_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/limits \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/math.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/bessel_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/beta_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/ell_integral.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/exp_integral.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/gamma.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/hypergeometric.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/legendre_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/modified_bessel_func.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_hermite.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_laguerre.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/riemann_zeta.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/special_function_util.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/type_traits \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/math.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/string.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/strings.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_locale.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/lock.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/reent.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/string.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x-board.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.h + + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/timer1.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.h: @@ -3302,6 +3376,8 @@ generated/pico_base/pico/version.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include/pico/lock_core.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/radio-test/sx126x.cpp: + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_bank0.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/usb.h: diff --git a/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/radio_test.cpp.obj b/Code/BITS/BITSv5/radio-test/build/CMakeFiles/radio-test.dir/radio_test.cpp.obj index 55f70e9e7e095c53a12add56d80ade5daff5376c..08f1c63ec2adda63ab1456ba7bcb4d4164e84fc5 100644 GIT binary patch literal 3576 zcma)8U1%It6h5=FNw%BNG@IY1X_@?x?%HO|CZSDgwP|Cr8#ZZW6Q%lKI!UHv+Wi@4 zW@9Rfh58_Z57IRa)Q1W_X&x#V@S#G$Dn9sNK@fZpAH)jnLxNyI!FbNh+}*pE6no&# zIo~;FzjJ@i%-y%grzRvx0wxkfp^N~Md)!FXkgK9_2o6H9OG>qyW`bN*oE_k7nX}D} z4hW^1VgJ=oDva!Hu=D8O9jU7-bKj@uQn>jwb{&mH$mGpV^C-qDwe^fa$ zIXlxyXV$m)8mDzkgv#_KYIVC=*4ycx%i7U}F z1tYVlXjZlloyTJ_FBVq@`UeK%{rw|w`Up~Kx;AfsL|a*PY^HA-s_SZ|_ehaolhiD= z%5Bnqsa-l0z_1_^hl8-a!$FX7hP=p7Ng!heFERvSAMZfih&WX81xpqgGE@us)k1!? zkRKBALqdMJlE)tw^20)YSm3V{^6T9EXeo=Gp68HZuNyCg5%VHLy}(!R=6_L2sxMh& z$j~70H3;#D5RVA)Mj=kSUltjfgm_aqh?We^LcCdsw+QhTA>Jy)TZMR=fcFcy9f*;- zj&?eN{nPDdkgow+A%?mfuZ9y9I0UH*9EO*Dd=hm8SudexLcRK$52&*naQ$!kc+|yB zaLvbF{YH4d0!LsKF~zoUMDV2TTe=p#B0{+>@9jF^{w|*Dm4}I*- zw+*%{F!qzBEgJbbN4Fhy!8D=Afu2Q}du8}sZg%DQd`@468Ao$;bj9Q3n>Dg}zThnT zjx_HWIhRYXj9XUTqA*gVU5Xc$99x5|o?S4nz?s6ui@G&qyrKIhq;1=HNy`*;n8{h5 zk;RW5*bdFi$QjO@mdQ}PftmC1fnzI^`AKvxgKZja7);B^ITyh!I5yZBT{q{lHl%4` zoh!u^1^CC1|bM@bI=pbG+n0CZml@G(r<=LsM4 zdNh0-@U6n%W3Whi1mGjm*qEP?eg=TfJa7`P3eryj+$H@iz;~pd2B0$!V9_5)_W}G! zS_Sx(^m72ek;Wo__?pf*a0(x)eI@H?^Qaxm(@V^9^c4rxMa|JbowseE+e9U&T5;CA zTR3kq#GO1J;(LJi3*Devd76w$Cr#6ht3%wJY)7-4g6T%x`KpGeN*zLrP|Ka;La(*F zRjOQ{dAVFWxDKza-7Qhw&QKTf*(|mTsHfA@s^&PBF<-zJ12^``n82 zw(Rut*lj815eLa(9Mq%#mq&dm)~!Py6L!mDO9B1m8}$QiH6B0Bn{sGSJ^J&<^Nk|j zjc*M7JfFhx(H=0qd9-=HsmJiWD)2=)KAIQfdrRP>|Bt)P?~1_J&+*Ys&-gwR_!bf4 z>sb=YBl!RazusZwqrIp7qxy_*9c@}KellFSg-`xwqdbb=^)>4k`YvqYV8ZHdqJyuy zgmvFVAJwIQ46N=?X!HHDjzy>r6K4N{jwi``_=I`??289TL?zup@4`O@IXP0F*aMegiUtay1ON)F_L)D zKf!;&izhvM^-u8Nk;Jnn5)b10c6Z8lLLx7jeeZkUw{Pdo%+A||<$Ic@ku;6+bcl%d zk^z&N4qTpw=``IpZM!+4&n>N0Mv)%;da(cZ03*4q6Z{{2H}Lzvz?XSwv^YP1ThGtB zj=uPCU0-W9?TszNYUsr&Q4+3c7xnyH+p_Dr;X0F?yg5D|az(vVC`}a$g-#bqUx5-%;?af*(W}HFLba%U!sS*1K?; zsu3=;&ryapBaD-fqkei3VeDa!vh*gxVf_Jm*M+%X*Qi^~s&9I}*l4wAtWIM-Ieh5J z^TAjR%dZ-?P1UExQsqgpG_$kRT;k+5wc5T%o^6_~s^gJGm4^Gsu-hiBdY%>!7{2dXwKgw4H+DS3dBa{}onYae7shzX z8)1}V=;V!{>cGLS@xWjDKivdt@J@*b4E5rF4{jFlcOx(72dwjuCU2lJC-C>f!}fRr zdG^Q$wKbLX%VKR>3Apqz0(+RnV&Vzesg;}D{9AM9-$=dL; sCvZP`>~dm=J0B+mZo;NeY;}$~F+$5D-IB(IiDc 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 diff --git a/Code/BITS/BITSv5/radio-test/build/radio-test.elf.map b/Code/BITS/BITSv5/radio-test/build/radio-test.elf.map index 6012662c..af8238e7 100644 --- a/Code/BITS/BITSv5/radio-test/build/radio-test.elf.map +++ b/Code/BITS/BITSv5/radio-test/build/radio-test.elf.map @@ -86,74 +86,9 @@ Discarded input sections .text 0x00000000 0x0 CMakeFiles/radio-test.dir/radio_test.cpp.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/radio_test.cpp.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/radio_test.cpp.obj - .bss.i 0x00000000 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj - .bss.SnrValue 0x00000000 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj - .bss.RssiValue - 0x00000000 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj - .bss.Buffer 0x00000000 0x40 CMakeFiles/radio-test.dir/radio_test.cpp.obj - .data.BufferSize - 0x00000000 0x2 CMakeFiles/radio-test.dir/radio_test.cpp.obj - .bss.RadioEvents - 0x00000000 0x1c CMakeFiles/radio-test.dir/radio_test.cpp.obj - .bss.State 0x00000000 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj - .data.mode 0x00000000 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj .text 0x00000000 0x0 CMakeFiles/radio-test.dir/radio.cpp.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/radio.cpp.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z21RadioCheckRfFrequencym - 0x00000000 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z18RadioGetWakeupTimev - 0x00000000 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z12RadioStandbyv - 0x00000000 0xc CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z9RadioInitP13RadioEvents_t - 0x00000000 0x48 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z14RadioGetStatusv - 0x00000000 0x1c CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z15RadioSetChannelm - 0x00000000 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z9RadioRssi13RadioModems_t - 0x00000000 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z14RadioTimeOnAir13RadioModems_th - 0x00000000 0x11c CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z9RadioSendPhh - 0x00000000 0x3c CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z10RadioSleepv - 0x00000000 0x10 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z19RadioSetRxDutyCyclemm - 0x00000000 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z13RadioStartCadv - 0x00000000 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z24RadioSetTxContinuousWavemat - 0x00000000 0x14 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z10RadioWriteth - 0x00000000 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z9RadioReadt - 0x00000000 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z16RadioWriteBuffertPhh - 0x00000000 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z15RadioReadBuffertPhh - 0x00000000 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z15RadioIrqProcessv - 0x00000000 0x108 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z7RadioRxm - 0x00000000 0x3c CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z14RadioRxBoostedm - 0x00000000 0x3c CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z13RadioSetModemh.part.0 - 0x00000000 0x88 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z18RadioIsChannelFree13RadioModems_tmsm - 0x00000000 0x128 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z16RadioSetTxConfighammmhtbbbhbm - 0x00000000 0x16c CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z13RadioSetModemh - 0x00000000 0x98 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z21RadioSetPublicNetworkb - 0x00000000 0xbc CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z11RadioRandomv - 0x00000000 0xf4 CMakeFiles/radio-test.dir/radio.cpp.obj - .text._Z16RadioSetRxConfighmmhmttbhbbhbb - 0x00000000 0x1bc CMakeFiles/radio-test.dir/radio.cpp.obj .text._Z7RadioTxm 0x00000000 0xc CMakeFiles/radio-test.dir/radio.cpp.obj .text._Z14RadioWriteFifoPhh @@ -168,85 +103,20 @@ Discarded input sections 0x00000000 0x18 CMakeFiles/radio-test.dir/radio.cpp.obj .text._Z13RadioOnDioIrqv 0x00000000 0xc CMakeFiles/radio-test.dir/radio.cpp.obj - .bss.SX126x 0x00000000 0x3c CMakeFiles/radio-test.dir/radio.cpp.obj - .bss.RadioEvents_Ptr - 0x00000000 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj - .bss._ZL18RadioPublicNetwork - 0x00000000 0x2 CMakeFiles/radio-test.dir/radio.cpp.obj - .bss.IrqFired 0x00000000 0x1 CMakeFiles/radio-test.dir/radio.cpp.obj - .bss.RadioRxPayload - 0x00000000 0xff CMakeFiles/radio-test.dir/radio.cpp.obj - .bss.RadioPktStatus - 0x00000000 0x14 CMakeFiles/radio-test.dir/radio.cpp.obj - .bss.RxContinuous - 0x00000000 0x1 CMakeFiles/radio-test.dir/radio.cpp.obj - .bss.RxTimeout - 0x00000000 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj - .bss.TxTimeout - 0x00000000 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj - .data.MaxPayloadLength - 0x00000000 0x1 CMakeFiles/radio-test.dir/radio.cpp.obj - .rodata._ZL17RadioLoRaSymbTime - 0x00000000 0x90 CMakeFiles/radio-test.dir/radio.cpp.obj - .rodata._ZL10Bandwidths - 0x00000000 0x10 CMakeFiles/radio-test.dir/radio.cpp.obj - .data.Radio 0x00000000 0x6c CMakeFiles/radio-test.dir/radio.cpp.obj - .comment 0x00000000 0x45 CMakeFiles/radio-test.dir/radio.cpp.obj - .ARM.attributes - 0x00000000 0x2c CMakeFiles/radio-test.dir/radio.cpp.obj .text 0x00000000 0x0 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z7DelayMsm - 0x00000000 0x8 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z15BoardDisableIrqv - 0x00000000 0x1c CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z14BoardEnableIrqv - 0x00000000 0x20 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z11SX126xResetv - 0x00000000 0x24 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj .text._Z16SX126xWaitOnBusyv 0x00000000 0x10 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z12SX126xWakeupv - 0x00000000 0x84 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z18SX126xWriteCommandhPht - 0x00000000 0x84 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z17SX126xReadCommandhPht - 0x00000000 0x88 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z20SX126xWriteRegisterstPht - 0x00000000 0xa4 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z19SX126xWriteRegisterth - 0x00000000 0x90 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z19SX126xReadRegisterstPht - 0x00000000 0xb8 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z18SX126xReadRegistert - 0x00000000 0x98 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z17SX126xWriteBufferhPhh - 0x00000000 0x8c CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z16SX126xReadBufferhPhh - 0x00000000 0x98 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .text._Z18SX126xSetRfTxPowera - 0x00000000 0xc CMakeFiles/radio-test.dir/sx126x-board.cpp.obj .text._Z22SX126xCheckRfFrequencym 0x00000000 0x4 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .bss._ZL4ints 0x00000000 0x4 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - .bss._ZL12IrqNestLevel - 0x00000000 0x1 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj .text 0x00000000 0x0 CMakeFiles/radio-test.dir/sx126x.cpp.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/sx126x.cpp.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z10SX126xInitv - 0x00000000 0x60 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z22SX126xGetOperatingModev - 0x00000000 0xc CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z22SX126xCheckDeviceReadyv 0x00000000 0x20 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z16SX126xSetPayloadPhh 0x00000000 0x10 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z16SX126xGetPayloadPhS_h - 0x00000000 0x60 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z17SX126xSendPayloadPhhm - 0x00000000 0x34 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z17SX126xSetSyncWordPh 0x00000000 0x14 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z16SX126xSetCrcSeedt @@ -257,32 +127,12 @@ Discarded input sections 0x00000000 0x40 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z15SX126xGetRandomv 0x00000000 0x5c CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z14SX126xSetSleeph - 0x00000000 0x20 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z16SX126xSetStandbyh - 0x00000000 0x28 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z11SX126xSetFsv 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z11SX126xSetTxm 0x00000000 0x28 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z11SX126xSetRxm - 0x00000000 0x28 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z18SX126xSetRxBoostedm - 0x00000000 0x34 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z20SX126xSetRxDutyCyclemm - 0x00000000 0x3c CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z12SX126xSetCadv - 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z25SX126xSetTxContinuousWavev - 0x00000000 0x10 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z27SX126xSetTxInfinitePreamblev 0x00000000 0x10 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z36SX126xSetStopRxTimerOnPreambleDetectb - 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z27SX126xSetLoRaSymbNumTimeouth - 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z22SX126xSetRegulatorModeh - 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z15SX126xCalibrateh 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z20SX126xCalibrateImagem @@ -291,55 +141,20 @@ Discarded input sections 0x00000000 0x20 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z25SX126xSetRxTxFallbackModeh 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z21SX126xSetDioIrqParamstttt - 0x00000000 0x50 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z18SX126xGetIrqStatusv - 0x00000000 0x1c CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z27SX126xSetDio2AsRfSwitchCtrlh 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z23SX126xSetDio3AsTcxoCtrlhm 0x00000000 0x2c CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z20SX126xSetRfFrequencym - 0x00000000 0xb8 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z19SX126xSetPacketType18RadioPacketTypes_t - 0x00000000 0x20 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z19SX126xGetPacketTypev - 0x00000000 0xc CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z17SX126xSetTxParamsah - 0x00000000 0x4c CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z25SX126xSetModulationParamsPv - 0x00000000 0xcc CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z21SX126xSetPacketParamsPv - 0x00000000 0x130 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z18SX126xSetCadParamshhhhm 0x00000000 0x38 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z26SX126xSetBufferBaseAddresshh - 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z15SX126xGetStatusv 0x00000000 0x20 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z17SX126xGetRssiInstv - 0x00000000 0x1c CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z23SX126xGetRxBufferStatusPhS_ 0x00000000 0x50 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z21SX126xGetPacketStatusPv - 0x00000000 0x8c CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z21SX126xGetDeviceErrorsv 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj .text._Z23SX126xClearDeviceErrorsv 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .text._Z20SX126xClearIrqStatust - 0x00000000 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .bss._ZL15ImageCalibrated - 0x00000000 0x1 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .bss.FrequencyError - 0x00000000 0x4 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .bss._ZL10PacketType - 0x00000000 0x1 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .bss._ZL13OperatingMode - 0x00000000 0x1 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .comment 0x00000000 0x45 CMakeFiles/radio-test.dir/sx126x.cpp.obj - .ARM.attributes - 0x00000000 0x2c CMakeFiles/radio-test.dir/sx126x.cpp.obj .text 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj @@ -758,34 +573,14 @@ Discarded input sections .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .text._out_buffer 0x00000000 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .text._out_null - 0x00000000 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .text._out_rev - 0x00000000 0xac CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .text._ntoa_format - 0x00000000 0x250 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .text._out_fct - 0x00000000 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .text._etoa 0x00000000 0x464 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .rodata._ftoa.str1.4 - 0x00000000 0x15 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .text._ftoa 0x00000000 0x3c0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .text._vsnprintf - 0x00000000 0xbc8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .rodata._vsnprintf - 0x00000000 0x19c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .text.__wrap_sprintf 0x00000000 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .text.__wrap_snprintf 0x00000000 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .text.__wrap_vsnprintf 0x00000000 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .text.vfctprintf - 0x00000000 0x20 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .text.weak_raw_printf 0x00000000 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - .rodata.pow10.0 - 0x00000000 0x50 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj .text.clzsi 0x00000000 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj @@ -806,10 +601,6 @@ Discarded input sections .text 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj - .text.__wrap___aeabi_idiv - 0x00000000 0x50 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj - .text.__wrap___aeabi_ldiv - 0x00000000 0x424 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj .text.divmod_s64s64_rem 0x00000000 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj .text.divmod_u64u64_rem @@ -821,32 +612,14 @@ Discarded input sections 0x00000000 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .text.pop_r8_r11 0x00000000 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_darithmetic - 0x00000000 0x80 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_cdcmple - 0x00000000 0x6c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .text.__wrap___aeabi_dcmpeq 0x00000000 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_dcmplt - 0x00000000 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .text.__wrap___aeabi_dcmple 0x00000000 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_dcmpge - 0x00000000 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_dcmpgt - 0x00000000 0xa CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_dcmpun - 0x00000000 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .text.__wrap___aeabi_ui2d 0x00000000 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_i2d - 0x00000000 0x38 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_d2iz - 0x00000000 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .text.double2int 0x00000000 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj - .text.__wrap___aeabi_d2uiz - 0x00000000 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .text.fix2double 0x00000000 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .text.ufix2double @@ -911,10 +684,6 @@ Discarded input sections 0x00000000 0x58 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj .text.__wrap_round 0x00000000 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj - .text.__wrap_floor - 0x00000000 0x90 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj - .text.__wrap_ceil - 0x00000000 0x94 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj .text.__wrap_asin 0x00000000 0x58 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj .text.__wrap_acos @@ -963,20 +732,9 @@ Discarded input sections 0x00000000 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj .text.__wrap_remainder 0x00000000 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj - .comment 0x00000000 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj - .ARM.attributes - 0x00000000 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj .text 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj - .text.__wrap___aeabi_dsub - 0x00000000 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj - .text.dadd_shim - 0x00000000 0x15c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj - .text.dmul_shim - 0x00000000 0x15c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj - .text.ddiv_shim - 0x00000000 0x1b0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .text.dsqrt_shim 0x00000000 0x1a8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .text.dcordic_vec_step @@ -985,18 +743,12 @@ Discarded input sections 0x00000000 0x76 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .text.double2int_shim 0x00000000 0xe CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj - .text.double2uint_shim - 0x00000000 0xe CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .text.double2int64_shim 0x00000000 0x1a CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj - .text.double2uint64_shim - 0x00000000 0x70 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .text.double2float_shim 0x00000000 0x5c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .text.x2double_shims 0x00000000 0x90 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj - .text.dunpacks - 0x00000000 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .text.dreduce 0x00000000 0x82 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .text.dtan_shim 0x00000000 0x20 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj @@ -1220,8 +972,6 @@ Discarded input sections .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .text.stdio_out_chars_no_crlf 0x00000000 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj - .text.stdio_buffered_printer - 0x00000000 0x64 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .text.stdout_serialize_begin 0x00000000 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .text.stdout_serialize_end @@ -1239,10 +989,6 @@ Discarded input sections .text._isatty 0x00000000 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .text.stdio_flush 0x00000000 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj - .text.__wrap_vprintf - 0x00000000 0xd4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj - .text.__wrap_printf - 0x00000000 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .text.__wrap_getchar 0x00000000 0x7c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .text.getchar_timeout_us @@ -1503,8 +1249,6 @@ Discarded input sections .text 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .data 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .bss 0x00000000 0x0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj - .text.spi_init - 0x00000000 0x14c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .text.spi_deinit 0x00000000 0x38 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .text.spi_set_baudrate @@ -1517,18 +1261,13 @@ Discarded input sections 0x00000000 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .time_critical.spi_read_blocking 0x00000000 0x70 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj - .time_critical.spi_write16_read16_blocking - 0x00000000 0x74 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .time_critical.spi_write16_blocking 0x00000000 0x50 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .time_critical.spi_read16_blocking 0x00000000 0x70 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj - .comment 0x00000000 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj - .ARM.attributes - 0x00000000 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj - .text 0x00000000 0x0 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccwrjwj8.o - .data 0x00000000 0x0 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccwrjwj8.o - .bss 0x00000000 0x0 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccwrjwj8.o + .text 0x00000000 0x0 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccPdOwc6.o + .data 0x00000000 0x0 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccPdOwc6.o + .bss 0x00000000 0x0 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccPdOwc6.o .data 0x00000000 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) .bss 0x00000000 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) .text 0x00000000 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-calloc.o) @@ -1847,11 +1586,11 @@ LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-no .boot2 0x10000000 0x100 0x10000000 __boot2_start__ = . *(.boot2) - .boot2 0x10000000 0x100 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccwrjwj8.o + .boot2 0x10000000 0x100 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccPdOwc6.o 0x10000100 __boot2_end__ = . 0x00000001 ASSERT (((__boot2_end__ - __boot2_start__) == 0x100), ERROR: Pico second stage bootloader must be 256 bytes in size) -.text 0x10000100 0x4938 +.text 0x10000100 0x8820 0x10000100 __logical_binary_start = . *(.vectors) .vectors 0x10000100 0xd4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj @@ -1915,482 +1654,811 @@ LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-no 0x100002bc 0x28 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o .text.frame_dummy 0x100002e4 0x24 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o + .text._Z8OnTxDonev + 0x10000308 0xc CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x10000308 OnTxDone() + .text._Z11OnTxTimeoutv + 0x10000314 0xc CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x10000314 OnTxTimeout() + .text._Z11OnRxTimeoutv + 0x10000320 0xc CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x10000320 OnRxTimeout() + .text._Z9OnRxErrorv + 0x1000032c 0xc CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x1000032c OnRxError() + .text._Z8OnRxDonePhtsa + 0x10000338 0x3c CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x10000338 OnRxDone(unsigned char*, unsigned short, short, signed char) .text.startup.main - 0x10000308 0x20 CMakeFiles/radio-test.dir/radio_test.cpp.obj - 0x10000308 main + 0x10000374 0xf0 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x10000374 main + .text._Z21RadioCheckRfFrequencym + 0x10000464 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000464 RadioCheckRfFrequency(unsigned long) + .text._Z18RadioGetWakeupTimev + 0x10000468 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000468 RadioGetWakeupTime() + .text._Z12RadioStandbyv + 0x1000046c 0xc CMakeFiles/radio-test.dir/radio.cpp.obj + 0x1000046c RadioStandby() + .text._Z9RadioInitP13RadioEvents_t + 0x10000478 0x48 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000478 RadioInit(RadioEvents_t*) + .text._Z14RadioGetStatusv + 0x100004c0 0x1c CMakeFiles/radio-test.dir/radio.cpp.obj + 0x100004c0 RadioGetStatus() + .text._Z15RadioSetChannelm + 0x100004dc 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x100004dc RadioSetChannel(unsigned long) + .text._Z9RadioRssi13RadioModems_t + 0x100004e4 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x100004e4 RadioRssi(RadioModems_t) + .text._Z14RadioTimeOnAir13RadioModems_th + 0x100004ec 0x11c CMakeFiles/radio-test.dir/radio.cpp.obj + 0x100004ec RadioTimeOnAir(RadioModems_t, unsigned char) + .text._Z9RadioSendPhh + 0x10000608 0x3c CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000608 RadioSend(unsigned char*, unsigned char) + .text._Z10RadioSleepv + 0x10000644 0x10 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000644 RadioSleep() + .text._Z19RadioSetRxDutyCyclemm + 0x10000654 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000654 RadioSetRxDutyCycle(unsigned long, unsigned long) + .text._Z13RadioStartCadv + 0x1000065c 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x1000065c RadioStartCad() + .text._Z24RadioSetTxContinuousWavemat + 0x10000664 0x14 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000664 RadioSetTxContinuousWave(unsigned long, signed char, unsigned short) + .text._Z10RadioWriteth + 0x10000678 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000678 RadioWrite(unsigned short, unsigned char) + .text._Z9RadioReadt + 0x10000680 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000680 RadioRead(unsigned short) + .text._Z16RadioWriteBuffertPhh + 0x10000688 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000688 RadioWriteBuffer(unsigned short, unsigned char*, unsigned char) + .text._Z15RadioReadBuffertPhh + 0x10000690 0x8 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000690 RadioReadBuffer(unsigned short, unsigned char*, unsigned char) + .text._Z15RadioIrqProcessv + 0x10000698 0x108 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000698 RadioIrqProcess() + .text._Z7RadioRxm + 0x100007a0 0x3c CMakeFiles/radio-test.dir/radio.cpp.obj + 0x100007a0 RadioRx(unsigned long) + .text._Z14RadioRxBoostedm + 0x100007dc 0x3c CMakeFiles/radio-test.dir/radio.cpp.obj + 0x100007dc RadioRxBoosted(unsigned long) + .text._Z13RadioSetModemh.part.0 + 0x10000818 0x88 CMakeFiles/radio-test.dir/radio.cpp.obj + .text._Z18RadioIsChannelFree13RadioModems_tmsm + 0x100008a0 0x128 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x100008a0 RadioIsChannelFree(RadioModems_t, unsigned long, short, unsigned long) + .text._Z16RadioSetTxConfighammmhtbbbhbm + 0x100009c8 0x16c CMakeFiles/radio-test.dir/radio.cpp.obj + 0x100009c8 RadioSetTxConfig(unsigned char, signed char, unsigned long, unsigned long, unsigned long, unsigned char, unsigned short, bool, bool, bool, unsigned char, bool, unsigned long) + .text._Z13RadioSetModemh + 0x10000b34 0x98 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000b34 RadioSetModem(unsigned char) + .text._Z21RadioSetPublicNetworkb + 0x10000bcc 0xbc CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000bcc RadioSetPublicNetwork(bool) + .text._Z11RadioRandomv + 0x10000c88 0xf4 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000c88 RadioRandom() + .text._Z16RadioSetRxConfighmmhmttbhbbhbb + 0x10000d7c 0x1bc CMakeFiles/radio-test.dir/radio.cpp.obj + 0x10000d7c RadioSetRxConfig(unsigned char, unsigned long, unsigned long, unsigned char, unsigned long, unsigned short, unsigned short, bool, unsigned char, bool, bool, unsigned char, bool, bool) + .text._Z7DelayMsm + 0x10000f38 0x8 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10000f38 DelayMs(unsigned long) + .text._Z15BoardDisableIrqv + 0x10000f40 0x1c CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10000f40 BoardDisableIrq() + .text._Z14BoardEnableIrqv + 0x10000f5c 0x20 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10000f5c BoardEnableIrq() .text._Z12SX126xIoInitv - 0x10000328 0x44 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj - 0x10000328 SX126xIoInit() + 0x10000f7c 0x44 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10000f7c SX126xIoInit() + .text._Z11SX126xResetv + 0x10000fc0 0x24 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10000fc0 SX126xReset() + .text._Z12SX126xWakeupv + 0x10000fe4 0x84 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10000fe4 SX126xWakeup() + .text._Z18SX126xWriteCommandhPht + 0x10001068 0x84 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10001068 SX126xWriteCommand(unsigned char, unsigned char*, unsigned short) + .text._Z17SX126xReadCommandhPht + 0x100010ec 0x88 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x100010ec SX126xReadCommand(unsigned char, unsigned char*, unsigned short) + .text._Z20SX126xWriteRegisterstPht + 0x10001174 0xa4 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10001174 SX126xWriteRegisters(unsigned short, unsigned char*, unsigned short) + .text._Z19SX126xWriteRegisterth + 0x10001218 0x90 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10001218 SX126xWriteRegister(unsigned short, unsigned char) + .text._Z19SX126xReadRegisterstPht + 0x100012a8 0xb8 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x100012a8 SX126xReadRegisters(unsigned short, unsigned char*, unsigned short) + .text._Z18SX126xReadRegistert + 0x10001360 0x98 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10001360 SX126xReadRegister(unsigned short) + .text._Z17SX126xWriteBufferhPhh + 0x100013f8 0x8c CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x100013f8 SX126xWriteBuffer(unsigned char, unsigned char*, unsigned char) + .text._Z16SX126xReadBufferhPhh + 0x10001484 0x98 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x10001484 SX126xReadBuffer(unsigned char, unsigned char*, unsigned char) + .text._Z18SX126xSetRfTxPowera + 0x1000151c 0xc CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x1000151c SX126xSetRfTxPower(signed char) + .text._Z10SX126xInitv + 0x10001528 0x60 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001528 SX126xInit() + .text._Z22SX126xGetOperatingModev + 0x10001588 0xc CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001588 SX126xGetOperatingMode() + .text._Z16SX126xGetPayloadPhS_h + 0x10001594 0x60 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001594 SX126xGetPayload(unsigned char*, unsigned char*, unsigned char) + .text._Z17SX126xSendPayloadPhhm + 0x100015f4 0x34 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x100015f4 SX126xSendPayload(unsigned char*, unsigned char, unsigned long) + .text._Z14SX126xSetSleeph + 0x10001628 0x20 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001628 SX126xSetSleep(unsigned char) + .text._Z16SX126xSetStandbyh + 0x10001648 0x28 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001648 SX126xSetStandby(unsigned char) + .text._Z11SX126xSetRxm + 0x10001670 0x28 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001670 SX126xSetRx(unsigned long) + .text._Z18SX126xSetRxBoostedm + 0x10001698 0x34 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001698 SX126xSetRxBoosted(unsigned long) + .text._Z20SX126xSetRxDutyCyclemm + 0x100016cc 0x3c CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x100016cc SX126xSetRxDutyCycle(unsigned long, unsigned long) + .text._Z12SX126xSetCadv + 0x10001708 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001708 SX126xSetCad() + .text._Z25SX126xSetTxContinuousWavev + 0x10001720 0x10 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001720 SX126xSetTxContinuousWave() + .text._Z36SX126xSetStopRxTimerOnPreambleDetectb + 0x10001730 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001730 SX126xSetStopRxTimerOnPreambleDetect(bool) + .text._Z27SX126xSetLoRaSymbNumTimeouth + 0x10001748 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001748 SX126xSetLoRaSymbNumTimeout(unsigned char) + .text._Z22SX126xSetRegulatorModeh + 0x10001760 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001760 SX126xSetRegulatorMode(unsigned char) + .text._Z21SX126xSetDioIrqParamstttt + 0x10001778 0x50 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001778 SX126xSetDioIrqParams(unsigned short, unsigned short, unsigned short, unsigned short) + .text._Z18SX126xGetIrqStatusv + 0x100017c8 0x1c CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x100017c8 SX126xGetIrqStatus() + .text._Z20SX126xSetRfFrequencym + 0x100017e4 0xb8 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x100017e4 SX126xSetRfFrequency(unsigned long) + .text._Z19SX126xSetPacketType18RadioPacketTypes_t + 0x1000189c 0x20 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x1000189c SX126xSetPacketType(RadioPacketTypes_t) + .text._Z19SX126xGetPacketTypev + 0x100018bc 0xc CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x100018bc SX126xGetPacketType() + .text._Z17SX126xSetTxParamsah + 0x100018c8 0x4c CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x100018c8 SX126xSetTxParams(signed char, unsigned char) + .text._Z25SX126xSetModulationParamsPv + 0x10001914 0xcc CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001914 SX126xSetModulationParams(void*) + .text._Z21SX126xSetPacketParamsPv + 0x100019e0 0x130 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x100019e0 SX126xSetPacketParams(void*) + .text._Z26SX126xSetBufferBaseAddresshh + 0x10001b10 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001b10 SX126xSetBufferBaseAddress(unsigned char, unsigned char) + .text._Z17SX126xGetRssiInstv + 0x10001b28 0x1c CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001b28 SX126xGetRssiInst() + .text._Z21SX126xGetPacketStatusPv + 0x10001b44 0x8c CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001b44 SX126xGetPacketStatus(void*) + .text._Z20SX126xClearIrqStatust + 0x10001bd0 0x18 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x10001bd0 SX126xClearIrqStatus(unsigned short) .text.gpio_set_function - 0x1000036c 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj - 0x1000036c gpio_set_function + 0x10001be8 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + 0x10001be8 gpio_set_function .text.gpio_init - 0x1000039c 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj - 0x1000039c gpio_init + 0x10001c18 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + 0x10001c18 gpio_init .text.running_on_fpga - 0x100003d8 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj - 0x100003d8 running_on_fpga + 0x10001c54 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + 0x10001c54 running_on_fpga .text.hw_claim_or_assert - 0x100003e8 0x44 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj - 0x100003e8 hw_claim_or_assert + 0x10001c64 0x44 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + 0x10001c64 hw_claim_or_assert .text.hw_claim_unused_from_range - 0x1000042c 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj - 0x1000042c hw_claim_unused_from_range + 0x10001ca8 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + 0x10001ca8 hw_claim_unused_from_range .text.spin_locks_reset - 0x100004c8 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj - 0x100004c8 spin_locks_reset + 0x10001d44 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x10001d44 spin_locks_reset .text.next_striped_spin_lock_num - 0x100004e4 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj - 0x100004e4 next_striped_spin_lock_num + 0x10001d60 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x10001d60 next_striped_spin_lock_num .text.spin_lock_claim_unused - 0x100004fc 0x24 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj - 0x100004fc spin_lock_claim_unused + 0x10001d78 0x24 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x10001d78 spin_lock_claim_unused .text.irq_set_enabled - 0x10000520 0x24 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x10000520 irq_set_enabled + 0x10001d9c 0x24 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10001d9c irq_set_enabled .text.irq_set_pending - 0x10000544 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x10000544 irq_set_pending + 0x10001dc0 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10001dc0 irq_set_pending .text.irq_has_shared_handler - 0x10000554 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x10000554 irq_has_shared_handler + 0x10001dd0 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10001dd0 irq_has_shared_handler .text.irq_get_vtable_handler - 0x10000580 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x10000580 irq_get_vtable_handler + 0x10001dfc 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10001dfc irq_get_vtable_handler .text.irq_set_exclusive_handler - 0x10000590 0x54 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x10000590 irq_set_exclusive_handler + 0x10001e0c 0x54 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10001e0c irq_set_exclusive_handler .text.irq_add_shared_handler - 0x100005e4 0x1f4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x100005e4 irq_add_shared_handler + 0x10001e60 0x1f4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10001e60 irq_add_shared_handler .text.irq_remove_handler - 0x100007d8 0x1c4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x100007d8 irq_remove_handler + 0x10002054 0x1c4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10002054 irq_remove_handler .text.irq_add_tail_to_free_list - 0x1000099c 0xb4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x1000099c irq_add_tail_to_free_list + 0x10002218 0xb4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10002218 irq_add_tail_to_free_list .text.irq_init_priorities - 0x10000a50 0x24 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x10000a50 irq_init_priorities + 0x100022cc 0x24 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x100022cc irq_init_priorities .text.user_irq_claim_unused - 0x10000a74 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - 0x10000a74 user_irq_claim_unused + 0x100022f0 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x100022f0 user_irq_claim_unused .text.lock_init - 0x10000aa0 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj - 0x10000aa0 lock_init + 0x1000231c 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj + 0x1000231c lock_init .text.mutex_init - 0x10000ab0 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj - 0x10000ab0 mutex_init + 0x1000232c 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj + 0x1000232c mutex_init .text.recursive_mutex_init - 0x10000acc 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj - 0x10000acc recursive_mutex_init + 0x10002348 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj + 0x10002348 recursive_mutex_init .text.critical_section_init - 0x10000ae8 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj - 0x10000ae8 critical_section_init + 0x10002364 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj + 0x10002364 critical_section_init .text.critical_section_init_with_lock_num - 0x10000b04 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj - 0x10000b04 critical_section_init_with_lock_num + 0x10002380 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj + 0x10002380 critical_section_init_with_lock_num .text.timer_pool_entry_comparator - 0x10000b18 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - 0x10000b18 timer_pool_entry_comparator + 0x10002394 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x10002394 timer_pool_entry_comparator .text.sleep_until_callback - 0x10000b4c 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x100023c8 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .text.add_alarm_under_lock.isra.0 - 0x10000b7c 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x100023f8 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .text.alarm_pool_alarm_callback - 0x10000c7c 0x1c0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x100024f8 0x1c0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .text.alarm_pool_init_default - 0x10000e3c 0x6c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - 0x10000e3c alarm_pool_init_default + 0x100026b8 0x6c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x100026b8 alarm_pool_init_default .text.alarm_pool_get_default - 0x10000ea8 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - 0x10000ea8 alarm_pool_get_default + 0x10002724 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x10002724 alarm_pool_get_default .text.alarm_pool_add_alarm_at - 0x10000eb0 0x17c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - 0x10000eb0 alarm_pool_add_alarm_at + 0x1000272c 0x17c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x1000272c alarm_pool_add_alarm_at .text.alarm_pool_core_num - 0x1000102c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - 0x1000102c alarm_pool_core_num + 0x100028a8 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x100028a8 alarm_pool_core_num .text.sleep_until - 0x10001030 0xc4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - 0x10001030 sleep_until + 0x100028ac 0xc4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x100028ac sleep_until .text.sleep_ms - 0x100010f4 0x38 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - 0x100010f4 sleep_ms + 0x10002970 0x38 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x10002970 sleep_ms .text.best_effort_wfe_or_timeout - 0x1000112c 0xcc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - 0x1000112c best_effort_wfe_or_timeout + 0x100029a8 0xcc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x100029a8 best_effort_wfe_or_timeout .text.hardware_alarm_irq_handler - 0x100011f8 0xbc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10002a74 0xbc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj .text.hardware_alarm_claim - 0x100012b4 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj - 0x100012b4 hardware_alarm_claim + 0x10002b30 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10002b30 hardware_alarm_claim .text.time_us_64 - 0x100012cc 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj - 0x100012cc time_us_64 + 0x10002b48 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10002b48 time_us_64 .text.busy_wait_us - 0x100012e0 0x68 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj - 0x100012e0 busy_wait_us + 0x10002b5c 0x68 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10002b5c busy_wait_us .text.busy_wait_until - 0x10001348 0x20 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj - 0x10001348 busy_wait_until + 0x10002bc4 0x20 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10002bc4 busy_wait_until .text.hardware_alarm_set_callback - 0x10001368 0x8c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj - 0x10001368 hardware_alarm_set_callback + 0x10002be4 0x8c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10002be4 hardware_alarm_set_callback .text.hardware_alarm_set_target - 0x100013f4 0xd0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj - 0x100013f4 hardware_alarm_set_target + 0x10002c70 0xd0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10002c70 hardware_alarm_set_target .text.hardware_alarm_cancel - 0x100014c4 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj - 0x100014c4 hardware_alarm_cancel + 0x10002d40 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10002d40 hardware_alarm_cancel .text.ph_merge_nodes - 0x10001500 0x58 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj + 0x10002d7c 0x58 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj .text.ph_post_alloc_init - 0x10001558 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj - 0x10001558 ph_post_alloc_init + 0x10002dd4 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj + 0x10002dd4 ph_post_alloc_init .text.ph_merge_two_pass - 0x10001594 0x8c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj - 0x10001594 ph_merge_two_pass + 0x10002e10 0x8c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj + 0x10002e10 ph_merge_two_pass .text.ph_remove_any_head - 0x10001620 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj + 0x10002e9c 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj .text.ph_remove_head - 0x10001720 0x104 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj - 0x10001720 ph_remove_head + 0x10002f9c 0x104 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj + 0x10002f9c ph_remove_head .text.ph_remove_and_free_node - 0x10001824 0x78 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj - 0x10001824 ph_remove_and_free_node + 0x100030a0 0x78 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj + 0x100030a0 ph_remove_and_free_node .text.uart_init - 0x1000189c 0x18c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj - 0x1000189c uart_init + 0x10003118 0x18c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + 0x10003118 uart_init .text.clocks_init - 0x10001a28 0x2c8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj - 0x10001a28 clocks_init + 0x100032a4 0x2c8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + 0x100032a4 clocks_init .text.clock_get_hz - 0x10001cf0 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj - 0x10001cf0 clock_get_hz + 0x1000356c 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + 0x1000356c clock_get_hz .text.pll_init - 0x10001cfc 0xa4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj - 0x10001cfc pll_init + 0x10003578 0xa4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + 0x10003578 pll_init .text.watchdog_start_tick - 0x10001da0 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj - 0x10001da0 watchdog_start_tick + 0x1000361c 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + 0x1000361c watchdog_start_tick .text.watchdog_reboot - 0x10001db0 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj - 0x10001db0 watchdog_reboot + 0x1000362c 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + 0x1000362c watchdog_reboot .text.xosc_init - 0x10001e4c 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj - 0x10001e4c xosc_init + 0x100036c8 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + 0x100036c8 xosc_init .text.runtime_init - 0x10001e74 0xf0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj - 0x10001e74 runtime_init - .text._exit 0x10001f64 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj - 0x10001f64 _exit - .text.exit 0x10001f68 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj - 0x10001f68 exit - .text.panic 0x10001f70 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj - 0x10001f70 panic + 0x100036f0 0xf0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x100036f0 runtime_init + .text._exit 0x100037e0 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x100037e0 _exit + .text.exit 0x100037e4 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x100037e4 exit + .text.panic 0x100037ec 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x100037ec panic .text.hard_assertion_failure - 0x10001fa0 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj - 0x10001fa0 hard_assertion_failure + 0x1000381c 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x1000381c hard_assertion_failure + .text._out_null + 0x10003828 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._out_rev + 0x1000382c 0xac CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._ntoa_format + 0x100038d8 0x250 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .text._out_char - 0x10001fac 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + 0x10003b28 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._out_fct + 0x10003b38 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._etoa 0x10003b48 0x464 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._ftoa 0x10003fac 0x3c0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text._vsnprintf + 0x1000436c 0xbc8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .text.vfctprintf + 0x10004f34 0x20 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + 0x10004f34 vfctprintf .text.weak_raw_vprintf - 0x10001fbc 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj - 0x10001fbc weak_raw_vprintf - .text 0x10001fec 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + 0x10004f54 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + 0x10004f54 weak_raw_vprintf + .text 0x10004f84 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj .text.rom_func_lookup - 0x10001ffc 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj - 0x10001ffc rom_func_lookup + 0x10004f94 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + 0x10004f94 rom_func_lookup .text.rom_data_lookup - 0x1000200c 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj - 0x1000200c rom_data_lookup + 0x10004fa4 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + 0x10004fa4 rom_data_lookup .text.rom_funcs_lookup - 0x1000201c 0x44 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj - 0x1000201c rom_funcs_lookup + 0x10004fb4 0x44 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + 0x10004fb4 rom_funcs_lookup + .text.__wrap___aeabi_idiv + 0x10004ff8 0x50 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + 0x10004ff8 __wrap___aeabi_idivmod + 0x10004ff8 divmod_s32s32 + 0x10004ff8 div_s32s32 + 0x10004ff8 __wrap___aeabi_idiv + 0x10005000 divmod_s32s32_unsafe + 0x1000502c divmod_s32s32_savestate .text.__wrap___aeabi_uidiv - 0x10002060 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj - 0x10002060 __wrap___aeabi_uidiv - 0x10002060 __wrap___aeabi_uidivmod - 0x10002060 div_u32u32 - 0x10002060 divmod_u32u32 - 0x10002068 divmod_u32u32_unsafe - 0x10002090 divmod_u32u32_savestate + 0x10005048 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + 0x10005048 __wrap___aeabi_uidiv + 0x10005048 __wrap___aeabi_uidivmod + 0x10005048 div_u32u32 + 0x10005048 divmod_u32u32 + 0x10005050 divmod_u32u32_unsafe + 0x10005078 divmod_u32u32_savestate + .text.__wrap___aeabi_ldiv + 0x10005094 0x424 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + 0x10005094 __wrap___aeabi_ldivmod + 0x10005094 div_s64s64 + 0x10005094 divmod_s64s64 + 0x100050c4 divmod_u64u64 + 0x100050c4 div_u64u64 + 0x100050c4 __wrap___aeabi_uldivmod + 0x100050d4 divmod_u64u64_savestate + 0x100050f4 divmod_s64s64_unsafe + 0x1000517c divmod_u64u64_unsafe + .text.__wrap___aeabi_darithmetic + 0x100054b8 0x80 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x100054b8 __wrap___aeabi_drsub + 0x100054be __wrap___aeabi_dsub + 0x100054d0 __wrap___aeabi_dadd + 0x100054e2 __wrap___aeabi_ddiv + 0x1000551e __wrap___aeabi_dmul + .text.__wrap___aeabi_cdcmple + 0x10005538 0x6c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x10005538 __wrap___aeabi_cdrcmple + 0x10005548 __wrap___aeabi_cdcmple + 0x10005548 __wrap___aeabi_cdcmpeq + .text.__wrap___aeabi_dcmplt + 0x100055a4 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x100055a4 __wrap___aeabi_dcmplt + .text.__wrap___aeabi_dcmpge + 0x100055b0 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x100055b0 __wrap___aeabi_dcmpge + .text.__wrap___aeabi_dcmpgt + 0x100055c0 0xa CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x100055c0 __wrap___aeabi_dcmpgt + .text.__wrap___aeabi_dcmpun + 0x100055ca 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x100055ca __wrap___aeabi_dcmpun + *fill* 0x100055e6 0x2 + .text.__wrap___aeabi_i2d + 0x100055e8 0x38 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x100055e8 __wrap___aeabi_ui2d + 0x100055f0 __wrap___aeabi_i2d + .text.__wrap___aeabi_d2iz + 0x10005620 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x10005620 __wrap___aeabi_d2iz + 0x10005620 double2int_z + .text.__wrap___aeabi_d2uiz + 0x10005668 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x10005668 double2uint + 0x10005668 __wrap___aeabi_d2uiz .text.__aeabi_double_init - 0x100020ac 0x98 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj - 0x100020ac __aeabi_double_init + 0x10005680 0x98 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + 0x10005680 __aeabi_double_init + .text.__wrap_floor + 0x10005718 0x90 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + 0x10005718 __wrap_floor + .text.__wrap_ceil + 0x100057a8 0x94 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj + 0x100057a8 __wrap_ceil .text.double_table_shim_on_use_helper - 0x10002144 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj - 0x10002144 double_table_shim_on_use_helper + 0x1000583c 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x1000583c double_table_shim_on_use_helper + .text.__wrap___aeabi_dsub + 0x10005868 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x10005868 drsub_shim + 0x1000586e dsub_shim + .text.dadd_shim + 0x10005878 0x15c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x10005878 dadd_shim + .text.dmul_shim + 0x100059d4 0x15c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x100059d4 dmul_shim + .text.ddiv_shim + 0x10005b30 0x1b0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x10005b30 ddiv_shim + .text.double2uint_shim + 0x10005ce0 0xe CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x10005ce0 double2uint_shim + 0x10005ce2 double2ufix_shim + *fill* 0x10005cee 0x2 + .text.double2uint64_shim + 0x10005cf0 0x70 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x10005cf0 double2uint64_shim + 0x10005cf2 double2ufix64_shim + 0x10005d12 d2fix_a + .text.dunpacks + 0x10005d60 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x10005d60 dunpacks .text.__aeabi_lmul - 0x10002170 0x32 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj - 0x10002170 __wrap___aeabi_lmul - *fill* 0x100021a2 0x2 + 0x10005d9c 0x32 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj + 0x10005d9c __wrap___aeabi_lmul + *fill* 0x10005dce 0x2 .text.__aeabi_float_init - 0x100021a4 0x64 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj - 0x100021a4 __aeabi_float_init + 0x10005dd0 0x64 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + 0x10005dd0 __aeabi_float_init .text.float_table_shim_on_use_helper - 0x10002208 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj - 0x10002208 float_table_shim_on_use_helper - .text 0x10002234 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj - 0x10002234 __aeabi_mem_init - .text.memset 0x10002244 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj - 0x10002244 __wrap_memset - .text.memcpy 0x10002250 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj - 0x10002250 __wrap___aeabi_memcpy - 0x10002250 __wrap_memcpy + 0x10005e34 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + 0x10005e34 float_table_shim_on_use_helper + .text 0x10005e60 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x10005e60 __aeabi_mem_init + .text.memset 0x10005e70 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x10005e70 __wrap_memset + .text.memcpy 0x10005e7c 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x10005e7c __wrap___aeabi_memcpy + 0x10005e7c __wrap_memcpy .text.stdio_out_chars_crlf - 0x1000225c 0x94 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x10005e88 0x94 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + .text.stdio_buffered_printer + 0x10005f1c 0x64 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .text.__wrap_putchar - 0x100022f0 0x98 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj - 0x100022f0 __wrap_putchar + 0x10005f80 0x98 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x10005f80 __wrap_putchar .text.__wrap_puts - 0x10002388 0xe0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj - 0x10002388 __wrap_puts + 0x10006018 0xe0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x10006018 __wrap_puts .text.stdio_set_driver_enabled - 0x10002468 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj - 0x10002468 stdio_set_driver_enabled + 0x100060f8 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x100060f8 stdio_set_driver_enabled + .text.__wrap_vprintf + 0x10006128 0xd4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x10006128 __wrap_vprintf + .text.__wrap_printf + 0x100061fc 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x100061fc __wrap_printf .text.stdio_init_all - 0x10002498 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj - 0x10002498 stdio_init_all + 0x10006214 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x10006214 stdio_init_all .text.stdio_uart_out_chars - 0x100024a8 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x10006224 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .text.stdio_uart_in_chars - 0x100024f4 0x90 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj - 0x100024f4 stdio_uart_in_chars + 0x10006270 0x90 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x10006270 stdio_uart_in_chars .text.on_uart_rx - 0x10002584 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x10006300 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .text.stdio_uart_set_chars_available_callback - 0x100025ac 0x8c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x10006328 0x8c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .text.stdio_uart_init - 0x10002638 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj - 0x10002638 stdio_uart_init + 0x100063b4 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x100063b4 stdio_uart_init .text.resetd_init - 0x10002680 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x100063fc 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .text.resetd_reset - 0x10002684 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x10006400 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .text.resetd_open - 0x10002690 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x1000640c 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .text.resetd_xfer_cb - 0x100026b8 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x10006434 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .text.resetd_control_xfer_cb - 0x100026bc 0x60 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x10006438 0x60 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .text.usbd_app_driver_get_cb - 0x1000271c 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj - 0x1000271c usbd_app_driver_get_cb + 0x10006498 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x10006498 usbd_app_driver_get_cb .text.tud_cdc_line_coding_cb - 0x10002728 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj - 0x10002728 tud_cdc_line_coding_cb + 0x100064a4 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x100064a4 tud_cdc_line_coding_cb .text.stdio_usb_set_chars_available_callback - 0x1000275c 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - 0x1000275c stdio_usb_set_chars_available_callback - .text.usb_irq 0x10002770 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x100064d8 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x100064d8 stdio_usb_set_chars_available_callback + .text.usb_irq 0x100064ec 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .text.timer_task - 0x10002780 0x54 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x100064fc 0x54 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .text.stdio_usb_in_chars - 0x100027d4 0x90 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - 0x100027d4 stdio_usb_in_chars + 0x10006550 0x90 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x10006550 stdio_usb_in_chars .text.stdio_usb_out_chars - 0x10002864 0x104 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x100065e0 0x104 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .text.low_priority_worker_irq - 0x10002968 0xa8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x100066e4 0xa8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .text.tud_cdc_rx_cb - 0x10002a10 0x20 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - 0x10002a10 tud_cdc_rx_cb + 0x1000678c 0x20 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x1000678c tud_cdc_rx_cb .text.stdio_usb_init - 0x10002a30 0xe0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - 0x10002a30 stdio_usb_init + 0x100067ac 0xe0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x100067ac stdio_usb_init .text.tud_descriptor_device_cb - 0x10002b10 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj - 0x10002b10 tud_descriptor_device_cb + 0x1000688c 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x1000688c tud_descriptor_device_cb .text.tud_descriptor_configuration_cb - 0x10002b18 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj - 0x10002b18 tud_descriptor_configuration_cb + 0x10006894 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x10006894 tud_descriptor_configuration_cb .text.tud_descriptor_string_cb - 0x10002b20 0x78 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj - 0x10002b20 tud_descriptor_string_cb + 0x1000689c 0x78 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x1000689c tud_descriptor_string_cb .text.startup._retrieve_unique_id_on_boot - 0x10002b98 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj + 0x10006914 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj .text.pico_get_unique_board_id_string - 0x10002ba8 0x1a8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj - 0x10002ba8 pico_get_unique_board_id_string + 0x10006924 0x1a8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj + 0x10006924 pico_get_unique_board_id_string .text.flash_get_unique_id - 0x10002d50 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj - 0x10002d50 flash_get_unique_id + 0x10006acc 0x3c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj + 0x10006acc flash_get_unique_id .text.dcd_int_enable - 0x10002d8c 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002d8c dcd_int_enable + 0x10006b08 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006b08 dcd_int_enable .text.dcd_set_address - 0x10002d98 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002d98 dcd_set_address + 0x10006b14 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006b14 dcd_set_address .text.dcd_connect - 0x10002dac 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002dac dcd_connect + 0x10006b28 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006b28 dcd_connect .text.dcd_init - 0x10002dbc 0x98 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002dbc dcd_init + 0x10006b38 0x98 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006b38 dcd_init .text.dcd_edpt0_status_complete - 0x10002e54 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002e54 dcd_edpt0_status_complete + 0x10006bd0 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006bd0 dcd_edpt0_status_complete .text.dcd_edpt_open - 0x10002e70 0x108 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002e70 dcd_edpt_open + 0x10006bec 0x108 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006bec dcd_edpt_open .text.dcd_edpt_close_all - 0x10002f78 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002f78 dcd_edpt_close_all + 0x10006cf4 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006cf4 dcd_edpt_close_all .text.dcd_edpt_xfer - 0x10002f80 0x24 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002f80 dcd_edpt_xfer + 0x10006cfc 0x24 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006cfc dcd_edpt_xfer .text.dcd_edpt_stall - 0x10002fa4 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002fa4 dcd_edpt_stall + 0x10006d20 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006d20 dcd_edpt_stall .text.dcd_edpt_clear_stall - 0x10002fd8 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - 0x10002fd8 dcd_edpt_clear_stall + 0x10006d54 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10006d54 dcd_edpt_clear_stall .text.rp2040_usb_init - 0x10003008 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj - 0x10003008 rp2040_usb_init + 0x10006d84 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj + 0x10006d84 rp2040_usb_init .text.hw_endpoint_xfer_start - 0x10003054 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj - 0x10003054 hw_endpoint_xfer_start + 0x10006dd0 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj + 0x10006dd0 hw_endpoint_xfer_start .text.tud_mounted - 0x10003094 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x10003094 tud_mounted + 0x10006e10 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10006e10 tud_mounted .text.tud_suspended - 0x100030a4 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x100030a4 tud_suspended + 0x10006e20 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10006e20 tud_suspended .text.tud_inited - 0x100030b4 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x100030b4 tud_inited + 0x10006e30 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10006e30 tud_inited .text.tud_init - 0x100030c8 0xdc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x100030c8 tud_init + 0x10006e44 0xdc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10006e44 tud_init .text.tud_task_ext - 0x100031a4 0x850 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x100031a4 tud_task_ext + 0x10006f20 0x850 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10006f20 tud_task_ext .text.usbd_open_edpt_pair - 0x100039f4 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x100039f4 usbd_open_edpt_pair + 0x10007770 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10007770 usbd_open_edpt_pair .text.usbd_defer_func - 0x10003a90 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x10003a90 usbd_defer_func + 0x1000780c 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x1000780c usbd_defer_func .text.usbd_edpt_open - 0x10003ad8 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x10003ad8 usbd_edpt_open + 0x10007854 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10007854 usbd_edpt_open .text.usbd_edpt_claim - 0x10003b0c 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x10003b0c usbd_edpt_claim + 0x10007888 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10007888 usbd_edpt_claim .text.usbd_edpt_release - 0x10003b34 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x10003b34 usbd_edpt_release + 0x100078b0 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x100078b0 usbd_edpt_release .text.usbd_edpt_xfer - 0x10003b5c 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x10003b5c usbd_edpt_xfer + 0x100078d8 0x4c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x100078d8 usbd_edpt_xfer .text.tud_control_status - 0x10003ba8 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj - 0x10003ba8 tud_control_status + 0x10007924 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x10007924 tud_control_status .text.tud_control_xfer - 0x10003bd4 0xac CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj - 0x10003bd4 tud_control_xfer + 0x10007950 0xac CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x10007950 tud_control_xfer .text.usbd_control_reset - 0x10003c80 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj - 0x10003c80 usbd_control_reset + 0x100079fc 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x100079fc usbd_control_reset .text.usbd_control_set_complete_callback - 0x10003c94 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj - 0x10003c94 usbd_control_set_complete_callback + 0x10007a10 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x10007a10 usbd_control_set_complete_callback .text.usbd_control_set_request - 0x10003ca0 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj - 0x10003ca0 usbd_control_set_request + 0x10007a1c 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x10007a1c usbd_control_set_request .text.usbd_control_xfer_cb - 0x10003cbc 0xf4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj - 0x10003cbc usbd_control_xfer_cb + 0x10007a38 0xf4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x10007a38 usbd_control_xfer_cb .text.tud_cdc_n_connected - 0x10003db0 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003db0 tud_cdc_n_connected + 0x10007b2c 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007b2c tud_cdc_n_connected .text.tud_cdc_n_available - 0x10003de0 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003de0 tud_cdc_n_available + 0x10007b5c 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007b5c tud_cdc_n_available .text.tud_cdc_n_read - 0x10003df8 0x70 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003df8 tud_cdc_n_read + 0x10007b74 0x70 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007b74 tud_cdc_n_read .text.tud_cdc_n_write_flush - 0x10003e68 0x78 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003e68 tud_cdc_n_write_flush + 0x10007be4 0x78 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007be4 tud_cdc_n_write_flush .text.tud_cdc_n_write - 0x10003ee0 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003ee0 tud_cdc_n_write + 0x10007c5c 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007c5c tud_cdc_n_write .text.tud_cdc_n_write_available - 0x10003f14 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003f14 tud_cdc_n_write_available + 0x10007c90 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007c90 tud_cdc_n_write_available .text.cdcd_init - 0x10003f2c 0x7c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003f2c cdcd_init + 0x10007ca8 0x7c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007ca8 cdcd_init .text.cdcd_reset - 0x10003fa8 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003fa8 cdcd_reset + 0x10007d24 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007d24 cdcd_reset .text.cdcd_open - 0x10003fd4 0xe4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x10003fd4 cdcd_open + 0x10007d50 0xe4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007d50 cdcd_open .text.cdcd_control_xfer_cb - 0x100040b8 0xe4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x100040b8 cdcd_control_xfer_cb + 0x10007e34 0xe4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007e34 cdcd_control_xfer_cb .text.cdcd_xfer_cb - 0x1000419c 0x13c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj - 0x1000419c cdcd_xfer_cb + 0x10007f18 0x13c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x10007f18 cdcd_xfer_cb .text.tusb_init - 0x100042d8 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj - 0x100042d8 tusb_init + 0x10008054 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj + 0x10008054 tusb_init .text.tusb_inited - 0x100042e4 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj - 0x100042e4 tusb_inited + 0x10008060 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj + 0x10008060 tusb_inited .text.tu_edpt_claim - 0x100042ec 0x50 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj - 0x100042ec tu_edpt_claim + 0x10008068 0x50 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj + 0x10008068 tu_edpt_claim .text.tu_edpt_release - 0x1000433c 0x38 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj - 0x1000433c tu_edpt_release + 0x100080b8 0x38 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj + 0x100080b8 tu_edpt_release .text.tu_edpt_validate - 0x10004374 0x7c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj - 0x10004374 tu_edpt_validate + 0x100080f0 0x7c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj + 0x100080f0 tu_edpt_validate .text.tu_edpt_bind_driver - 0x100043f0 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj - 0x100043f0 tu_edpt_bind_driver + 0x1000816c 0x34 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj + 0x1000816c tu_edpt_bind_driver .text.tu_fifo_config - 0x10004424 0x6c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x10004424 tu_fifo_config + 0x100081a0 0x6c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x100081a0 tu_fifo_config .text.tu_fifo_count - 0x10004490 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x10004490 tu_fifo_count + 0x1000820c 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x1000820c tu_fifo_count .text.tu_fifo_empty - 0x100044bc 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x100044bc tu_fifo_empty + 0x10008238 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x10008238 tu_fifo_empty .text.tu_fifo_remaining - 0x100044cc 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x100044cc tu_fifo_remaining + 0x10008248 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x10008248 tu_fifo_remaining .text.tu_fifo_read - 0x100044f8 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x100044f8 tu_fifo_read + 0x10008274 0x9c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x10008274 tu_fifo_read .text.tu_fifo_read_n - 0x10004594 0xe8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x10004594 tu_fifo_read_n + 0x10008310 0xe8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x10008310 tu_fifo_read_n .text.tu_fifo_write - 0x1000467c 0xa8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x1000467c tu_fifo_write + 0x100083f8 0xa8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x100083f8 tu_fifo_write .text.tu_fifo_write_n - 0x10004724 0x178 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x10004724 tu_fifo_write_n + 0x100084a0 0x178 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x100084a0 tu_fifo_write_n .text.tu_fifo_clear - 0x1000489c 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x1000489c tu_fifo_clear + 0x10008618 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x10008618 tu_fifo_clear .text.tu_fifo_set_overwritable - 0x100048dc 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj - 0x100048dc tu_fifo_set_overwritable - .text.strlen 0x10004924 0x5c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-strlen-stub.o) - 0x10004924 strlen + 0x10008658 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x10008658 tu_fifo_set_overwritable + .text.spi_init + 0x100086a0 0x14c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj + 0x100086a0 spi_init + .text.strlen 0x100087ec 0x5c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-strlen-stub.o) + 0x100087ec strlen *(.fini) - .fini 0x10004980 0x4 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crti.o - 0x10004980 _fini - *fill* 0x10004984 0x4 - .fini.__stub 0x10004988 0xb0 linker stubs + .fini 0x10008848 0x4 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crti.o + 0x10008848 _fini + *fill* 0x1000884c 0x4 + .fini.__stub 0x10008850 0xd0 linker stubs *crtbegin.o(.ctors) *crtbegin?.o(.ctors) *(EXCLUDE_FILE(*crtend.o *crtend?.o) .ctors) @@ -2402,121 +2470,132 @@ LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-no *(SORT_BY_NAME(.dtors.*)) *(.dtors) *(.eh_frame*) - .eh_frame 0x10004a38 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o - 0x10004a38 . = ALIGN (0x4) + .eh_frame 0x10008920 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o + 0x10008920 . = ALIGN (0x4) -.glue_7 0x10004a38 0x0 - .glue_7 0x10004a38 0x0 linker stubs +.glue_7 0x10008920 0x0 + .glue_7 0x10008920 0x0 linker stubs -.glue_7t 0x10004a38 0x0 - .glue_7t 0x10004a38 0x0 linker stubs +.glue_7t 0x10008920 0x0 + .glue_7t 0x10008920 0x0 linker stubs -.vfp11_veneer 0x10004a38 0x0 - .vfp11_veneer 0x10004a38 0x0 linker stubs +.vfp11_veneer 0x10008920 0x0 + .vfp11_veneer 0x10008920 0x0 linker stubs -.v4_bx 0x10004a38 0x0 - .v4_bx 0x10004a38 0x0 linker stubs +.v4_bx 0x10008920 0x0 + .v4_bx 0x10008920 0x0 linker stubs -.iplt 0x10004a38 0x0 - .iplt 0x10004a38 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o +.iplt 0x10008920 0x0 + .iplt 0x10008920 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o -.rodata 0x10004a38 0x320 +.rodata 0x10008920 0x5d4 *(EXCLUDE_FILE(*libm.a: *libc.a:*lib_a-mem*.o *libgcc.a:) .rodata*) .rodata.main.str1.4 - 0x10004a38 0x19c CMakeFiles/radio-test.dir/radio_test.cpp.obj - 0xd (size before relaxing) + 0x10008920 0x1c0 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x19 (size before relaxing) + .rodata._ZL17RadioLoRaSymbTime + 0x10008ae0 0x90 CMakeFiles/radio-test.dir/radio.cpp.obj + .rodata._ZL10Bandwidths + 0x10008b70 0x10 CMakeFiles/radio-test.dir/radio.cpp.obj .rodata.spin_lock_claim_unused.str1.4 - 0x10004bd4 0x1b CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x10008b80 0x1b CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj .rodata.user_irq_claim_unused.str1.4 - 0x10004bd4 0x1b CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x10008b80 0x1b CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj .rodata.hardware_alarm_claim.str1.4 - 0x10004bd4 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x10008b80 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj .rodata.panic.str1.4 - 0x10004bd4 0x12 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x10008b80 0x12 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj .rodata.hard_assertion_failure.str1.4 - 0x10004bd4 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x10008b80 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + .rodata._ftoa.str1.4 + 0x10008b80 0x15 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + .rodata._vsnprintf + 0x10008b80 0x19c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + *fill* 0x10008d1c 0x4 + .rodata.pow10.0 + 0x10008d20 0x50 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .rodata.str1.4 - 0x10004bd4 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008d70 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .rodata.__bi_81 - 0x10004bd4 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008d70 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .rodata.__bi_75 - 0x10004be0 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008d7c 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .rodata.__bi_44 - 0x10004bec 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008d88 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .rodata.crlf_str.0 - 0x10004bf8 0x2 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x10008d94 0x2 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .rodata.str1.4 - 0x10004bfa 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj - *fill* 0x10004bfa 0x2 + 0x10008d96 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + *fill* 0x10008d96 0x2 .rodata.__bi_33.4 - 0x10004bfc 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x10008d98 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .rodata.__bi_34.5 - 0x10004c08 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x10008da4 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .rodata._resetd_driver - 0x10004c10 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x10008dac 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .rodata.str1.4 - 0x10004c28 0x13 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x10008dc4 0x13 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .rodata.__bi_182.0 - 0x10004c28 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x10008dc4 0xc CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .rodata.str1.4 - 0x10004c34 0x2a CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x10008dd0 0x2a CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj .rodata.usbd_desc_str - 0x10004c34 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x10008dd0 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj .rodata.usbd_desc_cfg - 0x10004c4c 0x54 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x10008de8 0x54 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj .rodata.usbd_desc_device - 0x10004ca0 0x12 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x10008e3c 0x12 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj .rodata.str1.4 - 0x10004cb2 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x10008e4e 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj .rodata.str1.4 - 0x10004cb2 0x53 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj - *fill* 0x10004cb2 0x2 + 0x10008e4e 0x53 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj + *fill* 0x10008e4e 0x2 .rodata.tud_task_ext - 0x10004cb4 0x8c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10008e50 0x8c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj .rodata._usbd_driver - 0x10004d40 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x10004d58 . = ALIGN (0x4) + 0x10008edc 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x10008ef4 . = ALIGN (0x4) *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.flashdata*))) - 0x10004d58 . = ALIGN (0x4) + 0x10008ef4 . = ALIGN (0x4) .ARM.extab *(.ARM.extab* .gnu.linkonce.armextab.*) - 0x10004d58 __exidx_start = . + 0x10008ef4 __exidx_start = . .ARM.exidx *(.ARM.exidx* .gnu.linkonce.armexidx.*) - 0x10004d58 __exidx_end = . - 0x10004d58 . = ALIGN (0x4) - 0x10004d58 __binary_info_start = . + 0x10008ef4 __exidx_end = . + 0x10008ef4 . = ALIGN (0x4) + 0x10008ef4 __binary_info_start = . -.binary_info 0x10004d58 0x28 +.binary_info 0x10008ef4 0x28 *(.binary_info.keep.*) .binary_info.keep.__bi_ptr81 - 0x10004d58 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008ef4 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .binary_info.keep.__bi_ptr75 - 0x10004d5c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008ef8 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .binary_info.keep.__bi_ptr50 - 0x10004d60 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008efc 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .binary_info.keep.__bi_ptr44 - 0x10004d64 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008f00 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .binary_info.keep.__bi_ptr38 - 0x10004d68 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008f04 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .binary_info.keep.__bi_ptr30 - 0x10004d6c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008f08 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .binary_info.keep.__bi_ptr22 - 0x10004d70 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x10008f0c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj *(.binary_info.*) .binary_info.__bi_ptr34 - 0x10004d74 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x10008f10 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .binary_info.__bi_ptr33 - 0x10004d78 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x10008f14 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .binary_info.__bi_ptr182 - 0x10004d7c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - 0x10004d80 __binary_info_end = . + 0x10008f18 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x10008f1c __binary_info_end = . -.rel.dyn 0x10004d80 0x0 - .rel.iplt 0x10004d80 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o - 0x10004d80 . = ALIGN (0x4) +.rel.dyn 0x10008f1c 0x0 + .rel.iplt 0x10008f1c 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o + 0x10008f1c . = ALIGN (0x4) .ram_vector_table 0x20000000 0xc0 @@ -2525,7 +2604,7 @@ LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-no 0x20000000 0xc0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj 0x20000000 ram_vector_table -.data 0x200000c0 0xe38 load address 0x10004d80 +.data 0x200000c0 0xf28 load address 0x10008f1c 0x200000c0 __data_start__ = . *(vtable) *(.time_critical*) @@ -2581,233 +2660,299 @@ LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-no .time_critical.tinyusb 0x20000c08 0x16c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj 0x20000c08 dcd_event_handler + .time_critical.spi_write16_read16_blocking + 0x20000d74 0x74 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj + 0x20000d74 spi_write16_read16_blocking *(.text*) - .text 0x20000d74 0x4 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) - 0x20000d74 __aeabi_ldiv0 - 0x20000d74 __aeabi_idiv0 - .text.__stub 0x20000d78 0x70 linker stubs - 0x20000de8 . = ALIGN (0x4) + .text 0x20000de8 0x4 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + 0x20000de8 __aeabi_ldiv0 + 0x20000de8 __aeabi_idiv0 + *fill* 0x20000dec 0x4 + .text.__stub 0x20000df0 0x70 linker stubs + 0x20000e60 . = ALIGN (0x4) *(.rodata*) - 0x20000de8 . = ALIGN (0x4) + 0x20000e60 . = ALIGN (0x4) *(.data*) + .data.BufferSize + 0x20000e60 0x2 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x20000e60 BufferSize + .data.mode 0x20000e62 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x20000e62 mode + .data.MaxPayloadLength + 0x20000e63 0x1 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x20000e63 MaxPayloadLength + .data.Radio 0x20000e64 0x6c CMakeFiles/radio-test.dir/radio.cpp.obj + 0x20000e64 Radio .data.striped_spin_lock_num - 0x20000de8 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj - *fill* 0x20000de9 0x3 - .data 0x20000dec 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj - 0x20000dec irq_handler_chain_slots - 0x20000e1c irq_handler_chain_first_slot - 0x20000e26 irq_handler_chain_remove_tail + 0x20000ed0 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + *fill* 0x20000ed1 0x3 + .data 0x20000ed4 0x48 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj + 0x20000ed4 irq_handler_chain_slots + 0x20000f04 irq_handler_chain_first_slot + 0x20000f0e irq_handler_chain_remove_tail .data.default_alarm_pool - 0x20000e34 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x20000f1c 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .data.default_alarm_pool_heap - 0x20000e4c 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj - *fill* 0x20000e5c 0x4 + 0x20000f34 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + *fill* 0x20000f44 0xc .data.aeabi_bits_funcs - 0x20000e60 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj - 0x20000e60 aeabi_bits_funcs - 0x20000e70 aeabi_bits_funcs_end + 0x20000f50 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + 0x20000f50 aeabi_bits_funcs + 0x20000f60 aeabi_bits_funcs_end .data.aeabi_mem_funcs - 0x20000e70 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj - 0x20000e70 aeabi_mem_funcs - 0x20000e80 aeabi_mem_funcs_end + 0x20000f60 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x20000f60 aeabi_mem_funcs + 0x20000f70 aeabi_mem_funcs_end .data.stdio_uart - 0x20000e80 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj - 0x20000e80 stdio_uart + 0x20000f70 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x20000f70 stdio_uart .data.stdio_usb - 0x20000e98 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - 0x20000e98 stdio_usb + 0x20000f88 0x18 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x20000f88 stdio_usb .data.ep_dir_string - 0x20000eb0 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj - 0x20000eb0 ep_dir_string + 0x20000fa0 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj + 0x20000fa0 ep_dir_string .data._usbd_qdef - 0x20000eb8 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x20000eb8 _usbd_qdef + 0x20000fa8 0x1c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x20000fa8 _usbd_qdef .data._usbd_rhport - 0x20000ed4 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x20000ed8 . = ALIGN (0x4) - *fill* 0x20000ed5 0x3 + 0x20000fc4 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x20000fc8 . = ALIGN (0x4) + *fill* 0x20000fc5 0x3 *(.after_data.*) - 0x20000ed8 . = ALIGN (0x4) - 0x20000ed8 PROVIDE (__mutex_array_start = .) + 0x20000fc8 . = ALIGN (0x4) + 0x20000fc8 PROVIDE (__mutex_array_start = .) *(SORT_BY_NAME(.mutex_array.*)) *(.mutex_array) - .mutex_array 0x20000ed8 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj - 0x20000ee0 PROVIDE (__mutex_array_end = .) - 0x20000ee0 . = ALIGN (0x4) - 0x20000ee0 PROVIDE (__preinit_array_start = .) + .mutex_array 0x20000fc8 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x20000fd0 PROVIDE (__mutex_array_end = .) + 0x20000fd0 . = ALIGN (0x4) + 0x20000fd0 PROVIDE (__preinit_array_start = .) *(SORT_BY_NAME(.preinit_array.*)) .preinit_array.00001 - 0x20000ee0 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x20000fd0 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj .preinit_array.00010 - 0x20000ee4 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + 0x20000fd4 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj .preinit_array.00020 - 0x20000ee8 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x20000fd8 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .preinit_array.00020 - 0x20000eec 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + 0x20000fdc 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj *(.preinit_array) - 0x20000ef0 PROVIDE (__preinit_array_end = .) - 0x20000ef0 . = ALIGN (0x4) - 0x20000ef0 PROVIDE (__init_array_start = .) + 0x20000fe0 PROVIDE (__preinit_array_end = .) + 0x20000fe0 . = ALIGN (0x4) + 0x20000fe0 PROVIDE (__init_array_start = .) *(SORT_BY_NAME(.init_array.*)) *(.init_array) - .init_array 0x20000ef0 0x4 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o - .init_array 0x20000ef4 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj - 0x20000ef8 PROVIDE (__init_array_end = .) - 0x20000ef8 . = ALIGN (0x4) + .init_array 0x20000fe0 0x4 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o + .init_array 0x20000fe4 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj + 0x20000fe8 PROVIDE (__init_array_end = .) + 0x20000fe8 . = ALIGN (0x4) [!provide] PROVIDE (__fini_array_start = .) *(SORT_BY_NAME(.fini_array.*)) *(.fini_array) [!provide] PROVIDE (__fini_array_end = .) *(.jcr) - 0x20000ef8 . = ALIGN (0x4) - 0x20000ef8 __data_end__ = . - 0x10004d80 __etext = LOADADDR (.data) + 0x20000fe8 . = ALIGN (0x4) + 0x20000fe8 __data_end__ = . + 0x10008f1c __etext = LOADADDR (.data) .tm_clone_table - 0x20000ef8 0x0 load address 0x10005bb8 + 0x20000fe8 0x0 load address 0x10009e44 .tm_clone_table - 0x20000ef8 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o + 0x20000fe8 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o .tm_clone_table - 0x20000ef8 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtend.o + 0x20000fe8 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtend.o -.igot.plt 0x20000ef8 0x0 load address 0x10005bb8 - .igot.plt 0x20000ef8 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o +.igot.plt 0x20000fe8 0x0 load address 0x10009e44 + .igot.plt 0x20000fe8 0x0 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o .uninitialized_data - 0x20000ef8 0x0 load address 0x10005bb8 - 0x20000ef8 . = ALIGN (0x4) + 0x20000fe8 0x0 load address 0x10009e44 + 0x20000fe8 . = ALIGN (0x4) *(.uninitialized_data*) -.scratch_x 0x20040000 0x0 load address 0x10005bb8 +.scratch_x 0x20040000 0x0 load address 0x10009e44 0x20040000 __scratch_x_start__ = . *(.scratch_x.*) 0x20040000 . = ALIGN (0x4) 0x20040000 __scratch_x_end__ = . - 0x10005bb8 __scratch_x_source__ = LOADADDR (.scratch_x) + 0x10009e44 __scratch_x_source__ = LOADADDR (.scratch_x) -.scratch_y 0x20041000 0x0 load address 0x10005bb8 +.scratch_y 0x20041000 0x0 load address 0x10009e44 0x20041000 __scratch_y_start__ = . *(.scratch_y.*) 0x20041000 . = ALIGN (0x4) 0x20041000 __scratch_y_end__ = . - 0x10005bb8 __scratch_y_source__ = LOADADDR (.scratch_y) + 0x10009e44 __scratch_y_source__ = LOADADDR (.scratch_y) -.bss 0x20000ef8 0xd94 - 0x20000ef8 . = ALIGN (0x4) - 0x20000ef8 __bss_start__ = . +.bss 0x20000fe8 0xf64 + 0x20000fe8 . = ALIGN (0x4) + 0x20000fe8 __bss_start__ = . *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*))) .bss.configured_freq - 0x20000ef8 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + 0x20000fe8 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj .bss.default_alarm_pool_entries - 0x20000f20 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x20001010 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .bss.last_avail_time.1 - 0x20001020 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - .bss.sd_table 0x20001028 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj - 0x20001028 sd_table - .bss.sf_table 0x20001128 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj - 0x20001128 sf_table + 0x20001110 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + .bss.sd_table 0x20001118 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + 0x20001118 sd_table + .bss.sf_table 0x20001218 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + 0x20001218 sf_table + .bss.Buffer 0x20001318 0x40 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x20001318 Buffer + .bss.FrequencyError + 0x20001358 0x4 CMakeFiles/radio-test.dir/sx126x.cpp.obj + 0x20001358 FrequencyError + .bss.RadioEvents + 0x2000135c 0x1c CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x2000135c RadioEvents + .bss.RadioEvents_Ptr + 0x20001378 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x20001378 RadioEvents_Ptr + .bss.RadioPktStatus + 0x2000137c 0x14 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x2000137c RadioPktStatus + .bss.RadioRxPayload + 0x20001390 0xff CMakeFiles/radio-test.dir/radio.cpp.obj + 0x20001390 RadioRxPayload + *fill* 0x2000148f 0x1 + .bss.RxTimeout + 0x20001490 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x20001490 RxTimeout + .bss.SX126x 0x20001494 0x3c CMakeFiles/radio-test.dir/radio.cpp.obj + 0x20001494 SX126x + .bss.TxTimeout + 0x200014d0 0x4 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x200014d0 TxTimeout + .bss._ZL18RadioPublicNetwork + 0x200014d4 0x2 CMakeFiles/radio-test.dir/radio.cpp.obj + *fill* 0x200014d6 0x2 + .bss._ZL4ints 0x200014d8 0x4 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj .bss._app_driver - 0x20001228 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x200014dc 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj .bss._cdcd_itf - 0x2000122c 0x2c8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x200014e0 0x2c8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj .bss._ctrl_xfer - 0x200014f4 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x200017a8 0x14 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj .bss._ubsd_mutexdef - 0x20001508 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x200017bc 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj .bss._usbd_ctrl_buf - 0x20001510 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x200017c4 0x40 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj .bss._usbd_dev - 0x20001550 0x53 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - *fill* 0x200015a3 0x1 + 0x20001804 0x53 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + *fill* 0x20001857 0x1 .bss._usbd_mutex - 0x200015a4 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - .bss._usbd_q 0x200015a8 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x20001858 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + .bss._usbd_q 0x2000185c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj .bss._usbd_qdef_buf - 0x200015ac 0xc0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj - 0x200015ac _usbd_qdef_buf + 0x20001860 0xc0 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x20001860 _usbd_qdef_buf .bss.alarm_callbacks - 0x2000166c 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x20001920 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj .bss.boot2_copyout - 0x2000167c 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj + 0x20001930 0x100 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj .bss.chars_available_callback - 0x2000177c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x20001a30 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .bss.chars_available_callback - 0x20001780 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x20001a34 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .bss.chars_available_param - 0x20001784 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x20001a38 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .bss.chars_available_param - 0x20001788 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - .bss.claimed 0x2000178c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x20001a3c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + .bss.claimed 0x20001a40 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj .bss.default_alarm_pool_entry_ids_high - 0x20001790 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x20001a44 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .bss.default_alarm_pool_heap_nodes - 0x200017a0 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x20001a54 0x30 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .bss.desc_str.0 - 0x200017d0 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj - .bss.drivers 0x200017f8 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x20001a84 0x28 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + .bss.drivers 0x20001aac 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .bss.e15_last_sof - 0x200017fc 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj - 0x200017fc e15_last_sof - .bss.filter 0x20001800 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x20001ab0 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj + 0x20001ab0 e15_last_sof + .bss.filter 0x20001ab4 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .bss.hw_endpoints - 0x20001804 0x400 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x20001ab8 0x400 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj .bss.lazy_vsnprintf - 0x20001c04 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + 0x20001eb8 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .bss.load_value - 0x20001c08 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + 0x20001ebc 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj .bss.next_buffer_ptr - 0x20001c0c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj - .bss.object.0 0x20001c10 0x18 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o + 0x20001ec0 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + .bss.object.0 0x20001ec4 0x18 /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o .bss.one_shot_timer_crit_sec - 0x20001c28 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj - .bss.pools 0x20001c30 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x20001edc 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + .bss.pools 0x20001ee4 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .bss.retrieved_id - 0x20001c40 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj + 0x20001ef4 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj .bss.sf_clz_func - 0x20001c48 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj - 0x20001c48 sf_clz_func + 0x20001efc 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + 0x20001efc sf_clz_func .bss.sleep_notifier - 0x20001c4c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x20001f00 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .bss.stdio_usb_mutex - 0x20001c50 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x20001f04 0x8 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .bss.target_hi - 0x20001c58 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x20001f0c 0x10 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj .bss.uart_char_to_line_feed - 0x20001c68 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj - 0x20001c68 uart_char_to_line_feed + 0x20001f1c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + 0x20001f1c uart_char_to_line_feed .bss.uart_instance - 0x20001c6c 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x20001f20 0x4 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .bss.usbd_serial_str - 0x20001c70 0x11 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x20001f24 0x11 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + .bss.IrqFired 0x20001f35 0x1 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x20001f35 IrqFired + .bss.RssiValue + 0x20001f36 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x20001f36 RssiValue + .bss.RxContinuous + 0x20001f37 0x1 CMakeFiles/radio-test.dir/radio.cpp.obj + 0x20001f37 RxContinuous + .bss.SnrValue 0x20001f38 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x20001f38 SnrValue + .bss.State 0x20001f39 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x20001f39 State + .bss._ZL10PacketType + 0x20001f3a 0x1 CMakeFiles/radio-test.dir/sx126x.cpp.obj + .bss._ZL12IrqNestLevel + 0x20001f3b 0x1 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + .bss._ZL13OperatingMode + 0x20001f3c 0x1 CMakeFiles/radio-test.dir/sx126x.cpp.obj + .bss._ZL15ImageCalibrated + 0x20001f3d 0x1 CMakeFiles/radio-test.dir/sx126x.cpp.obj .bss._app_driver_count - 0x20001c81 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x20001f3e 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj .bss._sof_enable - 0x20001c82 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x20001f3f 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj .bss.boot2_copyout_valid - 0x20001c83 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj - .bss.claimed 0x20001c84 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x20001f40 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj + .bss.claimed 0x20001f41 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + .bss.i 0x20001f42 0x1 CMakeFiles/radio-test.dir/radio_test.cpp.obj + 0x20001f42 i .bss.irq_hander_chain_free_slot_head - 0x20001c85 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj - .bss.itf_num 0x20001c86 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x20001f43 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + .bss.itf_num 0x20001f44 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .bss.low_priority_irq_num - 0x20001c87 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x20001f45 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .bss.one_shot_timer_pending - 0x20001c88 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x20001f46 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .bss.timer_callbacks_pending - 0x20001c89 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x20001f47 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj .bss.user_irq_claimed - 0x20001c8a 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x20001f48 0x1 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj *(COMMON) - 0x20001c8c . = ALIGN (0x4) - *fill* 0x20001c8b 0x1 - 0x20001c8c __bss_end__ = . + 0x20001f4c . = ALIGN (0x4) + *fill* 0x20001f49 0x3 + 0x20001f4c __bss_end__ = . -.heap 0x20001c8c 0x800 - 0x20001c8c __end__ = . - 0x20001c8c end = __end__ +.heap 0x20001f4c 0x800 + 0x20001f4c __end__ = . + 0x20001f4c end = __end__ *(.heap*) - .heap 0x20001c8c 0x800 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj - 0x2000248c __HeapLimit = . + .heap 0x20001f4c 0x800 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + 0x2000274c __HeapLimit = . .stack1_dummy *(.stack1*) @@ -2816,8 +2961,8 @@ LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-no *(.stack*) .stack 0x20041000 0x800 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj -.flash_end 0x10005bb8 0x0 - 0x10005bb8 PROVIDE (__flash_binary_end = .) +.flash_end 0x10009e44 0x0 + 0x10009e44 PROVIDE (__flash_binary_end = .) 0x20040000 __StackLimit = (ORIGIN (RAM) + LENGTH (RAM)) 0x20041000 __StackOneTop = (ORIGIN (SCRATCH_X) + LENGTH (SCRATCH_X)) 0x20042000 __StackTop = (ORIGIN (SCRATCH_Y) + LENGTH (SCRATCH_Y)) @@ -2900,7 +3045,7 @@ LOAD CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Cod LOAD CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj LOAD CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj LOAD CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj -LOAD /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccwrjwj8.o +LOAD /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccPdOwc6.o LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libstdc++.a LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libm.a START GROUP @@ -2926,112 +3071,122 @@ LOAD linker stubs .ARM.attributes 0x0000004a 0x2c CMakeFiles/radio-test.dir/radio_test.cpp.obj .ARM.attributes - 0x00000076 0x2c CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + 0x00000076 0x2c CMakeFiles/radio-test.dir/radio.cpp.obj + .ARM.attributes + 0x000000a2 0x2c CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + .ARM.attributes + 0x000000ce 0x2c CMakeFiles/radio-test.dir/sx126x.cpp.obj + .ARM.attributes + 0x000000fa 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + .ARM.attributes + 0x00000126 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj .ARM.attributes - 0x000000a2 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + 0x00000152 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj .ARM.attributes - 0x000000ce 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + 0x0000017e 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj .ARM.attributes - 0x000000fa 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + 0x000001aa 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj .ARM.attributes - 0x00000126 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x000001d6 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj .ARM.attributes - 0x00000152 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x000001f8 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj .ARM.attributes - 0x0000017e 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj + 0x00000224 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj .ARM.attributes - 0x000001a0 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj + 0x00000250 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj .ARM.attributes - 0x000001cc 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj + 0x0000027c 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .ARM.attributes - 0x000001f8 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj + 0x000002a8 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj .ARM.attributes - 0x00000224 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x000002d4 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj .ARM.attributes - 0x00000250 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x00000300 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj .ARM.attributes - 0x0000027c 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj + 0x0000032c 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj .ARM.attributes - 0x000002a8 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + 0x00000358 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj .ARM.attributes - 0x000002d4 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + 0x00000384 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj .ARM.attributes - 0x00000300 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + 0x000003b0 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj .ARM.attributes - 0x0000032c 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + 0x000003dc 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj .ARM.attributes - 0x00000358 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + 0x00000408 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .ARM.attributes - 0x00000384 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x00000434 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj .ARM.attributes - 0x000003b0 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + 0x00000456 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj .ARM.attributes - 0x000003dc 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + 0x00000482 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj .ARM.attributes - 0x000003fe 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + 0x000004a4 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .ARM.attributes - 0x0000042a 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + 0x000004c6 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj .ARM.attributes - 0x0000044c 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x000004f2 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj .ARM.attributes - 0x0000046e 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + 0x0000051e 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .ARM.attributes - 0x0000049a 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x00000540 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj .ARM.attributes - 0x000004bc 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj + 0x00000562 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj .ARM.attributes - 0x000004de 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + 0x00000584 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj .ARM.attributes - 0x00000500 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + 0x000005b0 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj .ARM.attributes - 0x0000052c 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + 0x000005d2 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj .ARM.attributes - 0x0000054e 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x000005f4 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj .ARM.attributes - 0x00000570 0x22 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + 0x00000616 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .ARM.attributes - 0x00000592 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x00000642 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .ARM.attributes - 0x000005be 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x0000066e 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .ARM.attributes - 0x000005ea 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x0000069a 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .ARM.attributes - 0x00000616 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x000006c6 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .ARM.attributes - 0x00000642 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x000006f2 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj .ARM.attributes - 0x0000066e 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x0000071e 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj .ARM.attributes - 0x0000069a 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj + 0x0000074a 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj .ARM.attributes - 0x000006c6 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj + 0x00000776 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj .ARM.attributes - 0x000006f2 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x000007a2 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj .ARM.attributes - 0x0000071e 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj + 0x000007ce 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj .ARM.attributes - 0x0000074a 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x000007fa 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj .ARM.attributes - 0x00000776 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x00000826 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj .ARM.attributes - 0x000007a2 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x00000852 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj .ARM.attributes - 0x000007ce 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj + 0x0000087e 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj .ARM.attributes - 0x000007fa 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x000008aa 0x2c CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .ARM.attributes - 0x00000826 0x22 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccwrjwj8.o + 0x000008d6 0x22 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccPdOwc6.o .ARM.attributes - 0x00000848 0x1e /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + 0x000008f8 0x1e /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) .ARM.attributes - 0x00000866 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-strlen-stub.o) + 0x00000916 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-strlen-stub.o) .ARM.attributes - 0x00000892 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtend.o + 0x00000942 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtend.o .comment 0x00000000 0x44 .comment 0x00000000 0x44 CMakeFiles/radio-test.dir/radio_test.cpp.obj 0x45 (size before relaxing) + .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/radio.cpp.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/sx126x-board.cpp.obj + .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/sx126x.cpp.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj @@ -3052,6 +3207,7 @@ LOAD linker stubs .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj @@ -3068,6 +3224,7 @@ LOAD linker stubs .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + .comment 0x00000044 0x45 CMakeFiles/radio-test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .debug_line_str 0x00000000 0xd2 diff --git a/Code/BITS/BITSv5/radio-test/radio_test.cpp b/Code/BITS/BITSv5/radio-test/radio_test.cpp index 534cf8a8..c81dbf09 100644 --- a/Code/BITS/BITSv5/radio-test/radio_test.cpp +++ b/Code/BITS/BITSv5/radio-test/radio_test.cpp @@ -64,8 +64,65 @@ int main() { SX126xIoInit(); // Initializes the radio I/Os pins + spi_init(spi0, 2000000); + + // Radio initialization + RadioEvents.TxDone = OnTxDone; + RadioEvents.RxDone = OnRxDone; + RadioEvents.TxTimeout = OnTxTimeout; + RadioEvents.RxTimeout = OnRxTimeout; + RadioEvents.RxError = OnRxError; + + Radio.Init(&RadioEvents); + Radio.SetChannel(RF_FREQUENCY); + + Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, + LORA_SPREADING_FACTOR, LORA_CODINGRATE, + LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, true, 0, + 0, LORA_IQ_INVERSION_ON, 3000); + + Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, + LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, + LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, true, + 0, 0, LORA_IQ_INVERSION_ON, true); + + if (USER_MODE_RX == mode) { + Radio.Rx(0); + printf("Now is RX"); + } else { + Radio.Send((uint8_t *)&i, 1); + } + while (true) { printf("Hello, BITS!\n"); sleep_ms(1000); } +} +void OnTxDone(void) { + // Radio.Sleep( ); + State = TX; +} + +void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) { + // Radio.Sleep( ); + BufferSize = size; + memcpy(Buffer, payload, BufferSize); + RssiValue = rssi; + SnrValue = snr; + State = RX; +} + +void OnTxTimeout(void) { + // Radio.Sleep( ); + State = TX_TIMEOUT; +} + +void OnRxTimeout(void) { + // Radio.Sleep( ); + State = RX_TIMEOUT; +} + +void OnRxError(void) { + // Radio.Sleep( ); + State = RX_ERROR; } \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/BuildOpt.h b/Code/BITS/BITSv5/radio-test/radiolib-src/BuildOpt.h new file mode 100644 index 00000000..324a7fbe --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/BuildOpt.h @@ -0,0 +1,519 @@ +#if !defined(_RADIOLIB_BUILD_OPTIONS_H) +#define _RADIOLIB_BUILD_OPTIONS_H + +#if ARDUINO >= 100 + // Arduino build + #include "Arduino.h" + #define RADIOLIB_BUILD_ARDUINO +#else + // generic build + #include + #define RADIOLIB_BUILD_GENERIC +#endif + +#if defined(RADIOLIB_BUILD_ARDUINO) +/* + * Platform-specific configuration. + * + * RADIOLIB_PLATFORM - platform name, used in debugging to quickly check the correct platform is detected. + * RADIOLIB_NC - alias for unused pin, usually the largest possible value of uint8_t. + * RADIOLIB_DEFAULT_SPI - default SPIClass instance to use. + * RADIOLIB_NONVOLATILE - macro to place variable into program storage (usually Flash). + * RADIOLIB_NONVOLATILE_READ_BYTE - function/macro to read variables saved in program storage (usually Flash). + * RADIOLIB_TYPE_ALIAS - construct to create an alias for a type, usually vai the `using` keyword. + * RADIOLIB_TONE_UNSUPPORTED - some platforms do not have tone()/noTone(), which is required for AFSK. + * RADIOLIB_BUILTIN_MODULE - some platforms have a builtin radio module on fixed pins, this macro is used to specify that pinout. + * + * In addition, some platforms may require RadioLib to disable specific drivers (such as ESP8266). + * + * Users may also specify their own configuration by uncommenting the RADIOLIB_CUSTOM_ARDUINO, + * and then specifying all platform parameters in the section below. This will override automatic + * platform detection. + */ + + // uncomment to enable custom platform definition + //#define RADIOLIB_CUSTOM_ARDUINO + +#if defined(RADIOLIB_CUSTOM_ARDUINO) + // name for your platform + #define RADIOLIB_PLATFORM "Custom" + + // the following must be defined if the Arduino core does not support tone or yield function + //#define RADIOLIB_TONE_UNSUPPORTED + //#define RADIOLIB_YIELD_UNSUPPORTED + + // in addition, the following macros may be defined if the Arduino core differs from the defaults + #define RADIOLIB_NC (0xFFFFFFFF) + #define RADIOLIB_DEFAULT_SPI SPI + #define RADIOLIB_DEFAULT_SPI_SETTINGS SPISettings(2000000, MSBFIRST, SPI_MODE0) + #define RADIOLIB_NONVOLATILE PROGMEM + #define RADIOLIB_NONVOLATILE_READ_BYTE(addr) pgm_read_byte(addr) + #define RADIOLIB_NONVOLATILE_READ_DWORD(addr) pgm_read_dword(addr) + #define RADIOLIB_TYPE_ALIAS(type, alias) using alias = type; + + // you might also have to define these if the Arduino core has some uncommon pin mode/status types + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST + + // some of RadioLib drivers may be excluded, to prevent collisions with platforms (or to speed up build process) + // the following is a complete list of all possible exclusion macros, uncomment any of them to disable that driver + // NOTE: Some of the exclusion macros are dependent on each other. For example, it is not possible to exclude RF69 + // while keeping SX1231 (because RF69 is the base class for SX1231). The dependency is always uni-directional, + // so excluding SX1231 and keeping RF69 is valid. + //#define RADIOLIB_EXCLUDE_CC1101 + //#define RADIOLIB_EXCLUDE_NRF24 + //#define RADIOLIB_EXCLUDE_RF69 + //#define RADIOLIB_EXCLUDE_SX1231 // dependent on RADIOLIB_EXCLUDE_RF69 + //#define RADIOLIB_EXCLUDE_SI443X + //#define RADIOLIB_EXCLUDE_RFM2X // dependent on RADIOLIB_EXCLUDE_SI443X + //#define RADIOLIB_EXCLUDE_SX127X + //#define RADIOLIB_EXCLUDE_SX126X + //#define RADIOLIB_EXCLUDE_STM32WLX // dependent on RADIOLIB_EXCLUDE_SX126X + //#define RADIOLIB_EXCLUDE_SX128X + //#define RADIOLIB_EXCLUDE_AFSK + //#define RADIOLIB_EXCLUDE_AX25 + //#define RADIOLIB_EXCLUDE_HELLSCHREIBER + //#define RADIOLIB_EXCLUDE_MORSE + //#define RADIOLIB_EXCLUDE_RTTY + //#define RADIOLIB_EXCLUDE_SSTV + //#define RADIOLIB_EXCLUDE_DIRECT_RECEIVE + +#elif defined(__AVR__) && !(defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_ARCH_MEGAAVR)) + // Arduino AVR boards (except for megaAVR) - Uno, Mega etc. + #define RADIOLIB_PLATFORM "Arduino AVR" + +#elif defined(ESP8266) + // ESP8266 boards + #define RADIOLIB_PLATFORM "ESP8266" + +#elif defined(ESP32) || defined(ARDUINO_ARCH_ESP32) + #define RADIOLIB_ESP32 + + // ESP32 boards + #define RADIOLIB_PLATFORM "ESP32" + + // ESP32 doesn't support tone(), but it can be emulated via LED control peripheral + #define RADIOLIB_TONE_UNSUPPORTED + #define RADIOLIB_TONE_ESP32_CHANNEL (1) + +#elif defined(ARDUINO_ARCH_STM32) + // official STM32 Arduino core (https://github.com/stm32duino/Arduino_Core_STM32) + #define RADIOLIB_PLATFORM "Arduino STM32 (official)" + +#elif defined(SAMD_SERIES) + // Adafruit SAMD boards (M0 and M4) + #define RADIOLIB_PLATFORM "Adafruit SAMD" + #define RADIOLIB_EEPROM_UNSUPPORTED + +#elif defined(ARDUINO_ARCH_SAMD) + // Arduino SAMD (Zero, MKR, etc.) + #define RADIOLIB_PLATFORM "Arduino SAMD" + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode) + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus) + #define RADIOLIB_EEPROM_UNSUPPORTED + +#elif defined(__SAM3X8E__) + // Arduino Due + #define RADIOLIB_PLATFORM "Arduino Due" + #define RADIOLIB_TONE_UNSUPPORTED + #define RADIOLIB_EEPROM_UNSUPPORTED + +#elif (defined(NRF52832_XXAA) || defined(NRF52840_XXAA)) && !defined(ARDUINO_ARDUINO_NANO33BLE) + // Adafruit nRF52 boards + #define RADIOLIB_PLATFORM "Adafruit nRF52" + #define RADIOLIB_EEPROM_UNSUPPORTED + +#elif defined(ARDUINO_ARC32_TOOLS) + // Intel Curie + #define RADIOLIB_PLATFORM "Intel Curie" + +#elif defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_AVR_NANO_EVERY) || defined(PORTDUINO) + // Arduino megaAVR boards - Uno Wifi Rev.2, Nano Every + #define RADIOLIB_PLATFORM "Arduino megaAVR" + +#elif defined(ARDUINO_ARCH_APOLLO3) + // Sparkfun Apollo3 boards + #define RADIOLIB_PLATFORM "Sparkfun Apollo3" + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (Arduino_PinMode) + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus) + +#elif defined(ARDUINO_ARDUINO_NANO33BLE) + // Arduino Nano 33 BLE + #define RADIOLIB_PLATFORM "Arduino Nano 33 BLE" + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode) + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus) + #define RADIOLIB_EEPROM_UNSUPPORTED + + // Arduino mbed OS boards have a really bad tone implementation which will crash after a couple seconds + #define RADIOLIB_TONE_UNSUPPORTED + #define RADIOLIB_MBED_TONE_OVERRIDE + +#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_PORTENTA_H7_M4) + // Arduino Portenta H7 + #define RADIOLIB_PLATFORM "Portenta H7" + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode) + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus) + #define RADIOLIB_EEPROM_UNSUPPORTED + + // Arduino mbed OS boards have a really bad tone implementation which will crash after a couple seconds + #define RADIOLIB_TONE_UNSUPPORTED + #define RADIOLIB_MBED_TONE_OVERRIDE + +#elif defined(__STM32F4__) || defined(__STM32F1__) + // Arduino STM32 core by Roger Clark (https://github.com/rogerclarkmelbourne/Arduino_STM32) + #define RADIOLIB_PLATFORM "STM32duino (unofficial)" + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (WiringPinMode) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (ExtIntTriggerMode) + +#elif defined(ARDUINO_ARCH_MEGAAVR) + // MegaCoreX by MCUdude (https://github.com/MCUdude/MegaCoreX) + #define RADIOLIB_PLATFORM "MegaCoreX" + +#elif defined(ARDUINO_ARCH_MBED_RP2040) + // Raspberry Pi Pico (official mbed core) + #define RADIOLIB_PLATFORM "Raspberry Pi Pico" + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode) + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus) + #define RADIOLIB_EEPROM_UNSUPPORTED + + // Arduino mbed OS boards have a really bad tone implementation which will crash after a couple seconds + #define RADIOLIB_TONE_UNSUPPORTED + #define RADIOLIB_MBED_TONE_OVERRIDE + +#elif defined(ARDUINO_ARCH_RP2040) + // Raspberry Pi Pico (unofficial core) + #define RADIOLIB_PLATFORM "Raspberry Pi Pico (unofficial)" + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode) + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus) + +#elif defined(__ASR6501__) || defined(ARDUINO_ARCH_ASR650X) || defined(DARDUINO_ARCH_ASR6601) + // CubeCell + #define RADIOLIB_PLATFORM "CubeCell" + #define RADIOLIB_DEFAULT_SPI_SETTINGS SPISettings(1000000, MSBFIRST, SPI_MODE0) // see issue #709 + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PINMODE) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (IrqModes) + + // provide an easy access to the on-board module + #include "board-config.h" + #define RADIOLIB_BUILTIN_MODULE RADIO_NSS, RADIO_DIO_1, RADIO_RESET, RADIO_BUSY + + // CubeCell doesn't seem to define nullptr, let's do something like that now + #define nullptr NULL + + // ... and also defines pinMode() as a macro, which is by far the stupidest thing I have seen on Arduino + #undef pinMode + + // ... and uses an outdated GCC which does not support type aliases + #define RADIOLIB_TYPE_ALIAS(type, alias) typedef class type alias; + + // ... and it also has no tone(). This platform was designed by an idiot. + #define RADIOLIB_TONE_UNSUPPORTED + + // ... AND as the (hopefully) final nail in the coffin, IT F*CKING DEFINES YIELD() AS A MACRO THAT DOES NOTHING!!! + #define RADIOLIB_YIELD_UNSUPPORTED + #if defined(yield) + #undef yield + #endif + +#elif defined(RASPI) + // RaspiDuino framework (https://github.com/me-no-dev/RasPiArduino) + #define RADIOLIB_PLATFORM "RasPiArduino" + + // let's start off easy - no tone on this platform, that can happen + #define RADIOLIB_TONE_UNSUPPORTED + + // hmm, no yield either - weird on something like Raspberry PI, but sure, we can handle it + #define RADIOLIB_YIELD_UNSUPPORTED + + // aight, getting to the juicy stuff - PGM_P seems missing, that's the first time + #define PGM_P const char * + + // ... and for the grand finale, we have millis() and micros() DEFINED AS MACROS! + #if defined(millis) + #undef millis + inline unsigned long millis() { return((unsigned long)(STCV / 1000)); }; + #endif + + #if defined(micros) + #undef micros + inline unsigned long micros() { return((unsigned long)(STCV)); }; + #endif + +#elif defined(TEENSYDUINO) + // Teensy + #define RADIOLIB_PLATFORM "Teensy" + +#elif defined(ARDUINO_ARCH_RENESAS) + // Arduino Renesas (UNO R4) + #define RADIOLIB_PLATFORM "Arduino Renesas (UNO R4)" + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode) + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus) + +#else + // other Arduino platforms not covered by the above list - this may or may not work + #define RADIOLIB_PLATFORM "Unknown Arduino" + #define RADIOLIB_UNKNOWN_PLATFORM + +#endif + + // set the default values for all macros + // these will be applied if they were not defined above + #if !defined(RADIOLIB_NC) + #define RADIOLIB_NC (0xFFFFFFFF) + #endif + + #if !defined(RADIOLIB_DEFAULT_SPI) + #define RADIOLIB_DEFAULT_SPI SPI + #endif + + #if !defined(RADIOLIB_DEFAULT_SPI_SETTINGS) + #define RADIOLIB_DEFAULT_SPI_SETTINGS SPISettings(2000000, MSBFIRST, SPI_MODE0) + #endif + + #if !defined(RADIOLIB_NONVOLATILE) + #define RADIOLIB_NONVOLATILE PROGMEM + #endif + + #if !defined(RADIOLIB_NONVOLATILE_PTR) + #define RADIOLIB_NONVOLATILE_PTR PGM_P + #endif + + #if !defined(RADIOLIB_NONVOLATILE_READ_BYTE) + #define RADIOLIB_NONVOLATILE_READ_BYTE(addr) pgm_read_byte(addr) + #endif + + #if !defined(RADIOLIB_NONVOLATILE_READ_DWORD) + #define RADIOLIB_NONVOLATILE_READ_DWORD(addr) pgm_read_dword(addr) + #endif + + #if !defined(RADIOLIB_TYPE_ALIAS) + #define RADIOLIB_TYPE_ALIAS(type, alias) using alias = type; + #endif + + #if !defined(RADIOLIB_ARDUINOHAL_PIN_MODE_CAST) + #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST + #endif + + #if !defined(RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST) + #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST + #endif + + #if !defined(RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST) + #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST + #endif + +#else + // generic non-Arduino platform + #define RADIOLIB_PLATFORM "Generic" + + #define RADIOLIB_NC (0xFF) + #define RADIOLIB_NONVOLATILE + #define RADIOLIB_NONVOLATILE_READ_BYTE(addr) (*((uint8_t *)(void *)(addr))) + #define RADIOLIB_NONVOLATILE_READ_DWORD(addr) (*((uint32_t *)(void *)(addr))) + #define RADIOLIB_TYPE_ALIAS(type, alias) using alias = type; + + #if !defined(RADIOLIB_DEBUG_PORT) + #define RADIOLIB_DEBUG_PORT stdout + #endif + + #define DEC 10 + #define HEX 16 + #define OCT 8 + #define BIN 2 + + #include + +#endif + +/* + * Uncomment to enable debug output. + * Warning: Debug output will slow down the whole system significantly. + * Also, it will result in larger compiled binary. + * Levels: debug - only main info + * verbose - full transcript of all SPI communication + */ +#if !defined(RADIOLIB_DEBUG) + //#define RADIOLIB_DEBUG +#endif +#if !defined(RADIOLIB_VERBOSE) + //#define RADIOLIB_VERBOSE +#endif + +// set which output port should be used for debug output +// may be Serial port (on Arduino) or file like stdout or stderr (on generic platforms) +#if defined(RADIOLIB_BUILD_ARDUINO) && !defined(RADIOLIB_DEBUG_PORT) + #define RADIOLIB_DEBUG_PORT Serial +#endif + +/* + * Uncomment to enable "paranoid" SPI mode + * Every write to an SPI register using SPI set function will be verified by a subsequent read operation. + * This improves reliability, but slightly slows down communication. + * Note: Enabled by default. + */ +#if !defined(RADIOLIB_SPI_PARANOID) + #define RADIOLIB_SPI_PARANOID +#endif + +/* + * Uncomment to enable parameter range checking + * RadioLib will check provided parameters (such as frequency) against limits determined by the device manufacturer. + * It is highly advised to keep this macro defined, removing it will allow invalid values to be set, + * possibly leading to bricked module and/or program crashing. + * Note: Enabled by default. + */ +#if !defined(RADIOLIB_CHECK_PARAMS) + #define RADIOLIB_CHECK_PARAMS +#endif + +/* + * Uncomment to enable SX127x errata fix + * Warning: SX127x errata fix has been reported to cause issues with LoRa bandwidths lower than 62.5 kHz. + * It should only be enabled if you really are observing some errata-related issue. + * Note: Disabled by default. + */ +#if !defined(RADIOLIB_FIX_ERRATA_SX127X) + //#define RADIOLIB_FIX_ERRATA_SX127X +#endif + +/* + * Uncomment to enable god mode - all methods and member variables in all classes will be made public, thus making them accessible from Arduino code. + * Warning: Come on, it's called GOD mode - obviously only use this if you know what you're doing. + * Failure to heed the above warning may result in bricked module. + */ +#if !defined(RADIOLIB_GODMODE) + //#define RADIOLIB_GODMODE +#endif + +/* + * Uncomment to enable low-level hardware access + * This will make some hardware methods like SPI get/set accessible from the user sketch - think of it as "god mode lite" + * Warning: RadioLib won't stop you from writing invalid stuff into your device, so it's quite easy to brick your module with this. + */ +#if !defined(RADIOLIB_LOW_LEVEL) + //#define RADIOLIB_LOW_LEVEL +#endif + +/* + * Uncomment to enable pre-defined modules when using RadioShield. + */ +#if !defined(RADIOLIB_RADIOSHIELD) + //#define RADIOLIB_RADIOSHIELD +#endif + +/* + * Uncomment to enable interrupt-based timing control + * For details, see https://github.com/jgromes/RadioLib/wiki/Interrupt-Based-Timing + */ +#if !defined(RADIOLIB_INTERRUPT_TIMING) + //#define RADIOLIB_INTERRUPT_TIMING +#endif + +/* + * Uncomment to enable static-only memory management: no dynamic allocation will be performed. + * Warning: Large static arrays will be created in some methods. It is not advised to send large packets in this mode. + */ +#if !defined(RADIOLIB_STATIC_ONLY) + //#define RADIOLIB_STATIC_ONLY +#endif + +// set the size of static arrays to use +#if !defined(RADIOLIB_STATIC_ARRAY_SIZE) + #define RADIOLIB_STATIC_ARRAY_SIZE (256) +#endif + +// the base address for persistent storage +// some protocols (e.g. LoRaWAN) require a method +// to store some data persistently +// on Arduino, this will use EEPROM, on non-Arduino platform, +// it will use anything provided by the hardware abstraction layer +// RadioLib will place these starting at this address +#if !defined(RADIOLIB_HAL_PERSISTENT_STORAGE_BASE) + #define RADIOLIB_HAL_PERSISTENT_STORAGE_BASE (0) +#endif + +// the amount of space allocated to the persistent storage +#if !defined(RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE) + #define RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE (0xD0) +#endif + +// This only compiles on STM32 boards with SUBGHZ module, but also +// include when generating docs +#if (!defined(ARDUINO_ARCH_STM32) || !defined(SUBGHZSPI_BASE)) && !defined(DOXYGEN) + #define RADIOLIB_EXCLUDE_STM32WLX +#endif + +#if defined(RADIOLIB_DEBUG) + #if defined(RADIOLIB_BUILD_ARDUINO) + #define RADIOLIB_DEBUG_PRINT(...) Module::serialPrintf(__VA_ARGS__) + #define RADIOLIB_DEBUG_PRINTLN(M, ...) Module::serialPrintf(M "\n", ##__VA_ARGS__) + + // some platforms do not support printf("%f"), so it has to be done this way + #define RADIOLIB_DEBUG_PRINT_FLOAT(VAL, DECIMALS) RADIOLIB_DEBUG_PORT.print(VAL, DECIMALS) + #else + #if !defined(RADIOLIB_DEBUG_PRINT) + #define RADIOLIB_DEBUG_PRINT(...) fprintf(RADIOLIB_DEBUG_PORT, __VA_ARGS__) + #endif + #if !defined(RADIOLIB_DEBUG_PRINTLN) + #define RADIOLIB_DEBUG_PRINTLN(M, ...) fprintf(RADIOLIB_DEBUG_PORT, M "\n", ##__VA_ARGS__) + #endif + #define RADIOLIB_DEBUG_PRINT_FLOAT(VAL, DECIMALS) RADIOLIB_DEBUG_PRINT("%.3f", VAL) + #endif + #define RADIOLIB_DEBUG_HEXDUMP(...) Module::hexdump(__VA_ARGS__) +#else + #define RADIOLIB_DEBUG_PRINT(...) {} + #define RADIOLIB_DEBUG_PRINTLN(...) {} + #define RADIOLIB_DEBUG_PRINT_FLOAT(VAL, DECIMALS) {} + #define RADIOLIB_DEBUG_HEXDUMP(...) {} +#endif + +#if defined(RADIOLIB_VERBOSE) + #define RADIOLIB_VERBOSE_PRINT(...) RADIOLIB_DEBUG_PRINT(__VA_ARGS__) + #define RADIOLIB_VERBOSE_PRINTLN(...) RADIOLIB_DEBUG_PRINTLN(__VA_ARGS__) +#else + #define RADIOLIB_VERBOSE_PRINT(...) {} + #define RADIOLIB_VERBOSE_PRINTLN(...) {} +#endif + +/*! + \brief A simple assert macro, will return on error. +*/ +#define RADIOLIB_ASSERT(STATEVAR) { if((STATEVAR) != RADIOLIB_ERR_NONE) { return(STATEVAR); } } + +/*! + \brief Macro to check variable is within constraints - this is commonly used to check parameter ranges. Requires RADIOLIB_CHECK_RANGE to be enabled +*/ +#if defined(RADIOLIB_CHECK_PARAMS) + #define RADIOLIB_CHECK_RANGE(VAR, MIN, MAX, ERR) { if(!(((VAR) >= (MIN)) && ((VAR) <= (MAX)))) { return(ERR); } } +#else + #define RADIOLIB_CHECK_RANGE(VAR, MIN, MAX, ERR) {} +#endif + +#if defined(RADIOLIB_FIX_ERRATA_SX127X) + #define RADIOLIB_ERRATA_SX127X(...) { errataFix(__VA_ARGS__); } +#else + #define RADIOLIB_ERRATA_SX127X(...) {} +#endif + +// these macros are usually defined by Arduino, but some platforms undef them, so its safer to use our own +#define RADIOLIB_MIN(a,b) ((a)<(b)?(a):(b)) +#define RADIOLIB_MAX(a,b) ((a)>(b)?(a):(b)) +#define RADIOLIB_ABS(x) ((x)>0?(x):-(x)) + +// version definitions +#define RADIOLIB_VERSION_MAJOR (0x06) +#define RADIOLIB_VERSION_MINOR (0x02) +#define RADIOLIB_VERSION_PATCH (0x00) +#define RADIOLIB_VERSION_EXTRA (0x00) + +#define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MINOR << 16) | (RADIOLIB_VERSION_PATCH << 8) | (RADIOLIB_VERSION_EXTRA)) + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/BuildOptUser.h b/Code/BITS/BITSv5/radio-test/radiolib-src/BuildOptUser.h new file mode 100644 index 00000000..5df3c2be --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/BuildOptUser.h @@ -0,0 +1,11 @@ +#if !defined(_RADIOLIB_USER_BUILD_OPTIONS_H) +#define _RADIOLIB_USER_BUILD_OPTIONS_H + +// this file can be used to define any user build options +// most commonly, RADIOLIB_EXCLUDE_* macros +// or enabling debug output + +//#define RADIOLIB_DEBUG +//#define RADIOLIB_VERBOSE + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/Hal.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/Hal.cpp new file mode 100644 index 00000000..6ba08bb7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/Hal.cpp @@ -0,0 +1,82 @@ +#include "Hal.h" + +RadioLibHal::RadioLibHal(const uint32_t input, const uint32_t output, const uint32_t low, const uint32_t high, const uint32_t rising, const uint32_t falling) + : GpioModeInput(input), + GpioModeOutput(output), + GpioLevelLow(low), + GpioLevelHigh(high), + GpioInterruptRising(rising), + GpioInterruptFalling(falling) {} + +void RadioLibHal::init() { + +} + +void RadioLibHal::term() { + +} + +void RadioLibHal::tone(uint32_t pin, unsigned int frequency, unsigned long duration) { + (void)pin; + (void)frequency; + (void)duration; +} + +void RadioLibHal::noTone(uint32_t pin) { + (void)pin; +} + +void RadioLibHal::yield() { + +} + +uint32_t RadioLibHal::pinToInterrupt(uint32_t pin) { + return(pin); +} + +void RadioLibHal::readPersistentStorage(uint32_t addr, uint8_t* buff, size_t len) { + // these are only needed for some protocols, so it's not needed to have them by default + (void)addr; + (void)buff; + (void)len; +} + +void RadioLibHal::writePersistentStorage(uint32_t addr, uint8_t* buff, size_t len) { + // these are only needed for some protocols, so it's not needed to have them by default + (void)addr; + (void)buff; + (void)len; +} + +void RadioLibHal::wipePersistentStorage() { + uint8_t dummy = 0; + for(size_t i = 0; i < RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE; i++) { + this->writePersistentStorage(RADIOLIB_HAL_PERSISTENT_STORAGE_BASE + i, &dummy, sizeof(uint8_t)); + } +} + +uint32_t RadioLibHal::getPersistentAddr(uint32_t id) { + return(RadioLibPersistentParamTable[id]); +} + +template +void RadioLibHal::setPersistentParameter(uint32_t id, T val) { + uint8_t *ptr = (uint8_t*)&val; + this->writePersistentStorage(RADIOLIB_HAL_PERSISTENT_STORAGE_BASE + RadioLibPersistentParamTable[id], ptr, sizeof(T)); +} + +template void RadioLibHal::setPersistentParameter(uint32_t id, uint8_t val); +template void RadioLibHal::setPersistentParameter(uint32_t id, uint16_t val); +template void RadioLibHal::setPersistentParameter(uint32_t id, uint32_t val); + +template +T RadioLibHal::getPersistentParameter(uint32_t id) { + T val = 0; + uint8_t *ptr = (uint8_t*)&val; + this->readPersistentStorage(RADIOLIB_HAL_PERSISTENT_STORAGE_BASE + RadioLibPersistentParamTable[id], ptr, sizeof(T)); + return(val); +} + +template uint8_t RadioLibHal::getPersistentParameter(uint32_t id); +template uint16_t RadioLibHal::getPersistentParameter(uint32_t id); +template uint32_t RadioLibHal::getPersistentParameter(uint32_t id); diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/Hal.h b/Code/BITS/BITSv5/radio-test/radiolib-src/Hal.h new file mode 100644 index 00000000..9d89811f --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/Hal.h @@ -0,0 +1,305 @@ +#if !defined(_RADIOLIB_HAL_H) +#define _RADIOLIB_HAL_H + +#include +#include + +#include "BuildOpt.h" + +// list of persistent parameters +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION_ID (0) // this is NOT the LoRaWAN version, but version of this table +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_MAGIC_ID (1) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_ADDR_ID (2) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_APP_S_KEY_ID (3) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_FNWK_SINT_KEY_ID (4) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_SNWK_SINT_KEY_ID (5) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_NWK_SENC_KEY_ID (6) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_NONCE_ID (7) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_JOIN_NONCE_ID (8) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_HOME_NET_ID (9) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_DL_SETTINGS_ID (10) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_CF_LIST_ID (11) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_RX_DELAY_ID (12) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_UP_ID (13) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_A_FCNT_DOWN_ID (14) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_N_FCNT_DOWN_ID (15) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_CONF_FCNT_ID (16) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_ADR_ID (17) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_FOPTS_ID (18) + +static const uint32_t RadioLibPersistentParamTable[] = { + 0x00, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION + 0x08, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_MAGIC_ID + 0x0C, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_ADDR_ID + 0x10, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_APP_S_KEY_ID + 0x20, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_FNWK_SINT_KEY_ID + 0x30, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_SNWK_SINT_KEY_ID + 0x40, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_NWK_SENC_KEY_ID + 0x50, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_NONCE_ID + 0x54, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_JOIN_NONCE_ID + 0x58, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_HOME_NET_ID + 0x5C, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_DL_SETTINGS_ID + 0x60, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_CF_LIST + 0x70, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_RX_DELAY_ID + 0x74, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_UP_ID + 0x78, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_AFCNT_DOWN_ID + 0x7C, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_NFCNT_DOWN_ID + 0x80, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_CONF_FCNT_ID + 0x84, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_ADR_ID + 0x88, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_FOPTS_ID + 0xD0, // end +}; + +/*! + \class RadioLibHal + \brief Hardware abstraction library base interface. +*/ +class RadioLibHal { + public: + + // values for pin modes, levels and change directions + // these tell RadioLib how are different logic states represented on a given platform + + /*! + \brief Value to be used as the "input" GPIO direction. + */ + const uint32_t GpioModeInput; + + /*! + \brief Value to be used as the "output" GPIO direction. + */ + const uint32_t GpioModeOutput; + + /*! + \brief Value to be used as the "low" GPIO level. + */ + const uint32_t GpioLevelLow; + + /*! + \brief Value to be used as the "high" GPIO level. + */ + const uint32_t GpioLevelHigh; + + /*! + \brief Value to be used as the "rising" GPIO level change direction. + */ + const uint32_t GpioInterruptRising; + + /*! + \brief Value to be used as the "falling" GPIO level change direction. + */ + const uint32_t GpioInterruptFalling; + + /*! + \brief Default constructor. + \param input Value to be used as the "input" GPIO direction. + \param output Value to be used as the "output" GPIO direction. + \param low Value to be used as the "low" GPIO level. + \param high Value to be used as the "high" GPIO level. + \param rising Value to be used as the "rising" GPIO level change direction. + \param falling Value to be used as the "falling" GPIO level change direction. + */ + RadioLibHal(const uint32_t input, const uint32_t output, const uint32_t low, const uint32_t high, const uint32_t rising, const uint32_t falling); + + // pure virtual methods - these must be implemented by the hardware abstraction for RadioLib to function + + /*! + \brief GPIO pin mode (input/output/...) configuration method. + Must be implemented by the platform-specific hardware abstraction! + \param pin Pin to be changed (platform-specific). + \param mode Mode to be set (platform-specific). + */ + virtual void pinMode(uint32_t pin, uint32_t mode) = 0; + + /*! + \brief Digital write method. + Must be implemented by the platform-specific hardware abstraction! + \param pin Pin to be changed (platform-specific). + \param value Value to set (platform-specific). + */ + virtual void digitalWrite(uint32_t pin, uint32_t value) = 0; + + /*! + \brief Digital read method. + Must be implemented by the platform-specific hardware abstraction! + \param pin Pin to be changed (platform-specific). + \returns Value read on the pin (platform-specific). + */ + virtual uint32_t digitalRead(uint32_t pin) = 0; + + /*! + \brief Method to attach function to an external interrupt. + Must be implemented by the platform-specific hardware abstraction! + \param interruptNum Interrupt number to attach to (platform-specific). + \param interruptCb Interrupt service routine to execute. + \param mode Rising/falling mode (platform-specific). + */ + virtual void attachInterrupt(uint32_t interruptNum, void (*interruptCb)(void), uint32_t mode) = 0; + + /*! + \brief Method to detach function from an external interrupt. + Must be implemented by the platform-specific hardware abstraction! + \param interruptNum Interrupt number to detach from (platform-specific). + */ + virtual void detachInterrupt(uint32_t interruptNum) = 0; + + /*! + \brief Blocking wait function. + Must be implemented by the platform-specific hardware abstraction! + \param ms Number of milliseconds to wait. + */ + virtual void delay(unsigned long ms) = 0; + + /*! + \brief Blocking microsecond wait function. + Must be implemented by the platform-specific hardware abstraction! + \param us Number of microseconds to wait. + */ + virtual void delayMicroseconds(unsigned long us) = 0; + + /*! + \brief Get number of milliseconds since start. + Must be implemented by the platform-specific hardware abstraction! + \returns Number of milliseconds since start. + */ + virtual unsigned long millis() = 0; + + /*! + \brief Get number of microseconds since start. + Must be implemented by the platform-specific hardware abstraction! + \returns Number of microseconds since start. + */ + virtual unsigned long micros() = 0; + + /*! + \brief Measure the length of incoming digital pulse in microseconds. + Must be implemented by the platform-specific hardware abstraction! + \param pin Pin to measure on (platform-specific). + \param state Pin level to monitor (platform-specific). + \param timeout Timeout in microseconds. + \returns Pulse length in microseconds, or 0 if the pulse did not start before timeout. + */ + virtual long pulseIn(uint32_t pin, uint32_t state, unsigned long timeout) = 0; + + /*! + \brief SPI initialization method. + */ + virtual void spiBegin() = 0; + + /*! + \brief Method to start SPI transaction. + */ + virtual void spiBeginTransaction() = 0; + + /*! + \brief Method to transfer buffer over SPI. + \param out Buffer to send. + \param len Number of data to send or receive. + \param in Buffer to save received data into. + */ + virtual void spiTransfer(uint8_t* out, size_t len, uint8_t* in) = 0; + + /*! + \brief Method to end SPI transaction. + */ + virtual void spiEndTransaction() = 0; + + /*! + \brief SPI termination method. + */ + virtual void spiEnd() = 0; + + // virtual methods - these may or may not exists on a given platform + // they exist in this implementation, but do nothing + + /*! + \brief Module initialization method. + This will be called by all radio modules at the beginning of startup. + Can be used to e.g., initialize SPI interface. + */ + virtual void init(); + + /*! + \brief Module termination method. + This will be called by all radio modules when the destructor is called. + Can be used to e.g., stop SPI interface. + */ + virtual void term(); + + /*! + \brief Method to produce a square-wave with 50% duty cycle ("tone") of a given frequency at some pin. + \param pin Pin to be used as the output. + \param frequency Frequency of the square wave. + \param duration Duration of the tone in ms. When set to 0, the tone will be infinite. + */ + virtual void tone(uint32_t pin, unsigned int frequency, unsigned long duration = 0); + + /*! + \brief Method to stop producing a tone. + \param pin Pin which is currently producing the tone. + */ + virtual void noTone(uint32_t pin); + + /*! + \brief Yield method, called from long loops in multi-threaded environment (to prevent blocking other threads). + */ + virtual void yield(); + + /*! + \brief Function to convert from pin number to interrupt number. + \param pin Pin to convert from. + \returns The interrupt number of a given pin. + */ + virtual uint32_t pinToInterrupt(uint32_t pin); + + /*! + \brief Method to read from persistent storage (e.g. EEPROM). + \param addr Address to start reading at. + \param buff Buffer to read into. + \param len Number of bytes to read. + */ + virtual void readPersistentStorage(uint32_t addr, uint8_t* buff, size_t len); + + /*! + \brief Method to write to persistent storage (e.g. EEPROM). + \param addr Address to start writing to. + \param buff Buffer to write. + \param len Number of bytes to write. + */ + virtual void writePersistentStorage(uint32_t addr, uint8_t* buff, size_t len); + + /*! + \brief Method to wipe the persistent storage by writing to 0. + Will write at most RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE bytes. + */ + void wipePersistentStorage(); + + /*! + \brief Method to convert from persistent parameter ID to its physical address. + \param id Parameter ID. + \returns Parameter physical address. + */ + uint32_t getPersistentAddr(uint32_t id); + + /*! + \brief Method to set arbitrary parameter to persistent storage. + This method DOES NOT perform any endianness conversion, so the value + will be stored in the system endian! + \param id Parameter ID to save at. + \param val Value to set. + */ + template + void setPersistentParameter(uint32_t id, T val); + + /*! + \brief Method to get arbitrary parameter from persistent storage. + This method DOES NOT perform any endianness conversion, so the value + will be retrieved in the system endian! + \param id Parameter ID to load from. + \returns The loaded value. + */ + template + T getPersistentParameter(uint32_t id); +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/Module.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/Module.cpp new file mode 100644 index 00000000..0848a746 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/Module.cpp @@ -0,0 +1,540 @@ +#include "Module.h" + +// the following is probably only needed on non-Arduino builds +#include +#include +#include + +#if defined(RADIOLIB_DEBUG) +// needed for debug print +#include +#endif + +#if defined(RADIOLIB_BUILD_ARDUINO) +#include "ArduinoHal.h" + +Module::Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio) : csPin(cs), irqPin(irq), rstPin(rst), gpioPin(gpio) { + this->hal = new ArduinoHal(); +} + +Module::Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio, SPIClass& spi, SPISettings spiSettings) : csPin(cs), irqPin(irq), rstPin(rst), gpioPin(gpio) { + this->hal = new ArduinoHal(spi, spiSettings); +} +#endif + +Module::Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio) : csPin(cs), irqPin(irq), rstPin(rst), gpioPin(gpio) { + this->hal = hal; +} + +Module::Module(const Module& mod) { + *this = mod; +} + +Module& Module::operator=(const Module& mod) { + this->SPIreadCommand = mod.SPIreadCommand; + this->SPIwriteCommand = mod.SPIwriteCommand; + this->csPin = mod.csPin; + this->irqPin = mod.irqPin; + this->rstPin = mod.rstPin; + this->gpioPin = mod.gpioPin; + return(*this); +} + +void Module::init() { + this->hal->init(); + this->hal->pinMode(csPin, this->hal->GpioModeOutput); + this->hal->digitalWrite(csPin, this->hal->GpioLevelHigh); + RADIOLIB_DEBUG_PRINTLN("\nRadioLib Debug Info"); + RADIOLIB_DEBUG_PRINTLN("Version: %d.%d.%d.%d", RADIOLIB_VERSION_MAJOR, RADIOLIB_VERSION_MINOR, RADIOLIB_VERSION_PATCH, RADIOLIB_VERSION_EXTRA); + RADIOLIB_DEBUG_PRINTLN("Platform: " RADIOLIB_PLATFORM); + RADIOLIB_DEBUG_PRINTLN("Compiled: " __DATE__ " " __TIME__ "\n"); +} + +void Module::term() { + // stop hardware interfaces (if they were initialized by the library) + this->hal->term(); +} + +int16_t Module::SPIgetRegValue(uint16_t reg, uint8_t msb, uint8_t lsb) { + if((msb > 7) || (lsb > 7) || (lsb > msb)) { + return(RADIOLIB_ERR_INVALID_BIT_RANGE); + } + + uint8_t rawValue = SPIreadRegister(reg); + uint8_t maskedValue = rawValue & ((0b11111111 << lsb) & (0b11111111 >> (7 - msb))); + return(maskedValue); +} + +int16_t Module::SPIsetRegValue(uint16_t reg, uint8_t value, uint8_t msb, uint8_t lsb, uint8_t checkInterval, uint8_t checkMask) { + if((msb > 7) || (lsb > 7) || (lsb > msb)) { + return(RADIOLIB_ERR_INVALID_BIT_RANGE); + } + + uint8_t currentValue = SPIreadRegister(reg); + uint8_t mask = ~((0b11111111 << (msb + 1)) | (0b11111111 >> (8 - lsb))); + uint8_t newValue = (currentValue & ~mask) | (value & mask); + SPIwriteRegister(reg, newValue); + + #if defined(RADIOLIB_SPI_PARANOID) + // check register value each millisecond until check interval is reached + // some registers need a bit of time to process the change (e.g. SX127X_REG_OP_MODE) + uint32_t start = this->hal->micros(); + uint8_t readValue = 0x00; + while(this->hal->micros() - start < (checkInterval * 1000)) { + readValue = SPIreadRegister(reg); + if((readValue & checkMask) == (newValue & checkMask)) { + // check passed, we can stop the loop + return(RADIOLIB_ERR_NONE); + } + } + + // check failed, print debug info + RADIOLIB_DEBUG_PRINTLN(); + RADIOLIB_DEBUG_PRINTLN("address:\t0x%X", reg); + RADIOLIB_DEBUG_PRINTLN("bits:\t\t%d %d", msb, lsb); + RADIOLIB_DEBUG_PRINTLN("value:\t\t0x%X", value); + RADIOLIB_DEBUG_PRINTLN("current:\t0x%X", currentValue); + RADIOLIB_DEBUG_PRINTLN("mask:\t\t0x%X", mask); + RADIOLIB_DEBUG_PRINTLN("new:\t\t0x%X", newValue); + RADIOLIB_DEBUG_PRINTLN("read:\t\t0x%X", readValue); + + return(RADIOLIB_ERR_SPI_WRITE_FAILED); + #else + return(RADIOLIB_ERR_NONE); + #endif +} + +void Module::SPIreadRegisterBurst(uint16_t reg, size_t numBytes, uint8_t* inBytes) { + if(!SPIstreamType) { + SPItransfer(SPIreadCommand, reg, NULL, inBytes, numBytes); + } else { + uint8_t cmd[] = { SPIreadCommand, (uint8_t)((reg >> 8) & 0xFF), (uint8_t)(reg & 0xFF) }; + SPItransferStream(cmd, 3, false, NULL, inBytes, numBytes, true, RADIOLIB_MODULE_SPI_TIMEOUT); + } +} + +uint8_t Module::SPIreadRegister(uint16_t reg) { + uint8_t resp = 0; + if(!SPIstreamType) { + SPItransfer(SPIreadCommand, reg, NULL, &resp, 1); + } else { + uint8_t cmd[] = { SPIreadCommand, (uint8_t)((reg >> 8) & 0xFF), (uint8_t)(reg & 0xFF) }; + SPItransferStream(cmd, 3, false, NULL, &resp, 1, true, RADIOLIB_MODULE_SPI_TIMEOUT); + } + return(resp); +} + +void Module::SPIwriteRegisterBurst(uint16_t reg, uint8_t* data, size_t numBytes) { + if(!SPIstreamType) { + SPItransfer(SPIwriteCommand, reg, data, NULL, numBytes); + } else { + uint8_t cmd[] = { SPIwriteCommand, (uint8_t)((reg >> 8) & 0xFF), (uint8_t)(reg & 0xFF) }; + SPItransferStream(cmd, 3, true, data, NULL, numBytes, true, RADIOLIB_MODULE_SPI_TIMEOUT); + } +} + +void Module::SPIwriteRegister(uint16_t reg, uint8_t data) { + if(!SPIstreamType) { + SPItransfer(SPIwriteCommand, reg, &data, NULL, 1); + } else { + uint8_t cmd[] = { SPIwriteCommand, (uint8_t)((reg >> 8) & 0xFF), (uint8_t)(reg & 0xFF) }; + SPItransferStream(cmd, 3, true, &data, NULL, 1, true, RADIOLIB_MODULE_SPI_TIMEOUT); + } +} + +void Module::SPItransfer(uint8_t cmd, uint16_t reg, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes) { + // prepare the buffers + size_t buffLen = this->SPIaddrWidth/8 + numBytes; + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t buffOut[RADIOLIB_STATIC_ARRAY_SIZE]; + uint8_t buffIn[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + uint8_t* buffOut = new uint8_t[buffLen]; + uint8_t* buffIn = new uint8_t[buffLen]; + #endif + uint8_t* buffOutPtr = buffOut; + + // copy the command + if(this->SPIaddrWidth <= 8) { + *(buffOutPtr++) = reg | cmd; + } else { + *(buffOutPtr++) = (reg >> 8) | cmd; + *(buffOutPtr++) = reg & 0xFF; + } + + // copy the data + if(cmd == SPIwriteCommand) { + memcpy(buffOutPtr, dataOut, numBytes); + } else { + memset(buffOutPtr, this->SPInopCommand, numBytes); + } + + // do the transfer + this->hal->spiBeginTransaction(); + this->hal->digitalWrite(this->csPin, this->hal->GpioLevelLow); + this->hal->spiTransfer(buffOut, buffLen, buffIn); + this->hal->digitalWrite(this->csPin, this->hal->GpioLevelHigh); + this->hal->spiEndTransaction(); + + // copy the data + if(cmd == SPIreadCommand) { + memcpy(dataIn, &buffIn[this->SPIaddrWidth/8], numBytes); + } + + // print debug information + #if defined(RADIOLIB_VERBOSE) + uint8_t* debugBuffPtr = NULL; + if(cmd == SPIwriteCommand) { + RADIOLIB_VERBOSE_PRINT("W\t%X\t", reg); + debugBuffPtr = &buffOut[this->SPIaddrWidth/8]; + } else if(cmd == SPIreadCommand) { + RADIOLIB_VERBOSE_PRINT("R\t%X\t", reg); + debugBuffPtr = &buffIn[this->SPIaddrWidth/8]; + } + for(size_t n = 0; n < numBytes; n++) { + RADIOLIB_VERBOSE_PRINT("%X\t", debugBuffPtr[n]); + } + RADIOLIB_VERBOSE_PRINTLN(); + #endif + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] buffOut; + delete[] buffIn; + #endif +} + +int16_t Module::SPIreadStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio, bool verify) { + return(this->SPIreadStream(&cmd, 1, data, numBytes, waitForGpio, verify)); +} + +int16_t Module::SPIreadStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio, bool verify) { + // send the command + int16_t state = this->SPItransferStream(cmd, cmdLen, false, NULL, data, numBytes, waitForGpio, RADIOLIB_MODULE_SPI_TIMEOUT); + RADIOLIB_ASSERT(state); + + // check the status + if(verify) { + state = this->SPIcheckStream(); + } + + return(state); +} + +int16_t Module::SPIwriteStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio, bool verify) { + return(this->SPIwriteStream(&cmd, 1, data, numBytes, waitForGpio, verify)); +} + +int16_t Module::SPIwriteStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio, bool verify) { + // send the command + int16_t state = this->SPItransferStream(cmd, cmdLen, true, data, NULL, numBytes, waitForGpio, RADIOLIB_MODULE_SPI_TIMEOUT); + RADIOLIB_ASSERT(state); + + // check the status + if(verify) { + state = this->SPIcheckStream(); + } + + return(state); +} + +int16_t Module::SPIcheckStream() { + int16_t state = RADIOLIB_ERR_NONE; + + #if defined(RADIOLIB_SPI_PARANOID) + // get the status + uint8_t spiStatus = 0; + uint8_t cmd = this->SPIstatusCommand; + state = this->SPItransferStream(&cmd, 1, false, NULL, &spiStatus, 0, true, RADIOLIB_MODULE_SPI_TIMEOUT); + RADIOLIB_ASSERT(state); + + // translate to RadioLib status code + if(this->SPIparseStatusCb != nullptr) { + this->SPIstreamError = this->SPIparseStatusCb(spiStatus); + } + #endif + + return(state); +} + +int16_t Module::SPItransferStream(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes, bool waitForGpio, uint32_t timeout) { + // prepare the buffers + size_t buffLen = cmdLen + numBytes; + if(!write) { + buffLen++; + } + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t buffOut[RADIOLIB_STATIC_ARRAY_SIZE]; + uint8_t buffIn[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + uint8_t* buffOut = new uint8_t[buffLen]; + uint8_t* buffIn = new uint8_t[buffLen]; + #endif + uint8_t* buffOutPtr = buffOut; + + // copy the command + for(uint8_t n = 0; n < cmdLen; n++) { + *(buffOutPtr++) = cmd[n]; + } + + // copy the data + if(write) { + memcpy(buffOutPtr, dataOut, numBytes); + } else { + memset(buffOutPtr, this->SPInopCommand, numBytes + 1); + } + + // ensure GPIO is low + if(this->gpioPin == RADIOLIB_NC) { + this->hal->delay(1); + } else { + uint32_t start = this->hal->millis(); + while(this->hal->digitalRead(this->gpioPin)) { + this->hal->yield(); + if(this->hal->millis() - start >= timeout) { + RADIOLIB_DEBUG_PRINTLN("GPIO pre-transfer timeout, is it connected?"); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] buffOut; + delete[] buffIn; + #endif + return(RADIOLIB_ERR_SPI_CMD_TIMEOUT); + } + } + } + + // do the transfer + this->hal->spiBeginTransaction(); + this->hal->digitalWrite(this->csPin, this->hal->GpioLevelLow); + this->hal->spiTransfer(buffOut, buffLen, buffIn); + this->hal->digitalWrite(this->csPin, this->hal->GpioLevelHigh); + this->hal->spiEndTransaction(); + + // wait for GPIO to go high and then low + if(waitForGpio) { + if(this->gpioPin == RADIOLIB_NC) { + this->hal->delay(1); + } else { + this->hal->delayMicroseconds(1); + uint32_t start = this->hal->millis(); + while(this->hal->digitalRead(this->gpioPin)) { + this->hal->yield(); + if(this->hal->millis() - start >= timeout) { + RADIOLIB_DEBUG_PRINTLN("GPIO post-transfer timeout, is it connected?"); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] buffOut; + delete[] buffIn; + #endif + return(RADIOLIB_ERR_SPI_CMD_TIMEOUT); + } + } + } + } + + // parse status + int16_t state = RADIOLIB_ERR_NONE; + if((this->SPIparseStatusCb != nullptr) && (numBytes > 0)) { + state = this->SPIparseStatusCb(buffIn[cmdLen]); + } + + // copy the data + if(!write) { + // skip the first byte for read-type commands (status-only) + memcpy(dataIn, &buffIn[cmdLen + 1], numBytes); + } + + // print debug information + #if defined(RADIOLIB_VERBOSE) + // print command byte(s) + RADIOLIB_VERBOSE_PRINT("CMD"); + if(write) { + RADIOLIB_VERBOSE_PRINT("W\t"); + } else { + RADIOLIB_VERBOSE_PRINT("R\t"); + } + size_t n = 0; + for(; n < cmdLen; n++) { + RADIOLIB_VERBOSE_PRINT("%X\t", cmd[n]); + } + RADIOLIB_VERBOSE_PRINTLN(); + + // print data bytes + RADIOLIB_VERBOSE_PRINT("SI\t"); + for(; n < buffLen; n++) { + RADIOLIB_VERBOSE_PRINT("%X\t", buffOut[n]); + } + RADIOLIB_VERBOSE_PRINTLN(); + RADIOLIB_VERBOSE_PRINT("SO\t"); + for(n = cmdLen; n < buffLen; n++) { + RADIOLIB_VERBOSE_PRINT("%X\t", buffIn[n]); + } + RADIOLIB_VERBOSE_PRINTLN(); + #endif + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] buffOut; + delete[] buffIn; + #endif + + return(state); +} + +void Module::waitForMicroseconds(uint32_t start, uint32_t len) { + #if defined(RADIOLIB_INTERRUPT_TIMING) + (void)start; + if((this->TimerSetupCb != nullptr) && (len != this->prevTimingLen)) { + prevTimingLen = len; + this->TimerSetupCb(len); + } + this->TimerFlag = false; + while(!this->TimerFlag) { + this->hal->yield(); + } + #else + while(this->hal->micros() - start < len) { + this->hal->yield(); + } + #endif +} + +uint32_t Module::reflect(uint32_t in, uint8_t bits) { + uint32_t res = 0; + for(uint8_t i = 0; i < bits; i++) { + res |= (((in & ((uint32_t)1 << i)) >> i) << (bits - i - 1)); + } + return(res); +} + +#if defined(RADIOLIB_DEBUG) +void Module::hexdump(uint8_t* data, size_t len, uint32_t offset, uint8_t width, bool be) { + size_t rem_len = len; + for(size_t i = 0; i < len; i+=16) { + char str[80]; + sprintf(str, "%07" PRIx32 " ", i+offset); + size_t line_len = 16; + if(rem_len < line_len) { + line_len = rem_len; + } + for(size_t j = 0; j < line_len; j+=width) { + if(width > 1) { + int m = 0; + int step = width/2; + if(be) { + step *= -1; + } + for(int32_t k = width - 1; k >= -width + 1; k+=step) { + sprintf(&str[8 + (j+m)*3], "%02x ", data[i+j+k+m]); + m++; + } + } else { + sprintf(&str[8 + (j)*3], "%02x ", data[i+j]); + } + } + for(size_t j = line_len; j < 16; j++) { + sprintf(&str[8 + j*3], " "); + } + str[56] = '|'; + str[57] = ' '; + for(size_t j = 0; j < line_len; j++) { + char c = data[i+j]; + if((c < ' ') || (c > '~')) { + c = '.'; + } + sprintf(&str[58 + j], "%c", c); + } + for(size_t j = line_len; j < 16; j++) { + sprintf(&str[58 + j], " "); + } + RADIOLIB_DEBUG_PRINT(str); + RADIOLIB_DEBUG_PRINTLN(); + rem_len -= 16; + } +} + +void Module::regdump(uint16_t start, size_t len) { + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t buff[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + uint8_t* buff = new uint8_t[len]; + #endif + SPIreadRegisterBurst(start, len, buff); + hexdump(buff, len, start); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] buff; + #endif +} +#endif + +#if defined(RADIOLIB_DEBUG) and defined(RADIOLIB_BUILD_ARDUINO) +// https://github.com/esp8266/Arduino/blob/65579d29081cb8501e4d7f786747bf12e7b37da2/cores/esp8266/Print.cpp#L50 +size_t Module::serialPrintf(const char* format, ...) { + va_list arg; + va_start(arg, format); + char temp[64]; + char* buffer = temp; + size_t len = vsnprintf(temp, sizeof(temp), format, arg); + va_end(arg); + if (len > sizeof(temp) - 1) { + buffer = new char[len + 1]; + if (!buffer) { + return 0; + } + va_start(arg, format); + vsnprintf(buffer, len + 1, format, arg); + va_end(arg); + } + len = RADIOLIB_DEBUG_PORT.write((const uint8_t*)buffer, len); + if (buffer != temp) { + delete[] buffer; + } + return len; +} +#endif + +void Module::setRfSwitchPins(uint32_t rxEn, uint32_t txEn) { + // This can be on the stack, setRfSwitchTable copies the contents + const uint32_t pins[] = { + rxEn, txEn, RADIOLIB_NC, + }; + + // This must be static, since setRfSwitchTable stores a reference. + static const RfSwitchMode_t table[] = { + { MODE_IDLE, {this->hal->GpioLevelLow, this->hal->GpioLevelLow} }, + { MODE_RX, {this->hal->GpioLevelHigh, this->hal->GpioLevelLow} }, + { MODE_TX, {this->hal->GpioLevelLow, this->hal->GpioLevelHigh} }, + END_OF_MODE_TABLE, + }; + setRfSwitchTable(pins, table); +} + +void Module::setRfSwitchTable(const uint32_t (&pins)[3], const RfSwitchMode_t table[]) { + memcpy(this->rfSwitchPins, pins, sizeof(this->rfSwitchPins)); + this->rfSwitchTable = table; + for(size_t i = 0; i < RFSWITCH_MAX_PINS; i++) + this->hal->pinMode(pins[i], this->hal->GpioModeOutput); +} + +const Module::RfSwitchMode_t *Module::findRfSwitchMode(uint8_t mode) const { + const RfSwitchMode_t *row = this->rfSwitchTable; + while (row && row->mode != MODE_END_OF_TABLE) { + if (row->mode == mode) + return row; + ++row; + } + return nullptr; +} + +void Module::setRfSwitchState(uint8_t mode) { + const RfSwitchMode_t *row = findRfSwitchMode(mode); + if(!row) { + // RF switch control is disabled or does not have this mode + return; + } + + // set pins + const uint32_t *value = &row->values[0]; + for(size_t i = 0; i < RFSWITCH_MAX_PINS; i++) { + uint32_t pin = this->rfSwitchPins[i]; + if (pin != RADIOLIB_NC) + this->hal->digitalWrite(pin, *value); + ++value; + } +} diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/Module.h b/Code/BITS/BITSv5/radio-test/radiolib-src/Module.h new file mode 100644 index 00000000..56697ac9 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/Module.h @@ -0,0 +1,510 @@ +#if !defined(_RADIOLIB_MODULE_H) +#define _RADIOLIB_MODULE_H + +#include "TypeDef.h" +#include "Hal.h" + +#if defined(RADIOLIB_BUILD_ARDUINO) + #include +#endif + +#if defined(STM32WLxx) + #include +#endif + +/*! +* Value to use as the last element in a mode table to indicate the +* end of the table. +* +* See setRfSwitchTable() for details. +*/ +#define END_OF_MODE_TABLE { Module::MODE_END_OF_TABLE, {} } + +// default timeout for SPI transfers +#define RADIOLIB_MODULE_SPI_TIMEOUT (1000) + +/*! + \class Module + \brief Implements all common low-level methods to control the wireless module. + Every module class contains one private instance of this class. +*/ +class Module { + public: + /*! + * \brief The maximum number of pins supported by the RF switch + * code. + * + * Note: It is not recommended to use this constant in your sketch + * when defining a rfswitch pins array, to prevent issues when this + * value is ever increased and such an array gets extra zero + * elements (that will be interpreted as pin 0). + */ + static const size_t RFSWITCH_MAX_PINS = 3; + + /*! + * Description of RF switch pin states for a single mode. + * + * See setRfSwitchTable() for details. + */ + struct RfSwitchMode_t { + uint8_t mode; + uint32_t values[RFSWITCH_MAX_PINS]; + }; + + /*! + * Constants to use in a mode table set be setRfSwitchTable. These + * constants work for most radios, but some radios define their own + * constants to be used instead. + * + * See setRfSwitchTable() for details. + */ + enum OpMode_t { + /*! End of table marker, use \ref END_OF_MODE_TABLE constant + * instead. Value is zero to ensure zero-initialized mode ends the + * table */ + MODE_END_OF_TABLE = 0, + /*! Idle mode */ + MODE_IDLE, + /*! Receive mode */ + MODE_RX, + /*! Transmission mode */ + MODE_TX, + }; + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Arduino Module constructor. Will use the default SPI interface and automatically initialize it. + \param cs Arduino pin to be used as chip select. + \param irq Arduino pin to be used as interrupt/GPIO. + \param rst Arduino pin to be used as hardware reset for the module. + \param gpio Arduino pin to be used as additional interrupt/GPIO. + */ + Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC); + + /*! + \brief Arduino Module constructor. Will not attempt SPI interface initialization. + \param cs Arduino pin to be used as chip select. + \param irq Arduino pin to be used as interrupt/GPIO. + \param rst Arduino pin to be used as hardware reset for the module. + \param gpio Arduino pin to be used as additional interrupt/GPIO. + \param spi SPI interface to be used, can also use software SPI implementations. + \param spiSettings SPI interface settings. + */ + Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio, SPIClass& spi, SPISettings spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS); + #endif + + /*! + \brief Module constructor. + \param hal A Hardware abstraction layer instance. An ArduinoHal instance for example. + \param cs Pin to be used as chip select. + \param irq Pin to be used as interrupt/GPIO. + \param rst Pin to be used as hardware reset for the module. + \param gpio Pin to be used as additional interrupt/GPIO. + */ + Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC); + + /*! + \brief Copy constructor. + \param mod Module instance to copy. + */ + Module(const Module& mod); + + /*! + \brief Overload for assignment operator. + \param frame rvalue Module. + */ + Module& operator=(const Module& mod); + + // public member variables + /*! + \brief Hardware abstraction layer to be used. + */ + RadioLibHal* hal = NULL; + + /*! + \brief Basic SPI read command. Defaults to 0x00. + */ + uint8_t SPIreadCommand = 0b00000000; + + /*! + \brief Basic SPI write command. Defaults to 0x80. + */ + uint8_t SPIwriteCommand = 0b10000000; + + /*! + \brief Basic SPI no-operation command. Defaults to 0x00. + */ + uint8_t SPInopCommand = 0x00; + + /*! + \brief Basic SPI status read command. Defaults to 0x00. + */ + uint8_t SPIstatusCommand = 0x00; + + /*! + \brief SPI address width. Defaults to 8, currently only supports 8 and 16-bit addresses. + */ + uint8_t SPIaddrWidth = 8; + + /*! + \brief Whether the SPI interface is stream-type (e.g. SX126x) or register-type (e.g. SX127x). + Defaults to register-type SPI interfaces. + */ + bool SPIstreamType = false; + + /*! + \brief The last recorded SPI stream error. + */ + int16_t SPIstreamError = RADIOLIB_ERR_UNKNOWN; + + /*! + \brief SPI status parsing callback typedef. + */ + typedef int16_t (*SPIparseStatusCb_t)(uint8_t in); + + /*! + \brief Callback to function that will parse the module-specific status codes to RadioLib status codes. + Typically used for modules with SPI stream-type interface (e.g. SX126x/SX128x). + */ + SPIparseStatusCb_t SPIparseStatusCb = nullptr; + + #if defined(RADIOLIB_INTERRUPT_TIMING) + + /*! + \brief Timer interrupt setup callback typedef. + */ + typedef void (*TimerSetupCb_t)(uint32_t len); + + /*! + \brief Callback to timer interrupt setup function when running in interrupt timing control mode. + */ + TimerSetupCb_t TimerSetupCb = nullptr; + + /*! + \brief Timer flag variable to be controlled by a platform-dependent interrupt. + */ + volatile bool TimerFlag = false; + + #endif + + // basic methods + + /*! + \brief Initialize low-level module control. + */ + void init(); + + /*! + \brief Terminate low-level module control. + */ + void term(); + + // SPI methods + + /*! + \brief SPI read method that automatically masks unused bits. This method is the preferred SPI read mechanism. + \param reg Address of SPI register to read. + \param msb Most significant bit of the register variable. Bits above this one will be masked out. + \param lsb Least significant bit of the register variable. Bits below this one will be masked out. + \returns Masked register value or status code. + */ + int16_t SPIgetRegValue(uint16_t reg, uint8_t msb = 7, uint8_t lsb = 0); + + /*! + \brief Overwrite-safe SPI write method with verification. This method is the preferred SPI write mechanism. + \param reg Address of SPI register to write. + \param value Single byte value that will be written to the SPI register. + \param msb Most significant bit of the register variable. Bits above this one will not be affected by the write operation. + \param lsb Least significant bit of the register variable. Bits below this one will not be affected by the write operation. + \param checkInterval Number of milliseconds between register writing and verification reading. Some registers need up to 10ms to process the change. + \param checkMask Mask of bits to check, only bits set to 1 will be verified. + \returns \ref status_codes + */ + int16_t SPIsetRegValue(uint16_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2, uint8_t checkMask = 0xFF); + + /*! + \brief SPI burst read method. + \param reg Address of SPI register to read. + \param numBytes Number of bytes that will be read. + \param inBytes Pointer to array that will hold the read data. + */ + void SPIreadRegisterBurst(uint16_t reg, size_t numBytes, uint8_t* inBytes); + + /*! + \brief SPI basic read method. Use of this method is reserved for special cases, SPIgetRegValue should be used instead. + \param reg Address of SPI register to read. + \returns Value that was read from register. + */ + uint8_t SPIreadRegister(uint16_t reg); + + /*! + \brief SPI burst write method. + \param reg Address of SPI register to write. + \param data Pointer to array that holds the data that will be written. + \param numBytes Number of bytes that will be written. + */ + void SPIwriteRegisterBurst(uint16_t reg, uint8_t* data, size_t numBytes); + + /*! + \brief SPI basic write method. Use of this method is reserved for special cases, SPIsetRegValue should be used instead. + \param reg Address of SPI register to write. + \param data Value that will be written to the register. + */ + void SPIwriteRegister(uint16_t reg, uint8_t data); + + /*! + \brief SPI single transfer method. + \param cmd SPI access command (read/write/burst/...). + \param reg Address of SPI register to transfer to/from. + \param dataOut Data that will be transferred from master to slave. + \param dataIn Data that was transferred from slave to master. + \param numBytes Number of bytes to transfer. + */ + void SPItransfer(uint8_t cmd, uint16_t reg, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes); + + /*! + \brief Method to check the result of last SPI stream transfer. + \returns \ref status_codes + */ + int16_t SPIcheckStream(); + + /*! + \brief Method to perform a read transaction with SPI stream. + \param cmd SPI operation command. + \param data Data that will be transferred from slave to master. + \param numBytes Number of bytes to transfer. + \param waitForGpio Whether to wait for some GPIO at the end of transfer (e.g. BUSY line on SX126x/SX128x). + \param verify Whether to verify the result of the transaction after it is finished. + \returns \ref status_codes + */ + int16_t SPIreadStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true); + + /*! + \brief Method to perform a read transaction with SPI stream. + \param cmd SPI operation command. + \param cmdLen SPI command length in bytes. + \param data Data that will be transferred from slave to master. + \param numBytes Number of bytes to transfer. + \param waitForGpio Whether to wait for some GPIO at the end of transfer (e.g. BUSY line on SX126x/SX128x). + \param verify Whether to verify the result of the transaction after it is finished. + \returns \ref status_codes + */ + int16_t SPIreadStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true); + + /*! + \brief Method to perform a write transaction with SPI stream. + \param cmd SPI operation command. + \param data Data that will be transferred from master to slave. + \param numBytes Number of bytes to transfer. + \param waitForGpio Whether to wait for some GPIO at the end of transfer (e.g. BUSY line on SX126x/SX128x). + \param verify Whether to verify the result of the transaction after it is finished. + \returns \ref status_codes + */ + int16_t SPIwriteStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true); + + /*! + \brief Method to perform a write transaction with SPI stream. + \param cmd SPI operation command. + \param cmdLen SPI command length in bytes. + \param data Data that will be transferred from master to slave. + \param numBytes Number of bytes to transfer. + \param waitForGpio Whether to wait for some GPIO at the end of transfer (e.g. BUSY line on SX126x/SX128x). + \param verify Whether to verify the result of the transaction after it is finished. + \returns \ref status_codes + */ + int16_t SPIwriteStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true); + + /*! + \brief SPI single transfer method for modules with stream-type SPI interface (SX126x, SX128x etc.). + \param cmd SPI operation command. + \param cmdLen SPI command length in bytes. + \param write Set to true for write commands, false for read commands. + \param dataOut Data that will be transferred from master to slave. + \param dataIn Data that was transferred from slave to master. + \param numBytes Number of bytes to transfer. + \param waitForGpio Whether to wait for some GPIO at the end of transfer (e.g. BUSY line on SX126x/SX128x). + \param timeout GPIO wait period timeout in milliseconds. + \returns \ref status_codes + */ + int16_t SPItransferStream(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes, bool waitForGpio, uint32_t timeout); + + // pin number access methods + + /*! + \brief Access method to get the pin number of SPI chip select. + \returns Pin number of SPI chip select configured in the constructor. + */ + uint32_t getCs() const { return(csPin); } + + /*! + \brief Access method to get the pin number of interrupt/GPIO. + \returns Pin number of interrupt/GPIO configured in the constructor. + */ + uint32_t getIrq() const { return(irqPin); } + + /*! + \brief Access method to get the pin number of hardware reset pin. + \returns Pin number of hardware reset pin configured in the constructor. + */ + uint32_t getRst() const { return(rstPin); } + + /*! + \brief Access method to get the pin number of second interrupt/GPIO. + \returns Pin number of second interrupt/GPIO configured in the constructor. + */ + uint32_t getGpio() const { return(gpioPin); } + + /*! + \brief Some modules contain external RF switch controlled by pins. + This function gives RadioLib control over those pins to + automatically switch between various modes: When idle both pins + will be LOW, during TX the `txEn` pin will be HIGH, during RX the + `rxPin` will be HIGH. + + Radiolib will automatically set the pin mode and value of these + pins, so do not control them from the sketch. + + When more than two pins or more control over the output values are + needed, use the setRfSwitchTable() function. + + \param rxEn RX enable pin. + \param txEn TX enable pin. + */ + void setRfSwitchPins(uint32_t rxEn, uint32_t txEn); + + /*! + \brief Some modules contain external RF switch controlled by pins. + This function gives RadioLib control over those pins to + automatically switch between various modes. + + Radiolib will automatically set the pin mode and value of these + pins, so do not control them from the sketch. + + + \param pins A reference to an array of pins to control. This + should always be an array of 3 elements. If you need less pins, + use RADIOLIB_NC for the unused elements. + + \param table A reference to an array of pin values to use for each + supported mode. Each element is an RfSwitchMode_T struct that + lists the mode for which it applies and the values for each of the + pins passed in the pins argument respectively. + + The `pins` array will be copied into the Module object, so the + original array can be deallocated after this call. However, + a reference to the `table` array will be stored, so that array + must remain valid as long RadioLib is being used. + + The `mode` field in each table row should normally use any of the + `MODE_*` constants from the Module::OpMode_t enum. However, some + radios support additional modes and will define their own OpMode_t + enum. + + The length of the table is variable (to support radios that add + additional modes), so the table must always be terminated with the + special END_OF_MODE_TABLE value. + + Normally all modes should be listed in the table, but for some + radios, modes can be omitted to indicate they are not supported + (e.g. when a radio has a high power and low power TX mode but + external circuitry only supports low power). If applicable, this + is documented in the radio class itself. + + #### Example + For example, on a board that has an RF switch with an enable pin + connected to PA0 and a TX/RX select pin connected to PA1: + + \code + // In global scope, define the pin array and mode table + static const uint32_t rfswitch_pins[] = + {PA0, PA1, RADIOLIB_NC}; + static const Module::RfSwitchMode_t rfswitch_table[] = { + {Module::MODE_IDLE, {LOW, LOW}}, + {Module::MODE_RX, {HIGH, LOW}}, + {Module::MODE_TX, {HIGH, HIGH}}, + Module::END_OF_MODE_TABLE, + }; + + void setup() { + ... + // Then somewhere in setup, pass them to radiolib + radio.setRfSwitchTable(rfswitch_pins, rfswitch_table); + ... + } + \endcode + */ + + void setRfSwitchTable(const uint32_t (&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[]); + + /*! + \brief Find a mode in the RfSwitchTable. + \param The mode to find. + \returns A pointer to the RfSwitchMode_t struct in the table that + matches the passed mode. Returns nullptr if no rfswitch pins are + configured, or the passed mode is not listed in the table. + */ + const RfSwitchMode_t *findRfSwitchMode(uint8_t mode) const; + + /*! + \brief Set RF switch state. + \param mode The mode to set. This must be one of the MODE_ constants, or a radio-specific constant. + */ + void setRfSwitchState(uint8_t mode); + + /*! + \brief Wait for time to elapse, either using the microsecond timer, or the TimerFlag. + Note that in interrupt timing mode, it is up to the user to set up the timing interrupt! + + \param start Waiting start timestamp, in microseconds. + \param len Waiting duration, in microseconds; + */ + void waitForMicroseconds(uint32_t start, uint32_t len); + + /*! + \brief Function to reflect bits within a byte. + \param in The input to reflect. + \param bits Number of bits to reflect. + \return The reflected input. + */ + static uint32_t reflect(uint32_t in, uint8_t bits); + + #if defined(RADIOLIB_DEBUG) + /*! + \brief Function to dump data as hex into the debug port. + \param data Data to dump. + \param len Number of bytes to dump. + \param width Word width (1 for uint8_t, 2 for uint16_t, 4 for uint32_t). + \param be Print multi-byte data as big endian. Defaults to false. + */ + static void hexdump(uint8_t* data, size_t len, uint32_t offset = 0, uint8_t width = 1, bool be = false); + + /*! + \brief Function to dump device registers as hex into the debug port. + \param start First address to dump. + \param len Number of bytes to dump. + */ + void regdump(uint16_t start, size_t len); + #endif + + #if defined(RADIOLIB_DEBUG) and defined(RADIOLIB_BUILD_ARDUINO) + static size_t serialPrintf(const char* format, ...); + #endif + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + uint32_t csPin = RADIOLIB_NC; + uint32_t irqPin = RADIOLIB_NC; + uint32_t rstPin = RADIOLIB_NC; + uint32_t gpioPin = RADIOLIB_NC; + + // RF switch pins and table + uint32_t rfSwitchPins[RFSWITCH_MAX_PINS] = { RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC }; + const RfSwitchMode_t *rfSwitchTable = nullptr; + + #if defined(RADIOLIB_INTERRUPT_TIMING) + uint32_t prevTimingLen = 0; + #endif +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/RP2040Hal.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/RP2040Hal.cpp new file mode 100644 index 00000000..c22eb7ad --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/RP2040Hal.cpp @@ -0,0 +1,189 @@ +#include "RP2040Hal.h" + +#include "hardware/gpio.h" +#include "pico/stdlib.h" + +RP2040Hal::RP2040Hal() + : RadioLibHal(GPIO_IN, GPIO_OUT, 0, 1, 3, 4), initInterface(true) {} + +void RP2040Hal::init() { + if (initInterface) { + spi_init(spi0, 2000000); + } +} + +void RP2040Hal::term() { + if (initInterface) { + spi_deinit(spi0); + } +} + +void inline RP2040Hal::pinMode(uint32_t pin, uint32_t mode) { + if (pin == RADIOLIB_NC) { + return; + } + + if (mode == GPIO_OUT) { + gpio_set_dir(pin, GPIO_OUT); + } else { + gpio_set_dir(pin, GPIO_IN); + } +} + +void inline RP2040Hal::digitalWrite(uint32_t pin, uint32_t value) { + if (pin == RADIOLIB_NC) { + return; + } + + if (value == 0) { + gpio_put(pin, 0); + } else { + gpio_put(pin, 1); + } +} + +uint32_t inline RP2040Hal::digitalRead(uint32_t pin) { + if (pin == RADIOLIB_NC) { + return 0; + } + return gpio_get(pin); +} + +void inline RP2040Hal::attachInterrupt(uint32_t interruptNum, + void (*interruptCb)(void), + uint32_t mode) { + if (interruptNum == RADIOLIB_NC) { + return; + } + + gpio_set_irq_enabled_with_callback(interruptNum, + GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, + true, interruptCb); +} + +void inline RP2040Hal::detachInterrupt(uint32_t interruptNum) { + if (interruptNum == RADIOLIB_NC) { + return; + } + gpio_set_irq_enabled(interruptNum, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, + false); +} + +void inline RP2040Hal::delay(unsigned long ms) { sleep_ms(ms); } + +void inline RP2040Hal::delayMicroseconds(unsigned long us) { sleep_us(us); } + +unsigned long inline RP2040Hal::millis() { + return (unsigned long)time_us_64 / 1000; +} + +unsigned long inline RP2040Hal::micros() { return (unsigned long)time_us_64; } + +long inline RP2040Hal::pulseIn(uint32_t pin, uint32_t state, + unsigned long timeout) { + if (pin == RADIOLIB_NC) { + return 0; + } + return (::pulseIn(pin, state, timeout)); +} + +void inline RP2040Hal::spiBegin() {} + +void inline RP2040Hal::spiBeginTransaction() {} + +void RP2040Hal::spiTransfer(uint8_t* out, size_t len, uint8_t* in) { + for (size_t i = 0; i < len; i++) { + in[i] = spi->transfer(out[i]); + } +} + +void inline RP2040Hal::spiEndTransaction() { spi->endTransaction(); } + +void inline RP2040Hal::spiEnd() { spi->end(); } + +void RP2040Hal::readPersistentStorage(uint32_t addr, uint8_t* buff, + size_t len) {} + +void RP2040Hal::writePersistentStorage(uint32_t addr, uint8_t* buff, + size_t len) {} + +void inline RP2040Hal::tone(uint32_t pin, unsigned int frequency, + unsigned long duration) { +#if !defined(RADIOLIB_TONE_UNSUPPORTED) + if (pin == RADIOLIB_NC) { + return; + } + ::tone(pin, frequency, duration); +#elif defined(RADIOLIB_ESP32) + // ESP32 tone() emulation + (void)duration; + if (prev == -1) { +#if !defined(ESP_IDF_VERSION) || \ + (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)) + ledcAttachPin(pin, RADIOLIB_TONE_ESP32_CHANNEL); +#endif + } + if (prev != frequency) { +#if !defined(ESP_IDF_VERSION) || \ + (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)) + ledcWriteTone(RADIOLIB_TONE_ESP32_CHANNEL, frequency); +#else + ledcWriteTone(pin, frequency); +#endif + } + prev = frequency; +#elif defined(RADIOLIB_MBED_TONE_OVERRIDE) + // better tone for mbed OS boards + (void)duration; + if (!pwmPin) { + pwmPin = new mbed::PwmOut(digitalPinToPinName(pin)); + } + pwmPin->period(1.0 / frequency); + pwmPin->write(0.5); +#endif +} + +void inline RP2040Hal::noTone(uint32_t pin) { +#if !defined(RADIOLIB_TONE_UNSUPPORTED) and defined(ARDUINO_ARCH_STM32) + if (pin == RADIOLIB_NC) { + return; + } + ::noTone(pin, false); +#elif !defined(RADIOLIB_TONE_UNSUPPORTED) + if (pin == RADIOLIB_NC) { + return; + } + ::noTone(pin); +#elif defined(RADIOLIB_ESP32) + if (pin == RADIOLIB_NC) { + return; + } +// ESP32 tone() emulation +#if !defined(ESP_IDF_VERSION) || \ + (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)) + ledcDetachPin(pin); + ledcWrite(RADIOLIB_TONE_ESP32_CHANNEL, 0); +#else + ledcDetach(pin); + ledcWrite(pin, 0); +#endif + prev = -1; +#elif defined(RADIOLIB_MBED_TONE_OVERRIDE) + if (pin == RADIOLIB_NC) { + return; + } + // better tone for mbed OS boards + (void)pin; + pwmPin->suspend(); +#endif +} + +void inline RP2040Hal::yield() { +#if !defined(RADIOLIB_YIELD_UNSUPPORTED) + ::yield(); +#endif +} + +uint32_t inline RP2040Hal::pinToInterrupt(uint32_t pin) { + return (digitalPinToInterrupt(pin)); +} \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/RP2040Hal.h b/Code/BITS/BITSv5/radio-test/radiolib-src/RP2040Hal.h new file mode 100644 index 00000000..955cdcd4 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/RP2040Hal.h @@ -0,0 +1,73 @@ +// make sure this is always compiled +#include "TypeDef.h" + +#if !defined(_RADIOLIB_RP2040HAL_H) +#define _RADIOLIB_RP2040HAL_H + +#include "Hal.h" +#include "hardware/spi.h" + +/*! + \class RP2040Hal +*/ +class RP2040Hal : public RadioLibHal { + public: + /*! + \brief Arduino Hal constructor. Will use the default SPI interface and + automatically initialize it. + */ + RP2040Hal(); + + /*! + \brief Arduino Hal constructor. Will not attempt SPI interface + initialization. \param spi SPI interface to be used, can also use software + SPI implementations. \param spiSettings SPI interface settings. + */ + + // implementations of pure virtual RadioLibHal methods + void pinMode(uint32_t pin, uint32_t mode) override; + void digitalWrite(uint32_t pin, uint32_t value) override; + uint32_t digitalRead(uint32_t pin) override; + void attachInterrupt(uint32_t interruptNum, void (*interruptCb)(void), + uint32_t mode) override; + void detachInterrupt(uint32_t interruptNum) override; + void delay(unsigned long ms) override; + void delayMicroseconds(unsigned long us) override; + unsigned long millis() override; + unsigned long micros() override; + long pulseIn(uint32_t pin, uint32_t state, unsigned long timeout) override; + void spiBegin() override; + void spiBeginTransaction() override; + void spiTransfer(uint8_t* out, size_t len, uint8_t* in) override; + void spiEndTransaction() override; + void spiEnd() override; + + void readPersistentStorage(uint32_t addr, uint8_t* buff, + size_t len) override; + void writePersistentStorage(uint32_t addr, uint8_t* buff, + size_t len) override; + + // implementations of virtual RadioLibHal methods + void init() override; + void term() override; + void tone(uint32_t pin, unsigned int frequency, + unsigned long duration = 0) override; + void noTone(uint32_t pin) override; + void yield() override; + uint32_t pinToInterrupt(uint32_t pin) override; + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + bool initInterface = false; + +#if defined(RADIOLIB_MBED_TONE_OVERRIDE) + mbed::PwmOut* pwmPin = NULL; +#endif + +#if defined(RADIOLIB_ESP32) + int32_t prev = -1; +#endif +}; + +#endif \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/RadioLib.h b/Code/BITS/BITSv5/radio-test/radiolib-src/RadioLib.h new file mode 100644 index 00000000..ee7026d2 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/RadioLib.h @@ -0,0 +1,159 @@ +#if !defined(_RADIOLIB_H) +#define _RADIOLIB_H + +/*! + \mainpage RadioLib Documentation + + Universal wireless communication library for Arduino. + + \par Currently Supported Wireless Modules and Protocols + - CC1101 FSK module + - RF69 FSK module + - Si443x FSK module + - SX126x LoRa/FSK module + - SX127x LoRa/FSK module + - SX128x LoRa/GFSK/BLE/FLRC module + - SX1231 FSK module + - PhysicalLayer protocols + - RTTY (RTTYClient) + - Morse Code (MorseClient) + - AX.25 (AX25Client) + - SSTV (SSTVClient) + - Hellschreiber (HellClient) + - 4-FSK (FSK4Client) + - APRS (APRSClient) + + \par Quick Links + Documentation for most common methods can be found in its reference page (see the list above).\n + Some methods (mainly configuration) are also overridden in derived classes, such as SX1272, SX1278, RFM96 etc. for SX127x.\n + \ref status_codes have their own page.\n + Some modules implement methods of one or more compatibility layers, loosely based on the ISO/OSI model: + - PhysicalLayer - FSK and LoRa radio modules + + \see https://github.com/jgromes/RadioLib + + \copyright Copyright (c) 2019 Jan Gromes +*/ + +#include "TypeDef.h" +#include "Module.h" + +#include "Hal.h" +#if defined(RADIOLIB_BUILD_ARDUINO) +#include "ArduinoHal.h" +#endif + + +// warnings are printed in this file since BuildOpt.h is compiled in multiple places + +// check God mode +#if defined(RADIOLIB_GODMODE) + #warning "God mode active, I hope it was intentional. Buckle up, lads." +#endif + +// print debug info +#if defined(RADIOLIB_DEBUG) + #define RADIOLIB_VALUE_TO_STRING(x) #x + #define RADIOLIB_VALUE(x) RADIOLIB_VALUE_TO_STRING(x) + #pragma message("\nRadioLib Debug Info\nVersion " \ + RADIOLIB_VALUE(RADIOLIB_VERSION_MAJOR) "." \ + RADIOLIB_VALUE(RADIOLIB_VERSION_MINOR) "." \ + RADIOLIB_VALUE(RADIOLIB_VERSION_PATCH) "." \ + RADIOLIB_VALUE(RADIOLIB_VERSION_EXTRA) "\n" \ + "Platform: " RADIOLIB_VALUE(RADIOLIB_PLATFORM) "\n" \ + "Compiled: " RADIOLIB_VALUE(__DATE__) " " RADIOLIB_VALUE(__TIME__) \ + ) +#endif + +// check unknown/unsupported platform +#if defined(RADIOLIB_UNKNOWN_PLATFORM) + #warning "RadioLib might not be compatible with this Arduino board - check supported platforms at https://github.com/jgromes/RadioLib!" +#endif + +#include "modules/CC1101/CC1101.h" +#include "modules/LLCC68/LLCC68.h" +#include "modules/nRF24/nRF24.h" +#include "modules/RF69/RF69.h" +#include "modules/RFM2x/RFM22.h" +#include "modules/RFM2x/RFM23.h" +#include "modules/Si443x/Si4430.h" +#include "modules/Si443x/Si4431.h" +#include "modules/Si443x/Si4432.h" +#include "modules/SX1231/SX1231.h" +#include "modules/SX126x/SX1261.h" +#include "modules/SX126x/SX1262.h" +#include "modules/SX126x/SX1268.h" +#include "modules/SX126x/STM32WLx.h" +#include "modules/SX127x/SX1272.h" +#include "modules/SX127x/SX1273.h" +#include "modules/SX127x/SX1276.h" +#include "modules/SX127x/SX1277.h" +#include "modules/SX127x/SX1278.h" +#include "modules/SX127x/SX1279.h" +#include "modules/SX128x/SX1280.h" +#include "modules/SX128x/SX1281.h" +#include "modules/SX128x/SX1282.h" + +// physical layer protocols +#include "protocols/PhysicalLayer/PhysicalLayer.h" +#include "protocols/AFSK/AFSK.h" +#include "protocols/AX25/AX25.h" +#include "protocols/Hellschreiber/Hellschreiber.h" +#include "protocols/Morse/Morse.h" +#include "protocols/Pager/Pager.h" +#include "protocols/RTTY/RTTY.h" +#include "protocols/SSTV/SSTV.h" +#include "protocols/FSK4/FSK4.h" +#include "protocols/APRS/APRS.h" +#include "protocols/ExternalRadio/ExternalRadio.h" +#include "protocols/Print/Print.h" +#include "protocols/BellModem/BellModem.h" +#include "protocols/LoRaWAN/LoRaWAN.h" + +// utilities +#include "utils/CRC.h" +#include "utils/Cryptography.h" + +// only create Radio class when using RadioShield +#if defined(RADIOLIB_RADIOSHIELD) + +// RadioShield pin definitions +#define RADIOSHIELD_CS_A 10 +#define RADIOSHIELD_IRQ_A 2 +#define RADIOSHIELD_RST_A 9 +#define RADIOSHIELD_GPIO_A 8 +#define RADIOSHIELD_CS_B 5 +#define RADIOSHIELD_IRQ_B 3 +#define RADIOSHIELD_RST_B 7 +#define RADIOSHIELD_GPIO_B 6 + +/*! + \class Radio + + \brief Library control object when using RadioShield. + Contains two pre-configured "modules", which correspond to the slots on shield. +*/ +class Radio { + public: + + Module* ModuleA; + Module* ModuleB; + + /*! + \brief Default constructor. Only used to set ModuleA and ModuleB configuration. + */ + Radio() { + ModuleA = new Module(RADIOSHIELD_CS_A, RADIOSHIELD_IRQ_A, RADIOSHIELD_RST_A, RADIOSHIELD_GPIO_A); + ModuleB = new Module(RADIOSHIELD_CS_B, RADIOSHIELD_IRQ_B, RADIOSHIELD_RST_B, RADIOSHIELD_GPIO_B); + } + +#if defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +Radio RadioShield; +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/TypeDef.h b/Code/BITS/BITSv5/radio-test/radiolib-src/TypeDef.h new file mode 100644 index 00000000..0ebcbbb1 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/TypeDef.h @@ -0,0 +1,560 @@ +#if !defined(_RADIOLIB_TYPES_H) +#define _RADIOLIB_TYPES_H + +// user build options may override the default +#include "BuildOptUser.h" +#include "BuildOpt.h" + +/*! + \defgroup config_shaping Data shaping filter values aliases. + + \{ +*/ + +/*! + \brief No shaping. +*/ +#define RADIOLIB_SHAPING_NONE (0x00) + +/*! + \brief Gaussian shaping filter, BT = 0.3 +*/ +#define RADIOLIB_SHAPING_0_3 (0x01) + +/*! + \brief Gaussian shaping filter, BT = 0.5 +*/ +#define RADIOLIB_SHAPING_0_5 (0x02) + +/*! + \brief Gaussian shaping filter, BT = 0.7 +*/ +#define RADIOLIB_SHAPING_0_7 (0x03) + +/*! + \brief Gaussian shaping filter, BT = 1.0 +*/ +#define RADIOLIB_SHAPING_1_0 (0x04) + +/*! + \} +*/ + +/*! + \defgroup config_encoding Encoding type aliases. + + \{ +*/ + +/*! + \brief Non-return to zero - no encoding. +*/ +#define RADIOLIB_ENCODING_NRZ (0x00) + +/*! + \brief Manchester encoding. +*/ +#define RADIOLIB_ENCODING_MANCHESTER (0x01) + +/*! + \brief Whitening. +*/ +#define RADIOLIB_ENCODING_WHITENING (0x02) + +/*! + \} +*/ + +/*! + \defgroup config_standby Standby mode type aliases. + + \{ +*/ + +/*! + \brief Default standby used by the module +*/ +#define RADIOLIB_STANDBY_DEFAULT (0x00) + +/*! + \brief Warm standby (e.g. crystal left running). +*/ +#define RADIOLIB_STANDBY_WARM (0x01) + +/*! + \brief Cold standby (e.g. only internal RC oscillator running). +*/ +#define RADIOLIB_STANDBY_COLD (0x02) + +/*! + \} +*/ + +/*! + \defgroup status_codes Status Codes + + \{ +*/ + +// common status codes + +/*! + \brief No error, method executed successfully. +*/ +#define RADIOLIB_ERR_NONE (0) + +/*! + \brief There was an unexpected, unknown error. If you see this, something went incredibly wrong. + Your Arduino may be possessed, contact your local exorcist to resolve this error. +*/ +#define RADIOLIB_ERR_UNKNOWN (-1) + +// SX127x/RFM9x status codes + +/*! + \brief Radio chip was not found during initialization. This can be caused by specifying wrong chip type in the constructor + (i.e. calling SX1272 constructor for SX1278 chip) or by a fault in your wiring (incorrect slave select pin). +*/ +#define RADIOLIB_ERR_CHIP_NOT_FOUND (-2) + +/*! + \brief Failed to allocate memory for temporary buffer. This can be cause by not enough RAM or by passing invalid pointer. +*/ +#define RADIOLIB_ERR_MEMORY_ALLOCATION_FAILED (-3) + +/*! + \brief Packet supplied to transmission method was longer than limit. +*/ +#define RADIOLIB_ERR_PACKET_TOO_LONG (-4) + +/*! + \brief Timed out waiting for transmission finish. +*/ +#define RADIOLIB_ERR_TX_TIMEOUT (-5) + +/*! + \brief Timed out waiting for incoming transmission. +*/ +#define RADIOLIB_ERR_RX_TIMEOUT (-6) + +/*! + \brief The calculated and expected CRCs of received packet do not match. + This means that the packet was damaged during transmission and should be sent again. +*/ +#define RADIOLIB_ERR_CRC_MISMATCH (-7) + +/*! + \brief The supplied bandwidth value is invalid for this module. +*/ +#define RADIOLIB_ERR_INVALID_BANDWIDTH (-8) + +/*! + \brief The supplied spreading factor value is invalid for this module. +*/ +#define RADIOLIB_ERR_INVALID_SPREADING_FACTOR (-9) + +/*! + \brief The supplied coding rate value is invalid for this module. +*/ +#define RADIOLIB_ERR_INVALID_CODING_RATE (-10) + +/*! + \brief Internal only. +*/ +#define RADIOLIB_ERR_INVALID_BIT_RANGE (-11) + +/*! + \brief The supplied frequency value is invalid for this module. +*/ +#define RADIOLIB_ERR_INVALID_FREQUENCY (-12) + +/*! + \brief The supplied output power value is invalid for this module. +*/ +#define RADIOLIB_ERR_INVALID_OUTPUT_POWER (-13) + +/*! + \brief LoRa preamble was detected during channel activity detection. + This means that there is some LoRa device currently transmitting in your channel. +*/ +#define RADIOLIB_PREAMBLE_DETECTED (-14) + +/*! + \brief No LoRa preambles were detected during channel activity detection. Your channel is free. +*/ +#define RADIOLIB_CHANNEL_FREE (-15) + +/*! + \brief Real value in SPI register does not match the expected one. This can be caused by faulty SPI wiring. +*/ +#define RADIOLIB_ERR_SPI_WRITE_FAILED (-16) + +/*! + \brief The supplied current limit value is invalid. +*/ +#define RADIOLIB_ERR_INVALID_CURRENT_LIMIT (-17) + +/*! + \brief The supplied preamble length is invalid. +*/ +#define RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH (-18) + +/*! + \brief The supplied gain value is invalid. +*/ +#define RADIOLIB_ERR_INVALID_GAIN (-19) + +/*! + \brief User tried to execute modem-exclusive method on a wrong modem. + For example, this can happen when you try to change LoRa configuration when FSK modem is active. +*/ +#define RADIOLIB_ERR_WRONG_MODEM (-20) + +/*! + \brief The supplied number of RSSI samples is invalid. +*/ +#define RADIOLIB_ERR_INVALID_NUM_SAMPLES (-21) + +/*! + \brief The supplied RSSI offset is invalid. +*/ +#define RADIOLIB_ERR_INVALID_RSSI_OFFSET (-22) + +/*! + \brief The supplied encoding is invalid. +*/ +#define RADIOLIB_ERR_INVALID_ENCODING (-23) + +/*! + \brief LoRa packet header has been damaged. +*/ +#define RADIOLIB_ERR_LORA_HEADER_DAMAGED (-24) + +/*! + \brief The requested functionality is not supported for this device +*/ +#define RADIOLIB_ERR_UNSUPPORTED (-25) + +/*! + \brief The specified DIO pin does not exist on this device +*/ +#define RADIOLIB_ERR_INVALID_DIO_PIN (-26) + +/*! + \brief The supplied RSSI threshold is invalid. +*/ +#define RADIOLIB_ERR_INVALID_RSSI_THRESHOLD (-27) + +/*! + \brief A `NULL` pointer has been encountered. If you see this, there may be a potential security vulnerability. +*/ +#define RADIOLIB_ERR_NULL_POINTER (-28) + +// RF69-specific status codes + +/*! + \brief The supplied bit rate value is invalid. +*/ +#define RADIOLIB_ERR_INVALID_BIT_RATE (-101) + +/*! + \brief The supplied frequency deviation value is invalid. +*/ +#define RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION (-102) + +/*! + \brief The supplied bit rate to bandwidth ratio is invalid. See the module datasheet for more information. +*/ +#define RADIOLIB_ERR_INVALID_BIT_RATE_BW_RATIO (-103) + +/*! + \brief The supplied receiver bandwidth value is invalid. +*/ +#define RADIOLIB_ERR_INVALID_RX_BANDWIDTH (-104) + +/*! + \brief The supplied FSK sync word is invalid. +*/ +#define RADIOLIB_ERR_INVALID_SYNC_WORD (-105) + +/*! + \brief The supplied FSK data shaping option is invalid. +*/ +#define RADIOLIB_ERR_INVALID_DATA_SHAPING (-106) + +/*! + \brief The current modulation is invalid for the requested operation. +*/ +#define RADIOLIB_ERR_INVALID_MODULATION (-107) + +/*! + \brief Supplied Peak type is invalid. +*/ +#define RADIOLIB_ERR_INVALID_OOK_RSSI_PEAK_TYPE (-108) + +// APRS status codes + +/*! + \brief Supplied APRS symbol is invalid. +*/ +#define RADIOLIB_ERR_INVALID_SYMBOL (-201) + +/*! + \brief Mic-E Telemetry is invalid. +*/ +#define RADIOLIB_ERR_INVALID_MIC_E_TELEMETRY (-202) + +/*! + \brief Mic-E Telemetry length is invalid (only 0, 2 or 5 is allowed). +*/ +#define RADIOLIB_ERR_INVALID_MIC_E_TELEMETRY_LENGTH (-203) + +/*! + \brief Mic-E message cannot contain both telemetry and status text. +*/ +#define RADIOLIB_ERR_MIC_E_TELEMETRY_STATUS (-204) + +// SSDV status codes + +/*! + \brief SSDV mode is invalid. +*/ +#define RADIOLIB_ERR_INVALID_SSDV_MODE (-301) + +/*! + \brief Image size is invalid. +*/ +#define RADIOLIB_ERR_INVALID_IMAGE_SIZE (-302) + +/*! + \brief Image quality is invalid. +*/ +#define RADIOLIB_ERR_INVALID_IMAGE_QUALITY (-303) + +/*! + \brief Image subsampling is invalid. +*/ +#define RADIOLIB_ERR_INVALID_SUBSAMPLING (-304) + +// RTTY status codes + +/*! + \brief Supplied RTTY frequency shift is invalid for this module. +*/ +#define RADIOLIB_ERR_INVALID_RTTY_SHIFT (-401) + +/*! + \brief Supplied RTTY encoding is invalid. +*/ +#define RADIOLIB_ERR_UNSUPPORTED_ENCODING (-402) + +// nRF24-specific status codes + +/*! + \brief Supplied data rate is invalid. +*/ +#define RADIOLIB_ERR_INVALID_DATA_RATE (-501) + +/*! + \brief Supplied address width is invalid. +*/ +#define RADIOLIB_ERR_INVALID_ADDRESS_WIDTH (-502) + +/*! + \brief Supplied data pipe number is invalid. +*/ +#define RADIOLIB_ERR_INVALID_PIPE_NUMBER (-503) + +/*! + \brief ACK packet from destination module was not received within 15 retries. +*/ +#define RADIOLIB_ERR_ACK_NOT_RECEIVED (-504) + +// CC1101-specific status codes + +/*! + \brief Supplied number of broadcast addresses is invalid. +*/ +#define RADIOLIB_ERR_INVALID_NUM_BROAD_ADDRS (-601) + +// SX126x-specific status codes + +/*! + \brief Supplied CRC configuration is invalid. +*/ +#define RADIOLIB_ERR_INVALID_CRC_CONFIGURATION (-701) + +/*! + \brief Detected LoRa transmission while scanning channel. +*/ +#define RADIOLIB_LORA_DETECTED (-702) + +/*! + \brief Supplied TCXO reference voltage is invalid. +*/ +#define RADIOLIB_ERR_INVALID_TCXO_VOLTAGE (-703) + +/*! + \brief Bit rate / bandwidth / frequency deviation ratio is invalid. See SX126x datasheet for details. +*/ +#define RADIOLIB_ERR_INVALID_MODULATION_PARAMETERS (-704) + +/*! + \brief SX126x timed out while waiting for complete SPI command. +*/ +#define RADIOLIB_ERR_SPI_CMD_TIMEOUT (-705) + +/*! + \brief SX126x received invalid SPI command. +*/ +#define RADIOLIB_ERR_SPI_CMD_INVALID (-706) + +/*! + \brief SX126x failed to execute SPI command. + Often this means that the module is trying to use TCXO while + XTAL is connected (or vice versa). Make sure your crystal setup + (e.g. TCXO reference voltage) matches your hardware by setting + "tcxoVoltage" to 0 when using XTAL module, or to appropriate value + when using TCXO module. +*/ +#define RADIOLIB_ERR_SPI_CMD_FAILED (-707) + +/*! + \brief The supplied sleep period is invalid. + + The specified sleep period is shorter than the time necessary to sleep and wake the hardware + including TCXO delay, or longer than the maximum possible +*/ +#define RADIOLIB_ERR_INVALID_SLEEP_PERIOD (-708) + +/*! + \brief The supplied Rx period is invalid. + + The specified Rx period is shorter or longer than the hardware can handle. +*/ +#define RADIOLIB_ERR_INVALID_RX_PERIOD (-709) + +// AX.25-specific status codes + +/*! + \brief The provided callsign is invalid. + + The specified callsign is longer than 6 ASCII characters. +*/ +#define RADIOLIB_ERR_INVALID_CALLSIGN (-801) + +/*! + \brief The provided repeater configuration is invalid. + + The specified number of repeaters does not match number of repeater IDs or their callsigns. +*/ +#define RADIOLIB_ERR_INVALID_NUM_REPEATERS (-802) + +/*! + \brief One of the provided repeater callsigns is invalid. + + The specified callsign is longer than 6 ASCII characters. +*/ +#define RADIOLIB_ERR_INVALID_REPEATER_CALLSIGN (-803) + +// SX128x-specific status codes + +/*! + \brief Timed out waiting for ranging exchange finish. +*/ +#define RADIOLIB_ERR_RANGING_TIMEOUT (-901) + +// Pager-specific status codes + +/*! + \brief The provided payload data configuration is invalid. +*/ +#define RADIOLIB_ERR_INVALID_PAYLOAD (-1001) + +/*! + \brief The requested address was not found in the received data. +*/ +#define RADIOLIB_ERR_ADDRESS_NOT_FOUND (-1002) + +/*! + \brief The function code is invalid. 2 Bits only. +*/ +#define RADIOLIB_ERR_INVALID_FUNCTION (-1003) + +// LoRaWAN-specific status codes + +/*! + \brief Unable to restore existing LoRaWAN session because this node did not join any network yet. +*/ +#define RADIOLIB_ERR_NETWORK_NOT_JOINED (-1101) + +/*! + \brief Malformed downlink packet received from network server. +*/ +#define RADIOLIB_ERR_DOWNLINK_MALFORMED (-1102) + +/*! + \brief Network server requested switch to unsupported LoRaWAN revision. +*/ +#define RADIOLIB_ERR_INVALID_REVISION (-1103) + +/*! + \brief Invalid LoRaWAN uplink port requested by user. +*/ +#define RADIOLIB_ERR_INVALID_PORT (-1104) + +/*! + \brief User did not enable downlink in time. +*/ +#define RADIOLIB_ERR_NO_RX_WINDOW (-1105) + +/*! + \brief No valid channel for the currently active LoRaWAN band was found. +*/ +#define RADIOLIB_ERR_INVALID_CHANNEL (-1106) + +/*! + \brief Invalid LoRaWAN MAC command ID. +*/ +#define RADIOLIB_ERR_INVALID_CID (-1107) + +/*! + \brief User requested to start uplink while still inside RX window. +*/ +#define RADIOLIB_ERR_UPLINK_UNAVAILABLE (-1108) + +/*! + \brief Unable to push new MAC command because the queue is full. +*/ +#define RADIOLIB_ERR_COMMAND_QUEUE_FULL (-1109) + +/*! + \brief Unable to pop existing MAC command because the queue is empty. +*/ +#define RADIOLIB_ERR_COMMAND_QUEUE_EMPTY (-1110) + +/*! + \brief Unable to delete MAC command because it was not found in the queue. +*/ +#define RADIOLIB_ERR_COMMAND_QUEUE_ITEM_NOT_FOUND (-1111) + +/*! + \brief Unable to join network because JoinNonce is not higher than saved value. +*/ +#define RADIOLIB_ERR_JOIN_NONCE_INVALID (-1112) + +/*! + \brief Received downlink Network frame counter is invalid (lower than last heard value). +*/ +#define RADIOLIB_ERR_N_FCNT_DOWN_INVALID (-1113) + +/*! + \brief Received downlink Application frame counter is invalid (lower than last heard value). +*/ +#define RADIOLIB_ERR_A_FCNT_DOWN_INVALID (-1114) + +/*! + \} +*/ + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/CC1101/CC1101.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/CC1101/CC1101.cpp new file mode 100644 index 00000000..5e2fc776 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/CC1101/CC1101.cpp @@ -0,0 +1,1107 @@ +#include "CC1101.h" +#include +#if !defined(RADIOLIB_EXCLUDE_CC1101) + +CC1101::CC1101(Module* module) : PhysicalLayer(RADIOLIB_CC1101_FREQUENCY_STEP_SIZE, RADIOLIB_CC1101_MAX_PACKET_LENGTH) { + this->mod = module; +} + +Module* CC1101::getMod() { + return(this->mod); +} + +int16_t CC1101::begin(float freq, float br, float freqDev, float rxBw, int8_t pwr, uint8_t preambleLength) { + // set module properties + this->mod->SPIreadCommand = RADIOLIB_CC1101_CMD_READ; + this->mod->SPIwriteCommand = RADIOLIB_CC1101_CMD_WRITE; + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + + // try to find the CC1101 chip + uint8_t i = 0; + bool flagFound = false; + while((i < 10) && !flagFound) { + int16_t version = getChipVersion(); + if((version == RADIOLIB_CC1101_VERSION_CURRENT) || (version == RADIOLIB_CC1101_VERSION_LEGACY) || (version == RADIOLIB_CC1101_VERSION_CLONE)) { + flagFound = true; + } else { + RADIOLIB_DEBUG_PRINTLN("CC1101 not found! (%d of 10 tries) RADIOLIB_CC1101_REG_VERSION == 0x%04X, expected 0x0004/0x0014", i + 1, version); + this->mod->hal->delay(10); + i++; + } + } + + if(!flagFound) { + RADIOLIB_DEBUG_PRINTLN("No CC1101 found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } else { + RADIOLIB_DEBUG_PRINTLN("M\tCC1101"); + } + + // configure settings not accessible by API + int16_t state = config(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + // configure bitrate + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + // configure default RX bandwidth + state = setRxBandwidth(rxBw); + RADIOLIB_ASSERT(state); + + // configure default frequency deviation + state = setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + // configure default TX output power + state = setOutputPower(pwr); + RADIOLIB_ASSERT(state); + + // set default packet length mode + state = variablePacketLengthMode(); + RADIOLIB_ASSERT(state); + + // configure default preamble length + state = setPreambleLength(preambleLength, preambleLength - 4); + RADIOLIB_ASSERT(state); + + // set default data shaping + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + + // set default encoding + state = setEncoding(RADIOLIB_ENCODING_NRZ); + RADIOLIB_ASSERT(state); + + // set default sync word + uint8_t sw[RADIOLIB_CC1101_DEFAULT_SW_LEN] = RADIOLIB_CC1101_DEFAULT_SW; + state = setSyncWord(sw[0], sw[1], 0, false); + RADIOLIB_ASSERT(state); + + // flush FIFOs + SPIsendCommand(RADIOLIB_CC1101_CMD_FLUSH_RX); + SPIsendCommand(RADIOLIB_CC1101_CMD_FLUSH_TX); + + return(state); +} + +void CC1101::reset() { + // this is the manual power-on-reset sequence + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelLow); + this->mod->hal->delayMicroseconds(5); + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelHigh); + this->mod->hal->delayMicroseconds(40); + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelLow); + this->mod->hal->delay(10); + SPIsendCommand(RADIOLIB_CC1101_CMD_RESET); +} + +int16_t CC1101::transmit(uint8_t* data, size_t len, uint8_t addr) { + // calculate timeout (5ms + 500 % of expected time-on-air) + uint32_t timeout = 5000000 + (uint32_t)((((float)(len * 8)) / (this->bitRate * 1000.0)) * 5000000.0); + + // start transmission + int16_t state = startTransmit(data, len, addr); + RADIOLIB_ASSERT(state); + + // wait for transmission start or timeout + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getGpio())) { + this->mod->hal->yield(); + + if(this->mod->hal->micros() - start > timeout) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + + // wait for transmission end or timeout + start = this->mod->hal->micros(); + while(this->mod->hal->digitalRead(this->mod->getGpio())) { + this->mod->hal->yield(); + + if(this->mod->hal->micros() - start > timeout) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + + return(finishTransmit()); +} + +int16_t CC1101::receive(uint8_t* data, size_t len) { + // calculate timeout (500 ms + 400 full max-length packets at current bit rate) + uint32_t timeout = 500000 + (1.0/(this->bitRate*1000.0))*(RADIOLIB_CC1101_MAX_PACKET_LENGTH*400.0); + + // start reception + int16_t state = startReceive(); + RADIOLIB_ASSERT(state); + + // wait for packet or timeout + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + + if(this->mod->hal->micros() - start > timeout) { + standby(); + SPIsendCommand(RADIOLIB_CC1101_CMD_FLUSH_RX); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } + + // read packet data + return(readData(data, len)); +} + +int16_t CC1101::standby() { + // set idle mode + SPIsendCommand(RADIOLIB_CC1101_CMD_IDLE); + + // wait until idle is reached + uint32_t start = this->mod->hal->millis(); + while(SPIgetRegValue(RADIOLIB_CC1101_REG_MARCSTATE, 4, 0) != RADIOLIB_CC1101_MARC_STATE_IDLE) { + mod->hal->yield(); + if(this->mod->hal->millis() - start > 100) { + // timeout, this should really not happen + return(RADIOLIB_ERR_UNKNOWN); + } + }; + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + return(RADIOLIB_ERR_NONE); +} + +int16_t CC1101::standby(uint8_t mode) { + (void)mode; + return(standby()); +} + +int16_t CC1101::transmitDirect(uint32_t frf) { + return transmitDirect(true, frf); +} + +int16_t CC1101::transmitDirectAsync(uint32_t frf) { + return transmitDirect(false, frf); +} + +int16_t CC1101::transmitDirect(bool sync, uint32_t frf) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // user requested to start transmitting immediately (required for RTTY) + if(frf != 0) { + SPIwriteRegister(RADIOLIB_CC1101_REG_FREQ2, (frf & 0xFF0000) >> 16); + SPIwriteRegister(RADIOLIB_CC1101_REG_FREQ1, (frf & 0x00FF00) >> 8); + SPIwriteRegister(RADIOLIB_CC1101_REG_FREQ0, frf & 0x0000FF); + + SPIsendCommand(RADIOLIB_CC1101_CMD_TX); + } + + // activate direct mode + int16_t state = directMode(sync); + RADIOLIB_ASSERT(state); + + // start transmitting + SPIsendCommand(RADIOLIB_CC1101_CMD_TX); + return(state); +} + +int16_t CC1101::receiveDirect() { + return receiveDirect(true); +} + +int16_t CC1101::receiveDirectAsync() { + return receiveDirect(false); +} + +int16_t CC1101::receiveDirect(bool sync) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // activate direct mode + int16_t state = directMode(sync); + RADIOLIB_ASSERT(state); + + // start receiving + SPIsendCommand(RADIOLIB_CC1101_CMD_RX); + return(RADIOLIB_ERR_NONE); +} + +int16_t CC1101::packetMode() { + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL1, RADIOLIB_CC1101_CRC_AUTOFLUSH_OFF | RADIOLIB_CC1101_APPEND_STATUS_ON | RADIOLIB_CC1101_ADR_CHK_NONE, 3, 0); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_WHITE_DATA_OFF | RADIOLIB_CC1101_PKT_FORMAT_NORMAL, 6, 4); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_CRC_ON | this->packetLengthConfig, 2, 0); + return(state); +} + +void CC1101::setGdo0Action(void (*func)(void), uint32_t dir) { + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq()), func, dir); +} + +void CC1101::clearGdo0Action() { + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq())); +} + +void CC1101::setPacketReceivedAction(void (*func)(void)) { + this->setGdo0Action(func, this->mod->hal->GpioInterruptRising); +} + +void CC1101::clearPacketReceivedAction() { + this->clearGdo0Action(); +} + +void CC1101::setPacketSentAction(void (*func)(void)) { + this->setGdo2Action(func, this->mod->hal->GpioInterruptFalling); +} + +void CC1101::clearPacketSentAction() { + this->clearGdo2Action(); +} + +void CC1101::setGdo2Action(void (*func)(void), uint32_t dir) { + if(this->mod->getGpio() == RADIOLIB_NC) { + return; + } + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getGpio()), func, dir); +} + +void CC1101::clearGdo2Action() { + if(this->mod->getGpio() == RADIOLIB_NC) { + return; + } + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getGpio())); +} + +int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) { + // check packet length + if(len > RADIOLIB_CC1101_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set mode to standby + standby(); + + // flush Tx FIFO + SPIsendCommand(RADIOLIB_CC1101_CMD_FLUSH_TX); + + // set GDO0 mapping + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_IOCFG2, RADIOLIB_CC1101_GDOX_SYNC_WORD_SENT_OR_PKT_RECEIVED, 5, 0); + RADIOLIB_ASSERT(state); + + // optionally write packet length + if(this->packetLengthConfig == RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE) { + SPIwriteRegister(RADIOLIB_CC1101_REG_FIFO, len); + } + + // check address filtering + uint8_t filter = SPIgetRegValue(RADIOLIB_CC1101_REG_PKTCTRL1, 1, 0); + if(filter != RADIOLIB_CC1101_ADR_CHK_NONE) { + SPIwriteRegister(RADIOLIB_CC1101_REG_FIFO, addr); + } + + // fill the FIFO + SPIwriteRegisterBurst(RADIOLIB_CC1101_REG_FIFO, data, len); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // set mode to transmit + SPIsendCommand(RADIOLIB_CC1101_CMD_TX); + + return(state); +} + +int16_t CC1101::finishTransmit() { + // set mode to standby to disable transmitter/RF switch + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // flush Tx FIFO + SPIsendCommand(RADIOLIB_CC1101_CMD_FLUSH_TX); + + return(state); +} + +int16_t CC1101::startReceive() { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // flush Rx FIFO + SPIsendCommand(RADIOLIB_CC1101_CMD_FLUSH_RX); + + // set GDO0 mapping + // GDO0 is de-asserted at packet end, hence it is inverted here + state = SPIsetRegValue(RADIOLIB_CC1101_REG_IOCFG0, RADIOLIB_CC1101_GDO0_INV | RADIOLIB_CC1101_GDOX_SYNC_WORD_SENT_OR_PKT_RECEIVED, 6, 0); + RADIOLIB_ASSERT(state); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set mode to receive + SPIsendCommand(RADIOLIB_CC1101_CMD_RX); + + return(state); +} + +int16_t CC1101::startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len) { + (void)timeout; + (void)irqFlags; + (void)irqMask; + (void)len; + return(startReceive()); +} + +int16_t CC1101::readData(uint8_t* data, size_t len) { + // get packet length + size_t length = getPacketLength(); + if((len != 0) && (len < length)) { + // user requested less data than we got, only return what was requested + length = len; + } + + // check address filtering + uint8_t filter = SPIgetRegValue(RADIOLIB_CC1101_REG_PKTCTRL1, 1, 0); + if(filter != RADIOLIB_CC1101_ADR_CHK_NONE) { + SPIreadRegister(RADIOLIB_CC1101_REG_FIFO); + } + + // read packet data + SPIreadRegisterBurst(RADIOLIB_CC1101_REG_FIFO, length, data); + + // check if status bytes are enabled (default: RADIOLIB_CC1101_APPEND_STATUS_ON) + bool isAppendStatus = SPIgetRegValue(RADIOLIB_CC1101_REG_PKTCTRL1, 2, 2) == RADIOLIB_CC1101_APPEND_STATUS_ON; + + // If status byte is enabled at least 2 bytes (2 status bytes + any following packet) will remain in FIFO. + int16_t state = RADIOLIB_ERR_NONE; + if (isAppendStatus) { + // read RSSI byte + this->rawRSSI = SPIgetRegValue(RADIOLIB_CC1101_REG_FIFO); + + // read LQI and CRC byte + uint8_t val = SPIgetRegValue(RADIOLIB_CC1101_REG_FIFO); + this->rawLQI = val & 0x7F; + + // check CRC + if(this->crcOn && (val & RADIOLIB_CC1101_CRC_OK) == RADIOLIB_CC1101_CRC_ERROR) { + this->packetLengthQueried = false; + state = RADIOLIB_ERR_CRC_MISMATCH; + } + } + + // clear internal flag so getPacketLength can return the new packet length + this->packetLengthQueried = false; + + // Flush then standby according to RXOFF_MODE (default: RADIOLIB_CC1101_RXOFF_IDLE) + if(SPIgetRegValue(RADIOLIB_CC1101_REG_MCSM1, 3, 2) == RADIOLIB_CC1101_RXOFF_IDLE) { + + // set mode to standby + standby(); + + // flush Rx FIFO + SPIsendCommand(RADIOLIB_CC1101_CMD_FLUSH_RX); + } + + return(state); +} + +int16_t CC1101::setFrequency(float freq) { + // check allowed frequency range + if(!(((freq > 300.0) && (freq < 348.0)) || + ((freq > 387.0) && (freq < 464.0)) || + ((freq > 779.0) && (freq < 928.0)))) { + return(RADIOLIB_ERR_INVALID_FREQUENCY); + } + + // set mode to standby + SPIsendCommand(RADIOLIB_CC1101_CMD_IDLE); + + //set carrier frequency + uint32_t base = 1; + uint32_t FRF = (freq * (base << 16)) / 26.0; + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_FREQ2, (FRF & 0xFF0000) >> 16, 7, 0); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_FREQ1, (FRF & 0x00FF00) >> 8, 7, 0); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_FREQ0, FRF & 0x0000FF, 7, 0); + + if(state == RADIOLIB_ERR_NONE) { + this->frequency = freq; + } + + // Update the TX power accordingly to new freq. (PA values depend on chosen freq) + return(setOutputPower(this->power)); +} + +int16_t CC1101::setBitRate(float br) { + RADIOLIB_CHECK_RANGE(br, 0.025, 600.0, RADIOLIB_ERR_INVALID_BIT_RATE); + + // set mode to standby + SPIsendCommand(RADIOLIB_CC1101_CMD_IDLE); + + // calculate exponent and mantissa values + uint8_t e = 0; + uint8_t m = 0; + getExpMant(br * 1000.0, 256, 28, 14, e, m); + + // set bit rate value + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG4, e, 3, 0); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG3, m); + if(state == RADIOLIB_ERR_NONE) { + this->bitRate = br; + } + return(state); +} + +int16_t CC1101::setRxBandwidth(float rxBw) { + RADIOLIB_CHECK_RANGE(rxBw, 58.0, 812.0, RADIOLIB_ERR_INVALID_RX_BANDWIDTH); + + // set mode to standby + SPIsendCommand(RADIOLIB_CC1101_CMD_IDLE); + + // calculate exponent and mantissa values + for(int8_t e = 3; e >= 0; e--) { + for(int8_t m = 3; m >= 0; m --) { + float point = (RADIOLIB_CC1101_CRYSTAL_FREQ * 1000000.0)/(8 * (m + 4) * ((uint32_t)1 << e)); + if(fabs((rxBw * 1000.0) - point) <= 1000) { + // set Rx channel filter bandwidth + return(SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG4, (e << 6) | (m << 4), 7, 4)); + } + + } + } + + return(RADIOLIB_ERR_INVALID_RX_BANDWIDTH); +} + +int16_t CC1101::setFrequencyDeviation(float freqDev) { + // set frequency deviation to lowest available setting (required for digimodes) + float newFreqDev = freqDev; + if(freqDev < 0.0) { + newFreqDev = 1.587; + } + + // check range unless 0 (special value) + if (freqDev != 0) { + RADIOLIB_CHECK_RANGE(newFreqDev, 1.587, 380.8, RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + } + + // set mode to standby + SPIsendCommand(RADIOLIB_CC1101_CMD_IDLE); + + // calculate exponent and mantissa values + uint8_t e = 0; + uint8_t m = 0; + getExpMant(newFreqDev * 1000.0, 8, 17, 7, e, m); + + // set frequency deviation value + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_DEVIATN, (e << 4), 6, 4); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_DEVIATN, m, 2, 0); + + return(state); +} + +int16_t CC1101::getFrequencyDeviation(float *freqDev) { + if (freqDev == NULL) { + return(RADIOLIB_ERR_NULL_POINTER); + } + + // if ASK/OOK, deviation makes no sense + if (this->modulation == RADIOLIB_CC1101_MOD_FORMAT_ASK_OOK) { + *freqDev = 0.0; + + return(RADIOLIB_ERR_NONE); + } + + // get exponent and mantissa values from registers + uint8_t e = (uint8_t)(SPIgetRegValue(RADIOLIB_CC1101_REG_DEVIATN, 6, 4) >> 4); + uint8_t m = (uint8_t)SPIgetRegValue(RADIOLIB_CC1101_REG_DEVIATN, 2, 0); + + // calculate frequency deviation (pag. 79 of the CC1101 datasheet): + // + // freqDev = (fXosc / 2^17) * (8 + m) * 2^e + // + *freqDev = (1000.0 / (uint32_t(1) << 17)) - (8 + m) * (uint32_t(1) << e); + + return(RADIOLIB_ERR_NONE); +} + +int16_t CC1101::setOutputPower(int8_t pwr) { + // round to the known frequency settings + uint8_t f; + if(this->frequency < 374.0) { + // 315 MHz + f = 0; + } else if(this->frequency < 650.5) { + // 434 MHz + f = 1; + } else if(this->frequency < 891.5) { + // 868 MHz + f = 2; + } else { + // 915 MHz + f = 3; + } + + // get raw power setting + uint8_t paTable[8][4] = {{0x12, 0x12, 0x03, 0x03}, + {0x0D, 0x0E, 0x0F, 0x0E}, + {0x1C, 0x1D, 0x1E, 0x1E}, + {0x34, 0x34, 0x27, 0x27}, + {0x51, 0x60, 0x50, 0x8E}, + {0x85, 0x84, 0x81, 0xCD}, + {0xCB, 0xC8, 0xCB, 0xC7}, + {0xC2, 0xC0, 0xC2, 0xC0}}; + + uint8_t powerRaw; + switch(pwr) { + case -30: + powerRaw = paTable[0][f]; + break; + case -20: + powerRaw = paTable[1][f]; + break; + case -15: + powerRaw = paTable[2][f]; + break; + case -10: + powerRaw = paTable[3][f]; + break; + case 0: + powerRaw = paTable[4][f]; + break; + case 5: + powerRaw = paTable[5][f]; + break; + case 7: + powerRaw = paTable[6][f]; + break; + case 10: + powerRaw = paTable[7][f]; + break; + default: + return(RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } + + // store the value + this->power = pwr; + + if(this->modulation == RADIOLIB_CC1101_MOD_FORMAT_ASK_OOK){ + // Amplitude modulation: + // PA_TABLE[0] is the power to be used when transmitting a 0 (no power) + // PA_TABLE[1] is the power to be used when transmitting a 1 (full power) + + uint8_t paValues[2] = {0x00, powerRaw}; + SPIwriteRegisterBurst(RADIOLIB_CC1101_REG_PATABLE, paValues, 2); + return(RADIOLIB_ERR_NONE); + + } else { + // Freq modulation: + // PA_TABLE[0] is the power to be used when transmitting. + return(SPIsetRegValue(RADIOLIB_CC1101_REG_PATABLE, powerRaw)); + } +} + +int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits, bool requireCarrierSense) { + if((maxErrBits > 1) || (len != 2)) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + + // sync word must not contain value 0x00 + for(uint8_t i = 0; i < len; i++) { + if(syncWord[i] == 0x00) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + } + + // enable sync word filtering + int16_t state = enableSyncWordFiltering(maxErrBits, requireCarrierSense); + RADIOLIB_ASSERT(state); + + // set sync word register + state = SPIsetRegValue(RADIOLIB_CC1101_REG_SYNC1, syncWord[0]); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_SYNC0, syncWord[1]); + + return(state); +} + +int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits, bool requireCarrierSense) { + uint8_t syncWord[] = { syncH, syncL }; + return(setSyncWord(syncWord, sizeof(syncWord), maxErrBits, requireCarrierSense)); +} + +int16_t CC1101::setPreambleLength(uint8_t preambleLength, uint8_t qualityThreshold) { + // check allowed values + uint8_t value; + switch(preambleLength) { + case 16: + value = RADIOLIB_CC1101_NUM_PREAMBLE_2; + break; + case 24: + value = RADIOLIB_CC1101_NUM_PREAMBLE_3; + break; + case 32: + value = RADIOLIB_CC1101_NUM_PREAMBLE_4; + break; + case 48: + value = RADIOLIB_CC1101_NUM_PREAMBLE_6; + break; + case 64: + value = RADIOLIB_CC1101_NUM_PREAMBLE_8; + break; + case 96: + value = RADIOLIB_CC1101_NUM_PREAMBLE_12; + break; + case 128: + value = RADIOLIB_CC1101_NUM_PREAMBLE_16; + break; + case 192: + value = RADIOLIB_CC1101_NUM_PREAMBLE_24; + break; + default: + return(RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH); + } + + // set preabmble quality threshold and the actual length + uint8_t pqt = qualityThreshold/4; + if(pqt > 7) { + pqt = 7; + } + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL1, pqt << 5, 7, 5); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG1, value, 6, 4); + return(state); +} + +int16_t CC1101::setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs) { + RADIOLIB_CHECK_RANGE(numBroadcastAddrs, 1, 2, RADIOLIB_ERR_INVALID_NUM_BROAD_ADDRS); + + // enable address filtering + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL1, numBroadcastAddrs + 0x01, 1, 0); + RADIOLIB_ASSERT(state); + + // set node address + return(SPIsetRegValue(RADIOLIB_CC1101_REG_ADDR, nodeAddr)); +} + +int16_t CC1101::disableAddressFiltering() { + // disable address filtering + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL1, RADIOLIB_CC1101_ADR_CHK_NONE, 1, 0); + RADIOLIB_ASSERT(state); + + // set node address to default (0x00) + return(SPIsetRegValue(RADIOLIB_CC1101_REG_ADDR, 0x00)); +} + + +int16_t CC1101::setOOK(bool enableOOK) { + // Change modulation + if(enableOOK) { + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, RADIOLIB_CC1101_MOD_FORMAT_ASK_OOK, 6, 4); + RADIOLIB_ASSERT(state); + + // PA_TABLE[0] is (by default) the power value used when transmitting a "0". + // Set PA_TABLE[1] to be used when transmitting a "1". + state = SPIsetRegValue(RADIOLIB_CC1101_REG_FREND0, 1, 2, 0); + RADIOLIB_ASSERT(state); + + // update current modulation + this->modulation = RADIOLIB_CC1101_MOD_FORMAT_ASK_OOK; + } else { + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, RADIOLIB_CC1101_MOD_FORMAT_2_FSK, 6, 4); + RADIOLIB_ASSERT(state); + + // Reset FREND0 to default value. + state = SPIsetRegValue(RADIOLIB_CC1101_REG_FREND0, 0, 2, 0); + RADIOLIB_ASSERT(state); + + // update current modulation + this->modulation = RADIOLIB_CC1101_MOD_FORMAT_2_FSK; + } + + // Update PA_TABLE values according to the new this->modulation. + return(setOutputPower(this->power)); +} + +float CC1101::getRSSI() { + float rssi; + + if (this->directModeEnabled) { + if(this->rawRSSI >= 128) { + rssi = (((float)this->rawRSSI - 256.0)/2.0) - 74.0; + } else { + rssi = (((float)this->rawRSSI)/2.0) - 74.0; + } + } else { + uint8_t rawRssi = SPIreadRegister(RADIOLIB_CC1101_REG_RSSI); + if (rawRssi >= 128) + { + rssi = ((rawRssi - 256) / 2) - 74; + } + else + { + rssi = (rawRssi / 2) - 74; + } + } + return(rssi); +} + +uint8_t CC1101::getLQI() const { + return(this->rawLQI); +} + +size_t CC1101::getPacketLength(bool update) { + if(!this->packetLengthQueried && update) { + if(this->packetLengthConfig == RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE) { + this->packetLength = SPIreadRegister(RADIOLIB_CC1101_REG_FIFO); + } else { + this->packetLength = SPIreadRegister(RADIOLIB_CC1101_REG_PKTLEN); + } + + this->packetLengthQueried = true; + } + + return(this->packetLength); +} + +int16_t CC1101::fixedPacketLengthMode(uint8_t len) { + if(len == 0) { + // infinite packet mode + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_LENGTH_CONFIG_INFINITE, 1, 0); + RADIOLIB_ASSERT(state); + } + + return(setPacketMode(RADIOLIB_CC1101_LENGTH_CONFIG_FIXED, len)); +} + +int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { + return(setPacketMode(RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE, maxLen)); +} + +int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits, bool requireCarrierSense) { + int16_t state = RADIOLIB_ERR_NONE; + + switch(maxErrBits) { + case 0: + // in 16 bit sync word, expect all 16 bits + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, (requireCarrierSense ? RADIOLIB_CC1101_SYNC_MODE_16_16_THR : RADIOLIB_CC1101_SYNC_MODE_16_16), 2, 0); + break; + case 1: + // in 16 bit sync word, expect at least 15 bits + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, (requireCarrierSense ? RADIOLIB_CC1101_SYNC_MODE_15_16_THR : RADIOLIB_CC1101_SYNC_MODE_15_16), 2, 0); + break; + default: + state = RADIOLIB_ERR_INVALID_SYNC_WORD; + break; + } + return(state); +} + +int16_t CC1101::disableSyncWordFiltering(bool requireCarrierSense) { + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, (requireCarrierSense ? RADIOLIB_CC1101_SYNC_MODE_NONE_THR : RADIOLIB_CC1101_SYNC_MODE_NONE), 2, 0); + return(state); +} + +int16_t CC1101::setCrcFiltering(bool enable) { + this->crcOn = enable; + + if (this->crcOn == true) { + return(SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_CRC_ON, 2, 2)); + } else { + return(SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_CRC_OFF, 2, 2)); + } +} + +int16_t CC1101::setPromiscuousMode(bool enable) { + int16_t state = RADIOLIB_ERR_NONE; + + if(this->promiscuous == enable) { + return(state); + } + + if(enable) { + // disable sync word filtering and insertion + // this also disables preamble + state = disableSyncWordFiltering(); + RADIOLIB_ASSERT(state); + + // disable CRC filtering + state = setCrcFiltering(false); + } else { + state = setPreambleLength(RADIOLIB_CC1101_DEFAULT_PREAMBLELEN, RADIOLIB_CC1101_DEFAULT_PREAMBLELEN/4); + RADIOLIB_ASSERT(state); + + // enable sync word filtering and insertion + state = enableSyncWordFiltering(); + RADIOLIB_ASSERT(state); + + // enable CRC filtering + state = setCrcFiltering(true); + } + + this->promiscuous = enable; + + return(state); +} + +bool CC1101::getPromiscuousMode() { + return (this->promiscuous); +} + +int16_t CC1101::setDataShaping(uint8_t sh) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set data shaping + switch(sh) { + case RADIOLIB_SHAPING_NONE: + state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, RADIOLIB_CC1101_MOD_FORMAT_2_FSK, 6, 4); + break; + case RADIOLIB_SHAPING_0_5: + state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, RADIOLIB_CC1101_MOD_FORMAT_GFSK, 6, 4); + break; + default: + return(RADIOLIB_ERR_INVALID_DATA_SHAPING); + } + return(state); +} + +int16_t CC1101::setEncoding(uint8_t encoding) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set encoding + switch(encoding) { + case RADIOLIB_ENCODING_NRZ: + state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, RADIOLIB_CC1101_MANCHESTER_EN_OFF, 3, 3); + RADIOLIB_ASSERT(state); + return(SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_WHITE_DATA_OFF, 6, 6)); + case RADIOLIB_ENCODING_MANCHESTER: + state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, RADIOLIB_CC1101_MANCHESTER_EN_ON, 3, 3); + RADIOLIB_ASSERT(state); + return(SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_WHITE_DATA_OFF, 6, 6)); + case RADIOLIB_ENCODING_WHITENING: + state = SPIsetRegValue(RADIOLIB_CC1101_REG_MDMCFG2, RADIOLIB_CC1101_MANCHESTER_EN_OFF, 3, 3); + RADIOLIB_ASSERT(state); + return(SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_WHITE_DATA_ON, 6, 6)); + default: + return(RADIOLIB_ERR_INVALID_ENCODING); + } +} + +void CC1101::setRfSwitchPins(uint32_t rxEn, uint32_t txEn) { + this->mod->setRfSwitchPins(rxEn, txEn); +} + +void CC1101::setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]) { + this->mod->setRfSwitchTable(pins, table); +} + +uint8_t CC1101::randomByte() { + // set mode to Rx + SPIsendCommand(RADIOLIB_CC1101_CMD_RX); + RADIOLIB_DEBUG_PRINTLN("CC1101::randomByte"); + + // wait a bit for the RSSI reading to stabilise + this->mod->hal->delay(10); + + // read RSSI value 8 times, always keep just the least significant bit + uint8_t randByte = 0x00; + for(uint8_t i = 0; i < 8; i++) { + randByte |= ((SPIreadRegister(RADIOLIB_CC1101_REG_RSSI) & 0x01) << i); + } + + // set mode to standby + SPIsendCommand(RADIOLIB_CC1101_CMD_IDLE); + + return(randByte); +} + +int16_t CC1101::getChipVersion() { + return(SPIgetRegValue(RADIOLIB_CC1101_REG_VERSION)); +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +void CC1101::setDirectAction(void (*func)(void)) { + setGdo0Action(func, this->mod->hal->GpioInterruptRising); +} + +void CC1101::readBit(uint32_t pin) { + updateDirectBuffer((uint8_t)this->mod->hal->digitalRead(pin)); +} +#endif + +int16_t CC1101::setDIOMapping(uint32_t pin, uint32_t value) { + if(pin > 2) { + return(RADIOLIB_ERR_INVALID_DIO_PIN); + } + + return(SPIsetRegValue(RADIOLIB_CC1101_REG_IOCFG0 - pin, value)); +} + +int16_t CC1101::config() { + // Reset the radio. Registers may be dirty from previous usage. + reset(); + + // Wait a ridiculous amount of time to be sure radio is ready. + this->mod->hal->delay(150); + + standby(); + + // enable automatic frequency synthesizer calibration and disable pin control + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_MCSM0, RADIOLIB_CC1101_FS_AUTOCAL_IDLE_TO_RXTX, 5, 4); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_MCSM0, RADIOLIB_CC1101_PIN_CTRL_OFF, 1, 1); + RADIOLIB_ASSERT(state); + + // set GDOs to Hi-Z so that it doesn't output clock on startup (might confuse GDO0 action) + state = SPIsetRegValue(RADIOLIB_CC1101_REG_IOCFG0, RADIOLIB_CC1101_GDOX_HIGH_Z, 5, 0); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_IOCFG2, RADIOLIB_CC1101_GDOX_HIGH_Z, 5, 0); + RADIOLIB_ASSERT(state); + + // set packet mode + state = packetMode(); + + return(state); +} + +int16_t CC1101::directMode(bool sync) { + // set mode to standby + SPIsendCommand(RADIOLIB_CC1101_CMD_IDLE); + + int16_t state = 0; + this->directModeEnabled = sync; + if(sync) { + // set GDO0 and GDO2 mapping + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_IOCFG0, RADIOLIB_CC1101_GDOX_SERIAL_CLOCK , 5, 0); + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_IOCFG2, RADIOLIB_CC1101_GDOX_SERIAL_DATA_SYNC , 5, 0); + + // set continuous mode + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_PKT_FORMAT_SYNCHRONOUS, 5, 4); + } else { + // set GDO0 mapping + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_IOCFG0, RADIOLIB_CC1101_GDOX_SERIAL_DATA_ASYNC , 5, 0); + + // set asynchronous continuous mode + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_PKT_FORMAT_ASYNCHRONOUS, 5, 4); + } + + state |= SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, RADIOLIB_CC1101_LENGTH_CONFIG_INFINITE, 1, 0); + return(state); +} + +void CC1101::getExpMant(float target, uint16_t mantOffset, uint8_t divExp, uint8_t expMax, uint8_t& exp, uint8_t& mant) { + // get table origin point (exp = 0, mant = 0) + float origin = (mantOffset * RADIOLIB_CC1101_CRYSTAL_FREQ * 1000000.0)/((uint32_t)1 << divExp); + + // iterate over possible exponent values + for(int8_t e = expMax; e >= 0; e--) { + // get table column start value (exp = e, mant = 0); + float intervalStart = ((uint32_t)1 << e) * origin; + + // check if target value is in this column + if(target >= intervalStart) { + // save exponent value + exp = e; + + // calculate size of step between table rows + float stepSize = intervalStart/(float)mantOffset; + + // get target point position (exp = e, mant = m) + mant = ((target - intervalStart) / stepSize); + + // we only need the first match, terminate + return; + } + } +} + +int16_t CC1101::setPacketMode(uint8_t mode, uint16_t len) { + // check length + if (len > RADIOLIB_CC1101_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set PKTCTRL0.LENGTH_CONFIG + int16_t state = SPIsetRegValue(RADIOLIB_CC1101_REG_PKTCTRL0, mode, 1, 0); + RADIOLIB_ASSERT(state); + + // set length to register + state = SPIsetRegValue(RADIOLIB_CC1101_REG_PKTLEN, len); + RADIOLIB_ASSERT(state); + + // update the cached value + this->packetLength = len; + this->packetLengthConfig = mode; + return(state); +} + +int16_t CC1101::SPIgetRegValue(uint8_t reg, uint8_t msb, uint8_t lsb) { + // status registers require special command + if((reg > RADIOLIB_CC1101_REG_TEST0) && (reg < RADIOLIB_CC1101_REG_PATABLE)) { + reg |= RADIOLIB_CC1101_CMD_ACCESS_STATUS_REG; + } + + return(this->mod->SPIgetRegValue(reg, msb, lsb)); +} + +int16_t CC1101::SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb, uint8_t lsb, uint8_t checkInterval) { + // status registers require special command + if((reg > RADIOLIB_CC1101_REG_TEST0) && (reg < RADIOLIB_CC1101_REG_PATABLE)) { + reg |= RADIOLIB_CC1101_CMD_ACCESS_STATUS_REG; + } + + return(this->mod->SPIsetRegValue(reg, value, msb, lsb, checkInterval)); +} + +void CC1101::SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes) { + this->mod->SPIreadRegisterBurst(reg | RADIOLIB_CC1101_CMD_BURST, numBytes, inBytes); +} + +uint8_t CC1101::SPIreadRegister(uint8_t reg) { + // status registers require special command + if((reg > RADIOLIB_CC1101_REG_TEST0) && (reg < RADIOLIB_CC1101_REG_PATABLE)) { + reg |= RADIOLIB_CC1101_CMD_ACCESS_STATUS_REG; + } + + return(this->mod->SPIreadRegister(reg)); +} + +void CC1101::SPIwriteRegister(uint8_t reg, uint8_t data) { + // status registers require special command + if((reg > RADIOLIB_CC1101_REG_TEST0) && (reg < RADIOLIB_CC1101_REG_PATABLE)) { + reg |= RADIOLIB_CC1101_CMD_ACCESS_STATUS_REG; + } + + return(this->mod->SPIwriteRegister(reg, data)); +} + +void CC1101::SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, size_t len) { + this->mod->SPIwriteRegisterBurst(reg | RADIOLIB_CC1101_CMD_BURST, data, len); +} + +void CC1101::SPIsendCommand(uint8_t cmd) { + // pull NSS low + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelLow); + + // start transfer + this->mod->hal->spiBeginTransaction(); + + // send the command byte + uint8_t status = 0; + this->mod->hal->spiTransfer(&cmd, 1, &status); + + // stop transfer + this->mod->hal->spiEndTransaction(); + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelHigh); + RADIOLIB_VERBOSE_PRINTLN("CMD\tW\t%02X\t%02X", cmd, status); + (void)status; +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/CC1101/CC1101.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/CC1101/CC1101.h new file mode 100644 index 00000000..2e83d926 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/CC1101/CC1101.h @@ -0,0 +1,990 @@ +#if !defined(_RADIOLIB_CC1101_H) && !defined(RADIOLIB_EXCLUDE_CC1101) +#define _RADIOLIB_CC1101_H + +#include "../../TypeDef.h" +#include "../../Module.h" + +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" + +// CC1101 physical layer properties +#define RADIOLIB_CC1101_FREQUENCY_STEP_SIZE 396.7285156 +#define RADIOLIB_CC1101_MAX_PACKET_LENGTH 63 +#define RADIOLIB_CC1101_CRYSTAL_FREQ 26.0 +#define RADIOLIB_CC1101_DIV_EXPONENT 16 + +// CC1101 SPI commands +#define RADIOLIB_CC1101_CMD_READ 0b10000000 +#define RADIOLIB_CC1101_CMD_WRITE 0b00000000 +#define RADIOLIB_CC1101_CMD_BURST 0b01000000 +#define RADIOLIB_CC1101_CMD_ACCESS_STATUS_REG 0b01000000 +#define RADIOLIB_CC1101_CMD_FIFO_RX 0b10000000 +#define RADIOLIB_CC1101_CMD_FIFO_TX 0b00000000 +#define RADIOLIB_CC1101_CMD_RESET 0x30 +#define RADIOLIB_CC1101_CMD_FSTXON 0x31 +#define RADIOLIB_CC1101_CMD_XOFF 0x32 +#define RADIOLIB_CC1101_CMD_CAL 0x33 +#define RADIOLIB_CC1101_CMD_RX 0x34 +#define RADIOLIB_CC1101_CMD_TX 0x35 +#define RADIOLIB_CC1101_CMD_IDLE 0x36 +#define RADIOLIB_CC1101_CMD_WOR 0x38 +#define RADIOLIB_CC1101_CMD_POWER_DOWN 0x39 +#define RADIOLIB_CC1101_CMD_FLUSH_RX 0x3A +#define RADIOLIB_CC1101_CMD_FLUSH_TX 0x3B +#define RADIOLIB_CC1101_CMD_WOR_RESET 0x3C +#define RADIOLIB_CC1101_CMD_NOP 0x3D + +// CC1101 register map +#define RADIOLIB_CC1101_REG_IOCFG2 0x00 +#define RADIOLIB_CC1101_REG_IOCFG1 0x01 +#define RADIOLIB_CC1101_REG_IOCFG0 0x02 +#define RADIOLIB_CC1101_REG_FIFOTHR 0x03 +#define RADIOLIB_CC1101_REG_SYNC1 0x04 +#define RADIOLIB_CC1101_REG_SYNC0 0x05 +#define RADIOLIB_CC1101_REG_PKTLEN 0x06 +#define RADIOLIB_CC1101_REG_PKTCTRL1 0x07 +#define RADIOLIB_CC1101_REG_PKTCTRL0 0x08 +#define RADIOLIB_CC1101_REG_ADDR 0x09 +#define RADIOLIB_CC1101_REG_CHANNR 0x0A +#define RADIOLIB_CC1101_REG_FSCTRL1 0x0B +#define RADIOLIB_CC1101_REG_FSCTRL0 0x0C +#define RADIOLIB_CC1101_REG_FREQ2 0x0D +#define RADIOLIB_CC1101_REG_FREQ1 0x0E +#define RADIOLIB_CC1101_REG_FREQ0 0x0F +#define RADIOLIB_CC1101_REG_MDMCFG4 0x10 +#define RADIOLIB_CC1101_REG_MDMCFG3 0x11 +#define RADIOLIB_CC1101_REG_MDMCFG2 0x12 +#define RADIOLIB_CC1101_REG_MDMCFG1 0x13 +#define RADIOLIB_CC1101_REG_MDMCFG0 0x14 +#define RADIOLIB_CC1101_REG_DEVIATN 0x15 +#define RADIOLIB_CC1101_REG_MCSM2 0x16 +#define RADIOLIB_CC1101_REG_MCSM1 0x17 +#define RADIOLIB_CC1101_REG_MCSM0 0x18 +#define RADIOLIB_CC1101_REG_FOCCFG 0x19 +#define RADIOLIB_CC1101_REG_BSCFG 0x1A +#define RADIOLIB_CC1101_REG_AGCCTRL2 0x1B +#define RADIOLIB_CC1101_REG_AGCCTRL1 0x1C +#define RADIOLIB_CC1101_REG_AGCCTRL0 0x1D +#define RADIOLIB_CC1101_REG_WOREVT1 0x1E +#define RADIOLIB_CC1101_REG_WOREVT0 0x1F +#define RADIOLIB_CC1101_REG_WORCTRL 0x20 +#define RADIOLIB_CC1101_REG_FREND1 0x21 +#define RADIOLIB_CC1101_REG_FREND0 0x22 +#define RADIOLIB_CC1101_REG_FSCAL3 0x23 +#define RADIOLIB_CC1101_REG_FSCAL2 0x24 +#define RADIOLIB_CC1101_REG_FSCAL1 0x25 +#define RADIOLIB_CC1101_REG_FSCAL0 0x26 +#define RADIOLIB_CC1101_REG_RCCTRL1 0x27 +#define RADIOLIB_CC1101_REG_RCCTRL0 0x28 +#define RADIOLIB_CC1101_REG_FSTEST 0x29 +#define RADIOLIB_CC1101_REG_PTEST 0x2A +#define RADIOLIB_CC1101_REG_AGCTEST 0x2B +#define RADIOLIB_CC1101_REG_TEST2 0x2C +#define RADIOLIB_CC1101_REG_TEST1 0x2D +#define RADIOLIB_CC1101_REG_TEST0 0x2E +#define RADIOLIB_CC1101_REG_PARTNUM 0x30 +#define RADIOLIB_CC1101_REG_VERSION 0x31 +#define RADIOLIB_CC1101_REG_FREQEST 0x32 +#define RADIOLIB_CC1101_REG_LQI 0x33 +#define RADIOLIB_CC1101_REG_RSSI 0x34 +#define RADIOLIB_CC1101_REG_MARCSTATE 0x35 +#define RADIOLIB_CC1101_REG_WORTIME1 0x36 +#define RADIOLIB_CC1101_REG_WORTIME0 0x37 +#define RADIOLIB_CC1101_REG_PKTSTATUS 0x38 +#define RADIOLIB_CC1101_REG_VCO_VC_DAC 0x39 +#define RADIOLIB_CC1101_REG_TXBYTES 0x3A +#define RADIOLIB_CC1101_REG_RXBYTES 0x3B +#define RADIOLIB_CC1101_REG_RCCTRL1_STATUS 0x3C +#define RADIOLIB_CC1101_REG_RCCTRL0_STATUS 0x3D +#define RADIOLIB_CC1101_REG_PATABLE 0x3E +#define RADIOLIB_CC1101_REG_FIFO 0x3F + +// status byte (returned during SPI transactions) MSB LSB DESCRIPTION +#define RADIOLIB_CC1101_STATUS_CHIP_READY 0b00000000 // 7 7 chip ready +#define RADIOLIB_CC1101_STATUS_CHIP_NOT_READY 0b10000000 // 7 7 chip not ready (power/crystal not stable) +#define RADIOLIB_CC1101_STATUS_IDLE 0b00000000 // 6 4 idle +#define RADIOLIB_CC1101_STATUS_RX 0b00010000 // 6 4 Rx +#define RADIOLIB_CC1101_STATUS_TX 0b00100000 // 6 4 Tx +#define RADIOLIB_CC1101_STATUS_FSTXON 0b00110000 // 6 4 Fast Tx ready +#define RADIOLIB_CC1101_STATUS_CALIBRATE 0b01000000 // 6 4 synthesizer calibration running +#define RADIOLIB_CC1101_STATUS_SETTLING 0b01010000 // 6 4 PLL settling +#define RADIOLIB_CC1101_STATUS_RXFIFO_OVERFLOW 0b01100000 // 6 4 Rx FIFO overflow +#define RADIOLIB_CC1101_STATUS_TXFIFO_UNDERFLOW 0b01110000 // 6 4 Tx FIFO underflow + +// RADIOLIB_CC1101_REG_IOCFG2 +#define RADIOLIB_CC1101_GDO2_NORM 0b00000000 // 6 6 GDO2 output: active high (default) +#define RADIOLIB_CC1101_GDO2_INV 0b01000000 // 6 6 active low + +// RADIOLIB_CC1101_REG_IOCFG1 +#define RADIOLIB_CC1101_GDO_DS_LOW 0b00000000 // 7 7 GDOx output drive strength: low (default) +#define RADIOLIB_CC1101_GDO_DS_HIGH 0b10000000 // 7 7 high +#define RADIOLIB_CC1101_GDO1_NORM 0b00000000 // 6 6 GDO1 output: active high (default) +#define RADIOLIB_CC1101_GDO1_INV 0b01000000 // 6 6 active low + +// RADIOLIB_CC1101_REG_IOCFG0 +#define RADIOLIB_CC1101_GDO0_TEMP_SENSOR_OFF 0b00000000 // 7 7 analog temperature sensor output: disabled (default) +#define RADIOLIB_CC1101_GDO0_TEMP_SENSOR_ON 0b10000000 // 7 7 enabled +#define RADIOLIB_CC1101_GDO0_NORM 0b00000000 // 6 6 GDO0 output: active high (default) +#define RADIOLIB_CC1101_GDO0_INV 0b01000000 // 6 6 active low + +// RADIOLIB_CC1101_REG_IOCFG2 + REG_IOCFG1 + REG_IOCFG0 +#define RADIOLIB_CC1101_GDOX_RX_FIFO_FULL 0x00 // 5 0 Rx FIFO full or above threshold +#define RADIOLIB_CC1101_GDOX_RX_FIFO_FULL_OR_PKT_END 0x01 // 5 0 Rx FIFO full or above threshold or reached packet end +#define RADIOLIB_CC1101_GDOX_TX_FIFO_ABOVE_THR 0x02 // 5 0 Tx FIFO above threshold +#define RADIOLIB_CC1101_GDOX_TX_FIFO_FULL 0x03 // 5 0 Tx FIFO full +#define RADIOLIB_CC1101_GDOX_RX_FIFO_OVERFLOW 0x04 // 5 0 Rx FIFO overflowed +#define RADIOLIB_CC1101_GDOX_TX_FIFO_UNDERFLOW 0x05 // 5 0 Tx FIFO underflowed +#define RADIOLIB_CC1101_GDOX_SYNC_WORD_SENT_OR_PKT_RECEIVED 0x06 // 5 0 sync word was sent or packet was received +#define RADIOLIB_CC1101_GDOX_PKT_RECEIVED_CRC_OK 0x07 // 5 0 packet received and CRC check passed +#define RADIOLIB_CC1101_GDOX_PREAMBLE_QUALITY_REACHED 0x08 // 5 0 received preamble quality is above threshold +#define RADIOLIB_CC1101_GDOX_CHANNEL_CLEAR 0x09 // 5 0 RSSI level below threshold (channel is clear) +#define RADIOLIB_CC1101_GDOX_PLL_LOCKED 0x0A // 5 0 PLL is locked +#define RADIOLIB_CC1101_GDOX_SERIAL_CLOCK 0x0B // 5 0 serial data clock +#define RADIOLIB_CC1101_GDOX_SERIAL_DATA_SYNC 0x0C // 5 0 serial data output in: synchronous mode +#define RADIOLIB_CC1101_GDOX_SERIAL_DATA_ASYNC 0x0D // 5 0 asynchronous mode +#define RADIOLIB_CC1101_GDOX_CARRIER_SENSE 0x0E // 5 0 RSSI above threshold +#define RADIOLIB_CC1101_GDOX_CRC_OK 0x0F // 5 0 CRC check passed +#define RADIOLIB_CC1101_GDOX_RX_HARD_DATA1 0x16 // 5 0 direct access to demodulated data +#define RADIOLIB_CC1101_GDOX_RX_HARD_DATA0 0x17 // 5 0 direct access to demodulated data +#define RADIOLIB_CC1101_GDOX_PA_PD 0x1B // 5 0 power amplifier circuit is powered down +#define RADIOLIB_CC1101_GDOX_LNA_PD 0x1C // 5 0 low-noise amplifier circuit is powered down +#define RADIOLIB_CC1101_GDOX_RX_SYMBOL_TICK 0x1D // 5 0 direct access to symbol tick of received data +#define RADIOLIB_CC1101_GDOX_WOR_EVNT0 0x24 // 5 0 wake-on-radio event 0 +#define RADIOLIB_CC1101_GDOX_WOR_EVNT1 0x25 // 5 0 wake-on-radio event 1 +#define RADIOLIB_CC1101_GDOX_CLK_256 0x26 // 5 0 256 Hz clock +#define RADIOLIB_CC1101_GDOX_CLK_32K 0x27 // 5 0 32 kHz clock +#define RADIOLIB_CC1101_GDOX_CHIP_RDYN 0x29 // 5 0 (default for GDO2) +#define RADIOLIB_CC1101_GDOX_XOSC_STABLE 0x2B // 5 0 +#define RADIOLIB_CC1101_GDOX_HIGH_Z 0x2E // 5 0 high impedance state (default for GDO1) +#define RADIOLIB_CC1101_GDOX_HW_TO_0 0x2F // 5 0 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_1 0x30 // 5 0 crystal oscillator clock: f = f(XOSC)/1 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_1_5 0x31 // 5 0 f = f(XOSC)/1.5 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_2 0x32 // 5 0 f = f(XOSC)/2 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_3 0x33 // 5 0 f = f(XOSC)/3 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_4 0x34 // 5 0 f = f(XOSC)/4 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_6 0x35 // 5 0 f = f(XOSC)/6 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_8 0x36 // 5 0 f = f(XOSC)/8 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_12 0x37 // 5 0 f = f(XOSC)/12 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_16 0x38 // 5 0 f = f(XOSC)/16 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_24 0x39 // 5 0 f = f(XOSC)/24 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_32 0x3A // 5 0 f = f(XOSC)/32 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_48 0x3B // 5 0 f = f(XOSC)/48 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_64 0x3C // 5 0 f = f(XOSC)/64 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_96 0x3D // 5 0 f = f(XOSC)/96 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_128 0x3E // 5 0 f = f(XOSC)/128 +#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_192 0x3F // 5 0 f = f(XOSC)/192 (default for GDO0) + +// RADIOLIB_CC1101_REG_FIFOTHR +#define RADIOLIB_CC1101_ADC_RETENTION_OFF 0b00000000 // 6 6 do not retain ADC settings in sleep mode (default) +#define RADIOLIB_CC1101_ADC_RETENTION_ON 0b01000000 // 6 6 retain ADC settings in sleep mode +#define RADIOLIB_CC1101_RX_ATTEN_0_DB 0b00000000 // 5 4 Rx attenuation: 0 dB (default) +#define RADIOLIB_CC1101_RX_ATTEN_6_DB 0b00010000 // 5 4 6 dB +#define RADIOLIB_CC1101_RX_ATTEN_12_DB 0b00100000 // 5 4 12 dB +#define RADIOLIB_CC1101_RX_ATTEN_18_DB 0b00110000 // 5 4 18 dB +#define RADIOLIB_CC1101_FIFO_THR_TX_61_RX_4 0b00000000 // 3 0 TX fifo threshold: 61, RX fifo threshold: 4 +#define RADIOLIB_CC1101_FIFO_THR_TX_33_RX_32 0b00000111 // 3 0 TX fifo threshold: 33, RX fifo threshold: 32 +#define RADIOLIB_CC1101_FIFO_THRESH_TX 33 +#define RADIOLIB_CC1101_FIFO_THRESH_RX 32 + +// RADIOLIB_CC1101_REG_SYNC1 +#define RADIOLIB_CC1101_SYNC_WORD_MSB 0xD3 // 7 0 sync word MSB + +// RADIOLIB_CC1101_REG_SYNC0 +#define RADIOLIB_CC1101_SYNC_WORD_LSB 0x91 // 7 0 sync word LSB + +// RADIOLIB_CC1101_REG_PKTLEN +#define RADIOLIB_CC1101_PACKET_LENGTH 0xFF // 7 0 packet length in bytes + +// RADIOLIB_CC1101_REG_PKTCTRL1 +#define RADIOLIB_CC1101_PQT 0x00 // 7 5 preamble quality threshold +#define RADIOLIB_CC1101_CRC_AUTOFLUSH_OFF 0b00000000 // 3 3 automatic Rx FIFO flush on CRC check fail: disabled (default) +#define RADIOLIB_CC1101_CRC_AUTOFLUSH_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_CC1101_APPEND_STATUS_OFF 0b00000000 // 2 2 append 2 status bytes to packet: disabled +#define RADIOLIB_CC1101_APPEND_STATUS_ON 0b00000100 // 2 2 enabled (default) +#define RADIOLIB_CC1101_ADR_CHK_NONE 0b00000000 // 1 0 address check: none (default) +#define RADIOLIB_CC1101_ADR_CHK_NO_BROADCAST 0b00000001 // 1 0 without broadcast +#define RADIOLIB_CC1101_ADR_CHK_SINGLE_BROADCAST 0b00000010 // 1 0 broadcast address 0x00 +#define RADIOLIB_CC1101_ADR_CHK_DOUBLE_BROADCAST 0b00000011 // 1 0 broadcast addresses 0x00 and 0xFF + +// RADIOLIB_CC1101_REG_PKTCTRL0 +#define RADIOLIB_CC1101_WHITE_DATA_OFF 0b00000000 // 6 6 data whitening: disabled +#define RADIOLIB_CC1101_WHITE_DATA_ON 0b01000000 // 6 6 enabled (default) +#define RADIOLIB_CC1101_PKT_FORMAT_NORMAL 0b00000000 // 5 4 packet format: normal (FIFOs) +#define RADIOLIB_CC1101_PKT_FORMAT_SYNCHRONOUS 0b00010000 // 5 4 synchronous serial +#define RADIOLIB_CC1101_PKT_FORMAT_RANDOM 0b00100000 // 5 4 random transmissions +#define RADIOLIB_CC1101_PKT_FORMAT_ASYNCHRONOUS 0b00110000 // 5 4 asynchronous serial +#define RADIOLIB_CC1101_CRC_OFF 0b00000000 // 2 2 CRC disabled +#define RADIOLIB_CC1101_CRC_ON 0b00000100 // 2 2 CRC enabled (default) +#define RADIOLIB_CC1101_LENGTH_CONFIG_FIXED 0b00000000 // 1 0 packet length: fixed +#define RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE 0b00000001 // 1 0 variable (default) +#define RADIOLIB_CC1101_LENGTH_CONFIG_INFINITE 0b00000010 // 1 0 infinite + +// RADIOLIB_CC1101_REG_ADDR +#define RADIOLIB_CC1101_DEVICE_ADDR 0x00 // 7 0 device address + +// RADIOLIB_CC1101_REG_CHANNR +#define RADIOLIB_CC1101_CHAN 0x00 // 7 0 channel number + +// RADIOLIB_CC1101_REG_FSCTRL1 +#define RADIOLIB_CC1101_FREQ_IF 0x0F // 4 0 IF frequency setting; f_IF = (f(XOSC) / 2^10) * CC1101_FREQ_IF + +// CC1101_REG_FSCTRL0 +#define RADIOLIB_CC1101_FREQOFF 0x00 // 7 0 base frequency offset (2s-compliment) + +// RADIOLIB_CC1101_REG_FREQ2 + REG_FREQ1 + REG_FREQ0 +#define RADIOLIB_CC1101_FREQ_MSB 0x1E // 5 0 base frequency setting: f_carrier = (f(XOSC) / 2^16) * FREQ +#define RADIOLIB_CC1101_FREQ_MID 0xC4 // 7 0 where f(XOSC) = 26 MHz +#define RADIOLIB_CC1101_FREQ_LSB 0xEC // 7 0 FREQ = 3-byte value of FREQ registers + +// RADIOLIB_CC1101_REG_MDMCFG4 +#define RADIOLIB_CC1101_CHANBW_E 0b10000000 // 7 6 channel bandwidth: BW_channel = f(XOSC) / (8 * (4 + CHANBW_M)*2^CHANBW_E) [Hz] +#define RADIOLIB_CC1101_CHANBW_M 0b00000000 // 5 4 default value for 26 MHz crystal: 203 125 Hz +#define RADIOLIB_CC1101_DRATE_E 0x0C // 3 0 symbol rate: R_data = (((256 + DRATE_M) * 2^DRATE_E) / 2^28) * f(XOSC) [Baud] + +// RADIOLIB_CC1101_REG_MDMCFG3 +#define RADIOLIB_CC1101_DRATE_M 0x22 // 7 0 default value for 26 MHz crystal: 115 051 Baud + +// RADIOLIB_CC1101_REG_MDMCFG2 +#define RADIOLIB_CC1101_DEM_DCFILT_OFF 0b10000000 // 7 7 digital DC filter: disabled +#define RADIOLIB_CC1101_DEM_DCFILT_ON 0b00000000 // 7 7 enabled - only for data rates above 250 kBaud (default) +#define RADIOLIB_CC1101_MOD_FORMAT_2_FSK 0b00000000 // 6 4 modulation format: 2-FSK (default) +#define RADIOLIB_CC1101_MOD_FORMAT_GFSK 0b00010000 // 6 4 GFSK +#define RADIOLIB_CC1101_MOD_FORMAT_ASK_OOK 0b00110000 // 6 4 ASK/OOK +#define RADIOLIB_CC1101_MOD_FORMAT_4_FSK 0b01000000 // 6 4 4-FSK +#define RADIOLIB_CC1101_MOD_FORMAT_MFSK 0b01110000 // 6 4 MFSK - only for data rates above 26 kBaud +#define RADIOLIB_CC1101_MANCHESTER_EN_OFF 0b00000000 // 3 3 Manchester encoding: disabled (default) +#define RADIOLIB_CC1101_MANCHESTER_EN_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_CC1101_SYNC_MODE_NONE 0b00000000 // 2 0 synchronization: no preamble/sync +#define RADIOLIB_CC1101_SYNC_MODE_15_16 0b00000001 // 2 0 15/16 sync word bits +#define RADIOLIB_CC1101_SYNC_MODE_16_16 0b00000010 // 2 0 16/16 sync word bits (default) +#define RADIOLIB_CC1101_SYNC_MODE_30_32 0b00000011 // 2 0 30/32 sync word bits +#define RADIOLIB_CC1101_SYNC_MODE_NONE_THR 0b00000100 // 2 0 no preamble sync, carrier sense above threshold +#define RADIOLIB_CC1101_SYNC_MODE_15_16_THR 0b00000101 // 2 0 15/16 sync word bits, carrier sense above threshold +#define RADIOLIB_CC1101_SYNC_MODE_16_16_THR 0b00000110 // 2 0 16/16 sync word bits, carrier sense above threshold +#define RADIOLIB_CC1101_SYNC_MODE_30_32_THR 0b00000111 // 2 0 30/32 sync word bits, carrier sense above threshold + +// RADIOLIB_CC1101_REG_MDMCFG1 +#define RADIOLIB_CC1101_FEC_OFF 0b00000000 // 7 7 forward error correction: disabled (default) +#define RADIOLIB_CC1101_FEC_ON 0b10000000 // 7 7 enabled - only for fixed packet length +#define RADIOLIB_CC1101_NUM_PREAMBLE_2 0b00000000 // 6 4 number of preamble bytes: 2 +#define RADIOLIB_CC1101_NUM_PREAMBLE_3 0b00010000 // 6 4 3 +#define RADIOLIB_CC1101_NUM_PREAMBLE_4 0b00100000 // 6 4 4 (default) +#define RADIOLIB_CC1101_NUM_PREAMBLE_6 0b00110000 // 6 4 6 +#define RADIOLIB_CC1101_NUM_PREAMBLE_8 0b01000000 // 6 4 8 +#define RADIOLIB_CC1101_NUM_PREAMBLE_12 0b01010000 // 6 4 12 +#define RADIOLIB_CC1101_NUM_PREAMBLE_16 0b01100000 // 6 4 16 +#define RADIOLIB_CC1101_NUM_PREAMBLE_24 0b01110000 // 6 4 24 +#define RADIOLIB_CC1101_CHANSPC_E 0x02 // 1 0 channel spacing: df_channel = (f(XOSC) / 2^18) * (256 + CHANSPC_M) * 2^CHANSPC_E [Hz] + +// RADIOLIB_CC1101_REG_MDMCFG0 +#define RADIOLIB_CC1101_CHANSPC_M 0xF8 // 7 0 default value for 26 MHz crystal: 199 951 kHz + +// RADIOLIB_CC1101_REG_DEVIATN +#define RADIOLIB_CC1101_DEVIATION_E 0b01000000 // 6 4 frequency deviation: f_dev = (f(XOSC) / 2^17) * (8 + DEVIATION_M) * 2^DEVIATION_E [Hz] +#define RADIOLIB_CC1101_DEVIATION_M 0b00000111 // 2 0 default value for 26 MHz crystal: +- 47 607 Hz +#define RADIOLIB_CC1101_MSK_PHASE_CHANGE_PERIOD 0x07 // 2 0 phase change symbol period fraction: 1 / (MSK_PHASE_CHANGE_PERIOD + 1) + +// RADIOLIB_CC1101_REG_MCSM2 +#define RADIOLIB_CC1101_RX_TIMEOUT_RSSI_OFF 0b00000000 // 4 4 Rx timeout based on RSSI value: disabled (default) +#define RADIOLIB_CC1101_RX_TIMEOUT_RSSI_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_CC1101_RX_TIMEOUT_QUAL_OFF 0b00000000 // 3 3 check for sync word on Rx timeout +#define RADIOLIB_CC1101_RX_TIMEOUT_QUAL_ON 0b00001000 // 3 3 check for PQI set on Rx timeout +#define RADIOLIB_CC1101_RX_TIMEOUT_OFF 0b00000111 // 2 0 Rx timeout: disabled (default) +#define RADIOLIB_CC1101_RX_TIMEOUT_MAX 0b00000000 // 2 0 max value (actual value depends on WOR_RES, EVENT0 and f(XOSC)) + +// RADIOLIB_CC1101_REG_MCSM1 +#define RADIOLIB_CC1101_CCA_MODE_ALWAYS 0b00000000 // 5 4 clear channel indication: always +#define RADIOLIB_CC1101_CCA_MODE_RSSI_THR 0b00010000 // 5 4 RSSI below threshold +#define RADIOLIB_CC1101_CCA_MODE_RX_PKT 0b00100000 // 5 4 unless receiving packet +#define RADIOLIB_CC1101_CCA_MODE_RSSI_THR_RX_PKT 0b00110000 // 5 4 RSSI below threshold unless receiving packet (default) +#define RADIOLIB_CC1101_RXOFF_IDLE 0b00000000 // 3 2 next mode after packet reception: idle (default) +#define RADIOLIB_CC1101_RXOFF_FSTXON 0b00000100 // 3 2 FSTxOn +#define RADIOLIB_CC1101_RXOFF_TX 0b00001000 // 3 2 Tx +#define RADIOLIB_CC1101_RXOFF_RX 0b00001100 // 3 2 Rx +#define RADIOLIB_CC1101_TXOFF_IDLE 0b00000000 // 1 0 next mode after packet transmission: idle (default) +#define RADIOLIB_CC1101_TXOFF_FSTXON 0b00000001 // 1 0 FSTxOn +#define RADIOLIB_CC1101_TXOFF_TX 0b00000010 // 1 0 Tx +#define RADIOLIB_CC1101_TXOFF_RX 0b00000011 // 1 0 Rx + +// RADIOLIB_CC1101_REG_MCSM0 +#define RADIOLIB_CC1101_FS_AUTOCAL_NEVER 0b00000000 // 5 4 automatic calibration: never (default) +#define RADIOLIB_CC1101_FS_AUTOCAL_IDLE_TO_RXTX 0b00010000 // 5 4 every transition from idle to Rx/Tx +#define RADIOLIB_CC1101_FS_AUTOCAL_RXTX_TO_IDLE 0b00100000 // 5 4 every transition from Rx/Tx to idle +#define RADIOLIB_CC1101_FS_AUTOCAL_RXTX_TO_IDLE_4TH 0b00110000 // 5 4 every 4th transition from Rx/Tx to idle +#define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_1 0b00000000 // 3 2 number of counter expirations before CHP_RDYN goes low: 1 (default) +#define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_16 0b00000100 // 3 2 16 +#define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_64 0b00001000 // 3 2 64 +#define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_256 0b00001100 // 3 2 256 +#define RADIOLIB_CC1101_PIN_CTRL_OFF 0b00000000 // 1 1 pin radio control: disabled (default) +#define RADIOLIB_CC1101_PIN_CTRL_ON 0b00000010 // 1 1 enabled +#define RADIOLIB_CC1101_XOSC_FORCE_OFF 0b00000000 // 0 0 do not force XOSC to remain on in sleep (default) +#define RADIOLIB_CC1101_XOSC_FORCE_ON 0b00000001 // 0 0 force XOSC to remain on in sleep + +// RADIOLIB_CC1101_REG_FOCCFG +#define RADIOLIB_CC1101_FOC_BS_CS_GATE_OFF 0b00000000 // 5 5 do not freeze frequency compensation until CS goes high +#define RADIOLIB_CC1101_FOC_BS_CS_GATE_ON 0b00100000 // 5 5 freeze frequency compensation until CS goes high (default) +#define RADIOLIB_CC1101_FOC_PRE_K 0b00000000 // 4 3 frequency compensation loop gain before sync word: K +#define RADIOLIB_CC1101_FOC_PRE_2K 0b00001000 // 4 3 2K +#define RADIOLIB_CC1101_FOC_PRE_3K 0b00010000 // 4 3 3K (default) +#define RADIOLIB_CC1101_FOC_PRE_4K 0b00011000 // 4 3 4K +#define RADIOLIB_CC1101_FOC_POST_K 0b00000000 // 2 2 frequency compensation loop gain after sync word: same as FOC_PRE +#define RADIOLIB_CC1101_FOC_POST_K_2 0b00000100 // 2 2 K/2 (default) +#define RADIOLIB_CC1101_FOC_LIMIT_NO_COMPENSATION 0b00000000 // 1 0 frequency compensation saturation point: no compensation - required for ASK/OOK +#define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_8 0b00000001 // 1 0 +- BW_chan/8 +#define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_4 0b00000010 // 1 0 +- BW_chan/4 (default) +#define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_2 0b00000011 // 1 0 +- BW_chan/2 + +// RADIOLIB_CC1101_REG_BSCFG +#define RADIOLIB_CC1101_BS_PRE_KI 0b00000000 // 7 6 clock recovery integral gain before sync word: Ki +#define RADIOLIB_CC1101_BS_PRE_2KI 0b01000000 // 7 6 2Ki (default) +#define RADIOLIB_CC1101_BS_PRE_3KI 0b10000000 // 7 6 3Ki +#define RADIOLIB_CC1101_BS_PRE_4KI 0b11000000 // 7 6 4Ki +#define RADIOLIB_CC1101_BS_PRE_KP 0b00000000 // 5 4 clock recovery proportional gain before sync word: Kp +#define RADIOLIB_CC1101_BS_PRE_2KP 0b00010000 // 5 4 2Kp +#define RADIOLIB_CC1101_BS_PRE_3KP 0b00100000 // 5 4 3Kp (default) +#define RADIOLIB_CC1101_BS_PRE_4KP 0b00110000 // 5 4 4Kp +#define RADIOLIB_CC1101_BS_POST_KI 0b00000000 // 3 3 clock recovery integral gain after sync word: same as BS_PRE +#define RADIOLIB_CC1101_BS_POST_KI_2 0b00001000 // 3 3 Ki/2 (default) +#define RADIOLIB_CC1101_BS_POST_KP 0b00000000 // 2 2 clock recovery proportional gain after sync word: same as BS_PRE +#define RADIOLIB_CC1101_BS_POST_KP_1 0b00000100 // 2 2 Kp (default) +#define RADIOLIB_CC1101_BS_LIMIT_NO_COMPENSATION 0b00000000 // 1 0 data rate compensation saturation point: no compensation +#define RADIOLIB_CC1101_BS_LIMIT_3_125 0b00000001 // 1 0 +- 3.125 % +#define RADIOLIB_CC1101_BS_LIMIT_6_25 0b00000010 // 1 0 +- 6.25 % +#define RADIOLIB_CC1101_BS_LIMIT_12_5 0b00000011 // 1 0 +- 12.5 % + +// RADIOLIB_CC1101_REG_AGCCTRL2 +#define RADIOLIB_CC1101_MAX_DVGA_GAIN_0 0b00000000 // 7 6 reduce maximum available DVGA gain: no reduction (default) +#define RADIOLIB_CC1101_MAX_DVGA_GAIN_1 0b01000000 // 7 6 disable top gain setting +#define RADIOLIB_CC1101_MAX_DVGA_GAIN_2 0b10000000 // 7 6 disable top two gain setting +#define RADIOLIB_CC1101_MAX_DVGA_GAIN_3 0b11000000 // 7 6 disable top three gain setting +#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_0_DB 0b00000000 // 5 3 reduce maximum LNA gain by: 0 dB (default) +#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_2_6_DB 0b00001000 // 5 3 2.6 dB +#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_6_1_DB 0b00010000 // 5 3 6.1 dB +#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_7_4_DB 0b00011000 // 5 3 7.4 dB +#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_9_2_DB 0b00100000 // 5 3 9.2 dB +#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_11_5_DB 0b00101000 // 5 3 11.5 dB +#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_14_6_DB 0b00110000 // 5 3 14.6 dB +#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_17_1_DB 0b00111000 // 5 3 17.1 dB +#define RADIOLIB_CC1101_MAGN_TARGET_24_DB 0b00000000 // 2 0 average amplitude target for filter: 24 dB +#define RADIOLIB_CC1101_MAGN_TARGET_27_DB 0b00000001 // 2 0 27 dB +#define RADIOLIB_CC1101_MAGN_TARGET_30_DB 0b00000010 // 2 0 30 dB +#define RADIOLIB_CC1101_MAGN_TARGET_33_DB 0b00000011 // 2 0 33 dB (default) +#define RADIOLIB_CC1101_MAGN_TARGET_36_DB 0b00000100 // 2 0 36 dB +#define RADIOLIB_CC1101_MAGN_TARGET_38_DB 0b00000101 // 2 0 38 dB +#define RADIOLIB_CC1101_MAGN_TARGET_40_DB 0b00000110 // 2 0 40 dB +#define RADIOLIB_CC1101_MAGN_TARGET_42_DB 0b00000111 // 2 0 42 dB + +// RADIOLIB_CC1101_REG_AGCCTRL1 +#define RADIOLIB_CC1101_AGC_LNA_PRIORITY_LNA2 0b00000000 // 6 6 LNA priority setting: LNA2 first +#define RADIOLIB_CC1101_AGC_LNA_PRIORITY_LNA 0b01000000 // 6 6 LNA first (default) +#define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_OFF 0b00000000 // 5 4 RSSI relative change to assert carrier sense: disabled (default) +#define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_6_DB 0b00010000 // 5 4 6 dB +#define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_10_DB 0b00100000 // 5 4 10 dB +#define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_14_DB 0b00110000 // 5 4 14 dB +#define RADIOLIB_CC1101_CARRIER_SENSE_ABS_THR 0x00 // 3 0 RSSI threshold to assert carrier sense in 2s compliment, Thr = MAGN_TARGET + CARRIER_SENSE_ABS_TH [dB] + +// RADIOLIB_CC1101_REG_AGCCTRL0 +#define RADIOLIB_CC1101_HYST_LEVEL_NONE 0b00000000 // 7 6 AGC hysteresis level: none +#define RADIOLIB_CC1101_HYST_LEVEL_LOW 0b01000000 // 7 6 low +#define RADIOLIB_CC1101_HYST_LEVEL_MEDIUM 0b10000000 // 7 6 medium (default) +#define RADIOLIB_CC1101_HYST_LEVEL_HIGH 0b11000000 // 7 6 high +#define RADIOLIB_CC1101_WAIT_TIME_8_SAMPLES 0b00000000 // 5 4 AGC wait time: 8 samples +#define RADIOLIB_CC1101_WAIT_TIME_16_SAMPLES 0b00010000 // 5 4 16 samples (default) +#define RADIOLIB_CC1101_WAIT_TIME_24_SAMPLES 0b00100000 // 5 4 24 samples +#define RADIOLIB_CC1101_WAIT_TIME_32_SAMPLES 0b00110000 // 5 4 32 samples +#define RADIOLIB_CC1101_AGC_FREEZE_NEVER 0b00000000 // 3 2 freeze AGC gain: never (default) +#define RADIOLIB_CC1101_AGC_FREEZE_SYNC_WORD 0b00000100 // 3 2 when sync word is found +#define RADIOLIB_CC1101_AGC_FREEZE_MANUAL_A 0b00001000 // 3 2 manually freeze analog control +#define RADIOLIB_CC1101_AGC_FREEZE_MANUAL_AD 0b00001100 // 3 2 manually freeze analog and digital control +#define RADIOLIB_CC1101_FILTER_LENGTH_8 0b00000000 // 1 0 averaging length for channel filter: 8 samples +#define RADIOLIB_CC1101_FILTER_LENGTH_16 0b00000001 // 1 0 16 samples (default) +#define RADIOLIB_CC1101_FILTER_LENGTH_32 0b00000010 // 1 0 32 samples +#define RADIOLIB_CC1101_FILTER_LENGTH_64 0b00000011 // 1 0 64 samples +#define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_4_DB 0b00000000 // 1 0 ASK/OOK decision boundary: 4 dB +#define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_8_DB 0b00000001 // 1 0 8 dB (default) +#define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_12_DB 0b00000010 // 1 0 12 dB +#define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_16_DB 0b00000011 // 1 0 16 dB + +// RADIOLIB_CC1101_REG_WOREVT1 + REG_WOREVT0 +#define RADIOLIB_CC1101_EVENT0_TIMEOUT_MSB 0x87 // 7 0 EVENT0 timeout: t_event0 = (750 / f(XOSC)) * EVENT0_TIMEOUT * 2^(5 * WOR_RES) [s] +#define RADIOLIB_CC1101_EVENT0_TIMEOUT_LSB 0x6B // 7 0 default value for 26 MHz crystal: 1.0 s + +// RADIOLIB_CC1101_REG_WORCTRL +#define RADIOLIB_CC1101_RC_POWER_UP 0b00000000 // 7 7 power up RC oscillator +#define RADIOLIB_CC1101_RC_POWER_DOWN 0b10000000 // 7 7 power down RC oscillator +#define RADIOLIB_CC1101_EVENT1_TIMEOUT_4 0b00000000 // 6 4 EVENT1 timeout: 4 RC periods +#define RADIOLIB_CC1101_EVENT1_TIMEOUT_6 0b00010000 // 6 4 6 RC periods +#define RADIOLIB_CC1101_EVENT1_TIMEOUT_8 0b00100000 // 6 4 8 RC periods +#define RADIOLIB_CC1101_EVENT1_TIMEOUT_12 0b00110000 // 6 4 12 RC periods +#define RADIOLIB_CC1101_EVENT1_TIMEOUT_16 0b01000000 // 6 4 16 RC periods +#define RADIOLIB_CC1101_EVENT1_TIMEOUT_24 0b01010000 // 6 4 24 RC periods +#define RADIOLIB_CC1101_EVENT1_TIMEOUT_32 0b01100000 // 6 4 32 RC periods +#define RADIOLIB_CC1101_EVENT1_TIMEOUT_48 0b01110000 // 6 4 48 RC periods (default) +#define RADIOLIB_CC1101_RC_CAL_OFF 0b00000000 // 3 3 disable RC oscillator calibration +#define RADIOLIB_CC1101_RC_CAL_ON 0b00001000 // 3 3 enable RC oscillator calibration (default) +#define RADIOLIB_CC1101_WOR_RES_1 0b00000000 // 1 0 EVENT0 resolution: 1 period (default) +#define RADIOLIB_CC1101_WOR_RES_2_5 0b00000001 // 1 0 2^5 periods +#define RADIOLIB_CC1101_WOR_RES_2_10 0b00000010 // 1 0 2^10 periods +#define RADIOLIB_CC1101_WOR_RES_2_15 0b00000011 // 1 0 2^15 periods + +// RADIOLIB_CC1101_REG_FREND1 +#define RADIOLIB_CC1101_LNA_CURRENT 0x01 // 7 6 front-end LNA PTAT current output adjustment +#define RADIOLIB_CC1101_LNA2MIX_CURRENT 0x01 // 5 4 front-end PTAT output adjustment +#define RADIOLIB_CC1101_LODIV_BUF_CURRENT_RX 0x01 // 3 2 Rx LO buffer current adjustment +#define RADIOLIB_CC1101_MIX_CURRENT 0x02 // 1 0 mixer current adjustment + +// RADIOLIB_CC1101_REG_FREND0 +#define RADIOLIB_CC1101_LODIV_BUF_CURRENT_TX 0x01 // 5 4 Tx LO buffer current adjustment +#define RADIOLIB_CC1101_PA_POWER 0x00 // 2 0 set power amplifier power according to PATABLE + +// RADIOLIB_CC1101_REG_FSCAL3 +#define RADIOLIB_CC1101_CHP_CURR_CAL_OFF 0b00000000 // 5 4 disable charge pump calibration +#define RADIOLIB_CC1101_CHP_CURR_CAL_ON 0b00100000 // 5 4 enable charge pump calibration (default) +#define RADIOLIB_CC1101_FSCAL3 0x09 // 3 0 charge pump output current: I_out = I_0 * 2^(FSCAL3/4) [A] + +// RADIOLIB_CC1101_REG_FSCAL2 +#define RADIOLIB_CC1101_VCO_CORE_LOW 0b00000000 // 5 5 VCO: low (default) +#define RADIOLIB_CC1101_VCO_CORE_HIGH 0b00100000 // 5 5 high +#define RADIOLIB_CC1101_FSCAL2 0x0A // 4 0 VCO current result/override + +// RADIOLIB_CC1101_REG_FSCAL1 +#define RADIOLIB_CC1101_FSCAL1 0x20 // 5 0 capacitor array setting for coarse VCO tuning + +// RADIOLIB_CC1101_REG_FSCAL0 +#define RADIOLIB_CC1101_FSCAL0 0x0D // 6 0 frequency synthesizer calibration setting + +// RADIOLIB_CC1101_REG_RCCTRL1 +#define RADIOLIB_CC1101_RCCTRL1 0x41 // 6 0 RC oscillator configuration + +// RADIOLIB_CC1101_REG_RCCTRL0 +#define RADIOLIB_CC1101_RCCTRL0 0x00 // 6 0 RC oscillator configuration + +// RADIOLIB_CC1101_REG_PTEST +#define RADIOLIB_CC1101_TEMP_SENS_IDLE_OFF 0x7F // 7 0 temperature sensor will not be available in idle mode (default) +#define RADIOLIB_CC1101_TEMP_SENS_IDLE_ON 0xBF // 7 0 temperature sensor will be available in idle mode + +// RADIOLIB_CC1101_REG_TEST0 +#define RADIOLIB_CC1101_VCO_SEL_CAL_OFF 0b00000000 // 1 1 disable VCO selection calibration stage +#define RADIOLIB_CC1101_VCO_SEL_CAL_ON 0b00000010 // 1 1 enable VCO selection calibration stage + +// RADIOLIB_CC1101_REG_PARTNUM +#define RADIOLIB_CC1101_PARTNUM 0x00 + +// RADIOLIB_CC1101_REG_VERSION +#define RADIOLIB_CC1101_VERSION_CURRENT 0x14 +#define RADIOLIB_CC1101_VERSION_LEGACY 0x04 +#define RADIOLIB_CC1101_VERSION_CLONE 0x17 + +// RADIOLIB_CC1101_REG_MARCSTATE +#define RADIOLIB_CC1101_MARC_STATE_SLEEP 0x00 // 4 0 main radio control state: sleep +#define RADIOLIB_CC1101_MARC_STATE_IDLE 0x01 // 4 0 idle +#define RADIOLIB_CC1101_MARC_STATE_XOFF 0x02 // 4 0 XOFF +#define RADIOLIB_CC1101_MARC_STATE_VCOON_MC 0x03 // 4 0 VCOON_MC +#define RADIOLIB_CC1101_MARC_STATE_REGON_MC 0x04 // 4 0 REGON_MC +#define RADIOLIB_CC1101_MARC_STATE_MANCAL 0x05 // 4 0 MANCAL +#define RADIOLIB_CC1101_MARC_STATE_VCOON 0x06 // 4 0 VCOON +#define RADIOLIB_CC1101_MARC_STATE_REGON 0x07 // 4 0 REGON +#define RADIOLIB_CC1101_MARC_STATE_STARTCAL 0x08 // 4 0 STARTCAL +#define RADIOLIB_CC1101_MARC_STATE_BWBOOST 0x09 // 4 0 BWBOOST +#define RADIOLIB_CC1101_MARC_STATE_FS_LOCK 0x0A // 4 0 FS_LOCK +#define RADIOLIB_CC1101_MARC_STATE_IFADCON 0x0B // 4 0 IFADCON +#define RADIOLIB_CC1101_MARC_STATE_ENDCAL 0x0C // 4 0 ENDCAL +#define RADIOLIB_CC1101_MARC_STATE_RX 0x0D // 4 0 RX +#define RADIOLIB_CC1101_MARC_STATE_RX_END 0x0E // 4 0 RX_END +#define RADIOLIB_CC1101_MARC_STATE_RX_RST 0x0F // 4 0 RX_RST +#define RADIOLIB_CC1101_MARC_STATE_TXRX_SWITCH 0x10 // 4 0 TXRX_SWITCH +#define RADIOLIB_CC1101_MARC_STATE_RXFIFO_OVERFLOW 0x11 // 4 0 RXFIFO_OVERFLOW +#define RADIOLIB_CC1101_MARC_STATE_FSTXON 0x12 // 4 0 FSTXON +#define RADIOLIB_CC1101_MARC_STATE_TX 0x13 // 4 0 TX +#define RADIOLIB_CC1101_MARC_STATE_TX_END 0x14 // 4 0 TX_END +#define RADIOLIB_CC1101_MARC_STATE_RXTX_SWITCH 0x15 // 4 0 RXTX_SWITCH +#define RADIOLIB_CC1101_MARC_STATE_TXFIFO_UNDERFLOW 0x16 // 4 0 TXFIFO_UNDERFLOW + +// RADIOLIB_CC1101_REG_WORTIME1 + REG_WORTIME0 +#define RADIOLIB_CC1101_WORTIME_MSB 0x00 // 7 0 WOR timer value +#define RADIOLIB_CC1101_WORTIME_LSB 0x00 // 7 0 + +// RADIOLIB_CC1101_REG_PKTSTATUS +#define RADIOLIB_CC1101_CRC_OK 0b10000000 // 7 7 CRC check passed +#define RADIOLIB_CC1101_CRC_ERROR 0b00000000 // 7 7 CRC check failed +#define RADIOLIB_CC1101_CS 0b01000000 // 6 6 carrier sense +#define RADIOLIB_CC1101_PQT_REACHED 0b00100000 // 5 5 preamble quality reached +#define RADIOLIB_CC1101_CCA 0b00010000 // 4 4 channel clear +#define RADIOLIB_CC1101_SFD 0b00001000 // 3 3 start of frame delimiter - sync word received +#define RADIOLIB_CC1101_GDO2_ACTIVE 0b00000100 // 2 2 GDO2 is active/asserted +#define RADIOLIB_CC1101_GDO0_ACTIVE 0b00000001 // 0 0 GDO0 is active/asserted + +// RadioLib defaults +#define RADIOLIB_CC1101_DEFAULT_FREQ 434.0 +#define RADIOLIB_CC1101_DEFAULT_BR 4.8 +#define RADIOLIB_CC1101_DEFAULT_FREQDEV 5.0 +#define RADIOLIB_CC1101_DEFAULT_RXBW 58.0 +#define RADIOLIB_CC1101_DEFAULT_POWER 10 +#define RADIOLIB_CC1101_DEFAULT_PREAMBLELEN 16 +#define RADIOLIB_CC1101_DEFAULT_SW {0x12, 0xAD} +#define RADIOLIB_CC1101_DEFAULT_SW_LEN 2 + +/*! + \class CC1101 + \brief Control class for %CC1101 module. +*/ +class CC1101: public PhysicalLayer { + public: + // introduce PhysicalLayer overloads + using PhysicalLayer::transmit; + using PhysicalLayer::receive; + using PhysicalLayer::startTransmit; + using PhysicalLayer::readData; + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + CC1101(Module* module); + + Module* getMod(); + + // basic methods + + /*! + \brief Initialization method. + \param freq Carrier frequency in MHz. Defaults to 434 MHz. + \param br Bit rate to be used in kbps. Defaults to 4.8 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz Defaults to 5.0 kHz. + \param rxBw Receiver bandwidth in kHz. Defaults to 135.0 kHz. + \param pwr Output power in dBm. Defaults to 10 dBm. + \param preambleLength Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes + */ + int16_t begin( + float freq = RADIOLIB_CC1101_DEFAULT_FREQ, + float br = RADIOLIB_CC1101_DEFAULT_BR, + float freqDev = RADIOLIB_CC1101_DEFAULT_FREQDEV, + float rxBw = RADIOLIB_CC1101_DEFAULT_RXBW, + int8_t pwr = RADIOLIB_CC1101_DEFAULT_POWER, + uint8_t preambleLength = RADIOLIB_CC1101_DEFAULT_PREAMBLELEN); + + /*! + \brief Reset method - resets the chip using manual reset sequence (without RESET pin). + */ + void reset(); + + /*! + \brief Blocking binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Address to send the data to. Will only be added if address filtering was enabled. + \returns \ref status_codes + */ + int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Blocking binary receive method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \returns \ref status_codes + */ + int16_t receive(uint8_t* data, size_t len) override; + + /*! + \brief Sets the module to standby mode. + \returns \ref status_codes + */ + int16_t standby() override; + + /*! + \brief Sets the module to standby. + \param mode Standby mode to be used. No effect, implemented only for PhysicalLayer compatibility. + \returns \ref status_codes + */ + int16_t standby(uint8_t mode) override; + + /*! + \brief Starts direct mode transmission. + \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0) override; + + /*! + \brief Starts direct mode reception. + \returns \ref status_codes + */ + int16_t receiveDirect() override; + + /*! + \brief Starts asynchronous direct mode transmission. + \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirectAsync(uint32_t frf = 0); + + /*! + \brief Starts asynchronous direct mode reception. + \returns \ref status_codes + */ + int16_t receiveDirectAsync(); + + /*! + \brief Stops direct mode. It is required to call this method to switch from direct transmissions + to packet-based transmissions. + */ + int16_t packetMode(); + + // interrupt methods + + /*! + \brief Sets interrupt service routine to call when GDO0 activates. + \param func ISR to call. + \param dir Signal change direction. + */ + void setGdo0Action(void (*func)(void), uint32_t dir); + + /*! + \brief Clears interrupt service routine to call when GDO0 activates. + */ + void clearGdo0Action(); + + /*! + \brief Sets interrupt service routine to call when GDO2 activates. + \param func ISR to call. + \param dir Signal change direction. + */ + void setGdo2Action(void (*func)(void), uint32_t dir); + + /*! + \brief Clears interrupt service routine to call when GDO0 activates. + */ + void clearGdo2Action(); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + void clearPacketSentAction(); + + /*! + \brief Interrupt-driven binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Address to send the data to. Will only be added if address filtering was enabled. + \returns \ref status_codes + */ + int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Clean up after transmission is done. + \returns \ref status_codes + */ + int16_t finishTransmit() override; + + /*! + \brief Interrupt-driven receive method. GDO0 will be activated when full packet is received. + \returns \ref status_codes + */ + int16_t startReceive(); + + /*! + \brief Interrupt-driven receive method, implemented for compatibility with PhysicalLayer. + \param timeout Ignored. + \param irqFlags Ignored. + \param irqMask Ignored. + \param len Ignored. + \returns \ref status_codes + */ + int16_t startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len); + + /*! + \brief Reads data received after calling startReceive method. When the packet length is not known in advance, + getPacketLength method must be called BEFORE calling readData! + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be read. When set to 0, the packet length will be retreived automatically. + When more bytes than received are requested, only the number of bytes requested will be returned. + \returns \ref status_codes + */ + int16_t readData(uint8_t* data, size_t len) override; + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values are in bands 300.0 to 348.0 MHz, + 387.0 to 464.0 MHz and 779.0 to 928.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets bit rate. Allowed values range from 0.025 to 600.0 kbps. + \param br Bit rate to be set in kbps. + \returns \ref status_codes + */ + int16_t setBitRate(float br); + + /*! + \brief Sets receiver bandwidth. Allowed values are 58, 68, 81, 102, 116, 135, 162, + 203, 232, 270, 325, 406, 464, 541, 650 and 812 kHz. + \param rxBw Receiver bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setRxBandwidth(float rxBw); + + /*! + \brief Sets frequency deviation. Allowed values range from 1.587 to 380.8 kHz. + \param freqDev Frequency deviation to be set in kHz. + \returns \ref status_codes + */ + int16_t setFrequencyDeviation(float freqDev) override; + + /*! + \brief Gets frequency deviation. + \param[out] freqDev Pointer to variable where to save the frequency deviation. + \returns \ref status_codes + */ + int16_t getFrequencyDeviation(float *freqDev); + + /*! + \brief Sets output power. Allowed values are -30, -20, -15, -10, 0, 5, 7 or 10 dBm. + \param pwr Output power to be set in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t pwr); + + /*! + \brief Sets 16-bit sync word as a two byte value. + \param syncH MSB of the sync word. + \param syncL LSB of the sync word. + \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits = 0, bool requireCarrierSense = false); + + /*! + \brief Sets 1 or 2 bytes of sync word. + \param syncWord Pointer to the array of sync word bytes. + \param len Sync word length in bytes. + \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0, bool requireCarrierSense = false); + + /*! + \brief Sets preamble length. + \param preambleLength Preamble length to be set (in bits), allowed values: 16, 24, 32, 48, 64, 96, 128 and 192. + \returns \ref status_codes + */ + int16_t setPreambleLength(uint8_t preambleLength, uint8_t qualityThreshold); + + /*! + \brief Sets node and broadcast addresses. Calling this method will also enable address filtering. + \param nodeAddr Node address to be set. + \param numBroadcastAddrs Number of broadcast addresses to be used. Can be set to 0 (no broadcast), + 1 (broadcast at 0x00) or 2 (broadcast at 0x00 and 0xFF). + \returns \ref status_codes + */ + int16_t setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs = 0); + + /*! + \brief Disables address filtering. Calling this method will also erase previously set addresses. + \returns \ref status_codes + */ + int16_t disableAddressFiltering(); + + /*! + \brief Enables/disables OOK modulation instead of FSK. + \param enableOOK Enable (true) or disable (false) OOK. + \returns \ref status_codes + */ + int16_t setOOK(bool enableOOK); + + /*! + \brief Gets RSSI (Recorded Signal Strength Indicator) of the last received packet. + In asynchronous direct mode, returns the current RSSI level. + \returns RSSI in dBm. + */ + float getRSSI(); + + /*! + \brief Gets LQI (Link Quality Indicator) of the last received packet. + \returns Last packet LQI (lower is better). + */ + uint8_t getLQI() const; + + /*! + \brief Query modem for the packet length of received payload. + \param update Update received packet length. Will return cached value when set to false. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update = true) override; + + /*! + \brief Set modem in fixed packet length mode. + \param len Packet length. + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_CC1101_MAX_PACKET_LENGTH); + + /*! + \brief Set modem in variable packet length mode. + \param len Maximum packet length. + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_CC1101_MAX_PACKET_LENGTH); + + /*! + \brief Enable sync word filtering and generation. + \param numBits Sync word length in bits. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes + */ + int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0, bool requireCarrierSense = false); + + /*! + \brief Disable preamble and sync word filtering and generation. + \param requireCarrierSense Require carrier sense above threshold. + \returns \ref status_codes + */ + int16_t disableSyncWordFiltering(bool requireCarrierSense = false); + + /*! + \brief Enable CRC filtering and generation. + \param enable Set or unset CRC generation and filtering. + \returns \ref status_codes + */ + int16_t setCrcFiltering(bool enable = true); + + /*! + \brief Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address, CRC). + \param enable Set or unset promiscuous mode. + \returns \ref status_codes + */ + int16_t setPromiscuousMode(bool enable = true); + + /*! + \brief Get whether the modem is in promiscuous mode: no packet filtering + (e.g., no preamble, sync word, address, CRC). + \returns Whether the modem is in promiscuous mode. + */ + bool getPromiscuousMode(); + + /*! + \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. + Allowed value is RADIOLIB_SHAPING_0_5. Set to RADIOLIB_SHAPING_NONE to disable data shaping. + \param sh Gaussian shaping bandwidth-time product that will be used for data shaping. + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! + \brief Sets transmission encoding. Allowed values are RADIOLIB_ENCODING_NRZ, RADIOLIB_ENCODING_MANCHESTER, and RADIOLIB_ENCODING_WHITENING. + Note that encoding on CC1101 is applied to the entire stream including preamble, sync word, and CRC. + \param encoding Encoding to be used. + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding) override; + + /*! \copydoc Module::setRfSwitchPins */ + void setRfSwitchPins(uint32_t rxEn, uint32_t txEn); + + /*! \copydoc Module::setRfSwitchTable */ + void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]); + + /*! + \brief Get one truly random byte from RSSI noise. + \returns TRNG byte. + */ + uint8_t randomByte(); + + /*! + \brief Read version SPI register. Should return CC1101_VERSION_LEGACY (0x04) or + CC1101_VERSION_CURRENT (0x14) if CC1101 is connected and working. + \returns Version register contents or \ref status_codes + */ + int16_t getChipVersion(); + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + /*! + \brief Set interrupt service routine function to call when data bit is receveid in direct mode. + \param func Pointer to interrupt service routine. + */ + void setDirectAction(void (*func)(void)); + + /*! + \brief Function to read and process data bit in direct reception mode. + \param pin Pin on which to read. + */ + void readBit(uint32_t pin); + #endif + + /*! + \brief Configure DIO pin mapping to get a given signal on a DIO pin (if available). + \param pin Pin number onto which a signal is to be placed. + \param value The value that indicates which function to place on that pin. See chip datasheet for details. + \returns \ref status_codes + */ + int16_t setDIOMapping(uint32_t pin, uint32_t value); + + #if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) + protected: + #endif + Module* mod; + + // SPI read overrides to set bit for burst write and status registers access + int16_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0); + int16_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2); + void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes); + uint8_t SPIreadRegister(uint8_t reg); + void SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, size_t len); + void SPIwriteRegister(uint8_t reg, uint8_t data); + + void SPIsendCommand(uint8_t cmd); + + #if !defined(RADIOLIB_GODMODE) + protected: + #endif + + float frequency = RADIOLIB_CC1101_DEFAULT_FREQ; + float bitRate = RADIOLIB_CC1101_DEFAULT_BR; + uint8_t rawRSSI = 0; + uint8_t rawLQI = 0; + uint8_t modulation = RADIOLIB_CC1101_MOD_FORMAT_2_FSK; + + size_t packetLength = 0; + bool packetLengthQueried = false; + uint8_t packetLengthConfig = RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE; + + bool promiscuous = false; + bool crcOn = true; + bool directModeEnabled = true; + + int8_t power = RADIOLIB_CC1101_DEFAULT_POWER; + + int16_t config(); + int16_t transmitDirect(bool sync, uint32_t frf); + int16_t receiveDirect(bool sync); + int16_t directMode(bool sync); + static void getExpMant(float target, uint16_t mantOffset, uint8_t divExp, uint8_t expMax, uint8_t& exp, uint8_t& mant); + int16_t setPacketMode(uint8_t mode, uint16_t len); +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/LLCC68/LLCC68.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/LLCC68/LLCC68.cpp new file mode 100644 index 00000000..03483584 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/LLCC68/LLCC68.cpp @@ -0,0 +1,56 @@ +#include "LLCC68.h" +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +LLCC68::LLCC68(Module* mod) : SX1262(mod) { + chipType = RADIOLIB_LLCC68_CHIP_TYPE; + this->XTAL = true; +} + +int16_t LLCC68::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t pwr, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // execute common part + int16_t state = SX126x::begin(cr, syncWord, preambleLength, tcxoVoltage, useRegulatorLDO); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setOutputPower(pwr); + RADIOLIB_ASSERT(state); + + state = SX126x::fixPaClamping(); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t LLCC68::setBandwidth(float bw) { + RADIOLIB_CHECK_RANGE(bw, 100.0, 510.0, RADIOLIB_ERR_INVALID_BANDWIDTH); + return(SX1262::setBandwidth(bw)); +} + +int16_t LLCC68::setSpreadingFactor(uint8_t sf) { + switch(SX126x::bandwidth) { + case RADIOLIB_SX126X_LORA_BW_125_0: + RADIOLIB_CHECK_RANGE(sf, 5, 9, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + break; + case RADIOLIB_SX126X_LORA_BW_250_0: + RADIOLIB_CHECK_RANGE(sf, 5, 10, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + break; + case RADIOLIB_SX126X_LORA_BW_500_0: + RADIOLIB_CHECK_RANGE(sf, 5, 11, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + break; + default: + return(RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + } + + return(SX1262::setSpreadingFactor(sf)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/LLCC68/LLCC68.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/LLCC68/LLCC68.h new file mode 100644 index 00000000..1cec96f1 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/LLCC68/LLCC68.h @@ -0,0 +1,67 @@ +#if !defined(_RADIOLIB_LLCC68_H) +#define _RADIOLIB_LLCC68_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +#include "../../Module.h" +#include "../SX126x/SX1262.h" + +//RADIOLIB_SX126X_REG_VERSION_STRING +#define RADIOLIB_LLCC68_CHIP_TYPE "LLCC68" + +/*! + \class LLCC68 + \brief Derived class for %LLCC68 modules. +*/ +class LLCC68: public SX1262 { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + LLCC68(Module* mod); + + /*! + \brief Initialization method for LoRa modem. + \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. + \param bw LoRa bandwidth in kHz. Defaults to 125.0 kHz. + \param sf LoRa spreading factor. Defaults to 9. + \param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7). + \param syncWord 1-byte LoRa sync word. Defaults to RADIOLIB_SX126X_SYNC_WORD_PRIVATE (0x12). + \param pwr Output power in dBm. Defaults to 10 dBm. + \param preambleLength LoRa preamble length in symbols. Defaults to 8 symbols. + \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 0 V (XTAL). + If you are seeing -706/-707 error codes, it likely means you are using a module with TCXO. + To use TCXO, either set this value to its reference voltage, or set SX126x::XTAL to false. + \param useRegulatorLDO Whether to use only LDO regulator (true) or DC-DC regulator (false). Defaults to false. + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX126X_SYNC_WORD_PRIVATE, int8_t pwr = 10, uint16_t preambleLength = 8, float tcxoVoltage = 0, bool useRegulatorLDO = false); + + // configuration methods + + /*! + \brief Sets LoRa bandwidth. Allowed values are 125.0, 250.0 and 500.0 kHz. + \param bw LoRa bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setBandwidth(float bw); + + /*! + \brief Sets LoRa spreading factor. Allowed values range from 5 to 11, depending on currently set spreading factor. + \param sf LoRa spreading factor to be set. + \returns \ref status_codes + */ + int16_t setSpreadingFactor(uint8_t sf); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RF69/RF69.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RF69/RF69.cpp new file mode 100644 index 00000000..6af30fae --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RF69/RF69.cpp @@ -0,0 +1,1080 @@ +#include "RF69.h" +#include +#if !defined(RADIOLIB_EXCLUDE_RF69) + +RF69::RF69(Module* module) : PhysicalLayer(RADIOLIB_RF69_FREQUENCY_STEP_SIZE, RADIOLIB_RF69_MAX_PACKET_LENGTH) { + this->mod = module; +} + +Module* RF69::getMod() { + return(this->mod); +} + +int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t pwr, uint8_t preambleLen) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + + // try to find the RF69 chip + uint8_t i = 0; + bool flagFound = false; + while((i < 10) && !flagFound) { + // reset the module + reset(); + + // check version register + int16_t version = getChipVersion(); + if(version == RADIOLIB_RF69_CHIP_VERSION) { + flagFound = true; + } else { + RADIOLIB_DEBUG_PRINTLN("RF69 not found! (%d of 10 tries) RADIOLIB_RF69_REG_VERSION == 0x%04X, expected 0x0024", i + 1, version); + this->mod->hal->delay(10); + i++; + } + } + + if(!flagFound) { + RADIOLIB_DEBUG_PRINTLN("No RF69 found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } else { + RADIOLIB_DEBUG_PRINTLN("M\tRF69"); + } + + // configure settings not accessible by API + int16_t state = config(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + // configure bitrate + this->rxBandwidth = rxBw; + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + // configure default RX bandwidth + state = setRxBandwidth(rxBw); + RADIOLIB_ASSERT(state); + + // configure default frequency deviation + state = setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + // configure default TX output power + state = setOutputPower(pwr); + RADIOLIB_ASSERT(state); + + // configure default preamble length + state = setPreambleLength(preambleLen); + RADIOLIB_ASSERT(state); + + // set default packet length mode + state = variablePacketLengthMode(); + RADIOLIB_ASSERT(state); + + // set default sync word + uint8_t syncWord[] = RADIOLIB_RF69_DEFAULT_SW; + state = setSyncWord(syncWord, sizeof(syncWord)); + RADIOLIB_ASSERT(state); + + // set default data shaping + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + + // set default encoding + state = setEncoding(RADIOLIB_ENCODING_NRZ); + RADIOLIB_ASSERT(state); + + // set CRC on by default + state = setCrcFiltering(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +void RF69::reset() { + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + this->mod->hal->delay(1); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + this->mod->hal->delay(10); +} + +int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) { + // calculate timeout (5ms + 500 % of expected time-on-air) + uint32_t timeout = 5000000 + (uint32_t)((((float)(len * 8)) / (this->bitRate * 1000.0)) * 5000000.0); + + // start transmission + int16_t state = startTransmit(data, len, addr); + RADIOLIB_ASSERT(state); + + // wait for transmission end or timeout + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + + if(this->mod->hal->micros() - start > timeout) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + + return(finishTransmit()); +} + +int16_t RF69::receive(uint8_t* data, size_t len) { + // calculate timeout (500 ms + 400 full 64-byte packets at current bit rate) + uint32_t timeout = 500000 + (1.0/(this->bitRate*1000.0))*(RADIOLIB_RF69_MAX_PACKET_LENGTH*400.0); + + // start reception + int16_t state = startReceive(); + RADIOLIB_ASSERT(state); + + // wait for packet reception or timeout + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + + if(this->mod->hal->micros() - start > timeout) { + standby(); + clearIRQFlags(); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } + + // read packet data + return(readData(data, len)); +} + +int16_t RF69::sleep() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + // set module to sleep + return(setMode(RADIOLIB_RF69_SLEEP)); +} + +int16_t RF69::standby() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + // set module to standby + return(setMode(RADIOLIB_RF69_STANDBY)); +} + +int16_t RF69::standby(uint8_t mode) { + (void)mode; + return(standby()); +} + +int16_t RF69::transmitDirect(uint32_t frf) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // user requested to start transmitting immediately (required for RTTY) + if(frf != 0) { + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FRF_MSB, (frf & 0xFF0000) >> 16); + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FRF_MID, (frf & 0x00FF00) >> 8); + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FRF_LSB, frf & 0x0000FF); + + return(setMode(RADIOLIB_RF69_TX)); + } + + // activate direct mode + int16_t state = directMode(); + RADIOLIB_ASSERT(state); + + // start transmitting + return(setMode(RADIOLIB_RF69_TX)); +} + +int16_t RF69::receiveDirect() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // activate direct mode + int16_t state = directMode(); + RADIOLIB_ASSERT(state); + + // start receiving + return(setMode(RADIOLIB_RF69_RX)); +} + +int16_t RF69::directMode() { + // set mode to standby + int16_t state = setMode(RADIOLIB_RF69_STANDBY); + RADIOLIB_ASSERT(state); + + // set DIO mapping + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_1, RADIOLIB_RF69_DIO1_CONT_DCLK | RADIOLIB_RF69_DIO2_CONT_DATA, 5, 2); + RADIOLIB_ASSERT(state); + + // set continuous mode + if(this->bitSync) { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_CONTINUOUS_MODE_WITH_SYNC, 6, 5)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_CONTINUOUS_MODE, 6, 5)); + } +} + +int16_t RF69::packetMode() { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_PACKET_MODE, 6, 5)); +} + +void RF69::setAESKey(uint8_t* key) { + this->mod->SPIwriteRegisterBurst(RADIOLIB_RF69_REG_AES_KEY_1, key, 16); +} + +int16_t RF69::enableAES() { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_2, RADIOLIB_RF69_AES_ON, 0, 0)); +} + +int16_t RF69::disableAES() { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_2, RADIOLIB_RF69_AES_OFF, 0, 0)); +} + +int16_t RF69::startReceive() { + // set mode to standby + int16_t state = setMode(RADIOLIB_RF69_STANDBY); + RADIOLIB_ASSERT(state); + + // set RX timeouts and DIO pin mapping + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_1, RADIOLIB_RF69_DIO0_PACK_PAYLOAD_READY, 7, 4); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_RX_TIMEOUT_1, RADIOLIB_RF69_TIMEOUT_RX_START); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_RX_TIMEOUT_2, RADIOLIB_RF69_TIMEOUT_RSSI_THRESH); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + clearIRQFlags(); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set mode to receive + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OCP, RADIOLIB_RF69_OCP_ON | RADIOLIB_RF69_OCP_TRIM); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_TEST_PA1, RADIOLIB_RF69_PA1_NORMAL); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_TEST_PA2, RADIOLIB_RF69_PA2_NORMAL); + RADIOLIB_ASSERT(state); + + state = setMode(RADIOLIB_RF69_RX); + + return(state); +} + +int16_t RF69::startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len) { + (void)timeout; + (void)irqFlags; + (void)irqMask; + (void)len; + return(startReceive()); +} + +void RF69::setDio0Action(void (*func)(void)) { + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq()), func, this->mod->hal->GpioInterruptRising); +} + +void RF69::clearDio0Action() { + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq())); +} + +void RF69::setDio1Action(void (*func)(void)) { + if(this->mod->getGpio() == RADIOLIB_NC) { + return; + } + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getGpio()), func, this->mod->hal->GpioInterruptRising); +} + +void RF69::clearDio1Action() { + if(this->mod->getGpio() == RADIOLIB_NC) { + return; + } + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getGpio())); +} + +void RF69::setPacketReceivedAction(void (*func)(void)) { + this->setDio0Action(func); +} + +void RF69::clearPacketReceivedAction() { + this->clearDio0Action(); +} + +void RF69::setPacketSentAction(void (*func)(void)) { + this->setDio0Action(func); +} + +void RF69::clearPacketSentAction() { + this->clearDio0Action(); +} + +void RF69::setFifoEmptyAction(void (*func)(void)) { + // set DIO1 to the FIFO empty event (the register setting is done in startTransmit) + if(this->mod->getGpio() == RADIOLIB_NC) { + return; + } + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + + // we need to invert the logic here (as compared to setDio1Action), since we are using the "FIFO not empty interrupt" + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getGpio()), func, this->mod->hal->GpioInterruptFalling); +} + +void RF69::clearFifoEmptyAction() { + clearDio1Action(); +} + +void RF69::setFifoFullAction(void (*func)(void)) { + // set the interrupt + this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_FIFO_THRESH, RADIOLIB_RF69_FIFO_THRESH, 6, 0); + this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_1, RADIOLIB_RF69_DIO1_PACK_FIFO_LEVEL, 5, 4); + + // set DIO1 to the FIFO full event + setDio1Action(func); +} + +void RF69::clearFifoFullAction() { + clearDio1Action(); + this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_1, 0x00, 5, 4); +} + +bool RF69::fifoAdd(uint8_t* data, int totalLen, int* remLen) { + // subtract first (this may be the first time we get to modify the remaining length) + *remLen -= RADIOLIB_RF69_FIFO_THRESH - 1; + + // check if there is still something left to send + if(*remLen <= 0) { + // we're done + return(true); + } + + // calculate the number of bytes we can copy + int len = *remLen; + if(len > RADIOLIB_RF69_FIFO_THRESH - 1) { + len = RADIOLIB_RF69_FIFO_THRESH - 1; + } + + // copy the bytes to the FIFO + this->mod->SPIwriteRegisterBurst(RADIOLIB_RF69_REG_FIFO, &data[totalLen - *remLen], len); + + // we're not done yet + return(false); +} + +bool RF69::fifoGet(volatile uint8_t* data, int totalLen, volatile int* rcvLen) { + // get pointer to the correct position in data buffer + uint8_t* dataPtr = (uint8_t*)&data[*rcvLen]; + + // check how much data are we still expecting + uint8_t len = RADIOLIB_RF69_FIFO_THRESH - 1; + if(totalLen - *rcvLen < len) { + // we're nearly at the end + len = totalLen - *rcvLen; + } + + // get the data + this->mod->SPIreadRegisterBurst(RADIOLIB_RF69_REG_FIFO, len, dataPtr); + (*rcvLen) += (len); + + // check if we're done + if(*rcvLen >= totalLen) { + return(true); + } + return(false); +} + +int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { + // set mode to standby + int16_t state = setMode(RADIOLIB_RF69_STANDBY); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + clearIRQFlags(); + + // set DIO mapping + if(len > RADIOLIB_RF69_MAX_PACKET_LENGTH) { + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_1, RADIOLIB_RF69_DIO1_PACK_FIFO_NOT_EMPTY, 5, 4); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_1, RADIOLIB_RF69_DIO0_PACK_PACKET_SENT, 7, 6); + } + RADIOLIB_ASSERT(state); + + // optionally write packet length + if (this->packetLengthConfig == RADIOLIB_RF69_PACKET_FORMAT_VARIABLE) { + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FIFO, len); + } + + // check address filtering + uint8_t filter = this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, 2, 1); + if((filter == RADIOLIB_RF69_ADDRESS_FILTERING_NODE) || (filter == RADIOLIB_RF69_ADDRESS_FILTERING_NODE_BROADCAST)) { + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FIFO, addr); + } + + // write packet to FIFO + size_t packetLen = len; + if(len > RADIOLIB_RF69_MAX_PACKET_LENGTH) { + packetLen = RADIOLIB_RF69_FIFO_THRESH - 1; + this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_FIFO_THRESH, RADIOLIB_RF69_TX_START_CONDITION_FIFO_NOT_EMPTY, 7, 7); + } + this->mod->SPIwriteRegisterBurst(RADIOLIB_RF69_REG_FIFO, data, packetLen); + + // this is a hack, but it seems than in Stream mode, Rx FIFO level is getting triggered 1 byte before it should + // just add a padding byte that can be dropped without consequence + if(len > RADIOLIB_RF69_MAX_PACKET_LENGTH) { + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FIFO, '/'); + } + + // enable +20 dBm operation + if(this->power > 17) { + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OCP, RADIOLIB_RF69_OCP_OFF | 0x0F); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_TEST_PA1, RADIOLIB_RF69_PA1_20_DBM); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_TEST_PA2, RADIOLIB_RF69_PA2_20_DBM); + RADIOLIB_ASSERT(state); + } + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // set mode to transmit + state = setMode(RADIOLIB_RF69_TX); + + return(state); +} + +int16_t RF69::finishTransmit() { + // clear interrupt flags + clearIRQFlags(); + + // set mode to standby to disable transmitter/RF switch + return(standby()); +} + +int16_t RF69::readData(uint8_t* data, size_t len) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // get packet length + size_t length = getPacketLength(); + size_t dumpLen = 0; + if((len != 0) && (len < length)) { + // user requested less data than we got, only return what was requested + dumpLen = length - len; + length = len; + } + + // check address filtering + uint8_t filter = this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, 2, 1); + if((filter == RADIOLIB_RF69_ADDRESS_FILTERING_NODE) || (filter == RADIOLIB_RF69_ADDRESS_FILTERING_NODE_BROADCAST)) { + this->mod->SPIreadRegister(RADIOLIB_RF69_REG_FIFO); + } + + // read packet data + this->mod->SPIreadRegisterBurst(RADIOLIB_RF69_REG_FIFO, length, data); + + // dump the bytes that weren't requested + if(dumpLen != 0) { + clearFIFO(dumpLen); + } + + // clear internal flag so getPacketLength can return the new packet length + this->packetLengthQueried = false; + + // clear interrupt flags + clearIRQFlags(); + + return(RADIOLIB_ERR_NONE); +} + +int16_t RF69::setOOK(bool enable) { + // set OOK and if successful, save the new setting + int16_t state = RADIOLIB_ERR_NONE; + if(enable) { + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_OOK, 4, 3, 5); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_FSK, 4, 3, 5); + } + + if(state == RADIOLIB_ERR_NONE) { + this->ookEnabled = enable; + } + + // call setRxBandwidth again, since register values differ based on OOK mode being enabled + state |= setRxBandwidth(this->rxBandwidth); + + return(state); +} + +int16_t RF69::setOokThresholdType(uint8_t type) { + if((type != RADIOLIB_RF69_OOK_THRESH_FIXED) && (type != RADIOLIB_RF69_OOK_THRESH_PEAK) && (type != RADIOLIB_RF69_OOK_THRESH_AVERAGE)) { + return(RADIOLIB_ERR_INVALID_OOK_RSSI_PEAK_TYPE); + } + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OOK_PEAK, type, 7, 3, 5)); +} + +int16_t RF69::setOokFixedThreshold(uint8_t value) { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OOK_FIX, value, 7, 0, 5)); +} + +int16_t RF69::setOokPeakThresholdDecrement(uint8_t value) { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OOK_PEAK, value, 2, 0, 5)); +} + +int16_t RF69::setFrequency(float freq) { + // check allowed frequency range + if(!(((freq > 290.0) && (freq < 340.0)) || + ((freq > 431.0) && (freq < 510.0)) || + ((freq > 862.0) && (freq < 1020.0)))) { + return(RADIOLIB_ERR_INVALID_FREQUENCY); + } + + // set mode to standby + setMode(RADIOLIB_RF69_STANDBY); + + //set carrier frequency + //FRF(23:0) = freq / Fstep = freq * (1 / Fstep) = freq * (2^19 / 32.0) (pag. 17 of datasheet) + uint32_t FRF = (freq * (uint32_t(1) << RADIOLIB_RF69_DIV_EXPONENT)) / RADIOLIB_RF69_CRYSTAL_FREQ; + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FRF_MSB, (FRF & 0xFF0000) >> 16); + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FRF_MID, (FRF & 0x00FF00) >> 8); + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_FRF_LSB, FRF & 0x0000FF); + + return(RADIOLIB_ERR_NONE); +} + +int16_t RF69::getFrequency(float *freq) { + uint32_t FRF = 0; + + //FRF(23:0) = [ [FRF_MSB]|[FRF_MID]|[FRF_LSB]] + //FRF(32:0) = [0x00|[FRF_MSB]|[FRF_MID]|[FRF_LSB]] + FRF |= (((uint32_t)(this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_FRF_MSB, 7, 0)) << 16) & 0x00FF0000); + FRF |= (((uint32_t)(this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_FRF_MID, 7, 0)) << 8) & 0x0000FF00); + FRF |= (((uint32_t)(this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_FRF_LSB, 7, 0)) << 0) & 0x000000FF); + + //freq = Fstep * FRF(23:0) = (32.0 / 2^19) * FRF(23:0) (pag. 17 of datasheet) + *freq = FRF * ( RADIOLIB_RF69_CRYSTAL_FREQ / (uint32_t(1) << RADIOLIB_RF69_DIV_EXPONENT) ); + + return(RADIOLIB_ERR_NONE); +} + +int16_t RF69::setBitRate(float br) { + // datasheet says 1.2 kbps should be the smallest possible, but 0.512 works fine + RADIOLIB_CHECK_RANGE(br, 0.5, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE); + + // check bitrate-bandwidth ratio + if(!(br < 2000 * this->rxBandwidth)) { + return(RADIOLIB_ERR_INVALID_BIT_RATE_BW_RATIO); + } + + // set mode to standby + setMode(RADIOLIB_RF69_STANDBY); + + // set bit rate + uint16_t bitRate = 32000 / br; + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_BITRATE_MSB, (bitRate & 0xFF00) >> 8, 7, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_BITRATE_LSB, bitRate & 0x00FF, 7, 0); + if(state == RADIOLIB_ERR_NONE) { + this->bitRate = br; + } + return(state); +} + +int16_t RF69::setRxBandwidth(float rxBw) { + // check bitrate-bandwidth ratio + if(!(this->bitRate < 2000 * rxBw)) { + return(RADIOLIB_ERR_INVALID_BIT_RATE_BW_RATIO); + } + + // set mode to standby + int16_t state = setMode(RADIOLIB_RF69_STANDBY); + RADIOLIB_ASSERT(state); + + // calculate exponent and mantissa values for receiver bandwidth + for(int8_t e = 7; e >= 0; e--) { + for(int8_t m = 2; m >= 0; m--) { + float point = (RADIOLIB_RF69_CRYSTAL_FREQ * 1000000.0)/(((4 * m) + 16) * ((uint32_t)1 << (e + (this->ookEnabled ? 3 : 2)))); + if(fabs(rxBw - (point / 1000.0)) <= 0.1) { + // set Rx bandwidth + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_RX_BW, (m << 3) | e, 4, 0); + if(state == RADIOLIB_ERR_NONE) { + this->rxBandwidth = rxBw; + } + return(state); + } + } + } + + return(RADIOLIB_ERR_INVALID_RX_BANDWIDTH); +} + +int16_t RF69::setFrequencyDeviation(float freqDev) { + // set frequency deviation to lowest available setting (required for digimodes) + float newFreqDev = freqDev; + if(freqDev < 0.0) { + newFreqDev = 0.6; + } + + // check frequency deviation range + if(!((newFreqDev + this->bitRate/2 <= 500))) { + return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + } + + // set mode to standby + setMode(RADIOLIB_RF69_STANDBY); + + // set frequency deviation from carrier frequency + uint32_t fdev = (newFreqDev * (uint32_t(1) << RADIOLIB_RF69_DIV_EXPONENT)) / 32000; + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_FDEV_MSB, (fdev & 0xFF00) >> 8, 5, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_FDEV_LSB, fdev & 0x00FF, 7, 0); + + return(state); +} + +int16_t RF69::getFrequencyDeviation(float *freqDev) { + if(freqDev == NULL) { + return(RADIOLIB_ERR_NULL_POINTER); + } + + if(this->ookEnabled) { + *freqDev = 0.0; + + return(RADIOLIB_ERR_NONE); + } + + // get raw value from register + uint32_t fdev = 0; + fdev |= (uint32_t)((this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_FDEV_MSB, 5, 0) << 8) & 0x0000FF00); + fdev |= (uint32_t)((this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_FDEV_LSB, 7, 0) << 0) & 0x000000FF); + + // calculate frequency deviation from raw value obtained from register + // Fdev = Fstep * Fdev(13:0) (pag. 20 of datasheet) + *freqDev = (1000.0 * fdev * RADIOLIB_RF69_CRYSTAL_FREQ) / + (uint32_t(1) << RADIOLIB_RF69_DIV_EXPONENT); + + return(RADIOLIB_ERR_NONE); +} + +int16_t RF69::setOutputPower(int8_t pwr, bool highPower) { + if(highPower) { + RADIOLIB_CHECK_RANGE(pwr, -2, 20, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } else { + RADIOLIB_CHECK_RANGE(pwr, -18, 13, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } + + // set mode to standby + setMode(RADIOLIB_RF69_STANDBY); + + // set output power + int16_t state; + if(highPower) { + // check if both PA1 and PA2 are needed + if(pwr <= 10) { + // -2 to 13 dBm, PA1 is enough + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PA_LEVEL, RADIOLIB_RF69_PA0_OFF | RADIOLIB_RF69_PA1_ON | RADIOLIB_RF69_PA2_OFF | (power + 18), 7, 0); + } else if(pwr <= 17) { + // 13 to 17 dBm, both PAs required + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PA_LEVEL, RADIOLIB_RF69_PA0_OFF | RADIOLIB_RF69_PA1_ON | RADIOLIB_RF69_PA2_ON | (power + 14), 7, 0); + } else { + // 18 - 20 dBm, both PAs and hig power settings required + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PA_LEVEL, RADIOLIB_RF69_PA0_OFF | RADIOLIB_RF69_PA1_ON | RADIOLIB_RF69_PA2_ON | (power + 11), 7, 0); + } + + } else { + // low power module, use only PA0 + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PA_LEVEL, RADIOLIB_RF69_PA0_ON | RADIOLIB_RF69_PA1_OFF | RADIOLIB_RF69_PA2_OFF | (power + 18), 7, 0); + } + + // cache the power value + if(state == RADIOLIB_ERR_NONE) { + this->power = pwr; + } + + return(state); +} + +int16_t RF69::setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits) { + // check constraints + if((maxErrBits > 7) || (len > 8)) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + + // sync word must not contain value 0x00 + for(uint8_t i = 0; i < len; i++) { + if(syncWord[i] == 0x00) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + } + + int16_t state = enableSyncWordFiltering(maxErrBits); + RADIOLIB_ASSERT(state); + + // set sync word register + this->mod->SPIwriteRegisterBurst(RADIOLIB_RF69_REG_SYNC_VALUE_1, syncWord, len); + + if(state == RADIOLIB_ERR_NONE) { + this->syncWordLength = len; + } + + return(state); +} + +int16_t RF69::setPreambleLength(uint8_t preambleLen) { + // RF69 configures preamble length in bytes + if(preambleLen % 8 != 0) { + return(RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH); + } + + uint8_t preLenBytes = preambleLen / 8; + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_PREAMBLE_MSB, 0x00); + + return (this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PREAMBLE_LSB, preLenBytes)); +} + +int16_t RF69::setNodeAddress(uint8_t nodeAddr) { + // enable address filtering (node only) + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_ADDRESS_FILTERING_NODE, 2, 1); + RADIOLIB_ASSERT(state); + + // set node address + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_NODE_ADRS, nodeAddr)); +} + +int16_t RF69::setBroadcastAddress(uint8_t broadAddr) { + // enable address filtering (node + broadcast) + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_ADDRESS_FILTERING_NODE_BROADCAST, 2, 1); + RADIOLIB_ASSERT(state); + + // set broadcast address + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_BROADCAST_ADRS, broadAddr)); +} + +int16_t RF69::disableAddressFiltering() { + // disable address filtering + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_ADDRESS_FILTERING_OFF, 2, 1); + RADIOLIB_ASSERT(state); + + // set node address to default (0x00) + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_NODE_ADRS, 0x00); + RADIOLIB_ASSERT(state); + + // set broadcast address to default (0x00) + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_BROADCAST_ADRS, 0x00)); +} + +void RF69::setAmbientTemperature(int16_t tempAmbient) { + this->tempOffset = getTemperature() - tempAmbient; +} + +int16_t RF69::getTemperature() { + // set mode to STANDBY + setMode(RADIOLIB_RF69_STANDBY); + + // start temperature measurement + this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_TEMP_1, RADIOLIB_RF69_TEMP_MEAS_START, 3, 3); + + // wait until measurement is finished + while(this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_TEMP_1, 2, 2) == RADIOLIB_RF69_TEMP_MEAS_RUNNING) { + // check every 10 us + this->mod->hal->delay(10); + } + int8_t rawTemp = this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_TEMP_2); + + return(0 - (rawTemp + this->tempOffset)); +} + +size_t RF69::getPacketLength(bool update) { + if(!this->packetLengthQueried && update) { + if (this->packetLengthConfig == RADIOLIB_RF69_PACKET_FORMAT_VARIABLE) { + this->packetLength = this->mod->SPIreadRegister(RADIOLIB_RF69_REG_FIFO); + } else { + this->packetLength = this->mod->SPIreadRegister(RADIOLIB_RF69_REG_PAYLOAD_LENGTH); + } + this->packetLengthQueried = true; + } + + return(this->packetLength); +} + +int16_t RF69::fixedPacketLengthMode(uint8_t len) { + return(setPacketMode(RADIOLIB_RF69_PACKET_FORMAT_FIXED, len)); +} + +int16_t RF69::variablePacketLengthMode(uint8_t maxLen) { + return(setPacketMode(RADIOLIB_RF69_PACKET_FORMAT_VARIABLE, maxLen)); +} + +int16_t RF69::enableSyncWordFiltering(uint8_t maxErrBits) { + // enable sync word recognition + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_SYNC_CONFIG, RADIOLIB_RF69_SYNC_ON | RADIOLIB_RF69_FIFO_FILL_CONDITION_SYNC | (this->syncWordLength - 1) << 3 | maxErrBits, 7, 0)); +} + +int16_t RF69::disableSyncWordFiltering() { + // disable sync word detection and generation + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_SYNC_CONFIG, RADIOLIB_RF69_SYNC_OFF | RADIOLIB_RF69_FIFO_FILL_CONDITION, 7, 6)); +} + +int16_t RF69::enableContinuousModeBitSync() { + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_CONTINUOUS_MODE_WITH_SYNC, 6, 5); + if(state == RADIOLIB_ERR_NONE) { + this->bitSync = true; + } + + return(state); +} + +int16_t RF69::disableContinuousModeBitSync() { + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_CONTINUOUS_MODE, 6, 5); + if(state == RADIOLIB_ERR_NONE) { + this->bitSync = false; + } + + return(state); +} + +int16_t RF69::setCrcFiltering(bool crcOn) { + if (crcOn == true) { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_CRC_ON, 4, 4)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_CRC_OFF, 4, 4)); + } +} + +int16_t RF69::setPromiscuousMode(bool enable) { + int16_t state = RADIOLIB_ERR_NONE; + + if (this->promiscuous == enable) { + return(state); + } + + if (enable == true) { + // disable preamble detection and generation + state = setPreambleLength(0); + RADIOLIB_ASSERT(state); + + // disable sync word filtering and insertion + state = disableSyncWordFiltering(); + RADIOLIB_ASSERT(state); + + // disable CRC filtering + state = setCrcFiltering(false); + } else { + // enable preamble detection and generation + state = setPreambleLength(RADIOLIB_RF69_DEFAULT_PREAMBLELEN); + RADIOLIB_ASSERT(state); + + // enable sync word filtering and insertion + state = enableSyncWordFiltering(); + RADIOLIB_ASSERT(state); + + // enable CRC filtering + state = setCrcFiltering(true); + } + if(state == RADIOLIB_ERR_NONE) { + this->promiscuous = enable; + } + + + return(state); +} + +int16_t RF69::setDataShaping(uint8_t sh) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set data shaping + switch(sh) { + case RADIOLIB_SHAPING_NONE: + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_NO_SHAPING, 1, 0)); + case RADIOLIB_SHAPING_0_3: + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_FSK_GAUSSIAN_0_3, 1, 0)); + case RADIOLIB_SHAPING_0_5: + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_FSK_GAUSSIAN_0_5, 1, 0)); + case RADIOLIB_SHAPING_1_0: + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_FSK_GAUSSIAN_1_0, 1, 0)); + default: + return(RADIOLIB_ERR_INVALID_DATA_SHAPING); + } +} + +int16_t RF69::setEncoding(uint8_t encoding) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set encoding + switch(encoding) { + case RADIOLIB_ENCODING_NRZ: + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_DC_FREE_NONE, 6, 5)); + case RADIOLIB_ENCODING_MANCHESTER: + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_DC_FREE_MANCHESTER, 6, 5)); + case RADIOLIB_ENCODING_WHITENING: + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_DC_FREE_WHITENING, 6, 5)); + default: + return(RADIOLIB_ERR_INVALID_ENCODING); + } +} + +int16_t RF69::setLnaTestBoost(bool value) { + if(value) { + return (this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_TEST_LNA, RADIOLIB_RF69_TEST_LNA_BOOST_HIGH, 7, 0)); + } + + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_TEST_LNA_BOOST_NORMAL, RADIOLIB_RF69_TEST_LNA_BOOST_HIGH, 7, 0)); +} + +float RF69::getRSSI() { + return(-1.0 * (this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_RSSI_VALUE)/2.0)); +} + +int16_t RF69::setRSSIThreshold(float dbm) { + RADIOLIB_CHECK_RANGE(dbm, -127.5, 0, RADIOLIB_ERR_INVALID_RSSI_THRESHOLD); + + return this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_RSSI_THRESH, (uint8_t)(-2.0 * dbm), 7, 0); +} + +void RF69::setRfSwitchPins(uint32_t rxEn, uint32_t txEn) { + this->mod->setRfSwitchPins(rxEn, txEn); +} + +void RF69::setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]) { + this->mod->setRfSwitchTable(pins, table); +} + +uint8_t RF69::randomByte() { + // set mode to Rx + setMode(RADIOLIB_RF69_RX); + + // wait a bit for the RSSI reading to stabilise + this->mod->hal->delay(10); + + // read RSSI value 8 times, always keep just the least significant bit + uint8_t randByte = 0x00; + for(uint8_t i = 0; i < 8; i++) { + randByte |= ((this->mod->SPIreadRegister(RADIOLIB_RF69_REG_RSSI_VALUE) & 0x01) << i); + } + + // set mode to standby + setMode(RADIOLIB_RF69_STANDBY); + + return(randByte); +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +void RF69::setDirectAction(void (*func)(void)) { + setDio1Action(func); +} + +void RF69::readBit(uint32_t pin) { + updateDirectBuffer((uint8_t)this->mod->hal->digitalRead(pin)); +} +#endif + +int16_t RF69::setDIOMapping(uint32_t pin, uint32_t value) { + if(pin > 5) { + return(RADIOLIB_ERR_INVALID_DIO_PIN); + } + + if(pin < 4) { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_1, value, 7 - 2 * pin, 6 - 2 * pin)); + } + + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_2, value, 15 - 2 * pin, 14 - 2 * pin)); +} + +int16_t RF69::getChipVersion() { + return(this->mod->SPIgetRegValue(RADIOLIB_RF69_REG_VERSION)); +} + +int16_t RF69::config() { + int16_t state = RADIOLIB_ERR_NONE; + + // set mode to STANDBY + state = setMode(RADIOLIB_RF69_STANDBY); + RADIOLIB_ASSERT(state); + + // set operation modes + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OP_MODE, RADIOLIB_RF69_SEQUENCER_ON | RADIOLIB_RF69_LISTEN_OFF, 7, 6); + RADIOLIB_ASSERT(state); + + // enable over-current protection + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OCP, RADIOLIB_RF69_OCP_ON, 4, 4); + RADIOLIB_ASSERT(state); + + // set data mode, modulation type and shaping + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_PACKET_MODE | RADIOLIB_RF69_FSK, 6, 3); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_FSK_GAUSSIAN_0_3, 1, 0); + RADIOLIB_ASSERT(state); + + // set RSSI threshold + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_RSSI_THRESH, RADIOLIB_RF69_RSSI_THRESHOLD, 7, 0); + RADIOLIB_ASSERT(state); + + // reset FIFO flag + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_IRQ_FLAGS_2, RADIOLIB_RF69_IRQ_FIFO_OVERRUN); + + // disable ClkOut on DIO5 + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_DIO_MAPPING_2, RADIOLIB_RF69_CLK_OUT_OFF, 2, 0); + RADIOLIB_ASSERT(state); + + // set packet configuration and disable encryption + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, RADIOLIB_RF69_PACKET_FORMAT_VARIABLE | RADIOLIB_RF69_DC_FREE_NONE | RADIOLIB_RF69_CRC_ON | RADIOLIB_RF69_CRC_AUTOCLEAR_ON | RADIOLIB_RF69_ADDRESS_FILTERING_OFF, 7, 1); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_2, RADIOLIB_RF69_INTER_PACKET_RX_DELAY, 7, 4); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_2, RADIOLIB_RF69_AUTO_RX_RESTART_ON | RADIOLIB_RF69_AES_OFF, 1, 0); + RADIOLIB_ASSERT(state); + + // set payload length + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PAYLOAD_LENGTH, RADIOLIB_RF69_PAYLOAD_LENGTH, 7, 0); + RADIOLIB_ASSERT(state); + + // set FIFO threshold + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_FIFO_THRESH, RADIOLIB_RF69_TX_START_CONDITION_FIFO_NOT_EMPTY | RADIOLIB_RF69_FIFO_THRESH, 7, 0); + RADIOLIB_ASSERT(state); + + // set Rx timeouts + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_RX_TIMEOUT_1, RADIOLIB_RF69_TIMEOUT_RX_START, 7, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_RX_TIMEOUT_2, RADIOLIB_RF69_TIMEOUT_RSSI_THRESH, 7, 0); + RADIOLIB_ASSERT(state); + + // enable improved fading margin + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_TEST_DAGC, RADIOLIB_RF69_CONTINUOUS_DAGC_LOW_BETA_OFF, 7, 0); + + return(state); +} + +int16_t RF69::setPacketMode(uint8_t mode, uint8_t len) { + // check length + if (len > RADIOLIB_RF69_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set to fixed packet length + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PACKET_CONFIG_1, mode, 7, 7); + RADIOLIB_ASSERT(state); + + // set length to register + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_PAYLOAD_LENGTH, len); + RADIOLIB_ASSERT(state); + + // update the cached value + this->packetLengthConfig = mode; + return(state); +} + +int16_t RF69::setMode(uint8_t mode) { + return(this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OP_MODE, mode, 4, 2)); +} + +void RF69::clearIRQFlags() { + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_IRQ_FLAGS_1, 0b11111111); + this->mod->SPIwriteRegister(RADIOLIB_RF69_REG_IRQ_FLAGS_2, 0b11111111); +} + +void RF69::clearFIFO(size_t count) { + while(count) { + this->mod->SPIreadRegister(RADIOLIB_RF69_REG_FIFO); + count--; + } +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RF69/RF69.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RF69/RF69.h new file mode 100644 index 00000000..8ecb2a85 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RF69/RF69.h @@ -0,0 +1,1038 @@ +#if !defined(_RADIOLIB_RF69_H) +#define _RADIOLIB_RF69_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_RF69) + +#include "../../Module.h" + +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" + +// RF69 physical layer properties +#define RADIOLIB_RF69_FREQUENCY_STEP_SIZE 61.03515625 +#define RADIOLIB_RF69_MAX_PACKET_LENGTH 64 +#define RADIOLIB_RF69_CRYSTAL_FREQ 32.0 +#define RADIOLIB_RF69_DIV_EXPONENT 19 + +// RF69 register map +#define RADIOLIB_RF69_REG_FIFO 0x00 +#define RADIOLIB_RF69_REG_OP_MODE 0x01 +#define RADIOLIB_RF69_REG_DATA_MODUL 0x02 +#define RADIOLIB_RF69_REG_BITRATE_MSB 0x03 +#define RADIOLIB_RF69_REG_BITRATE_LSB 0x04 +#define RADIOLIB_RF69_REG_FDEV_MSB 0x05 +#define RADIOLIB_RF69_REG_FDEV_LSB 0x06 +#define RADIOLIB_RF69_REG_FRF_MSB 0x07 +#define RADIOLIB_RF69_REG_FRF_MID 0x08 +#define RADIOLIB_RF69_REG_FRF_LSB 0x09 +#define RADIOLIB_RF69_REG_OSC_1 0x0A +#define RADIOLIB_RF69_REG_AFC_CTRL 0x0B +#define RADIOLIB_RF69_REG_LISTEN_1 0x0D +#define RADIOLIB_RF69_REG_LISTEN_2 0x0E +#define RADIOLIB_RF69_REG_LISTEN_3 0x0F +#define RADIOLIB_RF69_REG_VERSION 0x10 +#define RADIOLIB_RF69_REG_PA_LEVEL 0x11 +#define RADIOLIB_RF69_REG_PA_RAMP 0x12 +#define RADIOLIB_RF69_REG_OCP 0x13 +#define RADIOLIB_RF69_REG_LNA 0x18 +#define RADIOLIB_RF69_REG_RX_BW 0x19 +#define RADIOLIB_RF69_REG_AFC_BW 0x1A +#define RADIOLIB_RF69_REG_OOK_PEAK 0x1B +#define RADIOLIB_RF69_REG_OOK_AVG 0x1C +#define RADIOLIB_RF69_REG_OOK_FIX 0x1D +#define RADIOLIB_RF69_REG_AFC_FEI 0x1E +#define RADIOLIB_RF69_REG_AFC_MSB 0x1F +#define RADIOLIB_RF69_REG_AFC_LSB 0x20 +#define RADIOLIB_RF69_REG_FEI_MSB 0x21 +#define RADIOLIB_RF69_REG_FEI_LSB 0x22 +#define RADIOLIB_RF69_REG_RSSI_CONFIG 0x23 +#define RADIOLIB_RF69_REG_RSSI_VALUE 0x24 +#define RADIOLIB_RF69_REG_DIO_MAPPING_1 0x25 +#define RADIOLIB_RF69_REG_DIO_MAPPING_2 0x26 +#define RADIOLIB_RF69_REG_IRQ_FLAGS_1 0x27 +#define RADIOLIB_RF69_REG_IRQ_FLAGS_2 0x28 +#define RADIOLIB_RF69_REG_RSSI_THRESH 0x29 +#define RADIOLIB_RF69_REG_RX_TIMEOUT_1 0x2A +#define RADIOLIB_RF69_REG_RX_TIMEOUT_2 0x2B +#define RADIOLIB_RF69_REG_PREAMBLE_MSB 0x2C +#define RADIOLIB_RF69_REG_PREAMBLE_LSB 0x2D +#define RADIOLIB_RF69_REG_SYNC_CONFIG 0x2E +#define RADIOLIB_RF69_REG_SYNC_VALUE_1 0x2F +#define RADIOLIB_RF69_REG_SYNC_VALUE_2 0x30 +#define RADIOLIB_RF69_REG_SYNC_VALUE_3 0x31 +#define RADIOLIB_RF69_REG_SYNC_VALUE_4 0x32 +#define RADIOLIB_RF69_REG_SYNC_VALUE_5 0x33 +#define RADIOLIB_RF69_REG_SYNC_VALUE_6 0x34 +#define RADIOLIB_RF69_REG_SYNC_VALUE_7 0x35 +#define RADIOLIB_RF69_REG_SYNC_VALUE_8 0x36 +#define RADIOLIB_RF69_REG_PACKET_CONFIG_1 0x37 +#define RADIOLIB_RF69_REG_PAYLOAD_LENGTH 0x38 +#define RADIOLIB_RF69_REG_NODE_ADRS 0x39 +#define RADIOLIB_RF69_REG_BROADCAST_ADRS 0x3A +#define RADIOLIB_RF69_REG_AUTO_MODES 0x3B +#define RADIOLIB_RF69_REG_FIFO_THRESH 0x3C +#define RADIOLIB_RF69_REG_PACKET_CONFIG_2 0x3D +#define RADIOLIB_RF69_REG_AES_KEY_1 0x3E +#define RADIOLIB_RF69_REG_AES_KEY_2 0x3F +#define RADIOLIB_RF69_REG_AES_KEY_3 0x40 +#define RADIOLIB_RF69_REG_AES_KEY_4 0x41 +#define RADIOLIB_RF69_REG_AES_KEY_5 0x42 +#define RADIOLIB_RF69_REG_AES_KEY_6 0x43 +#define RADIOLIB_RF69_REG_AES_KEY_7 0x44 +#define RADIOLIB_RF69_REG_AES_KEY_8 0x45 +#define RADIOLIB_RF69_REG_AES_KEY_9 0x46 +#define RADIOLIB_RF69_REG_AES_KEY_10 0x47 +#define RADIOLIB_RF69_REG_AES_KEY_11 0x48 +#define RADIOLIB_RF69_REG_AES_KEY_12 0x49 +#define RADIOLIB_RF69_REG_AES_KEY_13 0x4A +#define RADIOLIB_RF69_REG_AES_KEY_14 0x4B +#define RADIOLIB_RF69_REG_AES_KEY_15 0x4C +#define RADIOLIB_RF69_REG_AES_KEY_16 0x4D +#define RADIOLIB_RF69_REG_TEMP_1 0x4E +#define RADIOLIB_RF69_REG_TEMP_2 0x4F +#define RADIOLIB_RF69_REG_TEST_LNA 0x58 +#define RADIOLIB_RF69_REG_TEST_PA1 0x5A +#define RADIOLIB_RF69_REG_TEST_PA2 0x5C +#define RADIOLIB_RF69_REG_TEST_DAGC 0x6F + +// RF69 modem settings +// RADIOLIB_RF69_REG_OP_MODE MSB LSB DESCRIPTION +#define RADIOLIB_RF69_SEQUENCER_OFF 0b10000000 // 7 7 disable automatic sequencer +#define RADIOLIB_RF69_SEQUENCER_ON 0b00000000 // 7 7 enable automatic sequencer +#define RADIOLIB_RF69_LISTEN_OFF 0b00000000 // 6 6 disable Listen mode +#define RADIOLIB_RF69_LISTEN_ON 0b01000000 // 6 6 enable Listen mode +#define RADIOLIB_RF69_LISTEN_ABORT 0b00100000 // 5 5 abort Listen mode (has to be set together with RF69_LISTEN_OFF) +#define RADIOLIB_RF69_SLEEP 0b00000000 // 4 2 sleep +#define RADIOLIB_RF69_STANDBY 0b00000100 // 4 2 standby +#define RADIOLIB_RF69_FS 0b00001000 // 4 2 frequency synthesis +#define RADIOLIB_RF69_TX 0b00001100 // 4 2 transmit +#define RADIOLIB_RF69_RX 0b00010000 // 4 2 receive + +// RADIOLIB_RF69_REG_DATA_MODUL +#define RADIOLIB_RF69_PACKET_MODE 0b00000000 // 6 5 packet mode (default) +#define RADIOLIB_RF69_CONTINUOUS_MODE_WITH_SYNC 0b01000000 // 6 5 continuous mode with bit synchronizer +#define RADIOLIB_RF69_CONTINUOUS_MODE 0b01100000 // 6 5 continuous mode without bit synchronizer +#define RADIOLIB_RF69_FSK 0b00000000 // 4 3 modulation: FSK (default) +#define RADIOLIB_RF69_OOK 0b00001000 // 4 3 OOK +#define RADIOLIB_RF69_NO_SHAPING 0b00000000 // 1 0 modulation shaping: no shaping (default) +#define RADIOLIB_RF69_FSK_GAUSSIAN_1_0 0b00000001 // 1 0 FSK modulation Gaussian filter, BT = 1.0 +#define RADIOLIB_RF69_FSK_GAUSSIAN_0_5 0b00000010 // 1 0 FSK modulation Gaussian filter, BT = 0.5 +#define RADIOLIB_RF69_FSK_GAUSSIAN_0_3 0b00000011 // 1 0 FSK modulation Gaussian filter, BT = 0.3 +#define RADIOLIB_RF69_OOK_FILTER_BR 0b00000001 // 1 0 OOK modulation filter, f_cutoff = BR +#define RADIOLIB_RF69_OOK_FILTER_2BR 0b00000010 // 1 0 OOK modulation filter, f_cutoff = 2*BR + +// RADIOLIB_RF69_REG_BITRATE_MSB + REG_BITRATE_LSB +#define RADIOLIB_RF69_BITRATE_MSB 0x1A // 7 0 bit rate setting: rate = F(XOSC) / BITRATE +#define RADIOLIB_RF69_BITRATE_LSB 0x0B // 7 0 default value: 4.8 kbps + +// RADIOLIB_RF69_REG_FDEV_MSB + REG_FDEV_LSB +#define RADIOLIB_RF69_FDEV_MSB 0x00 // 5 0 frequency deviation: f_dev = f_step * FDEV +#define RADIOLIB_RF69_FDEV_LSB 0x52 // 7 0 default value: 5 kHz + +// RADIOLIB_RF69_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB +#define RADIOLIB_RF69_FRF_MSB 0xE4 // 7 0 carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19 +#define RADIOLIB_RF69_FRF_MID 0xC0 // 7 0 where F(XOSC) = 32 MHz +#define RADIOLIB_RF69_FRF_LSB 0x00 // 7 0 default value: 915 MHz + +// RADIOLIB_RF69_REG_OSC_1 +#define RADIOLIB_RF69_RC_CAL_START 0b10000000 // 7 7 force RC oscillator calibration +#define RADIOLIB_RF69_RC_CAL_RUNNING 0b00000000 // 6 6 RC oscillator calibration is still running +#define RADIOLIB_RF69_RC_CAL_DONE 0b00000000 // 5 5 RC oscillator calibration has finished + +// RADIOLIB_RF69_REG_AFC_CTRL +#define RADIOLIB_RF69_AFC_LOW_BETA_OFF 0b00000000 // 5 5 standard AFC routine +#define RADIOLIB_RF69_AFC_LOW_BETA_ON 0b00100000 // 5 5 improved AFC routine for signals with modulation index less than 2 + +// RADIOLIB_RF69_REG_LISTEN_1 +#define RADIOLIB_RF69_LISTEN_RES_IDLE_64_US 0b01000000 // 7 6 resolution of Listen mode idle time: 64 us +#define RADIOLIB_RF69_LISTEN_RES_IDLE_4_1_MS 0b10000000 // 7 6 4.1 ms (default) +#define RADIOLIB_RF69_LISTEN_RES_IDLE_262_MS 0b11000000 // 7 6 262 ms +#define RADIOLIB_RF69_LISTEN_RES_RX_64_US 0b00010000 // 5 4 resolution of Listen mode rx time: 64 us (default) +#define RADIOLIB_RF69_LISTEN_RES_RX_4_1_MS 0b00100000 // 5 4 4.1 ms +#define RADIOLIB_RF69_LISTEN_RES_RX_262_MS 0b00110000 // 5 4 262 ms +#define RADIOLIB_RF69_LISTEN_ACCEPT_ABOVE_RSSI_THRESH 0b00000000 // 3 3 packet acceptance criteria: RSSI above threshold +#define RADIOLIB_RF69_LISTEN_ACCEPT_MATCH_SYNC_ADDRESS 0b00001000 // 3 3 RSSI above threshold AND sync address matched +#define RADIOLIB_RF69_LISTEN_END_KEEP_RX 0b00000000 // 2 1 action after packet acceptance: stay in Rx mode +#define RADIOLIB_RF69_LISTEN_END_KEEP_RX_TIMEOUT 0b00000010 // 2 1 stay in Rx mode until timeout (default) +#define RADIOLIB_RF69_LISTEN_END_KEEP_RX_TIMEOUT_RESUME 0b00000100 // 2 1 stay in Rx mode until timeout, Listen mode will resume + +// RADIOLIB_RF69_REG_LISTEN_2 +#define RADIOLIB_RF69_LISTEN_COEF_IDLE 0xF5 // 7 0 duration of idle phase in Listen mode + +// RADIOLIB_RF69_REG_LISTEN_3 +#define RADIOLIB_RF69_LISTEN_COEF_RX 0x20 // 7 0 duration of Rx phase in Listen mode + +// RADIOLIB_RF69_REG_VERSION +#define RADIOLIB_RF69_CHIP_VERSION 0x24 // 7 0 + +// RADIOLIB_RF69_REG_PA_LEVEL +#define RADIOLIB_RF69_PA0_OFF 0b00000000 // 7 7 PA0 disabled +#define RADIOLIB_RF69_PA0_ON 0b10000000 // 7 7 PA0 enabled (default) +#define RADIOLIB_RF69_PA1_OFF 0b00000000 // 6 6 PA1 disabled (default) +#define RADIOLIB_RF69_PA1_ON 0b01000000 // 6 6 PA1 enabled +#define RADIOLIB_RF69_PA2_OFF 0b00000000 // 5 5 PA2 disabled (default) +#define RADIOLIB_RF69_PA2_ON 0b00100000 // 5 5 PA2 enabled +#define RADIOLIB_RF69_OUTPUT_POWER 0b00011111 // 4 0 output power: P_out = -18 + OUTPUT_POWER + +// RADIOLIB_RF69_REG_PA_RAMP +#define RADIOLIB_RF69_PA_RAMP_3_4_MS 0b00000000 // 3 0 PA ramp rise/fall time: 3.4 ms +#define RADIOLIB_RF69_PA_RAMP_2_MS 0b00000001 // 3 0 2 ms +#define RADIOLIB_RF69_PA_RAMP_1_MS 0b00000010 // 3 0 1 ms +#define RADIOLIB_RF69_PA_RAMP_500_US 0b00000011 // 3 0 500 us +#define RADIOLIB_RF69_PA_RAMP_250_US 0b00000100 // 3 0 250 us +#define RADIOLIB_RF69_PA_RAMP_125_US 0b00000101 // 3 0 125 us +#define RADIOLIB_RF69_PA_RAMP_100_US 0b00000110 // 3 0 100 us +#define RADIOLIB_RF69_PA_RAMP_62_US 0b00000111 // 3 0 62 us +#define RADIOLIB_RF69_PA_RAMP_50_US 0b00001000 // 3 0 50 us +#define RADIOLIB_RF69_PA_RAMP_40_US 0b00001001 // 3 0 40 us (default) +#define RADIOLIB_RF69_PA_RAMP_31_US 0b00001010 // 3 0 31 us +#define RADIOLIB_RF69_PA_RAMP_25_US 0b00001011 // 3 0 25 us +#define RADIOLIB_RF69_PA_RAMP_20_US 0b00001100 // 3 0 20 us +#define RADIOLIB_RF69_PA_RAMP_15_US 0b00001101 // 3 0 15 us +#define RADIOLIB_RF69_PA_RAMP_12_US 0b00001110 // 3 0 12 us +#define RADIOLIB_RF69_PA_RAMP_10_US 0b00001111 // 3 0 10 us + +// RADIOLIB_RF69_REG_OCP +#define RADIOLIB_RF69_OCP_OFF 0b00000000 // 4 4 PA overload current protection disabled +#define RADIOLIB_RF69_OCP_ON 0b00010000 // 4 4 PA overload current protection enabled +#define RADIOLIB_RF69_OCP_TRIM 0b00001010 // 3 0 OCP current: I_max(OCP_TRIM = 0b1010) = 95 mA + +// RADIOLIB_RF69_REG_LNA +#define RADIOLIB_RF69_LNA_Z_IN_50_OHM 0b00000000 // 7 7 LNA input impedance: 50 ohm +#define RADIOLIB_RF69_LNA_Z_IN_200_OHM 0b10000000 // 7 7 200 ohm +#define RADIOLIB_RF69_LNA_CURRENT_GAIN 0b00001000 // 5 3 manually set LNA current gain +#define RADIOLIB_RF69_LNA_GAIN_AUTO 0b00000000 // 2 0 LNA gain setting: set automatically by AGC +#define RADIOLIB_RF69_LNA_GAIN_MAX 0b00000001 // 2 0 max gain +#define RADIOLIB_RF69_LNA_GAIN_MAX_6_DB 0b00000010 // 2 0 max gain - 6 dB +#define RADIOLIB_RF69_LNA_GAIN_MAX_12_DB 0b00000011 // 2 0 max gain - 12 dB +#define RADIOLIB_RF69_LNA_GAIN_MAX_24_DB 0b00000100 // 2 0 max gain - 24 dB +#define RADIOLIB_RF69_LNA_GAIN_MAX_36_DB 0b00000101 // 2 0 max gain - 36 dB +#define RADIOLIB_RF69_LNA_GAIN_MAX_48_DB 0b00000110 // 2 0 max gain - 48 dB + +// RADIOLIB_RF69_REG_RX_BW +#define RADIOLIB_RF69_DCC_FREQ 0b01000000 // 7 5 DC offset canceller cutoff frequency (4% Rx BW by default) +#define RADIOLIB_RF69_RX_BW_MANT_16 0b00000000 // 4 3 Channel filter bandwidth FSK: RxBw = F(XOSC)/(RxBwMant * 2^(RxBwExp + 2)) +#define RADIOLIB_RF69_RX_BW_MANT_20 0b00001000 // 4 3 OOK: RxBw = F(XOSC)/(RxBwMant * 2^(RxBwExp + 3)) +#define RADIOLIB_RF69_RX_BW_MANT_24 0b00010000 // 4 3 +#define RADIOLIB_RF69_RX_BW_EXP 0b00000101 // 2 0 default RxBwExp value = 5 + +// RADIOLIB_RF69_REG_AFC_BW +#define RADIOLIB_RF69_DCC_FREQ_AFC 0b10000000 // 7 5 default DccFreq parameter for AFC +#define RADIOLIB_RF69_DCC_RX_BW_MANT_AFC 0b00001000 // 4 3 default RxBwMant parameter for AFC +#define RADIOLIB_RF69_DCC_RX_BW_EXP_AFC 0b00000011 // 2 0 default RxBwExp parameter for AFC + +// RADIOLIB_RF69_REG_OOK_PEAK +#define RADIOLIB_RF69_OOK_THRESH_FIXED 0b00000000 // 7 6 OOK threshold type: fixed +#define RADIOLIB_RF69_OOK_THRESH_PEAK 0b01000000 // 7 6 peak (default) +#define RADIOLIB_RF69_OOK_THRESH_AVERAGE 0b10000000 // 7 6 average +#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_0_5_DB 0b00000000 // 5 3 OOK demodulator step size: 0.5 dB (default) +#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_1_0_DB 0b00001000 // 5 3 1.0 dB +#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_1_5_DB 0b00010000 // 5 3 1.5 dB +#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_2_0_DB 0b00011000 // 5 3 2.0 dB +#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_3_0_DB 0b00100000 // 5 3 3.0 dB +#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_4_0_DB 0b00101000 // 5 3 4.0 dB +#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_5_0_DB 0b00110000 // 5 3 5.0 dB +#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_6_0_DB 0b00111000 // 5 3 6.0 dB +#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_1_1_CHIP 0b00000000 // 2 0 OOK demodulator step period: once per chip (default) +#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_1_2_CHIP 0b00000001 // 2 0 once every 2 chips +#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_1_4_CHIP 0b00000010 // 2 0 once every 4 chips +#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_1_8_CHIP 0b00000011 // 2 0 once every 8 chips +#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_2_1_CHIP 0b00000100 // 2 0 2 times per chip +#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_4_1_CHIP 0b00000101 // 2 0 4 times per chip +#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_8_1_CHIP 0b00000110 // 2 0 8 times per chip +#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_16_1_CHIP 0b00000111 // 2 0 16 times per chip + +// RADIOLIB_RF69_REG_OOK_AVG +#define RADIOLIB_RF69_OOK_AVG_THRESH_FILT_32_PI 0b00000000 // 7 6 OOK average filter coefficient: chip rate / 32*pi +#define RADIOLIB_RF69_OOK_AVG_THRESH_FILT_8_PI 0b01000000 // 7 6 chip rate / 8*pi +#define RADIOLIB_RF69_OOK_AVG_THRESH_FILT_4_PI 0b10000000 // 7 6 chip rate / 4*pi (default) +#define RADIOLIB_RF69_OOK_AVG_THRESH_FILT_2_PI 0b11000000 // 7 6 chip rate / 2*pi + +// RADIOLIB_RF69_REG_OOK_FIX +#define RADIOLIB_RF69_OOK_FIXED_THRESH 0b00000110 // 7 0 default OOK fixed threshold (6 dB) + +// RADIOLIB_RF69_REG_AFC_FEI +#define RADIOLIB_RF69_FEI_RUNNING 0b00000000 // 6 6 FEI status: on-going +#define RADIOLIB_RF69_FEI_DONE 0b01000000 // 6 6 done +#define RADIOLIB_RF69_FEI_START 0b00100000 // 5 5 force new FEI measurement +#define RADIOLIB_RF69_AFC_RUNNING 0b00000000 // 4 4 AFC status: on-going +#define RADIOLIB_RF69_AFC_DONE 0b00010000 // 4 4 done +#define RADIOLIB_RF69_AFC_AUTOCLEAR_OFF 0b00000000 // 3 3 AFC register autoclear disabled +#define RADIOLIB_RF69_AFC_AUTOCLEAR_ON 0b00001000 // 3 3 AFC register autoclear enabled +#define RADIOLIB_RF69_AFC_AUTO_OFF 0b00000000 // 2 2 perform AFC only manually +#define RADIOLIB_RF69_AFC_AUTO_ON 0b00000100 // 2 2 perform AFC each time Rx mode is started +#define RADIOLIB_RF69_AFC_CLEAR 0b00000010 // 1 1 clear AFC register +#define RADIOLIB_RF69_AFC_START 0b00000001 // 0 0 start AFC + +// RADIOLIB_RF69_REG_RSSI_CONFIG +#define RADIOLIB_RF69_RSSI_RUNNING 0b00000000 // 1 1 RSSI status: on-going +#define RADIOLIB_RF69_RSSI_DONE 0b00000010 // 1 1 done +#define RADIOLIB_RF69_RSSI_START 0b00000001 // 0 0 start RSSI measurement + +// RADIOLIB_RF69_REG_DIO_MAPPING_1 +#define RADIOLIB_RF69_DIO0_CONT_MODE_READY 0b11000000 // 7 6 +#define RADIOLIB_RF69_DIO0_CONT_PLL_LOCK 0b00000000 // 7 6 +#define RADIOLIB_RF69_DIO0_CONT_SYNC_ADDRESS 0b00000000 // 7 6 +#define RADIOLIB_RF69_DIO0_CONT_TIMEOUT 0b01000000 // 7 6 +#define RADIOLIB_RF69_DIO0_CONT_RSSI 0b10000000 // 7 6 +#define RADIOLIB_RF69_DIO0_CONT_TX_READY 0b01000000 // 7 6 +#define RADIOLIB_RF69_DIO0_PACK_PLL_LOCK 0b11000000 // 7 6 +#define RADIOLIB_RF69_DIO0_PACK_CRC_OK 0b00000000 // 7 6 +#define RADIOLIB_RF69_DIO0_PACK_PAYLOAD_READY 0b01000000 // 7 6 +#define RADIOLIB_RF69_DIO0_PACK_SYNC_ADDRESS 0b10000000 // 7 6 +#define RADIOLIB_RF69_DIO0_PACK_RSSI 0b11000000 // 7 6 +#define RADIOLIB_RF69_DIO0_PACK_PACKET_SENT 0b00000000 // 7 6 +#define RADIOLIB_RF69_DIO0_PACK_TX_READY 0b01000000 // 7 6 +#define RADIOLIB_RF69_DIO1_CONT_PLL_LOCK 0b00110000 // 5 4 +#define RADIOLIB_RF69_DIO1_CONT_DCLK 0b00000000 // 5 4 +#define RADIOLIB_RF69_DIO1_CONT_RX_READY 0b00010000 // 5 4 +#define RADIOLIB_RF69_DIO1_CONT_SYNC_ADDRESS 0b00110000 // 5 4 +#define RADIOLIB_RF69_DIO1_CONT_TX_READY 0b00010000 // 5 4 +#define RADIOLIB_RF69_DIO1_PACK_FIFO_LEVEL 0b00000000 // 5 4 +#define RADIOLIB_RF69_DIO1_PACK_FIFO_FULL 0b00010000 // 5 4 +#define RADIOLIB_RF69_DIO1_PACK_FIFO_NOT_EMPTY 0b00100000 // 5 4 +#define RADIOLIB_RF69_DIO1_PACK_PLL_LOCK 0b00110000 // 5 4 +#define RADIOLIB_RF69_DIO1_PACK_TIMEOUT 0b00110000 // 5 4 +#define RADIOLIB_RF69_DIO2_CONT_DATA 0b00000000 // 3 2 +#define RADIOLIB_RF69_DIO2_PACK_FIFO_NOT_EMPTY 0b00000000 // 3 2 +#define RADIOLIB_RF69_DIO2_PACK_AUTO_MODE 0b00001100 // 3 2 +#define RADIOLIB_RF69_DIO2_PACK_DATA 0b00000100 // 3 2 +#define RADIOLIB_RF69_DIO3_CONT_AUTO_MODE 0b00000010 // 0 1 +#define RADIOLIB_RF69_DIO3_CONT_RSSI 0b00000000 // 0 1 +#define RADIOLIB_RF69_DIO3_CONT_RX_READY 0b00000001 // 0 1 +#define RADIOLIB_RF69_DIO3_CONT_TIMEOUT 0b00000011 // 0 1 +#define RADIOLIB_RF69_DIO3_CONT_TX_READY 0b00000001 // 0 1 +#define RADIOLIB_RF69_DIO3_PACK_FIFO_FULL 0b00000000 // 0 1 +#define RADIOLIB_RF69_DIO3_PACK_PLL_LOCK 0b00000011 // 0 1 +#define RADIOLIB_RF69_DIO3_PACK_RSSI 0b00000001 // 0 1 +#define RADIOLIB_RF69_DIO3_PACK_SYNC_ADDRESSS 0b00000010 // 0 1 +#define RADIOLIB_RF69_DIO3_PACK_TX_READY 0b00000001 // 0 1 + +// RADIOLIB_RF69_REG_DIO_MAPPING_2 +#define RADIOLIB_RF69_DIO4_CONT_PLL_LOCK 0b11000000 // 7 6 +#define RADIOLIB_RF69_DIO4_CONT_TIMEOUT 0b00000000 // 7 6 +#define RADIOLIB_RF69_DIO4_CONT_RX_READY 0b01000000 // 7 6 +#define RADIOLIB_RF69_DIO4_CONT_SYNC_ADDRESS 0b10000000 // 7 6 +#define RADIOLIB_RF69_DIO4_CONT_TX_READY 0b01000000 // 7 6 +#define RADIOLIB_RF69_DIO4_PACK_PLL_LOCK 0b11000000 // 7 6 +#define RADIOLIB_RF69_DIO4_PACK_TIMEOUT 0b00000000 // 7 6 +#define RADIOLIB_RF69_DIO4_PACK_RSSI 0b01000000 // 7 6 +#define RADIOLIB_RF69_DIO4_PACK_RX_READY 0b10000000 // 7 6 +#define RADIOLIB_RF69_DIO4_PACK_MODE_READY 0b00000000 // 7 6 +#define RADIOLIB_RF69_DIO4_PACK_TX_READY 0b01000000 // 7 6 +#define RADIOLIB_RF69_DIO5_CONT_MODE_READY 0b00110000 // 5 4 +#define RADIOLIB_RF69_DIO5_CONT_CLK_OUT 0b00000000 // 5 4 +#define RADIOLIB_RF69_DIO5_CONT_RSSI 0b00010000 // 5 4 +#define RADIOLIB_RF69_DIO5_PACK_MODE_READY 0b00110000 // 5 4 +#define RADIOLIB_RF69_DIO5_PACK_CLK_OUT 0b00000000 // 5 4 +#define RADIOLIB_RF69_DIO5_PACK_DATA 0b00010000 // 5 4 +#define RADIOLIB_RF69_CLK_OUT_FXOSC 0b00000000 // 2 0 ClkOut frequency: F(XOSC) +#define RADIOLIB_RF69_CLK_OUT_FXOSC_2 0b00000001 // 2 0 F(XOSC) / 2 +#define RADIOLIB_RF69_CLK_OUT_FXOSC_4 0b00000010 // 2 0 F(XOSC) / 4 +#define RADIOLIB_RF69_CLK_OUT_FXOSC_8 0b00000011 // 2 0 F(XOSC) / 8 +#define RADIOLIB_RF69_CLK_OUT_FXOSC_16 0b00000100 // 2 0 F(XOSC) / 16 +#define RADIOLIB_RF69_CLK_OUT_FXOSC_32 0b00000101 // 2 0 F(XOSC) / 31 +#define RADIOLIB_RF69_CLK_OUT_RC 0b00000110 // 2 0 RC +#define RADIOLIB_RF69_CLK_OUT_OFF 0b00000111 // 2 0 disabled (default) + +// RADIOLIB_RF69_REG_IRQ_FLAGS_1 +#define RADIOLIB_RF69_IRQ_MODE_READY 0b10000000 // 7 7 requested mode was set +#define RADIOLIB_RF69_IRQ_RX_READY 0b01000000 // 6 6 Rx mode ready +#define RADIOLIB_RF69_IRQ_TX_READY 0b00100000 // 5 5 Tx mode ready +#define RADIOLIB_RF69_IRQ_PLL_LOCK 0b00010000 // 4 4 PLL is locked +#define RADIOLIB_RF69_IRQ_RSSI 0b00001000 // 3 3 RSSI value exceeded RssiThreshold +#define RADIOLIB_RF69_IRQ_TIMEOUT 0b00000100 // 2 2 timeout occurred +#define RADIOLIB_RF69_IRQ_AUTO_MODE 0b00000010 // 1 1 entered intermediate mode +#define RADIOLIB_RF69_SYNC_ADDRESS_MATCH 0b00000001 // 0 0 sync address detected + +// RADIOLIB_RF69_REG_IRQ_FLAGS_2 +#define RADIOLIB_RF69_IRQ_FIFO_FULL 0b10000000 // 7 7 FIFO is full +#define RADIOLIB_RF69_IRQ_FIFO_NOT_EMPTY 0b01000000 // 6 6 FIFO contains at least 1 byte +#define RADIOLIB_RF69_IRQ_FIFO_LEVEL 0b00100000 // 5 5 FIFO contains more than FifoThreshold bytes +#define RADIOLIB_RF69_IRQ_FIFO_OVERRUN 0b00010000 // 4 4 FIFO overrun occurred +#define RADIOLIB_RF69_IRQ_PACKET_SENT 0b00001000 // 3 3 packet was sent +#define RADIOLIB_RF69_IRQ_PAYLOAD_READY 0b00000100 // 2 2 last payload byte received and CRC check passed +#define RADIOLIB_RF69_IRQ_CRC_OK 0b00000010 // 1 1 CRC check passed + +// RADIOLIB_RF69_REG_RSSI_THRESH +#define RADIOLIB_RF69_RSSI_THRESHOLD 0xE4 // 7 0 RSSI threshold level (2 dB by default) + +// RADIOLIB_RF69_REG_RX_TIMEOUT_1 +#define RADIOLIB_RF69_TIMEOUT_RX_START_OFF 0x00 // 7 0 RSSI interrupt timeout disabled (default) +#define RADIOLIB_RF69_TIMEOUT_RX_START 0xFF // 7 0 timeout will occur if RSSI interrupt is not received + +// RADIOLIB_RF69_REG_RX_TIMEOUT_2 +#define RADIOLIB_RF69_TIMEOUT_RSSI_THRESH_OFF 0x00 // 7 0 PayloadReady interrupt timeout disabled (default) +#define RADIOLIB_RF69_TIMEOUT_RSSI_THRESH 0xFF // 7 0 timeout will occur if PayloadReady interrupt is not received + +// RADIOLIB_RF69_REG_PREAMBLE_MSB + REG_PREAMBLE_MSB +#define RADIOLIB_RF69_PREAMBLE_MSB 0x00 // 7 0 2-byte preamble size value +#define RADIOLIB_RF69_PREAMBLE_LSB 0x03 // 7 0 + +// RADIOLIB_RF69_REG_SYNC_CONFIG +#define RADIOLIB_RF69_SYNC_OFF 0b00000000 // 7 7 sync word detection off +#define RADIOLIB_RF69_SYNC_ON 0b10000000 // 7 7 sync word detection on (default) +#define RADIOLIB_RF69_FIFO_FILL_CONDITION_SYNC 0b00000000 // 6 6 FIFO fill condition: on SyncAddress interrupt (default) +#define RADIOLIB_RF69_FIFO_FILL_CONDITION 0b01000000 // 6 6 as long as the bit is set +#define RADIOLIB_RF69_SYNC_SIZE 0b00001000 // 5 3 size of sync word: SyncSize + 1 bytes +#define RADIOLIB_RF69_SYNC_TOL 0b00000000 // 2 0 number of tolerated errors in sync word + +// RADIOLIB_RF69_REG_SYNC_VALUE_1 - SYNC_VALUE_8 +#define RADIOLIB_RF69_SYNC_BYTE_1 0x01 // 7 0 sync word: 1st byte (MSB) +#define RADIOLIB_RF69_SYNC_BYTE_2 0x01 // 7 0 2nd byte +#define RADIOLIB_RF69_SYNC_BYTE_3 0x01 // 7 0 3rd byte +#define RADIOLIB_RF69_SYNC_BYTE_4 0x01 // 7 0 4th byte +#define RADIOLIB_RF69_SYNC_BYTE_5 0x01 // 7 0 5th byte +#define RADIOLIB_RF69_SYNC_BYTE_6 0x01 // 7 0 6th byte +#define RADIOLIB_RF69_SYNC_BYTE_7 0x01 // 7 0 7th byte +#define RADIOLIB_RF69_SYNC_BYTE_8 0x01 // 7 0 8th byte (LSB) + +// RADIOLIB_RF69_REG_PACKET_CONFIG_1 +#define RADIOLIB_RF69_PACKET_FORMAT_FIXED 0b00000000 // 7 7 fixed packet length (default) +#define RADIOLIB_RF69_PACKET_FORMAT_VARIABLE 0b10000000 // 7 7 variable packet length +#define RADIOLIB_RF69_DC_FREE_NONE 0b00000000 // 6 5 DC-free encoding: none (default) +#define RADIOLIB_RF69_DC_FREE_MANCHESTER 0b00100000 // 6 5 Manchester +#define RADIOLIB_RF69_DC_FREE_WHITENING 0b01000000 // 6 5 Whitening +#define RADIOLIB_RF69_CRC_OFF 0b00000000 // 4 4 CRC disabled +#define RADIOLIB_RF69_CRC_ON 0b00010000 // 4 4 CRC enabled (default) +#define RADIOLIB_RF69_CRC_AUTOCLEAR_ON 0b00000000 // 3 3 discard packet when CRC check fails (default) +#define RADIOLIB_RF69_CRC_AUTOCLEAR_OFF 0b00001000 // 3 3 keep packet when CRC check fails +#define RADIOLIB_RF69_ADDRESS_FILTERING_OFF 0b00000000 // 2 1 address filtering: none (default) +#define RADIOLIB_RF69_ADDRESS_FILTERING_NODE 0b00000010 // 2 1 node +#define RADIOLIB_RF69_ADDRESS_FILTERING_NODE_BROADCAST 0b00000100 // 2 1 node or broadcast + +// RADIOLIB_RF69_REG_PAYLOAD_LENGTH +#define RADIOLIB_RF69_PAYLOAD_LENGTH 0xFF // 7 0 payload length + +// RADIOLIB_RF69_REG_AUTO_MODES +#define RADIOLIB_RF69_ENTER_COND_NONE 0b00000000 // 7 5 condition for entering intermediate mode: none, AutoModes disabled (default) +#define RADIOLIB_RF69_ENTER_COND_FIFO_NOT_EMPTY 0b00100000 // 7 5 FifoNotEmpty rising edge +#define RADIOLIB_RF69_ENTER_COND_FIFO_LEVEL 0b01000000 // 7 5 FifoLevel rising edge +#define RADIOLIB_RF69_ENTER_COND_CRC_OK 0b01100000 // 7 5 CrcOk rising edge +#define RADIOLIB_RF69_ENTER_COND_PAYLOAD_READY 0b10000000 // 7 5 PayloadReady rising edge +#define RADIOLIB_RF69_ENTER_COND_SYNC_ADDRESS 0b10100000 // 7 5 SyncAddress rising edge +#define RADIOLIB_RF69_ENTER_COND_PACKET_SENT 0b11000000 // 7 5 PacketSent rising edge +#define RADIOLIB_RF69_ENTER_COND_FIFO_EMPTY 0b11100000 // 7 5 FifoNotEmpty falling edge +#define RADIOLIB_RF69_EXIT_COND_NONE 0b00000000 // 4 2 condition for exiting intermediate mode: none, AutoModes disabled (default) +#define RADIOLIB_RF69_EXIT_COND_FIFO_EMPTY 0b00100000 // 4 2 FifoNotEmpty falling edge +#define RADIOLIB_RF69_EXIT_COND_FIFO_LEVEL 0b01000000 // 4 2 FifoLevel rising edge +#define RADIOLIB_RF69_EXIT_COND_CRC_OK 0b01100000 // 4 2 CrcOk rising edge +#define RADIOLIB_RF69_EXIT_COND_PAYLOAD_READY 0b10000000 // 4 2 PayloadReady rising edge +#define RADIOLIB_RF69_EXIT_COND_SYNC_ADDRESS 0b10100000 // 4 2 SyncAddress rising edge +#define RADIOLIB_RF69_EXIT_COND_PACKET_SENT 0b11000000 // 4 2 PacketSent rising edge +#define RADIOLIB_RF69_EXIT_COND_TIMEOUT 0b11100000 // 4 2 timeout rising edge +#define RADIOLIB_RF69_INTER_MODE_SLEEP 0b00000000 // 1 0 intermediate mode: sleep (default) +#define RADIOLIB_RF69_INTER_MODE_STANDBY 0b00000001 // 1 0 standby +#define RADIOLIB_RF69_INTER_MODE_RX 0b00000010 // 1 0 Rx +#define RADIOLIB_RF69_INTER_MODE_TX 0b00000011 // 1 0 Tx + +// RADIOLIB_RF69_REG_FIFO_THRESH +#define RADIOLIB_RF69_TX_START_CONDITION_FIFO_LEVEL 0b00000000 // 7 7 packet transmission start condition: FifoLevel +#define RADIOLIB_RF69_TX_START_CONDITION_FIFO_NOT_EMPTY 0b10000000 // 7 7 FifoNotEmpty (default) +#define RADIOLIB_RF69_FIFO_THRESH 0x1F // 6 0 default threshold to trigger FifoLevel interrupt + +// RADIOLIB_RF69_REG_PACKET_CONFIG_2 +#define RADIOLIB_RF69_INTER_PACKET_RX_DELAY 0b00000000 // 7 4 delay between FIFO empty and start of new RSSI phase +#define RADIOLIB_RF69_RESTART_RX 0b00000100 // 2 2 force receiver into wait mode +#define RADIOLIB_RF69_AUTO_RX_RESTART_OFF 0b00000000 // 1 1 auto Rx restart disabled +#define RADIOLIB_RF69_AUTO_RX_RESTART_ON 0b00000010 // 1 1 auto Rx restart enabled (default) +#define RADIOLIB_RF69_AES_OFF 0b00000000 // 0 0 AES encryption disabled (default) +#define RADIOLIB_RF69_AES_ON 0b00000001 // 0 0 AES encryption enabled, payload size limited to 66 bytes + +// RADIOLIB_RF69_REG_TEST_LNA +#define RADIOLIB_RF69_TEST_LNA_BOOST_NORMAL 0x1B // 7 0 +#define RADIOLIB_RF69_TEST_LNA_BOOST_HIGH 0x2D // 7 0 + +// RADIOLIB_RF69_REG_TEMP_1 +#define RADIOLIB_RF69_TEMP_MEAS_START 0b00001000 // 3 3 trigger temperature measurement +#define RADIOLIB_RF69_TEMP_MEAS_RUNNING 0b00000100 // 2 2 temperature measurement status: on-going +#define RADIOLIB_RF69_TEMP_MEAS_DONE 0b00000000 // 2 2 done + +// RADIOLIB_RF69_REG_TEST_DAGC +#define RADIOLIB_RF69_CONTINUOUS_DAGC_NORMAL 0x00 // 7 0 fading margin improvement: normal mode +#define RADIOLIB_RF69_CONTINUOUS_DAGC_LOW_BETA_ON 0x20 // 7 0 improved mode for AfcLowBetaOn +#define RADIOLIB_RF69_CONTINUOUS_DAGC_LOW_BETA_OFF 0x30 // 7 0 improved mode for AfcLowBetaOff (default) + +// RADIOLIB_RF69_REG_TEST_PA1 +#define RADIOLIB_RF69_PA1_NORMAL 0x55 // 7 0 PA_BOOST: none +#define RADIOLIB_RF69_PA1_20_DBM 0x5D // 7 0 +20 dBm + +// RADIOLIB_RF69_REG_TEST_PA2 +#define RADIOLIB_RF69_PA2_NORMAL 0x70 // 7 0 PA_BOOST: none +#define RADIOLIB_RF69_PA2_20_DBM 0x7C // 7 0 +20 dBm + +// RadioLib defaults +#define RADIOLIB_RF69_DEFAULT_FREQ 434.0 +#define RADIOLIB_RF69_DEFAULT_BR 4.8 +#define RADIOLIB_RF69_DEFAULT_FREQDEV 5.0 +#define RADIOLIB_RF69_DEFAULT_RXBW 125.0 +#define RADIOLIB_RF69_DEFAULT_POWER 10 +#define RADIOLIB_RF69_DEFAULT_PREAMBLELEN 16 +#define RADIOLIB_RF69_DEFAULT_SW {0x12, 0xAD} +#define RADIOLIB_RF69_DEFAULT_SW_LEN 2 + +/*! + \class RF69 + \brief Control class for %RF69 module. Also serves as base class for SX1231. +*/ +class RF69: public PhysicalLayer { + public: + // introduce PhysicalLayer overloads + using PhysicalLayer::transmit; + using PhysicalLayer::receive; + using PhysicalLayer::startTransmit; + using PhysicalLayer::readData; + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + RF69(Module* module); + + Module* getMod(); + + // basic methods + + /*! + \brief Initialization method. + \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. + \param br Bit rate to be used in kbps. Defaults to 4.8 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz Defaults to 5.0 kHz. + \param rxBw Receiver bandwidth in kHz. Defaults to 125.0 kHz. + \param pwr Output power in dBm. Defaults to 10 dBm. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes + */ + int16_t begin( + float freq = RADIOLIB_RF69_DEFAULT_FREQ, + float br = RADIOLIB_RF69_DEFAULT_BR, + float freqDev = RADIOLIB_RF69_DEFAULT_FREQDEV, + float rxBw = RADIOLIB_RF69_DEFAULT_RXBW, + int8_t pwr = RADIOLIB_RF69_DEFAULT_POWER, + uint8_t preambleLen = RADIOLIB_RF69_DEFAULT_PREAMBLELEN); + + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + */ + void reset(); + + /*! + \brief Blocking binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Address to send the data to. Will only be added if address filtering was enabled. + \returns \ref status_codes + */ + int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Blocking binary receive method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \returns \ref status_codes + */ + int16_t receive(uint8_t* data, size_t len) override; + + /*! + \brief Sets the module to sleep mode. + \returns \ref status_codes + */ + int16_t sleep(); + + /*! + \brief Sets the module to standby mode. + \returns \ref status_codes + */ + int16_t standby() override; + + /*! + \brief Sets the module to standby. + \param mode Standby mode to be used. No effect, implemented only for PhysicalLayer compatibility. + \returns \ref status_codes + */ + int16_t standby(uint8_t mode) override; + + /*! + \brief Starts direct mode transmission. + \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0) override; + + /*! + \brief Starts direct mode reception. + \returns \ref status_codes + */ + int16_t receiveDirect() override; + + /*! + \brief Stops direct mode. It is required to call this method to switch from direct transmissions to packet-based transmissions. + */ + int16_t packetMode(); + + // hardware AES support + + /*! + \brief Sets AES key. + \param Key to be used for AES encryption. Must be exactly 16 bytes long. + */ + void setAESKey(uint8_t* key); + + /*! + \brief Enables AES encryption. + \returns \ref status_codes + */ + int16_t enableAES(); + + /*! + \brief Disables AES encryption. + \returns \ref status_codes + */ + int16_t disableAES(); + + // interrupt methods + + /*! + \brief Sets interrupt service routine to call when DIO0 activates. + \param func ISR to call. + */ + void setDio0Action(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when DIO0 activates. + */ + void clearDio0Action(); + + /*! + \brief Sets interrupt service routine to call when DIO1 activates. + \param func ISR to call. + */ + void setDio1Action(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when DIO1 activates. + */ + void clearDio1Action(); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + void clearPacketSentAction(); + + /*! + \brief Set interrupt service routine function to call when FIFO is empty. + \param func Pointer to interrupt service routine. + */ + void setFifoEmptyAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when FIFO is empty. + */ + void clearFifoEmptyAction(); + + /*! + \brief Set interrupt service routine function to call when FIFO is full. + \param func Pointer to interrupt service routine. + */ + void setFifoFullAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when FIFO is full. + */ + void clearFifoFullAction(); + + /*! + \brief Set interrupt service routine function to call when FIFO is empty. + \param data Pointer to the transmission buffer. + \param totalLen Total number of bytes to transmit. + \param remLen Pointer to a counter holding the number of bytes that have been transmitted so far. + \returns True when a complete packet is sent, false if more data is needed. + */ + bool fifoAdd(uint8_t* data, int totalLen, int* remLen); + + /*! + \brief Set interrupt service routine function to call when FIFO is sufficiently full to read. + \param data Pointer to a buffer that stores the receive data. + \param totalLen Total number of bytes to receive. + \param rcvLen Pointer to a counter holding the number of bytes that have been received so far. + \returns True when a complete packet is received, false if more data is needed. + */ + bool fifoGet(volatile uint8_t* data, int totalLen, volatile int* rcvLen); + + /*! + \brief Interrupt-driven binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Address to send the data to. Will only be added if address filtering was enabled. + \returns \ref status_codes + */ + int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Clean up after transmission is done. + \returns \ref status_codes + */ + int16_t finishTransmit() override; + + /*! + \brief Interrupt-driven receive method. GDO0 will be activated when full packet is received. + \returns \ref status_codes + */ + int16_t startReceive(); + + /*! + \brief Interrupt-driven receive method, implemented for compatibility with PhysicalLayer. + \param timeout Ignored. + \param irqFlags Ignored. + \param irqMask Ignored. + \param len Ignored. + \returns \ref status_codes + */ + int16_t startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len); + + /*! + \brief Reads data received after calling startReceive method. When the packet length is not known in advance, + getPacketLength method must be called BEFORE calling readData! + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be read. When set to 0, the packet length will be retrieved automatically. + When more bytes than received are requested, only the number of bytes requested will be returned. + \returns \ref status_codes + */ + int16_t readData(uint8_t* data, size_t len) override; + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values are in bands 290.0 to 340.0 MHz, 431.0 to 510.0 MHz + and 862.0 to 1020.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Gets carrier frequency. + \param[out] freq Variable to write carrier frequency currently set, in MHz. + \returns \ref status_codes + */ + int16_t getFrequency(float *freq); + + /*! + \brief Sets bit rate. Allowed values range from 0.5 to 300.0 kbps. + \param br Bit rate to be set in kbps. + \returns \ref status_codes + */ + int16_t setBitRate(float br); + + /*! + \brief Sets receiver bandwidth. Allowed values are 2.6, 3.1, 3.9, 5.2, 6.3, 7.8, 10.4, 12.5, 15.6, + 20.8, 25.0, 31.3, 41.7, 50.0, 62.5, 83.3, 100.0, 125.0, 166.7, 200.0, 250.0, 333.3, 400.0 and 500.0 kHz. + \param rxBw Receiver bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setRxBandwidth(float rxBw); + + /*! + \brief Sets frequency deviation. + \param freqDev Frequency deviation to be set in kHz. + \returns \ref status_codes + */ + int16_t setFrequencyDeviation(float freqDev) override; + + /*! + \brief Gets frequency deviation. + \param[out] freqDev Where to write the frequency deviation currently set, in kHz. + \returns \ref status_codes + */ + int16_t getFrequencyDeviation(float *freqDev); + + /*! + \brief Sets output power. Allowed values range from -18 to 13 dBm for + low power modules (RF69C/CW) or -2 to 20 dBm (RF69H/HC/HCW). + \param pwr Output power to be set in dBm. + \param highPower Set to true when using modules high power port (RF69H/HC/HCW). + Defaults to false (models without high power port - RF69C/CW). + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t pwr, bool highPower = false); + + /*! + \brief Sets sync word. Up to 8 bytes can be set as sync word. + \param syncWord Pointer to the array of sync word bytes. + \param len Sync word length in bytes. + \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + */ + int16_t setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits = 0); + + /*! + \brief Sets preamble length. + \param preambleLen Preamble length to be set (in bits), allowed values: 16, 24, 32, 48, 64, 96, 128 and 192. + \returns \ref status_codes + */ + int16_t setPreambleLength(uint8_t preambleLen); + + /*! + \brief Sets node address. Calling this method will also enable address filtering for node address only. + \param nodeAddr Node address to be set. + \returns \ref status_codes + */ + int16_t setNodeAddress(uint8_t nodeAddr); + + /*! + \brief Sets broadcast address. Calling this method will also enable address filtering for node and broadcast address. + \param broadAddr Node address to be set. + \returns \ref status_codes + */ + int16_t setBroadcastAddress(uint8_t broadAddr); + + /*! + \brief Disables address filtering. Calling this method will also erase previously set addresses. + \returns \ref status_codes + */ + int16_t disableAddressFiltering(); + + // measurement methods + + /*! + \brief Sets ambient temperature. Required to correct values from on-board temperature sensor. + \param tempAmbient Ambient temperature in degrees Celsius. + */ + void setAmbientTemperature(int16_t tempAmbient); + + /*! + \brief Measures temperature. + \returns Measured temperature in degrees Celsius. + */ + int16_t getTemperature(); + + /*! + \brief Query modem for the packet length of received payload. + \param update Update received packet length. Will return cached value when set to false. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update = true) override; + + /*! + \brief Enables/disables OOK modulation instead of FSK. + Note: This function calls setRxBandwidth again, since register values differ based on OOK mode being enabled/disabled. + \param enable Enable (true) or disable (false) OOK. + \returns \ref status_codes + */ + int16_t setOOK(bool enable); + + /*! + \brief Selects the type of threshold in the OOK data slicer + \param type Threshold type: RADIOLIB_RF69_OOK_THRESH_PEAK(default), RADIOLIB_RF69_OOK_THRESH_FIXED or + RADIOLIB_RF69_OOK_THRESH_AVERAGE + \returns \ref status_codes + */ + int16_t setOokThresholdType(uint8_t type); + + /*! + \brief Fixed threshold for the Data Slicer in OOK mode or floor threshold for the Data Slicer + in OOK when Peak mode is used. + \param value Fixed threshold value (in dB) in the OOK demodulator. + Used when OokThresType = RADIOLIB_RF69_OOK_THRESH_FIXED. + \returns \ref status_codes + */ + int16_t setOokFixedThreshold(uint8_t value); + + /*! + \brief Period of decrement of the RSSI threshold in the OOK demodulator. + \param value Use defines RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_X_X_CHIP + \returns \ref status_codes + */ + int16_t setOokPeakThresholdDecrement(uint8_t value); + + /*! + \brief Set modem in fixed packet length mode. + \param len Packet length. + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_RF69_MAX_PACKET_LENGTH); + + /*! + \brief Set modem in variable packet length mode. + \param len Maximum packet length. + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_RF69_MAX_PACKET_LENGTH); + + /*! + \brief Enable sync word filtering and generation. + \param numBits Sync word length in bits. + \returns \ref status_codes + */ + int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0); + + /*! + \brief Disable preamble and sync word filtering and generation. + \returns \ref status_codes + */ + int16_t disableSyncWordFiltering(); + + /*! + \brief Enable Bit synchronization in continuous mode. + \returns \ref status_codes + */ + int16_t enableContinuousModeBitSync(); + + /*! + \brief Disable Bit synchronization in continuous mode. + \returns \ref status_codes + */ + int16_t disableContinuousModeBitSync(); + + /*! + \brief Enable CRC filtering and generation. + \param crcOn Set or unset CRC filtering. + \returns \ref status_codes + */ + int16_t setCrcFiltering(bool crcOn = true); + + /*! + \brief Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address, CRC). + \param enable Set or unset promiscuous mode. + \returns \ref status_codes + */ + int16_t setPromiscuousMode(bool enable = true); + + /*! + \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. + Allowed values are RADIOLIB_SHAPING_0_3, RADIOLIB_SHAPING_0_5 or RADIOLIB_SHAPING_1_0. + Set to RADIOLIB_SHAPING_NONE to disable data shaping. + \param sh Gaussian shaping bandwidth-time product that will be used for data shaping + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! + \brief Sets transmission encoding. + Allowed values are RADIOLIB_ENCODING_NRZ, RADIOLIB_ENCODING_MANCHESTER and RADIOLIB_ENCODING_WHITENING. + \param encoding Encoding to be used. + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding) override; + + /*! + \brief Enable/disable LNA Boost mode (disabled by default). + \param value True to enable, false to disable. + \returns \ref status_codes + */ + int16_t setLnaTestBoost(bool value); + + /*! + \brief Gets RSSI (Recorded Signal Strength Indicator) of the last received packet. + \returns Last packet RSSI in dBm. + */ + float getRSSI(); + + /*! + \brief Sets the RSSI value above which the RSSI interrupt is signaled + \param dbm A dBm value between -127.5 and 0 inclusive + \returns \ref status_codes + */ + int16_t setRSSIThreshold(float dbm); + + /*! \copydoc Module::setRfSwitchPins */ + void setRfSwitchPins(uint32_t rxEn, uint32_t txEn); + + /*! \copydoc Module::setRfSwitchTable */ + void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]); + + /*! + \brief Get one truly random byte from RSSI noise. + \returns TRNG byte. + */ + uint8_t randomByte(); + + /*! + \brief Read version SPI register. Should return RF69_CHIP_VERSION (0x24) if SX127x is connected and working. + \returns Version register contents or \ref status_codes + */ + int16_t getChipVersion(); + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + /*! + \brief Set interrupt service routine function to call when data bit is received in direct mode. + \param func Pointer to interrupt service routine. + */ + void setDirectAction(void (*func)(void)); + + /*! + \brief Function to read and process data bit in direct reception mode. + \param pin Pin on which to read. + */ + void readBit(uint32_t pin); + #endif + + /*! + \brief Configure DIO pin mapping to get a given signal on a DIO pin (if available). + \param pin Pin number onto which a signal is to be placed. + \param value The value that indicates which function to place on that pin. See chip datasheet for details. + \returns \ref status_codes + */ + int16_t setDIOMapping(uint32_t pin, uint32_t value); + +#if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) + protected: +#endif + Module* mod; + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + + float frequency = RADIOLIB_RF69_DEFAULT_FREQ; + float bitRate = RADIOLIB_RF69_DEFAULT_BR; + float rxBandwidth = RADIOLIB_RF69_DEFAULT_RXBW; + bool ookEnabled = false; + int16_t tempOffset = 0; + int8_t power = RADIOLIB_RF69_DEFAULT_POWER; + + size_t packetLength = 0; + bool packetLengthQueried = false; + uint8_t packetLengthConfig = RADIOLIB_RF69_PACKET_FORMAT_VARIABLE; + + bool promiscuous = false; + + uint8_t syncWordLength = RADIOLIB_RF69_DEFAULT_SW_LEN; + + bool bitSync = true; + + int16_t config(); + int16_t directMode(); + int16_t setPacketMode(uint8_t mode, uint8_t len); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + int16_t setMode(uint8_t mode); + void clearIRQFlags(); + void clearFIFO(size_t count); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RFM2x/RFM22.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RFM2x/RFM22.h new file mode 100644 index 00000000..f1055a8d --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RFM2x/RFM22.h @@ -0,0 +1,20 @@ +#if !defined(_RADIOLIB_RFM22_H) +#define _RADIOLIB_RFM22_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_RFM2X) + +#include "../../Module.h" +#include "../Si443x/Si443x.h" +#include "../Si443x/Si4432.h" + +/*! + \class RFM22 + \brief Only exists as alias for Si4432, since there seems to be no difference between %RFM22 and %Si4432 modules. +*/ +RADIOLIB_TYPE_ALIAS(Si4432, RFM22); + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RFM2x/RFM23.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RFM2x/RFM23.h new file mode 100644 index 00000000..3fd33362 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/RFM2x/RFM23.h @@ -0,0 +1,20 @@ +#if !defined(_RADIOLIB_RFM23_H) +#define _RADIOLIB_RFM23_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_RFM2X) + +#include "../../Module.h" +#include "../Si443x/Si443x.h" +#include "../Si443x/Si4431.h" + +/*! + \class RFM23 + \brief Only exists as alias for Si4431, since there seems to be no difference between %RFM23 and %Si4431 modules. +*/ +RADIOLIB_TYPE_ALIAS(Si4431, RFM23); + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX1231/SX1231.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX1231/SX1231.cpp new file mode 100644 index 00000000..cc9e3409 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX1231/SX1231.cpp @@ -0,0 +1,91 @@ +#include "SX1231.h" +#if !defined(RADIOLIB_EXCLUDE_SX1231) + +SX1231::SX1231(Module* mod) : RF69(mod) { + +} + +int16_t SX1231::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + + // try to find the SX1231 chip + uint8_t i = 0; + bool flagFound = false; + while((i < 10) && !flagFound) { + int16_t version = getChipVersion(); + if((version == 0x21) || (version == 0x22) || (version == 0x23)) { + flagFound = true; + this->chipRevision = version; + } else { + RADIOLIB_DEBUG_PRINTLN("SX1231 not found! (%d of 10 tries) RF69_REG_VERSION == 0x%04X, expected 0x0021 / 0x0022 / 0x0023", i + 1, version); + this->mod->hal->delay(10); + i++; + } + } + + if(!flagFound) { + RADIOLIB_DEBUG_PRINTLN("No SX1231 found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + RADIOLIB_DEBUG_PRINTLN("M\tSX1231"); + + // configure settings not accessible by API + int16_t state = config(); + RADIOLIB_ASSERT(state); + RADIOLIB_DEBUG_PRINTLN("M\tRF69"); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + // configure bitrate + this->rxBandwidth = 125.0; + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + // configure default RX bandwidth + state = setRxBandwidth(rxBw); + RADIOLIB_ASSERT(state); + + // configure default frequency deviation + state = setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + // configure default TX output power + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + // configure default preamble length + state = setPreambleLength(preambleLen); + RADIOLIB_ASSERT(state); + + // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library + uint8_t syncWord[] = {0x2D, 0x01}; + state = setSyncWord(syncWord, 2); + RADIOLIB_ASSERT(state); + + // set default packet length mode + state = variablePacketLengthMode(); + if (state != RADIOLIB_ERR_NONE) { + return(state); + } + + // SX1231 V2a only + if(this->chipRevision == RADIOLIB_SX1231_CHIP_REVISION_2_A) { + // modify default OOK threshold value + state = this->mod->SPIsetRegValue(RADIOLIB_SX1231_REG_TEST_OOK, RADIOLIB_SX1231_OOK_DELTA_THRESHOLD); + RADIOLIB_ASSERT(state); + + // enable OCP with 95 mA limit + state = this->mod->SPIsetRegValue(RADIOLIB_RF69_REG_OCP, RADIOLIB_RF69_OCP_ON | RADIOLIB_RF69_OCP_TRIM, 4, 0); + RADIOLIB_ASSERT(state); + } + + return(RADIOLIB_ERR_NONE); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX1231/SX1231.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX1231/SX1231.h new file mode 100644 index 00000000..60540345 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX1231/SX1231.h @@ -0,0 +1,121 @@ +#if !defined(_RADIOLIB_SX1231_H) +#define _RADIOLIB_SX1231_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX1231) + +#include "../../Module.h" +#include "../RF69/RF69.h" + +#define RADIOLIB_SX1231_CHIP_REVISION_2_A 0x21 +#define RADIOLIB_SX1231_CHIP_REVISION_2_B 0x22 +#define RADIOLIB_SX1231_CHIP_REVISION_2_C 0x23 + +// RADIOLIB_SX1231 specific register map +#define RADIOLIB_SX1231_REG_TEST_OOK 0x6E + +// RADIOLIB_SX1231_REG_TEST_OOK +#define RADIOLIB_SX1231_OOK_DELTA_THRESHOLD 0x0C + +// RADIOLIB_SX1231_REG_DIO_MAPPING_1 +#define RADIOLIB_SX1231_DIO0_CONT_LOW_BAT 0b10000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_CONT_MODE_READY 0b11000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_CONT_PLL_LOCK 0b00000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_CONT_SYNC_ADDRESS 0b00000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_CONT_TIMEOUT 0b01000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_CONT_RSSI 0b10000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_CONT_MODE_READY 0b11000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_CONT_TX_READY 0b01000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_PACK_LOW_BAT 0b10000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_PACK_PLL_LOCK 0b11000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_PACK_CRC_OK 0b00000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_PACK_PAYLOAD_READY 0b01000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_PACK_SYNC_ADDRESS 0b10000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_PACK_RSSI 0b11000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_PACK_PACKET_SENT 0b00000000 // 7 6 +#define RADIOLIB_SX1231_DIO0_PACK_TX_READY 0b01000000 // 7 6 +#define RADIOLIB_SX1231_DIO1_CONT_LOW_BAT 0b00100000 // 5 4 +#define RADIOLIB_SX1231_DIO1_CONT_PLL_LOCK 0b00110000 // 5 4 +#define RADIOLIB_SX1231_DIO1_CONT_DCLK 0b00000000 // 5 4 +#define RADIOLIB_SX1231_DIO1_CONT_RX_READY 0b00010000 // 5 4 +#define RADIOLIB_SX1231_DIO1_CONT_SYNC_ADDRESS 0b00110000 // 5 4 +#define RADIOLIB_SX1231_DIO1_CONT_TX_READY 0b00010000 // 5 4 +#define RADIOLIB_SX1231_DIO1_PACK_FIFO_LEVEL 0b00000000 // 5 4 +#define RADIOLIB_SX1231_DIO1_PACK_FIFO_FULL 0b00010000 // 5 4 +#define RADIOLIB_SX1231_DIO1_PACK_FIFO_NOT_EMPTY 0b00100000 // 5 4 +#define RADIOLIB_SX1231_DIO1_PACK_PLL_LOCK 0b00110000 // 5 4 +#define RADIOLIB_SX1231_DIO1_PACK_TIMEOUT 0b00110000 // 5 4 +#define RADIOLIB_SX1231_DIO2_CONT_DATA 0b00000000 // 3 2 +#define RADIOLIB_SX1231_DIO2_PACK_FIFO_NOT_EMPTY 0b00000000 // 3 2 +#define RADIOLIB_SX1231_DIO2_PACK_LOW_BAT 0b00001000 // 3 2 +#define RADIOLIB_SX1231_DIO2_PACK_AUTO_MODE 0b00001100 // 3 2 +#define RADIOLIB_SX1231_DIO2_PACK_DATA 0b00000100 // 3 2 +#define RADIOLIB_SX1231_DIO3_CONT_AUTO_MODE 0b00000010 // 0 1 +#define RADIOLIB_SX1231_DIO3_CONT_RSSI 0b00000000 // 0 1 +#define RADIOLIB_SX1231_DIO3_CONT_RX_READY 0b00000001 // 0 1 +#define RADIOLIB_SX1231_DIO3_CONT_TIMEOUT 0b00000011 // 0 1 +#define RADIOLIB_SX1231_DIO3_CONT_TX_READY 0b00000001 // 0 1 +#define RADIOLIB_SX1231_DIO3_PACK_FIFO_FULL 0b00000000 // 0 1 +#define RADIOLIB_SX1231_DIO3_PACK_LOW_BAT 0b00000010 // 0 1 +#define RADIOLIB_SX1231_DIO3_PACK_PLL_LOCK 0b00000011 // 0 1 +#define RADIOLIB_SX1231_DIO3_PACK_RSSI 0b00000001 // 0 1 +#define RADIOLIB_SX1231_DIO3_PACK_SYNC_ADDRESSS 0b00000010 // 0 1 +#define RADIOLIB_SX1231_DIO3_PACK_TX_READY 0b00000001 // 0 1 + +// RADIOLIB_SX1231_REG_DIO_MAPPING_2 +#define RADIOLIB_SX1231_DIO4_CONT_LOW_BAT 0b10000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_CONT_PLL_LOCK 0b11000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_CONT_TIMEOUT 0b00000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_CONT_RX_READY 0b01000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_CONT_SYNC_ADDRESS 0b10000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_CONT_TX_READY 0b01000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_PACK_LOW_BAT 0b10000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_PACK_PLL_LOCK 0b11000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_PACK_TIMEOUT 0b00000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_PACK_RSSI 0b01000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_PACK_RX_READY 0b10000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_PACK_MODE_READY 0b00000000 // 7 6 +#define RADIOLIB_SX1231_DIO4_PACK_TX_READY 0b01000000 // 7 6 +#define RADIOLIB_SX1231_DIO5_CONT_LOW_BAT 0b00100000 // 5 4 +#define RADIOLIB_SX1231_DIO5_CONT_MODE_READY 0b00110000 // 5 4 +#define RADIOLIB_SX1231_DIO5_CONT_CLK_OUT 0b00000000 // 5 4 +#define RADIOLIB_SX1231_DIO5_CONT_RSSI 0b00010000 // 5 4 +#define RADIOLIB_SX1231_DIO5_PACK_LOW_BAT 0b00100000 // 5 4 +#define RADIOLIB_SX1231_DIO5_PACK_MODE_READY 0b00110000 // 5 4 +#define RADIOLIB_SX1231_DIO5_PACK_CLK_OUT 0b00000000 // 5 4 +#define RADIOLIB_SX1231_DIO5_PACK_DATA 0b00010000 // 5 4 + +/*! + \class SX1231 + \brief Control class for %SX1231 module. Overrides some methods from RF69 due to different register values. +*/ +class SX1231: public RF69 { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1231(Module* mod); + + /*! + \brief Initialization method. + \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. + \param br Bit rate to be used in kbps. Defaults to 4.8 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz Defaults to 5.0 kHz. + \param rxBw Receiver bandwidth in kHz. Defaults to 125.0 kHz. + \param power Output power in dBm. Defaults to 10 dBm. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint8_t preambleLen = 16); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + uint8_t chipRevision = 0; +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx.cpp new file mode 100644 index 00000000..f64b4933 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx.cpp @@ -0,0 +1,153 @@ +/* +Copyright (c) 2018 Jan Gromeš +Copyright (c) 2022 STMicroelectronics + +This file is licensed under the MIT License: https://opensource.org/licenses/MIT +*/ + +#include "STM32WLx.h" +#if !defined(RADIOLIB_EXCLUDE_STM32WLX) + +STM32WLx::STM32WLx(STM32WLx_Module* mod) : SX1262(mod) { } + +int16_t STM32WLx::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // Execute common part + int16_t state = SX1262::begin(freq, bw, sf, cr, syncWord, power, preambleLength, tcxoVoltage, useRegulatorLDO); + RADIOLIB_ASSERT(state); + + // This overrides the value in SX126x::begin() + // On STM32WL, DIO2 is hardwired to the radio IRQ on the MCU, so it + // should really not be used as RfSwitch control output. + state = setDio2AsRfSwitch(false); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t STM32WLx::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // Execute common part + int16_t state = SX1262::beginFSK(freq, br, freqDev, rxBw, power, preambleLength, tcxoVoltage, useRegulatorLDO); + RADIOLIB_ASSERT(state); + + // This overrides the value in SX126x::beginFSK() + // On STM32WL, DIO2 is hardwired to the radio IRQ on the MCU, so it + // should really not be used as RfSwitch control output. + state = setDio2AsRfSwitch(false); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t STM32WLx::setOutputPower(int8_t power) { + // get current OCP configuration + uint8_t ocp = 0; + int16_t state = readRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + RADIOLIB_ASSERT(state); + + // check the user did not request power output that is not possible + bool hp_supported = this->mod->findRfSwitchMode(MODE_TX_HP); + bool lp_supported = this->mod->findRfSwitchMode(MODE_TX_LP); + if((!lp_supported && (power < -9)) || (!hp_supported && (power > 14))) { + // LP not supported but requested power is below HP low bound or + // HP not supported but requested power is above LP high bound + return(RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } + + // set PA config based on which PAs are supported + bool use_hp = false; + if(hp_supported && lp_supported) { + // both PAs supported, use HP when above 14 dBm + if(power > 14) { + RADIOLIB_CHECK_RANGE(power, -9, 22, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + state = SX126x::setPaConfig(0x04, 0x00, 0x07); // HP output up to 22dBm + this->txMode = MODE_TX_HP; + use_hp = true; + } else { + RADIOLIB_CHECK_RANGE(power, -17, 14, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + state = SX126x::setPaConfig(0x04, 0x01, 0x00); // LP output up to 14dBm + this->txMode = MODE_TX_LP; + } + + } else if(!hp_supported && lp_supported) { + // only LP supported + RADIOLIB_CHECK_RANGE(power, -17, 14, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + state = SX126x::setPaConfig(0x04, 0x01, 0x00); + this->txMode = MODE_TX_LP; + + } else if(hp_supported && !lp_supported) { + // only HP supported + RADIOLIB_CHECK_RANGE(power, -9, 22, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + state = SX126x::setPaConfig(0x04, 0x00, 0x07); + this->txMode = MODE_TX_HP; + use_hp = true; + + } else { + // neither PA is supported + return(RADIOLIB_ERR_INVALID_OUTPUT_POWER); + + } + + // Apply workaround for HP only + state = SX126x::fixPaClamping(use_hp); + RADIOLIB_ASSERT(state); + + // set output power + /// \todo power ramp time configuration + state = SX126x::setTxParams(power); + RADIOLIB_ASSERT(state); + + // restore OCP configuration + return(writeRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); +} + +int16_t STM32WLx::clearIrqStatus(uint16_t clearIrqParams) { + int16_t res = SX126x::clearIrqStatus(clearIrqParams); + // The NVIC interrupt is level-sensitive, so clear away any pending + // flag that is only set because the radio IRQ status was not cleared + // in the interrupt (to prevent each IRQ triggering twice and allow + // reading the irq status through the pending flag). + SubGhz.clearPendingInterrupt(); + if(SubGhz.hasInterrupt()) + SubGhz.enableInterrupt(); + return(res); +} + +void STM32WLx::setDio1Action(void (*func)(void)) { + SubGhz.attachInterrupt([func]() { + // Because the interrupt is level-triggered, we disable it in the + // NVIC (otherwise we would need an SPI command to clear the IRQ in + // the radio, or it would trigger over and over again). + SubGhz.disableInterrupt(); + func(); + }); +} + +void STM32WLx::clearDio1Action() { + SubGhz.detachInterrupt(); +} + +void STM32WLx::setPacketReceivedAction(void (*func)(void)) { + this->setDio1Action(func); +} + +void STM32WLx::clearPacketReceivedAction() { + this->clearDio1Action(); +} + +void STM32WLx::setPacketSentAction(void (*func)(void)) { + this->setDio1Action(func); +} + +void STM32WLx::clearPacketSentAction() { + this->clearDio1Action(); +} + +void STM32WLx::setChannelScanAction(void (*func)(void)) { + this->setDio1Action(func); +} + +void STM32WLx::clearChannelScanAction() { + this->clearDio1Action(); +} + +#endif // !defined(RADIOLIB_EXCLUDE_STM32WLX) diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx.h new file mode 100644 index 00000000..cab2fc54 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx.h @@ -0,0 +1,168 @@ +/* +Copyright (c) 2018 Jan Gromeš +Copyright (c) 2022 STMicroelectronics + +This file is licensed under the MIT License: https://opensource.org/licenses/MIT +*/ + +#if !defined(_RADIOLIB_STM32WLx_H) +#define _RADIOLIB_STM32WLx_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_STM32WLX) + +#include "../../Module.h" +#include "SX1262.h" +#include "STM32WLx_Module.h" + +/*! + \class STM32WLx + + \brief Derived class for STM32WL modules. + + The radio integrated into these modules is essentially the same as the + Semtech %SX126x external radio chips, so most of the documentation for + those also applies here. + + One notable difference with the %SX126x radios is that this radio + essentially combines the %SX1261 and %SX1262 by integrating both the + low-power (LP) and high-power (HP) amplifier. See setOutputPower() and + setRfSwitchTable() for details on how this is handled. +*/ +class STM32WLx : public SX1262 { + // NOTE: This class could not be named STM32WL (or STM32WLxx), since + // those are macros defined by + // system/Drivers/CMSIS/Device/ST/STM32WLxxx/Include/stm32wlxx.h + public: + /*! + \brief Default constructor. + \param mod Instance of STM32WLx_Module that will be used to communicate with the radio. + */ + STM32WLx(STM32WLx_Module* mod); + + /*! + \brief Custom operation modes for STMWLx. + + This splits the TX mode into two modes: Low-power and high-power. + These constants can be used with the setRfSwitchTable() method, + instead of the Module::OpMode_t constants. + */ + enum OpMode_t { + /*! End of table marker, use \ref END_OF_MODE_TABLE constant instead */ + MODE_END_OF_TABLE = Module::MODE_END_OF_TABLE, + /*! Idle mode */ + MODE_IDLE = Module::MODE_IDLE, + /*! Receive mode */ + MODE_RX = Module::MODE_RX, + /*! Low power transmission mode */ + MODE_TX_LP = Module::MODE_TX, + /*! High power transmission mode */ + MODE_TX_HP, + }; + + // basic methods + + /*! + \copydoc SX1262::begin + */ + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX126X_SYNC_WORD_PRIVATE, int8_t power = 10, uint16_t preambleLength = 8, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); + + /*! + \copydoc SX1262::beginFSK + */ + int16_t beginFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 156.2, int8_t power = 10, uint16_t preambleLength = 16, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); + + // configuration methods + + /*! + \brief Sets output power. Allowed values are in range from -17 to 22 dBm. + + This automatically switches between the low-power (LP) and high-power (HP) amplifier. + + LP is preferred and supports -17 to +14dBm. When a higher power is + requested (or the LP amplifier is marked as unavailable using + setRfSwitchTable()), HP is used, which supports -9 to +22dBm. If the LP is marked as unavailable, + HP output will be used instead. + + \param power Output power to be set in dBm. + + \returns \ref status_codes + */ + virtual int16_t setOutputPower(int8_t power) override; + + /*! + \copybrief Module::setRfSwitchTable + + This method works like Module::setRfSwitchTable(), except that you + should use STM32WLx::OpMode_t constants for modes, which + distinguishes between a low-power (LP) and high-power (HP) TX mode. + + For boards that do not support both modes, just omit the + unsupported mode from the table and it will not be used (and the + valid power range is adjusted by setOutputPower() accordingly). + + Note that the setRfSwitchTable() method should be called *before* the + begin() method, to ensure the radio knows which modes are supported + during initialization. + */ + // Note: This explicitly inherits this method only to override docs + using SX126x::setRfSwitchTable; + + /*! + \brief Sets interrupt service routine to call when DIO1/2/3 activates. + \param func ISR to call. + */ + void setDio1Action(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when DIO1/2/3 activates. + */ + void clearDio1Action(); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + void clearPacketSentAction(); + + /*! + \brief Sets interrupt service routine to call when a channel scan is finished. + \param func ISR to call. + */ + void setChannelScanAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a channel scan is finished. + */ + void clearChannelScanAction(); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + virtual int16_t clearIrqStatus(uint16_t clearIrqParams) override; + +#if !defined(RADIOLIB_GODMODE) + private: +#endif +}; + +#endif // !defined(RADIOLIB_EXCLUDE_SX126X) + +#endif // _RADIOLIB_STM32WLX_MODULE_H diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx_Module.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx_Module.cpp new file mode 100644 index 00000000..1336325b --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx_Module.cpp @@ -0,0 +1,106 @@ +/* + +Copyright (c) 2022 STMicroelectronics + +This file is licensed under the MIT License: https://opensource.org/licenses/MIT +*/ + +#include "STM32WLx_Module.h" + +#if !defined(RADIOLIB_EXCLUDE_STM32WLX) + +#include "../../ArduinoHal.h" + +// This defines some dummy pin numbers (starting at NUM_DIGITAL_PINS to +// guarantee these are not valid regular pin numbers) that can be passed +// to the parent Module class, to be stored here and then passed back to +// the overridden callbacks when these are used. +enum { + RADIOLIB_STM32WLx_VIRTUAL_PIN_NSS = NUM_DIGITAL_PINS, + RADIOLIB_STM32WLx_VIRTUAL_PIN_BUSY, + RADIOLIB_STM32WLx_VIRTUAL_PIN_IRQ, + RADIOLIB_STM32WLx_VIRTUAL_PIN_RESET, +}; + +class Stm32wlxHal : public ArduinoHal { + public: + Stm32wlxHal(): ArduinoHal(SubGhz.SPI, SubGhz.spi_settings) {} + + void pinMode(uint32_t dwPin, uint32_t dwMode) { + switch(dwPin) { + case RADIOLIB_STM32WLx_VIRTUAL_PIN_NSS: + case RADIOLIB_STM32WLx_VIRTUAL_PIN_BUSY: + case RADIOLIB_STM32WLx_VIRTUAL_PIN_IRQ: + case RADIOLIB_STM32WLx_VIRTUAL_PIN_RESET: + // Nothing to do + break; + default: + ::pinMode(dwPin, dwMode); + break; + } + } + + void digitalWrite(uint32_t dwPin, uint32_t dwVal) { + switch (dwPin) { + case RADIOLIB_STM32WLx_VIRTUAL_PIN_NSS: + SubGhz.setNssActive(dwVal == LOW); + break; + + case RADIOLIB_STM32WLx_VIRTUAL_PIN_RESET: + SubGhz.setResetActive(dwVal == LOW); + break; + + case RADIOLIB_STM32WLx_VIRTUAL_PIN_BUSY: + case RADIOLIB_STM32WLx_VIRTUAL_PIN_IRQ: + // Should not (and cannot) be written, just ignore + break; + + default: + ::digitalWrite(dwPin, dwVal); + break; + } + } + + uint32_t digitalRead(uint32_t ulPin) { + switch (ulPin) { + case RADIOLIB_STM32WLx_VIRTUAL_PIN_BUSY: + return(SubGhz.isBusy() ? HIGH : LOW); + + case RADIOLIB_STM32WLx_VIRTUAL_PIN_IRQ: + // We cannot use the radio IRQ output directly, but since: + // - the pending flag will be set whenever the IRQ output is set, + // and + // - the pending flag will be cleared (by + // STM32WLx::clearIrqStatus()) whenever the radio IRQ output is + // cleared, + // the pending flag should always reflect the current radio IRQ + // output. There is one exception: when the ISR starts the pending + // flag is cleared by hardware and not set again until after the + // ISR finishes, so the value is incorrect *inside* the ISR, but + // running RadioLib code inside the ISR (especially code that + // polls the IRQ flag) is not supported and probably broken in + // other ways too. + return(SubGhz.isInterruptPending() ? HIGH : LOW); + + case RADIOLIB_STM32WLx_VIRTUAL_PIN_NSS: + return(SubGhz.isNssActive() ? LOW : HIGH); + + case RADIOLIB_STM32WLx_VIRTUAL_PIN_RESET: + return(SubGhz.isResetActive() ? LOW : HIGH); + + default: + return(::digitalRead(ulPin)); + } + } +}; + +STM32WLx_Module::STM32WLx_Module(): + Module( + new Stm32wlxHal, + RADIOLIB_STM32WLx_VIRTUAL_PIN_NSS, + RADIOLIB_STM32WLx_VIRTUAL_PIN_IRQ, + RADIOLIB_STM32WLx_VIRTUAL_PIN_RESET, + RADIOLIB_STM32WLx_VIRTUAL_PIN_BUSY + ) {} + +#endif // !defined(RADIOLIB_EXCLUDE_STM32WLX) diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx_Module.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx_Module.h new file mode 100644 index 00000000..f7d1d64d --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/STM32WLx_Module.h @@ -0,0 +1,38 @@ +/* + +Copyright (c) 2022 STMicroelectronics + +This file is licensed under the MIT License: https://opensource.org/licenses/MIT +*/ + +#if !defined(_RADIOLIB_STM32WLX_MODULE_H) +#define _RADIOLIB_STM32WLX_MODULE_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_STM32WLX) + +#include "../../Module.h" + +/*! + * \class STM32WLx_Module + * + * This is a subclass of Module to be used with the STM32WLx driver. + * + * It is used to override some callbacks, allowing access to some of the + * radio control signals that are wired to internal registers instead of + * actual GPIO pins. + */ +class STM32WLx_Module : public Module { + // Note: We cannot easily override any methods here, since most calls + // are non-virtual and made through a Module*, so they would not be + // calling any overridden methods. This means this class works by + // overriding some of the callbacks in its constructor. + + public: + STM32WLx_Module(); +}; + +#endif // !defined(RADIOLIB_EXCLUDE_STM32WLX) + +#endif // _RADIOLIB_STM32WLX_MODULE_H diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1261.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1261.cpp new file mode 100644 index 00000000..999f4f9f --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1261.cpp @@ -0,0 +1,29 @@ +#include "SX1261.h" +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +SX1261::SX1261(Module* mod): SX1262(mod) { + chipType = RADIOLIB_SX1261_CHIP_TYPE; +} + +int16_t SX1261::setOutputPower(int8_t power) { + RADIOLIB_CHECK_RANGE(power, -17, 14, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + + // get current OCP configuration + uint8_t ocp = 0; + int16_t state = readRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + RADIOLIB_ASSERT(state); + + // set PA config + state = SX126x::setPaConfig(0x04, RADIOLIB_SX126X_PA_CONFIG_SX1261, 0x00); + RADIOLIB_ASSERT(state); + + // set output power + /// \todo power ramp time configuration + state = SX126x::setTxParams(power); + RADIOLIB_ASSERT(state); + + // restore OCP configuration + return(writeRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1261.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1261.h new file mode 100644 index 00000000..8d7663e5 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1261.h @@ -0,0 +1,45 @@ +#if !defined(_RADIOLIB_SX1261_H) +#define _RADIOLIB_SX1261_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +#include "../../Module.h" +#include "SX126x.h" +#include "SX1262.h" + +//RADIOLIB_SX126X_CMD_SET_PA_CONFIG +#define RADIOLIB_SX126X_PA_CONFIG_SX1261 0x01 + +//RADIOLIB_SX126X_REG_VERSION_STRING +#define RADIOLIB_SX1261_CHIP_TYPE "SX1261" + +/*! + \class SX1261 + \brief Derived class for %SX1261 modules. +*/ +class SX1261 : public SX1262 { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1261(Module* mod); + + /*! + \brief Sets output power. Allowed values are in range from -17 to 14 dBm. + \param power Output power to be set in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1262.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1262.cpp new file mode 100644 index 00000000..baa27ae8 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1262.cpp @@ -0,0 +1,105 @@ +#include "SX1262.h" +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +SX1262::SX1262(Module* mod) : SX126x(mod) { + chipType = RADIOLIB_SX1262_CHIP_TYPE; +} + +int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // execute common part + int16_t state = SX126x::begin(cr, syncWord, preambleLength, tcxoVoltage, useRegulatorLDO); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = SX126x::fixPaClamping(); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1262::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // execute common part + int16_t state = SX126x::beginFSK(br, freqDev, rxBw, preambleLength, tcxoVoltage, useRegulatorLDO); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = SX126x::fixPaClamping(); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1262::setFrequency(float freq) { + return(setFrequency(freq, true)); +} + +int16_t SX1262::setFrequency(float freq, bool calibrate) { + RADIOLIB_CHECK_RANGE(freq, 150.0, 960.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // calibrate image + if(calibrate) { + uint8_t data[2]; + if(freq > 900.0) { + data[0] = RADIOLIB_SX126X_CAL_IMG_902_MHZ_1; + data[1] = RADIOLIB_SX126X_CAL_IMG_902_MHZ_2; + } else if(freq > 850.0) { + data[0] = RADIOLIB_SX126X_CAL_IMG_863_MHZ_1; + data[1] = RADIOLIB_SX126X_CAL_IMG_863_MHZ_2; + } else if(freq > 770.0) { + data[0] = RADIOLIB_SX126X_CAL_IMG_779_MHZ_1; + data[1] = RADIOLIB_SX126X_CAL_IMG_779_MHZ_2; + } else if(freq > 460.0) { + data[0] = RADIOLIB_SX126X_CAL_IMG_470_MHZ_1; + data[1] = RADIOLIB_SX126X_CAL_IMG_470_MHZ_2; + } else { + data[0] = RADIOLIB_SX126X_CAL_IMG_430_MHZ_1; + data[1] = RADIOLIB_SX126X_CAL_IMG_430_MHZ_2; + } + int16_t state = SX126x::calibrateImage(data); + RADIOLIB_ASSERT(state); + } + + // set frequency + return(SX126x::setFrequencyRaw(freq)); +} + +int16_t SX1262::setOutputPower(int8_t power) { + RADIOLIB_CHECK_RANGE(power, -9, 22, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + + // get current OCP configuration + uint8_t ocp = 0; + int16_t state = readRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + RADIOLIB_ASSERT(state); + + // set PA config + state = SX126x::setPaConfig(0x04, RADIOLIB_SX126X_PA_CONFIG_SX1262); + RADIOLIB_ASSERT(state); + + // set output power + /// \todo power ramp time configuration + state = SX126x::setTxParams(power); + RADIOLIB_ASSERT(state); + + // restore OCP configuration + return(writeRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1262.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1262.h new file mode 100644 index 00000000..d3b67ae5 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1262.h @@ -0,0 +1,98 @@ +#if !defined(_RADIOLIB_SX1262_H) +#define _RADIOLIB_SX1262_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +#include "../../Module.h" +#include "SX126x.h" + +//RADIOLIB_SX126X_CMD_SET_PA_CONFIG +#define RADIOLIB_SX126X_PA_CONFIG_SX1262 0x00 + +//RADIOLIB_SX126X_REG_VERSION_STRING +// Note: this should really be "2", however, it seems that all SX1262 devices report as SX1261 +#define RADIOLIB_SX1262_CHIP_TYPE "SX1261" + +/*! + \class SX1262 + \brief Derived class for %SX1262 modules. +*/ +class SX1262: public SX126x { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1262(Module* mod); + + // basic methods + + /*! + \brief Initialization method for LoRa modem. + \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. + \param bw LoRa bandwidth in kHz. Defaults to 125.0 kHz. + \param sf LoRa spreading factor. Defaults to 9. + \param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7). + \param syncWord 1-byte LoRa sync word. Defaults to RADIOLIB_SX126X_SYNC_WORD_PRIVATE (0x12). + \param power Output power in dBm. Defaults to 10 dBm. + \param preambleLength LoRa preamble length in symbols. Defaults to 8 symbols. + \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 1.6 V. + If you are seeing -706/-707 error codes, it likely means you are using non-0 value for module with XTAL. + To use XTAL, either set this value to 0, or set SX126x::XTAL to true. + \param useRegulatorLDO Whether to use only LDO regulator (true) or DC-DC regulator (false). Defaults to false. + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX126X_SYNC_WORD_PRIVATE, int8_t power = 10, uint16_t preambleLength = 8, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); + + /*! + \brief Initialization method for FSK modem. + \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. + \param br FSK bit rate in kbps. Defaults to 4.8 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz. Defaults to 5.0 kHz. + \param rxBw Receiver bandwidth in kHz. Defaults to 156.2 kHz. + \param power Output power in dBm. Defaults to 10 dBm. + \param preambleLength FSK preamble length in bits. Defaults to 16 bits. + \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 1.6 V. + If you are seeing -706/-707 error codes, it likely means you are using non-0 value for module with XTAL. + To use XTAL, either set this value to 0, or set SX126x::XTAL to true. + \param useRegulatorLDO Whether to use only LDO regulator (true) or DC-DC regulator (false). Defaults to false. + \returns \ref status_codes + */ + int16_t beginFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 156.2, int8_t power = 10, uint16_t preambleLength = 16, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets carrier frequency. Allowed values are in range from 150.0 to 960.0 MHz. + \param freq Carrier frequency to be set in MHz. + \param calibrate Run image calibration. + \returns \ref status_codes + */ + int16_t setFrequency(float freq, bool calibrate); + + /*! + \brief Sets output power. Allowed values are in range from -9 to 22 dBm. + This method is virtual to allow override from the SX1261 class. + \param power Output power to be set in dBm. + \returns \ref status_codes + */ + virtual int16_t setOutputPower(int8_t power); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1268.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1268.cpp new file mode 100644 index 00000000..a2f60f23 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1268.cpp @@ -0,0 +1,100 @@ +#include "SX1268.h" +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +SX1268::SX1268(Module* mod) : SX126x(mod) { + chipType = RADIOLIB_SX1268_CHIP_TYPE; +} + +int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // execute common part + int16_t state = SX126x::begin(cr, syncWord, preambleLength, tcxoVoltage, useRegulatorLDO); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = SX126x::fixPaClamping(); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1268::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // execute common part + int16_t state = SX126x::beginFSK(br, freqDev, rxBw, preambleLength, tcxoVoltage, useRegulatorLDO); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = SX126x::fixPaClamping(); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1268::setFrequency(float freq) { + return(setFrequency(freq, true)); +} + +/// \todo integers only (all modules - frequency, data rate, bandwidth etc.) +int16_t SX1268::setFrequency(float freq, bool calibrate) { + RADIOLIB_CHECK_RANGE(freq, 410.0, 810.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // calibrate image + if(calibrate) { + uint8_t data[2]; + if(freq > 770.0) { + data[0] = RADIOLIB_SX126X_CAL_IMG_779_MHZ_1; + data[1] = RADIOLIB_SX126X_CAL_IMG_779_MHZ_2; + } else if(freq > 460.0) { + data[0] = RADIOLIB_SX126X_CAL_IMG_470_MHZ_1; + data[1] = RADIOLIB_SX126X_CAL_IMG_470_MHZ_2; + } else { + data[0] = RADIOLIB_SX126X_CAL_IMG_430_MHZ_1; + data[1] = RADIOLIB_SX126X_CAL_IMG_430_MHZ_2; + } + int16_t state = SX126x::calibrateImage(data); + RADIOLIB_ASSERT(state); + } + + // set frequency + return(SX126x::setFrequencyRaw(freq)); +} + +int16_t SX1268::setOutputPower(int8_t power) { + RADIOLIB_CHECK_RANGE(power, -9, 22, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + + // get current OCP configuration + uint8_t ocp = 0; + int16_t state = readRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + RADIOLIB_ASSERT(state); + + // set PA config + state = SX126x::setPaConfig(0x04, RADIOLIB_SX126X_PA_CONFIG_SX1268); + RADIOLIB_ASSERT(state); + + // set output power + /// \todo power ramp time configuration + state = SX126x::setTxParams(power); + RADIOLIB_ASSERT(state); + + // restore OCP configuration + return(writeRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1268.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1268.h new file mode 100644 index 00000000..c3e2a607 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX1268.h @@ -0,0 +1,96 @@ +#if !defined(_RADIOLIB_SX1268_H) +#define _RADIOLIB_SX1268_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +#include "../../Module.h" +#include "SX126x.h" + +//RADIOLIB_SX126X_CMD_SET_PA_CONFIG +#define RADIOLIB_SX126X_PA_CONFIG_SX1268 0x00 + +//RADIOLIB_SX126X_REG_VERSION_STRING +#define RADIOLIB_SX1268_CHIP_TYPE "SX1268" + +/*! + \class SX1268 + \brief Derived class for %SX1268 modules. +*/ +class SX1268: public SX126x { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1268(Module* mod); + + // basic methods + + /*! + \brief Initialization method for LoRa modem. + \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. + \param bw LoRa bandwidth in kHz. Defaults to 125.0 kHz. + \param sf LoRa spreading factor. Defaults to 9. + \param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7). + \param syncWord 1-byte LoRa sync word. Defaults to RADIOLIB_SX126X_SYNC_WORD_PRIVATE (0x12). + \param power Output power in dBm. Defaults to 10 dBm. + \param preambleLength LoRa preamble length in symbols. Defaults to 8 symbols. + \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 1.6 V. + If you are seeing -706/-707 error codes, it likely means you are using non-0 value for module with XTAL. + To use XTAL, either set this value to 0, or set SX126x::XTAL to true. + \param useRegulatorLDO Whether to use only LDO regulator (true) or DC-DC regulator (false). Defaults to false. + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX126X_SYNC_WORD_PRIVATE, int8_t power = 10, uint16_t preambleLength = 8, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); + + /*! + \brief Initialization method for FSK modem. + \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. + \param br FSK bit rate in kbps. Defaults to 4.8 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz. Defaults to 5.0 kHz. + \param rxBw Receiver bandwidth in kHz. Defaults to 156.2 kHz. + \param power Output power in dBm. Defaults to 10 dBm. + \param preambleLength FSK preamble length in bits. Defaults to 16 bits. + \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 1.6 V. + If you are seeing -706/-707 error codes, it likely means you are using non-0 value for module with XTAL. + To use XTAL, either set this value to 0, or set SX126x::XTAL to true. + \param useRegulatorLDO Whether to use only LDO regulator (true) or DC-DC regulator (false). Defaults to false. + \returns \ref status_codes + */ + int16_t beginFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 156.2, int8_t power = 10, uint16_t preambleLength = 16, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values are in range from 410.0 to 810.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets carrier frequency. Allowed values are in range from 410.0 to 810.0 MHz. + \param freq Carrier frequency to be set in MHz. + \param calibrate Run image calibration. + \returns \ref status_codes + */ + int16_t setFrequency(float freq, bool calibrate); + + /*! + \brief Sets output power. Allowed values are in range from -9 to 22 dBm. + \param power Output power to be set in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX126x.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX126x.cpp new file mode 100644 index 00000000..7c6f8baa --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX126x.cpp @@ -0,0 +1,2137 @@ +#include "SX126x.h" +#include +#include +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +SX126x::SX126x(Module* mod) : PhysicalLayer(RADIOLIB_SX126X_FREQUENCY_STEP_SIZE, RADIOLIB_SX126X_MAX_PACKET_LENGTH) { + this->mod = mod; + this->XTAL = false; +} + +Module* SX126x::getMod() { + return(this->mod); +} + +int16_t SX126x::begin(uint8_t cr, uint8_t syncWord, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + this->mod->SPIreadCommand = RADIOLIB_SX126X_CMD_READ_REGISTER; + this->mod->SPIwriteCommand = RADIOLIB_SX126X_CMD_WRITE_REGISTER; + this->mod->SPInopCommand = RADIOLIB_SX126X_CMD_NOP; + this->mod->SPIstatusCommand = RADIOLIB_SX126X_CMD_GET_STATUS; + this->mod->SPIstreamType = true; + this->mod->SPIparseStatusCb = SPIparseStatus; + + // try to find the SX126x chip + if(!SX126x::findChip(this->chipType)) { + RADIOLIB_DEBUG_PRINTLN("No SX126x found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + RADIOLIB_DEBUG_PRINTLN("M\tSX126x"); + + // BW in kHz and SF are required in order to calculate LDRO for setModulationParams + // set the defaults, this will get overwritten later anyway + this->bandwidthKhz = 500.0; + this->spreadingFactor = 9; + + // initialize configuration variables (will be overwritten during public settings configuration) + this->bandwidth = RADIOLIB_SX126X_LORA_BW_500_0; // initialized to 500 kHz, since lower valeus will interfere with LLCC68 + this->codingRate = RADIOLIB_SX126X_LORA_CR_4_7; + this->ldrOptimize = 0x00; + this->crcTypeLoRa = RADIOLIB_SX126X_LORA_CRC_ON; + this->preambleLengthLoRa = preambleLength; + this->tcxoDelay = 0; + this->headerType = RADIOLIB_SX126X_LORA_HEADER_EXPLICIT; + this->implicitLen = 0xFF; + + // reset the module and verify startup + int16_t state = reset(); + RADIOLIB_ASSERT(state); + + // set mode to standby + state = standby(); + RADIOLIB_ASSERT(state); + + // set TCXO control, if requested + if(!this->XTAL && tcxoVoltage > 0.0) { + state = setTCXO(tcxoVoltage); + RADIOLIB_ASSERT(state); + } + + // configure settings not accessible by API + state = config(RADIOLIB_SX126X_PACKET_TYPE_LORA); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setSyncWord(syncWord); + RADIOLIB_ASSERT(state); + + state = setPreambleLength(preambleLength); + RADIOLIB_ASSERT(state); + + if (useRegulatorLDO) { + state = setRegulatorLDO(); + } else { + state = setRegulatorDCDC(); + } + + // set publicly accessible settings that are not a part of begin method + state = setCurrentLimit(60.0); + RADIOLIB_ASSERT(state); + + state = setDio2AsRfSwitch(true); + RADIOLIB_ASSERT(state); + + state = setCRC(2); + RADIOLIB_ASSERT(state); + + state = invertIQ(false); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + this->mod->SPIreadCommand = RADIOLIB_SX126X_CMD_READ_REGISTER; + this->mod->SPIwriteCommand = RADIOLIB_SX126X_CMD_WRITE_REGISTER; + this->mod->SPInopCommand = RADIOLIB_SX126X_CMD_NOP; + this->mod->SPIstatusCommand = RADIOLIB_SX126X_CMD_GET_STATUS; + this->mod->SPIstreamType = true; + this->mod->SPIparseStatusCb = SPIparseStatus; + + // try to find the SX126x chip + if(!SX126x::findChip(this->chipType)) { + RADIOLIB_DEBUG_PRINTLN("No SX126x found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + RADIOLIB_DEBUG_PRINTLN("M\tSX126x"); + + // initialize configuration variables (will be overwritten during public settings configuration) + this->bitRate = 21333; // 48.0 kbps + this->frequencyDev = 52428; // 50.0 kHz + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_156_2; + this->rxBandwidthKhz = 156.2; + this->pulseShape = RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_5; + this->crcTypeFSK = RADIOLIB_SX126X_GFSK_CRC_2_BYTE_INV; // CCIT CRC configuration + this->preambleLengthFSK = preambleLength; + this->addrComp = RADIOLIB_SX126X_GFSK_ADDRESS_FILT_OFF; + + // reset the module and verify startup + int16_t state = reset(); + RADIOLIB_ASSERT(state); + + // set mode to standby + state = standby(); + RADIOLIB_ASSERT(state); + + // set TCXO control, if requested + if(!this->XTAL && tcxoVoltage > 0.0) { + state = setTCXO(tcxoVoltage); + RADIOLIB_ASSERT(state); + } + + // configure settings not accessible by API + state = config(RADIOLIB_SX126X_PACKET_TYPE_GFSK); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + state = setRxBandwidth(rxBw); + RADIOLIB_ASSERT(state); + + state = setCurrentLimit(60.0); + RADIOLIB_ASSERT(state); + + state = setPreambleLength(preambleLength); + RADIOLIB_ASSERT(state); + + if(useRegulatorLDO) { + state = setRegulatorLDO(); + } else { + state = setRegulatorDCDC(); + } + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + uint8_t sync[] = {0x12, 0xAD}; + state = setSyncWord(sync, 2); + RADIOLIB_ASSERT(state); + + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + + state = setEncoding(RADIOLIB_ENCODING_NRZ); + RADIOLIB_ASSERT(state); + + state = variablePacketLengthMode(RADIOLIB_SX126X_MAX_PACKET_LENGTH); + RADIOLIB_ASSERT(state); + + state = setCRC(2); + RADIOLIB_ASSERT(state); + + state = setDio2AsRfSwitch(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX126x::reset(bool verify) { + // run the reset sequence + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + this->mod->hal->delay(1); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + + // return immediately when verification is disabled + if(!verify) { + return(RADIOLIB_ERR_NONE); + } + + // set mode to standby - SX126x often refuses first few commands after reset + uint32_t start = this->mod->hal->millis(); + while(true) { + // try to set mode to standby + int16_t state = standby(); + if(state == RADIOLIB_ERR_NONE) { + // standby command successful + return(RADIOLIB_ERR_NONE); + } + + // standby command failed, check timeout and try again + if(this->mod->hal->millis() - start >= 1000) { + // timed out, possibly incorrect wiring + return(state); + } + + // wait a bit to not spam the module + this->mod->hal->delay(10); + } +} + +int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // check packet length + if(len > RADIOLIB_SX126X_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + uint32_t timeout = 0; + + // get currently active modem + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + // calculate timeout (150% of expected time-on-air) + timeout = (getTimeOnAir(len) * 3) / 2; + + } else if(modem == RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + // calculate timeout (500% of expected time-on-air) + timeout = getTimeOnAir(len) * 5; + + } else { + return(RADIOLIB_ERR_UNKNOWN); + } + + RADIOLIB_DEBUG_PRINTLN("Timeout in %lu us", timeout); + + // start transmission + state = startTransmit(data, len, addr); + RADIOLIB_ASSERT(state); + + // wait for packet transmission or timeout + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + if(this->mod->hal->micros() - start > timeout) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + uint32_t elapsed = this->mod->hal->micros() - start; + + // update data rate + this->dataRateMeasured = (len*8.0)/((float)elapsed/1000000.0); + + return(finishTransmit()); +} + +int16_t SX126x::receive(uint8_t* data, size_t len) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + uint32_t timeout = 0; + + // get currently active modem + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + // calculate timeout (100 LoRa symbols, the default for SX127x series) + float symbolLength = (float)(uint32_t(1) << this->spreadingFactor) / (float)this->bandwidthKhz; + timeout = (uint32_t)(symbolLength * 100.0 * 1000.0); + } else if(modem == RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + // calculate timeout (500 % of expected time-one-air) + size_t maxLen = len; + if(len == 0) { + maxLen = 0xFF; + } + float brBps = ((float)(RADIOLIB_SX126X_CRYSTAL_FREQ) * 1000000.0 * 32.0) / (float)this->bitRate; + timeout = (uint32_t)(((maxLen * 8.0) / brBps) * 1000000.0 * 5.0); + + } else { + return(RADIOLIB_ERR_UNKNOWN); + } + + RADIOLIB_DEBUG_PRINTLN("Timeout in %lu us", timeout); + + // start reception + uint32_t timeoutValue = (uint32_t)((float)timeout / 15.625); + state = startReceive(timeoutValue); + RADIOLIB_ASSERT(state); + + // wait for packet reception or timeout + bool softTimeout = false; + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + // safety check, the timeout should be done by the radio + if(this->mod->hal->micros() - start > timeout) { + softTimeout = true; + break; + } + } + + // if it was a timeout, this will return an error code + state = standby(); + if((state != RADIOLIB_ERR_NONE) && (state != RADIOLIB_ERR_SPI_CMD_TIMEOUT)) { + return(state); + } + + // check whether this was a timeout or not + if((getIrqStatus() & RADIOLIB_SX126X_IRQ_TIMEOUT) || softTimeout) { + standby(); + fixImplicitTimeout(); + clearIrqStatus(); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + + // fix timeout in implicit LoRa mode + if(((this->headerType == RADIOLIB_SX126X_LORA_HEADER_IMPLICIT) && (getPacketType() == RADIOLIB_SX126X_PACKET_TYPE_LORA))) { + state = fixImplicitTimeout(); + RADIOLIB_ASSERT(state); + } + + // read the received data + return(readData(data, len)); +} + +int16_t SX126x::transmitDirect(uint32_t frf) { + // set RF switch (if present) + this->mod->setRfSwitchState(this->txMode); + + // user requested to start transmitting immediately (required for RTTY) + int16_t state = RADIOLIB_ERR_NONE; + if(frf != 0) { + state = setRfFrequency(frf); + } + RADIOLIB_ASSERT(state); + + // start transmitting + uint8_t data[] = {RADIOLIB_SX126X_CMD_NOP}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_TX_CONTINUOUS_WAVE, data, 1)); +} + +int16_t SX126x::receiveDirect() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // SX126x is unable to output received data directly + return(RADIOLIB_ERR_UNKNOWN); +} + +int16_t SX126x::directMode() { + // check modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // disable DIO2 RF switch + state = setDio2AsRfSwitch(false); + RADIOLIB_ASSERT(state); + + // set DIO2 to clock output and DIO3 to data input + // this is done exclusively by writing magic values to even more magic registers + state = this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1, RADIOLIB_SX126X_TX_BITBANG_1_ENABLED, 6, 4); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0, RADIOLIB_SX126X_TX_BITBANG_0_ENABLED, 3, 0); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE, RADIOLIB_SX126X_DIO3_OUT_DISABLED, 3, 3); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_DIOX_IN_ENABLE, RADIOLIB_SX126X_DIO3_IN_ENABLED, 3, 3); + RADIOLIB_ASSERT(state); + + // enable TxDone interrupt + state = setDioIrqParams(RADIOLIB_SX126X_IRQ_TX_DONE, RADIOLIB_SX126X_IRQ_TX_DONE); + RADIOLIB_ASSERT(state); + + // set preamble length to the maximum to prevent SX126x from exiting Tx mode for a while + state = setPreambleLength(0xFFFF); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX126x::packetMode() { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set preamble length to the default + state = setPreambleLength(16); + RADIOLIB_ASSERT(state); + + // disable TxDone interrupt + state = setDioIrqParams(RADIOLIB_SX126X_IRQ_NONE, RADIOLIB_SX126X_IRQ_NONE); + RADIOLIB_ASSERT(state); + + // restore the magic registers + state = this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_DIOX_IN_ENABLE, RADIOLIB_SX126X_DIO3_IN_DISABLED, 3, 3); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE, RADIOLIB_SX126X_DIO3_OUT_ENABLED, 3, 3); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0, RADIOLIB_SX126X_TX_BITBANG_0_DISABLED, 3, 0); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1, RADIOLIB_SX126X_TX_BITBANG_1_DISABLED, 6, 4); + RADIOLIB_ASSERT(state); + + // enable DIO2 RF switch + state = setDio2AsRfSwitch(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX126x::scanChannel() { + return(this->scanChannel(RADIOLIB_SX126X_CAD_PARAM_DEFAULT, RADIOLIB_SX126X_CAD_PARAM_DEFAULT, RADIOLIB_SX126X_CAD_PARAM_DEFAULT)); +} + +int16_t SX126x::scanChannel(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin) { + // set mode to CAD + int state = startChannelScan(symbolNum, detPeak, detMin); + RADIOLIB_ASSERT(state); + + // wait for channel activity detected or timeout + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + } + + // check CAD result + return(getChannelScanResult()); +} + +int16_t SX126x::sleep(bool retainConfig) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + uint8_t sleepMode = RADIOLIB_SX126X_SLEEP_START_WARM | RADIOLIB_SX126X_SLEEP_RTC_OFF; + if(!retainConfig) { + sleepMode = RADIOLIB_SX126X_SLEEP_START_COLD | RADIOLIB_SX126X_SLEEP_RTC_OFF; + } + int16_t state = this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_SLEEP, &sleepMode, 1, false, false); + + // wait for SX126x to safely enter sleep mode + this->mod->hal->delay(1); + + return(state); +} + +int16_t SX126x::standby() { + return(SX126x::standby(RADIOLIB_SX126X_STANDBY_RC)); +} + +int16_t SX126x::standby(uint8_t mode, bool wakeup) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + if(wakeup) { + // pull NSS low to wake up + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelLow); + } + + uint8_t data[] = { mode }; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_STANDBY, data, 1)); +} + +void SX126x::setDio1Action(void (*func)(void)) { + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq()), func, this->mod->hal->GpioInterruptRising); +} + +void SX126x::clearDio1Action() { + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq())); +} + +void SX126x::setPacketReceivedAction(void (*func)(void)) { + this->setDio1Action(func); +} + +void SX126x::clearPacketReceivedAction() { + this->clearDio1Action(); +} + +void SX126x::setPacketSentAction(void (*func)(void)) { + this->setDio1Action(func); +} + +void SX126x::clearPacketSentAction() { + this->clearDio1Action(); +} + +void SX126x::setChannelScanAction(void (*func)(void)) { + this->setDio1Action(func); +} + +void SX126x::clearChannelScanAction() { + this->clearDio1Action(); +} + + +int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { + // suppress unused variable warning + (void)addr; + + // check packet length + if(len > RADIOLIB_SX126X_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // maximum packet length is decreased by 1 when address filtering is active + if((this->addrComp != RADIOLIB_SX126X_GFSK_ADDRESS_FILT_OFF) && (len > RADIOLIB_SX126X_MAX_PACKET_LENGTH - 1)) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set packet Length + int16_t state = RADIOLIB_ERR_NONE; + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + state = setPacketParams(this->preambleLengthLoRa, this->crcTypeLoRa, len, this->headerType, this->invertIQEnabled); + } else if(modem == RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType, len); + } else { + return(RADIOLIB_ERR_UNKNOWN); + } + RADIOLIB_ASSERT(state); + + // set DIO mapping + state = setDioIrqParams(RADIOLIB_SX126X_IRQ_TX_DONE | RADIOLIB_SX126X_IRQ_TIMEOUT, RADIOLIB_SX126X_IRQ_TX_DONE); + RADIOLIB_ASSERT(state); + + // set buffer pointers + state = setBufferBaseAddress(); + RADIOLIB_ASSERT(state); + + // write packet to buffer + state = writeBuffer(data, len); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + state = clearIrqStatus(); + RADIOLIB_ASSERT(state); + + // fix sensitivity + state = fixSensitivity(); + RADIOLIB_ASSERT(state); + + // set RF switch (if present) + this->mod->setRfSwitchState(this->txMode); + + // start transmission + state = setTx(RADIOLIB_SX126X_TX_TIMEOUT_NONE); + RADIOLIB_ASSERT(state); + + // wait for BUSY to go low (= PA ramp up done) + while(this->mod->hal->digitalRead(this->mod->getGpio())) { + this->mod->hal->yield(); + } + + return(state); +} + +int16_t SX126x::finishTransmit() { + // clear interrupt flags + clearIrqStatus(); + + // set mode to standby to disable transmitter/RF switch + return(standby()); +} + +int16_t SX126x::startReceive() { + return(this->startReceive(RADIOLIB_SX126X_RX_TIMEOUT_INF, RADIOLIB_SX126X_IRQ_RX_DEFAULT, RADIOLIB_SX126X_IRQ_RX_DONE, 0)); +} + +int16_t SX126x::startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len) { + (void)len; + int16_t state = startReceiveCommon(timeout, irqFlags, irqMask); + RADIOLIB_ASSERT(state); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set mode to receive + state = setRx(timeout); + + return(state); +} + +int16_t SX126x::startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod, uint16_t irqFlags, uint16_t irqMask) { + // datasheet claims time to go to sleep is ~500us, same to wake up, compensate for that with 1 ms + TCXO delay + uint32_t transitionTime = this->tcxoDelay + 1000; + sleepPeriod -= transitionTime; + + // divide by 15.625 + uint32_t rxPeriodRaw = (rxPeriod * 8) / 125; + uint32_t sleepPeriodRaw = (sleepPeriod * 8) / 125; + + // check 24 bit limit and zero value (likely not intended) + if((rxPeriodRaw & 0xFF000000) || (rxPeriodRaw == 0)) { + return(RADIOLIB_ERR_INVALID_RX_PERIOD); + } + + // this check of the high byte also catches underflow when we subtracted transitionTime + if((sleepPeriodRaw & 0xFF000000) || (sleepPeriodRaw == 0)) { + return(RADIOLIB_ERR_INVALID_SLEEP_PERIOD); + } + + int16_t state = startReceiveCommon(RADIOLIB_SX126X_RX_TIMEOUT_INF, irqFlags, irqMask); + RADIOLIB_ASSERT(state); + + uint8_t data[6] = {(uint8_t)((rxPeriodRaw >> 16) & 0xFF), (uint8_t)((rxPeriodRaw >> 8) & 0xFF), (uint8_t)(rxPeriodRaw & 0xFF), + (uint8_t)((sleepPeriodRaw >> 16) & 0xFF), (uint8_t)((sleepPeriodRaw >> 8) & 0xFF), (uint8_t)(sleepPeriodRaw & 0xFF)}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_RX_DUTY_CYCLE, data, 6)); +} + +int16_t SX126x::startReceiveDutyCycleAuto(uint16_t senderPreambleLength, uint16_t minSymbols, uint16_t irqFlags, uint16_t irqMask) { + if(senderPreambleLength == 0) { + senderPreambleLength = this->preambleLengthLoRa; + } + + // worst case is that the sender starts transmitting when we're just less than minSymbols from going back to sleep. + // in this case, we don't catch minSymbols before going to sleep, + // so we must be awake for at least that long before the sender stops transmitting. + uint16_t sleepSymbols = senderPreambleLength - 2 * minSymbols; + + // if we're not to sleep at all, just use the standard startReceive. + if(2 * minSymbols > senderPreambleLength) { + return(startReceive(RADIOLIB_SX126X_RX_TIMEOUT_INF, irqFlags, irqMask)); + } + + uint32_t symbolLength = ((uint32_t)(10 * 1000) << this->spreadingFactor) / (10 * this->bandwidthKhz); + uint32_t sleepPeriod = symbolLength * sleepSymbols; + RADIOLIB_DEBUG_PRINTLN("Auto sleep period: %lu", sleepPeriod); + + // when the unit detects a preamble, it starts a timer that will timeout if it doesn't receive a header in time. + // the duration is sleepPeriod + 2 * wakePeriod. + // The sleepPeriod doesn't take into account shutdown and startup time for the unit (~1ms) + // We need to ensure that the timeout is longer than senderPreambleLength. + // So we must satisfy: wakePeriod > (preamblePeriod - (sleepPeriod - 1000)) / 2. (A) + // we also need to ensure the unit is awake to see at least minSymbols. (B) + uint32_t wakePeriod = RADIOLIB_MAX( + (symbolLength * (senderPreambleLength + 1) - (sleepPeriod - 1000)) / 2, // (A) + symbolLength * (minSymbols + 1)); //(B) + RADIOLIB_DEBUG_PRINTLN("Auto wake period: %lu", wakePeriod); + + // If our sleep period is shorter than our transition time, just use the standard startReceive + if(sleepPeriod < this->tcxoDelay + 1016) { + return(startReceive(RADIOLIB_SX126X_RX_TIMEOUT_INF, irqFlags, irqMask)); + } + + return(startReceiveDutyCycle(wakePeriod, sleepPeriod, irqFlags, irqMask)); +} + +int16_t SX126x::startReceiveCommon(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask) { + // set DIO mapping + if(timeout != RADIOLIB_SX126X_RX_TIMEOUT_INF) { + irqMask |= RADIOLIB_SX126X_IRQ_TIMEOUT; + } + int16_t state = setDioIrqParams(irqFlags, irqMask); + RADIOLIB_ASSERT(state); + + // set buffer pointers + state = setBufferBaseAddress(); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + state = clearIrqStatus(); + + // restore original packet length + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + state = setPacketParams(this->preambleLengthLoRa, this->crcTypeLoRa, this->implicitLen, this->headerType, this->invertIQEnabled); + } else if(modem == RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType); + } else { + return(RADIOLIB_ERR_UNKNOWN); + } + + return(state); +} + +int16_t SX126x::readData(uint8_t* data, size_t len) { + // this method may get called from receive() after Rx timeout + // if that's the case, the first call will return "SPI command timeout error" + // check the IRQ to be sure this really originated from timeout event + int16_t state = this->mod->SPIcheckStream(); + if((state == RADIOLIB_ERR_SPI_CMD_TIMEOUT) && (getIrqStatus() & RADIOLIB_SX126X_IRQ_TIMEOUT)) { + // this is definitely Rx timeout + return(RADIOLIB_ERR_RX_TIMEOUT); + } + RADIOLIB_ASSERT(state); + + // check integrity CRC + uint16_t irq = getIrqStatus(); + int16_t crcState = RADIOLIB_ERR_NONE; + if((irq & RADIOLIB_SX126X_IRQ_CRC_ERR) || (irq & RADIOLIB_SX126X_IRQ_HEADER_ERR)) { + crcState = RADIOLIB_ERR_CRC_MISMATCH; + } + + // get packet length + size_t length = getPacketLength(); + if((len != 0) && (len < length)) { + // user requested less data than we got, only return what was requested + length = len; + } + + // read packet data + state = readBuffer(data, length); + RADIOLIB_ASSERT(state); + + // reset the base addresses + state = setBufferBaseAddress(); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + state = clearIrqStatus(); + + // check if CRC failed - this is done after reading data to give user the option to keep them + RADIOLIB_ASSERT(crcState); + + return(state); +} + +int16_t SX126x::startChannelScan() { + return(this->startChannelScan(RADIOLIB_SX126X_CAD_PARAM_DEFAULT, RADIOLIB_SX126X_CAD_PARAM_DEFAULT, RADIOLIB_SX126X_CAD_PARAM_DEFAULT)); +} + +int16_t SX126x::startChannelScan(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set DIO pin mapping + state = setDioIrqParams(RADIOLIB_SX126X_IRQ_CAD_DETECTED | RADIOLIB_SX126X_IRQ_CAD_DONE, RADIOLIB_SX126X_IRQ_CAD_DETECTED | RADIOLIB_SX126X_IRQ_CAD_DONE); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + state = clearIrqStatus(); + RADIOLIB_ASSERT(state); + + // set mode to CAD + state = setCad(symbolNum, detPeak, detMin); + return(state); +} + +int16_t SX126x::getChannelScanResult() { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // check CAD result + uint16_t cadResult = getIrqStatus(); + if(cadResult & RADIOLIB_SX126X_IRQ_CAD_DETECTED) { + // detected some LoRa activity + return(RADIOLIB_LORA_DETECTED); + } else if(cadResult & RADIOLIB_SX126X_IRQ_CAD_DONE) { + // channel is free + return(RADIOLIB_CHANNEL_FREE); + } + + return(RADIOLIB_ERR_UNKNOWN); +} + +int16_t SX126x::setBandwidth(float bw) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // ensure byte conversion doesn't overflow + RADIOLIB_CHECK_RANGE(bw, 0.0, 510.0, RADIOLIB_ERR_INVALID_BANDWIDTH); + + // check allowed bandwidth values + uint8_t bw_div2 = bw / 2 + 0.01; + switch (bw_div2) { + case 3: // 7.8: + this->bandwidth = RADIOLIB_SX126X_LORA_BW_7_8; + break; + case 5: // 10.4: + this->bandwidth = RADIOLIB_SX126X_LORA_BW_10_4; + break; + case 7: // 15.6: + this->bandwidth = RADIOLIB_SX126X_LORA_BW_15_6; + break; + case 10: // 20.8: + this->bandwidth = RADIOLIB_SX126X_LORA_BW_20_8; + break; + case 15: // 31.25: + this->bandwidth = RADIOLIB_SX126X_LORA_BW_31_25; + break; + case 20: // 41.7: + this->bandwidth = RADIOLIB_SX126X_LORA_BW_41_7; + break; + case 31: // 62.5: + this->bandwidth = RADIOLIB_SX126X_LORA_BW_62_5; + break; + case 62: // 125.0: + this->bandwidth = RADIOLIB_SX126X_LORA_BW_125_0; + break; + case 125: // 250.0 + this->bandwidth = RADIOLIB_SX126X_LORA_BW_250_0; + break; + case 250: // 500.0 + this->bandwidth = RADIOLIB_SX126X_LORA_BW_500_0; + break; + default: + return(RADIOLIB_ERR_INVALID_BANDWIDTH); + } + + // update modulation parameters + this->bandwidthKhz = bw; + return(setModulationParams(this->spreadingFactor, this->bandwidth, this->codingRate, this->ldrOptimize)); +} + +int16_t SX126x::setSpreadingFactor(uint8_t sf) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + RADIOLIB_CHECK_RANGE(sf, 5, 12, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + + // update modulation parameters + this->spreadingFactor = sf; + return(setModulationParams(this->spreadingFactor, this->bandwidth, this->codingRate, this->ldrOptimize)); +} + +int16_t SX126x::setCodingRate(uint8_t cr) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + RADIOLIB_CHECK_RANGE(cr, 5, 8, RADIOLIB_ERR_INVALID_CODING_RATE); + + // update modulation parameters + this->codingRate = cr - 4; + return(setModulationParams(this->spreadingFactor, this->bandwidth, this->codingRate, this->ldrOptimize)); +} + +int16_t SX126x::setSyncWord(uint8_t syncWord, uint8_t controlBits) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // update register + uint8_t data[2] = {(uint8_t)((syncWord & 0xF0) | ((controlBits & 0xF0) >> 4)), (uint8_t)(((syncWord & 0x0F) << 4) | (controlBits & 0x0F))}; + return(writeRegister(RADIOLIB_SX126X_REG_LORA_SYNC_WORD_MSB, data, 2)); +} + +int16_t SX126x::setCurrentLimit(float currentLimit) { + // check allowed range + if(!((currentLimit >= 0) && (currentLimit <= 140))) { + return(RADIOLIB_ERR_INVALID_CURRENT_LIMIT); + } + + // calculate raw value + uint8_t rawLimit = (uint8_t)(currentLimit / 2.5); + + // update register + return(writeRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &rawLimit, 1)); +} + +float SX126x::getCurrentLimit() { + // get the raw value + uint8_t ocp = 0; + readRegister(RADIOLIB_SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + + // return the actual value + return((float)ocp * 2.5); +} + +int16_t SX126x::setPreambleLength(size_t preambleLength) { + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + this->preambleLengthLoRa = preambleLength; + return(setPacketParams(this->preambleLengthLoRa, this->crcTypeLoRa, this->implicitLen, this->headerType, this->invertIQEnabled)); + } else if(modem == RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + this->preambleLengthFSK = preambleLength; + return(setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType)); + } + + return(RADIOLIB_ERR_UNKNOWN); +} + +int16_t SX126x::setFrequencyDeviation(float freqDev) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set frequency deviation to lowest available setting (required for digimodes) + float newFreqDev = freqDev; + if(freqDev < 0.0) { + newFreqDev = 0.6; + } + + RADIOLIB_CHECK_RANGE(newFreqDev, 0.6, 200.0, RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + + // calculate raw frequency deviation value + uint32_t freqDevRaw = (uint32_t)(((newFreqDev * 1000.0) * (float)((uint32_t)(1) << 25)) / (RADIOLIB_SX126X_CRYSTAL_FREQ * 1000000.0)); + + // check modulation parameters + this->frequencyDev = freqDevRaw; + + // update modulation parameters + return(setModulationParamsFSK(this->bitRate, this->pulseShape, this->rxBandwidth, this->frequencyDev)); +} + +int16_t SX126x::setBitRate(float br) { + // check active modem + uint8_t modem = getPacketType(); + if((modem != RADIOLIB_SX126X_PACKET_TYPE_GFSK) && (modem != RADIOLIB_SX126X_PACKET_TYPE_LR_FHSS)) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + if(modem != RADIOLIB_SX126X_PACKET_TYPE_LR_FHSS) { + RADIOLIB_CHECK_RANGE(br, 0.6, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE); + } + + // calculate raw bit rate value + uint32_t brRaw = (uint32_t)((RADIOLIB_SX126X_CRYSTAL_FREQ * 1000000.0 * 32.0) / (br * 1000.0)); + + // check modulation parameters + this->bitRate = brRaw; + + // update modulation parameters + return(setModulationParamsFSK(this->bitRate, this->pulseShape, this->rxBandwidth, this->frequencyDev)); +} + +int16_t SX126x::setDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + uint8_t modem = this->getPacketType(); + if(modem == RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + // set the bit rate + state = this->setBitRate(dr.fsk.bitRate); + RADIOLIB_ASSERT(state); + + // set the frequency deviation + state = this->setFrequencyDeviation(dr.fsk.freqDev); + + } else if(modem == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + // set the spreading factor + state = this->setSpreadingFactor(dr.lora.spreadingFactor); + RADIOLIB_ASSERT(state); + + // set the bandwidth + state = this->setBandwidth(dr.lora.bandwidth); + RADIOLIB_ASSERT(state); + + // set the coding rate + state = this->setCodingRate(dr.lora.codingRate); + } + + return(state); +} + +int16_t SX126x::setRxBandwidth(float rxBw) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // check modulation parameters + /*if(2 * this->frequencyDev + this->bitRate > rxBw * 1000.0) { + return(RADIOLIB_ERR_INVALID_MODULATION_PARAMETERS); + }*/ + this->rxBandwidthKhz = rxBw; + + // check allowed receiver bandwidth values + if(fabs(rxBw - 4.8) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_4_8; + } else if(fabs(rxBw - 5.8) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_5_8; + } else if(fabs(rxBw - 7.3) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_7_3; + } else if(fabs(rxBw - 9.7) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_9_7; + } else if(fabs(rxBw - 11.7) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_11_7; + } else if(fabs(rxBw - 14.6) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_14_6; + } else if(fabs(rxBw - 19.5) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_19_5; + } else if(fabs(rxBw - 23.4) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_23_4; + } else if(fabs(rxBw - 29.3) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_29_3; + } else if(fabs(rxBw - 39.0) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_39_0; + } else if(fabs(rxBw - 46.9) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_46_9; + } else if(fabs(rxBw - 58.6) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_58_6; + } else if(fabs(rxBw - 78.2) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_78_2; + } else if(fabs(rxBw - 93.8) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_93_8; + } else if(fabs(rxBw - 117.3) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_117_3; + } else if(fabs(rxBw - 156.2) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_156_2; + } else if(fabs(rxBw - 187.2) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_187_2; + } else if(fabs(rxBw - 234.3) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_234_3; + } else if(fabs(rxBw - 312.0) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_312_0; + } else if(fabs(rxBw - 373.6) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_373_6; + } else if(fabs(rxBw - 467.0) <= 0.001) { + this->rxBandwidth = RADIOLIB_SX126X_GFSK_RX_BW_467_0; + } else { + return(RADIOLIB_ERR_INVALID_RX_BANDWIDTH); + } + + // update modulation parameters + return(setModulationParamsFSK(this->bitRate, this->pulseShape, this->rxBandwidth, this->frequencyDev)); +} + +int16_t SX126x::setRxBoostedGainMode(bool rxbgm, bool persist) { + // read the current register value + uint8_t rxGain = 0; + int16_t state = readRegister(RADIOLIB_SX126X_REG_RX_GAIN, &rxGain, 1); + RADIOLIB_ASSERT(state); + + // gain mode register value (SX1261/2 datasheet v2.1 section 9.6) + if(rxbgm) { + rxGain = RADIOLIB_SX126X_RX_GAIN_BOOSTED; + } else { + rxGain = RADIOLIB_SX126X_RX_GAIN_POWER_SAVING; + } + + // update RX gain setting register + state = writeRegister(RADIOLIB_SX126X_REG_RX_GAIN, &rxGain, 1); + RADIOLIB_ASSERT(state); + + // add Rx Gain register to retention memory if requested + if(persist) { + // values and registers below are specified in SX126x datasheet v2.1 section 9.6, just below table 9-3 + uint8_t value0 = 0x01; + uint8_t value1 = 0x08; + uint8_t value2 = 0xAC; + + state = writeRegister(RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_0, &value0, 1); + RADIOLIB_ASSERT(state); + + state = writeRegister(RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_1, &value1, 1); + RADIOLIB_ASSERT(state); + + state = writeRegister(RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_2, &value2, 1); + RADIOLIB_ASSERT(state); + } + + return(state); +} + +int16_t SX126x::setDataShaping(uint8_t sh) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set data shaping + switch(sh) { + case RADIOLIB_SHAPING_NONE: + this->pulseShape = RADIOLIB_SX126X_GFSK_FILTER_NONE; + break; + case RADIOLIB_SHAPING_0_3: + this->pulseShape = RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_3; + break; + case RADIOLIB_SHAPING_0_5: + this->pulseShape = RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_5; + break; + case RADIOLIB_SHAPING_0_7: + this->pulseShape = RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_7; + break; + case RADIOLIB_SHAPING_1_0: + this->pulseShape = RADIOLIB_SX126X_GFSK_FILTER_GAUSS_1; + break; + default: + return(RADIOLIB_ERR_INVALID_DATA_SHAPING); + } + + // update modulation parameters + return(setModulationParamsFSK(this->bitRate, this->pulseShape, this->rxBandwidth, this->frequencyDev)); +} + +int16_t SX126x::setSyncWord(uint8_t* syncWord, size_t len) { + // check active modem + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + // check sync word Length + if(len > 8) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + + // write sync word + int16_t state = writeRegister(RADIOLIB_SX126X_REG_SYNC_WORD_0, syncWord, len); + RADIOLIB_ASSERT(state); + + // update packet parameters + this->syncWordLength = len * 8; + state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType); + + return(state); + + } else if(modem == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + // with length set to 1 and LoRa modem active, assume it is the LoRa sync word + if(len > 1) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + return(setSyncWord(syncWord[0])); + } + + return(RADIOLIB_ERR_WRONG_MODEM); +} + +int16_t SX126x::setSyncBits(uint8_t *syncWord, uint8_t bitsLen) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // check sync word Length + if(bitsLen > 0x40) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + + uint8_t bytesLen = bitsLen / 8; + if ((bitsLen % 8) != 0) { + bytesLen++; + } + + // write sync word + int16_t state = writeRegister(RADIOLIB_SX126X_REG_SYNC_WORD_0, syncWord, bytesLen); + RADIOLIB_ASSERT(state); + + // update packet parameters + this->syncWordLength = bitsLen; + state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType); + + return(state); +} + +int16_t SX126x::setNodeAddress(uint8_t nodeAddr) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // enable address filtering (node only) + this->addrComp = RADIOLIB_SX126X_GFSK_ADDRESS_FILT_NODE; + int16_t state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType); + RADIOLIB_ASSERT(state); + + // set node address + state = writeRegister(RADIOLIB_SX126X_REG_NODE_ADDRESS, &nodeAddr, 1); + + return(state); +} + +int16_t SX126x::setBroadcastAddress(uint8_t broadAddr) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // enable address filtering (node and broadcast) + this->addrComp = RADIOLIB_SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST; + int16_t state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType); + RADIOLIB_ASSERT(state); + + // set broadcast address + state = writeRegister(RADIOLIB_SX126X_REG_BROADCAST_ADDRESS, &broadAddr, 1); + + return(state); +} + +int16_t SX126x::disableAddressFiltering() { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // disable address filtering + this->addrComp = RADIOLIB_SX126X_GFSK_ADDRESS_FILT_OFF; + return(setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening)); +} + +int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool inverted) { + // check active modem + uint8_t modem = getPacketType(); + + if(modem == RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + // update packet parameters + switch(len) { + case 0: + this->crcTypeFSK = RADIOLIB_SX126X_GFSK_CRC_OFF; + break; + case 1: + if(inverted) { + this->crcTypeFSK = RADIOLIB_SX126X_GFSK_CRC_1_BYTE_INV; + } else { + this->crcTypeFSK = RADIOLIB_SX126X_GFSK_CRC_1_BYTE; + } + break; + case 2: + if(inverted) { + this->crcTypeFSK = RADIOLIB_SX126X_GFSK_CRC_2_BYTE_INV; + } else { + this->crcTypeFSK = RADIOLIB_SX126X_GFSK_CRC_2_BYTE; + } + break; + default: + return(RADIOLIB_ERR_INVALID_CRC_CONFIGURATION); + } + + int16_t state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType); + RADIOLIB_ASSERT(state); + + // write initial CRC value + uint8_t data[2] = {(uint8_t)((initial >> 8) & 0xFF), (uint8_t)(initial & 0xFF)}; + state = writeRegister(RADIOLIB_SX126X_REG_CRC_INITIAL_MSB, data, 2); + RADIOLIB_ASSERT(state); + + // write CRC polynomial value + data[0] = (uint8_t)((polynomial >> 8) & 0xFF); + data[1] = (uint8_t)(polynomial & 0xFF); + state = writeRegister(RADIOLIB_SX126X_REG_CRC_POLYNOMIAL_MSB, data, 2); + + return(state); + + } else if(modem == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + // LoRa CRC doesn't allow to set CRC polynomial, initial value, or inversion + + // update packet parameters + if(len) { + this->crcTypeLoRa = RADIOLIB_SX126X_LORA_CRC_ON; + } else { + this->crcTypeLoRa = RADIOLIB_SX126X_LORA_CRC_OFF; + } + + return(setPacketParams(this->preambleLengthLoRa, this->crcTypeLoRa, this->implicitLen, this->headerType, this->invertIQEnabled)); + } + + return(RADIOLIB_ERR_UNKNOWN); +} + +int16_t SX126x::setWhitening(bool enabled, uint16_t initial) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + int16_t state = RADIOLIB_ERR_NONE; + if(!enabled) { + // disable whitening + this->whitening = RADIOLIB_SX126X_GFSK_WHITENING_OFF; + + state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType); + RADIOLIB_ASSERT(state); + + } else { + // enable whitening + this->whitening = RADIOLIB_SX126X_GFSK_WHITENING_ON; + + // write initial whitening value + // as per note on pg. 65 of datasheet v1.2: "The user should not change the value of the 7 MSB's of this register" + uint8_t data[2]; + // first read the actual value and mask 7 MSB which we can not change + // if different value is written in 7 MSB, the Rx won't even work (tested on HW) + state = readRegister(RADIOLIB_SX126X_REG_WHITENING_INITIAL_MSB, data, 1); + RADIOLIB_ASSERT(state); + + data[0] = (data[0] & 0xFE) | (uint8_t)((initial >> 8) & 0x01); + data[1] = (uint8_t)(initial & 0xFF); + state = writeRegister(RADIOLIB_SX126X_REG_WHITENING_INITIAL_MSB, data, 2); + RADIOLIB_ASSERT(state); + + state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, this->packetType); + RADIOLIB_ASSERT(state); + } + return(state); +} + +float SX126x::getDataRate() const { + return(this->dataRateMeasured); +} + +float SX126x::getRSSI(bool packet) { + if(packet) { + // get last packet RSSI from packet status + uint32_t packetStatus = getPacketStatus(); + uint8_t rssiPkt = packetStatus & 0xFF; + return(-1.0 * rssiPkt/2.0); + } else { + // get instantaneous RSSI value + uint8_t data[3] = {0, 0, 0}; // RssiInst, Status, RFU + this->mod->SPIreadStream(RADIOLIB_SX126X_CMD_GET_RSSI_INST, data, 3); + return((float)data[0] / (-2.0)); + } +} + +float SX126x::getSNR() { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // get last packet SNR from packet status + uint32_t packetStatus = getPacketStatus(); + uint8_t snrPkt = (packetStatus >> 8) & 0xFF; + if(snrPkt < 128) { + return(snrPkt/4.0); + } else { + return((snrPkt - 256)/4.0); + } +} + +float SX126x::getFrequencyError() { + // check active modem + uint8_t modem = getPacketType(); + if(modem != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(0.0); + } + + // read the raw frequency error register values + uint8_t efeRaw[3] = {0}; + int16_t state = readRegister(RADIOLIB_SX126X_REG_FREQ_ERROR, &efeRaw[0], 1); + RADIOLIB_ASSERT(state); + state = readRegister(RADIOLIB_SX126X_REG_FREQ_ERROR + 1, &efeRaw[1], 1); + RADIOLIB_ASSERT(state); + state = readRegister(RADIOLIB_SX126X_REG_FREQ_ERROR + 2, &efeRaw[2], 1); + RADIOLIB_ASSERT(state); + uint32_t efe = ((uint32_t) efeRaw[0] << 16) | ((uint32_t) efeRaw[1] << 8) | efeRaw[2]; + efe &= 0x0FFFFF; + + float error = 0; + + // check the first bit + if (efe & 0x80000) { + // frequency error is negative + efe |= (uint32_t) 0xFFF00000; + efe = ~efe + 1; + error = 1.55 * (float) efe / (1600.0 / (float) this->bandwidthKhz) * -1.0; + } else { + error = 1.55 * (float) efe / (1600.0 / (float) this->bandwidthKhz); + } + + return(error); +} + +size_t SX126x::getPacketLength(bool update) { + (void)update; + + // in implicit mode, return the cached value + if((getPacketType() == RADIOLIB_SX126X_PACKET_TYPE_LORA) && (this->headerType == RADIOLIB_SX126X_LORA_HEADER_IMPLICIT)) { + return(this->implicitLen); + } + + uint8_t rxBufStatus[2] = {0, 0}; + this->mod->SPIreadStream(RADIOLIB_SX126X_CMD_GET_RX_BUFFER_STATUS, rxBufStatus, 2); + return((size_t)rxBufStatus[0]); +} + +int16_t SX126x::fixedPacketLengthMode(uint8_t len) { + return(setPacketMode(RADIOLIB_SX126X_GFSK_PACKET_FIXED, len)); +} + +int16_t SX126x::variablePacketLengthMode(uint8_t maxLen) { + return(setPacketMode(RADIOLIB_SX126X_GFSK_PACKET_VARIABLE, maxLen)); +} + +uint32_t SX126x::getTimeOnAir(size_t len) { + // everything is in microseconds to allow integer arithmetic + // some constants have .25, these are multiplied by 4, and have _x4 postfix to indicate that fact + if(getPacketType() == RADIOLIB_SX126X_PACKET_TYPE_LORA) { + uint32_t symbolLength_us = ((uint32_t)(1000 * 10) << this->spreadingFactor) / (this->bandwidthKhz * 10) ; + uint8_t sfCoeff1_x4 = 17; // (4.25 * 4) + uint8_t sfCoeff2 = 8; + if(this->spreadingFactor == 5 || this->spreadingFactor == 6) { + sfCoeff1_x4 = 25; // 6.25 * 4 + sfCoeff2 = 0; + } + uint8_t sfDivisor = 4*this->spreadingFactor; + if(symbolLength_us >= 16000) { + sfDivisor = 4*(this->spreadingFactor - 2); + } + const int8_t bitsPerCrc = 16; + const int8_t N_symbol_header = this->headerType == RADIOLIB_SX126X_LORA_HEADER_EXPLICIT ? 20 : 0; + + // numerator of equation in section 6.1.4 of SX1268 datasheet v1.1 (might not actually be bitcount, but it has len * 8) + int16_t bitCount = (int16_t) 8 * len + this->crcTypeLoRa * bitsPerCrc - 4 * this->spreadingFactor + sfCoeff2 + N_symbol_header; + if(bitCount < 0) { + bitCount = 0; + } + // add (sfDivisor) - 1 to the numerator to give integer CEIL(...) + uint16_t nPreCodedSymbols = (bitCount + (sfDivisor - 1)) / (sfDivisor); + + // preamble can be 65k, therefore nSymbol_x4 needs to be 32 bit + uint32_t nSymbol_x4 = (this->preambleLengthLoRa + 8) * 4 + sfCoeff1_x4 + nPreCodedSymbols * (this->codingRate + 4) * 4; + + return((symbolLength_us * nSymbol_x4) / 4); + } else { + return((len * 8 * this->bitRate) / (RADIOLIB_SX126X_CRYSTAL_FREQ * 32)); + } +} + +int16_t SX126x::implicitHeader(size_t len) { + return(setHeaderType(RADIOLIB_SX126X_LORA_HEADER_IMPLICIT, len)); +} + +int16_t SX126x::explicitHeader() { + return(setHeaderType(RADIOLIB_SX126X_LORA_HEADER_EXPLICIT)); +} + +int16_t SX126x::setRegulatorLDO() { + return(setRegulatorMode(RADIOLIB_SX126X_REGULATOR_LDO)); +} + +int16_t SX126x::setRegulatorDCDC() { + return(setRegulatorMode(RADIOLIB_SX126X_REGULATOR_DC_DC)); +} + +int16_t SX126x::setEncoding(uint8_t encoding) { + return(setWhitening(encoding)); +} + +void SX126x::setRfSwitchPins(uint32_t rxEn, uint32_t txEn) { + this->mod->setRfSwitchPins(rxEn, txEn); +} + +void SX126x::setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]) { + this->mod->setRfSwitchTable(pins, table); +} + +int16_t SX126x::forceLDRO(bool enable) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // update modulation parameters + this->ldroAuto = false; + this->ldrOptimize = (uint8_t)enable; + return(setModulationParams(this->spreadingFactor, this->bandwidth, this->codingRate, this->ldrOptimize)); +} + +int16_t SX126x::autoLDRO() { + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + this->ldroAuto = true; + return(RADIOLIB_ERR_NONE); +} + +uint8_t SX126x::randomByte() { + // set some magic registers + this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_ANA_LNA, RADIOLIB_SX126X_LNA_RNG_ENABLED, 0, 0); + this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_ANA_MIXER, RADIOLIB_SX126X_MIXER_RNG_ENABLED, 0, 0); + + // set mode to Rx + setRx(RADIOLIB_SX126X_RX_TIMEOUT_INF); + + // wait a bit for the RSSI reading to stabilise + this->mod->hal->delay(10); + + // read RSSI value 8 times, always keep just the least significant bit + uint8_t randByte = 0x00; + for(uint8_t i = 0; i < 8; i++) { + uint8_t val = 0x00; + readRegister(RADIOLIB_SX126X_REG_RANDOM_NUMBER_0, &val, sizeof(uint8_t)); + randByte |= ((val & 0x01) << i); + } + + // set mode to standby + standby(); + + // restore the magic registers + this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_ANA_LNA, RADIOLIB_SX126X_LNA_RNG_DISABLED, 0, 0); + this->mod->SPIsetRegValue(RADIOLIB_SX126X_REG_ANA_MIXER, RADIOLIB_SX126X_MIXER_RNG_DISABLED, 0, 0); + + return(randByte); +} + +int16_t SX126x::invertIQ(bool enable) { + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + if(enable) { + this->invertIQEnabled = RADIOLIB_SX126X_LORA_IQ_INVERTED; + } else { + this->invertIQEnabled = RADIOLIB_SX126X_LORA_IQ_STANDARD; + } + + return(setPacketParams(this->preambleLengthLoRa, this->crcTypeLoRa, this->implicitLen, this->headerType, this->invertIQEnabled)); +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +void SX126x::setDirectAction(void (*func)(void)) { + setDio1Action(func); +} + +void SX126x::readBit(uint32_t pin) { + updateDirectBuffer((uint8_t)this->mod->hal->digitalRead(pin)); +} +#endif + +int16_t SX126x::uploadPatch(const uint32_t* patch, size_t len, bool nonvolatile) { + // set to standby RC mode + int16_t state = standby(RADIOLIB_SX126X_STANDBY_RC); + RADIOLIB_ASSERT(state); + + // check the version + #if defined(RADIOLIB_DEBUG) + char ver_pre[16]; + this->mod->SPIreadRegisterBurst(RADIOLIB_SX126X_REG_VERSION_STRING, 16, (uint8_t*)ver_pre); + RADIOLIB_DEBUG_PRINTLN("Pre-update version string: %s", ver_pre); + #endif + + // enable patch update + this->mod->SPIwriteRegister(RADIOLIB_SX126X_REG_PATCH_UPDATE_ENABLE, RADIOLIB_SX126X_PATCH_UPDATE_ENABLED); + + // upload the patch + uint8_t data[4]; + for(uint32_t i = 0; i < len / sizeof(uint32_t); i++) { + uint32_t bin = 0; + if(nonvolatile) { + bin = RADIOLIB_NONVOLATILE_READ_DWORD(patch + i); + } else { + bin = patch[i]; + } + data[0] = (bin >> 24) & 0xFF; + data[1] = (bin >> 16) & 0xFF; + data[2] = (bin >> 8) & 0xFF; + data[3] = bin & 0xFF; + this->mod->SPIwriteRegisterBurst(RADIOLIB_SX126X_REG_PATCH_MEMORY_BASE + i*sizeof(uint32_t), data, sizeof(uint32_t)); + } + + // disable patch update + this->mod->SPIwriteRegister(RADIOLIB_SX126X_REG_PATCH_UPDATE_ENABLE, RADIOLIB_SX126X_PATCH_UPDATE_DISABLED); + + // update + this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_PRAM_UPDATE, NULL, 0); + + // check the version again + #if defined(RADIOLIB_DEBUG) + char ver_post[16]; + this->mod->SPIreadRegisterBurst(RADIOLIB_SX126X_REG_VERSION_STRING, 16, (uint8_t*)ver_post); + RADIOLIB_DEBUG_PRINTLN("Post-update version string: %s", ver_post); + #endif + + return(state); +} + +int16_t SX126x::spectralScanStart(uint16_t numSamples, uint8_t window, uint8_t interval) { + // abort first - not sure if this is strictly needed, but the example code does this + spectralScanAbort(); + + // set the RSSI window size + this->mod->SPIwriteRegister(RADIOLIB_SX126X_REG_RSSI_AVG_WINDOW, window); + + // start Rx with infinite timeout + int16_t state = setRx(RADIOLIB_SX126X_RX_TIMEOUT_INF); + RADIOLIB_ASSERT(state); + + // now set the actual spectral scan parameters + uint8_t data[3] = { (uint8_t)((numSamples >> 8) & 0xFF), (uint8_t)(numSamples & 0xFF), interval }; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_SPECTR_SCAN_PARAMS, data, 3)); +} + +void SX126x::spectralScanAbort() { + this->mod->SPIwriteRegister(RADIOLIB_SX126X_REG_RSSI_AVG_WINDOW, 0x00); +} + +int16_t SX126x::spectralScanGetStatus() { + uint8_t status = this->mod->SPIreadRegister(RADIOLIB_SX126X_REG_SPECTRAL_SCAN_STATUS); + if(status == RADIOLIB_SX126X_SPECTRAL_SCAN_COMPLETED) { + return(RADIOLIB_ERR_NONE); + } + return(RADIOLIB_ERR_RANGING_TIMEOUT); +} + +int16_t SX126x::spectralScanGetResult(uint16_t* results) { + // read the raw results + uint8_t data[2*RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE]; + this->mod->SPIreadRegisterBurst(RADIOLIB_SX126X_REG_SPECTRAL_SCAN_RESULT, 2*RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE, data); + + // convert it + for(uint8_t i = 0; i < RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE; i++) { + results[i] = ((uint16_t)data[i*2] << 8) | ((uint16_t)data[i*2 + 1]); + } + return(RADIOLIB_ERR_NONE); +} + +int16_t SX126x::setTCXO(float voltage, uint32_t delay) { + // check if TCXO is enabled at all + if(this->XTAL) { + return(RADIOLIB_ERR_INVALID_TCXO_VOLTAGE); + } + + // set mode to standby + standby(); + + // check RADIOLIB_SX126X_XOSC_START_ERR flag and clear it + if(getDeviceErrors() & RADIOLIB_SX126X_XOSC_START_ERR) { + clearDeviceErrors(); + } + + // check 0 V disable + if(fabs(voltage - 0.0) <= 0.001) { + return(reset(true)); + } + + // check alowed voltage values + uint8_t data[4]; + if(fabs(voltage - 1.6) <= 0.001) { + data[0] = RADIOLIB_SX126X_DIO3_OUTPUT_1_6; + } else if(fabs(voltage - 1.7) <= 0.001) { + data[0] = RADIOLIB_SX126X_DIO3_OUTPUT_1_7; + } else if(fabs(voltage - 1.8) <= 0.001) { + data[0] = RADIOLIB_SX126X_DIO3_OUTPUT_1_8; + } else if(fabs(voltage - 2.2) <= 0.001) { + data[0] = RADIOLIB_SX126X_DIO3_OUTPUT_2_2; + } else if(fabs(voltage - 2.4) <= 0.001) { + data[0] = RADIOLIB_SX126X_DIO3_OUTPUT_2_4; + } else if(fabs(voltage - 2.7) <= 0.001) { + data[0] = RADIOLIB_SX126X_DIO3_OUTPUT_2_7; + } else if(fabs(voltage - 3.0) <= 0.001) { + data[0] = RADIOLIB_SX126X_DIO3_OUTPUT_3_0; + } else if(fabs(voltage - 3.3) <= 0.001) { + data[0] = RADIOLIB_SX126X_DIO3_OUTPUT_3_3; + } else { + return(RADIOLIB_ERR_INVALID_TCXO_VOLTAGE); + } + + // calculate delay + uint32_t delayValue = (float)delay / 15.625; + data[1] = (uint8_t)((delayValue >> 16) & 0xFF); + data[2] = (uint8_t)((delayValue >> 8) & 0xFF); + data[3] = (uint8_t)(delayValue & 0xFF); + + this->tcxoDelay = delay; + + // enable TCXO control on DIO3 + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_DIO3_AS_TCXO_CTRL, data, 4)); +} + +int16_t SX126x::setDio2AsRfSwitch(bool enable) { + uint8_t data = 0; + if(enable) { + data = RADIOLIB_SX126X_DIO2_AS_RF_SWITCH; + } else { + data = RADIOLIB_SX126X_DIO2_AS_IRQ; + } + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, &data, 1)); +} + +int16_t SX126x::setFs() { + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_FS, NULL, 0)); +} + +int16_t SX126x::setTx(uint32_t timeout) { + uint8_t data[] = { (uint8_t)((timeout >> 16) & 0xFF), (uint8_t)((timeout >> 8) & 0xFF), (uint8_t)(timeout & 0xFF)} ; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_TX, data, 3)); +} + +int16_t SX126x::setRx(uint32_t timeout) { + uint8_t data[] = { (uint8_t)((timeout >> 16) & 0xFF), (uint8_t)((timeout >> 8) & 0xFF), (uint8_t)(timeout & 0xFF) }; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_RX, data, 3, true, false)); +} + + +int16_t SX126x::setCad(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin) { + // default CAD parameters are shown in Semtech AN1200.48, page 41. + uint8_t detPeakValues[6] = { 22, 22, 24, 25, 26, 30}; + + // CAD parameters aren't available for SF-6. Just to be safe. + if(this->spreadingFactor < 7) { + this->spreadingFactor = 7; + } else if(this->spreadingFactor > 12) { + this->spreadingFactor = 12; + } + + // build the packet + uint8_t data[7]; + data[0] = RADIOLIB_SX126X_CAD_ON_2_SYMB; + data[1] = detPeakValues[this->spreadingFactor - 7]; + data[2] = RADIOLIB_SX126X_CAD_PARAM_DET_MIN; + data[3] = RADIOLIB_SX126X_CAD_GOTO_STDBY; + data[4] = 0x00; + data[5] = 0x00; + data[6] = 0x00; + + + /* + CAD Configuration Note: + The default CAD configuration applied by `scanChannel` overrides the optimal SF-specific configurations, leading to suboptimal detection. + I.e., anything that is not RADIOLIB_SX126X_CAD_PARAM_DEFAULT is overridden. But CAD settings are SF specific. + To address this, the user override has been commented out, ensuring consistent application of the optimal CAD settings as + per Semtech's Application Note AN1200.48 (page 41) for the 125KHz setting. This approach significantly reduces false CAD occurrences. + Testing has shown that there is no reason for a user to change CAD settings for anything other than most optimal ones described in AN1200.48 . + However, this change deos not respect CAD configs from the LoRaWAN layer. Future considerations or use cases might require revisiting this decision. + Hence this note. +*/ + +/* + // set user-provided values + if(symbolNum != RADIOLIB_SX126X_CAD_PARAM_DEFAULT) { + data[0] = symbolNum; + } + + if(detPeak != RADIOLIB_SX126X_CAD_PARAM_DEFAULT) { + data[1] = detPeak; + } + + if(detMin != RADIOLIB_SX126X_CAD_PARAM_DEFAULT) { + data[2] = detMin; + } + +*/ + + + // configure parameters + int16_t state = this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_CAD_PARAMS, data, 7); + RADIOLIB_ASSERT(state); + + // start CAD + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_CAD, NULL, 0)); +} + +int16_t SX126x::setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMax, uint8_t paLut) { + uint8_t data[] = { paDutyCycle, hpMax, deviceSel, paLut }; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_PA_CONFIG, data, 4)); +} + +int16_t SX126x::writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { + this->mod->SPIwriteRegisterBurst(addr, data, numBytes); + return(RADIOLIB_ERR_NONE); +} + +int16_t SX126x::readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { + // send the command + this->mod->SPIreadRegisterBurst(addr, numBytes, data); + + // check the status + int16_t state = this->mod->SPIcheckStream(); + return(state); +} + +int16_t SX126x::writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) { + uint8_t cmd[] = { RADIOLIB_SX126X_CMD_WRITE_BUFFER, offset }; + return(this->mod->SPIwriteStream(cmd, 2, data, numBytes)); +} + +int16_t SX126x::readBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) { + uint8_t cmd[] = { RADIOLIB_SX126X_CMD_READ_BUFFER, offset }; + return(this->mod->SPIreadStream(cmd, 2, data, numBytes)); +} + +int16_t SX126x::setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask) { + uint8_t data[8] = {(uint8_t)((irqMask >> 8) & 0xFF), (uint8_t)(irqMask & 0xFF), + (uint8_t)((dio1Mask >> 8) & 0xFF), (uint8_t)(dio1Mask & 0xFF), + (uint8_t)((dio2Mask >> 8) & 0xFF), (uint8_t)(dio2Mask & 0xFF), + (uint8_t)((dio3Mask >> 8) & 0xFF), (uint8_t)(dio3Mask & 0xFF)}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_DIO_IRQ_PARAMS, data, 8)); +} + +uint16_t SX126x::getIrqStatus() { + uint8_t data[] = { 0x00, 0x00 }; + this->mod->SPIreadStream(RADIOLIB_SX126X_CMD_GET_IRQ_STATUS, data, 2); + return(((uint16_t)(data[0]) << 8) | data[1]); +} + +int16_t SX126x::clearIrqStatus(uint16_t clearIrqParams) { + uint8_t data[] = { (uint8_t)((clearIrqParams >> 8) & 0xFF), (uint8_t)(clearIrqParams & 0xFF) }; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_CLEAR_IRQ_STATUS, data, 2)); +} + +int16_t SX126x::setRfFrequency(uint32_t frf) { + uint8_t data[] = { (uint8_t)((frf >> 24) & 0xFF), (uint8_t)((frf >> 16) & 0xFF), (uint8_t)((frf >> 8) & 0xFF), (uint8_t)(frf & 0xFF) }; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_RF_FREQUENCY, data, 4)); +} + +int16_t SX126x::calibrateImage(uint8_t* data) { + int16_t state = this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_CALIBRATE_IMAGE, data, 2); + + // if something failed, show the device errors + #if defined(RADIOLIB_DEBUG) + if(state != RADIOLIB_ERR_NONE) { + // unless mode is forced to standby, device errors will be 0 + standby(); + uint16_t errors = getDeviceErrors(); + RADIOLIB_DEBUG_PRINTLN("Calibration failed, device errors: 0x%X", errors); + } + #endif + return(state); +} + +uint8_t SX126x::getPacketType() { + uint8_t data = 0xFF; + this->mod->SPIreadStream(RADIOLIB_SX126X_CMD_GET_PACKET_TYPE, &data, 1); + return(data); +} + +int16_t SX126x::setTxParams(uint8_t pwr, uint8_t rampTime) { + uint8_t data[] = { pwr, rampTime }; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_TX_PARAMS, data, 2)); +} + +int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_GFSK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set requested packet mode + int16_t state = setPacketParamsFSK(this->preambleLengthFSK, this->crcTypeFSK, this->syncWordLength, this->addrComp, this->whitening, mode, len); + RADIOLIB_ASSERT(state); + + // update cached value + this->packetType = mode; + return(state); +} + +int16_t SX126x::setHeaderType(uint8_t hdrType, size_t len) { + // check active modem + if(getPacketType() != RADIOLIB_SX126X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set requested packet mode + int16_t state = setPacketParams(this->preambleLengthLoRa, this->crcTypeLoRa, len, hdrType, this->invertIQEnabled); + RADIOLIB_ASSERT(state); + + // update cached value + this->headerType = hdrType; + this->implicitLen = len; + + return(state); +} + +int16_t SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro) { + // calculate symbol length and enable low data rate optimization, if auto-configuration is enabled + if(this->ldroAuto) { + float symbolLength = (float)(uint32_t(1) << this->spreadingFactor) / (float)this->bandwidthKhz; + if(symbolLength >= 16.0) { + this->ldrOptimize = RADIOLIB_SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON; + } else { + this->ldrOptimize = RADIOLIB_SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_OFF; + } + } else { + this->ldrOptimize = ldro; + } + // 500/9/8 - 0x09 0x04 0x03 0x00 - SF9, BW125, 4/8 + // 500/11/8 - 0x0B 0x04 0x03 0x00 - SF11 BW125, 4/7 + uint8_t data[4] = {sf, bw, cr, this->ldrOptimize}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_MODULATION_PARAMS, data, 4)); +} + +int16_t SX126x::setModulationParamsFSK(uint32_t br, uint8_t sh, uint8_t rxBw, uint32_t freqDev) { + uint8_t data[8] = {(uint8_t)((br >> 16) & 0xFF), (uint8_t)((br >> 8) & 0xFF), (uint8_t)(br & 0xFF), + sh, rxBw, + (uint8_t)((freqDev >> 16) & 0xFF), (uint8_t)((freqDev >> 8) & 0xFF), (uint8_t)(freqDev & 0xFF)}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_MODULATION_PARAMS, data, 8)); +} + +int16_t SX126x::setPacketParams(uint16_t preambleLen, uint8_t crcType, uint8_t payloadLen, uint8_t hdrType, uint8_t invertIQ) { + int16_t state = fixInvertedIQ(invertIQ); + RADIOLIB_ASSERT(state); + uint8_t data[6] = {(uint8_t)((preambleLen >> 8) & 0xFF), (uint8_t)(preambleLen & 0xFF), hdrType, payloadLen, crcType, invertIQ}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_PACKET_PARAMS, data, 6)); +} + +int16_t SX126x::setPacketParamsFSK(uint16_t preambleLen, uint8_t crcType, uint8_t syncWordLen, uint8_t addrCmp, uint8_t whiten, uint8_t packType, uint8_t payloadLen, uint8_t preambleDetectorLen) { + uint8_t data[9] = {(uint8_t)((preambleLen >> 8) & 0xFF), (uint8_t)(preambleLen & 0xFF), + preambleDetectorLen, syncWordLen, addrCmp, + packType, payloadLen, crcType, whiten}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_PACKET_PARAMS, data, 9)); +} + +int16_t SX126x::setBufferBaseAddress(uint8_t txBaseAddress, uint8_t rxBaseAddress) { + uint8_t data[2] = {txBaseAddress, rxBaseAddress}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_BUFFER_BASE_ADDRESS, data, 2)); +} + +int16_t SX126x::setRegulatorMode(uint8_t mode) { + uint8_t data[1] = {mode}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_REGULATOR_MODE, data, 1)); +} + +uint8_t SX126x::getStatus() { + uint8_t data = 0; + this->mod->SPIreadStream(RADIOLIB_SX126X_CMD_GET_STATUS, &data, 0); + return(data); +} + +uint32_t SX126x::getPacketStatus() { + uint8_t data[3] = {0, 0, 0}; + this->mod->SPIreadStream(RADIOLIB_SX126X_CMD_GET_PACKET_STATUS, data, 3); + return((((uint32_t)data[0]) << 16) | (((uint32_t)data[1]) << 8) | (uint32_t)data[2]); +} + +uint16_t SX126x::getDeviceErrors() { + uint8_t data[2] = {0, 0}; + this->mod->SPIreadStream(RADIOLIB_SX126X_CMD_GET_DEVICE_ERRORS, data, 2); + uint16_t opError = (((uint16_t)data[0] & 0xFF) << 8) | ((uint16_t)data[1]); + return(opError); +} + +int16_t SX126x::clearDeviceErrors() { + uint8_t data[2] = {RADIOLIB_SX126X_CMD_NOP, RADIOLIB_SX126X_CMD_NOP}; + return(this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_CLEAR_DEVICE_ERRORS, data, 2)); +} + +int16_t SX126x::setFrequencyRaw(float freq) { + // calculate raw value + uint32_t frf = (freq * (uint32_t(1) << RADIOLIB_SX126X_DIV_EXPONENT)) / RADIOLIB_SX126X_CRYSTAL_FREQ; + return(setRfFrequency(frf)); +} + +int16_t SX126x::fixSensitivity() { + // fix receiver sensitivity for 500 kHz LoRa + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.1 for details + + // read current sensitivity configuration + uint8_t sensitivityConfig = 0; + int16_t state = readRegister(RADIOLIB_SX126X_REG_SENSITIVITY_CONFIG, &sensitivityConfig, 1); + RADIOLIB_ASSERT(state); + + // fix the value for LoRa with 500 kHz bandwidth + if((getPacketType() == RADIOLIB_SX126X_PACKET_TYPE_LORA) && (fabs(this->bandwidthKhz - 500.0) <= 0.001)) { + sensitivityConfig &= 0xFB; + } else { + sensitivityConfig |= 0x04; + } + return(writeRegister(RADIOLIB_SX126X_REG_SENSITIVITY_CONFIG, &sensitivityConfig, 1)); +} + +int16_t SX126x::fixPaClamping(bool enable) { + // fixes overly eager PA clamping + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.2 for details + + // read current clamping configuration + uint8_t clampConfig = 0; + int16_t state = readRegister(RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); + RADIOLIB_ASSERT(state); + + // apply or undo workaround + if (enable) + clampConfig |= 0x1E; + else + clampConfig = (clampConfig & ~0x1E) | 0x08; + + return(writeRegister(RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1)); +} + +int16_t SX126x::fixImplicitTimeout() { + // fixes timeout in implicit header mode + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.3 for details + + //check if we're in implicit LoRa mode + if(!((this->headerType == RADIOLIB_SX126X_LORA_HEADER_IMPLICIT) && (getPacketType() == RADIOLIB_SX126X_PACKET_TYPE_LORA))) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // stop RTC counter + uint8_t rtcStop = 0x00; + int16_t state = writeRegister(RADIOLIB_SX126X_REG_RTC_CTRL, &rtcStop, 1); + RADIOLIB_ASSERT(state); + + // read currently active event + uint8_t rtcEvent = 0; + state = readRegister(RADIOLIB_SX126X_REG_EVENT_MASK, &rtcEvent, 1); + RADIOLIB_ASSERT(state); + + // clear events + rtcEvent |= 0x02; + return(writeRegister(RADIOLIB_SX126X_REG_EVENT_MASK, &rtcEvent, 1)); +} + +int16_t SX126x::fixInvertedIQ(uint8_t iqConfig) { + // fixes IQ configuration for inverted IQ + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.4 for details + + // read current IQ configuration + uint8_t iqConfigCurrent = 0; + int16_t state = readRegister(RADIOLIB_SX126X_REG_IQ_CONFIG, &iqConfigCurrent, 1); + RADIOLIB_ASSERT(state); + + // set correct IQ configuration + if(iqConfig == RADIOLIB_SX126X_LORA_IQ_INVERTED) { + iqConfigCurrent &= 0xFB; + } else { + iqConfigCurrent |= 0x04; + } + + // update with the new value + return(writeRegister(RADIOLIB_SX126X_REG_IQ_CONFIG, &iqConfigCurrent, 1)); +} + +int16_t SX126x::config(uint8_t modem) { + // reset buffer base address + int16_t state = setBufferBaseAddress(); + RADIOLIB_ASSERT(state); + + // set modem + uint8_t data[7]; + data[0] = modem; + state = this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_PACKET_TYPE, data, 1); + RADIOLIB_ASSERT(state); + + // set Rx/Tx fallback mode to STDBY_RC + data[0] = RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_STDBY_RC; + state = this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_RX_TX_FALLBACK_MODE, data, 1); + RADIOLIB_ASSERT(state); + + // set some CAD parameters - will be overwritten when calling CAD anyway + data[0] = RADIOLIB_SX126X_CAD_ON_8_SYMB; + data[1] = this->spreadingFactor + 13; + data[2] = RADIOLIB_SX126X_CAD_PARAM_DET_MIN; + data[3] = RADIOLIB_SX126X_CAD_GOTO_STDBY; + data[4] = 0x00; + data[5] = 0x00; + data[6] = 0x00; + state = this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_SET_CAD_PARAMS, data, 7); + RADIOLIB_ASSERT(state); + + // clear IRQ + state = clearIrqStatus(); + state |= setDioIrqParams(RADIOLIB_SX126X_IRQ_NONE, RADIOLIB_SX126X_IRQ_NONE); + RADIOLIB_ASSERT(state); + + // calibrate all blocks + data[0] = RADIOLIB_SX126X_CALIBRATE_ALL; + state = this->mod->SPIwriteStream(RADIOLIB_SX126X_CMD_CALIBRATE, data, 1, true, false); + RADIOLIB_ASSERT(state); + + // wait for calibration completion + this->mod->hal->delay(5); + while(this->mod->hal->digitalRead(this->mod->getGpio())) { + this->mod->hal->yield(); + } + + // check calibration result + state = this->mod->SPIcheckStream(); + + // if something failed, show the device errors + #if defined(RADIOLIB_DEBUG) + if(state != RADIOLIB_ERR_NONE) { + // unless mode is forced to standby, device errors will be 0 + standby(); + uint16_t errors = getDeviceErrors(); + RADIOLIB_DEBUG_PRINTLN("Calibration failed, device errors: 0x%X", errors); + } + #endif + + return(state); +} + +int16_t SX126x::SPIparseStatus(uint8_t in) { + if((in & 0b00001110) == RADIOLIB_SX126X_STATUS_CMD_TIMEOUT) { + return(RADIOLIB_ERR_SPI_CMD_TIMEOUT); + } else if((in & 0b00001110) == RADIOLIB_SX126X_STATUS_CMD_INVALID) { + return(RADIOLIB_ERR_SPI_CMD_INVALID); + } else if((in & 0b00001110) == RADIOLIB_SX126X_STATUS_CMD_FAILED) { + return(RADIOLIB_ERR_SPI_CMD_FAILED); + } else if((in == 0x00) || (in == 0xFF)) { + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + return(RADIOLIB_ERR_NONE); +} + +bool SX126x::findChip(const char* verStr) { + uint8_t i = 0; + bool flagFound = false; + while((i < 10) && !flagFound) { + // reset the module + reset(); + + // read the version string + char version[16]; + this->mod->SPIreadRegisterBurst(RADIOLIB_SX126X_REG_VERSION_STRING, 16, (uint8_t*)version); + + // check version register + if(strncmp(verStr, version, 6) == 0) { + RADIOLIB_DEBUG_PRINTLN("Found SX126x: RADIOLIB_SX126X_REG_VERSION_STRING:"); + RADIOLIB_DEBUG_HEXDUMP((uint8_t*)version, 16, RADIOLIB_SX126X_REG_VERSION_STRING); + RADIOLIB_DEBUG_PRINTLN(); + flagFound = true; + } else { + #if defined(RADIOLIB_DEBUG) + RADIOLIB_DEBUG_PRINTLN("SX126x not found! (%d of 10 tries) RADIOLIB_SX126X_REG_VERSION_STRING:", i + 1); + RADIOLIB_DEBUG_HEXDUMP((uint8_t*)version, 16, RADIOLIB_SX126X_REG_VERSION_STRING); + RADIOLIB_DEBUG_PRINTLN("Expected string: %s", verStr); + #endif + this->mod->hal->delay(10); + i++; + } + } + + return(flagFound); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX126x.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX126x.h new file mode 100644 index 00000000..30900802 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/SX126x.h @@ -0,0 +1,1167 @@ +#if !defined(_RADIOLIB_SX126X_H) +#define _RADIOLIB_SX126X_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +#include "../../Module.h" + +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" + +// SX126X physical layer properties +#define RADIOLIB_SX126X_FREQUENCY_STEP_SIZE 0.9536743164 +#define RADIOLIB_SX126X_MAX_PACKET_LENGTH 255 +#define RADIOLIB_SX126X_CRYSTAL_FREQ 32.0 +#define RADIOLIB_SX126X_DIV_EXPONENT 25 + +// SX126X SPI commands +// operational modes commands +#define RADIOLIB_SX126X_CMD_NOP 0x00 +#define RADIOLIB_SX126X_CMD_SET_SLEEP 0x84 +#define RADIOLIB_SX126X_CMD_SET_STANDBY 0x80 +#define RADIOLIB_SX126X_CMD_SET_FS 0xC1 +#define RADIOLIB_SX126X_CMD_SET_TX 0x83 +#define RADIOLIB_SX126X_CMD_SET_RX 0x82 +#define RADIOLIB_SX126X_CMD_STOP_TIMER_ON_PREAMBLE 0x9F +#define RADIOLIB_SX126X_CMD_SET_RX_DUTY_CYCLE 0x94 +#define RADIOLIB_SX126X_CMD_SET_CAD 0xC5 +#define RADIOLIB_SX126X_CMD_SET_TX_CONTINUOUS_WAVE 0xD1 +#define RADIOLIB_SX126X_CMD_SET_TX_INFINITE_PREAMBLE 0xD2 +#define RADIOLIB_SX126X_CMD_SET_REGULATOR_MODE 0x96 +#define RADIOLIB_SX126X_CMD_CALIBRATE 0x89 +#define RADIOLIB_SX126X_CMD_CALIBRATE_IMAGE 0x98 +#define RADIOLIB_SX126X_CMD_SET_PA_CONFIG 0x95 +#define RADIOLIB_SX126X_CMD_SET_RX_TX_FALLBACK_MODE 0x93 + +// register and buffer access commands +#define RADIOLIB_SX126X_CMD_WRITE_REGISTER 0x0D +#define RADIOLIB_SX126X_CMD_READ_REGISTER 0x1D +#define RADIOLIB_SX126X_CMD_WRITE_BUFFER 0x0E +#define RADIOLIB_SX126X_CMD_READ_BUFFER 0x1E + +// DIO and IRQ control +#define RADIOLIB_SX126X_CMD_SET_DIO_IRQ_PARAMS 0x08 +#define RADIOLIB_SX126X_CMD_GET_IRQ_STATUS 0x12 +#define RADIOLIB_SX126X_CMD_CLEAR_IRQ_STATUS 0x02 +#define RADIOLIB_SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL 0x9D +#define RADIOLIB_SX126X_CMD_SET_DIO3_AS_TCXO_CTRL 0x97 + +// RF, modulation and packet commands +#define RADIOLIB_SX126X_CMD_SET_RF_FREQUENCY 0x86 +#define RADIOLIB_SX126X_CMD_SET_PACKET_TYPE 0x8A +#define RADIOLIB_SX126X_CMD_GET_PACKET_TYPE 0x11 +#define RADIOLIB_SX126X_CMD_SET_TX_PARAMS 0x8E +#define RADIOLIB_SX126X_CMD_SET_MODULATION_PARAMS 0x8B +#define RADIOLIB_SX126X_CMD_SET_PACKET_PARAMS 0x8C +#define RADIOLIB_SX126X_CMD_SET_CAD_PARAMS 0x88 +#define RADIOLIB_SX126X_CMD_SET_BUFFER_BASE_ADDRESS 0x8F +#define RADIOLIB_SX126X_CMD_SET_LORA_SYMB_NUM_TIMEOUT 0x0A + +// status commands +#define RADIOLIB_SX126X_CMD_GET_STATUS 0xC0 +#define RADIOLIB_SX126X_CMD_GET_RSSI_INST 0x15 +#define RADIOLIB_SX126X_CMD_GET_RX_BUFFER_STATUS 0x13 +#define RADIOLIB_SX126X_CMD_GET_PACKET_STATUS 0x14 +#define RADIOLIB_SX126X_CMD_GET_DEVICE_ERRORS 0x17 +#define RADIOLIB_SX126X_CMD_CLEAR_DEVICE_ERRORS 0x07 +#define RADIOLIB_SX126X_CMD_GET_STATS 0x10 +#define RADIOLIB_SX126X_CMD_RESET_STATS 0x00 + +#define RADIOLIB_SX126X_CMD_PRAM_UPDATE 0xD9 +#define RADIOLIB_SX126X_CMD_SET_LBT_SCAN_PARAMS 0x9A +#define RADIOLIB_SX126X_CMD_SET_SPECTR_SCAN_PARAMS 0x9B + +// SX126X register map +#define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_0 0x029F // SX1268 datasheet v1.1, section 9.6 +#define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_1 0x02A0 // SX1268 datasheet v1.1, section 9.6 +#define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_2 0x02A1 // SX1268 datasheet v1.1, section 9.6 +#define RADIOLIB_SX126X_REG_VERSION_STRING 0x0320 +#define RADIOLIB_SX126X_REG_HOPPING_ENABLE 0x0385 +#define RADIOLIB_SX126X_REG_LR_FHSS_PACKET_LENGTH 0x0386 +#define RADIOLIB_SX126X_REG_LR_FHSS_NUM_HOPPING_BLOCKS 0x0387 +#define RADIOLIB_SX126X_REG_LR_FHSS_NUM_SYMBOLS_FREQX_MSB(X) (0x0388 + (X)*6) +#define RADIOLIB_SX126X_REG_LR_FHSS_NUM_SYMBOLS_FREQX_LSB(X) (0x0389 + (X)*6) +#define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_0(X) (0x038A + (X)*6) +#define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_1(X) (0x038B + (X)*6) +#define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_2(X) (0x038C + (X)*6) +#define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_3(X) (0x038D + (X)*6) +#define RADIOLIB_SX126X_REG_SPECTRAL_SCAN_RESULT 0x0401 +#define RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE 0x0580 +#define RADIOLIB_SX126X_REG_DIOX_DRIVE_STRENGTH 0x0582 +#define RADIOLIB_SX126X_REG_DIOX_IN_ENABLE 0x0583 +#define RADIOLIB_SX126X_REG_DIOX_PULL_UP_CTRL 0x0584 +#define RADIOLIB_SX126X_REG_DIOX_PULL_DOWN_CTRL 0x0585 +#define RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0 0x0587 +#define RADIOLIB_SX126X_REG_PATCH_UPDATE_ENABLE 0x0610 +#define RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1 0x0680 +#define RADIOLIB_SX126X_REG_WHITENING_INITIAL_MSB 0x06B8 +#define RADIOLIB_SX126X_REG_WHITENING_INITIAL_LSB 0x06B9 +#define RADIOLIB_SX126X_REG_RX_TX_PLD_LEN 0x06BB +#define RADIOLIB_SX126X_REG_CRC_INITIAL_MSB 0x06BC +#define RADIOLIB_SX126X_REG_CRC_INITIAL_LSB 0x06BD +#define RADIOLIB_SX126X_REG_CRC_POLYNOMIAL_MSB 0x06BE +#define RADIOLIB_SX126X_REG_CRC_POLYNOMIAL_LSB 0x06BF +#define RADIOLIB_SX126X_REG_SYNC_WORD_0 0x06C0 +#define RADIOLIB_SX126X_REG_SYNC_WORD_1 0x06C1 +#define RADIOLIB_SX126X_REG_SYNC_WORD_2 0x06C2 +#define RADIOLIB_SX126X_REG_SYNC_WORD_3 0x06C3 +#define RADIOLIB_SX126X_REG_SYNC_WORD_4 0x06C4 +#define RADIOLIB_SX126X_REG_SYNC_WORD_5 0x06C5 +#define RADIOLIB_SX126X_REG_SYNC_WORD_6 0x06C6 +#define RADIOLIB_SX126X_REG_SYNC_WORD_7 0x06C7 +#define RADIOLIB_SX126X_REG_NODE_ADDRESS 0x06CD +#define RADIOLIB_SX126X_REG_BROADCAST_ADDRESS 0x06CE +#define RADIOLIB_SX126X_REG_PAYLOAD_LENGTH 0x0702 +#define RADIOLIB_SX126X_REG_PACKET_PARAMS 0x0704 +#define RADIOLIB_SX126X_REG_LORA_SYNC_TIMEOUT 0x0706 +#define RADIOLIB_SX126X_REG_IQ_CONFIG 0x0736 +#define RADIOLIB_SX126X_REG_LORA_SYNC_WORD_MSB 0x0740 +#define RADIOLIB_SX126X_REG_LORA_SYNC_WORD_LSB 0x0741 +#define RADIOLIB_SX126X_REG_FREQ_ERROR 0x076B +#define RADIOLIB_SX126X_REG_SPECTRAL_SCAN_STATUS 0x07CD +#define RADIOLIB_SX126X_REG_RX_ADDR_PTR 0x0803 +#define RADIOLIB_SX126X_REG_RANDOM_NUMBER_0 0x0819 +#define RADIOLIB_SX126X_REG_RANDOM_NUMBER_1 0x081A +#define RADIOLIB_SX126X_REG_RANDOM_NUMBER_2 0x081B +#define RADIOLIB_SX126X_REG_RANDOM_NUMBER_3 0x081C +#define RADIOLIB_SX126X_REG_SENSITIVITY_CONFIG 0x0889 // SX1268 datasheet v1.1, section 15.1 +#define RADIOLIB_SX126X_REG_RF_FREQUENCY_0 0x088B +#define RADIOLIB_SX126X_REG_RF_FREQUENCY_1 0x088C +#define RADIOLIB_SX126X_REG_RF_FREQUENCY_2 0x088D +#define RADIOLIB_SX126X_REG_RF_FREQUENCY_3 0x088E +#define RADIOLIB_SX126X_REG_RSSI_AVG_WINDOW 0x089B +#define RADIOLIB_SX126X_REG_RX_GAIN 0x08AC +#define RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG 0x08D8 +#define RADIOLIB_SX126X_REG_ANA_LNA 0x08E2 +#define RADIOLIB_SX126X_REG_LNA_CAP_TUNE_N 0x08E3 +#define RADIOLIB_SX126X_REG_LNA_CAP_TUNE_P 0x08E4 +#define RADIOLIB_SX126X_REG_ANA_MIXER 0x08E5 +#define RADIOLIB_SX126X_REG_OCP_CONFIGURATION 0x08E7 +#define RADIOLIB_SX126X_REG_RTC_CTRL 0x0902 +#define RADIOLIB_SX126X_REG_XTA_TRIM 0x0911 +#define RADIOLIB_SX126X_REG_XTB_TRIM 0x0912 +#define RADIOLIB_SX126X_REG_DIO3_OUT_VOLTAGE_CTRL 0x0920 +#define RADIOLIB_SX126X_REG_EVENT_MASK 0x0944 +#define RADIOLIB_SX126X_REG_PATCH_MEMORY_BASE 0x8000 + +// SX126X SPI command variables +//RADIOLIB_SX126X_CMD_SET_SLEEP MSB LSB DESCRIPTION +#define RADIOLIB_SX126X_SLEEP_START_COLD 0b00000000 // 2 2 sleep mode: cold start, configuration is lost (default) +#define RADIOLIB_SX126X_SLEEP_START_WARM 0b00000100 // 2 2 warm start, configuration is retained +#define RADIOLIB_SX126X_SLEEP_RTC_OFF 0b00000000 // 0 0 wake on RTC timeout: disabled +#define RADIOLIB_SX126X_SLEEP_RTC_ON 0b00000001 // 0 0 enabled + +//RADIOLIB_SX126X_CMD_SET_STANDBY +#define RADIOLIB_SX126X_STANDBY_RC 0x00 // 7 0 standby mode: 13 MHz RC oscillator +#define RADIOLIB_SX126X_STANDBY_XOSC 0x01 // 7 0 32 MHz crystal oscillator + +//RADIOLIB_SX126X_CMD_SET_RX +#define RADIOLIB_SX126X_RX_TIMEOUT_NONE 0x000000 // 23 0 Rx timeout duration: no timeout (Rx single mode) +#define RADIOLIB_SX126X_RX_TIMEOUT_INF 0xFFFFFF // 23 0 infinite (Rx continuous mode) + +//RADIOLIB_SX126X_CMD_SET_TX +#define RADIOLIB_SX126X_TX_TIMEOUT_NONE 0x000000 // 23 0 Tx timeout duration: no timeout (Tx single mode) + +//RADIOLIB_SX126X_CMD_STOP_TIMER_ON_PREAMBLE +#define RADIOLIB_SX126X_STOP_ON_PREAMBLE_OFF 0x00 // 7 0 stop timer on: sync word or header (default) +#define RADIOLIB_SX126X_STOP_ON_PREAMBLE_ON 0x01 // 7 0 preamble detection + +//RADIOLIB_SX126X_CMD_SET_REGULATOR_MODE +#define RADIOLIB_SX126X_REGULATOR_LDO 0x00 // 7 0 set regulator mode: LDO (default) +#define RADIOLIB_SX126X_REGULATOR_DC_DC 0x01 // 7 0 DC-DC + +//RADIOLIB_SX126X_CMD_CALIBRATE +#define RADIOLIB_SX126X_CALIBRATE_IMAGE_OFF 0b00000000 // 6 6 image calibration: disabled +#define RADIOLIB_SX126X_CALIBRATE_IMAGE_ON 0b01000000 // 6 6 enabled +#define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_P_OFF 0b00000000 // 5 5 ADC bulk P calibration: disabled +#define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_P_ON 0b00100000 // 5 5 enabled +#define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_N_OFF 0b00000000 // 4 4 ADC bulk N calibration: disabled +#define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_N_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_SX126X_CALIBRATE_ADC_PULSE_OFF 0b00000000 // 3 3 ADC pulse calibration: disabled +#define RADIOLIB_SX126X_CALIBRATE_ADC_PULSE_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_SX126X_CALIBRATE_PLL_OFF 0b00000000 // 2 2 PLL calibration: disabled +#define RADIOLIB_SX126X_CALIBRATE_PLL_ON 0b00000100 // 2 2 enabled +#define RADIOLIB_SX126X_CALIBRATE_RC13M_OFF 0b00000000 // 1 1 13 MHz RC osc. calibration: disabled +#define RADIOLIB_SX126X_CALIBRATE_RC13M_ON 0b00000010 // 1 1 enabled +#define RADIOLIB_SX126X_CALIBRATE_RC64K_OFF 0b00000000 // 0 0 64 kHz RC osc. calibration: disabled +#define RADIOLIB_SX126X_CALIBRATE_RC64K_ON 0b00000001 // 0 0 enabled +#define RADIOLIB_SX126X_CALIBRATE_ALL 0b01111111 // 6 0 calibrate all blocks + +//RADIOLIB_SX126X_CMD_CALIBRATE_IMAGE +#define RADIOLIB_SX126X_CAL_IMG_430_MHZ_1 0x6B +#define RADIOLIB_SX126X_CAL_IMG_430_MHZ_2 0x6F +#define RADIOLIB_SX126X_CAL_IMG_470_MHZ_1 0x75 +#define RADIOLIB_SX126X_CAL_IMG_470_MHZ_2 0x81 +#define RADIOLIB_SX126X_CAL_IMG_779_MHZ_1 0xC1 +#define RADIOLIB_SX126X_CAL_IMG_779_MHZ_2 0xC5 +#define RADIOLIB_SX126X_CAL_IMG_863_MHZ_1 0xD7 +#define RADIOLIB_SX126X_CAL_IMG_863_MHZ_2 0xDB +#define RADIOLIB_SX126X_CAL_IMG_902_MHZ_1 0xE1 +#define RADIOLIB_SX126X_CAL_IMG_902_MHZ_2 0xE9 + +//RADIOLIB_SX126X_CMD_SET_PA_CONFIG +#define RADIOLIB_SX126X_PA_CONFIG_HP_MAX 0x07 +#define RADIOLIB_SX126X_PA_CONFIG_PA_LUT 0x01 +#define RADIOLIB_SX126X_PA_CONFIG_SX1262_8 0x00 + +//RADIOLIB_SX126X_CMD_SET_RX_TX_FALLBACK_MODE +#define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_FS 0x40 // 7 0 after Rx/Tx go to: FS mode +#define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_STDBY_XOSC 0x30 // 7 0 standby with crystal oscillator +#define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_STDBY_RC 0x20 // 7 0 standby with RC oscillator (default) + +//RADIOLIB_SX126X_CMD_SET_DIO_IRQ_PARAMS +#define RADIOLIB_SX126X_IRQ_LR_FHSS_HOP 0b0100000000000000 // 14 14 PA ramped up during LR-FHSS hop +#define RADIOLIB_SX126X_IRQ_TIMEOUT 0b0000001000000000 // 9 9 Rx or Tx timeout +#define RADIOLIB_SX126X_IRQ_CAD_DETECTED 0b0000000100000000 // 8 8 channel activity detected +#define RADIOLIB_SX126X_IRQ_CAD_DONE 0b0000000010000000 // 7 7 channel activity detection finished +#define RADIOLIB_SX126X_IRQ_CRC_ERR 0b0000000001000000 // 6 6 wrong CRC received +#define RADIOLIB_SX126X_IRQ_HEADER_ERR 0b0000000000100000 // 5 5 LoRa header CRC error +#define RADIOLIB_SX126X_IRQ_HEADER_VALID 0b0000000000010000 // 4 4 valid LoRa header received +#define RADIOLIB_SX126X_IRQ_SYNC_WORD_VALID 0b0000000000001000 // 3 3 valid sync word detected +#define RADIOLIB_SX126X_IRQ_RADIOLIB_PREAMBLE_DETECTED 0b0000000000000100 // 2 2 preamble detected +#define RADIOLIB_SX126X_IRQ_RX_DONE 0b0000000000000010 // 1 1 packet received +#define RADIOLIB_SX126X_IRQ_TX_DONE 0b0000000000000001 // 0 0 packet transmission completed +#define RADIOLIB_SX126X_IRQ_RX_DEFAULT 0b0000001001100010 // 14 0 default for Rx (RX_DONE, TIMEOUT, CRC_ERR and HEADER_ERR) +#define RADIOLIB_SX126X_IRQ_ALL 0b0100001111111111 // 14 0 all interrupts +#define RADIOLIB_SX126X_IRQ_NONE 0b0000000000000000 // 14 0 no interrupts + +//RADIOLIB_SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL +#define RADIOLIB_SX126X_DIO2_AS_IRQ 0x00 // 7 0 DIO2 configuration: IRQ +#define RADIOLIB_SX126X_DIO2_AS_RF_SWITCH 0x01 // 7 0 RF switch control + +//RADIOLIB_SX126X_CMD_SET_DIO3_AS_TCXO_CTRL +#define RADIOLIB_SX126X_DIO3_OUTPUT_1_6 0x00 // 7 0 DIO3 voltage output for TCXO: 1.6 V +#define RADIOLIB_SX126X_DIO3_OUTPUT_1_7 0x01 // 7 0 1.7 V +#define RADIOLIB_SX126X_DIO3_OUTPUT_1_8 0x02 // 7 0 1.8 V +#define RADIOLIB_SX126X_DIO3_OUTPUT_2_2 0x03 // 7 0 2.2 V +#define RADIOLIB_SX126X_DIO3_OUTPUT_2_4 0x04 // 7 0 2.4 V +#define RADIOLIB_SX126X_DIO3_OUTPUT_2_7 0x05 // 7 0 2.7 V +#define RADIOLIB_SX126X_DIO3_OUTPUT_3_0 0x06 // 7 0 3.0 V +#define RADIOLIB_SX126X_DIO3_OUTPUT_3_3 0x07 // 7 0 3.3 V + +//RADIOLIB_SX126X_CMD_SET_PACKET_TYPE +#define RADIOLIB_SX126X_PACKET_TYPE_GFSK 0x00 // 7 0 packet type: GFSK +#define RADIOLIB_SX126X_PACKET_TYPE_LORA 0x01 // 7 0 LoRa +#define RADIOLIB_SX126X_PACKET_TYPE_LR_FHSS 0x03 // 7 0 LR-FHSS + +//RADIOLIB_SX126X_CMD_SET_TX_PARAMS +#define RADIOLIB_SX126X_PA_RAMP_10U 0x00 // 7 0 ramp time: 10 us +#define RADIOLIB_SX126X_PA_RAMP_20U 0x01 // 7 0 20 us +#define RADIOLIB_SX126X_PA_RAMP_40U 0x02 // 7 0 40 us +#define RADIOLIB_SX126X_PA_RAMP_80U 0x03 // 7 0 80 us +#define RADIOLIB_SX126X_PA_RAMP_200U 0x04 // 7 0 200 us +#define RADIOLIB_SX126X_PA_RAMP_800U 0x05 // 7 0 800 us +#define RADIOLIB_SX126X_PA_RAMP_1700U 0x06 // 7 0 1700 us +#define RADIOLIB_SX126X_PA_RAMP_3400U 0x07 // 7 0 3400 us + +//RADIOLIB_SX126X_CMD_SET_MODULATION_PARAMS +#define RADIOLIB_SX126X_GFSK_FILTER_NONE 0x00 // 7 0 GFSK filter: none +#define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_3 0x08 // 7 0 Gaussian, BT = 0.3 +#define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_5 0x09 // 7 0 Gaussian, BT = 0.5 +#define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_7 0x0A // 7 0 Gaussian, BT = 0.7 +#define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_1 0x0B // 7 0 Gaussian, BT = 1 +#define RADIOLIB_SX126X_GFSK_RX_BW_4_8 0x1F // 7 0 GFSK Rx bandwidth: 4.8 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_5_8 0x17 // 7 0 5.8 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_7_3 0x0F // 7 0 7.3 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_9_7 0x1E // 7 0 9.7 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_11_7 0x16 // 7 0 11.7 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_14_6 0x0E // 7 0 14.6 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_19_5 0x1D // 7 0 19.5 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_23_4 0x15 // 7 0 23.4 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_29_3 0x0D // 7 0 29.3 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_39_0 0x1C // 7 0 39.0 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_46_9 0x14 // 7 0 46.9 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_58_6 0x0C // 7 0 58.6 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_78_2 0x1B // 7 0 78.2 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_93_8 0x13 // 7 0 93.8 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_117_3 0x0B // 7 0 117.3 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_156_2 0x1A // 7 0 156.2 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_187_2 0x12 // 7 0 187.2 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_234_3 0x0A // 7 0 234.3 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_312_0 0x19 // 7 0 312.0 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_373_6 0x11 // 7 0 373.6 kHz +#define RADIOLIB_SX126X_GFSK_RX_BW_467_0 0x09 // 7 0 467.0 kHz +#define RADIOLIB_SX126X_LORA_BW_7_8 0x00 // 7 0 LoRa bandwidth: 7.8 kHz +#define RADIOLIB_SX126X_LORA_BW_10_4 0x08 // 7 0 10.4 kHz +#define RADIOLIB_SX126X_LORA_BW_15_6 0x01 // 7 0 15.6 kHz +#define RADIOLIB_SX126X_LORA_BW_20_8 0x09 // 7 0 20.8 kHz +#define RADIOLIB_SX126X_LORA_BW_31_25 0x02 // 7 0 31.25 kHz +#define RADIOLIB_SX126X_LORA_BW_41_7 0x0A // 7 0 41.7 kHz +#define RADIOLIB_SX126X_LORA_BW_62_5 0x03 // 7 0 62.5 kHz +#define RADIOLIB_SX126X_LORA_BW_125_0 0x04 // 7 0 125.0 kHz +#define RADIOLIB_SX126X_LORA_BW_250_0 0x05 // 7 0 250.0 kHz +#define RADIOLIB_SX126X_LORA_BW_500_0 0x06 // 7 0 500.0 kHz +#define RADIOLIB_SX126X_LORA_CR_4_5 0x01 // 7 0 LoRa coding rate: 4/5 +#define RADIOLIB_SX126X_LORA_CR_4_6 0x02 // 7 0 4/6 +#define RADIOLIB_SX126X_LORA_CR_4_7 0x03 // 7 0 4/7 +#define RADIOLIB_SX126X_LORA_CR_4_8 0x04 // 7 0 4/8 +#define RADIOLIB_SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_OFF 0x00 // 7 0 LoRa low data rate optimization: disabled +#define RADIOLIB_SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON 0x01 // 7 0 enabled + +//RADIOLIB_SX126X_CMD_SET_PACKET_PARAMS +#define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_OFF 0x00 // 7 0 GFSK minimum preamble length before reception starts: detector disabled +#define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_8 0x04 // 7 0 8 bits +#define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_16 0x05 // 7 0 16 bits +#define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_24 0x06 // 7 0 24 bits +#define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_32 0x07 // 7 0 32 bits +#define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_OFF 0x00 // 7 0 GFSK address filtering: disabled +#define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_NODE 0x01 // 7 0 node only +#define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST 0x02 // 7 0 node and broadcast +#define RADIOLIB_SX126X_GFSK_PACKET_FIXED 0x00 // 7 0 GFSK packet type: fixed (payload length known in advance to both sides) +#define RADIOLIB_SX126X_GFSK_PACKET_VARIABLE 0x01 // 7 0 variable (payload length added to packet) +#define RADIOLIB_SX126X_GFSK_CRC_OFF 0x01 // 7 0 GFSK packet CRC: disabled +#define RADIOLIB_SX126X_GFSK_CRC_1_BYTE 0x00 // 7 0 1 byte +#define RADIOLIB_SX126X_GFSK_CRC_2_BYTE 0x02 // 7 0 2 byte +#define RADIOLIB_SX126X_GFSK_CRC_1_BYTE_INV 0x04 // 7 0 1 byte, inverted +#define RADIOLIB_SX126X_GFSK_CRC_2_BYTE_INV 0x06 // 7 0 2 byte, inverted +#define RADIOLIB_SX126X_GFSK_WHITENING_OFF 0x00 // 7 0 GFSK data whitening: disabled +#define RADIOLIB_SX126X_GFSK_WHITENING_ON 0x01 // 7 0 enabled +#define RADIOLIB_SX126X_LORA_HEADER_EXPLICIT 0x00 // 7 0 LoRa header mode: explicit +#define RADIOLIB_SX126X_LORA_HEADER_IMPLICIT 0x01 // 7 0 implicit +#define RADIOLIB_SX126X_LORA_CRC_OFF 0x00 // 7 0 LoRa CRC mode: disabled +#define RADIOLIB_SX126X_LORA_CRC_ON 0x01 // 7 0 enabled +#define RADIOLIB_SX126X_LORA_IQ_STANDARD 0x00 // 7 0 LoRa IQ setup: standard +#define RADIOLIB_SX126X_LORA_IQ_INVERTED 0x01 // 7 0 inverted + +//RADIOLIB_SX126X_CMD_SET_CAD_PARAMS +#define RADIOLIB_SX126X_CAD_ON_1_SYMB 0x00 // 7 0 number of symbols used for CAD: 1 +#define RADIOLIB_SX126X_CAD_ON_2_SYMB 0x01 // 7 0 2 +#define RADIOLIB_SX126X_CAD_ON_4_SYMB 0x02 // 7 0 4 +#define RADIOLIB_SX126X_CAD_ON_8_SYMB 0x03 // 7 0 8 +#define RADIOLIB_SX126X_CAD_ON_16_SYMB 0x04 // 7 0 16 +#define RADIOLIB_SX126X_CAD_GOTO_STDBY 0x00 // 7 0 after CAD is done, always go to STDBY_RC mode +#define RADIOLIB_SX126X_CAD_GOTO_RX 0x01 // 7 0 after CAD is done, go to Rx mode if activity is detected +#define RADIOLIB_SX126X_CAD_PARAM_DEFAULT 0xFF // 7 0 used by the CAD methods to specify default parameter value +#define RADIOLIB_SX126X_CAD_PARAM_DET_MIN 10 // 7 0 default detMin CAD parameter + +//RADIOLIB_SX126X_CMD_GET_STATUS +#define RADIOLIB_SX126X_STATUS_MODE_STDBY_RC 0b00100000 // 6 4 current chip mode: STDBY_RC +#define RADIOLIB_SX126X_STATUS_MODE_STDBY_XOSC 0b00110000 // 6 4 STDBY_XOSC +#define RADIOLIB_SX126X_STATUS_MODE_FS 0b01000000 // 6 4 FS +#define RADIOLIB_SX126X_STATUS_MODE_RX 0b01010000 // 6 4 RX +#define RADIOLIB_SX126X_STATUS_MODE_TX 0b01100000 // 6 4 TX +#define RADIOLIB_SX126X_STATUS_DATA_AVAILABLE 0b00000100 // 3 1 command status: packet received and data can be retrieved +#define RADIOLIB_SX126X_STATUS_CMD_TIMEOUT 0b00000110 // 3 1 SPI command timed out +#define RADIOLIB_SX126X_STATUS_CMD_INVALID 0b00001000 // 3 1 invalid SPI command +#define RADIOLIB_SX126X_STATUS_CMD_FAILED 0b00001010 // 3 1 SPI command failed to execute +#define RADIOLIB_SX126X_STATUS_TX_DONE 0b00001100 // 3 1 packet transmission done +#define RADIOLIB_SX126X_STATUS_SPI_FAILED 0b11111111 // 7 0 SPI transaction failed + +//RADIOLIB_SX126X_CMD_GET_PACKET_STATUS +#define RADIOLIB_SX126X_GFSK_RX_STATUS_PREAMBLE_ERR 0b10000000 // 7 7 GFSK Rx status: preamble error +#define RADIOLIB_SX126X_GFSK_RX_STATUS_SYNC_ERR 0b01000000 // 6 6 sync word error +#define RADIOLIB_SX126X_GFSK_RX_STATUS_ADRS_ERR 0b00100000 // 5 5 address error +#define RADIOLIB_SX126X_GFSK_RX_STATUS_CRC_ERR 0b00010000 // 4 4 CRC error +#define RADIOLIB_SX126X_GFSK_RX_STATUS_LENGTH_ERR 0b00001000 // 3 3 length error +#define RADIOLIB_SX126X_GFSK_RX_STATUS_ABORT_ERR 0b00000100 // 2 2 abort error +#define RADIOLIB_SX126X_GFSK_RX_STATUS_PACKET_RECEIVED 0b00000010 // 2 2 packet received +#define RADIOLIB_SX126X_GFSK_RX_STATUS_PACKET_SENT 0b00000001 // 2 2 packet sent + +//RADIOLIB_SX126X_CMD_GET_DEVICE_ERRORS +#define RADIOLIB_SX126X_PA_RAMP_ERR 0b100000000 // 8 8 device errors: PA ramping failed +#define RADIOLIB_SX126X_PLL_LOCK_ERR 0b001000000 // 6 6 PLL failed to lock +#define RADIOLIB_SX126X_XOSC_START_ERR 0b000100000 // 5 5 crystal oscillator failed to start +#define RADIOLIB_SX126X_IMG_CALIB_ERR 0b000010000 // 4 4 image calibration failed +#define RADIOLIB_SX126X_ADC_CALIB_ERR 0b000001000 // 3 3 ADC calibration failed +#define RADIOLIB_SX126X_PLL_CALIB_ERR 0b000000100 // 2 2 PLL calibration failed +#define RADIOLIB_SX126X_RC13M_CALIB_ERR 0b000000010 // 1 1 RC13M calibration failed +#define RADIOLIB_SX126X_RC64K_CALIB_ERR 0b000000001 // 0 0 RC64K calibration failed + +//RADIOLIB_SX126X_CMD_SET_LBT_SCAN_PARAMS + RADIOLIB_SX126X_CMD_SET_SPECTR_SCAN_PARAMS +#define RADIOLIB_SX126X_SCAN_INTERVAL_7_68_US 10 // 7 0 RSSI reading interval: 7.68 us +#define RADIOLIB_SX126X_SCAN_INTERVAL_8_20_US 11 // 7 0 8.20 us +#define RADIOLIB_SX126X_SCAN_INTERVAL_8_68_US 12 // 7 0 8.68 us + +// SX126X SPI register variables +//RADIOLIB_SX126X_REG_HOPPING_ENABLE +#define RADIOLIB_SX126X_HOPPING_ENABLED 0b00000001 // 0 0 intra-packet hopping for LR-FHSS: enabled +#define RADIOLIB_SX126X_HOPPING_DISABLED 0b00000000 // 0 0 (disabled) + +//RADIOLIB_SX126X_REG_LORA_SYNC_WORD_MSB + LSB +#define RADIOLIB_SX126X_SYNC_WORD_PUBLIC 0x34 // actually 0x3444 NOTE: The low nibbles in each byte (0x_4_4) are masked out since apparently, they're reserved. +#define RADIOLIB_SX126X_SYNC_WORD_PRIVATE 0x12 // actually 0x1424 You couldn't make this up if you tried. + +// RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1 +#define RADIOLIB_SX126X_TX_BITBANG_1_DISABLED 0b00000000 // 6 4 Tx bitbang: disabled (default) +#define RADIOLIB_SX126X_TX_BITBANG_1_ENABLED 0b00010000 // 6 4 enabled + +// RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0 +#define RADIOLIB_SX126X_TX_BITBANG_0_DISABLED 0b00000000 // 3 0 Tx bitbang: disabled (default) +#define RADIOLIB_SX126X_TX_BITBANG_0_ENABLED 0b00001100 // 3 0 enabled + +// RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE +#define RADIOLIB_SX126X_DIO1_OUT_DISABLED 0b00000010 // 1 1 DIO1 output: disabled +#define RADIOLIB_SX126X_DIO1_OUT_ENABLED 0b00000000 // 1 1 enabled +#define RADIOLIB_SX126X_DIO2_OUT_DISABLED 0b00000100 // 2 2 DIO2 output: disabled +#define RADIOLIB_SX126X_DIO2_OUT_ENABLED 0b00000000 // 2 2 enabled +#define RADIOLIB_SX126X_DIO3_OUT_DISABLED 0b00001000 // 3 3 DIO3 output: disabled +#define RADIOLIB_SX126X_DIO3_OUT_ENABLED 0b00000000 // 3 3 enabled + +// RADIOLIB_SX126X_REG_DIOX_IN_ENABLE +#define RADIOLIB_SX126X_DIO1_IN_DISABLED 0b00000000 // 1 1 DIO1 input: disabled +#define RADIOLIB_SX126X_DIO1_IN_ENABLED 0b00000010 // 1 1 enabled +#define RADIOLIB_SX126X_DIO2_IN_DISABLED 0b00000000 // 2 2 DIO2 input: disabled +#define RADIOLIB_SX126X_DIO2_IN_ENABLED 0b00000100 // 2 2 enabled +#define RADIOLIB_SX126X_DIO3_IN_DISABLED 0b00000000 // 3 3 DIO3 input: disabled +#define RADIOLIB_SX126X_DIO3_IN_ENABLED 0b00001000 // 3 3 enabled + +// RADIOLIB_SX126X_REG_RX_GAIN +#define RADIOLIB_SX126X_RX_GAIN_BOOSTED 0x96 // 7 0 Rx gain: boosted +#define RADIOLIB_SX126X_RX_GAIN_POWER_SAVING 0x94 // 7 0 power saving +#define RADIOLIB_SX126X_RX_GAIN_SPECTRAL_SCAN 0xCB // 7 0 spectral scan + +// RADIOLIB_SX126X_REG_PATCH_UPDATE_ENABLE +#define RADIOLIB_SX126X_PATCH_UPDATE_DISABLED 0b00000000 // 4 4 patch update: disabled +#define RADIOLIB_SX126X_PATCH_UPDATE_ENABLED 0b00010000 // 4 4 enabled + +// RADIOLIB_SX126X_REG_SPECTRAL_SCAN_STATUS +#define RADIOLIB_SX126X_SPECTRAL_SCAN_NONE 0x00 // 7 0 spectral scan status: none +#define RADIOLIB_SX126X_SPECTRAL_SCAN_ONGOING 0x0F // 7 0 ongoing +#define RADIOLIB_SX126X_SPECTRAL_SCAN_ABORTED 0xF0 // 7 0 aborted +#define RADIOLIB_SX126X_SPECTRAL_SCAN_COMPLETED 0xFF // 7 0 completed + +// RADIOLIB_SX126X_REG_RSSI_AVG_WINDOW +#define RADIOLIB_SX126X_SPECTRAL_SCAN_WINDOW_DEFAULT (0x05 << 2) // 7 0 default RSSI average window + +// RADIOLIB_SX126X_REG_ANA_LNA +#define RADIOLIB_SX126X_LNA_RNG_DISABLED 0b00000001 // 0 0 random number: disabled +#define RADIOLIB_SX126X_LNA_RNG_ENABLED 0b00000000 // 0 0 enabled + +// RADIOLIB_SX126X_REG_ANA_MIXER +#define RADIOLIB_SX126X_MIXER_RNG_DISABLED 0b00000001 // 7 7 random number: disabled +#define RADIOLIB_SX126X_MIXER_RNG_ENABLED 0b00000000 // 7 7 enabled + +// size of the spectral scan result +#define RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE (33) + +/*! + \class SX126x + \brief Base class for %SX126x series. All derived classes for %SX126x (e.g. SX1262 or SX1268) inherit from this base class. + This class should not be instantiated directly from Arduino sketch, only from its derived classes. +*/ +class SX126x: public PhysicalLayer { + public: + // introduce PhysicalLayer overloads + using PhysicalLayer::transmit; + using PhysicalLayer::receive; + using PhysicalLayer::startTransmit; + using PhysicalLayer::readData; + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX126x(Module* mod); + + Module* getMod(); + + /*! + \brief Whether the module has an XTAL (true) or TCXO (false). Defaults to false. + */ + bool XTAL; + + // basic methods + + /*! + \brief Initialization method for LoRa modem. + \param cr LoRa coding rate denominator. Allowed values range from 5 to 8. + \param syncWord 1-byte LoRa sync word. + \param preambleLength LoRa preamble length in symbols. Allowed values range from 1 to 65535. + \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 1.6 V, set to 0 to skip. + \param useRegulatorLDO Whether to use only LDO regulator (true) or DC-DC regulator (false). Defaults to false. + \returns \ref status_codes + */ + int16_t begin(uint8_t cr, uint8_t syncWord, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO = false); + + /*! + \brief Initialization method for FSK modem. + \param br FSK bit rate in kbps. Allowed values range from 0.6 to 300.0 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz. Allowed values range from 0.0 to 200.0 kHz. + \param rxBw Receiver bandwidth in kHz. Allowed values are 4.8, 5.8, 7.3, 9.7, 11.7, 14.6, 19.5, 23.4, 29.3, 39.0, + 46.9, 58.6, 78.2, 93.8, 117.3, 156.2, 187.2, 234.3, 312.0, 373.6 and 467.0 kHz. + \param preambleLength FSK preamble length in bits. Allowed values range from 0 to 65535. + \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 1.6 V, set to 0 to skip. + \param useRegulatorLDO Whether to use only LDO regulator (true) or DC-DC regulator (false). Defaults to false. + \returns \ref status_codes + */ + int16_t beginFSK(float br, float freqDev, float rxBw, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO = false); + + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + \param verify Whether correct module startup should be verified. When set to true, RadioLib will attempt to verify the module has started correctly + by repeatedly issuing setStandby command. Enabled by default. + \returns \ref status_codes + */ + int16_t reset(bool verify = true); + + /*! + \brief Blocking binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Address to send the data to. Will only be added if address filtering was enabled. + \returns \ref status_codes + */ + int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Blocking binary receive method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \returns \ref status_codes + */ + int16_t receive(uint8_t* data, size_t len) override; + + /*! + \brief Starts direct mode transmission. + \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0) override; + + /*! + \brief Starts direct mode reception. Only implemented for PhysicalLayer compatibility, as %SX126x series does not support direct mode reception. + Will always return RADIOLIB_ERR_UNKNOWN. + \returns \ref status_codes + */ + int16_t receiveDirect() override; + + /*! + \brief Performs scan for LoRa transmission in the current channel. Detects both preamble and payload. + \returns \ref status_codes + */ + int16_t scanChannel() override; + + /*! + \brief Performs scan for LoRa transmission in the current channel. Detects both preamble and payload. + \param symbolNum Number of symbols for CAD detection. Defaults to the value recommended by AN1200.48. + \param detPeak Peak value for CAD detection. Defaults to the value recommended by AN1200.48. + \param detMin Minimum value for CAD detection. Defaults to the value recommended by AN1200.48. + \returns \ref status_codes + */ + int16_t scanChannel(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin); + + /*! + \brief Sets the module to sleep mode. To wake the device up, call standby(). + \param retainConfig Set to true to retain configuration of the currently active modem ("warm start") + or to false to discard current configuration ("cold start"). Defaults to true. + \returns \ref status_codes + */ + int16_t sleep(bool retainConfig = true); + + /*! + \brief Sets the module to standby mode (overload for PhysicalLayer compatibility, uses 13 MHz RC oscillator). + \returns \ref status_codes + */ + int16_t standby() override; + + /*! + \brief Sets the module to standby mode. + \param mode Oscillator to be used in standby mode. Can be set to RADIOLIB_SX126X_STANDBY_RC (13 MHz RC oscillator) + or RADIOLIB_SX126X_STANDBY_XOSC (32 MHz external crystal oscillator). + \param wakeup Whether to force the module to wake up. Setting to true will immediately attempt to wake up the module. + \returns \ref status_codes + */ + int16_t standby(uint8_t mode, bool wakeup = true); + + // interrupt methods + + /*! + \brief Sets interrupt service routine to call when DIO1 activates. + \param func ISR to call. + */ + void setDio1Action(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when DIO1 activates. + */ + void clearDio1Action(); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + void clearPacketSentAction(); + + /*! + \brief Sets interrupt service routine to call when a channel scan is finished. + \param func ISR to call. + */ + void setChannelScanAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a channel scan is finished. + */ + void clearChannelScanAction(); + + /*! + \brief Interrupt-driven binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Address to send the data to. Will only be added if address filtering was enabled. + \returns \ref status_codes + */ + int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Clean up after transmission is done. + \returns \ref status_codes + */ + int16_t finishTransmit() override; + + /*! + \brief Interrupt-driven receive method with default parameters. + Implemented for compatibility with PhysicalLayer. + + \returns \ref status_codes + */ + int16_t startReceive(); + + /*! + \brief Interrupt-driven receive method. DIO1 will be activated when full packet is received. + \param timeout Receive mode type and/or raw timeout value, expressed as multiples of 15.625 us. + When set to RADIOLIB_SX126X_RX_TIMEOUT_INF, the timeout will be infinite and the device will remain + in Rx mode until explicitly commanded to stop (Rx continuous mode). + When set to RADIOLIB_SX126X_RX_TIMEOUT_NONE, there will be no timeout and the device will return + to standby when a packet is received (Rx single mode). + For any other value, timeout will be applied and signal will be generated on DIO1 for conditions + defined by irqFlags and irqMask. + + \param irqFlags Sets the IRQ flags, defaults to RADIOLIB_SX126X_IRQ_RX_DEFAULT. + \param irqMask Sets the mask of IRQ flags that will trigger DIO1, defaults to RADIOLIB_SX126X_IRQ_RX_DONE. + \param len Only for PhysicalLayer compatibility, not used. + \returns \ref status_codes + */ + int16_t startReceive(uint32_t timeout, uint16_t irqFlags = RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX126X_IRQ_RX_DONE, size_t len = 0); + + /*! + \brief Interrupt-driven receive method where the device mostly sleeps and periodically wakes to listen. + Note that this function assumes the unit will take 500us + TCXO_delay to change state. + See datasheet section 13.1.7, version 1.2. + \param rxPeriod The duration the receiver will be in Rx mode, in microseconds. + \param sleepPeriod The duration the receiver will not be in Rx mode, in microseconds. + \param irqFlags Sets the IRQ flags, defaults to RADIOLIB_SX126X_IRQ_RX_DEFAULT. + \param irqMask Sets the mask of IRQ flags that will trigger DIO1, defaults to RADIOLIB_SX126X_IRQ_RX_DONE. + \returns \ref status_codes + */ + int16_t startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod, uint16_t irqFlags = RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX126X_IRQ_RX_DONE); + + /*! + \brief Calls \ref startReceiveDutyCycle with rxPeriod and sleepPeriod set so the unit shouldn't miss any messages. + \param senderPreambleLength Expected preamble length of the messages to receive. + If set to zero, the currently configured preamble length will be used. Defaults to zero. + + \param minSymbols Parameters will be chosen to ensure that the unit will catch at least this many symbols + of any preamble of the specified length. Defaults to 8. + According to Semtech, receiver requires 8 symbols to reliably latch a preamble. + This makes this method redundant when transmitter preamble length is less than 17 (2*minSymbols + 1). + + \param irqFlags Sets the IRQ flags, defaults to RADIOLIB_SX126X_IRQ_RX_DEFAULT. + \param irqMask Sets the mask of IRQ flags that will trigger DIO1, defaults to RADIOLIB_SX126X_IRQ_RX_DONE. + \returns \ref status_codes + */ + int16_t startReceiveDutyCycleAuto(uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8, uint16_t irqFlags = RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX126X_IRQ_RX_DONE); + + /*! + \brief Reads the current IRQ status. + \returns IRQ status bits + */ + uint16_t getIrqStatus(); + + /*! + \brief Reads data received after calling startReceive method. When the packet length is not known in advance, + getPacketLength method must be called BEFORE calling readData! + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be read. When set to 0, the packet length will be retrieved automatically. + When more bytes than received are requested, only the number of bytes requested will be returned. + \returns \ref status_codes + */ + int16_t readData(uint8_t* data, size_t len) override; + + /*! + \brief Interrupt-driven channel activity detection method. DIO1 will be activated + when LoRa preamble is detected, or upon timeout. Defaults to CAD parameter values recommended by AN1200.48. + \returns \ref status_codes + */ + int16_t startChannelScan() override; + + /*! + \brief Interrupt-driven channel activity detection method. DIO1 will be activated + when LoRa preamble is detected, or upon timeout. + \param symbolNum Number of symbols for CAD detection. + \param detPeak Peak value for CAD detection. + \param detMin Minimum value for CAD detection. + \returns \ref status_codes + */ + int16_t startChannelScan(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin); + + /*! + \brief Read the channel scan result + \returns \ref status_codes + */ + int16_t getChannelScanResult() override; + + // configuration methods + + /*! + \brief Sets LoRa bandwidth. Allowed values are 7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125.0, 250.0 and 500.0 kHz. + \param bw LoRa bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setBandwidth(float bw); + + /*! + \brief Sets LoRa spreading factor. Allowed values range from 5 to 12. + \param sf LoRa spreading factor to be set. + \returns \ref status_codes + */ + int16_t setSpreadingFactor(uint8_t sf); + + /*! + \brief Sets LoRa coding rate denominator. Allowed values range from 5 to 8. + \param cr LoRa coding rate denominator to be set. + \returns \ref status_codes + */ + int16_t setCodingRate(uint8_t cr); + + /*! + \brief Sets LoRa sync word. + \param syncWord LoRa sync word to be set. + \param controlBits Undocumented control bits, required for compatibility purposes. + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t syncWord, uint8_t controlBits = 0x44); + + /*! + \brief Sets current protection limit. Can be set in 2.5 mA steps. + \param currentLimit current protection limit to be set in mA. Allowed values range from 0 to 140. + \returns \ref status_codes + */ + int16_t setCurrentLimit(float currentLimit); + + /*! + \brief Reads current protection limit. + \returns Currently configured overcurrent protection limit in mA. + */ + float getCurrentLimit(); + + /*! + \brief Sets preamble length for LoRa or FSK modem. Allowed values range from 1 to 65535. + \param preambleLength Preamble length to be set in symbols (LoRa) or bits (FSK). + \returns \ref status_codes + */ + int16_t setPreambleLength(size_t preambleLength) override; + + /*! + \brief Sets FSK frequency deviation. Allowed values range from 0.0 to 200.0 kHz. + \param freqDev FSK frequency deviation to be set in kHz. + \returns \ref status_codes + */ + int16_t setFrequencyDeviation(float freqDev) override; + + /*! + \brief Sets FSK bit rate. Allowed values range from 0.6 to 300.0 kbps. + \param br FSK bit rate to be set in kbps. + \returns \ref status_codes + */ + int16_t setBitRate(float br); + + /*! + \brief Set data. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t setDataRate(DataRate_t dr) override; + + /*! + \brief Sets FSK receiver bandwidth. Allowed values are 4.8, 5.8, 7.3, 9.7, 11.7, 14.6, 19.5, + 23.4, 29.3, 39.0, 46.9, 58.6, 78.2, 93.8, 117.3, 156.2, 187.2, 234.3, 312.0, 373.6 and 467.0 kHz. + \param rxBw FSK receiver bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setRxBandwidth(float rxBw); + + /*! + \brief Enables or disables Rx Boosted Gain mode as described in SX126x datasheet + section 9.6 (SX1261/2 v2.1, SX1268 v1.1) + \param rxbgm True for Rx Boosted Gain, false for Rx Power Saving Gain + \param persist True to persist Rx gain setting when waking up from warm-start mode + (e.g. when using Rx duty cycle mode). + \returns \ref status_codes + */ + int16_t setRxBoostedGainMode(bool rxbgm, bool persist = true); + + /*! + \brief Sets time-bandwidth product of Gaussian filter applied for shaping. + Allowed values are RADIOLIB_SHAPING_0_3, RADIOLIB_SHAPING_0_5, RADIOLIB_SHAPING_0_7 or RADIOLIB_SHAPING_1_0. + Set to RADIOLIB_SHAPING_NONE to disable data shaping. + \param sh Time-bandwidth product of Gaussian filter to be set. + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! + \brief Sets FSK sync word in the form of array of up to 8 bytes. + \param syncWord FSK sync word to be set. + \param len FSK sync word length in bytes. + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t* syncWord, size_t len) override; + + /*! + \brief Sets FSK sync word in the form of array of up to 8 bytes. + \param syncWord FSK sync word to be set. + \param bitsLen FSK sync word length in bits. If length is not divisible by 8, + least significant bits of syncWord will be ignored. + \returns \ref status_codes + */ + int16_t setSyncBits(uint8_t *syncWord, uint8_t bitsLen); + + /*! + \brief Sets node address. Calling this method will also enable address filtering for node address only. + \param nodeAddr Node address to be set. + \returns \ref status_codes + */ + int16_t setNodeAddress(uint8_t nodeAddr); + + /*! + \brief Sets broadcast address. Calling this method will also enable address + filtering for node and broadcast address. + \param broadAddr Node address to be set. + \returns \ref status_codes + */ + int16_t setBroadcastAddress(uint8_t broadAddr); + + /*! + \brief Disables address filtering. Calling this method will also erase previously set addresses. + \returns \ref status_codes + */ + int16_t disableAddressFiltering(); + + /*! + \brief Sets CRC configuration. + \param len CRC length in bytes, Allowed values are 1 or 2, set to 0 to disable CRC. + \param initial Initial CRC value. FSK only. Defaults to 0x1D0F (CCIT CRC). + \param polynomial Polynomial for CRC calculation. FSK only. Defaults to 0x1021 (CCIT CRC). + \param inverted Invert CRC bytes. FSK only. Defaults to true (CCIT CRC). + \returns \ref status_codes + */ + int16_t setCRC(uint8_t len, uint16_t initial = 0x1D0F, uint16_t polynomial = 0x1021, bool inverted = true); + + /*! + \brief Sets FSK whitening parameters. + \param enabled True = Whitening enabled + \param initial Initial value used for the whitening LFSR in FSK mode. + By default set to 0x01FF for compatibility with SX127x and LoRaWAN. + \returns \ref status_codes + */ + int16_t setWhitening(bool enabled, uint16_t initial = 0x01FF); + + /*! + \brief Sets TCXO (Temperature Compensated Crystal Oscillator) configuration. + \param voltage TCXO reference voltage in volts. Allowed values are 1.6, 1.7, 1.8, 2.2. 2.4, 2.7, 3.0 and 3.3 V. + Set to 0 to disable TCXO. + NOTE: After setting this parameter to 0, the module will be reset (since there's no other way to disable TCXO). + + \param delay TCXO timeout in us. Defaults to 5000 us. + \returns \ref status_codes + */ + int16_t setTCXO(float voltage, uint32_t delay = 5000); + + /*! + \brief Set DIO2 to function as RF switch (default in Semtech example designs). + \returns \ref status_codes + */ + int16_t setDio2AsRfSwitch(bool enable = true); + + /*! + \brief Gets effective data rate for the last transmitted packet. The value is calculated only for payload bytes. + \returns Effective data rate in bps. + */ + float getDataRate() const; + + /*! + \brief GetsRSSI (Recorded Signal Strength Indicator). + \param packet Whether to read last packet RSSI, or the current value. + \returns RSSI value in dBm. + */ + float getRSSI(bool packet = true); + + /*! + \brief Gets SNR (Signal to Noise Ratio) of the last received packet. Only available for LoRa modem. + \returns SNR of the last received packet in dB. + */ + float getSNR(); + + /*! + \brief Gets frequency error of the latest received packet. + WARNING: This functionality is based on SX128x implementation and not documented on SX126x. + While it seems to be working, it should be used with caution! + + \returns Frequency error in Hz. + */ + float getFrequencyError(); + + /*! + \brief Query modem for the packet length of received payload. + \param update Update received packet length. Will return cached value when set to false. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update = true) override; + + /*! + \brief Set modem in fixed packet length mode. Available in FSK mode only. + \param len Packet length. + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_SX126X_MAX_PACKET_LENGTH); + + /*! + \brief Set modem in variable packet length mode. Available in FSK mode only. + \param len Maximum packet length. + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_SX126X_MAX_PACKET_LENGTH); + + /*! + \brief Get expected time-on-air for a given size of payload + \param len Payload length in bytes. + \returns Expected time-on-air in microseconds. + */ + uint32_t getTimeOnAir(size_t len) override; + + /*! + \brief Set implicit header mode for future reception/transmission. + \param len Payload length in bytes. + \returns \ref status_codes + */ + int16_t implicitHeader(size_t len); + + /*! + \brief Set explicit header mode for future reception/transmission. + \returns \ref status_codes + */ + int16_t explicitHeader(); + + /*! + \brief Set regulator mode to LDO. + \returns \ref status_codes + */ + int16_t setRegulatorLDO(); + + /*! + \brief Set regulator mode to DC-DC. + \returns \ref status_codes + */ + int16_t setRegulatorDCDC(); + + /*! + \brief Sets transmission encoding. Available in FSK mode only. Serves only as alias for PhysicalLayer compatibility. + \param encoding Encoding to be used. Set to 0 for NRZ, and 2 for whitening. + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding) override; + + /*! \copydoc Module::setRfSwitchPins */ + void setRfSwitchPins(uint32_t rxEn, uint32_t txEn); + + /*! \copydoc Module::setRfSwitchTable */ + void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]); + + /*! + \brief Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method, + LDRO will always be set to the provided value, regardless of symbol length. + To re-enable automatic LDRO configuration, call SX126x::autoLDRO() + + \param enable Force LDRO to be always enabled (true) or disabled (false). + \returns \ref status_codes + */ + int16_t forceLDRO(bool enable); + + /*! + \brief Re-enables automatic LDRO configuration. Only available in LoRa mode. + After calling this method, LDRO will be enabled automatically when symbol length exceeds 16 ms. + + \returns \ref status_codes + */ + int16_t autoLDRO(); + + /*! + \brief Get one truly random byte from RSSI noise. + \returns TRNG byte. + */ + uint8_t randomByte(); + + /*! + \brief Enable/disable inversion of the I and Q signals + \param enable QI inversion enabled (true) or disabled (false); + \returns \ref status_codes + */ + int16_t invertIQ(bool enable) override; + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + /*! + \brief Set interrupt service routine function to call when data bit is received in direct mode. + \param func Pointer to interrupt service routine. + */ + void setDirectAction(void (*func)(void)); + + /*! + \brief Function to read and process data bit in direct reception mode. + \param pin Pin on which to read. + */ + void readBit(uint32_t pin); + #endif + + /*! + \brief Upload binary patch into the SX126x device RAM. + Patch is needed to e.g., enable spectral scan and must be uploaded again on every power cycle. + \param patch Binary patch to upload. + \param len Length of the binary patch in 4-byte words. + \param nonvolatile Set to true when the patch is saved in non-volatile memory of the host processor, + or to false when the patch is in its RAM. + \returns \ref status_codes + */ + int16_t uploadPatch(const uint32_t* patch, size_t len, bool nonvolatile = true); + + /*! + \brief Start spectral scan. Requires binary path to be uploaded. + \param numSamples Number of samples for each scan. Fewer samples = better temporal resolution. + \param window RSSI averaging window size. + \param interval Scan interval length, one of RADIOLIB_SX126X_SCAN_INTERVAL_* macros. + \returns \ref status_codes + */ + int16_t spectralScanStart(uint16_t numSamples, uint8_t window = RADIOLIB_SX126X_SPECTRAL_SCAN_WINDOW_DEFAULT, uint8_t interval = RADIOLIB_SX126X_SCAN_INTERVAL_8_20_US); + + /*! + \brief Abort an ongoing spectral scan. + */ + void spectralScanAbort(); + + /*! + \brief Read the status of spectral scan. + \returns \ref status_codes + */ + int16_t spectralScanGetStatus(); + + /*! + \brief Read the result of spectral scan. + \param results Array to which the results will be saved, must be RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE long. + \returns \ref status_codes + */ + int16_t spectralScanGetResult(uint16_t* results); + + /*! + \brief Set the PA configuration. Allows user to optimize PA for a specific output power + and matching network. Any calls to this method must be done after calling begin/beginFSK and/or setOutputPower. + WARNING: Use at your own risk! Setting invalid values can and will lead to permanent damage! + \param paDutyCycle PA duty cycle raw value. + \param deviceSel Device select, usually RADIOLIB_SX126X_PA_CONFIG_SX1261, + RADIOLIB_SX126X_PA_CONFIG_SX1262 or RADIOLIB_SX126X_PA_CONFIG_SX1268. + \param hpMax hpMax raw value. + \param paLut paLut PA lookup table raw value. + \returns \ref status_codes + */ + int16_t setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMax = RADIOLIB_SX126X_PA_CONFIG_HP_MAX, uint8_t paLut = RADIOLIB_SX126X_PA_CONFIG_PA_LUT); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + // SX126x SPI command implementations + int16_t setFs(); + int16_t setTx(uint32_t timeout = 0); + int16_t setRx(uint32_t timeout); + int16_t setCad(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin); + int16_t writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes); + int16_t readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes); + int16_t writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset = 0x00); + int16_t readBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset = 0x00); + int16_t setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask = RADIOLIB_SX126X_IRQ_NONE, uint16_t dio3Mask = RADIOLIB_SX126X_IRQ_NONE); + virtual int16_t clearIrqStatus(uint16_t clearIrqParams = RADIOLIB_SX126X_IRQ_ALL); + int16_t setRfFrequency(uint32_t frf); + int16_t calibrateImage(uint8_t* data); + uint8_t getPacketType(); + int16_t setTxParams(uint8_t power, uint8_t rampTime = RADIOLIB_SX126X_PA_RAMP_200U); + int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro); + int16_t setModulationParamsFSK(uint32_t br, uint8_t sh, uint8_t rxBw, uint32_t freqDev); + int16_t setPacketParams(uint16_t preambleLen, uint8_t crcType, uint8_t payloadLen, uint8_t hdrType, uint8_t invertIQ); + int16_t setPacketParamsFSK(uint16_t preambleLen, uint8_t crcType, uint8_t syncWordLen, uint8_t addrCmp, uint8_t whiten, uint8_t packType = RADIOLIB_SX126X_GFSK_PACKET_VARIABLE, uint8_t payloadLen = 0xFF, uint8_t preambleDetectorLen = RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_16); + int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00); + int16_t setRegulatorMode(uint8_t mode); + uint8_t getStatus(); + uint32_t getPacketStatus(); + uint16_t getDeviceErrors(); + int16_t clearDeviceErrors(); + + int16_t startReceiveCommon(uint32_t timeout = RADIOLIB_SX126X_RX_TIMEOUT_INF, uint16_t irqFlags = RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX126X_IRQ_RX_DONE); + int16_t setFrequencyRaw(float freq); + int16_t setPacketMode(uint8_t mode, uint8_t len); + int16_t setHeaderType(uint8_t hdrType, size_t len = 0xFF); + int16_t directMode(); + int16_t packetMode(); + + // fixes to errata + int16_t fixSensitivity(); + int16_t fixPaClamping(bool enable = true); + int16_t fixImplicitTimeout(); + int16_t fixInvertedIQ(uint8_t iqConfig); + +#if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) + protected: +#endif + Module* mod; + + // common low-level SPI interface + static int16_t SPIparseStatus(uint8_t in); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + + uint8_t bandwidth = 0, spreadingFactor = 0, codingRate = 0, ldrOptimize = 0, crcTypeLoRa = 0, headerType = 0; + uint16_t preambleLengthLoRa = 0; + float bandwidthKhz = 0; + bool ldroAuto = true; + + uint32_t bitRate = 0, frequencyDev = 0; + uint8_t rxBandwidth = 0, pulseShape = 0, crcTypeFSK = 0, syncWordLength = 0, addrComp = 0, whitening = 0, packetType = 0; + uint16_t preambleLengthFSK = 0; + float rxBandwidthKhz = 0; + + float dataRateMeasured = 0; + + uint32_t tcxoDelay = 0; + + size_t implicitLen = 0; + uint8_t invertIQEnabled = RADIOLIB_SX126X_LORA_IQ_STANDARD; + const char* chipType; + + // Allow subclasses to define different TX modes + uint8_t txMode = Module::MODE_TX; + + int16_t config(uint8_t modem); + bool findChip(const char* verStr); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/patches/SX126x_patch_scan.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/patches/SX126x_patch_scan.h new file mode 100644 index 00000000..3dff7be8 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX126x/patches/SX126x_patch_scan.h @@ -0,0 +1,110 @@ +/* +Binary in this file originates from https://github.com/Lora-net/sx1302_hal/tree/master +As such, license of the above repository is reproduced here. + +Copyright (c) 2019, SEMTECH S.A. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Semtech corporation nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL SEMTECH S.A. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#if !defined(_RADIOLIB_SX126X_PATCH_SCAN_H) +#define _RADIOLIB_SX126X_PATCH_SCAN_H + +#include "../../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX126X) + +// the following is a binary patch to the SX1262 +// this patch is needed to enable spectral scan functionality +const uint32_t sx126x_patch_scan[] RADIOLIB_NONVOLATILE = { + 0x337fe1, 0x337fdb, 0x337fd5, 0x337fcf, 0x3a7fc8, 0x3f3fff, + 0x0378ff, 0x0379ff, 0x3a7fb7, 0x16a901, 0x16a801, 0x23ffff, + 0x0378ff, 0x0379ff, 0x3a7faf, 0x16a901, 0x16a801, 0x23ffff, + 0x0378ff, 0x0379ff, 0x3a7f34, 0x16a901, 0x16a801, 0x23ffff, + 0x0378ff, 0x0379ff, 0x3a7e80, 0x16a901, 0x16a801, 0x23ffff, + 0x0378ff, 0x0379ff, 0x3a7fc3, 0x16a901, 0x16a801, 0x337fc9, + 0x0378ff, 0x0379ff, 0x3a7fc0, 0x16a901, 0x16a801, 0x337fc9, + 0x0378ff, 0x0379ff, 0x3a7fbd, 0x16a901, 0x16a801, 0x337fc9, + 0x0378ff, 0x0379ff, 0x3a7fba, 0x16a901, 0x16a801, 0x337fc9, + 0x23ffff, 0x0ea1fc, 0x0ea0df, 0x0eafc9, 0x02cf0e, 0x23ffff, + 0x0eacff, 0x0eabff, 0x23ffff, 0x0eacff, 0x0eabff, 0x23ffff, + 0x0eacff, 0x0eabff, 0x23ffff, 0x0eacff, 0x0eabff, 0x23ffff, + 0x0378ff, 0x0379ff, 0x3a7fc8, 0x0eacfd, 0x0eabff, 0x16a901, + 0x16a801, 0x23ffff, 0x0374ff, 0x0375ff, 0x0378ff, 0x0379ff, + 0x16affe, 0x0ea5ff, 0x0ea465, 0x1dbb04, 0x0e1bfd, 0x307fa3, + 0x1caf00, 0x327fa0, 0x0eacf7, 0x0eabff, 0x337f3a, 0x1cad04, + 0x0eacfe, 0x0eabff, 0x0dbfdd, 0x307f97, 0x0dafcc, 0x0defbb, + 0x0dbfdd, 0x347f9b, 0x0eecef, 0x0caffc, 0x04ade8, 0x0cbdcd, + 0x01bde8, 0x04abe8, 0x0ebbbf, 0x01bbe8, 0x04abe8, 0x0ebbdf, + 0x01bbe8, 0x1ca800, 0x0ea9ff, 0x04abe3, 0x0e2b01, 0x01bbe3, + 0x04abee, 0x0e2b01, 0x01bbee, 0x1ca202, 0x1ca301, 0x02f300, + 0x02f201, 0x0ea064, 0x0ea1f7, 0x18ab00, 0x367f58, 0x0ea041, + 0x0ea1f7, 0x18ab00, 0x1c1b03, 0x317f3f, 0x1ea201, 0x1ea300, + 0x0cb23f, 0x327f4a, 0x1cab04, 0x0eaefe, 0x0dbfbb, 0x307f6c, + 0x0dafee, 0x0dbfbb, 0x347f6f, 0x04abee, 0x0cbbeb, 0x01bbee, + 0x0eacff, 0x0eabff, 0x0c1b9f, 0x327f64, 0x0c1c8f, 0x317f5c, + 0x3fffff, 0x0d1fcc, 0x0d5fbb, 0x0c1b9f, 0x327f5d, 0x0c1c8f, + 0x357f63, 0x0ea064, 0x0ea1f7, 0x18ab00, 0x327f7c, 0x1cad04, + 0x0eacfe, 0x0dbfdd, 0x307f51, 0x0dafcc, 0x0dbfdd, 0x347f54, + 0x0d8fcb, 0x04acee, 0x0c2bcb, 0x01bbee, 0x0eacfd, 0x0eabff, + 0x337f3a, 0x1cad04, 0x0eacfe, 0x0dbfdd, 0x307f43, 0x0dafcc, + 0x0dbfdd, 0x347f46, 0x0d8fcb, 0x04acee, 0x0c2bcb, 0x337f6a, + 0x0cb23f, 0x367f75, 0x0dbf22, 0x0dff33, 0x337f75, 0x16af02, + 0x16a901, 0x16a801, 0x16a501, 0x16a401, 0x23ffff, 0x0374ff, + 0x0375ff, 0x0378ff, 0x0379ff, 0x16afe0, 0x0ea5ff, 0x0ea465, + 0x1ca802, 0x0ea9ff, 0x0eafff, 0x02ff00, 0x0eaff7, 0x02ff01, + 0x0eafef, 0x02ff02, 0x0eafe7, 0x02ff03, 0x0eafdf, 0x02ff04, + 0x0eafd7, 0x02ff05, 0x0eafcf, 0x02ff06, 0x0eafc7, 0x02ff07, + 0x0eafbf, 0x02ff08, 0x0eafb7, 0x02ff09, 0x0eafaf, 0x02ff0a, + 0x0eafa7, 0x02ff0b, 0x0eaf9f, 0x02ff0c, 0x0eaf97, 0x02ff0d, + 0x0eaf8f, 0x02ff0e, 0x0eaf87, 0x02ff0f, 0x0eaf7f, 0x02ff10, + 0x0eaf77, 0x02ff11, 0x0eaf6f, 0x02ff12, 0x0eaf67, 0x02ff13, + 0x0eaf5f, 0x02ff14, 0x0eaf57, 0x02ff15, 0x0eaf4f, 0x02ff16, + 0x0eaf47, 0x02ff17, 0x0eaf3f, 0x02ff18, 0x0eaf37, 0x02ff19, + 0x0eaf2f, 0x02ff1a, 0x0eaf27, 0x02ff1b, 0x0eaf1f, 0x02ff1c, + 0x0eaf17, 0x02ff1d, 0x0eaf0f, 0x02ff1e, 0x0eaf07, 0x02ff1f, + 0x04abee, 0x0e2b01, 0x01bbee, 0x0eacff, 0x0eabff, 0x0cafc0, + 0x0ec0ff, 0x0cafb1, 0x0ed1fb, 0x0eafff, 0x02cf00, 0x0d1fcc, + 0x0d5fbb, 0x0e1bff, 0x327edb, 0x0e1c00, 0x347ee6, 0x0ea2ff, + 0x0ea3ff, 0x0ea032, 0x0ea1f8, 0x0eaff0, 0x02cf00, 0x0ea064, + 0x0ea1f7, 0x18ad00, 0x1c1300, 0x327ece, 0x1c1201, 0x317e9b, + 0x0e1dff, 0x367e9b, 0x0ea041, 0x0ea1f7, 0x18ab00, 0x0eebdf, + 0x0cafbc, 0x0eabff, 0x0ccccc, 0x0cdbbb, 0x0cafc0, 0x0ec0ff, + 0x0cafb1, 0x0ed1fb, 0x18ab01, 0x0eacff, 0x18ae02, 0x0eadff, + 0x0ccecc, 0x0cddbb, 0x0d1fcc, 0x0d5fbb, 0x0cafbe, 0x0eadff, + 0x02ce01, 0x02cc02, 0x0d1f22, 0x0d5f33, 0x0ea064, 0x0ea1f7, + 0x18ad00, 0x0eacff, 0x0eabff, 0x0c1b9f, 0x327ea9, 0x0c1c8f, + 0x317ea1, 0x3fffff, 0x0d1fcc, 0x0d5fbb, 0x0c1b9f, 0x327ea2, + 0x0c1c8f, 0x357ea8, 0x1c1300, 0x327e9e, 0x1c1201, 0x317e9b, + 0x0e1dff, 0x327ecb, 0x0e1dff, 0x367e90, 0x0ea032, 0x0ea1f8, + 0x0eaf00, 0x02cf00, 0x0ea1fb, 0x0ea0ff, 0x0eaf00, 0x02cf00, + 0x337e88, 0x0ea032, 0x0ea1f8, 0x0eaf0f, 0x02cf00, 0x0ea1fb, + 0x0ea0ff, 0x0eaf0f, 0x02cf00, 0x0eacfd, 0x0eabff, 0x16af20, + 0x16a901, 0x16a801, 0x16a501, 0x16a401, 0x23ffff, 0x0eacf7, + 0x0eabff, 0x23ffff +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1272.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1272.cpp new file mode 100644 index 00000000..45bf8802 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1272.cpp @@ -0,0 +1,529 @@ +#include "SX1272.h" +#include +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +SX1272::SX1272(Module* mod) : SX127x(mod) { + +} + +int16_t SX1272::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) { + // execute common part + uint8_t version = RADIOLIB_SX1272_CHIP_VERSION; + int16_t state = SX127x::begin(&version, 1, syncWord, preambleLength); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = setGain(gain); + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + state = setCRC(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1272::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, bool enableOOK) { + // execute common part + uint8_t version = RADIOLIB_SX1272_CHIP_VERSION; + int16_t state = SX127x::beginFSK(&version, 1, freqDev, rxBw, preambleLength, enableOOK); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = configFSK(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + if(enableOOK) { + state = setDataShapingOOK(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } else { + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } + + // set publicly accessible settings that are not a part of begin method + state = setCRC(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +void SX1272::reset() { + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + this->mod->hal->delay(1); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + this->mod->hal->delay(5); +} + +int16_t SX1272::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE(freq, 860.0, 1020.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // set frequency and if successful, save the new setting + int16_t state = SX127x::setFrequencyRaw(freq); + if(state == RADIOLIB_ERR_NONE) { + SX127x::frequency = freq; + } + return(state); +} + +int16_t SX1272::setBandwidth(float bw) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + uint8_t newBandwidth; + + // check allowed bandwidth values + if(fabs(bw - 125.0) <= 0.001) { + newBandwidth = RADIOLIB_SX1272_BW_125_00_KHZ; + } else if(fabs(bw - 250.0) <= 0.001) { + newBandwidth = RADIOLIB_SX1272_BW_250_00_KHZ; + } else if(fabs(bw - 500.0) <= 0.001) { + newBandwidth = RADIOLIB_SX1272_BW_500_00_KHZ; + } else { + return(RADIOLIB_ERR_INVALID_BANDWIDTH); + } + + // set bandwidth and if successful, save the new setting + int16_t state = SX1272::setBandwidthRaw(newBandwidth); + if(state == RADIOLIB_ERR_NONE) { + SX127x::bandwidth = bw; + + // calculate symbol length and set low data rate optimization, if auto-configuration is enabled + if(this->ldroAuto) { + float symbolLength = (float)(uint32_t(1) << SX127x::spreadingFactor) / (float)SX127x::bandwidth; + if(symbolLength >= 16.0) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_ON, 0, 0); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0); + } + } + } + return(state); +} + +int16_t SX1272::setSpreadingFactor(uint8_t sf) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + uint8_t newSpreadingFactor; + + // check allowed spreading factor values + switch(sf) { + case 6: + newSpreadingFactor = RADIOLIB_SX127X_SF_6; + break; + case 7: + newSpreadingFactor = RADIOLIB_SX127X_SF_7; + break; + case 8: + newSpreadingFactor = RADIOLIB_SX127X_SF_8; + break; + case 9: + newSpreadingFactor = RADIOLIB_SX127X_SF_9; + break; + case 10: + newSpreadingFactor = RADIOLIB_SX127X_SF_10; + break; + case 11: + newSpreadingFactor = RADIOLIB_SX127X_SF_11; + break; + case 12: + newSpreadingFactor = RADIOLIB_SX127X_SF_12; + break; + default: + return(RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + } + + // set spreading factor and if successful, save the new setting + int16_t state = SX1272::setSpreadingFactorRaw(newSpreadingFactor); + if(state == RADIOLIB_ERR_NONE) { + SX127x::spreadingFactor = sf; + + // calculate symbol length and set low data rate optimization, if auto-configuration is enabled + if(this->ldroAuto) { + float symbolLength = (float)(uint32_t(1) << SX127x::spreadingFactor) / (float)SX127x::bandwidth; + if(symbolLength >= 16.0) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_ON, 0, 0); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0); + } + } + } + return(state); +} + +int16_t SX1272::setCodingRate(uint8_t cr) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + uint8_t newCodingRate; + + // check allowed coding rate values + switch(cr) { + case 5: + newCodingRate = RADIOLIB_SX1272_CR_4_5; + break; + case 6: + newCodingRate = RADIOLIB_SX1272_CR_4_6; + break; + case 7: + newCodingRate = RADIOLIB_SX1272_CR_4_7; + break; + case 8: + newCodingRate = RADIOLIB_SX1272_CR_4_8; + break; + default: + return(RADIOLIB_ERR_INVALID_CODING_RATE); + } + + // set coding rate and if successful, save the new setting + int16_t state = SX1272::setCodingRateRaw(newCodingRate); + if(state == RADIOLIB_ERR_NONE) { + SX127x::codingRate = cr; + } + return(state); +} + +int16_t SX1272::setBitRate(float br) { + return(SX127x::setBitRateCommon(br, RADIOLIB_SX1272_REG_BIT_RATE_FRAC)); +} + +int16_t SX1272::setDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + uint8_t modem = this->getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set the bit rate + state = this->setBitRate(dr.fsk.bitRate); + RADIOLIB_ASSERT(state); + + // set the frequency deviation + state = this->setFrequencyDeviation(dr.fsk.freqDev); + + } else if(modem == RADIOLIB_SX127X_LORA) { + // set the spreading factor + state = this->setSpreadingFactor(dr.lora.spreadingFactor); + RADIOLIB_ASSERT(state); + + // set the bandwidth + state = this->setBandwidth(dr.lora.bandwidth); + RADIOLIB_ASSERT(state); + + // set the coding rate + state = this->setCodingRate(dr.lora.codingRate); + } + + return(state); +} + +int16_t SX1272::setOutputPower(int8_t power) { + return(this->setOutputPower(power, false)); +} + +int16_t SX1272::setOutputPower(int8_t power, bool useRfo) { + // check allowed power range + if(useRfo) { + RADIOLIB_CHECK_RANGE(power, -1, 14, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } else { + RADIOLIB_CHECK_RANGE(power, 2, 20, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } + + // set mode to standby + int16_t state = SX127x::standby(); + + if(useRfo) { + // RFO output + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_RFO, 7, 7); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, (power + 1), 3, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX1272_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_OFF, 2, 0); + + } else { + if(power <= 17) { + // power is 2 - 17 dBm, enable PA1 + PA2 on PA_BOOST + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_BOOST, 7, 7); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, (power - 2), 3, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX1272_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_OFF, 2, 0); + + } else { + // power is 18 - 20 dBm, enable PA1 + PA2 on PA_BOOST and enable high power control + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_BOOST, 7, 7); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, (power - 5), 3, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX1272_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_ON, 2, 0); + + } + + } + + return(state); +} + +int16_t SX1272::setGain(uint8_t gain) { + // check allowed range + if(gain > 6) { + return(RADIOLIB_ERR_INVALID_GAIN); + } + + // set mode to standby + int16_t state = SX127x::standby(); + + // get modem + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA){ + // set gain + if(gain == 0) { + // gain set to 0, enable AGC loop + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX1272_AGC_AUTO_ON, 2, 2); + } else { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX1272_AGC_AUTO_OFF, 2, 2); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_LNA, (gain << 5) | RADIOLIB_SX127X_LNA_BOOST_ON); + } + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set gain + if(gain == 0) { + // gain set to 0, enable AGC loop + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_CONFIG, RADIOLIB_SX127X_AGC_AUTO_ON, 3, 3); + } else { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_CONFIG, RADIOLIB_SX127X_AGC_AUTO_ON, 3, 3); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_LNA, (gain << 5) | RADIOLIB_SX127X_LNA_BOOST_ON); + } + + } + + return(state); +} + +int16_t SX1272::setDataShaping(uint8_t sh) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // check modulation + if(SX127x::ookEnabled) { + return(RADIOLIB_ERR_INVALID_MODULATION); + } + + // set mode to standby + int16_t state = SX127x::standby(); + RADIOLIB_ASSERT(state); + + // set data shaping + switch(sh) { + case RADIOLIB_SHAPING_NONE: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_NO_SHAPING, 4, 3)); + case RADIOLIB_SHAPING_0_3: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_FSK_GAUSSIAN_0_3, 4, 3)); + case RADIOLIB_SHAPING_0_5: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_FSK_GAUSSIAN_0_5, 4, 3)); + case RADIOLIB_SHAPING_1_0: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_FSK_GAUSSIAN_1_0, 4, 3)); + default: + return(RADIOLIB_ERR_INVALID_DATA_SHAPING); + } +} + +int16_t SX1272::setDataShapingOOK(uint8_t sh) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // check modulation + if(!SX127x::ookEnabled) { + return(RADIOLIB_ERR_INVALID_MODULATION); + } + + // set mode to standby + int16_t state = SX127x::standby(); + + // set data shaping + switch(sh) { + case 0: + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_NO_SHAPING, 4, 3); + break; + case 1: + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_OOK_FILTER_BR, 4, 3); + break; + case 2: + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_OOK_FILTER_2BR, 4, 3); + break; + default: + state = RADIOLIB_ERR_INVALID_DATA_SHAPING; + break; + } + + return(state); +} + +float SX1272::getRSSI(bool packet, bool skipReceive) { + return(SX127x::getRSSI(packet, skipReceive, -139)); +} + +int16_t SX1272::setCRC(bool enable, bool mode) { + if(getActiveModem() == RADIOLIB_SX127X_LORA) { + // set LoRa CRC + SX127x::crcEnabled = enable; + if(enable) { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_RX_CRC_MODE_ON, 1, 1)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_RX_CRC_MODE_OFF, 1, 1)); + } + } else { + // set FSK CRC + int16_t state = RADIOLIB_ERR_NONE; + if(enable) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_ON, 4, 4); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_OFF, 4, 4); + } + RADIOLIB_ASSERT(state); + + // set FSK CRC mode + if(mode) { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_WHITENING_TYPE_IBM, 0, 0)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_WHITENING_TYPE_CCITT, 0, 0)); + } + } +} + +int16_t SX1272::forceLDRO(bool enable) { + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + this->ldroAuto = false; + if(enable) { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_ON, 0, 0)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0)); + } +} + +int16_t SX1272::autoLDRO() { + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + this->ldroAuto = true; + return(RADIOLIB_ERR_NONE); +} + +int16_t SX1272::implicitHeader(size_t len) { + return(setHeaderType(RADIOLIB_SX1272_HEADER_IMPL_MODE, len)); +} + +int16_t SX1272::explicitHeader() { + return(setHeaderType(RADIOLIB_SX1272_HEADER_EXPL_MODE)); +} + +int16_t SX1272::setBandwidthRaw(uint8_t newBandwidth) { + // set mode to standby + int16_t state = SX127x::standby(); + + // write register + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, newBandwidth, 7, 6); + return(state); +} + +int16_t SX1272::setSpreadingFactorRaw(uint8_t newSpreadingFactor) { + // set mode to standby + int16_t state = SX127x::standby(); + + // write registers + if(newSpreadingFactor == RADIOLIB_SX127X_SF_6) { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_HEADER_IMPL_MODE | (SX127x::crcEnabled ? RADIOLIB_SX1272_RX_CRC_MODE_ON : RADIOLIB_SX1272_RX_CRC_MODE_OFF), 2, 1); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX127X_SF_6 | RADIOLIB_SX127X_TX_MODE_SINGLE, 7, 3); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECT_OPTIMIZE, RADIOLIB_SX127X_DETECT_OPTIMIZE_SF_6, 2, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECTION_THRESHOLD, RADIOLIB_SX127X_DETECTION_THRESHOLD_SF_6); + } else { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_HEADER_EXPL_MODE | (SX127x::crcEnabled ? RADIOLIB_SX1272_RX_CRC_MODE_ON : RADIOLIB_SX1272_RX_CRC_MODE_OFF), 2, 1); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, newSpreadingFactor | RADIOLIB_SX127X_TX_MODE_SINGLE, 7, 3); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECT_OPTIMIZE, RADIOLIB_SX127X_DETECT_OPTIMIZE_SF_7_12, 2, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECTION_THRESHOLD, RADIOLIB_SX127X_DETECTION_THRESHOLD_SF_7_12); + } + return(state); +} + +int16_t SX1272::setCodingRateRaw(uint8_t newCodingRate) { + // set mode to standby + int16_t state = SX127x::standby(); + + // write register + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, newCodingRate, 5, 3); + return(state); +} + +int16_t SX1272::setHeaderType(uint8_t headerType, size_t len) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set requested packet mode + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, headerType, 2, 2); + RADIOLIB_ASSERT(state); + + // set length to register + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH, len); + RADIOLIB_ASSERT(state); + + // update cached value + SX127x::packetLength = len; + + return(state); +} + +int16_t SX1272::configFSK() { + // configure common registers + int16_t state = SX127x::configFSK(); + RADIOLIB_ASSERT(state); + + // set fast PLL hop + state = this->mod->SPIsetRegValue(RADIOLIB_SX1272_REG_PLL_HOP, RADIOLIB_SX127X_FAST_HOP_ON, 7, 7); + return(state); +} + +void SX1272::errataFix(bool rx) { + (void)rx; + + // mitigation of receiver spurious response + // see SX1272/73 Errata, section 2.2 for details + this->mod->SPIsetRegValue(0x31, 0b10000000, 7, 7); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1272.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1272.h new file mode 100644 index 00000000..f389230b --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1272.h @@ -0,0 +1,295 @@ +#if !defined(_RADIOLIB_SX1272_H) +#define _RADIOLIB_SX1272_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +#include "../../Module.h" +#include "SX127x.h" + +// SX1272 specific register map +#define RADIOLIB_SX1272_REG_AGC_REF 0x43 +#define RADIOLIB_SX1272_REG_AGC_THRESH_1 0x44 +#define RADIOLIB_SX1272_REG_AGC_THRESH_2 0x45 +#define RADIOLIB_SX1272_REG_AGC_THRESH_3 0x46 +#define RADIOLIB_SX1272_REG_PLL_HOP 0x4B +#define RADIOLIB_SX1272_REG_TCXO 0x58 +#define RADIOLIB_SX1272_REG_PA_DAC 0x5A +#define RADIOLIB_SX1272_REG_PLL 0x5C +#define RADIOLIB_SX1272_REG_PLL_LOW_PN 0x5E +#define RADIOLIB_SX1272_REG_FORMER_TEMP 0x6C +#define RADIOLIB_SX1272_REG_BIT_RATE_FRAC 0x70 + +// SX1272 LoRa modem settings +// RADIOLIB_SX1272_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB +#define RADIOLIB_SX1272_FRF_MSB 0xE4 // 7 0 carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19 +#define RADIOLIB_SX1272_FRF_MID 0xC0 // 7 0 where F(XOSC) = 32 MHz +#define RADIOLIB_SX1272_FRF_LSB 0x00 // 7 0 FRF = 3 byte value of FRF registers + +// RADIOLIB_SX127X_REG_MODEM_CONFIG_1 +#define RADIOLIB_SX1272_BW_125_00_KHZ 0b00000000 // 7 6 bandwidth: 125 kHz +#define RADIOLIB_SX1272_BW_250_00_KHZ 0b01000000 // 7 6 250 kHz +#define RADIOLIB_SX1272_BW_500_00_KHZ 0b10000000 // 7 6 500 kHz +#define RADIOLIB_SX1272_CR_4_5 0b00001000 // 5 3 error coding rate: 4/5 +#define RADIOLIB_SX1272_CR_4_6 0b00010000 // 5 3 4/6 +#define RADIOLIB_SX1272_CR_4_7 0b00011000 // 5 3 4/7 +#define RADIOLIB_SX1272_CR_4_8 0b00100000 // 5 3 4/8 +#define RADIOLIB_SX1272_HEADER_EXPL_MODE 0b00000000 // 2 2 explicit header mode +#define RADIOLIB_SX1272_HEADER_IMPL_MODE 0b00000100 // 2 2 implicit header mode +#define RADIOLIB_SX1272_RX_CRC_MODE_OFF 0b00000000 // 1 1 CRC disabled +#define RADIOLIB_SX1272_RX_CRC_MODE_ON 0b00000010 // 1 1 CRC enabled +#define RADIOLIB_SX1272_LOW_DATA_RATE_OPT_OFF 0b00000000 // 0 0 low data rate optimization disabled +#define RADIOLIB_SX1272_LOW_DATA_RATE_OPT_ON 0b00000001 // 0 0 low data rate optimization enabled, mandatory for SF 11 and 12 with BW 125 kHz + +// RADIOLIB_SX127X_REG_MODEM_CONFIG_2 +#define RADIOLIB_SX1272_AGC_AUTO_OFF 0b00000000 // 2 2 LNA gain set by REG_LNA +#define RADIOLIB_SX1272_AGC_AUTO_ON 0b00000100 // 2 2 LNA gain set by internal AGC loop + +// RADIOLIB_SX127X_REG_VERSION +#define RADIOLIB_SX1272_CHIP_VERSION 0x22 + +// SX1272 FSK modem settings +// RADIOLIB_SX127X_REG_OP_MODE +#define RADIOLIB_SX1272_NO_SHAPING 0b00000000 // 4 3 data shaping: no shaping (default) +#define RADIOLIB_SX1272_FSK_GAUSSIAN_1_0 0b00001000 // 4 3 FSK modulation Gaussian filter, BT = 1.0 +#define RADIOLIB_SX1272_FSK_GAUSSIAN_0_5 0b00010000 // 4 3 FSK modulation Gaussian filter, BT = 0.5 +#define RADIOLIB_SX1272_FSK_GAUSSIAN_0_3 0b00011000 // 4 3 FSK modulation Gaussian filter, BT = 0.3 +#define RADIOLIB_SX1272_OOK_FILTER_BR 0b00001000 // 4 3 OOK modulation filter, f_cutoff = BR +#define RADIOLIB_SX1272_OOK_FILTER_2BR 0b00010000 // 4 3 OOK modulation filter, f_cutoff = 2*BR + +// RADIOLIB_SX127X_REG_PA_RAMP +#define RADIOLIB_SX1272_LOW_PN_TX_PLL_OFF 0b00010000 // 4 4 use standard PLL in transmit mode (default) +#define RADIOLIB_SX1272_LOW_PN_TX_PLL_ON 0b00000000 // 4 4 use lower phase noise PLL in transmit mode + +// RADIOLIB_SX127X_REG_SYNC_CONFIG +#define RADIOLIB_SX1272_FIFO_FILL_CONDITION_SYNC_ADDRESS 0b00000000 // 3 3 FIFO will be filled when sync address interrupt occurs (default) +#define RADIOLIB_SX1272_FIFO_FILL_CONDITION_ALWAYS 0b00001000 // 3 3 FIFO will be filled as long as this bit is set + +// RADIOLIB_SX1272_REG_AGC_REF +#define RADIOLIB_SX1272_AGC_REFERENCE_LEVEL 0x13 // 5 0 floor reference for AGC thresholds: AgcRef = -174 + 10*log(2*RxBw) + 8 + AGC_REFERENCE_LEVEL [dBm] + +// RADIOLIB_SX1272_REG_AGC_THRESH_1 +#define RADIOLIB_SX1272_AGC_STEP_1 0x0E // 4 0 1st AGC threshold + +// RADIOLIB_SX1272_REG_AGC_THRESH_2 +#define RADIOLIB_SX1272_AGC_STEP_2 0x50 // 7 4 2nd AGC threshold +#define RADIOLIB_SX1272_AGC_STEP_3 0x0B // 4 0 3rd AGC threshold + +// RADIOLIB_SX1272_REG_AGC_THRESH_3 +#define RADIOLIB_SX1272_AGC_STEP_4 0xD0 // 7 4 4th AGC threshold +#define RADIOLIB_SX1272_AGC_STEP_5 0x0B // 4 0 5th AGC threshold + +// RADIOLIB_SX1272_REG_PLL_LOW_PN +#define RADIOLIB_SX1272_PLL_LOW_PN_BANDWIDTH_75_KHZ 0b00000000 // 7 6 low phase noise PLL bandwidth: 75 kHz +#define RADIOLIB_SX1272_PLL_LOW_PN_BANDWIDTH_150_KHZ 0b01000000 // 7 6 150 kHz +#define RADIOLIB_SX1272_PLL_LOW_PN_BANDWIDTH_225_KHZ 0b10000000 // 7 6 225 kHz +#define RADIOLIB_SX1272_PLL_LOW_PN_BANDWIDTH_300_KHZ 0b11000000 // 7 6 300 kHz (default) + +/*! + \class SX1272 + \brief Derived class for %SX1272 modules. Also used as base class for SX1273. + Both modules use the same basic hardware and only differ in parameter ranges. +*/ +class SX1272: public SX127x { + public: + + // constructor + + /*! + \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. + \param mod Instance of Module that will be used to communicate with the %LoRa chip. + */ + SX1272(Module* mod); + + // basic methods + + /*! + \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 860.0 MHz to 1020.0 MHz. + \param bw %LoRa link bandwidth in kHz. Allowed values are 125, 250 and 500 kHz. + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. + \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. + Set to 0 to disable OCP (not recommended). + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + Allowed values range from 6 to 65535. + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + \returns \ref status_codes + */ + int16_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX127X_SYNC_WORD, int8_t power = 10, uint16_t preambleLength = 8, uint8_t gain = 0); + + /*! + \brief FSK modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 860.0 MHz to 1020.0 MHz. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 1.2 to 300.0 kbps. + \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.6 to 200.0 kHz. + Note that the allowed range changes based on bit rate setting, so that the condition FreqDev + BitRate/2 <= 250 kHz is always met. + \param rxBw Receiver bandwidth in kHz. Allowed values are 2.6, 3.1, 3.9, 5.2, 6.3, 7.8, 10.4, 12.5, 15.6, 20.8, 25, 31.3, 41.7, 50, 62.5, 83.3, 100, 125, 166.7, 200 and 250 kHz. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of FSK preamble in bits. + \param enableOOK Use OOK modulation instead of FSK. + \returns \ref status_codes + */ + int16_t beginFSK(float freq = 915.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint16_t preambleLength = 16, bool enableOOK = false); + + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + */ + void reset() override; + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 860.0 MHz to 1020.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets %LoRa link bandwidth. Allowed values are 125, 250 and 500 kHz. Only available in %LoRa mode. + \param bw %LoRa link bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setBandwidth(float bw); + + /*! + \brief Sets %LoRa link spreading factor. Allowed values range from 6 to 12. Only available in %LoRa mode. + \param sf %LoRa link spreading factor to be set. + \returns \ref status_codes + */ + int16_t setSpreadingFactor(uint8_t sf); + + /*! + \brief Sets %LoRa link coding rate denominator. Allowed values range from 5 to 8. Only available in %LoRa mode. + \param cr %LoRa link coding rate denominator to be set. + \returns \ref status_codes + */ + int16_t setCodingRate(uint8_t cr); + + /*! + \brief Sets FSK bit rate. Allowed values range from 0.5 to 300 kbps. Only available in FSK mode. + \param br Bit rate to be set (in kbps). + \returns \ref status_codes + */ + int16_t setBitRate(float br) override; + + /*! + \brief Set data. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t setDataRate(DataRate_t dr) override; + + /*! + \brief Sets transmission output power. Allowed values range from -1 to 14 dBm (RFO pin) or +2 to +20 dBm (PA_BOOST pin). + High power +20 dBm operation is also supported, on the PA_BOOST pin. Defaults to PA_BOOST. + \param power Transmission output power in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power) override; + + /*! + \brief Sets transmission output power. Allowed values range from -1 to 14 dBm (RFO pin) or +2 to +20 dBm (PA_BOOST pin). + \param power Transmission output power in dBm. + \param useRfo Whether to use the RFO (true) or the PA_BOOST (false) pin for the RF output. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power, bool useRfo); + + /*! + \brief Sets gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + \param gain Gain of receiver LNA (low-noise amplifier) to be set. + \returns \ref status_codes + */ + int16_t setGain(uint8_t gain); + + /*! + \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. Only available in FSK mode with FSK modulation. + Allowed values are RADIOLIB_SHAPING_0_3, RADIOLIB_SHAPING_0_5 or RADIOLIB_SHAPING_1_0. Set to RADIOLIB_SHAPING_NONE to disable data shaping. + \param sh Gaussian shaping bandwidth-time product that will be used for data shaping + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! + \brief Sets filter cutoff frequency that will be used for data shaping. + Allowed values are 1 for frequency equal to bit rate and 2 for frequency equal to 2x bit rate. Set to 0 to disable data shaping. + Only available in FSK mode with OOK modulation. + \param sh Cutoff frequency that will be used for data shaping + \returns \ref status_codes + */ + int16_t setDataShapingOOK(uint8_t sh); + + /*! + \brief Gets recorded signal strength indicator. + \param packet Whether to read last packet RSSI, or the current value. LoRa mode only, ignored for FSK. + \param skipReceive Set to true to skip putting radio in receive mode for the RSSI measurement in FSK/OOK mode. + \returns RSSI value in dBm. + */ + float getRSSI(bool packet = true, bool skipReceive = false); + + /*! + \brief Enables/disables CRC check of received packets. + \param enable Enable (true) or disable (false) CRC. + \param mode Set CRC mode to RADIOLIB_SX127X_CRC_WHITENING_TYPE_CCITT for CCITT, + polynomial X16 + X12 + X5 + 1 (false) or RADIOLIB_SX127X_CRC_WHITENING_TYPE_IBM for IBM, + polynomial X16 + X15 + X2 + 1 (true). Only valid in FSK mode. + \returns \ref status_codes + */ + int16_t setCRC(bool enable, bool mode = false); + + /*! + \brief Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method, LDRO will always be set to + the provided value, regardless of symbol length. To re-enable automatic LDRO configuration, call SX1278::autoLDRO() + \param enable Force LDRO to be always enabled (true) or disabled (false). + \returns \ref status_codes + */ + int16_t forceLDRO(bool enable); + + /*! + \brief Re-enables automatic LDRO configuration. Only available in LoRa mode. After calling this method, LDRO will be enabled automatically + when symbol length exceeds 16 ms. + \returns \ref status_codes + */ + int16_t autoLDRO(); + + /*! + \brief Set implicit header mode for future reception/transmission. Required for spreading factor 6. + \param len Payload length in bytes. + \returns \ref status_codes + */ + int16_t implicitHeader(size_t len); + + /*! + \brief Set explicit header mode for future reception/transmission. + \returns \ref status_codes + */ + int16_t explicitHeader(); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + int16_t setBandwidthRaw(uint8_t newBandwidth); + int16_t setSpreadingFactorRaw(uint8_t newSpreadingFactor); + int16_t setCodingRateRaw(uint8_t newCodingRate); + int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF); + + int16_t configFSK(); + void errataFix(bool rx); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + bool ldroAuto = true; + bool ldroEnabled = false; + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1273.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1273.cpp new file mode 100644 index 00000000..ea021c66 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1273.cpp @@ -0,0 +1,95 @@ +#include "SX1273.h" +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +SX1273::SX1273(Module* mod) : SX1272(mod) { + +} + +int16_t SX1273::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) { + // execute common part + uint8_t version = RADIOLIB_SX1272_CHIP_VERSION; + int16_t state = SX127x::begin(&version, 1, syncWord, preambleLength); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = setGain(gain); + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + state = setCRC(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1273::setSpreadingFactor(uint8_t sf) { + uint8_t newSpreadingFactor; + + // check allowed spreading factor values + switch(sf) { + case 6: + newSpreadingFactor = RADIOLIB_SX127X_SF_6; + break; + case 7: + newSpreadingFactor = RADIOLIB_SX127X_SF_7; + break; + case 8: + newSpreadingFactor = RADIOLIB_SX127X_SF_8; + break; + case 9: + newSpreadingFactor = RADIOLIB_SX127X_SF_9; + break; + default: + return(RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + } + + // set spreading factor and if successful, save the new setting + int16_t state = setSpreadingFactorRaw(newSpreadingFactor); + if(state == RADIOLIB_ERR_NONE) { + SX127x::spreadingFactor = sf; + } + + return(state); +} + +int16_t SX1273::setDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + uint8_t modem = this->getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set the bit rate + state = this->setBitRate(dr.fsk.bitRate); + RADIOLIB_ASSERT(state); + + // set the frequency deviation + state = this->setFrequencyDeviation(dr.fsk.freqDev); + + } else if(modem == RADIOLIB_SX127X_LORA) { + // set the spreading factor + state = this->setSpreadingFactor(dr.lora.spreadingFactor); + RADIOLIB_ASSERT(state); + + // set the bandwidth + state = this->setBandwidth(dr.lora.bandwidth); + } + + return(state); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1273.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1273.h new file mode 100644 index 00000000..2ceb58bc --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1273.h @@ -0,0 +1,67 @@ +#if !defined(_RADIOLIB_SX1273_H) +#define _RADIOLIB_SX1273_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +#include "SX1272.h" + +/*! + \class SX1273 + \brief Derived class for %SX1273 modules. Overrides some methods from SX1272 due to different parameter ranges. +*/ +class SX1273: public SX1272 { + public: + + // constructor + + /*! + \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. + \param mod Instance of Module that will be used to communicate with the %LoRa chip. + */ + SX1273(Module* mod); + + // basic methods + + /*! + \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 860.0 MHz to 1020.0 MHz. + \param bw %LoRa link bandwidth in kHz. Allowed values are 125, 250 and 500 kHz. + \param sf %LoRa link spreading factor. Allowed values range from 6 to 9. + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + Allowed values range from 6 to 65535. + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + \returns \ref status_codes + */ + int16_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX127X_SYNC_WORD, int8_t power = 10, uint16_t preambleLength = 8, uint8_t gain = 0); + + // configuration methods + + /*! + \brief Sets %LoRa link spreading factor. Allowed values range from 6 to 9. Only available in %LoRa mode. + \param sf %LoRa link spreading factor to be set. + \returns \ref status_codes + */ + int16_t setSpreadingFactor(uint8_t sf); + + /*! + \brief Set data. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t setDataRate(DataRate_t dr) override; + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1276.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1276.cpp new file mode 100644 index 00000000..b20fd7d1 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1276.cpp @@ -0,0 +1,82 @@ +#include "SX1276.h" +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +SX1276::SX1276(Module* mod) : SX1278(mod) { + +} + +int16_t SX1276::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) { + // execute common part + uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; + int16_t state = SX127x::begin(versions, 3, syncWord, preambleLength); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = setGain(gain); + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + state = setCRC(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1276::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, bool enableOOK) { + // execute common part + uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; + int16_t state = SX127x::beginFSK(versions, 3, freqDev, rxBw, preambleLength, enableOOK); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = configFSK(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + if(enableOOK) { + state = setDataShapingOOK(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } else { + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } + + return(state); +} + +int16_t SX1276::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE(freq, 137.0, 1020.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // set frequency and if successful, save the new setting + int16_t state = SX127x::setFrequencyRaw(freq); + if(state == RADIOLIB_ERR_NONE) { + SX127x::frequency = freq; + } + return(state); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1276.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1276.h new file mode 100644 index 00000000..659e22d7 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1276.h @@ -0,0 +1,80 @@ +#if !defined(_RADIOLIB_SX1276_H) +#define _RADIOLIB_SX1276_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +#include "SX1278.h" + +/*! + \class SX1276 + \brief Derived class for %SX1276 modules. Overrides some methods from SX1278 due to different parameter ranges. +*/ +class SX1276: public SX1278 { + public: + + // constructor + + /*! + \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. + \param mod Instance of Module that will be used to communicate with the %LoRa chip. + */ + SX1276(Module* mod); + + // basic methods + + /*! + \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 1020.0 MHz. + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + Allowed values range from 6 to 65535. + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX127X_SYNC_WORD, int8_t power = 10, uint16_t preambleLength = 8, uint8_t gain = 0); + + /*! + \brief FSK modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 1020.0 MHz. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 1.2 to 300.0 kbps. + \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.6 to 200.0 kHz. + Note that the allowed range changes based on bit rate setting, so that the condition FreqDev + BitRate/2 <= 250 kHz is always met. + \param rxBw Receiver bandwidth in kHz. Allowed values are 2.6, 3.1, 3.9, 5.2, 6.3, 7.8, 10.4, 12.5, 15.6, 20.8, 25, 31.3, 41.7, 50, 62.5, 83.3, 100, 125, 166.7, 200 and 250 kHz. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of FSK preamble in bits. + \param enableOOK Use OOK modulation instead of FSK. + \returns \ref status_codes + */ + int16_t beginFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint16_t preambleLength = 16, bool enableOOK = false); + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 137.0 MHz to 1020.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +/*! + \class RFM96 + \brief Only exists as alias for SX1276, since there seems to be no difference between %RFM96 and %SX1276 modules. +*/ +RADIOLIB_TYPE_ALIAS(SX1276, RFM96); + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1277.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1277.cpp new file mode 100644 index 00000000..5875bd9f --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1277.cpp @@ -0,0 +1,137 @@ +#include "SX1277.h" +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +SX1277::SX1277(Module* mod) : SX1278(mod) { + +} + +int16_t SX1277::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) { + // execute common part + uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; + int16_t state = SX127x::begin(versions, 3, syncWord, preambleLength); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = setGain(gain); + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + state = setCRC(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1277::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, bool enableOOK) { + // execute common part + uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; + int16_t state = SX127x::beginFSK(versions, 3, freqDev, rxBw, preambleLength, enableOOK); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = configFSK(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + if(enableOOK) { + state = setDataShapingOOK(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } else { + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } + + return(state); +} + +int16_t SX1277::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE(freq, 137.0, 1020.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // set frequency and if successful, save the new setting + int16_t state = SX127x::setFrequencyRaw(freq); + if(state == RADIOLIB_ERR_NONE) { + SX127x::frequency = freq; + } + return(state); +} + +int16_t SX1277::setSpreadingFactor(uint8_t sf) { + uint8_t newSpreadingFactor; + + // check allowed spreading factor values + switch(sf) { + case 6: + newSpreadingFactor = RADIOLIB_SX127X_SF_6; + break; + case 7: + newSpreadingFactor = RADIOLIB_SX127X_SF_7; + break; + case 8: + newSpreadingFactor = RADIOLIB_SX127X_SF_8; + break; + case 9: + newSpreadingFactor = RADIOLIB_SX127X_SF_9; + break; + default: + return(RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + } + + // set spreading factor and if successful, save the new setting + int16_t state = SX1278::setSpreadingFactorRaw(newSpreadingFactor); + if(state == RADIOLIB_ERR_NONE) { + SX127x::spreadingFactor = sf; + } + + return(state); +} + +int16_t SX1277::setDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + uint8_t modem = this->getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set the bit rate + state = this->setBitRate(dr.fsk.bitRate); + RADIOLIB_ASSERT(state); + + // set the frequency deviation + state = this->setFrequencyDeviation(dr.fsk.freqDev); + + } else if(modem == RADIOLIB_SX127X_LORA) { + // set the spreading factor + state = this->setSpreadingFactor(dr.lora.spreadingFactor); + RADIOLIB_ASSERT(state); + + // set the bandwidth + state = this->setBandwidth(dr.lora.bandwidth); + } + + return(state); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1277.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1277.h new file mode 100644 index 00000000..15804d61 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1277.h @@ -0,0 +1,94 @@ +#if !defined(_RADIOLIB_SX1277_H) +#define _RADIOLIB_SX1277_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +#include "SX1278.h" + +/*! + \class SX1277 + \brief Derived class for %SX1277 modules. Overrides some methods from SX1278 due to different parameter ranges. +*/ +class SX1277: public SX1278 { + public: + + // constructor + + /*! + \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. + \param mod Instance of Module that will be used to communicate with the %LoRa chip. + */ + SX1277(Module* mod); + + // basic methods + + /*! + \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 1020.0 MHz. + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. + \param sf %LoRa link spreading factor. Allowed values range from 6 to 9. + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + Allowed values range from 6 to 65535. + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX127X_SYNC_WORD, int8_t power = 10, uint16_t preambleLength = 8, uint8_t gain = 0); + + /*! + \brief FSK modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 525.0 MHz. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 1.2 to 300.0 kbps. + \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.6 to 200.0 kHz. + Note that the allowed range changes based on bit rate setting, so that the condition FreqDev + BitRate/2 <= 250 kHz is always met. + \param rxBw Receiver bandwidth in kHz. Allowed values are 2.6, 3.1, 3.9, 5.2, 6.3, 7.8, 10.4, 12.5, 15.6, 20.8, 25, 31.3, 41.7, 50, 62.5, 83.3, 100, 125, 166.7, 200 and 250 kHz. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of FSK preamble in bits. + \param enableOOK Use OOK modulation instead of FSK. + \returns \ref status_codes + */ + int16_t beginFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint16_t preambleLength = 16, bool enableOOK = false); + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 137.0 MHz to 1020.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets %LoRa link spreading factor. Allowed values range from 6 to 9. Only available in %LoRa mode. + \param sf %LoRa link spreading factor to be set. + \returns \ref status_codes + */ + int16_t setSpreadingFactor(uint8_t sf); + + /*! + \brief Set data. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t setDataRate(DataRate_t dr) override; + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +/*! + \class RFM97 + \brief Only exists as alias for SX1277, since there seems to be no difference between %RFM97 and %SX1277 modules. +*/ +RADIOLIB_TYPE_ALIAS(SX1277, RFM97); + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1278.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1278.cpp new file mode 100644 index 00000000..90325ff0 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1278.cpp @@ -0,0 +1,644 @@ +#include "SX1278.h" +#include +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +SX1278::SX1278(Module* mod) : SX127x(mod) { + +} + +int16_t SX1278::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) { + // execute common part + uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; + int16_t state = SX127x::begin(versions, 3, syncWord, preambleLength); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = setGain(gain); + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + state = setCRC(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1278::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, bool enableOOK) { + // execute common part + uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; + int16_t state = SX127x::beginFSK(versions, 3, freqDev, rxBw, preambleLength, enableOOK); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = configFSK(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + if(enableOOK) { + state = setDataShapingOOK(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } else { + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } + + // set publicly accessible settings that are not a part of begin method + state = setCRC(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +void SX1278::reset() { + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + this->mod->hal->delay(1); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + this->mod->hal->delay(5); +} + +int16_t SX1278::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE(freq, 137.0, 525.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // set frequency and if successful, save the new setting + int16_t state = SX127x::setFrequencyRaw(freq); + if(state == RADIOLIB_ERR_NONE) { + SX127x::frequency = freq; + } + return(state); +} + +int16_t SX1278::setBandwidth(float bw) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + uint8_t newBandwidth; + + // check allowed bandwidth values + if(fabs(bw - 7.8) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_7_80_KHZ; + } else if(fabs(bw - 10.4) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_10_40_KHZ; + } else if(fabs(bw - 15.6) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_15_60_KHZ; + } else if(fabs(bw - 20.8) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_20_80_KHZ; + } else if(fabs(bw - 31.25) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_31_25_KHZ; + } else if(fabs(bw - 41.7) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_41_70_KHZ; + } else if(fabs(bw - 62.5) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_62_50_KHZ; + } else if(fabs(bw - 125.0) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_125_00_KHZ; + } else if(fabs(bw - 250.0) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_250_00_KHZ; + } else if(fabs(bw - 500.0) <= 0.001) { + newBandwidth = RADIOLIB_SX1278_BW_500_00_KHZ; + } else { + return(RADIOLIB_ERR_INVALID_BANDWIDTH); + } + + // set bandwidth and if successful, save the new setting + int16_t state = SX1278::setBandwidthRaw(newBandwidth); + if(state == RADIOLIB_ERR_NONE) { + SX127x::bandwidth = bw; + + // calculate symbol length and set low data rate optimization, if auto-configuration is enabled + if(this->ldroAuto) { + float symbolLength = (float)(uint32_t(1) << SX127x::spreadingFactor) / (float)SX127x::bandwidth; + if(symbolLength >= 16.0) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_MODEM_CONFIG_3, RADIOLIB_SX1278_LOW_DATA_RATE_OPT_ON, 3, 3); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_MODEM_CONFIG_3, RADIOLIB_SX1278_LOW_DATA_RATE_OPT_OFF, 3, 3); + } + } + } + return(state); +} + +int16_t SX1278::setSpreadingFactor(uint8_t sf) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + uint8_t newSpreadingFactor; + + // check allowed spreading factor values + switch(sf) { + case 6: + newSpreadingFactor = RADIOLIB_SX127X_SF_6; + break; + case 7: + newSpreadingFactor = RADIOLIB_SX127X_SF_7; + break; + case 8: + newSpreadingFactor = RADIOLIB_SX127X_SF_8; + break; + case 9: + newSpreadingFactor = RADIOLIB_SX127X_SF_9; + break; + case 10: + newSpreadingFactor = RADIOLIB_SX127X_SF_10; + break; + case 11: + newSpreadingFactor = RADIOLIB_SX127X_SF_11; + break; + case 12: + newSpreadingFactor = RADIOLIB_SX127X_SF_12; + break; + default: + return(RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + } + + // set spreading factor and if successful, save the new setting + int16_t state = SX1278::setSpreadingFactorRaw(newSpreadingFactor); + if(state == RADIOLIB_ERR_NONE) { + SX127x::spreadingFactor = sf; + + // calculate symbol length and set low data rate optimization, if auto-configuration is enabled + if(this->ldroAuto) { + float symbolLength = (float)(uint32_t(1) << SX127x::spreadingFactor) / (float)SX127x::bandwidth; + if(symbolLength >= 16.0) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_MODEM_CONFIG_3, RADIOLIB_SX1278_LOW_DATA_RATE_OPT_ON, 3, 3); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_MODEM_CONFIG_3, RADIOLIB_SX1278_LOW_DATA_RATE_OPT_OFF, 3, 3); + } + } + } + return(state); +} + +int16_t SX1278::setCodingRate(uint8_t cr) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + uint8_t newCodingRate; + + // check allowed coding rate values + switch(cr) { + case 5: + newCodingRate = RADIOLIB_SX1278_CR_4_5; + break; + case 6: + newCodingRate = RADIOLIB_SX1278_CR_4_6; + break; + case 7: + newCodingRate = RADIOLIB_SX1278_CR_4_7; + break; + case 8: + newCodingRate = RADIOLIB_SX1278_CR_4_8; + break; + default: + return(RADIOLIB_ERR_INVALID_CODING_RATE); + } + + // set coding rate and if successful, save the new setting + int16_t state = SX1278::setCodingRateRaw(newCodingRate); + if(state == RADIOLIB_ERR_NONE) { + SX127x::codingRate = cr; + } + return(state); +} + +int16_t SX1278::setBitRate(float br) { + return(SX127x::setBitRateCommon(br, RADIOLIB_SX1278_REG_BIT_RATE_FRAC)); +} + +int16_t SX1278::setDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + uint8_t modem = this->getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set the bit rate + state = this->setBitRate(dr.fsk.bitRate); + RADIOLIB_ASSERT(state); + + // set the frequency deviation + state = this->setFrequencyDeviation(dr.fsk.freqDev); + + } else if(modem == RADIOLIB_SX127X_LORA) { + // set the spreading factor + state = this->setSpreadingFactor(dr.lora.spreadingFactor); + RADIOLIB_ASSERT(state); + + // set the bandwidth + state = this->setBandwidth(dr.lora.bandwidth); + RADIOLIB_ASSERT(state); + + // set the coding rate + state = this->setCodingRate(dr.lora.codingRate); + } + + return(state); +} + +int16_t SX1278::setOutputPower(int8_t power) { + return(this->setOutputPower(power, false)); +} + +int16_t SX1278::setOutputPower(int8_t power, bool useRfo) { + // check allowed power range + if(useRfo) { + // RFO output + RADIOLIB_CHECK_RANGE(power, -3, 15, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } else { + // PA_BOOST output, check high-power operation + if(power != 20) { + RADIOLIB_CHECK_RANGE(power, 2, 17, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } + } + + // set mode to standby + int16_t state = SX127x::standby(); + + if(useRfo) { + uint8_t paCfg = 0; + if(power < 0) { + // low power mode RFO output + paCfg = RADIOLIB_SX1278_LOW_POWER | (power + 3); + } else { + // high power mode RFO output + paCfg = RADIOLIB_SX1278_MAX_POWER | power; + } + + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_RFO, 7, 7); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, paCfg, 6, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_OFF, 2, 0); + + } else { + if(power != 20) { + // power is 2 - 17 dBm, enable PA1 + PA2 on PA_BOOST + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_BOOST, 7, 7); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX1278_MAX_POWER | (power - 2), 6, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_OFF, 2, 0); + + } else { + // power is 20 dBm, enable PA1 + PA2 on PA_BOOST and enable high power control + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_BOOST, 7, 7); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX1278_MAX_POWER | 0x0F, 6, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_ON, 2, 0); + + } + } + + return(state); +} + +int16_t SX1278::setGain(uint8_t gain) { + // check allowed range + if(gain > 6) { + return(RADIOLIB_ERR_INVALID_GAIN); + } + + // set mode to standby + int16_t state = SX127x::standby(); + + // get modem + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA){ + // set gain + if(gain == 0) { + // gain set to 0, enable AGC loop + state |= this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_MODEM_CONFIG_3, RADIOLIB_SX1278_AGC_AUTO_ON, 2, 2); + } else { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_MODEM_CONFIG_3, RADIOLIB_SX1278_AGC_AUTO_OFF, 2, 2); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_LNA, (gain << 5) | RADIOLIB_SX127X_LNA_BOOST_ON); + } + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set gain + if(gain == 0) { + // gain set to 0, enable AGC loop + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_CONFIG, RADIOLIB_SX127X_AGC_AUTO_ON, 3, 3); + } else { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_CONFIG, RADIOLIB_SX1278_AGC_AUTO_OFF, 3, 3); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_LNA, (gain << 5) | RADIOLIB_SX127X_LNA_BOOST_ON); + } + + } + + return(state); +} + +int16_t SX1278::setDataShaping(uint8_t sh) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // check modulation + if(SX127x::ookEnabled) { + // we're in OOK mode, the only thing we can do is disable + if(sh == RADIOLIB_SHAPING_NONE) { + return(setDataShapingOOK(0)); + } + + return(RADIOLIB_ERR_INVALID_MODULATION); + } + + // set mode to standby + int16_t state = SX127x::standby(); + RADIOLIB_ASSERT(state); + + // set data shaping + switch(sh) { + case RADIOLIB_SHAPING_NONE: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_RAMP, RADIOLIB_SX1278_NO_SHAPING, 6, 5)); + case RADIOLIB_SHAPING_0_3: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_RAMP, RADIOLIB_SX1278_FSK_GAUSSIAN_0_3, 6, 5)); + case RADIOLIB_SHAPING_0_5: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_RAMP, RADIOLIB_SX1278_FSK_GAUSSIAN_0_5, 6, 5)); + case RADIOLIB_SHAPING_1_0: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_RAMP, RADIOLIB_SX1278_FSK_GAUSSIAN_1_0, 6, 5)); + default: + return(RADIOLIB_ERR_INVALID_DATA_SHAPING); + } +} + +int16_t SX1278::setDataShapingOOK(uint8_t sh) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // check modulation + if(!SX127x::ookEnabled) { + return(RADIOLIB_ERR_INVALID_MODULATION); + } + + // set mode to standby + int16_t state = SX127x::standby(); + + // set data shaping + switch(sh) { + case 0: + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_RAMP, RADIOLIB_SX1278_NO_SHAPING, 6, 5); + break; + case 1: + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_RAMP, RADIOLIB_SX1278_OOK_FILTER_BR, 6, 5); + break; + case 2: + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_RAMP, RADIOLIB_SX1278_OOK_FILTER_2BR, 6, 5); + break; + default: + return(RADIOLIB_ERR_INVALID_DATA_SHAPING); + } + + return(state); +} + +float SX1278::getRSSI(bool packet, bool skipReceive) { + int16_t offset = -157; + if(frequency < 868.0) { + offset = -164; + } + return(SX127x::getRSSI(packet, skipReceive, offset)); +} + +int16_t SX1278::setCRC(bool enable, bool mode) { + if(getActiveModem() == RADIOLIB_SX127X_LORA) { + // set LoRa CRC + SX127x::crcEnabled = enable; + if(enable) { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX1278_RX_CRC_MODE_ON, 2, 2)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX1278_RX_CRC_MODE_OFF, 2, 2)); + } + } else { + // set FSK CRC + int16_t state = RADIOLIB_ERR_NONE; + if(enable) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_ON, 4, 4); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_OFF, 4, 4); + } + RADIOLIB_ASSERT(state); + + // set FSK CRC mode + if(mode) { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_WHITENING_TYPE_IBM, 0, 0)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_WHITENING_TYPE_CCITT, 0, 0)); + } + } +} + +int16_t SX1278::forceLDRO(bool enable) { + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + this->ldroAuto = false; + if(enable) { + return(this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_MODEM_CONFIG_3, RADIOLIB_SX1278_LOW_DATA_RATE_OPT_ON, 3, 3)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_MODEM_CONFIG_3, RADIOLIB_SX1278_LOW_DATA_RATE_OPT_OFF, 3, 3)); + } +} + +int16_t SX1278::autoLDRO() { + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + this->ldroAuto = true; + return(RADIOLIB_ERR_NONE); +} + +int16_t SX1278::implicitHeader(size_t len) { + return(setHeaderType(RADIOLIB_SX1278_HEADER_IMPL_MODE, len)); +} + +int16_t SX1278::explicitHeader() { + return(setHeaderType(RADIOLIB_SX1278_HEADER_EXPL_MODE)); +} + +int16_t SX1278::setBandwidthRaw(uint8_t newBandwidth) { + // set mode to standby + int16_t state = SX127x::standby(); + + // write register + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, newBandwidth, 7, 4); + return(state); +} + +int16_t SX1278::setSpreadingFactorRaw(uint8_t newSpreadingFactor) { + // set mode to standby + int16_t state = SX127x::standby(); + + // write registers + if(newSpreadingFactor == RADIOLIB_SX127X_SF_6) { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1278_HEADER_IMPL_MODE, 0, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX127X_SF_6 | RADIOLIB_SX127X_TX_MODE_SINGLE, 7, 3); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECT_OPTIMIZE, RADIOLIB_SX127X_DETECT_OPTIMIZE_SF_6, 2, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECTION_THRESHOLD, RADIOLIB_SX127X_DETECTION_THRESHOLD_SF_6); + } else { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1278_HEADER_EXPL_MODE, 0, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, newSpreadingFactor | RADIOLIB_SX127X_TX_MODE_SINGLE, 7, 3); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECT_OPTIMIZE, RADIOLIB_SX127X_DETECT_OPTIMIZE_SF_7_12, 2, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECTION_THRESHOLD, RADIOLIB_SX127X_DETECTION_THRESHOLD_SF_7_12); + } + return(state); +} + +int16_t SX1278::setCodingRateRaw(uint8_t newCodingRate) { + // set mode to standby + int16_t state = SX127x::standby(); + + // write register + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, newCodingRate, 3, 1); + return(state); +} + +int16_t SX1278::setHeaderType(uint8_t headerType, size_t len) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set requested packet mode + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, headerType, 0, 0); + RADIOLIB_ASSERT(state); + + // set length to register + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH, len); + RADIOLIB_ASSERT(state); + + // update cached value + SX127x::packetLength = len; + + return(state); +} + +int16_t SX1278::configFSK() { + // configure common registers + int16_t state = SX127x::configFSK(); + RADIOLIB_ASSERT(state); + + // set fast PLL hop + state = this->mod->SPIsetRegValue(RADIOLIB_SX1278_REG_PLL_HOP, RADIOLIB_SX127X_FAST_HOP_ON, 7, 7); + return(state); +} + +void SX1278::errataFix(bool rx) { + // only apply in LoRa mode + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return; + } + + // sensitivity optimization for 500kHz bandwidth + // see SX1276/77/78 Errata, section 2.1 for details + if(fabs(SX127x::bandwidth - 500.0) <= 0.001) { + if((frequency >= 862.0) && (frequency <= 1020.0)) { + this->mod->SPIwriteRegister(0x36, 0x02); + this->mod->SPIwriteRegister(0x3a, 0x64); + } else if((frequency >= 410.0) && (frequency <= 525.0)) { + this->mod->SPIwriteRegister(0x36, 0x02); + this->mod->SPIwriteRegister(0x3a, 0x7F); + } + } + + // mitigation of receiver spurious response + // see SX1276/77/78 Errata, section 2.3 for details + + // figure out what we need to set + uint8_t fixedRegs[3] = { 0x00, 0x00, 0x00 }; + float rxFreq = frequency; + if(fabs(SX127x::bandwidth - 7.8) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x48; + fixedRegs[2] = 0x00; + rxFreq += 0.00781; + } else if(fabs(SX127x::bandwidth - 10.4) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x44; + fixedRegs[2] = 0x00; + rxFreq += 0.01042; + } else if(fabs(SX127x::bandwidth - 15.6) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x44; + fixedRegs[2] = 0x00; + rxFreq += 0.01562; + } else if(fabs(SX127x::bandwidth - 20.8) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x44; + fixedRegs[2] = 0x00; + rxFreq += 0.02083; + } else if(fabs(SX127x::bandwidth - 31.25) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x44; + fixedRegs[2] = 0x00; + rxFreq += 0.03125; + } else if(fabs(SX127x::bandwidth - 41.7) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x44; + fixedRegs[2] = 0x00; + rxFreq += 0.04167; + } else if(fabs(SX127x::bandwidth - 62.5) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x40; + fixedRegs[2] = 0x00; + } else if(fabs(SX127x::bandwidth - 125.0) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x40; + fixedRegs[2] = 0x00; + } else if(fabs(SX127x::bandwidth - 250.0) <= 0.001) { + fixedRegs[0] = 0b0000000; + fixedRegs[1] = 0x40; + fixedRegs[2] = 0x00; + } else if(fabs(SX127x::bandwidth - 500.0) <= 0.001) { + fixedRegs[0] = 0b1000000; + fixedRegs[1] = this->mod->SPIreadRegister(0x2F); + fixedRegs[2] = this->mod->SPIreadRegister(0x30); + } else { + return; + } + + // first, go to standby + standby(); + + // shift the freqency up when receiving, or restore the original when transmitting + if(rx) { + SX127x::setFrequencyRaw(rxFreq); + } else { + SX127x::setFrequencyRaw(frequency); + } + + // finally, apply errata fixes + this->mod->SPIsetRegValue(0x31, fixedRegs[0], 7, 7); + this->mod->SPIsetRegValue(0x2F, fixedRegs[1]); + this->mod->SPIsetRegValue(0x30, fixedRegs[2]); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1278.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1278.h new file mode 100644 index 00000000..c9f966a2 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1278.h @@ -0,0 +1,312 @@ +#if !defined(_RADIOLIB_SX1278_H) +#define _RADIOLIB_SX1278_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +#include "../../Module.h" +#include "SX127x.h" + +// SX1278 specific register map +#define RADIOLIB_SX1278_REG_MODEM_CONFIG_3 0x26 +#define RADIOLIB_SX1278_REG_PLL_HOP 0x44 +#define RADIOLIB_SX1278_REG_TCXO 0x4B +#define RADIOLIB_SX1278_REG_PA_DAC 0x4D +#define RADIOLIB_SX1278_REG_FORMER_TEMP 0x5B +#define RADIOLIB_SX1278_REG_BIT_RATE_FRAC 0x5D +#define RADIOLIB_SX1278_REG_AGC_REF 0x61 +#define RADIOLIB_SX1278_REG_AGC_THRESH_1 0x62 +#define RADIOLIB_SX1278_REG_AGC_THRESH_2 0x63 +#define RADIOLIB_SX1278_REG_AGC_THRESH_3 0x64 +#define RADIOLIB_SX1278_REG_PLL 0x70 + +// SX1278 LoRa modem settings +// RADIOLIB_SX1278_REG_OP_MODE MSB LSB DESCRIPTION +#define RADIOLIB_SX1278_HIGH_FREQ 0b00000000 // 3 3 access HF test registers +#define RADIOLIB_SX1278_LOW_FREQ 0b00001000 // 3 3 access LF test registers + +// RADIOLIB_SX1278_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB +#define RADIOLIB_SX1278_FRF_MSB 0x6C // 7 0 carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19 +#define RADIOLIB_SX1278_FRF_MID 0x80 // 7 0 where F(XOSC) = 32 MHz +#define RADIOLIB_SX1278_FRF_LSB 0x00 // 7 0 FRF = 3 byte value of FRF registers + +// RADIOLIB_SX1278_REG_PA_CONFIG +#define RADIOLIB_SX1278_MAX_POWER 0b01110000 // 6 4 max power: P_max = 10.8 + 0.6*MAX_POWER [dBm]; P_max(MAX_POWER = 0b111) = 15 dBm +#define RADIOLIB_SX1278_LOW_POWER 0b00100000 // 6 4 + +// RADIOLIB_SX1278_REG_LNA +#define RADIOLIB_SX1278_LNA_BOOST_LF_OFF 0b00000000 // 4 3 default LNA current + +// SX127X_REG_MODEM_CONFIG_1 +#define RADIOLIB_SX1278_BW_7_80_KHZ 0b00000000 // 7 4 bandwidth: 7.80 kHz +#define RADIOLIB_SX1278_BW_10_40_KHZ 0b00010000 // 7 4 10.40 kHz +#define RADIOLIB_SX1278_BW_15_60_KHZ 0b00100000 // 7 4 15.60 kHz +#define RADIOLIB_SX1278_BW_20_80_KHZ 0b00110000 // 7 4 20.80 kHz +#define RADIOLIB_SX1278_BW_31_25_KHZ 0b01000000 // 7 4 31.25 kHz +#define RADIOLIB_SX1278_BW_41_70_KHZ 0b01010000 // 7 4 41.70 kHz +#define RADIOLIB_SX1278_BW_62_50_KHZ 0b01100000 // 7 4 62.50 kHz +#define RADIOLIB_SX1278_BW_125_00_KHZ 0b01110000 // 7 4 125.00 kHz +#define RADIOLIB_SX1278_BW_250_00_KHZ 0b10000000 // 7 4 250.00 kHz +#define RADIOLIB_SX1278_BW_500_00_KHZ 0b10010000 // 7 4 500.00 kHz +#define RADIOLIB_SX1278_CR_4_5 0b00000010 // 3 1 error coding rate: 4/5 +#define RADIOLIB_SX1278_CR_4_6 0b00000100 // 3 1 4/6 +#define RADIOLIB_SX1278_CR_4_7 0b00000110 // 3 1 4/7 +#define RADIOLIB_SX1278_CR_4_8 0b00001000 // 3 1 4/8 +#define RADIOLIB_SX1278_HEADER_EXPL_MODE 0b00000000 // 0 0 explicit header mode +#define RADIOLIB_SX1278_HEADER_IMPL_MODE 0b00000001 // 0 0 implicit header mode + +// SX127X_REG_MODEM_CONFIG_2 +#define RADIOLIB_SX1278_RX_CRC_MODE_OFF 0b00000000 // 2 2 CRC disabled +#define RADIOLIB_SX1278_RX_CRC_MODE_ON 0b00000100 // 2 2 CRC enabled + +// RADIOLIB_SX1278_REG_MODEM_CONFIG_3 +#define RADIOLIB_SX1278_LOW_DATA_RATE_OPT_OFF 0b00000000 // 3 3 low data rate optimization disabled +#define RADIOLIB_SX1278_LOW_DATA_RATE_OPT_ON 0b00001000 // 3 3 low data rate optimization enabled +#define RADIOLIB_SX1278_AGC_AUTO_OFF 0b00000000 // 2 2 LNA gain set by REG_LNA +#define RADIOLIB_SX1278_AGC_AUTO_ON 0b00000100 // 2 2 LNA gain set by internal AGC loop + +// SX127X_REG_VERSION +#define RADIOLIB_SX1278_CHIP_VERSION 0x12 // this is the "official" version listed in datasheet +#define RADIOLIB_SX1278_CHIP_VERSION_ALT 0x13 // appears sometimes +#define RADIOLIB_SX1278_CHIP_VERSION_RFM9X 0x11 // this value is used for the RFM9x + +// SX1278 FSK modem settings +// SX127X_REG_PA_RAMP +#define RADIOLIB_SX1278_NO_SHAPING 0b00000000 // 6 5 data shaping: no shaping (default) +#define RADIOLIB_SX1278_FSK_GAUSSIAN_1_0 0b00100000 // 6 5 FSK modulation Gaussian filter, BT = 1.0 +#define RADIOLIB_SX1278_FSK_GAUSSIAN_0_5 0b01000000 // 6 5 FSK modulation Gaussian filter, BT = 0.5 +#define RADIOLIB_SX1278_FSK_GAUSSIAN_0_3 0b01100000 // 6 5 FSK modulation Gaussian filter, BT = 0.3 +#define RADIOLIB_SX1278_OOK_FILTER_BR 0b00100000 // 6 5 OOK modulation filter, f_cutoff = BR +#define RADIOLIB_SX1278_OOK_FILTER_2BR 0b01000000 // 6 5 OOK modulation filter, f_cutoff = 2*BR + +// RADIOLIB_SX1278_REG_AGC_REF +#define RADIOLIB_SX1278_AGC_REFERENCE_LEVEL_LF 0x19 // 5 0 floor reference for AGC thresholds: AgcRef = -174 + 10*log(2*RxBw) + 8 + AGC_REFERENCE_LEVEL [dBm]: below 525 MHz +#define RADIOLIB_SX1278_AGC_REFERENCE_LEVEL_HF 0x1C // 5 0 above 779 MHz + +// RADIOLIB_SX1278_REG_AGC_THRESH_1 +#define RADIOLIB_SX1278_AGC_STEP_1_LF 0x0C // 4 0 1st AGC threshold: below 525 MHz +#define RADIOLIB_SX1278_AGC_STEP_1_HF 0x0E // 4 0 above 779 MHz + +// RADIOLIB_SX1278_REG_AGC_THRESH_2 +#define RADIOLIB_SX1278_AGC_STEP_2_LF 0x40 // 7 4 2nd AGC threshold: below 525 MHz +#define RADIOLIB_SX1278_AGC_STEP_2_HF 0x50 // 7 4 above 779 MHz +#define RADIOLIB_SX1278_AGC_STEP_3 0x0B // 3 0 3rd AGC threshold + +// RADIOLIB_SX1278_REG_AGC_THRESH_3 +#define RADIOLIB_SX1278_AGC_STEP_4 0xC0 // 7 4 4th AGC threshold +#define RADIOLIB_SX1278_AGC_STEP_5 0x0C // 4 0 5th AGC threshold + +/*! + \class SX1278 + \brief Derived class for %SX1278 modules. Also used as base class for SX1276, SX1277, SX1279, RFM95 and RFM96. + All of these modules use the same basic hardware and only differ in parameter ranges (and names). +*/ +class SX1278: public SX127x { + public: + + // constructor + + /*! + \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. + \param mod Instance of Module that will be used to communicate with the %LoRa chip. + */ + SX1278(Module* mod); + + // basic methods + + /*! + \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 525.0 MHz. + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + Allowed values range from 6 to 65535. + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX127X_SYNC_WORD, int8_t power = 10, uint16_t preambleLength = 8, uint8_t gain = 0); + + /*! + \brief FSK modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 525.0 MHz. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 1.2 to 300.0 kbps. + \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.6 to 200.0 kHz. + Note that the allowed range changes based on bit rate setting, so that the condition FreqDev + BitRate/2 <= 250 kHz is always met. + \param rxBw Receiver bandwidth in kHz. Allowed values are 2.6, 3.1, 3.9, 5.2, 6.3, 7.8, 10.4, 12.5, 15.6, 20.8, 25, 31.3, 41.7, 50, 62.5, 83.3, 100, 125, 166.7, 200 and 250 kHz. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of FSK preamble in bits. + \param enableOOK Use OOK modulation instead of FSK. + \returns \ref status_codes + */ + int16_t beginFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint16_t preambleLength = 16, bool enableOOK = false); + + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + */ + void reset() override; + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 137.0 MHz to 525.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets %LoRa link bandwidth. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. Only available in %LoRa mode. + \param bw %LoRa link bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setBandwidth(float bw); + + /*! + \brief Sets %LoRa link spreading factor. Allowed values range from 6 to 12. Only available in %LoRa mode. + \param sf %LoRa link spreading factor to be set. + \returns \ref status_codes + */ + int16_t setSpreadingFactor(uint8_t sf); + + /*! + \brief Sets %LoRa link coding rate denominator. Allowed values range from 5 to 8. Only available in %LoRa mode. + \param cr %LoRa link coding rate denominator to be set. + \returns \ref status_codes + */ + int16_t setCodingRate(uint8_t cr); + + /*! + \brief Sets FSK bit rate. Allowed values range from 0.5 to 300 kbps. Only available in FSK mode. + \param br Bit rate to be set (in kbps). + \returns \ref status_codes + */ + int16_t setBitRate(float br) override; + + /*! + \brief Set data. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t setDataRate(DataRate_t dr) override; + + /*! + \brief Sets transmission output power. Allowed values range from -3 to 15 dBm (RFO pin) or +2 to +17 dBm (PA_BOOST pin). + High power +20 dBm operation is also supported, on the PA_BOOST pin. Defaults to PA_BOOST. + \param power Transmission output power in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power) override; + + /*! + \brief Sets transmission output power. Allowed values range from -3 to 15 dBm (RFO pin) or +2 to +17 dBm (PA_BOOST pin). + High power +20 dBm operation is also supported, on the PA_BOOST pin. + \param power Transmission output power in dBm. + \param useRfo Whether to use the RFO (true) or the PA_BOOST (false) pin for the RF output. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power, bool useRfo); + + /*! + \brief Sets gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + \param gain Gain of receiver LNA (low-noise amplifier) to be set. + \returns \ref status_codes + */ + int16_t setGain(uint8_t gain); + + /*! + \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. Only available in FSK mode with FSK modulation. + Allowed values are RADIOLIB_SHAPING_0_3, RADIOLIB_SHAPING_0_5 or RADIOLIB_SHAPING_1_0. Set to RADIOLIB_SHAPING_NONE to disable data shaping. + \param sh Gaussian shaping bandwidth-time product that will be used for data shaping + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! + \brief Sets filter cutoff frequency that will be used for data shaping. + Allowed values are 1 for frequency equal to bit rate and 2 for frequency equal to 2x bit rate. Set to 0 to disable data shaping. + Only available in FSK mode with OOK modulation. + \param sh Cutoff frequency that will be used for data shaping + \returns \ref status_codes + */ + int16_t setDataShapingOOK(uint8_t sh); + + /*! + \brief Gets recorded signal strength indicator. + \param packet Whether to read last packet RSSI, or the current value. LoRa mode only, ignored for FSK. + \param skipReceive Set to true to skip putting radio in receive mode for the RSSI measurement in FSK/OOK mode. + \returns RSSI value in dBm. + */ + float getRSSI(bool packet = true, bool skipReceive = false); + + /*! + \brief Enables/disables CRC check of received packets. + \param enable Enable (true) or disable (false) CRC. + \param mode Set CRC mode to SX127X_CRC_WHITENING_TYPE_CCITT for CCITT, polynomial X16 + X12 + X5 + 1 (false) + or SX127X_CRC_WHITENING_TYPE_IBM for IBM, polynomial X16 + X15 + X2 + 1 (true). Only valid in FSK mode. + \returns \ref status_codes + */ + int16_t setCRC(bool enable, bool mode = false); + + /*! + \brief Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method, + LDRO will always be set to the provided value, regardless of symbol length. + To re-enable automatic LDRO configuration, call SX1278::autoLDRO() + \param enable Force LDRO to be always enabled (true) or disabled (false). + \returns \ref status_codes + */ + int16_t forceLDRO(bool enable); + + /*! + \brief Re-enables automatic LDRO configuration. Only available in LoRa mode. After calling this method, + LDRO will be enabled automatically when symbol length exceeds 16 ms. + \returns \ref status_codes + */ + int16_t autoLDRO(); + + /*! + \brief Set implicit header mode for future reception/transmission. Required for spreading factor 6. + \param len Payload length in bytes. + \returns \ref status_codes + */ + int16_t implicitHeader(size_t len); + + /*! + \brief Set explicit header mode for future reception/transmission. + \returns \ref status_codes + */ + int16_t explicitHeader(); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + int16_t setBandwidthRaw(uint8_t newBandwidth); + int16_t setSpreadingFactorRaw(uint8_t newSpreadingFactor); + int16_t setCodingRateRaw(uint8_t newCodingRate); + int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF); + + int16_t configFSK(); + void errataFix(bool rx); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + bool ldroAuto = true; + bool ldroEnabled = false; + +}; + +/*! + \class RFM98 + \brief Only exists as alias for SX1278, since there seems to be no difference between %RFM98 and %SX1278 modules. +*/ +RADIOLIB_TYPE_ALIAS(SX1278, RFM98); + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1279.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1279.cpp new file mode 100644 index 00000000..4fdd4daa --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1279.cpp @@ -0,0 +1,82 @@ +#include "SX1279.h" +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +SX1279::SX1279(Module* mod) : SX1278(mod) { + +} + +int16_t SX1279::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) { + // execute common part + uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; + int16_t state = SX127x::begin(versions, 3, syncWord, preambleLength); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = setGain(gain); + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + state = setCRC(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX1279::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, bool enableOOK) { + // execute common part + uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; + int16_t state = SX127x::beginFSK(versions, 3, freqDev, rxBw, preambleLength, enableOOK); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = configFSK(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + if(enableOOK) { + state = setDataShapingOOK(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } else { + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + } + + return(state); +} + +int16_t SX1279::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE(freq, 137.0, 960.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // set frequency and if successful, save the new setting + int16_t state = SX127x::setFrequencyRaw(freq); + if(state == RADIOLIB_ERR_NONE) { + SX127x::frequency = freq; + } + return(state); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1279.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1279.h new file mode 100644 index 00000000..1b01368f --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX1279.h @@ -0,0 +1,74 @@ +#if !defined(_RADIOLIB_SX1279_H) +#define _RADIOLIB_SX1279_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +#include "SX1278.h" + +/*! + \class SX1279 + \brief Derived class for %SX1279 modules. Overrides some methods from SX1278 due to different parameter ranges. +*/ +class SX1279: public SX1278 { + public: + + // constructor + + /*! + \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. + \param mod Instance of Module that will be used to communicate with the %LoRa chip. + */ + SX1279(Module* mod); + + // basic methods + + /*! + \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 960.0 MHz. + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + Allowed values range from 6 to 65535. + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX127X_SYNC_WORD, int8_t power = 10, uint16_t preambleLength = 8, uint8_t gain = 0); + + /*! + \brief FSK modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 525.0 MHz. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 1.2 to 300.0 kbps. + \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.6 to 200.0 kHz. + Note that the allowed range changes based on bit rate setting, so that the condition FreqDev + BitRate/2 <= 250 kHz is always met. + \param rxBw Receiver bandwidth in kHz. Allowed values are 2.6, 3.1, 3.9, 5.2, 6.3, 7.8, 10.4, 12.5, 15.6, 20.8, 25, 31.3, 41.7, 50, 62.5, 83.3, 100, 125, 166.7, 200 and 250 kHz. + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + \param preambleLength Length of FSK preamble in bits. + \param enableOOK Use OOK modulation instead of FSK. + \returns \ref status_codes + */ + int16_t beginFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint16_t preambleLength = 16, bool enableOOK = false); + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 137.0 MHz to 960.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX127x.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX127x.cpp new file mode 100644 index 00000000..38fb6979 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX127x.cpp @@ -0,0 +1,1679 @@ +#include "SX127x.h" +#include +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +SX127x::SX127x(Module* mod) : PhysicalLayer(RADIOLIB_SX127X_FREQUENCY_STEP_SIZE, RADIOLIB_SX127X_MAX_PACKET_LENGTH) { + this->mod = mod; +} + +Module* SX127x::getMod() { + return(this->mod); +} + +int16_t SX127x::begin(uint8_t* chipVersions, uint8_t numVersions, uint8_t syncWord, uint16_t preambleLength) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + + // try to find the SX127x chip + if(!SX127x::findChip(chipVersions, numVersions)) { + RADIOLIB_DEBUG_PRINTLN("No SX127x found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + RADIOLIB_DEBUG_PRINTLN("M\tSX127x"); + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = config(); + RADIOLIB_ASSERT(state); + + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + // set LoRa mode + state = setActiveModem(RADIOLIB_SX127X_LORA); + RADIOLIB_ASSERT(state); + } + + // set LoRa sync word + state = SX127x::setSyncWord(syncWord); + RADIOLIB_ASSERT(state); + + // set over current protection + state = SX127x::setCurrentLimit(60); + RADIOLIB_ASSERT(state); + + // set preamble length + state = SX127x::setPreambleLength(preambleLength); + RADIOLIB_ASSERT(state); + + // disable IQ inversion + state = SX127x::invertIQ(false); + RADIOLIB_ASSERT(state); + + // initialize internal variables + this->dataRate = 0.0; + + return(state); +} + +int16_t SX127x::beginFSK(uint8_t* chipVersions, uint8_t numVersions, float freqDev, float rxBw, uint16_t preambleLength, bool enableOOK) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + + // try to find the SX127x chip + if(!SX127x::findChip(chipVersions, numVersions)) { + RADIOLIB_DEBUG_PRINTLN("No SX127x found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + RADIOLIB_DEBUG_PRINTLN("M\tSX127x"); + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // check currently active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + // set FSK mode + state = setActiveModem(RADIOLIB_SX127X_FSK_OOK); + RADIOLIB_ASSERT(state); + } + + // enable/disable OOK + state = setOOK(enableOOK); + RADIOLIB_ASSERT(state); + + // set frequency deviation + state = SX127x::setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + // set AFC bandwidth + state = SX127x::setAFCBandwidth(rxBw); + RADIOLIB_ASSERT(state); + + // set AFC&AGC trigger to RSSI (both in OOK and FSK) + state = SX127x::setAFCAGCTrigger(RADIOLIB_SX127X_RX_TRIGGER_RSSI_INTERRUPT); + RADIOLIB_ASSERT(state); + + // enable AFC + state = SX127x::setAFC(false); + RADIOLIB_ASSERT(state); + + // set receiver bandwidth + state = SX127x::setRxBandwidth(rxBw); + RADIOLIB_ASSERT(state); + + // set over current protection + state = SX127x::setCurrentLimit(60); + RADIOLIB_ASSERT(state); + + // set preamble length + state = SX127x::setPreambleLength(preambleLength); + RADIOLIB_ASSERT(state); + + // set preamble polarity + state = invertPreamble(false); + RADIOLIB_ASSERT(state); + + // set default sync word + uint8_t syncWord[] = {0x12, 0xAD}; + state = setSyncWord(syncWord, 2); + RADIOLIB_ASSERT(state); + + // disable address filtering + state = disableAddressFiltering(); + RADIOLIB_ASSERT(state); + + // set default RSSI measurement config + state = setRSSIConfig(2); + RADIOLIB_ASSERT(state); + + // set default encoding + state = setEncoding(RADIOLIB_ENCODING_NRZ); + RADIOLIB_ASSERT(state); + + // set default packet length mode + state = variablePacketLengthMode(); + + return(state); +} + +int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + int16_t modem = getActiveModem(); + uint32_t start = 0; + if(modem == RADIOLIB_SX127X_LORA) { + // calculate timeout (150 % of expected time-on-air) + uint32_t timeout = getTimeOnAir(len) * 1.5; + + // start transmission + state = startTransmit(data, len, addr); + RADIOLIB_ASSERT(state); + + // wait for packet transmission or timeout + start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + if(this->mod->hal->micros() - start > timeout) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // calculate timeout (5ms + 500 % of expected time-on-air) + uint32_t timeout = 5000 + getTimeOnAir(len) * 5; + + // start transmission + state = startTransmit(data, len, addr); + RADIOLIB_ASSERT(state); + + // wait for transmission end or timeout + start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + if(this->mod->hal->micros() - start > timeout) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + } else { + return(RADIOLIB_ERR_UNKNOWN); + } + + // update data rate + uint32_t elapsed = this->mod->hal->micros() - start; + this->dataRate = (len*8.0)/((float)elapsed/1000000.0); + + return(finishTransmit()); +} + +int16_t SX127x::receive(uint8_t* data, size_t len) { + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA) { + // set mode to receive + state = startReceive(len, RADIOLIB_SX127X_RXSINGLE); + RADIOLIB_ASSERT(state); + + // if no DIO1 is provided, use software timeout (100 LoRa symbols, same as hardware timeout) + uint32_t timeout = 0; + if(this->mod->getGpio() == RADIOLIB_NC) { + float symbolLength = (float) (uint32_t(1) << this->spreadingFactor) / (float) this->bandwidth; + timeout = 100*symbolLength; + } + + // wait for packet reception or timeout + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + + if(this->mod->getGpio() == RADIOLIB_NC) { + // no GPIO pin provided, use software timeout + if(this->mod->hal->micros() - start > timeout) { + clearIRQFlags(); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } else { + // GPIO provided, use that + if(this->mod->hal->digitalRead(this->mod->getGpio())) { + clearIRQFlags(); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } + + } + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // calculate timeout (500 % of expected time-on-air) + uint32_t timeout = getTimeOnAir(len) * 5; + + // set mode to receive + state = startReceive(len, RADIOLIB_SX127X_RX); + RADIOLIB_ASSERT(state); + + // wait for packet reception or timeout + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + if(this->mod->hal->micros() - start > timeout) { + clearIRQFlags(); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } + } + + // read the received data + state = readData(data, len); + + return(state); +} + +int16_t SX127x::scanChannel() { + // start CAD + int16_t state = startChannelScan(); + RADIOLIB_ASSERT(state); + + // wait for channel activity detected or timeout + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + if(this->mod->hal->digitalRead(this->mod->getGpio())) { + return(RADIOLIB_PREAMBLE_DETECTED); + } + } + + return(RADIOLIB_CHANNEL_FREE); +} + +int16_t SX127x::sleep() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + // set mode to sleep + return(setMode(RADIOLIB_SX127X_SLEEP)); +} + +int16_t SX127x::standby() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + // set mode to standby + return(setMode(RADIOLIB_SX127X_STANDBY)); +} + +int16_t SX127x::standby(uint8_t mode) { + (void)mode; + return(standby()); +} + +int16_t SX127x::transmitDirect(uint32_t frf) { + // check modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // user requested to start transmitting immediately (required for RTTY) + if(frf != 0) { + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_FRF_MSB, (frf & 0xFF0000) >> 16); + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_FRF_MID, (frf & 0x00FF00) >> 8); + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_FRF_LSB, frf & 0x0000FF); + + return(setMode(RADIOLIB_SX127X_TX)); + } + + // activate direct mode + int16_t state = directMode(); + RADIOLIB_ASSERT(state); + + // apply fixes to errata + RADIOLIB_ERRATA_SX127X(false); + + // start transmitting + return(setMode(RADIOLIB_SX127X_TX)); +} + +int16_t SX127x::receiveDirect() { + // check modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // activate direct mode + int16_t state = directMode(); + RADIOLIB_ASSERT(state); + + // apply fixes to errata + RADIOLIB_ERRATA_SX127X(true); + + // start receiving + return(setMode(RADIOLIB_SX127X_RX)); +} + +int16_t SX127x::directMode() { + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + // set DIO mapping + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO1_CONT_DCLK | RADIOLIB_SX127X_DIO2_CONT_DATA, 5, 2); + RADIOLIB_ASSERT(state); + + // enable receiver startup without preamble or RSSI + state = SX127x::setAFCAGCTrigger(RADIOLIB_SX127X_RX_TRIGGER_NONE); + RADIOLIB_ASSERT(state); + + // set continuous mode + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_2, RADIOLIB_SX127X_DATA_MODE_CONTINUOUS, 6, 6)); +} + +int16_t SX127x::packetMode() { + // check modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_2, RADIOLIB_SX127X_DATA_MODE_PACKET, 6, 6)); +} + +int16_t SX127x::startReceive() { + return(this->startReceive(0, RADIOLIB_SX127X_RXCONTINUOUS)); +} + +int16_t SX127x::startReceive(uint8_t len, uint8_t mode) { + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA) { + // set DIO pin mapping + if(this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_HOP_PERIOD) > RADIOLIB_SX127X_HOP_PERIOD_OFF) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO0_LORA_RX_DONE | RADIOLIB_SX127X_DIO1_LORA_FHSS_CHANGE_CHANNEL, 7, 4); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO0_LORA_RX_DONE | RADIOLIB_SX127X_DIO1_LORA_RX_TIMEOUT, 7, 4); + } + + // set expected packet length for SF6 + if(this->spreadingFactor == 6) { + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH, len); + this->packetLength = len; + } + + // apply fixes to errata + RADIOLIB_ERRATA_SX127X(true); + + // clear interrupt flags + clearIRQFlags(); + + // set FIFO pointers + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FIFO_RX_BASE_ADDR, RADIOLIB_SX127X_FIFO_RX_BASE_ADDR_MAX); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FIFO_ADDR_PTR, RADIOLIB_SX127X_FIFO_RX_BASE_ADDR_MAX); + RADIOLIB_ASSERT(state); + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set DIO pin mapping + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO0_PACK_PAYLOAD_READY, 7, 6); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + clearIRQFlags(); + + // FSK modem does not distinguish between Rx single and continuous + if(mode == RADIOLIB_SX127X_RXCONTINUOUS) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + return(setMode(RADIOLIB_SX127X_RX)); + } + } + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set mode to receive + return(setMode(mode)); +} + +int16_t SX127x::startReceive(uint32_t mode, uint16_t irqFlags, uint16_t irqMask, size_t len) { + (void)irqFlags; + (void)irqMask; + return(startReceive((uint8_t)len, (uint8_t)mode)); +} + +void SX127x::setDio0Action(void (*func)(void), uint32_t dir) { + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq()), func, dir); +} + +void SX127x::clearDio0Action() { + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq())); +} + +void SX127x::setDio1Action(void (*func)(void), uint32_t dir) { + if(this->mod->getGpio() == RADIOLIB_NC) { + return; + } + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getGpio()), func, dir); +} + +void SX127x::clearDio1Action() { + if(this->mod->getGpio() == RADIOLIB_NC) { + return; + } + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getGpio())); +} + +void SX127x::setPacketReceivedAction(void (*func)(void)) { + this->setDio0Action(func, this->mod->hal->GpioInterruptRising); +} + +void SX127x::clearPacketReceivedAction() { + this->clearDio0Action(); +} + +void SX127x::setPacketSentAction(void (*func)(void)) { + this->setDio0Action(func, this->mod->hal->GpioInterruptRising); +} + +void SX127x::clearPacketSentAction() { + this->clearDio0Action(); +} + +void SX127x::setChannelScanAction(void (*func)(void)) { + this->setDio0Action(func, this->mod->hal->GpioInterruptRising); +} + +void SX127x::clearChannelScanAction() { + this->clearDio0Action(); +} + +void SX127x::setFifoEmptyAction(void (*func)(void)) { + // set DIO1 to the FIFO empty event (the register setting is done in startTransmit) + setDio1Action(func, this->mod->hal->GpioInterruptRising); +} + +void SX127x::clearFifoEmptyAction() { + clearDio1Action(); +} + +void SX127x::setFifoFullAction(void (*func)(void)) { + // set the interrupt + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FIFO_THRESH, RADIOLIB_SX127X_FIFO_THRESH, 5, 0); + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO1_PACK_FIFO_LEVEL, 5, 4); + + // set DIO1 to the FIFO full event + setDio1Action(func, this->mod->hal->GpioInterruptRising); +} + +void SX127x::clearFifoFullAction() { + clearDio1Action(); + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, 0x00, 5, 4); +} + +bool SX127x::fifoAdd(uint8_t* data, int totalLen, int* remLen) { + // subtract first (this may be the first time we get to modify the remaining length) + *remLen -= RADIOLIB_SX127X_FIFO_THRESH - 1; + + // check if there is still something left to send + if(*remLen <= 0) { + // we're done + return(true); + } + + // calculate the number of bytes we can copy + int len = *remLen; + if(len > RADIOLIB_SX127X_FIFO_THRESH - 1) { + len = RADIOLIB_SX127X_FIFO_THRESH - 1; + } + + // copy the bytes to the FIFO + this->mod->SPIwriteRegisterBurst(RADIOLIB_SX127X_REG_FIFO, &data[totalLen - *remLen], len); + + // we're not done yet + return(false); +} + +bool SX127x::fifoGet(volatile uint8_t* data, int totalLen, volatile int* rcvLen) { + // get pointer to the correct position in data buffer + uint8_t* dataPtr = (uint8_t*)&data[*rcvLen]; + + // check how much data are we still expecting + uint8_t len = RADIOLIB_SX127X_FIFO_THRESH - 1; + if(totalLen - *rcvLen < len) { + // we're nearly at the end + len = totalLen - *rcvLen; + } + + // get the data + this->mod->SPIreadRegisterBurst(RADIOLIB_SX127X_REG_FIFO, len, dataPtr); + (*rcvLen) += (len); + + // check if we're done + if(*rcvLen >= totalLen) { + return(true); + } + return(false); +} + +int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA) { + // check packet length + if(len > RADIOLIB_SX127X_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set DIO mapping + if(this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_HOP_PERIOD) > RADIOLIB_SX127X_HOP_PERIOD_OFF) { + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO0_LORA_TX_DONE | RADIOLIB_SX127X_DIO1_LORA_FHSS_CHANGE_CHANNEL, 7, 4); + } else { + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO0_LORA_TX_DONE, 7, 6); + } + + // apply fixes to errata + RADIOLIB_ERRATA_SX127X(false); + + // clear interrupt flags + clearIRQFlags(); + + // set packet length + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH, len); + + // set FIFO pointers + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FIFO_TX_BASE_ADDR, RADIOLIB_SX127X_FIFO_TX_BASE_ADDR_MAX); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FIFO_ADDR_PTR, RADIOLIB_SX127X_FIFO_TX_BASE_ADDR_MAX); + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // clear interrupt flags + clearIRQFlags(); + + // set DIO mapping + if(len > RADIOLIB_SX127X_MAX_PACKET_LENGTH_FSK) { + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO1_PACK_FIFO_EMPTY, 5, 4); + } else { + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO0_PACK_PACKET_SENT, 7, 6); + } + + // set packet length + if (this->packetLengthConfig == RADIOLIB_SX127X_PACKET_VARIABLE) { + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_FIFO, len); + } + + // check address filtering + uint8_t filter = this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 2, 1); + if((filter == RADIOLIB_SX127X_ADDRESS_FILTERING_NODE) || (filter == RADIOLIB_SX127X_ADDRESS_FILTERING_NODE_BROADCAST)) { + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_FIFO, addr); + } + } + + // write packet to FIFO + size_t packetLen = len; + if((modem == RADIOLIB_SX127X_FSK_OOK) && (len > RADIOLIB_SX127X_MAX_PACKET_LENGTH_FSK)) { + packetLen = RADIOLIB_SX127X_FIFO_THRESH - 1; + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FIFO_THRESH, RADIOLIB_SX127X_TX_START_FIFO_NOT_EMPTY, 7, 7); + } + this->mod->SPIwriteRegisterBurst(RADIOLIB_SX127X_REG_FIFO, data, packetLen); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // start transmission + state |= setMode(RADIOLIB_SX127X_TX); + RADIOLIB_ASSERT(state); + + return(RADIOLIB_ERR_NONE); +} + +int16_t SX127x::finishTransmit() { + // wait for at least 1 bit at the lowest possible bit rate before clearing IRQ flags + // not doing this and clearing RADIOLIB_SX127X_FLAG_FIFO_OVERRUN will dump the FIFO, + // which can lead to mangling of the last bit (#808) + mod->hal->delayMicroseconds(1000000/1200); + + // clear interrupt flags + clearIRQFlags(); + + // set mode to standby to disable transmitter/RF switch + return(standby()); +} + +int16_t SX127x::readData(uint8_t* data, size_t len) { + int16_t modem = getActiveModem(); + + // get packet length + size_t length = getPacketLength(); + size_t dumpLen = 0; + if((len != 0) && (len < length)) { + // user requested less data than we got, only return what was requested + dumpLen = length - len; + length = len; + } + + // check payload CRC + int16_t state = RADIOLIB_ERR_NONE; + if(this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_IRQ_FLAGS, 5, 5) == RADIOLIB_SX127X_CLEAR_IRQ_FLAG_PAYLOAD_CRC_ERROR) { + state = RADIOLIB_ERR_CRC_MISMATCH; + } + + if(modem == RADIOLIB_SX127X_LORA) { + // check packet header integrity + if(this->crcEnabled && (state == RADIOLIB_ERR_NONE) && (this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_HOP_CHANNEL, 6, 6) == 0)) { + // CRC is disabled according to packet header and enabled according to user + // most likely damaged packet header + state = RADIOLIB_ERR_LORA_HEADER_DAMAGED; + } + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // check address filtering + uint8_t filter = this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 2, 1); + if((filter == RADIOLIB_SX127X_ADDRESS_FILTERING_NODE) || (filter == RADIOLIB_SX127X_ADDRESS_FILTERING_NODE_BROADCAST)) { + this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_FIFO); + } + } + + // read packet data + this->mod->SPIreadRegisterBurst(RADIOLIB_SX127X_REG_FIFO, length, data); + + // dump the bytes that weren't requested + if(dumpLen != 0) { + clearFIFO(dumpLen); + } + + // clear internal flag so getPacketLength can return the new packet length + this->packetLengthQueried = false; + + // clear interrupt flags + clearIRQFlags(); + + return(state); +} + +int16_t SX127x::startChannelScan() { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + clearIRQFlags(); + + // set DIO pin mapping + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, RADIOLIB_SX127X_DIO0_LORA_CAD_DONE | RADIOLIB_SX127X_DIO1_LORA_CAD_DETECTED, 7, 4); + RADIOLIB_ASSERT(state); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set mode to CAD + state = setMode(RADIOLIB_SX127X_CAD); + return(state); +} + +int16_t SX127x::getChannelScanResult() { + if((this->getIRQFlags() & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_CAD_DETECTED) == RADIOLIB_SX127X_CLEAR_IRQ_FLAG_CAD_DETECTED) { + return(RADIOLIB_PREAMBLE_DETECTED); + } + return(RADIOLIB_CHANNEL_FREE); +} + +int16_t SX127x::setSyncWord(uint8_t syncWord) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + setMode(RADIOLIB_SX127X_STANDBY); + + // write register + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_SYNC_WORD, syncWord)); +} + +int16_t SX127x::setCurrentLimit(uint8_t currentLimit) { + // check allowed range + if(!(((currentLimit >= 45) && (currentLimit <= 240)) || (currentLimit == 0))) { + return(RADIOLIB_ERR_INVALID_CURRENT_LIMIT); + } + + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + + // set OCP limit + uint8_t raw; + if(currentLimit == 0) { + // limit set to 0, disable OCP + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OCP, RADIOLIB_SX127X_OCP_OFF, 5, 5); + } else if(currentLimit <= 120) { + raw = (currentLimit - 45) / 5; + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OCP, RADIOLIB_SX127X_OCP_ON | raw, 5, 0); + } else if(currentLimit <= 240) { + raw = (currentLimit + 30) / 10; + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OCP, RADIOLIB_SX127X_OCP_ON | raw, 5, 0); + } + return(state); +} + +int16_t SX127x::setPreambleLength(size_t preambleLength) { + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + // check active modem + uint8_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA) { + // check allowed range + if(preambleLength < 6) { + return(RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH); + } + + // set preamble length + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB, (uint8_t)((preambleLength >> 8) & 0xFF)); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB, (uint8_t)(preambleLength & 0xFF)); + return(state); + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set preamble length (in bytes) + uint16_t numBytes = preambleLength / 8; + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB_FSK, (uint8_t)((numBytes >> 8) & 0xFF)); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB_FSK, (uint8_t)(numBytes & 0xFF)); + return(state); + } + + return(RADIOLIB_ERR_UNKNOWN); +} + +int16_t SX127x::invertPreamble(bool enable) { + // set mode to standby + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + // check active modem + uint8_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // set preamble polarity + uint8_t polarity = enable ? RADIOLIB_SX127X_PREAMBLE_POLARITY_AA : RADIOLIB_SX127X_PREAMBLE_POLARITY_55; + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, polarity, 5, 5); + return(state); + } + + return(RADIOLIB_ERR_UNKNOWN); +} + +float SX127x::getFrequencyError(bool autoCorrect) { + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA) { + // get raw frequency error + uint32_t raw = (uint32_t)this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_FEI_MSB, 3, 0) << 16; + raw |= (uint16_t)this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_FEI_MID) << 8; + raw |= this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_FEI_LSB); + + uint32_t base = (uint32_t)2 << 23; + float error; + + // check the first bit + if(raw & 0x80000) { + // frequency error is negative + raw |= (uint32_t)0xFFF00000; + raw = ~raw + 1; + error = (((float)raw * (float)base)/32000000.0) * (this->bandwidth/500.0) * -1.0; + } else { + error = (((float)raw * (float)base)/32000000.0) * (this->bandwidth/500.0); + } + + if(autoCorrect) { + // adjust LoRa modem data rate + float ppmOffset = 0.95 * (error/32.0); + this->mod->SPIwriteRegister(0x27, (uint8_t)ppmOffset); + } + + return(error); + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // get raw frequency error + uint16_t raw = (uint16_t)this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_FEI_MSB_FSK) << 8; + raw |= this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_FEI_LSB_FSK); + + uint32_t base = 1; + float error; + + // check the first bit + if(raw & 0x8000) { + // frequency error is negative + raw |= (uint32_t)0xFFF00000; + raw = ~raw + 1; + error = (float)raw * (32000000.0 / (float)(base << 19)) * -1.0; + } else { + error = (float)raw * (32000000.0 / (float)(base << 19)); + } + + return(error); + } + + return(RADIOLIB_ERR_UNKNOWN); +} + +float SX127x::getAFCError() +{ + // check active modem + int16_t modem = getActiveModem(); + if(modem != RADIOLIB_SX127X_FSK_OOK) { + return 0; + } + + // get raw frequency error + int16_t raw = (uint16_t)this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_AFC_MSB) << 8; + raw |= this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_AFC_LSB); + + uint32_t base = 1; + return raw * (32000000.0 / (float)(base << 19)); +} + +float SX127x::getSNR() { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(0); + } + + // get SNR value + int8_t rawSNR = (int8_t)this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PKT_SNR_VALUE); + return(rawSNR / 4.0); +} + +float SX127x::getDataRate() const { + return(this->dataRate); +} + +int16_t SX127x::setBitRateCommon(float br, uint8_t fracRegAddr) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // check allowed bit rate + // datasheet says 1.2 kbps should be the smallest possible, but 0.512 works fine + if(ookEnabled) { + RADIOLIB_CHECK_RANGE(br, 0.5, 32.768002, RADIOLIB_ERR_INVALID_BIT_RATE); // Found that 32.768 is 32.768002 + } else { + RADIOLIB_CHECK_RANGE(br, 0.5, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE); + } + + // set mode to STANDBY + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + // set bit rate + uint16_t bitRate = (RADIOLIB_SX127X_CRYSTAL_FREQ * 1000.0) / br; + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_BITRATE_MSB, (bitRate & 0xFF00) >> 8, 7, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_BITRATE_LSB, bitRate & 0x00FF, 7, 0); + + // set fractional part of bit rate + if(!ookEnabled) { + float bitRateRem = ((RADIOLIB_SX127X_CRYSTAL_FREQ * 1000.0) / (float)br) - (float)bitRate; + uint8_t bitRateFrac = bitRateRem * 16; + state |= this->mod->SPIsetRegValue(fracRegAddr, bitRateFrac, 7, 0); + } + + if(state == RADIOLIB_ERR_NONE) { + this->bitRate = br; + } + return(state); +} + +int16_t SX127x::setFrequencyDeviation(float freqDev) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set frequency deviation to lowest available setting (required for digimodes) + float newFreqDev = freqDev; + if(freqDev < 0.0) { + newFreqDev = 0.6; + } + + // check frequency deviation range + if(!((newFreqDev + this->bitRate/2.0 <= 250.0) && (freqDev <= 200.0))) { + return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + } + + // set mode to STANDBY + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + // set allowed frequency deviation + uint32_t base = 1; + uint32_t FDEV = (newFreqDev * (base << 19)) / 32000; + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FDEV_MSB, (FDEV & 0xFF00) >> 8, 5, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FDEV_LSB, FDEV & 0x00FF, 7, 0); + return(state); +} + +uint8_t SX127x::calculateBWManExp(float bandwidth) +{ + for(uint8_t e = 7; e >= 1; e--) { + for(int8_t m = 2; m >= 0; m--) { + float point = (RADIOLIB_SX127X_CRYSTAL_FREQ * 1000000.0)/(((4 * m) + 16) * ((uint32_t)1 << (e + 2))); + if(fabs(bandwidth - ((point / 1000.0) + 0.05)) <= 0.5) { + return((m << 3) | e); + } + } + } + return 0; +} + +int16_t SX127x::setRxBandwidth(float rxBw) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + RADIOLIB_CHECK_RANGE(rxBw, 2.6, 250.0, RADIOLIB_ERR_INVALID_RX_BANDWIDTH); + + // set mode to STANDBY + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + // set Rx bandwidth + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_BW, calculateBWManExp(rxBw), 4, 0)); +} + +int16_t SX127x::setAFCBandwidth(float rxBw) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK){ + return(RADIOLIB_ERR_WRONG_MODEM); + } + + RADIOLIB_CHECK_RANGE(rxBw, 2.6, 250.0, RADIOLIB_ERR_INVALID_RX_BANDWIDTH); + + // set mode to STANDBY + int16_t state = setMode(RADIOLIB_SX127X_STANDBY); + RADIOLIB_ASSERT(state); + + // set AFC bandwidth + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_AFC_BW, calculateBWManExp(rxBw), 4, 0)); +} + +int16_t SX127x::setAFC(bool isEnabled) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + //set AFC auto on/off + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_CONFIG, isEnabled ? RADIOLIB_SX127X_AFC_AUTO_ON : RADIOLIB_SX127X_AFC_AUTO_OFF, 4, 4)); +} + +int16_t SX127x::setAFCAGCTrigger(uint8_t trigger) { + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + //set AFC&AGC trigger + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_CONFIG, trigger, 2, 0)); +} + +int16_t SX127x::setSyncWord(uint8_t* syncWord, size_t len) { + // check active modem + uint8_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + + // disable sync word in case len is 0 + if(len == 0) { + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, RADIOLIB_SX127X_SYNC_OFF, 4, 4); + return(state); + } + + RADIOLIB_CHECK_RANGE(len, 1, 8, RADIOLIB_ERR_INVALID_SYNC_WORD); + + // sync word must not contain value 0x00 + for(size_t i = 0; i < len; i++) { + if(syncWord[i] == 0x00) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + } + + // enable sync word recognition + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, RADIOLIB_SX127X_SYNC_ON, 4, 4); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, len - 1, 2, 0); + RADIOLIB_ASSERT(state); + + // set sync word + this->mod->SPIwriteRegisterBurst(RADIOLIB_SX127X_REG_SYNC_VALUE_1, syncWord, len); + return(RADIOLIB_ERR_NONE); + + } else if(modem == RADIOLIB_SX127X_LORA) { + // with length set to 1 and LoRa modem active, assume it is the LoRa sync word + if(len > 1) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + + return(this->setSyncWord(syncWord[0])); + } + + return(RADIOLIB_ERR_WRONG_MODEM); +} + +int16_t SX127x::setNodeAddress(uint8_t nodeAddr) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // enable address filtering (node only) + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_ADDRESS_FILTERING_NODE, 2, 1); + RADIOLIB_ASSERT(state); + + // set node address + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_NODE_ADRS, nodeAddr)); +} + +int16_t SX127x::setBroadcastAddress(uint8_t broadAddr) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // enable address filtering (node + broadcast) + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_ADDRESS_FILTERING_NODE_BROADCAST, 2, 1); + RADIOLIB_ASSERT(state); + + // set broadcast address + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_BROADCAST_ADRS, broadAddr)); +} + +int16_t SX127x::disableAddressFiltering() { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // disable address filtering + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_ADDRESS_FILTERING_OFF, 2, 1); + RADIOLIB_ASSERT(state); + + // set node address to default (0x00) + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_NODE_ADRS, 0x00); + RADIOLIB_ASSERT(state); + + // set broadcast address to default (0x00) + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_BROADCAST_ADRS, 0x00)); +} + +int16_t SX127x::setOokThresholdType(uint8_t type) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OOK_PEAK, type, 4, 3, 5)); +} + +int16_t SX127x::setOokFixedOrFloorThreshold(uint8_t value) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OOK_FIX, value, 7, 0, 5)); +} + +int16_t SX127x::setOokPeakThresholdDecrement(uint8_t value) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OOK_AVG, value, 7, 5, 5)); +} + +int16_t SX127x::setOokPeakThresholdStep(uint8_t value) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OOK_PEAK, value, 2, 0, 5)); +} + +int16_t SX127x::enableBitSync() { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OOK_PEAK, RADIOLIB_SX127X_BIT_SYNC_ON, 5, 5, 5)); +} + +int16_t SX127x::disableBitSync() { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OOK_PEAK, RADIOLIB_SX127X_BIT_SYNC_OFF, 5, 5, 5)); +} + +int16_t SX127x::setOOK(bool enableOOK) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set OOK and if successful, save the new setting + int16_t state = RADIOLIB_ERR_NONE; + if(enableOOK) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX127X_MODULATION_OOK, 6, 5, 5); + state |= SX127x::setAFCAGCTrigger(RADIOLIB_SX127X_RX_TRIGGER_RSSI_INTERRUPT); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX127X_MODULATION_FSK, 6, 5, 5); + state |= SX127x::setAFCAGCTrigger(RADIOLIB_SX127X_RX_TRIGGER_BOTH); + } + if(state == RADIOLIB_ERR_NONE) { + ookEnabled = enableOOK; + } + + return(state); +} + +int16_t SX127x::setFrequencyRaw(float newFreq) { + int16_t state = RADIOLIB_ERR_NONE; + + // set mode to standby if not FHSS + if(this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_HOP_PERIOD) == RADIOLIB_SX127X_HOP_PERIOD_OFF) { + state = setMode(RADIOLIB_SX127X_STANDBY); + } + + // calculate register values + uint32_t FRF = (newFreq * (uint32_t(1) << RADIOLIB_SX127X_DIV_EXPONENT)) / RADIOLIB_SX127X_CRYSTAL_FREQ; + + // write registers + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FRF_MSB, (FRF & 0xFF0000) >> 16); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FRF_MID, (FRF & 0x00FF00) >> 8); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FRF_LSB, FRF & 0x0000FF); + return(state); +} + +size_t SX127x::getPacketLength(bool update) { + int16_t modem = getActiveModem(); + + if(modem == RADIOLIB_SX127X_LORA) { + if(this->spreadingFactor != 6) { + // get packet length for SF7 - SF12 + return(this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_RX_NB_BYTES)); + + } else { + // return the cached value for SF6 + return(this->packetLength); + } + + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // get packet length + if(!this->packetLengthQueried && update) { + if (this->packetLengthConfig == RADIOLIB_SX127X_PACKET_VARIABLE) { + this->packetLength = this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_FIFO); + } else { + this->packetLength = this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH_FSK); + } + this->packetLengthQueried = true; + } + } + + return(this->packetLength); +} + +int16_t SX127x::fixedPacketLengthMode(uint8_t len) { + return(SX127x::setPacketMode(RADIOLIB_SX127X_PACKET_FIXED, len)); +} + +int16_t SX127x::variablePacketLengthMode(uint8_t maxLen) { + return(SX127x::setPacketMode(RADIOLIB_SX127X_PACKET_VARIABLE, maxLen)); +} + +uint32_t SX127x::getTimeOnAir(size_t len) { + // check active modem + uint8_t modem = getActiveModem(); + if (modem == RADIOLIB_SX127X_LORA) { + // Get symbol length in us + float symbolLength = (float) (uint32_t(1) << this->spreadingFactor) / (float) this->bandwidth; + // Get Low Data Rate optimization flag + float de = 0; + if (symbolLength >= 16.0) { + de = 1; + } + // Get explicit/implicit header enabled flag + float ih = (float) this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, 0, 0); + // Get CRC enabled flag + float crc = (float) (this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, 2, 2) >> 2); + // Get number of bits preamble + float n_pre = (float) ((this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB) << 8) | this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB)); + // Get number of bits payload + float n_pay = 8.0 + RADIOLIB_MAX(ceil((8.0 * (float) len - 4.0 * (float) this->spreadingFactor + 28.0 + 16.0 * crc - 20.0 * ih) / (4.0 * (float) this->spreadingFactor - 8.0 * de)) * (float) this->codingRate, 0.0); + + // Get time-on-air in us + return ceil(symbolLength * (n_pre + n_pay + 4.25)) * 1000; + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // Get number of bits preamble + float n_pre = (float) ((this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB_FSK) << 8) | this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB_FSK)) * 8; + //Get the number of bits of the sync word + float n_syncWord = (float) (this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, 2, 0) + 1) * 8; + //Get CRC bits + float crc = (this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 4, 4) == RADIOLIB_SX127X_CRC_ON) * 16; + + if (this->packetLengthConfig == RADIOLIB_SX127X_PACKET_FIXED) { + //If Packet size fixed -> len = fixed packet length + len = this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH_FSK); + } else { + //if packet variable -> Add 1 extra byte for payload length + len += 1; + } + + // Calculate time-on-air in us {[(length in bytes) * (8 bits / 1 byte)] / [(Bit Rate in kbps) * (1000 bps / 1 kbps)]} * (1000000 us in 1 sec) + return (uint32_t) (((crc + n_syncWord + n_pre + (float) (len * 8)) / (this->bitRate * 1000.0)) * 1000000.0); + } else { + return(RADIOLIB_ERR_UNKNOWN); + } + +} + +int16_t SX127x::setCrcFiltering(bool enable) { + this->crcOn = enable; + + if (enable == true) { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_ON, 4, 4)); + } else { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_OFF, 4, 4)); + } +} + +int16_t SX127x::setRSSIThreshold(float dbm) { + RADIOLIB_CHECK_RANGE(dbm, -127.5, 0, RADIOLIB_ERR_INVALID_RSSI_THRESHOLD); + + return this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RSSI_THRESH, (uint8_t)(-2.0 * dbm), 7, 0); +} + +int16_t SX127x::setRSSIConfig(uint8_t smoothingSamples, int8_t offset) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // check provided values + if(!(smoothingSamples <= 7)) { + return(RADIOLIB_ERR_INVALID_NUM_SAMPLES); + } + + RADIOLIB_CHECK_RANGE(offset, -16, 15, RADIOLIB_ERR_INVALID_RSSI_OFFSET); + + // set new register values + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RSSI_CONFIG, offset << 3, 7, 3); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RSSI_CONFIG, smoothingSamples, 2, 0); + return(state); +} + +int16_t SX127x::setEncoding(uint8_t encoding) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set encoding + switch(encoding) { + case RADIOLIB_ENCODING_NRZ: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_DC_FREE_NONE, 6, 5)); + case RADIOLIB_ENCODING_MANCHESTER: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_DC_FREE_MANCHESTER, 6, 5)); + case RADIOLIB_ENCODING_WHITENING: + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_DC_FREE_WHITENING, 6, 5)); + default: + return(RADIOLIB_ERR_INVALID_ENCODING); + } +} + +uint16_t SX127x::getIRQFlags() { + // check active modem + if(getActiveModem() == RADIOLIB_SX127X_LORA) { + // LoRa, just 8-bit value + return((uint16_t)this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_IRQ_FLAGS)); + + } else { + // FSK, the IRQ flags are 16 bits in total + uint16_t flags = ((uint16_t)this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_IRQ_FLAGS_2)) << 8; + flags |= (uint16_t)this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_IRQ_FLAGS_1); + return(flags); + } + +} + +uint8_t SX127x::getModemStatus() { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(0x00); + } + + // read the register + return(this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_MODEM_STAT)); +} + +void SX127x::setRfSwitchPins(uint32_t rxEn, uint32_t txEn) { + this->mod->setRfSwitchPins(rxEn, txEn); +} + +void SX127x::setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]) { + this->mod->setRfSwitchTable(pins, table); +} + +uint8_t SX127x::randomByte() { + // check active modem + uint8_t rssiValueReg = RADIOLIB_SX127X_REG_RSSI_WIDEBAND; + if(getActiveModem() == RADIOLIB_SX127X_FSK_OOK) { + rssiValueReg = RADIOLIB_SX127X_REG_RSSI_VALUE_FSK; + } + + // set mode to Rx + setMode(RADIOLIB_SX127X_RX); + + // wait a bit for the RSSI reading to stabilise + this->mod->hal->delay(10); + + // read RSSI value 8 times, always keep just the least significant bit + uint8_t randByte = 0x00; + for(uint8_t i = 0; i < 8; i++) { + randByte |= ((this->mod->SPIreadRegister(rssiValueReg) & 0x01) << i); + } + + // set mode to standby + setMode(RADIOLIB_SX127X_STANDBY); + + return(randByte); +} + +int16_t SX127x::getChipVersion() { + return(this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_VERSION)); +} + +int8_t SX127x::getTempRaw() { + int8_t temp = 0; + uint8_t previousOpMode; + uint8_t ival; + + // save current Op Mode + previousOpMode = this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_OP_MODE); + + // check if we need to step out of LoRa mode first + if((previousOpMode & RADIOLIB_SX127X_LORA) == RADIOLIB_SX127X_LORA) { + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, (RADIOLIB_SX127X_LORA | RADIOLIB_SX127X_SLEEP)); + } + + // put device in FSK sleep + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, (RADIOLIB_SX127X_FSK_OOK | RADIOLIB_SX127X_SLEEP)); + + // put device in FSK RxSynth + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, (RADIOLIB_SX127X_FSK_OOK | RADIOLIB_SX127X_FSRX)); + + // enable temperature reading + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_IMAGE_CAL, RADIOLIB_SX127X_TEMP_MONITOR_ON, 0, 0); + + // wait + this->mod->hal->delayMicroseconds(200); + + // disable temperature reading + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_IMAGE_CAL, RADIOLIB_SX127X_TEMP_MONITOR_OFF, 0, 0); + + // put device in FSK sleep + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, (RADIOLIB_SX127X_FSK_OOK | RADIOLIB_SX127X_SLEEP)); + + // read temperature + ival = this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_TEMP); + + // convert very raw value + if((ival & 0x80) == 0x80) { + temp = 255 - ival; + } else { + temp = -1 * ival; + } + + // check if we need to step back into LoRa mode + if((previousOpMode & RADIOLIB_SX127X_LORA) == RADIOLIB_SX127X_LORA) { + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, (RADIOLIB_SX127X_LORA | RADIOLIB_SX127X_SLEEP)); + } + + // reload previous Op Mode + this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, previousOpMode); + + return(temp); +} + +int16_t SX127x::config() { + // turn off frequency hopping + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_HOP_PERIOD, RADIOLIB_SX127X_HOP_PERIOD_OFF); + return(state); +} + +int16_t SX127x::configFSK() { + // set RSSI threshold + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RSSI_THRESH, RADIOLIB_SX127X_RSSI_THRESHOLD); + RADIOLIB_ASSERT(state); + + // reset FIFO flag + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_IRQ_FLAGS_2, RADIOLIB_SX127X_FLAG_FIFO_OVERRUN); + + // set packet configuration + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_PACKET_VARIABLE | RADIOLIB_SX127X_DC_FREE_NONE | RADIOLIB_SX127X_CRC_ON | RADIOLIB_SX127X_CRC_AUTOCLEAR_ON | RADIOLIB_SX127X_ADDRESS_FILTERING_OFF | RADIOLIB_SX127X_CRC_WHITENING_TYPE_CCITT, 7, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_2, RADIOLIB_SX127X_DATA_MODE_PACKET | RADIOLIB_SX127X_IO_HOME_OFF, 6, 5); + RADIOLIB_ASSERT(state); + + // set FIFO threshold + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FIFO_THRESH, RADIOLIB_SX127X_TX_START_FIFO_NOT_EMPTY, 7, 7); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_FIFO_THRESH, RADIOLIB_SX127X_FIFO_THRESH, 5, 0); + RADIOLIB_ASSERT(state); + + // disable Rx timeouts + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_TIMEOUT_1, RADIOLIB_SX127X_TIMEOUT_RX_RSSI_OFF); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_TIMEOUT_2, RADIOLIB_SX127X_TIMEOUT_RX_PREAMBLE_OFF); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_TIMEOUT_3, RADIOLIB_SX127X_TIMEOUT_SIGNAL_SYNC_OFF); + RADIOLIB_ASSERT(state); + + // enable preamble detector + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_DETECT, RADIOLIB_SX127X_PREAMBLE_DETECTOR_ON | RADIOLIB_SX127X_PREAMBLE_DETECTOR_2_BYTE | RADIOLIB_SX127X_PREAMBLE_DETECTOR_TOL); + + return(state); +} + +int16_t SX127x::setPacketMode(uint8_t mode, uint8_t len) { + // check packet length + if(len > RADIOLIB_SX127X_MAX_PACKET_LENGTH_FSK) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set to fixed packet length + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, mode, 7, 7); + RADIOLIB_ASSERT(state); + + // set length to register + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH_FSK, len); + RADIOLIB_ASSERT(state); + + // update cached value + this->packetLengthConfig = mode; + return(state); +} + +bool SX127x::findChip(uint8_t* vers, uint8_t num) { + uint8_t i = 0; + bool flagFound = false; + while((i < 10) && !flagFound) { + // reset the module + reset(); + + // check version register + int16_t version = getChipVersion(); + for(uint8_t i = 0; i < num; i++) { + if(version == vers[i]) { + flagFound = true; + break; + } + } + + if(!flagFound) { + RADIOLIB_DEBUG_PRINTLN("SX127x not found! (%d of 10 tries) RADIOLIB_SX127X_REG_VERSION == 0x%04X", i + 1, version); + this->mod->hal->delay(10); + i++; + } + + } + + return(flagFound); +} + +int16_t SX127x::setMode(uint8_t mode) { + uint8_t checkMask = 0xFF; + if((getActiveModem() == RADIOLIB_SX127X_FSK_OOK) && (mode == RADIOLIB_SX127X_RX)) { + // disable checking of RX bit in FSK RX mode, as it sometimes seem to fail (#276) + checkMask = 0xFE; + } + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, mode, 2, 0, 5, checkMask)); +} + +int16_t SX127x::getActiveModem() { + return(this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_OP_MODE, 7, 7)); +} + +int16_t SX127x::setActiveModem(uint8_t modem) { + // set mode to SLEEP + int16_t state = setMode(RADIOLIB_SX127X_SLEEP); + + // set modem + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, modem, 7, 7, 5); + + // set mode to STANDBY + state |= setMode(RADIOLIB_SX127X_STANDBY); + return(state); +} + +void SX127x::clearIRQFlags() { + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA) { + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_IRQ_FLAGS, 0b11111111); + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_IRQ_FLAGS_1, 0b11111111); + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_IRQ_FLAGS_2, 0b11111111); + } +} + +void SX127x::clearFIFO(size_t count) { + while(count) { + this->mod->SPIreadRegister(RADIOLIB_SX127X_REG_FIFO); + count--; + } +} + +int16_t SX127x::invertIQ(bool enable) { + // check active modem + if(getActiveModem() != RADIOLIB_SX127X_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // Tx path inversion is swapped, because it seems that setting it according to the datsheet + // will actually lead to the wrong inversion. See https://github.com/jgromes/RadioLib/issues/778 + int16_t state; + if(enable) { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_INVERT_IQ, RADIOLIB_SX127X_INVERT_IQ_RXPATH_ON, 6, 6); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_INVERT_IQ, RADIOLIB_SX127X_INVERT_IQ_TXPATH_OFF, 0, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_INVERT_IQ2, RADIOLIB_SX127X_IQ2_ENABLE); + } else { + state = this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_INVERT_IQ, RADIOLIB_SX127X_INVERT_IQ_RXPATH_OFF, 6, 6); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_INVERT_IQ, RADIOLIB_SX127X_INVERT_IQ_TXPATH_ON, 0, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_INVERT_IQ2, RADIOLIB_SX127X_IQ2_DISABLE); + } + + return(state); +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +void SX127x::setDirectAction(void (*func)(void)) { + setDio1Action(func, this->mod->hal->GpioInterruptRising); +} + +void SX127x::readBit(uint32_t pin) { + updateDirectBuffer((uint8_t)this->mod->hal->digitalRead(pin)); +} +#endif + +int16_t SX127x::setFHSSHoppingPeriod(uint8_t freqHoppingPeriod) { + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_HOP_PERIOD, freqHoppingPeriod)); +} + +uint8_t SX127x::getFHSSHoppingPeriod(void) { + return(this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_HOP_PERIOD)); +} + +uint8_t SX127x::getFHSSChannel(void) { + return(this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_HOP_CHANNEL, 5, 0)); +} + +void SX127x::clearFHSSInt(void) { + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_LORA) { + this->mod->SPIwriteRegister(RADIOLIB_SX127X_REG_IRQ_FLAGS, getIRQFlags() | RADIOLIB_SX127X_CLEAR_IRQ_FLAG_FHSS_CHANGE_CHANNEL); + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + return; //These are not the interrupts you are looking for + } +} + +int16_t SX127x::setDIOMapping(uint32_t pin, uint32_t value) { + if (pin > 5) + return RADIOLIB_ERR_INVALID_DIO_PIN; + + if (pin < 4) + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_1, value, 7 - 2 * pin, 6 - 2 * pin)); + else + return(this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_2, value, 15 - 2 * pin, 14 - 2 * pin)); +} + +int16_t SX127x::setDIOPreambleDetect(bool usePreambleDetect) { + return this->mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DIO_MAPPING_2, (usePreambleDetect) ? RADIOLIB_SX127X_DIO_MAP_PREAMBLE_DETECT : RADIOLIB_SX127X_DIO_MAP_RSSI, 0, 0); +} + +float SX127x::getRSSI(bool packet, bool skipReceive, int16_t offset) { + if(getActiveModem() == RADIOLIB_SX127X_LORA) { + if(packet) { + // LoRa packet mode, get RSSI of the last packet + float lastPacketRSSI = offset + this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PKT_RSSI_VALUE); + + // spread-spectrum modulation signal can be received below noise floor + // check last packet SNR and if it's less than 0, add it to reported RSSI to get the correct value + float lastPacketSNR = SX127x::getSNR(); + if(lastPacketSNR < 0.0) { + lastPacketRSSI += lastPacketSNR; + } + return(lastPacketRSSI); + + } else { + // LoRa instant, get current RSSI + float currentRSSI = offset + this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_RSSI_VALUE); + return(currentRSSI); + } + + } else { + // for FSK, there is no packet RSSI + + // enable listen mode + if(!skipReceive) { + startReceive(); + } + + // read the value for FSK + float rssi = (float)this->mod->SPIgetRegValue(RADIOLIB_SX127X_REG_RSSI_VALUE_FSK) / -2.0; + + // set mode back to standby + if(!skipReceive) { + standby(); + } + + // return the value + return(rssi); + } +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX127x.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX127x.h new file mode 100644 index 00000000..59fc29a5 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX127x/SX127x.h @@ -0,0 +1,1241 @@ +#if !defined(_RADIOLIB_SX127X_H) +#define _RADIOLIB_SX127X_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX127X) + +#include "../../Module.h" + +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" + +// SX127x physical layer properties +#define RADIOLIB_SX127X_FREQUENCY_STEP_SIZE 61.03515625 +#define RADIOLIB_SX127X_MAX_PACKET_LENGTH 255 +#define RADIOLIB_SX127X_MAX_PACKET_LENGTH_FSK 64 +#define RADIOLIB_SX127X_CRYSTAL_FREQ 32.0 +#define RADIOLIB_SX127X_DIV_EXPONENT 19 + +// SX127x series common LoRa registers +#define RADIOLIB_SX127X_REG_FIFO 0x00 +#define RADIOLIB_SX127X_REG_OP_MODE 0x01 +#define RADIOLIB_SX127X_REG_FRF_MSB 0x06 +#define RADIOLIB_SX127X_REG_FRF_MID 0x07 +#define RADIOLIB_SX127X_REG_FRF_LSB 0x08 +#define RADIOLIB_SX127X_REG_PA_CONFIG 0x09 +#define RADIOLIB_SX127X_REG_PA_RAMP 0x0A +#define RADIOLIB_SX127X_REG_OCP 0x0B +#define RADIOLIB_SX127X_REG_LNA 0x0C +#define RADIOLIB_SX127X_REG_FIFO_ADDR_PTR 0x0D +#define RADIOLIB_SX127X_REG_FIFO_TX_BASE_ADDR 0x0E +#define RADIOLIB_SX127X_REG_FIFO_RX_BASE_ADDR 0x0F +#define RADIOLIB_SX127X_REG_FIFO_RX_CURRENT_ADDR 0x10 +#define RADIOLIB_SX127X_REG_IRQ_FLAGS_MASK 0x11 +#define RADIOLIB_SX127X_REG_IRQ_FLAGS 0x12 +#define RADIOLIB_SX127X_REG_RX_NB_BYTES 0x13 +#define RADIOLIB_SX127X_REG_RX_HEADER_CNT_VALUE_MSB 0x14 +#define RADIOLIB_SX127X_REG_RX_HEADER_CNT_VALUE_LSB 0x15 +#define RADIOLIB_SX127X_REG_RX_PACKET_CNT_VALUE_MSB 0x16 +#define RADIOLIB_SX127X_REG_RX_PACKET_CNT_VALUE_LSB 0x17 +#define RADIOLIB_SX127X_REG_MODEM_STAT 0x18 +#define RADIOLIB_SX127X_REG_PKT_SNR_VALUE 0x19 +#define RADIOLIB_SX127X_REG_PKT_RSSI_VALUE 0x1A +#define RADIOLIB_SX127X_REG_RSSI_VALUE 0x1B +#define RADIOLIB_SX127X_REG_HOP_CHANNEL 0x1C +#define RADIOLIB_SX127X_REG_MODEM_CONFIG_1 0x1D +#define RADIOLIB_SX127X_REG_MODEM_CONFIG_2 0x1E +#define RADIOLIB_SX127X_REG_SYMB_TIMEOUT_LSB 0x1F +#define RADIOLIB_SX127X_REG_PREAMBLE_MSB 0x20 +#define RADIOLIB_SX127X_REG_PREAMBLE_LSB 0x21 +#define RADIOLIB_SX127X_REG_PAYLOAD_LENGTH 0x22 +#define RADIOLIB_SX127X_REG_MAX_PAYLOAD_LENGTH 0x23 +#define RADIOLIB_SX127X_REG_HOP_PERIOD 0x24 +#define RADIOLIB_SX127X_REG_FIFO_RX_BYTE_ADDR 0x25 +#define RADIOLIB_SX127X_REG_FEI_MSB 0x28 +#define RADIOLIB_SX127X_REG_FEI_MID 0x29 +#define RADIOLIB_SX127X_REG_FEI_LSB 0x2A +#define RADIOLIB_SX127X_REG_RSSI_WIDEBAND 0x2C +#define RADIOLIB_SX127X_REG_DETECT_OPTIMIZE 0x31 +#define RADIOLIB_SX127X_REG_INVERT_IQ 0x33 +#define RADIOLIB_SX127X_REG_DETECTION_THRESHOLD 0x37 +#define RADIOLIB_SX127X_REG_SYNC_WORD 0x39 +#define RADIOLIB_SX127X_REG_INVERT_IQ2 0x3B +#define RADIOLIB_SX127X_REG_DIO_MAPPING_1 0x40 +#define RADIOLIB_SX127X_REG_DIO_MAPPING_2 0x41 +#define RADIOLIB_SX127X_REG_VERSION 0x42 + +// SX127x common LoRa modem settings +// RADIOLIB_SX127X_REG_OP_MODE MSB LSB DESCRIPTION +#define RADIOLIB_SX127X_FSK_OOK 0b00000000 // 7 7 FSK/OOK mode +#define RADIOLIB_SX127X_LORA 0b10000000 // 7 7 LoRa mode +#define RADIOLIB_SX127X_ACCESS_SHARED_REG_OFF 0b00000000 // 6 6 access LoRa registers (0x0D:0x3F) in LoRa mode +#define RADIOLIB_SX127X_ACCESS_SHARED_REG_ON 0b01000000 // 6 6 access FSK registers (0x0D:0x3F) in LoRa mode +#define RADIOLIB_SX127X_SLEEP 0b00000000 // 2 0 sleep +#define RADIOLIB_SX127X_STANDBY 0b00000001 // 2 0 standby +#define RADIOLIB_SX127X_FSTX 0b00000010 // 2 0 frequency synthesis TX +#define RADIOLIB_SX127X_TX 0b00000011 // 2 0 transmit +#define RADIOLIB_SX127X_FSRX 0b00000100 // 2 0 frequency synthesis RX +#define RADIOLIB_SX127X_RXCONTINUOUS 0b00000101 // 2 0 receive continuous +#define RADIOLIB_SX127X_RXSINGLE 0b00000110 // 2 0 receive single +#define RADIOLIB_SX127X_CAD 0b00000111 // 2 0 channel activity detection + +// RADIOLIB_SX127X_REG_PA_CONFIG +#define RADIOLIB_SX127X_PA_SELECT_RFO 0b00000000 // 7 7 RFO pin output, power limited to +14 dBm +#define RADIOLIB_SX127X_PA_SELECT_BOOST 0b10000000 // 7 7 PA_BOOST pin output, power limited to +20 dBm +#define RADIOLIB_SX127X_OUTPUT_POWER 0b00001111 // 3 0 output power: P_out = 2 + OUTPUT_POWER [dBm] for PA_SELECT_BOOST + // P_out = -1 + OUTPUT_POWER [dBm] for PA_SELECT_RFO + +// RADIOLIB_SX127X_REG_OCP +#define RADIOLIB_SX127X_OCP_OFF 0b00000000 // 5 5 PA overload current protection disabled +#define RADIOLIB_SX127X_OCP_ON 0b00100000 // 5 5 PA overload current protection enabled +#define RADIOLIB_SX127X_OCP_TRIM 0b00001011 // 4 0 OCP current: I_max(OCP_TRIM = 0b1011) = 100 mA + +// RADIOLIB_SX127X_REG_LNA +#define RADIOLIB_SX127X_LNA_GAIN_1 0b00100000 // 7 5 LNA gain setting: max gain +#define RADIOLIB_SX127X_LNA_GAIN_2 0b01000000 // 7 5 . +#define RADIOLIB_SX127X_LNA_GAIN_3 0b01100000 // 7 5 . +#define RADIOLIB_SX127X_LNA_GAIN_4 0b10000000 // 7 5 . +#define RADIOLIB_SX127X_LNA_GAIN_5 0b10100000 // 7 5 . +#define RADIOLIB_SX127X_LNA_GAIN_6 0b11000000 // 7 5 min gain +#define RADIOLIB_SX127X_LNA_BOOST_OFF 0b00000000 // 1 0 default LNA current +#define RADIOLIB_SX127X_LNA_BOOST_ON 0b00000011 // 1 0 150% LNA current + +// RADIOLIB_SX127X_REG_MODEM_CONFIG_2 +#define RADIOLIB_SX127X_SF_6 0b01100000 // 7 4 spreading factor: 64 chips/bit +#define RADIOLIB_SX127X_SF_7 0b01110000 // 7 4 128 chips/bit +#define RADIOLIB_SX127X_SF_8 0b10000000 // 7 4 256 chips/bit +#define RADIOLIB_SX127X_SF_9 0b10010000 // 7 4 512 chips/bit +#define RADIOLIB_SX127X_SF_10 0b10100000 // 7 4 1024 chips/bit +#define RADIOLIB_SX127X_SF_11 0b10110000 // 7 4 2048 chips/bit +#define RADIOLIB_SX127X_SF_12 0b11000000 // 7 4 4096 chips/bit +#define RADIOLIB_SX127X_TX_MODE_SINGLE 0b00000000 // 3 3 single TX +#define RADIOLIB_SX127X_TX_MODE_CONT 0b00001000 // 3 3 continuous TX +#define RADIOLIB_SX127X_RX_TIMEOUT_MSB 0b00000000 // 1 0 + +// RADIOLIB_SX127X_REG_SYMB_TIMEOUT_LSB +#define RADIOLIB_SX127X_RX_TIMEOUT_LSB 0b01100100 // 7 0 10-bit RX operation timeout + +// RADIOLIB_SX127X_REG_PREAMBLE_MSB + REG_PREAMBLE_LSB +#define RADIOLIB_SX127X_PREAMBLE_LENGTH_MSB 0b00000000 // 7 0 2-byte preamble length setting: l_P = PREAMBLE_LENGTH + 4.25 +#define RADIOLIB_SX127X_PREAMBLE_LENGTH_LSB 0b00001000 // 7 0 where l_p = preamble length + +// RADIOLIB_SX127X_REG_DETECT_OPTIMIZE +#define RADIOLIB_SX127X_DETECT_OPTIMIZE_SF_6 0b00000101 // 2 0 SF6 detection optimization +#define RADIOLIB_SX127X_DETECT_OPTIMIZE_SF_7_12 0b00000011 // 2 0 SF7 to SF12 detection optimization + +// RADIOLIB_SX127X_REG_INVERT_IQ +#define RADIOLIB_SX127X_INVERT_IQ_RXPATH_ON 0b01000000 // 6 6 I and Q signals are inverted +#define RADIOLIB_SX127X_INVERT_IQ_RXPATH_OFF 0b00000000 // 6 6 normal mode +#define RADIOLIB_SX127X_INVERT_IQ_TXPATH_ON 0b00000001 // 0 0 I and Q signals are inverted +#define RADIOLIB_SX127X_INVERT_IQ_TXPATH_OFF 0b00000000 // 0 0 normal mode + +// RADIOLIB_SX127X_REG_DETECTION_THRESHOLD +#define RADIOLIB_SX127X_DETECTION_THRESHOLD_SF_6 0b00001100 // 7 0 SF6 detection threshold +#define RADIOLIB_SX127X_DETECTION_THRESHOLD_SF_7_12 0b00001010 // 7 0 SF7 to SF12 detection threshold + +// RADIOLIB_SX127X_REG_PA_DAC +#define RADIOLIB_SX127X_PA_BOOST_OFF 0b00000100 // 2 0 PA_BOOST disabled +#define RADIOLIB_SX127X_PA_BOOST_ON 0b00000111 // 2 0 +20 dBm on PA_BOOST when OUTPUT_POWER = 0b1111 + +// RADIOLIB_SX127X_REG_HOP_PERIOD +#define RADIOLIB_SX127X_HOP_PERIOD_OFF 0b00000000 // 7 0 number of periods between frequency hops; 0 = disabled +#define RADIOLIB_SX127X_HOP_PERIOD_MAX 0b11111111 // 7 0 + +// RADIOLIB_SX127X_REG_IRQ_FLAGS +#define RADIOLIB_SX127X_CLEAR_IRQ_FLAG_RX_TIMEOUT 0b10000000 // 7 7 timeout +#define RADIOLIB_SX127X_CLEAR_IRQ_FLAG_RX_DONE 0b01000000 // 6 6 packet reception complete +#define RADIOLIB_SX127X_CLEAR_IRQ_FLAG_PAYLOAD_CRC_ERROR 0b00100000 // 5 5 payload CRC error +#define RADIOLIB_SX127X_CLEAR_IRQ_FLAG_VALID_HEADER 0b00010000 // 4 4 valid header received +#define RADIOLIB_SX127X_CLEAR_IRQ_FLAG_TX_DONE 0b00001000 // 3 3 payload transmission complete +#define RADIOLIB_SX127X_CLEAR_IRQ_FLAG_CAD_DONE 0b00000100 // 2 2 CAD complete +#define RADIOLIB_SX127X_CLEAR_IRQ_FLAG_FHSS_CHANGE_CHANNEL 0b00000010 // 1 1 FHSS change channel +#define RADIOLIB_SX127X_CLEAR_IRQ_FLAG_CAD_DETECTED 0b00000001 // 0 0 valid LoRa signal detected during CAD operation + +// RADIOLIB_SX127X_REG_IRQ_FLAGS_MASK +#define RADIOLIB_SX127X_MASK_IRQ_FLAG_RX_TIMEOUT 0b01111111 // 7 7 timeout +#define RADIOLIB_SX127X_MASK_IRQ_FLAG_RX_DONE 0b10111111 // 6 6 packet reception complete +#define RADIOLIB_SX127X_MASK_IRQ_FLAG_PAYLOAD_CRC_ERROR 0b11011111 // 5 5 payload CRC error +#define RADIOLIB_SX127X_MASK_IRQ_FLAG_VALID_HEADER 0b11101111 // 4 4 valid header received +#define RADIOLIB_SX127X_MASK_IRQ_FLAG_TX_DONE 0b11110111 // 3 3 payload transmission complete +#define RADIOLIB_SX127X_MASK_IRQ_FLAG_CAD_DONE 0b11111011 // 2 2 CAD complete +#define RADIOLIB_SX127X_MASK_IRQ_FLAG_FHSS_CHANGE_CHANNEL 0b11111101 // 1 1 FHSS change channel +#define RADIOLIB_SX127X_MASK_IRQ_FLAG_CAD_DETECTED 0b11111110 // 0 0 valid LoRa signal detected during CAD operation + +// RADIOLIB_SX127X_REG_FIFO_TX_BASE_ADDR +#define RADIOLIB_SX127X_FIFO_TX_BASE_ADDR_MAX 0b00000000 // 7 0 allocate the entire FIFO buffer for TX only + +// RADIOLIB_SX127X_REG_FIFO_RX_BASE_ADDR +#define RADIOLIB_SX127X_FIFO_RX_BASE_ADDR_MAX 0b00000000 // 7 0 allocate the entire FIFO buffer for RX only + +// RADIOLIB_SX127X_REG_SYNC_WORD +#define RADIOLIB_SX127X_SYNC_WORD 0x12 // 7 0 default LoRa sync word +#define RADIOLIB_SX127X_SYNC_WORD_LORAWAN 0x34 // 7 0 sync word reserved for LoRaWAN networks + +// RADIOLIB_SX127X_REG_INVERT_IQ2 +#define RADIOLIB_SX127X_IQ2_ENABLE 0x19 // 7 0 enable optimize for inverted IQ +#define RADIOLIB_SX127X_IQ2_DISABLE 0x1D // 7 0 reset optimize for inverted IQ + +// SX127x series common FSK registers +// NOTE: FSK register names that are conflicting with LoRa registers are marked with "_FSK" suffix +#define RADIOLIB_SX127X_REG_BITRATE_MSB 0x02 +#define RADIOLIB_SX127X_REG_BITRATE_LSB 0x03 +#define RADIOLIB_SX127X_REG_FDEV_MSB 0x04 +#define RADIOLIB_SX127X_REG_FDEV_LSB 0x05 +#define RADIOLIB_SX127X_REG_RX_CONFIG 0x0D +#define RADIOLIB_SX127X_REG_RSSI_CONFIG 0x0E +#define RADIOLIB_SX127X_REG_RSSI_COLLISION 0x0F +#define RADIOLIB_SX127X_REG_RSSI_THRESH 0x10 +#define RADIOLIB_SX127X_REG_RSSI_VALUE_FSK 0x11 +#define RADIOLIB_SX127X_REG_RX_BW 0x12 +#define RADIOLIB_SX127X_REG_AFC_BW 0x13 +#define RADIOLIB_SX127X_REG_OOK_PEAK 0x14 +#define RADIOLIB_SX127X_REG_OOK_FIX 0x15 +#define RADIOLIB_SX127X_REG_OOK_AVG 0x16 +#define RADIOLIB_SX127X_REG_AFC_FEI 0x1A +#define RADIOLIB_SX127X_REG_AFC_MSB 0x1B +#define RADIOLIB_SX127X_REG_AFC_LSB 0x1C +#define RADIOLIB_SX127X_REG_FEI_MSB_FSK 0x1D +#define RADIOLIB_SX127X_REG_FEI_LSB_FSK 0x1E +#define RADIOLIB_SX127X_REG_PREAMBLE_DETECT 0x1F +#define RADIOLIB_SX127X_REG_RX_TIMEOUT_1 0x20 +#define RADIOLIB_SX127X_REG_RX_TIMEOUT_2 0x21 +#define RADIOLIB_SX127X_REG_RX_TIMEOUT_3 0x22 +#define RADIOLIB_SX127X_REG_RX_DELAY 0x23 +#define RADIOLIB_SX127X_REG_OSC 0x24 +#define RADIOLIB_SX127X_REG_PREAMBLE_MSB_FSK 0x25 +#define RADIOLIB_SX127X_REG_PREAMBLE_LSB_FSK 0x26 +#define RADIOLIB_SX127X_REG_SYNC_CONFIG 0x27 +#define RADIOLIB_SX127X_REG_SYNC_VALUE_1 0x28 +#define RADIOLIB_SX127X_REG_SYNC_VALUE_2 0x29 +#define RADIOLIB_SX127X_REG_SYNC_VALUE_3 0x2A +#define RADIOLIB_SX127X_REG_SYNC_VALUE_4 0x2B +#define RADIOLIB_SX127X_REG_SYNC_VALUE_5 0x2C +#define RADIOLIB_SX127X_REG_SYNC_VALUE_6 0x2D +#define RADIOLIB_SX127X_REG_SYNC_VALUE_7 0x2E +#define RADIOLIB_SX127X_REG_SYNC_VALUE_8 0x2F +#define RADIOLIB_SX127X_REG_PACKET_CONFIG_1 0x30 +#define RADIOLIB_SX127X_REG_PACKET_CONFIG_2 0x31 +#define RADIOLIB_SX127X_REG_PAYLOAD_LENGTH_FSK 0x32 +#define RADIOLIB_SX127X_REG_NODE_ADRS 0x33 +#define RADIOLIB_SX127X_REG_BROADCAST_ADRS 0x34 +#define RADIOLIB_SX127X_REG_FIFO_THRESH 0x35 +#define RADIOLIB_SX127X_REG_SEQ_CONFIG_1 0x36 +#define RADIOLIB_SX127X_REG_SEQ_CONFIG_2 0x37 +#define RADIOLIB_SX127X_REG_TIMER_RESOL 0x38 +#define RADIOLIB_SX127X_REG_TIMER1_COEF 0x39 +#define RADIOLIB_SX127X_REG_TIMER2_COEF 0x3A +#define RADIOLIB_SX127X_REG_IMAGE_CAL 0x3B +#define RADIOLIB_SX127X_REG_TEMP 0x3C +#define RADIOLIB_SX127X_REG_LOW_BAT 0x3D +#define RADIOLIB_SX127X_REG_IRQ_FLAGS_1 0x3E +#define RADIOLIB_SX127X_REG_IRQ_FLAGS_2 0x3F + +// SX127x common FSK modem settings +// RADIOLIB_SX127X_REG_OP_MODE +#define RADIOLIB_SX127X_MODULATION_FSK 0b00000000 // 6 5 FSK modulation scheme +#define RADIOLIB_SX127X_MODULATION_OOK 0b00100000 // 6 5 OOK modulation scheme +#define RADIOLIB_SX127X_RX 0b00000101 // 2 0 receiver mode + +// RADIOLIB_SX127X_REG_BITRATE_MSB + SX127X_REG_BITRATE_LSB +#define RADIOLIB_SX127X_BITRATE_MSB 0x1A // 7 0 bit rate setting: BitRate = F(XOSC)/(BITRATE + BITRATE_FRAC/16) +#define RADIOLIB_SX127X_BITRATE_LSB 0x0B // 7 0 default value: 4.8 kbps + +// RADIOLIB_SX127X_REG_FDEV_MSB + SX127X_REG_FDEV_LSB +#define RADIOLIB_SX127X_FDEV_MSB 0x00 // 5 0 frequency deviation: Fdev = Fstep * FDEV +#define RADIOLIB_SX127X_FDEV_LSB 0x52 // 7 0 default value: 5 kHz + +// RADIOLIB_SX127X_REG_RX_CONFIG +#define RADIOLIB_SX127X_RESTART_RX_ON_COLLISION_OFF 0b00000000 // 7 7 automatic receiver restart disabled (default) +#define RADIOLIB_SX127X_RESTART_RX_ON_COLLISION_ON 0b10000000 // 7 7 automatically restart receiver if it gets saturated or on packet collision +#define RADIOLIB_SX127X_RESTART_RX_WITHOUT_PLL_LOCK 0b01000000 // 6 6 manually restart receiver without frequency change +#define RADIOLIB_SX127X_RESTART_RX_WITH_PLL_LOCK 0b00100000 // 5 5 manually restart receiver with frequency change +#define RADIOLIB_SX127X_AFC_AUTO_OFF 0b00000000 // 4 4 no AFC performed (default) +#define RADIOLIB_SX127X_AFC_AUTO_ON 0b00010000 // 4 4 AFC performed at each receiver startup +#define RADIOLIB_SX127X_AGC_AUTO_OFF 0b00000000 // 3 3 LNA gain set manually by register +#define RADIOLIB_SX127X_AGC_AUTO_ON 0b00001000 // 3 3 LNA gain controlled by AGC +#define RADIOLIB_SX127X_RX_TRIGGER_NONE 0b00000000 // 2 0 receiver startup at: none +#define RADIOLIB_SX127X_RX_TRIGGER_RSSI_INTERRUPT 0b00000001 // 2 0 RSSI interrupt +#define RADIOLIB_SX127X_RX_TRIGGER_PREAMBLE_DETECT 0b00000110 // 2 0 preamble detected +#define RADIOLIB_SX127X_RX_TRIGGER_BOTH 0b00000111 // 2 0 RSSI interrupt and preamble detected + +// RADIOLIB_SX127X_REG_RSSI_CONFIG +#define RADIOLIB_SX127X_RSSI_SMOOTHING_SAMPLES_2 0b00000000 // 2 0 number of samples for RSSI average: 2 +#define RADIOLIB_SX127X_RSSI_SMOOTHING_SAMPLES_4 0b00000001 // 2 0 4 +#define RADIOLIB_SX127X_RSSI_SMOOTHING_SAMPLES_8 0b00000010 // 2 0 8 (default) +#define RADIOLIB_SX127X_RSSI_SMOOTHING_SAMPLES_16 0b00000011 // 2 0 16 +#define RADIOLIB_SX127X_RSSI_SMOOTHING_SAMPLES_32 0b00000100 // 2 0 32 +#define RADIOLIB_SX127X_RSSI_SMOOTHING_SAMPLES_64 0b00000101 // 2 0 64 +#define RADIOLIB_SX127X_RSSI_SMOOTHING_SAMPLES_128 0b00000110 // 2 0 128 +#define RADIOLIB_SX127X_RSSI_SMOOTHING_SAMPLES_256 0b00000111 // 2 0 256 + +// RADIOLIB_SX127X_REG_RSSI_COLLISION +#define RADIOLIB_SX127X_RSSI_COLLISION_THRESHOLD 0x0A // 7 0 RSSI threshold in dB that will be considered a collision, default value: 10 dB + +// RADIOLIB_SX127X_REG_RSSI_THRESH +#define RADIOLIB_SX127X_RSSI_THRESHOLD 0xFF // 7 0 RSSI threshold that will trigger RSSI interrupt, RssiThreshold = RSSI_THRESHOLD / 2 [dBm] + +// RADIOLIB_SX127X_REG_RX_BW +#define RADIOLIB_SX127X_RX_BW_MANT_16 0b00000000 // 4 3 channel filter bandwidth: RxBw = F(XOSC) / (RxBwMant * 2^(RxBwExp + 2)) [kHz] +#define RADIOLIB_SX127X_RX_BW_MANT_20 0b00001000 // 4 3 +#define RADIOLIB_SX127X_RX_BW_MANT_24 0b00010000 // 4 3 default RxBwMant parameter +#define RADIOLIB_SX127X_RX_BW_EXP 0b00000101 // 2 0 default RxBwExp parameter + +// RADIOLIB_SX127X_REG_AFC_BW +#define RADIOLIB_SX127X_RX_BW_MANT_AFC 0b00001000 // 4 3 default RxBwMant parameter used during AFC +#define RADIOLIB_SX127X_RX_BW_EXP_AFC 0b00000011 // 2 0 default RxBwExp parameter used during AFC + +// RADIOLIB_SX127X_REG_OOK_PEAK +#define RADIOLIB_SX127X_BIT_SYNC_OFF 0b00000000 // 5 5 bit synchronizer disabled (not allowed in packet mode) +#define RADIOLIB_SX127X_BIT_SYNC_ON 0b00100000 // 5 5 bit synchronizer enabled (default) +#define RADIOLIB_SX127X_OOK_THRESH_FIXED 0b00000000 // 4 3 OOK threshold type: fixed value +#define RADIOLIB_SX127X_OOK_THRESH_PEAK 0b00001000 // 4 3 peak mode (default) +#define RADIOLIB_SX127X_OOK_THRESH_AVERAGE 0b00010000 // 4 3 average mode +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_0_5_DB 0b00000000 // 2 0 OOK demodulator step size: 0.5 dB (default) +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_1_0_DB 0b00000001 // 2 0 1.0 dB +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_1_5_DB 0b00000010 // 2 0 1.5 dB +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_2_0_DB 0b00000011 // 2 0 2.0 dB +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_3_0_DB 0b00000100 // 2 0 3.0 dB +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_4_0_DB 0b00000101 // 2 0 4.0 dB +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_5_0_DB 0b00000110 // 2 0 5.0 dB +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_6_0_DB 0b00000111 // 2 0 6.0 dB + +// RADIOLIB_SX127X_REG_OOK_FIX +#define RADIOLIB_SX127X_OOK_FIXED_THRESHOLD 0x0C // 7 0 default fixed threshold for OOK data slicer + +// RADIOLIB_SX127X_REG_OOK_AVG +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_1_1_CHIP 0b00000000 // 7 5 OOK demodulator step period: once per chip (default) +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_1_2_CHIP 0b00100000 // 7 5 once every 2 chips +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_1_4_CHIP 0b01000000 // 7 5 once every 4 chips +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_1_8_CHIP 0b01100000 // 7 5 once every 8 chips +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_2_1_CHIP 0b10000000 // 7 5 2 times per chip +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_4_1_CHIP 0b10100000 // 7 5 4 times per chip +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_8_1_CHIP 0b11000000 // 7 5 8 times per chip +#define RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_16_1_CHIP 0b11100000 // 7 5 16 times per chip +#define RADIOLIB_SX127X_OOK_AVERAGE_OFFSET_0_DB 0b00000000 // 3 2 OOK average threshold offset: 0.0 dB (default) +#define RADIOLIB_SX127X_OOK_AVERAGE_OFFSET_2_DB 0b00000100 // 3 2 2.0 dB +#define RADIOLIB_SX127X_OOK_AVERAGE_OFFSET_4_DB 0b00001000 // 3 2 4.0 dB +#define RADIOLIB_SX127X_OOK_AVERAGE_OFFSET_6_DB 0b00001100 // 3 2 6.0 dB +#define RADIOLIB_SX127X_OOK_AVG_THRESH_FILT_32_PI 0b00000000 // 1 0 OOK average filter coefficient: chip rate / 32*pi +#define RADIOLIB_SX127X_OOK_AVG_THRESH_FILT_8_PI 0b00000001 // 1 0 chip rate / 8*pi +#define RADIOLIB_SX127X_OOK_AVG_THRESH_FILT_4_PI 0b00000010 // 1 0 chip rate / 4*pi (default) +#define RADIOLIB_SX127X_OOK_AVG_THRESH_FILT_2_PI 0b00000011 // 1 0 chip rate / 2*pi + +// RADIOLIB_SX127X_REG_AFC_FEI +#define RADIOLIB_SX127X_AGC_START 0b00010000 // 4 4 manually start AGC sequence +#define RADIOLIB_SX127X_AFC_CLEAR 0b00000010 // 1 1 manually clear AFC register +#define RADIOLIB_SX127X_AFC_AUTO_CLEAR_OFF 0b00000000 // 0 0 AFC register will not be cleared at the start of AFC (default) +#define RADIOLIB_SX127X_AFC_AUTO_CLEAR_ON 0b00000001 // 0 0 AFC register will be cleared at the start of AFC + +// RADIOLIB_SX127X_REG_PREAMBLE_DETECT +#define RADIOLIB_SX127X_PREAMBLE_DETECTOR_OFF 0b00000000 // 7 7 preamble detection disabled +#define RADIOLIB_SX127X_PREAMBLE_DETECTOR_ON 0b10000000 // 7 7 preamble detection enabled (default) +#define RADIOLIB_SX127X_PREAMBLE_DETECTOR_1_BYTE 0b00000000 // 6 5 preamble detection size: 1 byte (default) +#define RADIOLIB_SX127X_PREAMBLE_DETECTOR_2_BYTE 0b00100000 // 6 5 2 bytes +#define RADIOLIB_SX127X_PREAMBLE_DETECTOR_3_BYTE 0b01000000 // 6 5 3 bytes +#define RADIOLIB_SX127X_PREAMBLE_DETECTOR_TOL 0x0A // 4 0 default number of tolerated errors per chip (4 chips per bit) + +// RADIOLIB_SX127X_REG_RX_TIMEOUT_1 +#define RADIOLIB_SX127X_TIMEOUT_RX_RSSI_OFF 0x00 // 7 0 disable receiver timeout when RSSI interrupt doesn't occur (default) + +// RADIOLIB_SX127X_REG_RX_TIMEOUT_2 +#define RADIOLIB_SX127X_TIMEOUT_RX_PREAMBLE_OFF 0x00 // 7 0 disable receiver timeout when preamble interrupt doesn't occur (default) + +// RADIOLIB_SX127X_REG_RX_TIMEOUT_3 +#define RADIOLIB_SX127X_TIMEOUT_SIGNAL_SYNC_OFF 0x00 // 7 0 disable receiver timeout when sync address interrupt doesn't occur (default) + +// RADIOLIB_SX127X_REG_OSC +#define RADIOLIB_SX127X_RC_CAL_START 0b00000000 // 3 3 manually start RC oscillator calibration +#define RADIOLIB_SX127X_CLK_OUT_FXOSC 0b00000000 // 2 0 ClkOut frequency: F(XOSC) +#define RADIOLIB_SX127X_CLK_OUT_FXOSC_2 0b00000001 // 2 0 F(XOSC) / 2 +#define RADIOLIB_SX127X_CLK_OUT_FXOSC_4 0b00000010 // 2 0 F(XOSC) / 4 +#define RADIOLIB_SX127X_CLK_OUT_FXOSC_8 0b00000011 // 2 0 F(XOSC) / 8 +#define RADIOLIB_SX127X_CLK_OUT_FXOSC_16 0b00000100 // 2 0 F(XOSC) / 16 +#define RADIOLIB_SX127X_CLK_OUT_FXOSC_32 0b00000101 // 2 0 F(XOSC) / 32 +#define RADIOLIB_SX127X_CLK_OUT_RC 0b00000110 // 2 0 RC +#define RADIOLIB_SX127X_CLK_OUT_OFF 0b00000111 // 2 0 disabled (default) + +// RADIOLIB_SX127X_REG_PREAMBLE_MSB_FSK + SX127X_REG_PREAMBLE_LSB_FSK +#define RADIOLIB_SX127X_PREAMBLE_SIZE_MSB 0x00 // 7 0 preamble size in bytes +#define RADIOLIB_SX127X_PREAMBLE_SIZE_LSB 0x03 // 7 0 default value: 3 bytes + +// RADIOLIB_SX127X_REG_SYNC_CONFIG +#define RADIOLIB_SX127X_AUTO_RESTART_RX_MODE_OFF 0b00000000 // 7 6 Rx mode restart after packet reception: disabled +#define RADIOLIB_SX127X_AUTO_RESTART_RX_MODE_NO_PLL 0b01000000 // 7 6 enabled, don't wait for PLL lock +#define RADIOLIB_SX127X_AUTO_RESTART_RX_MODE_PLL 0b10000000 // 7 6 enabled, wait for PLL lock (default) +#define RADIOLIB_SX127X_PREAMBLE_POLARITY_AA 0b00000000 // 5 5 preamble polarity: 0xAA = 0b10101010 (default) +#define RADIOLIB_SX127X_PREAMBLE_POLARITY_55 0b00100000 // 5 5 0x55 = 0b01010101 +#define RADIOLIB_SX127X_SYNC_OFF 0b00000000 // 4 4 sync word disabled +#define RADIOLIB_SX127X_SYNC_ON 0b00010000 // 4 4 sync word enabled (default) +#define RADIOLIB_SX127X_SYNC_SIZE 0x03 // 2 0 sync word size in bytes, SyncSize = SYNC_SIZE + 1 bytes + +// RADIOLIB_SX127X_REG_SYNC_VALUE_1 - SX127X_REG_SYNC_VALUE_8 +#define RADIOLIB_SX127X_SYNC_VALUE_1 0x01 // 7 0 sync word: 1st byte (MSB) +#define RADIOLIB_SX127X_SYNC_VALUE_2 0x01 // 7 0 2nd byte +#define RADIOLIB_SX127X_SYNC_VALUE_3 0x01 // 7 0 3rd byte +#define RADIOLIB_SX127X_SYNC_VALUE_4 0x01 // 7 0 4th byte +#define RADIOLIB_SX127X_SYNC_VALUE_5 0x01 // 7 0 5th byte +#define RADIOLIB_SX127X_SYNC_VALUE_6 0x01 // 7 0 6th byte +#define RADIOLIB_SX127X_SYNC_VALUE_7 0x01 // 7 0 7th byte +#define RADIOLIB_SX127X_SYNC_VALUE_8 0x01 // 7 0 8th byte (LSB) + +// RADIOLIB_SX127X_REG_PACKET_CONFIG_1 +#define RADIOLIB_SX127X_PACKET_FIXED 0b00000000 // 7 7 packet format: fixed length +#define RADIOLIB_SX127X_PACKET_VARIABLE 0b10000000 // 7 7 variable length (default) +#define RADIOLIB_SX127X_DC_FREE_NONE 0b00000000 // 6 5 DC-free encoding: disabled (default) +#define RADIOLIB_SX127X_DC_FREE_MANCHESTER 0b00100000 // 6 5 Manchester +#define RADIOLIB_SX127X_DC_FREE_WHITENING 0b01000000 // 6 5 Whitening +#define RADIOLIB_SX127X_CRC_OFF 0b00000000 // 4 4 CRC disabled +#define RADIOLIB_SX127X_CRC_ON 0b00010000 // 4 4 CRC enabled (default) +#define RADIOLIB_SX127X_CRC_AUTOCLEAR_OFF 0b00001000 // 3 3 keep FIFO on CRC mismatch, issue payload ready interrupt +#define RADIOLIB_SX127X_CRC_AUTOCLEAR_ON 0b00000000 // 3 3 clear FIFO on CRC mismatch, do not issue payload ready interrupt +#define RADIOLIB_SX127X_ADDRESS_FILTERING_OFF 0b00000000 // 2 1 address filtering: none (default) +#define RADIOLIB_SX127X_ADDRESS_FILTERING_NODE 0b00000010 // 2 1 node +#define RADIOLIB_SX127X_ADDRESS_FILTERING_NODE_BROADCAST 0b00000100 // 2 1 node or broadcast +#define RADIOLIB_SX127X_CRC_WHITENING_TYPE_CCITT 0b00000000 // 0 0 CRC and whitening algorithms: CCITT CRC with standard whitening (default) +#define RADIOLIB_SX127X_CRC_WHITENING_TYPE_IBM 0b00000001 // 0 0 IBM CRC with alternate whitening + +// RADIOLIB_SX127X_REG_PACKET_CONFIG_2 +#define RADIOLIB_SX127X_DATA_MODE_PACKET 0b01000000 // 6 6 data mode: packet (default) +#define RADIOLIB_SX127X_DATA_MODE_CONTINUOUS 0b00000000 // 6 6 continuous +#define RADIOLIB_SX127X_IO_HOME_OFF 0b00000000 // 5 5 io-homecontrol compatibility disabled (default) +#define RADIOLIB_SX127X_IO_HOME_ON 0b00100000 // 5 5 io-homecontrol compatibility enabled + +// RADIOLIB_SX127X_REG_FIFO_THRESH +#define RADIOLIB_SX127X_TX_START_FIFO_LEVEL 0b00000000 // 7 7 start packet transmission when: number of bytes in FIFO exceeds FIFO_THRESHOLD +#define RADIOLIB_SX127X_TX_START_FIFO_NOT_EMPTY 0b10000000 // 7 7 at least one byte in FIFO (default) +#define RADIOLIB_SX127X_FIFO_THRESH 0x1F // 5 0 FIFO level threshold + +// RADIOLIB_SX127X_REG_SEQ_CONFIG_1 +#define RADIOLIB_SX127X_SEQUENCER_START 0b10000000 // 7 7 manually start sequencer +#define RADIOLIB_SX127X_SEQUENCER_STOP 0b01000000 // 6 6 manually stop sequencer +#define RADIOLIB_SX127X_IDLE_MODE_STANDBY 0b00000000 // 5 5 chip mode during sequencer idle mode: standby (default) +#define RADIOLIB_SX127X_IDLE_MODE_SLEEP 0b00100000 // 5 5 sleep +#define RADIOLIB_SX127X_FROM_START_LP_SELECTION 0b00000000 // 4 3 mode that will be set after starting sequencer: low power selection (default) +#define RADIOLIB_SX127X_FROM_START_RECEIVE 0b00001000 // 4 3 receive +#define RADIOLIB_SX127X_FROM_START_TRANSMIT 0b00010000 // 4 3 transmit +#define RADIOLIB_SX127X_FROM_START_TRANSMIT_FIFO_LEVEL 0b00011000 // 4 3 transmit on a FIFO level interrupt +#define RADIOLIB_SX127X_LP_SELECTION_SEQ_OFF 0b00000000 // 2 2 mode that will be set after exiting low power selection: sequencer off (default) +#define RADIOLIB_SX127X_LP_SELECTION_IDLE 0b00000100 // 2 2 idle state +#define RADIOLIB_SX127X_FROM_IDLE_TRANSMIT 0b00000000 // 1 1 mode that will be set after exiting idle mode: transmit (default) +#define RADIOLIB_SX127X_FROM_IDLE_RECEIVE 0b00000010 // 1 1 receive +#define RADIOLIB_SX127X_FROM_TRANSMIT_LP_SELECTION 0b00000000 // 0 0 mode that will be set after exiting transmit mode: low power selection (default) +#define RADIOLIB_SX127X_FROM_TRANSMIT_RECEIVE 0b00000001 // 0 0 receive + +// RADIOLIB_SX127X_REG_SEQ_CONFIG_2 +#define RADIOLIB_SX127X_FROM_RECEIVE_PACKET_RECEIVED_PAYLOAD 0b00100000 // 7 5 mode that will be set after exiting receive mode: packet received on payload ready interrupt (default) +#define RADIOLIB_SX127X_FROM_RECEIVE_LP_SELECTION 0b01000000 // 7 5 low power selection +#define RADIOLIB_SX127X_FROM_RECEIVE_PACKET_RECEIVED_CRC_OK 0b01100000 // 7 5 packet received on CRC OK interrupt +#define RADIOLIB_SX127X_FROM_RECEIVE_SEQ_OFF_RSSI 0b10000000 // 7 5 sequencer off on RSSI interrupt +#define RADIOLIB_SX127X_FROM_RECEIVE_SEQ_OFF_SYNC_ADDR 0b10100000 // 7 5 sequencer off on sync address interrupt +#define RADIOLIB_SX127X_FROM_RECEIVE_SEQ_OFF_PREAMBLE_DETECT 0b11000000 // 7 5 sequencer off on preamble detect interrupt +#define RADIOLIB_SX127X_FROM_RX_TIMEOUT_RECEIVE 0b00000000 // 4 3 mode that will be set after Rx timeout: receive (default) +#define RADIOLIB_SX127X_FROM_RX_TIMEOUT_TRANSMIT 0b00001000 // 4 3 transmit +#define RADIOLIB_SX127X_FROM_RX_TIMEOUT_LP_SELECTION 0b00010000 // 4 3 low power selection +#define RADIOLIB_SX127X_FROM_RX_TIMEOUT_SEQ_OFF 0b00011000 // 4 3 sequencer off +#define RADIOLIB_SX127X_FROM_PACKET_RECEIVED_SEQ_OFF 0b00000000 // 2 0 mode that will be set after packet received: sequencer off (default) +#define RADIOLIB_SX127X_FROM_PACKET_RECEIVED_TRANSMIT 0b00000001 // 2 0 transmit +#define RADIOLIB_SX127X_FROM_PACKET_RECEIVED_LP_SELECTION 0b00000010 // 2 0 low power selection +#define RADIOLIB_SX127X_FROM_PACKET_RECEIVED_RECEIVE_FS 0b00000011 // 2 0 receive via FS +#define RADIOLIB_SX127X_FROM_PACKET_RECEIVED_RECEIVE 0b00000100 // 2 0 receive + +// RADIOLIB_SX127X_REG_TIMER_RESOL +#define RADIOLIB_SX127X_TIMER1_OFF 0b00000000 // 3 2 timer 1 resolution: disabled (default) +#define RADIOLIB_SX127X_TIMER1_RESOLUTION_64_US 0b00000100 // 3 2 64 us +#define RADIOLIB_SX127X_TIMER1_RESOLUTION_4_1_MS 0b00001000 // 3 2 4.1 ms +#define RADIOLIB_SX127X_TIMER1_RESOLUTION_262_MS 0b00001100 // 3 2 262 ms +#define RADIOLIB_SX127X_TIMER2_OFF 0b00000000 // 3 2 timer 2 resolution: disabled (default) +#define RADIOLIB_SX127X_TIMER2_RESOLUTION_64_US 0b00000001 // 3 2 64 us +#define RADIOLIB_SX127X_TIMER2_RESOLUTION_4_1_MS 0b00000010 // 3 2 4.1 ms +#define RADIOLIB_SX127X_TIMER2_RESOLUTION_262_MS 0b00000011 // 3 2 262 ms + +// RADIOLIB_SX127X_REG_TIMER1_COEF +#define RADIOLIB_SX127X_TIMER1_COEFFICIENT 0xF5 // 7 0 multiplication coefficient for timer 1 + +// RADIOLIB_SX127X_REG_TIMER2_COEF +#define RADIOLIB_SX127X_TIMER2_COEFFICIENT 0x20 // 7 0 multiplication coefficient for timer 2 + +// RADIOLIB_SX127X_REG_IMAGE_CAL +#define RADIOLIB_SX127X_AUTO_IMAGE_CAL_OFF 0b00000000 // 7 7 temperature calibration disabled (default) +#define RADIOLIB_SX127X_AUTO_IMAGE_CAL_ON 0b10000000 // 7 7 temperature calibration enabled +#define RADIOLIB_SX127X_IMAGE_CAL_START 0b01000000 // 6 6 start temperature calibration +#define RADIOLIB_SX127X_IMAGE_CAL_RUNNING 0b00100000 // 5 5 temperature calibration is on-going +#define RADIOLIB_SX127X_IMAGE_CAL_COMPLETE 0b00000000 // 5 5 temperature calibration finished +#define RADIOLIB_SX127X_TEMP_CHANGED 0b00001000 // 3 3 temperature changed more than TEMP_THRESHOLD since last calibration +#define RADIOLIB_SX127X_TEMP_THRESHOLD_5_DEG_C 0b00000000 // 2 1 temperature change threshold: 5 deg. C +#define RADIOLIB_SX127X_TEMP_THRESHOLD_10_DEG_C 0b00000010 // 2 1 10 deg. C (default) +#define RADIOLIB_SX127X_TEMP_THRESHOLD_15_DEG_C 0b00000100 // 2 1 15 deg. C +#define RADIOLIB_SX127X_TEMP_THRESHOLD_20_DEG_C 0b00000110 // 2 1 20 deg. C +#define RADIOLIB_SX127X_TEMP_MONITOR_ON 0b00000000 // 0 0 temperature monitoring enabled (default) +#define RADIOLIB_SX127X_TEMP_MONITOR_OFF 0b00000001 // 0 0 temperature monitoring disabled + +// RADIOLIB_SX127X_REG_LOW_BAT +#define RADIOLIB_SX127X_LOW_BAT_OFF 0b00000000 // 3 3 low battery detector disabled +#define RADIOLIB_SX127X_LOW_BAT_ON 0b00001000 // 3 3 low battery detector enabled +#define RADIOLIB_SX127X_LOW_BAT_TRIM_1_695_V 0b00000000 // 2 0 battery voltage threshold: 1.695 V +#define RADIOLIB_SX127X_LOW_BAT_TRIM_1_764_V 0b00000001 // 2 0 1.764 V +#define RADIOLIB_SX127X_LOW_BAT_TRIM_1_835_V 0b00000010 // 2 0 1.835 V (default) +#define RADIOLIB_SX127X_LOW_BAT_TRIM_1_905_V 0b00000011 // 2 0 1.905 V +#define RADIOLIB_SX127X_LOW_BAT_TRIM_1_976_V 0b00000100 // 2 0 1.976 V +#define RADIOLIB_SX127X_LOW_BAT_TRIM_2_045_V 0b00000101 // 2 0 2.045 V +#define RADIOLIB_SX127X_LOW_BAT_TRIM_2_116_V 0b00000110 // 2 0 2.116 V +#define RADIOLIB_SX127X_LOW_BAT_TRIM_2_185_V 0b00000111 // 2 0 2.185 V + +// RADIOLIB_SX127X_REG_IRQ_FLAGS_1 +#define RADIOLIB_SX127X_FLAG_MODE_READY 0b10000000 // 7 7 requested mode is ready +#define RADIOLIB_SX127X_FLAG_RX_READY 0b01000000 // 6 6 reception ready (after RSSI, AGC, AFC) +#define RADIOLIB_SX127X_FLAG_TX_READY 0b00100000 // 5 5 transmission ready (after PA ramp-up) +#define RADIOLIB_SX127X_FLAG_PLL_LOCK 0b00010000 // 4 4 PLL locked +#define RADIOLIB_SX127X_FLAG_RSSI 0b00001000 // 3 3 RSSI value exceeds RSSI threshold +#define RADIOLIB_SX127X_FLAG_TIMEOUT 0b00000100 // 2 2 timeout occurred +#define RADIOLIB_SX127X_FLAG_PREAMBLE_DETECT 0b00000010 // 1 1 valid preamble was detected +#define RADIOLIB_SX127X_FLAG_SYNC_ADDRESS_MATCH 0b00000001 // 0 0 sync address matched + +// RADIOLIB_SX127X_REG_IRQ_FLAGS_2 +#define RADIOLIB_SX127X_FLAG_FIFO_FULL 0b10000000 // 7 7 FIFO is full +#define RADIOLIB_SX127X_FLAG_FIFO_EMPTY 0b01000000 // 6 6 FIFO is empty +#define RADIOLIB_SX127X_FLAG_FIFO_LEVEL 0b00100000 // 5 5 number of bytes in FIFO exceeds FIFO_THRESHOLD +#define RADIOLIB_SX127X_FLAG_FIFO_OVERRUN 0b00010000 // 4 4 FIFO overrun occurred +#define RADIOLIB_SX127X_FLAG_PACKET_SENT 0b00001000 // 3 3 packet was successfully sent +#define RADIOLIB_SX127X_FLAG_PAYLOAD_READY 0b00000100 // 2 2 packet was successfully received +#define RADIOLIB_SX127X_FLAG_CRC_OK 0b00000010 // 1 1 CRC check passed +#define RADIOLIB_SX127X_FLAG_LOW_BAT 0b00000001 // 0 0 battery voltage dropped below threshold + +// RADIOLIB_SX127X_REG_DIO_MAPPING_1 +#define RADIOLIB_SX127X_DIO0_LORA_RX_DONE 0b00000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_LORA_TX_DONE 0b01000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_LORA_CAD_DONE 0b10000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_CONT_MODE_READY 0b11000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_CONT_SYNC_ADDRESS 0b00000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_CONT_RSSI_PREAMBLE_DETECT 0b01000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_CONT_RX_READY 0b10000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_CONT_TX_READY 0b00000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_PACK_PAYLOAD_READY 0b00000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_PACK_PACKET_SENT 0b00000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_PACK_CRC_OK 0b01000000 // 7 6 +#define RADIOLIB_SX127X_DIO0_PACK_TEMP_CHANGE_LOW_BAT 0b11000000 // 7 6 +#define RADIOLIB_SX127X_DIO1_LORA_RX_TIMEOUT 0b00000000 // 5 4 +#define RADIOLIB_SX127X_DIO1_LORA_FHSS_CHANGE_CHANNEL 0b00010000 // 5 4 +#define RADIOLIB_SX127X_DIO1_LORA_CAD_DETECTED 0b00100000 // 5 4 +#define RADIOLIB_SX127X_DIO1_CONT_DCLK 0b00000000 // 5 4 +#define RADIOLIB_SX127X_DIO1_CONT_RSSI_PREAMBLE_DETECT 0b00010000 // 5 4 +#define RADIOLIB_SX127X_DIO1_PACK_FIFO_LEVEL 0b00000000 // 5 4 +#define RADIOLIB_SX127X_DIO1_PACK_FIFO_EMPTY 0b00010000 // 5 4 +#define RADIOLIB_SX127X_DIO1_PACK_FIFO_FULL 0b00100000 // 5 4 +#define RADIOLIB_SX127X_DIO2_LORA_FHSS_CHANGE_CHANNEL 0b00000000 // 3 2 +#define RADIOLIB_SX127X_DIO2_CONT_DATA 0b00000000 // 3 2 +#define RADIOLIB_SX127X_DIO2_PACK_FIFO_FULL 0b00000000 // 3 2 +#define RADIOLIB_SX127X_DIO2_PACK_RX_READY 0b00000100 // 3 2 +#define RADIOLIB_SX127X_DIO2_PACK_TIMEOUT 0b00001000 // 3 2 +#define RADIOLIB_SX127X_DIO2_PACK_SYNC_ADDRESS 0b00011000 // 3 2 +#define RADIOLIB_SX127X_DIO3_LORA_CAD_DONE 0b00000000 // 1 0 +#define RADIOLIB_SX127X_DIO3_LORA_VALID_HEADER 0b00000001 // 1 0 +#define RADIOLIB_SX127X_DIO3_LORA_PAYLOAD_CRC_ERROR 0b00000010 // 1 0 +#define RADIOLIB_SX127X_DIO3_CONT_TIMEOUT 0b00000000 // 1 0 +#define RADIOLIB_SX127X_DIO3_CONT_RSSI_PREAMBLE_DETECT 0b00000001 // 1 0 +#define RADIOLIB_SX127X_DIO3_CONT_TEMP_CHANGE_LOW_BAT 0b00000011 // 1 0 +#define RADIOLIB_SX127X_DIO3_PACK_FIFO_EMPTY 0b00000000 // 1 0 +#define RADIOLIB_SX127X_DIO3_PACK_TX_READY 0b00000001 // 1 0 + +// RADIOLIB_SX127X_REG_DIO_MAPPING_2 +#define RADIOLIB_SX127X_DIO4_LORA_CAD_DETECTED 0b10000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_LORA_PLL_LOCK 0b01000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_CONT_TEMP_CHANGE_LOW_BAT 0b00000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_CONT_PLL_LOCK 0b01000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_CONT_TIMEOUT 0b10000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_CONT_MODE_READY 0b11000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_PACK_TEMP_CHANGE_LOW_BAT 0b00000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_PACK_PLL_LOCK 0b01000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_PACK_TIMEOUT 0b10000000 // 7 6 +#define RADIOLIB_SX127X_DIO4_PACK_RSSI_PREAMBLE_DETECT 0b11000000 // 7 6 +#define RADIOLIB_SX127X_DIO5_LORA_MODE_READY 0b00000000 // 5 4 +#define RADIOLIB_SX127X_DIO5_LORA_CLK_OUT 0b00010000 // 5 4 +#define RADIOLIB_SX127X_DIO5_CONT_CLK_OUT 0b00000000 // 5 4 +#define RADIOLIB_SX127X_DIO5_CONT_PLL_LOCK 0b00010000 // 5 4 +#define RADIOLIB_SX127X_DIO5_CONT_RSSI_PREAMBLE_DETECT 0b00100000 // 5 4 +#define RADIOLIB_SX127X_DIO5_CONT_MODE_READY 0b00110000 // 5 4 +#define RADIOLIB_SX127X_DIO5_PACK_CLK_OUT 0b00000000 // 5 4 +#define RADIOLIB_SX127X_DIO5_PACK_PLL_LOCK 0b00010000 // 5 4 +#define RADIOLIB_SX127X_DIO5_PACK_DATA 0b00100000 // 5 4 +#define RADIOLIB_SX127X_DIO5_PACK_MODE_READY 0b00110000 // 5 4 +#define RADIOLIB_SX127X_DIO_MAP_PREAMBLE_DETECT 0b00000001 // 0 0 +#define RADIOLIB_SX127X_DIO_MAP_RSSI 0b00000000 // 0 0 + +// SX1272_REG_PLL_HOP + SX1278_REG_PLL_HOP +#define RADIOLIB_SX127X_FAST_HOP_OFF 0b00000000 // 7 7 carrier frequency validated when FRF registers are written +#define RADIOLIB_SX127X_FAST_HOP_ON 0b10000000 // 7 7 carrier frequency validated when FS modes are requested + +// SX1272_REG_TCXO + SX1278_REG_TCXO +#define RADIOLIB_SX127X_TCXO_INPUT_EXTERNAL 0b00000000 // 4 4 use external crystal oscillator +#define RADIOLIB_SX127X_TCXO_INPUT_EXTERNAL_CLIPPED 0b00010000 // 4 4 use external crystal oscillator clipped sine connected to XTA pin + +// SX1272_REG_PLL + SX1278_REG_PLL +#define RADIOLIB_SX127X_PLL_BANDWIDTH_75_KHZ 0b00000000 // 7 6 PLL bandwidth: 75 kHz +#define RADIOLIB_SX127X_PLL_BANDWIDTH_150_KHZ 0b01000000 // 7 6 150 kHz +#define RADIOLIB_SX127X_PLL_BANDWIDTH_225_KHZ 0b10000000 // 7 6 225 kHz +#define RADIOLIB_SX127X_PLL_BANDWIDTH_300_KHZ 0b11000000 // 7 6 300 kHz (default) + +/*! + \class SX127x + \brief Base class for SX127x series. All derived classes for SX127x (e.g. SX1278 or SX1272) inherit from this base class. + This class should not be instantiated directly from Arduino sketch, only from its derived classes. +*/ +class SX127x: public PhysicalLayer { + public: + // introduce PhysicalLayer overloads + using PhysicalLayer::transmit; + using PhysicalLayer::receive; + using PhysicalLayer::startTransmit; + using PhysicalLayer::readData; + + // constructor + + /*! + \brief Default constructor. Called internally when creating new LoRa instance. + \param mod Instance of Module that will be used to communicate with the %LoRa chip. + */ + SX127x(Module* mod); + + Module* getMod(); + + // basic methods + + /*! + \brief Initialization method. Will be called with appropriate parameters when calling initialization method from derived class. + \param chipVersion Array of possible values in SPI version register. Used to verify the connection and hardware version. + \param numVersions Number of possible chip versions. + \param syncWord %LoRa sync word. + \param preambleLength Length of %LoRa transmission preamble in symbols. + \returns \ref status_codes + */ + int16_t begin(uint8_t* chipVersions, uint8_t numVersions, uint8_t syncWord, uint16_t preambleLength); + + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. Declared pure virtual since SX1272 and SX1278 implementations differ. + */ + virtual void reset() = 0; + + /*! + \brief Initialization method for FSK modem. Will be called with appropriate parameters when calling FSK initialization method from derived class. + \param chipVersion Array of possible values in SPI version register. Used to verify the connection and hardware version. + \param numVersions Number of possible chip versions. + \param freqDev Frequency deviation of the FSK transmission in kHz. + \param rxBw Receiver bandwidth in kHz. + \param preambleLength Length of FSK preamble in bits. + \param enableOOK Flag to specify OOK mode. This modulation is similar to FSK. + \returns \ref status_codes + */ + int16_t beginFSK(uint8_t* chipVersions, uint8_t numVersions, float freqDev, float rxBw, uint16_t preambleLength, bool enableOOK); + + /*! + \brief Binary transmit method. Will transmit arbitrary binary data up to 255 bytes long using %LoRa or up to 63 bytes using FSK modem. + For overloads to transmit Arduino String or C-string, see PhysicalLayer::transmit. + \param data Binary data that will be transmitted. + \param len Length of binary data to transmit (in bytes). + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Binary receive method. Will attempt to receive arbitrary binary data up to 255 bytes long using %LoRa or up to 63 bytes using FSK modem. + For overloads to receive Arduino String, see PhysicalLayer::receive. + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be received. Must be known in advance for binary transmissions. + \returns \ref status_codes + */ + int16_t receive(uint8_t* data, size_t len) override; + + /*! + \brief Performs scan for valid %LoRa preamble in the current channel. + \returns \ref status_codes + */ + int16_t scanChannel() override; + + /*! + \brief Sets the %LoRa module to sleep to save power. %Module will not be able to transmit or receive any data while in sleep mode. + %Module will wake up automatically when methods like transmit or receive are called. + \returns \ref status_codes + */ + int16_t sleep(); + + /*! + \brief Sets the %LoRa module to standby. + \returns \ref status_codes + */ + int16_t standby() override; + + /*! + \brief Sets the %LoRa module to standby. + \param mode Standby mode to be used. No effect, implemented only for PhysicalLayer compatibility. + \returns \ref status_codes + */ + int16_t standby(uint8_t mode) override; + + /*! + \brief Enables direct transmission mode on pins DIO1 (clock) and DIO2 (data). + While in direct mode, the module will not be able to transmit or receive packets. Can only be activated in FSK mode. + \param frf 24-bit raw frequency value to start transmitting at. Required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0) override; + + /*! + \brief Enables direct reception mode on pins DIO1 (clock) and DIO2 (data). + While in direct mode, the module will not be able to transmit or receive packets. Can only be activated in FSK mode. + \returns \ref status_codes + */ + int16_t receiveDirect() override; + + /*! + \brief Disables direct mode and enables packet mode, allowing the module to receive packets. Can only be activated in FSK mode. + \returns \ref status_codes + */ + int16_t packetMode(); + + // interrupt methods + + /*! + \brief Set interrupt service routine function to call when DIO0 activates. + \param func Pointer to interrupt service routine. + \param dir Signal change direction. + */ + void setDio0Action(void (*func)(void), uint32_t dir); + + /*! + \brief Clears interrupt service routine to call when DIO0 activates. + */ + void clearDio0Action(); + + /*! + \brief Set interrupt service routine function to call when DIO1 activates. + \param func Pointer to interrupt service routine. + \param dir Signal change direction. + */ + void setDio1Action(void (*func)(void), uint32_t dir); + + /*! + \brief Clears interrupt service routine to call when DIO1 activates. + */ + void clearDio1Action(); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + void clearPacketSentAction(); + + /*! + \brief Sets interrupt service routine to call when a channel scan is finished. + \param func ISR to call. + */ + void setChannelScanAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a channel scan is finished. + */ + void clearChannelScanAction(); + + /*! + \brief Set interrupt service routine function to call when FIFO is empty. + \param func Pointer to interrupt service routine. + */ + void setFifoEmptyAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when FIFO is empty. + */ + void clearFifoEmptyAction(); + + /*! + \brief Set interrupt service routine function to call when FIFO is full. + \param func Pointer to interrupt service routine. + */ + void setFifoFullAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when FIFO is full. + */ + void clearFifoFullAction(); + + /*! + \brief Set interrupt service routine function to call when FIFO is empty. + \param data Pointer to the transmission buffer. + \param totalLen Total number of bytes to transmit. + \param remLen Pointer to a counter holding the number of bytes that have been transmitted so far. + \returns True when a complete packet is sent, false if more data is needed. + */ + bool fifoAdd(uint8_t* data, int totalLen, int* remLen); + + /*! + \brief Set interrupt service routine function to call when FIFO is sufficiently full to read. + \param data Pointer to a buffer that stores the receive data. + \param totalLen Total number of bytes to receive. + \param rcvLen Pointer to a counter holding the number of bytes that have been received so far. + \returns True when a complete packet is received, false if more data is needed. + */ + bool fifoGet(volatile uint8_t* data, int totalLen, volatile int* rcvLen); + + /*! + \brief Interrupt-driven binary transmit method. Will start transmitting arbitrary binary data up to 255 bytes long using %LoRa or up to 63 bytes using FSK modem. + \param data Binary data that will be transmitted. + \param len Length of binary data to transmit (in bytes). + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Clean up after transmission is done. + \returns \ref status_codes + */ + int16_t finishTransmit() override; + + /*! + \brief Interrupt-driven receive method with default parameters. + Implemented for compatibility with PhysicalLayer. + \returns \ref status_codes + */ + int16_t startReceive(); + + /*! + \brief Interrupt-driven receive method. DIO0 will be activated when full valid packet is received. + \param len Expected length of packet to be received, or 0 when unused. + Defaults to 0, non-zero required for LoRa spreading factor 6. + \param mode Receive mode to be used. Defaults to RxContinuous. + \returns \ref status_codes + */ + int16_t startReceive(uint8_t len, uint8_t mode = RADIOLIB_SX127X_RXCONTINUOUS); + + /*! + \brief Interrupt-driven receive method, implemented for compatibility with PhysicalLayer. + \param mode Receive mode to be used. + \param irqFlags Ignored. + \param irqMask Ignored. + \param len Expected length of packet to be received. Required for LoRa spreading factor 6. + \returns \ref status_codes + */ + int16_t startReceive(uint32_t mode, uint16_t irqFlags, uint16_t irqMask, size_t len); + + /*! + \brief Reads data that was received after calling startReceive method. When the packet length is not known in advance, + getPacketLength method must be called BEFORE calling readData! + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be read. When set to 0, the packet length will be retrieved automatically. + When more bytes than received are requested, only the number of bytes requested will be returned. + \returns \ref status_codes + */ + int16_t readData(uint8_t* data, size_t len) override; + + /*! + \brief Interrupt-driven channel activity detection method. DIO0 will be activated when LoRa preamble is detected. + DIO1 will be activated if there's no preamble detected before timeout. + \returns \ref status_codes + */ + int16_t startChannelScan() override; + + /*! + \brief Read the channel scan result. + \returns \ref status_codes + */ + int16_t getChannelScanResult() override; + + // configuration methods + + /*! + \brief Sets %LoRa sync word. Only available in %LoRa mode. + \param syncWord Sync word to be set. + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t syncWord); + + /*! + \brief Sets current limit for over current protection at transmitter amplifier. Allowed values range from 45 to 120 mA in 5 mA steps and 120 to 240 mA in 10 mA steps. + \param currentLimit Current limit to be set (in mA). + \returns \ref status_codes + */ + int16_t setCurrentLimit(uint8_t currentLimit); + + /*! + \brief Sets %LoRa or FSK preamble length. Allowed values range from 6 to 65535 in %LoRa mode or 0 to 65535 in FSK mode. + \param preambleLength Preamble length to be set (in symbols when in LoRa mode or bits in FSK mode). + \returns \ref status_codes + */ + int16_t setPreambleLength(size_t preambleLength) override; + + /*! + \brief Invert FSK preamble polarity. The default (non-inverted) is 0x55, the inverted is 0xAA. + \param enable Preamble polarity in FSK mode - 0xAA when true, 0x55 when false. + \returns \ref status_codes + */ + int16_t invertPreamble(bool enable); + + /*! + \brief Gets frequency error of the latest received packet. + \param autoCorrect When set to true, frequency will be automatically corrected. + \returns Frequency error in Hz. + */ + float getFrequencyError(bool autoCorrect = false); + + /*! + \brief Gets current AFC error. + \returns Frequency offset from RF in Hz if AFC is enabled and triggered, zero otherwise. + */ + float getAFCError(); + + /*! + \brief Gets signal-to-noise ratio of the latest received packet. Only available in LoRa mode. + \returns Last packet signal-to-noise ratio (SNR). + */ + float getSNR(); + + /*! + \brief Get data rate of the latest transmitted packet. + \returns Last packet data rate in bps (bits per second). + */ + float getDataRate() const; + + /*! + \brief Sets FSK frequency deviation from carrier frequency. Allowed values depend on bit rate setting and must be lower than 200 kHz. Only available in FSK mode. + \param freqDev Frequency deviation to be set (in kHz). + \returns \ref status_codes + */ + int16_t setFrequencyDeviation(float freqDev) override; + + /*! + \brief Sets FSK receiver bandwidth. Allowed values range from 2.6 to 250 kHz. Only available in FSK mode. + \param rxBw Receiver bandwidth to be set (in kHz). + \returns \ref status_codes + */ + int16_t setRxBandwidth(float rxBw); + + /*! + \brief Sets FSK automatic frequency correction bandwidth. Allowed values range from 2.6 to 250 kHz. Only available in FSK mode. + \param rxBw Receiver AFC bandwidth to be set (in kHz). + \returns \ref status_codes + */ + int16_t setAFCBandwidth(float afcBw); + + /*! + \brief Enables or disables FSK automatic frequency correction(AFC) + \param isEnabled AFC enabled or disabled + \return \ref status_codes + */ + int16_t setAFC(bool isEnabled); + + /*! + \brief Controls trigger of AFC and AGC + \param trigger one from SX127X_RX_TRIGGER_NONE, SX127X_RX_TRIGGER_RSSI_INTERRUPT, SX127X_RX_TRIGGER_PREAMBLE_DETECT, SX127X_RX_TRIGGER_BOTH + \return \ref status_codes + */ + int16_t setAFCAGCTrigger(uint8_t trigger); + + /*! + \brief Sets FSK sync word. Allowed sync words are up to 8 bytes long and can not contain null bytes. Only available in FSK mode. + \param syncWord Sync word array. + \param len Sync word length (in bytes). + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t* syncWord, size_t len) override; + + /*! + \brief Sets FSK node address. Calling this method will enable address filtering. Only available in FSK mode. + \param nodeAddr Node address to be set. + \returns \ref status_codes + */ + int16_t setNodeAddress(uint8_t nodeAddr); + + /*! + \brief Sets FSK broadcast address. Calling this method will enable address filtering. Only available in FSK mode. + \param broadAddr Broadcast address to be set. + \returns \ref status_codes + */ + int16_t setBroadcastAddress(uint8_t broadAddr); + + /*! + \brief Disables FSK address filtering. + \returns \ref status_codes + */ + int16_t disableAddressFiltering(); + + /*! + \brief Enables/disables OOK modulation instead of FSK. + \param enableOOK Enable (true) or disable (false) OOK. + \returns \ref status_codes + */ + int16_t setOOK(bool enableOOK); + + /*! + \brief Selects the type of threshold in the OOK data slicer. + \param type Threshold type: SX127X_OOK_THRESH_PEAK(default), SX127X_OOK_THRESH_FIXED, SX127X_OOK_THRESH_AVERAGE + \returns \ref status_codes + */ + int16_t setOokThresholdType(uint8_t type); + + /*! + \brief Period of decrement of the RSSI threshold in the OOK demodulator. + \param value Use defines RADIOLIB_SX127X_OOK_PEAK_THRESH_DEC_X_X_CHIP + \returns \ref status_codes + */ + int16_t setOokPeakThresholdDecrement(uint8_t value); + + /*! + \brief Fixed threshold for the Data Slicer in OOK mode or floor threshold for the Data Slicer in OOK when Peak mode is used. + \param value Threshold level in steps of 0.5 dB. + \returns \ref status_codes + */ + int16_t setOokFixedOrFloorThreshold(uint8_t value); + + /*! + \brief Size of each decrement of the RSSI threshold in the OOK demodulator. + \param value Step size: RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_0_5_DB (default), RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_1_0_DB, RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_1_5_DB, RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_2_0_DB, RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_3_0_DB, RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_4_0_DB, RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_5_0_DB, RADIOLIB_SX127X_OOK_PEAK_THRESH_STEP_6_0_DB + \returns \ref status_codes + */ + int16_t setOokPeakThresholdStep(uint8_t value); + + /*! + \brief Enable Bit synchronizer. + \returns \ref status_codes + */ + int16_t enableBitSync(); + + /*! + \brief Disable Bit synchronizer (not allowed in Packet mode). + \returns \ref status_codes + */ + int16_t disableBitSync(); + + /*! + \brief Query modem for the packet length of received payload. + \param update Update received packet length. Will return cached value when set to false. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update = true) override; + + /*! + \brief Set modem in fixed packet length mode. Available in FSK mode only. + \param len Packet length. + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_SX127X_MAX_PACKET_LENGTH_FSK); + + /*! + \brief Set modem in variable packet length mode. Available in FSK mode only. + \param len Maximum packet length. + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_SX127X_MAX_PACKET_LENGTH_FSK); + + /*! + \brief Get expected time-on-air for a given size of payload. + \param len Payload length in bytes. + \returns Expected time-on-air in microseconds. + */ + uint32_t getTimeOnAir(size_t len) override; + + /*! + \brief Enable CRC filtering and generation. + \param enable Set or unset CRC filtering and generation. + \returns \ref status_codes + */ + int16_t setCrcFiltering(bool enable = true); + + /*! + \brief Sets RSSI measurement configuration in FSK mode. + \param smoothingSamples Number of samples taken to average the RSSI result. + numSamples = 2 ^ (1 + smoothingSamples), allowed values are in range 0 (2 samples) - 7 (256 samples) + \param offset Signed RSSI offset that will be automatically compensated. 1 dB per LSB, defaults to 0, allowed values are in range -16 dB to +15 dB. + \returns \ref status_codes + */ + int16_t setRSSIConfig(uint8_t smoothingSamples, int8_t offset = 0); + + /*! + \brief Sets transmission encoding. Only available in FSK mode. + Allowed values are RADIOLIB_ENCODING_NRZ, RADIOLIB_ENCODING_MANCHESTER and RADIOLIB_ENCODING_WHITENING. + \param encoding Encoding to be used. + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding) override; + + /*! + \brief Reads currently active IRQ flags, can be used to check which event caused an interrupt. + In LoRa mode, this is the content of SX127X_REG_IRQ_FLAGS register. + In FSK mode, this is the contents of SX127X_REG_IRQ_FLAGS_2 (MSB) and SX127X_REG_IRQ_FLAGS_1 (LSB) registers. + \returns IRQ flags. + */ + uint16_t getIRQFlags(); + + /*! + \brief Reads modem status. Only available in LoRa mode. + \returns Modem status. + */ + uint8_t getModemStatus(); + + /*! + \brief Reads uncalibrated temperature value. This function will change operating mode + and should not be called during Tx, Rx or CAD. + \returns Uncalibrated temperature sensor reading. + */ + int8_t getTempRaw(); + + /*! \copydoc Module::setRfSwitchPins */ + void setRfSwitchPins(uint32_t rxEn, uint32_t txEn); + + /*! \copydoc Module::setRfSwitchTable */ + void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]); + + /*! + \brief Get one truly random byte from RSSI noise. + \returns TRNG byte. + */ + uint8_t randomByte(); + + /*! + \brief Read version SPI register. Should return SX1278_CHIP_VERSION (0x12) or SX1272_CHIP_VERSION (0x22) if SX127x is connected and working. + \returns Version register contents or \ref status_codes + */ + int16_t getChipVersion(); + + /*! + \brief Enable/disable inversion of the I and Q signals + \param enable QI inversion enabled (true) or disabled (false); + \returns \ref status_codes + */ + int16_t invertIQ(bool enable) override; + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + /*! + \brief Set interrupt service routine function to call when data bit is received in direct mode. + \param func Pointer to interrupt service routine. + */ + void setDirectAction(void (*func)(void)); + + /*! + \brief Function to read and process data bit in direct reception mode. + \param pin Pin on which to read. + */ + void readBit(uint32_t pin); + #endif + + /*! + \brief Sets the hopping period and enables FHSS + \param freqHoppingPeriod Integer multiple of symbol periods between hops + \returns \ref status_codes + */ + int16_t setFHSSHoppingPeriod(uint8_t freqHoppingPeriod); + + /*! + \brief Gets FHSS hopping period + \returns 8 bit period + */ + uint8_t getFHSSHoppingPeriod(void); + + /*! + \brief Gets the FHSS channel in use + \returns 6 bit channel number + */ + uint8_t getFHSSChannel(void); + + /*! + \brief Clear the FHSS interrupt + */ + void clearFHSSInt(void); + + /*! + \brief Configure DIO pin mapping to get a given signal on a DIO pin (if available). + \param pin Pin number onto which a signal is to be placed. + \param value The value that indicates which function to place on that pin. See chip datasheet for details. + \returns \ref status_codes + */ + int16_t setDIOMapping(uint32_t pin, uint32_t value); + + /*! + \brief Configure DIO mapping to use RSSI or Preamble Detect for pins that support it. + \param usePreambleDetect Whether to use PreambleDetect (true) or RSSI (false) on the pins that are mapped to this function. + \returns \ref status_codes + */ + int16_t setDIOPreambleDetect(bool usePreambleDetect); + + /*! + \brief Gets recorded signal strength indicator. + \param packet Whether to read last packet RSSI, or the current value. LoRa mode only, ignored for FSK. + \param skipReceive Set to true to skip putting radio in receive mode for the RSSI measurement in FSK/OOK mode. + \returns RSSI value in dBm. + */ + float getRSSI(bool packet, bool skipReceive, int16_t offset); + + /*! + \brief Sets the RSSI value above which the RSSI interrupt is signaled + \param dbm A dBm value between -127.5 and 0 inclusive + \returns \ref status_codes + */ + int16_t setRSSIThreshold(float dbm); + +#if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) + protected: +#endif + Module* mod; + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + + float frequency = 0; + float bandwidth = 0; + uint8_t spreadingFactor = 0; + uint8_t codingRate = 0; + float bitRate = 0; + bool ookEnabled = false; + bool crcEnabled = false; + bool crcOn = true; // default value used in FSK mode + size_t packetLength = 0; + + int16_t setFrequencyRaw(float newFreq); + int16_t setBitRateCommon(float br, uint8_t fracRegAddr); + int16_t config(); + int16_t configFSK(); + int16_t getActiveModem(); + int16_t directMode(); + int16_t setPacketMode(uint8_t mode, uint8_t len); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + float dataRate = 0; + bool packetLengthQueried = false; // FSK packet length is the first byte in FIFO, length can only be queried once + uint8_t packetLengthConfig = RADIOLIB_SX127X_PACKET_VARIABLE; + + bool findChip(uint8_t* vers, uint8_t num); + int16_t setMode(uint8_t mode); + int16_t setActiveModem(uint8_t modem); + void clearIRQFlags(); + void clearFIFO(size_t count); // used mostly to clear remaining bytes in FIFO after a packet read + + /*! + \brief Calculate exponent and mantissa values for receiver bandwidth and AFC + \param bandwidth bandwidth to be set (in kHz). + \returns bandwidth in mantissa and exponent format + */ + static uint8_t calculateBWManExp(float bandwidth); + + virtual void errataFix(bool rx) = 0; +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1280.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1280.cpp new file mode 100644 index 00000000..b53c1a62 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1280.cpp @@ -0,0 +1,182 @@ +#include "SX1280.h" +#include +#if !defined(RADIOLIB_EXCLUDE_SX128X) + +SX1280::SX1280(Module* mod) : SX1281(mod) { + +} + +int16_t SX1280::range(bool master, uint32_t addr, uint16_t calTable[3][6]) { + // start ranging + int16_t state = startRanging(master, addr, calTable); + RADIOLIB_ASSERT(state); + + // wait until ranging is finished + uint32_t start = this->mod->hal->millis(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + if(this->mod->hal->millis() - start > 10000) { + clearIrqStatus(); + standby(); + return(RADIOLIB_ERR_RANGING_TIMEOUT); + } + } + + // clear interrupt flags + state = clearIrqStatus(); + RADIOLIB_ASSERT(state); + + // set mode to standby + state = standby(); + + return(state); +} + +int16_t SX1280::startRanging(bool master, uint32_t addr, uint16_t calTable[3][6]) { + // check active modem + uint8_t modem = getPacketType(); + if(!((modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) || (modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING))) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // ensure modem is set to ranging + if(modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) { + state = setPacketType(RADIOLIB_SX128X_PACKET_TYPE_RANGING); + RADIOLIB_ASSERT(state); + } + + // set modulation parameters + state = setModulationParams(this->spreadingFactor, this->bandwidth, this->codingRateLoRa); + RADIOLIB_ASSERT(state); + + // set packet parameters + state = setPacketParamsLoRa(this->preambleLengthLoRa, this->headerType, this->payloadLen, this->crcLoRa); + RADIOLIB_ASSERT(state); + + // check all address bits + if(!master) { + uint8_t regValue; + state = readRegister(RADIOLIB_SX128X_REG_SLAVE_RANGING_ADDRESS_WIDTH, ®Value, 1); + RADIOLIB_ASSERT(state); + regValue &= 0b00111111; + regValue |= 0b11000000; + state = writeRegister(RADIOLIB_SX128X_REG_SLAVE_RANGING_ADDRESS_WIDTH, ®Value, 1); + RADIOLIB_ASSERT(state); + } + + // set remaining parameter values + uint32_t addrReg = RADIOLIB_SX128X_REG_SLAVE_RANGING_ADDRESS_BYTE_3; + uint32_t irqMask = RADIOLIB_SX128X_IRQ_RANGING_SLAVE_RESP_DONE | RADIOLIB_SX128X_IRQ_RANGING_SLAVE_REQ_DISCARD; + uint32_t irqDio1 = RADIOLIB_SX128X_IRQ_RANGING_SLAVE_RESP_DONE; + if(master) { + addrReg = RADIOLIB_SX128X_REG_MASTER_RANGING_ADDRESS_BYTE_3; + irqMask = RADIOLIB_SX128X_IRQ_RANGING_MASTER_RES_VALID | RADIOLIB_SX128X_IRQ_RANGING_MASTER_TIMEOUT; + irqDio1 = RADIOLIB_SX128X_IRQ_RANGING_MASTER_RES_VALID; + } + + // set ranging address + uint8_t addrBuff[] = { (uint8_t)((addr >> 24) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)(addr & 0xFF) }; + state = writeRegister(addrReg, addrBuff, 4); + RADIOLIB_ASSERT(state); + + // set DIO mapping + state = setDioIrqParams(irqMask, irqDio1); + RADIOLIB_ASSERT(state); + + // this is the default calibration from AN1200.29 + uint16_t calTbl[3][6] = { + { 10299, 10271, 10244, 10242, 10230, 10246 }, + { 11486, 11474, 11453, 11426, 11417, 11401 }, + { 13308, 13493, 13528, 13515, 13430, 13376 } + }; + + // check if user provided some custom calibration + if(calTable != NULL) { + memcpy(calTbl, calTable, sizeof(calTbl)); + } + + // set calibration values + uint8_t index = (this->spreadingFactor >> 4) - 5; + uint16_t val = 0; + switch(this->bandwidth) { + case(RADIOLIB_SX128X_LORA_BW_406_25): + val = calTbl[0][index]; + break; + case(RADIOLIB_SX128X_LORA_BW_812_50): + val = calTbl[1][index]; + break; + case(RADIOLIB_SX128X_LORA_BW_1625_00): + val = calTbl[2][index]; + break; + default: + return(RADIOLIB_ERR_INVALID_BANDWIDTH); + } + uint8_t calBuff[] = { (uint8_t)((val >> 8) & 0xFF), (uint8_t)(val & 0xFF) }; + state = writeRegister(RADIOLIB_SX128X_REG_RANGING_CALIBRATION_MSB, calBuff, 2); + RADIOLIB_ASSERT(state); + + // set role and start ranging + if(master) { + state = setRangingRole(RADIOLIB_SX128X_RANGING_ROLE_MASTER); + RADIOLIB_ASSERT(state); + + state = setTx(RADIOLIB_SX128X_TX_TIMEOUT_NONE); + RADIOLIB_ASSERT(state); + + } else { + state = setRangingRole(RADIOLIB_SX128X_RANGING_ROLE_SLAVE); + RADIOLIB_ASSERT(state); + + state = setRx(RADIOLIB_SX128X_RX_TIMEOUT_INF); + RADIOLIB_ASSERT(state); + + } + + return(state); +} + +float SX1280::getRangingResult() { + // set mode to standby XOSC + int16_t state = standby(RADIOLIB_SX128X_STANDBY_XOSC); + RADIOLIB_ASSERT(state); + + // enable clock + uint8_t data[4]; + state = readRegister(RADIOLIB_SX128X_REG_RANGING_LORA_CLOCK_ENABLE, data, 1); + RADIOLIB_ASSERT(state); + + data[0] |= (1 << 1); + state = writeRegister(RADIOLIB_SX128X_REG_RANGING_LORA_CLOCK_ENABLE, data, 1); + RADIOLIB_ASSERT(state); + + // set result type to filtered + state = readRegister(RADIOLIB_SX128X_REG_RANGING_TYPE, data, 1); + RADIOLIB_ASSERT(state); + + data[0] &= 0xCF; + data[0] |= (1 << 4); + state = writeRegister(RADIOLIB_SX128X_REG_RANGING_TYPE, data, 1); + RADIOLIB_ASSERT(state); + + // read the register values + state = readRegister(RADIOLIB_SX128X_REG_RANGING_RESULT_MSB, &data[0], 1); + RADIOLIB_ASSERT(state); + state = readRegister(RADIOLIB_SX128X_REG_RANGING_RESULT_MID, &data[1], 1); + RADIOLIB_ASSERT(state); + state = readRegister(RADIOLIB_SX128X_REG_RANGING_RESULT_LSB, &data[2], 1); + RADIOLIB_ASSERT(state); + + // set mode to standby RC + state = standby(); + RADIOLIB_ASSERT(state); + + // calculate the real result + uint32_t raw = ((uint32_t)data[0] << 16) | ((uint32_t)data[1] << 8) | data[2]; + return((float)raw * 150.0 / (4.096 * this->bandwidthKhz)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1280.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1280.h new file mode 100644 index 00000000..51bb7c0b --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1280.h @@ -0,0 +1,56 @@ +#if !defined(_RADIOLIB_SX1280_H) +#define _RADIOLIB_SX1280_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX128X) + +#include "../../Module.h" +#include "SX128x.h" +#include "SX1281.h" + +/*! + \class SX1280 + \brief Derived class for %SX1280 modules. +*/ +class SX1280: public SX1281 { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1280(Module* mod); + + /*! + \brief Blocking ranging method. + \param master Whether to execute ranging in master mode (true) or slave mode (false). + \param addr Ranging address to be used. + \param calTable Ranging calibration table - set to NULL to use the default. + \returns \ref status_codes + */ + int16_t range(bool master, uint32_t addr, uint16_t calTable[3][6] = NULL); + + /*! + \brief Interrupt-driven ranging method. + \param master Whether to execute ranging in master mode (true) or slave mode (false). + \param addr Ranging address to be used. + \param calTable Ranging calibration table - set to NULL to use the default. + \returns \ref status_codes + */ + int16_t startRanging(bool master, uint32_t addr, uint16_t calTable[3][6] = NULL); + + /*! + \brief Gets ranging result of the last ranging exchange. + \returns Ranging result in meters. + */ + float getRangingResult(); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1281.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1281.cpp new file mode 100644 index 00000000..c6b2b5eb --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1281.cpp @@ -0,0 +1,8 @@ +#include "SX1281.h" +#if !defined(RADIOLIB_EXCLUDE_SX128X) + +SX1281::SX1281(Module* mod) : SX128x(mod) { + +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1281.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1281.h new file mode 100644 index 00000000..04a9eb19 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1281.h @@ -0,0 +1,31 @@ +#if !defined(_RADIOLIB_SX1281_H) +#define _RADIOLIB_SX1281_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX128X) + +#include "../../Module.h" +#include "SX128x.h" + +/*! + \class SX1281 + \brief Derived class for %SX1281 modules. +*/ +class SX1281: public SX128x { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1281(Module* mod); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1282.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1282.cpp new file mode 100644 index 00000000..33deee97 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1282.cpp @@ -0,0 +1,9 @@ +#include "SX1282.h" +#if !defined(RADIOLIB_EXCLUDE_SX128X) + +/// \todo implement advanced ranging +SX1282::SX1282(Module* mod) : SX1280(mod) { + +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1282.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1282.h new file mode 100644 index 00000000..864e463d --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX1282.h @@ -0,0 +1,32 @@ +#if !defined(_RADIOLIB_SX1282_H) +#define _RADIOLIB_SX1282_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX128X) + +#include "../../Module.h" +#include "SX128x.h" +#include "SX1280.h" + +/*! + \class SX1282 + \brief Derived class for %SX1282 modules. +*/ +class SX1282: public SX1280 { + public: + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1282(Module* mod); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX128x.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX128x.cpp new file mode 100644 index 00000000..3e26382e --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX128x.cpp @@ -0,0 +1,1514 @@ +#include "SX128x.h" +#include +#if !defined(RADIOLIB_EXCLUDE_SX128X) + +SX128x::SX128x(Module* mod) : PhysicalLayer(RADIOLIB_SX128X_FREQUENCY_STEP_SIZE, RADIOLIB_SX128X_MAX_PACKET_LENGTH) { + this->mod = mod; +} + +Module* SX128x::getMod() { + return(this->mod); +} + +int16_t SX128x::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t pwr, uint16_t preambleLength) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + this->mod->SPIreadCommand = RADIOLIB_SX128X_CMD_READ_REGISTER; + this->mod->SPIwriteCommand = RADIOLIB_SX128X_CMD_WRITE_REGISTER; + this->mod->SPInopCommand = RADIOLIB_SX128X_CMD_NOP; + this->mod->SPIstatusCommand = RADIOLIB_SX128X_CMD_GET_STATUS; + this->mod->SPIstreamType = true; + this->mod->SPIparseStatusCb = SPIparseStatus; + RADIOLIB_DEBUG_PRINTLN("M\tSX128x"); + + // initialize LoRa modulation variables + this->bandwidthKhz = bw; + this->spreadingFactor = RADIOLIB_SX128X_LORA_SF_9; + this->codingRateLoRa = RADIOLIB_SX128X_LORA_CR_4_7; + + // initialize LoRa packet variables + this->preambleLengthLoRa = preambleLength; + this->headerType = RADIOLIB_SX128X_LORA_HEADER_EXPLICIT; + this->payloadLen = 0xFF; + this->crcLoRa = RADIOLIB_SX128X_LORA_CRC_ON; + + // reset the module and verify startup + int16_t state = reset(); + RADIOLIB_ASSERT(state); + + // set mode to standby + state = standby(); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = config(RADIOLIB_SX128X_PACKET_TYPE_LORA); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setSyncWord(syncWord); + RADIOLIB_ASSERT(state); + + state = setPreambleLength(preambleLength); + RADIOLIB_ASSERT(state); + + state = setOutputPower(pwr); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX128x::beginGFSK(float freq, uint16_t br, float freqDev, int8_t pwr, uint16_t preambleLength) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + this->mod->SPIreadCommand = RADIOLIB_SX128X_CMD_READ_REGISTER; + this->mod->SPIwriteCommand = RADIOLIB_SX128X_CMD_WRITE_REGISTER; + this->mod->SPInopCommand = RADIOLIB_SX128X_CMD_NOP; + this->mod->SPIstatusCommand = RADIOLIB_SX128X_CMD_GET_STATUS; + this->mod->SPIstreamType = true; + this->mod->SPIparseStatusCb = SPIparseStatus; + RADIOLIB_DEBUG_PRINTLN("M\tSX128x"); + + // initialize GFSK modulation variables + this->bitRateKbps = br; + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_0_800_BW_2_4; + this->modIndexReal = 1.0; + this->modIndex = RADIOLIB_SX128X_BLE_GFSK_MOD_IND_1_00; + this->shaping = RADIOLIB_SX128X_BLE_GFSK_BT_0_5; + + // initialize GFSK packet variables + this->preambleLengthGFSK = preambleLength; + this->syncWordLen = 2; + this->syncWordMatch = RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_1; + this->crcGFSK = RADIOLIB_SX128X_GFSK_FLRC_CRC_2_BYTE; + this->whitening = RADIOLIB_SX128X_GFSK_BLE_WHITENING_ON; + + // reset the module and verify startup + int16_t state = reset(); + RADIOLIB_ASSERT(state); + + // set mode to standby + state = standby(); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = config(RADIOLIB_SX128X_PACKET_TYPE_GFSK); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + state = setOutputPower(pwr); + RADIOLIB_ASSERT(state); + + state = setPreambleLength(preambleLength); + RADIOLIB_ASSERT(state); + + state = setDataShaping(RADIOLIB_SHAPING_0_5); + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + uint8_t sync[] = { 0x12, 0xAD }; + state = setSyncWord(sync, 2); + RADIOLIB_ASSERT(state); + + state = setEncoding(RADIOLIB_ENCODING_NRZ); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX128x::beginBLE(float freq, uint16_t br, float freqDev, int8_t pwr, uint8_t dataShaping) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + this->mod->SPIreadCommand = RADIOLIB_SX128X_CMD_READ_REGISTER; + this->mod->SPIwriteCommand = RADIOLIB_SX128X_CMD_WRITE_REGISTER; + this->mod->SPInopCommand = RADIOLIB_SX128X_CMD_NOP; + this->mod->SPIstatusCommand = RADIOLIB_SX128X_CMD_GET_STATUS; + this->mod->SPIstreamType = true; + this->mod->SPIparseStatusCb = SPIparseStatus; + RADIOLIB_DEBUG_PRINTLN("M\tSX128x"); + + // initialize BLE modulation variables + this->bitRateKbps = br; + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_0_800_BW_2_4; + this->modIndexReal = 1.0; + this->modIndex = RADIOLIB_SX128X_BLE_GFSK_MOD_IND_1_00; + this->shaping = RADIOLIB_SX128X_BLE_GFSK_BT_0_5; + + // initialize BLE packet variables + this->crcGFSK = RADIOLIB_SX128X_BLE_CRC_3_BYTE; + this->whitening = RADIOLIB_SX128X_GFSK_BLE_WHITENING_ON; + + // reset the module and verify startup + int16_t state = reset(); + RADIOLIB_ASSERT(state); + + // set mode to standby + state = standby(); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = config(RADIOLIB_SX128X_PACKET_TYPE_BLE); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + state = setOutputPower(pwr); + RADIOLIB_ASSERT(state); + + state = setDataShaping(dataShaping); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX128x::beginFLRC(float freq, uint16_t br, uint8_t cr, int8_t pwr, uint16_t preambleLength, uint8_t dataShaping) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getGpio(), this->mod->hal->GpioModeInput); + this->mod->SPIreadCommand = RADIOLIB_SX128X_CMD_READ_REGISTER; + this->mod->SPIwriteCommand = RADIOLIB_SX128X_CMD_WRITE_REGISTER; + this->mod->SPInopCommand = RADIOLIB_SX128X_CMD_NOP; + this->mod->SPIstatusCommand = RADIOLIB_SX128X_CMD_GET_STATUS; + this->mod->SPIstreamType = true; + this->mod->SPIparseStatusCb = SPIparseStatus; + RADIOLIB_DEBUG_PRINTLN("M\tSX128x"); + + // initialize FLRC modulation variables + this->bitRateKbps = br; + this->bitRate = RADIOLIB_SX128X_FLRC_BR_0_650_BW_0_6; + this->codingRateFLRC = RADIOLIB_SX128X_FLRC_CR_3_4; + this->shaping = RADIOLIB_SX128X_FLRC_BT_0_5; + + // initialize FLRC packet variables + this->preambleLengthGFSK = preambleLength; + this->syncWordLen = 2; + this->syncWordMatch = RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_1; + this->crcGFSK = RADIOLIB_SX128X_GFSK_FLRC_CRC_2_BYTE; + this->whitening = RADIOLIB_SX128X_GFSK_BLE_WHITENING_OFF; + + // reset the module and verify startup + int16_t state = reset(); + RADIOLIB_ASSERT(state); + + // set mode to standby + state = standby(); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = config(RADIOLIB_SX128X_PACKET_TYPE_FLRC); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setOutputPower(pwr); + RADIOLIB_ASSERT(state); + + state = setPreambleLength(preambleLength); + RADIOLIB_ASSERT(state); + + state = setDataShaping(dataShaping); + RADIOLIB_ASSERT(state); + + // set publicly accessible settings that are not a part of begin method + uint8_t sync[] = { 0x2D, 0x01, 0x4B, 0x1D}; + state = setSyncWord(sync, 4); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t SX128x::reset(bool verify) { + // run the reset sequence - same as SX126x, as SX128x docs don't seem to mention this + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + this->mod->hal->delay(1); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + + // return immediately when verification is disabled + if(!verify) { + return(RADIOLIB_ERR_NONE); + } + + // set mode to standby + uint32_t start = this->mod->hal->millis(); + while(true) { + // try to set mode to standby + int16_t state = standby(); + if(state == RADIOLIB_ERR_NONE) { + // standby command successful + return(RADIOLIB_ERR_NONE); + } + + // standby command failed, check timeout and try again + if(this->mod->hal->millis() - start >= 3000) { + // timed out, possibly incorrect wiring + return(state); + } + + // wait a bit to not spam the module + this->mod->hal->delay(10); + } +} + +int16_t SX128x::transmit(uint8_t* data, size_t len, uint8_t addr) { + // check packet length + if(len > RADIOLIB_SX128X_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // check active modem + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // calculate timeout (500% of expected time-on-air) + uint32_t timeout = getTimeOnAir(len) * 5; + + RADIOLIB_DEBUG_PRINTLN("Timeout in %lu us", timeout); + + // start transmission + state = startTransmit(data, len, addr); + RADIOLIB_ASSERT(state); + + // wait for packet transmission or timeout + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + if(this->mod->hal->micros() - start > timeout) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + + return(finishTransmit()); +} + +int16_t SX128x::receive(uint8_t* data, size_t len) { + // check active modem + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // calculate timeout (1000% of expected time-on-air) + uint32_t timeout = getTimeOnAir(len) * 10; + + RADIOLIB_DEBUG_PRINTLN("Timeout in %lu us", timeout); + + // start reception + uint32_t timeoutValue = (uint32_t)((float)timeout / 15.625); + state = startReceive(timeoutValue); + RADIOLIB_ASSERT(state); + + // wait for packet reception or timeout + bool softTimeout = false; + uint32_t start = this->mod->hal->micros(); + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + // safety check, the timeout should be done by the radio + if(this->mod->hal->micros() - start > timeout) { + softTimeout = true; + break; + } + } + + // if it was a timeout, this will return an error code + state = standby(); + if((state != RADIOLIB_ERR_NONE) && (state != RADIOLIB_ERR_SPI_CMD_TIMEOUT)) { + return(state); + } + + // check whether this was a timeout or not + if((getIrqStatus() & RADIOLIB_SX128X_IRQ_RX_TX_TIMEOUT) || softTimeout) { + standby(); + clearIrqStatus(); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + + // read the received data + return(readData(data, len)); +} + +int16_t SX128x::transmitDirect(uint32_t frf) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // user requested to start transmitting immediately (required for RTTY) + int16_t state = RADIOLIB_ERR_NONE; + if(frf != 0) { + state = setRfFrequency(frf); + } + RADIOLIB_ASSERT(state); + + // start transmitting + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_TX_CONTINUOUS_WAVE, NULL, 0)); +} + +int16_t SX128x::receiveDirect() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // SX128x is unable to output received data directly + return(RADIOLIB_ERR_UNKNOWN); +} + +int16_t SX128x::scanChannel() { + // check active modem + if(getPacketType() != RADIOLIB_SX128X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set DIO pin mapping + state = setDioIrqParams(RADIOLIB_SX128X_IRQ_CAD_DETECTED | RADIOLIB_SX128X_IRQ_CAD_DONE, RADIOLIB_SX128X_IRQ_CAD_DETECTED | RADIOLIB_SX128X_IRQ_CAD_DONE); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + state = clearIrqStatus(); + RADIOLIB_ASSERT(state); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set mode to CAD + state = setCad(); + RADIOLIB_ASSERT(state); + + // wait for channel activity detected or timeout + while(!this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + } + + // check CAD result + uint16_t cadResult = getIrqStatus(); + if(cadResult & RADIOLIB_SX128X_IRQ_CAD_DETECTED) { + // detected some LoRa activity + clearIrqStatus(); + return(RADIOLIB_LORA_DETECTED); + } else if(cadResult & RADIOLIB_SX128X_IRQ_CAD_DONE) { + // channel is free + clearIrqStatus(); + return(RADIOLIB_CHANNEL_FREE); + } + + return(RADIOLIB_ERR_UNKNOWN); +} + +int16_t SX128x::sleep(bool retainConfig) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + uint8_t sleepConfig = RADIOLIB_SX128X_SLEEP_DATA_BUFFER_RETAIN | RADIOLIB_SX128X_SLEEP_DATA_RAM_RETAIN; + if(!retainConfig) { + sleepConfig = RADIOLIB_SX128X_SLEEP_DATA_BUFFER_FLUSH | RADIOLIB_SX128X_SLEEP_DATA_RAM_FLUSH; + } + int16_t state = this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_SLEEP, &sleepConfig, 1, false, false); + + // wait for SX128x to safely enter sleep mode + this->mod->hal->delay(1); + + return(state); +} + +int16_t SX128x::standby() { + return(SX128x::standby(RADIOLIB_SX128X_STANDBY_RC)); +} + +int16_t SX128x::standby(uint8_t mode, bool wakeup) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + if(wakeup) { + // pull NSS low to wake up + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelLow); + } + + uint8_t data[] = { mode }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_STANDBY, data, 1)); +} + +void SX128x::setDio1Action(void (*func)(void)) { + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq()), func, this->mod->hal->GpioInterruptRising); +} + +void SX128x::clearDio1Action() { + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq())); +} + +void SX128x::setPacketReceivedAction(void (*func)(void)) { + this->setDio1Action(func); +} + +void SX128x::clearPacketReceivedAction() { + this->clearDio1Action(); +} + +void SX128x::setPacketSentAction(void (*func)(void)) { + this->setDio1Action(func); +} + +void SX128x::clearPacketSentAction() { + this->clearDio1Action(); +} + +int16_t SX128x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { + // suppress unused variable warning + (void)addr; + + // check packet length + if(len > RADIOLIB_SX128X_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set packet Length + int16_t state = RADIOLIB_ERR_NONE; + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) { + state = setPacketParamsLoRa(this->preambleLengthLoRa, this->headerType, len, this->crcLoRa, this->invertIQEnabled); + } else if((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_FLRC)) { + state = setPacketParamsGFSK(this->preambleLengthGFSK, this->syncWordLen, this->syncWordMatch, this->crcGFSK, this->whitening, len); + } else if(modem == RADIOLIB_SX128X_PACKET_TYPE_BLE) { + state = setPacketParamsBLE(this->connectionState, this->crcBLE, this->bleTestPayload, this->whitening); + } else { + return(RADIOLIB_ERR_WRONG_MODEM); + } + RADIOLIB_ASSERT(state); + + // update output power + state = setTxParams(this->power); + RADIOLIB_ASSERT(state); + + // set buffer pointers + state = setBufferBaseAddress(); + RADIOLIB_ASSERT(state); + + // write packet to buffer + if(modem == RADIOLIB_SX128X_PACKET_TYPE_BLE) { + // first 2 bytes of BLE payload are PDU header + state = writeBuffer(data, len, 2); + RADIOLIB_ASSERT(state); + } else { + state = writeBuffer(data, len); + RADIOLIB_ASSERT(state); + } + + // set DIO mapping + state = setDioIrqParams(RADIOLIB_SX128X_IRQ_TX_DONE | RADIOLIB_SX128X_IRQ_RX_TX_TIMEOUT, RADIOLIB_SX128X_IRQ_TX_DONE); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + state = clearIrqStatus(); + RADIOLIB_ASSERT(state); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // start transmission + state = setTx(RADIOLIB_SX128X_TX_TIMEOUT_NONE); + RADIOLIB_ASSERT(state); + + // wait for BUSY to go low (= PA ramp up done) + while(this->mod->hal->digitalRead(this->mod->getGpio())) { + this->mod->hal->yield(); + } + + return(state); +} + +int16_t SX128x::finishTransmit() { + // clear interrupt flags + clearIrqStatus(); + + // set mode to standby to disable transmitter/RF switch + return(standby()); +} + +int16_t SX128x::startReceive() { + return(this->startReceive(RADIOLIB_SX128X_RX_TIMEOUT_INF, RADIOLIB_SX128X_IRQ_RX_DEFAULT, RADIOLIB_SX128X_IRQ_RX_DONE, 0)); +} + +int16_t SX128x::startReceive(uint16_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len) { + (void)len; + + // check active modem + if(getPacketType() == RADIOLIB_SX128X_PACKET_TYPE_RANGING) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set DIO mapping + if(timeout != RADIOLIB_SX128X_RX_TIMEOUT_INF) { + irqMask |= RADIOLIB_SX128X_IRQ_RX_TX_TIMEOUT; + } + + int16_t state = setDioIrqParams(irqFlags, irqMask); + RADIOLIB_ASSERT(state); + + // set buffer pointers + state = setBufferBaseAddress(); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + state = clearIrqStatus(); + RADIOLIB_ASSERT(state); + + // set implicit mode and expected len if applicable + if((this->headerType == RADIOLIB_SX128X_LORA_HEADER_IMPLICIT) && (getPacketType() == RADIOLIB_SX128X_PACKET_TYPE_LORA)) { + state = setPacketParamsLoRa(this->preambleLengthLoRa, this->headerType, this->payloadLen, this->crcLoRa, this->invertIQEnabled); + RADIOLIB_ASSERT(state); + } + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set mode to receive + state = setRx(timeout); + + return(state); +} + +int16_t SX128x::readData(uint8_t* data, size_t len) { + // check active modem + if(getPacketType() == RADIOLIB_SX128X_PACKET_TYPE_RANGING) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // check integrity CRC + uint16_t irq = getIrqStatus(); + int16_t crcState = RADIOLIB_ERR_NONE; + if((irq & RADIOLIB_SX128X_IRQ_CRC_ERROR) || (irq & RADIOLIB_SX128X_IRQ_HEADER_ERROR)) { + crcState = RADIOLIB_ERR_CRC_MISMATCH; + } + + // get packet length + size_t length = getPacketLength(); + if((len != 0) && (len < length)) { + // user requested less data than we got, only return what was requested + length = len; + } + + // read packet data + state = readBuffer(data, length); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + state = clearIrqStatus(); + + // check if CRC failed - this is done after reading data to give user the option to keep them + RADIOLIB_ASSERT(crcState); + + return(state); +} + +int16_t SX128x::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE(freq, 2400.0, 2500.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // calculate raw value + uint32_t frf = (freq * (uint32_t(1) << RADIOLIB_SX128X_DIV_EXPONENT)) / RADIOLIB_SX128X_CRYSTAL_FREQ; + return(setRfFrequency(frf)); +} + +int16_t SX128x::setBandwidth(float bw) { + // check active modem + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) { + // check range for LoRa + RADIOLIB_CHECK_RANGE(bw, 203.125, 1625.0, RADIOLIB_ERR_INVALID_BANDWIDTH); + } else if(modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING) { + // check range for ranging + RADIOLIB_CHECK_RANGE(bw, 406.25, 1625.0, RADIOLIB_ERR_INVALID_BANDWIDTH); + } else { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + if(fabs(bw - 203.125) <= 0.001) { + this->bandwidth = RADIOLIB_SX128X_LORA_BW_203_125; + } else if(fabs(bw - 406.25) <= 0.001) { + this->bandwidth = RADIOLIB_SX128X_LORA_BW_406_25; + } else if(fabs(bw - 812.5) <= 0.001) { + this->bandwidth = RADIOLIB_SX128X_LORA_BW_812_50; + } else if(fabs(bw - 1625.0) <= 0.001) { + this->bandwidth = RADIOLIB_SX128X_LORA_BW_1625_00; + } else { + return(RADIOLIB_ERR_INVALID_BANDWIDTH); + } + + // update modulation parameters + this->bandwidthKhz = bw; + return(setModulationParams(this->spreadingFactor, this->bandwidth, this->codingRateLoRa)); +} + +int16_t SX128x::setSpreadingFactor(uint8_t sf) { + // check active modem + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) { + // check range for LoRa + RADIOLIB_CHECK_RANGE(sf, 5, 12, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + } else if(modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING) { + // check range for ranging + RADIOLIB_CHECK_RANGE(sf, 5, 10, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + } else { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // update modulation parameters + this->spreadingFactor = sf << 4; + int16_t state = setModulationParams(this->spreadingFactor, this->bandwidth, this->codingRateLoRa); + RADIOLIB_ASSERT(state); + + // update mystery register in LoRa mode - SX1280 datasheet v3.0 section 13.4.1 + if(modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) { + uint8_t data = 0; + if((this->spreadingFactor == RADIOLIB_SX128X_LORA_SF_5) || (this->spreadingFactor == RADIOLIB_SX128X_LORA_SF_6)) { + data = 0x1E; + } else if((this->spreadingFactor == RADIOLIB_SX128X_LORA_SF_7) || (this->spreadingFactor == RADIOLIB_SX128X_LORA_SF_8)) { + data = 0x37; + } else { + data = 0x32; + } + state = SX128x::writeRegister(RADIOLIB_SX128X_REG_LORA_SF_CONFIG, &data, 1); + } + + return(state); +} + +int16_t SX128x::setCodingRate(uint8_t cr, bool longInterleaving) { + // check active modem + uint8_t modem = getPacketType(); + + // LoRa/ranging + if((modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) || (modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING)) { + RADIOLIB_CHECK_RANGE(cr, 5, 8, RADIOLIB_ERR_INVALID_CODING_RATE); + + // update modulation parameters + if(longInterleaving && (modem == RADIOLIB_SX128X_PACKET_TYPE_LORA)) { + this->codingRateLoRa = cr; + } else { + this->codingRateLoRa = cr - 4; + } + return(setModulationParams(this->spreadingFactor, this->bandwidth, this->codingRateLoRa)); + + // FLRC + } else if(modem == RADIOLIB_SX128X_PACKET_TYPE_FLRC) { + RADIOLIB_CHECK_RANGE(cr, 2, 4, RADIOLIB_ERR_INVALID_CODING_RATE); + + // update modulation parameters + this->codingRateFLRC = (cr - 2) * 2; + return(setModulationParams(this->bitRate, this->codingRateFLRC, this->shaping)); + } + + return(RADIOLIB_ERR_WRONG_MODEM); +} + +int16_t SX128x::setOutputPower(int8_t pwr) { + RADIOLIB_CHECK_RANGE(pwr, -18, 13, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + this->power = pwr + 18; + return(setTxParams(this->power)); +} + +int16_t SX128x::setPreambleLength(uint32_t preambleLength) { + uint8_t modem = getPacketType(); + if((modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) || (modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING)) { + // LoRa or ranging + RADIOLIB_CHECK_RANGE(preambleLength, 2, 491520, RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH); + + // check preamble length is even - no point even trying odd numbers + if(preambleLength % 2 != 0) { + return(RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH); + } + + // calculate exponent and mantissa values (use the next longer preamble if there's no exact match) + uint8_t e = 1; + uint8_t m = 1; + uint32_t len = 0; + for(; e <= 15; e++) { + for(; m <= 15; m++) { + len = m * (uint32_t(1) << e); + if(len >= preambleLength) { + break; + } + } + if(len >= preambleLength) { + break; + } + } + + // update packet parameters + this->preambleLengthLoRa = (e << 4) | m; + return(setPacketParamsLoRa(this->preambleLengthLoRa, this->headerType, this->payloadLen, this->crcLoRa, this->invertIQEnabled)); + + } else if((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_FLRC)) { + // GFSK or FLRC + RADIOLIB_CHECK_RANGE(preambleLength, 4, 32, RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH); + + // check preamble length is multiple of 4 + if(preambleLength % 4 != 0) { + return(RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH); + } + + // update packet parameters + this->preambleLengthGFSK = ((preambleLength / 4) - 1) << 4; + return(setPacketParamsGFSK(this->preambleLengthGFSK, this->syncWordLen, this->syncWordMatch, this->crcGFSK, this->whitening)); + } + + return(RADIOLIB_ERR_WRONG_MODEM); +} + +int16_t SX128x::setBitRate(float br) { + // check active modem + uint8_t modem = getPacketType(); + + // GFSK/BLE + if((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_BLE)) { + if((uint16_t)br == 125) { + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_0_125_BW_0_3; + } else if((uint16_t)br == 250) { + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_0_250_BW_0_6; + } else if((uint16_t)br == 400) { + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_0_400_BW_1_2; + } else if((uint16_t)br == 500) { + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_0_500_BW_1_2; + } else if((uint16_t)br == 800) { + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_0_800_BW_2_4; + } else if((uint16_t)br == 1000) { + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_1_000_BW_2_4; + } else if((uint16_t)br == 1600) { + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_1_600_BW_2_4; + } else if((uint16_t)br == 2000) { + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_2_000_BW_2_4; + } else { + return(RADIOLIB_ERR_INVALID_BIT_RATE); + } + + // update modulation parameters + this->bitRateKbps = (uint16_t)br; + return(setModulationParams(this->bitRate, this->modIndex, this->shaping)); + + // FLRC + } else if(modem == RADIOLIB_SX128X_PACKET_TYPE_FLRC) { + if((uint16_t)br == 260) { + this->bitRate = RADIOLIB_SX128X_FLRC_BR_0_260_BW_0_3; + } else if((uint16_t)br == 325) { + this->bitRate = RADIOLIB_SX128X_FLRC_BR_0_325_BW_0_3; + } else if((uint16_t)br == 520) { + this->bitRate = RADIOLIB_SX128X_FLRC_BR_0_520_BW_0_6; + } else if((uint16_t)br == 650) { + this->bitRate = RADIOLIB_SX128X_FLRC_BR_0_650_BW_0_6; + } else if((uint16_t)br == 1000) { + this->bitRate = RADIOLIB_SX128X_FLRC_BR_1_000_BW_1_2; + } else if((uint16_t)br == 1300) { + this->bitRate = RADIOLIB_SX128X_FLRC_BR_1_300_BW_1_2; + } else { + return(RADIOLIB_ERR_INVALID_BIT_RATE); + } + + // update modulation parameters + this->bitRateKbps = (uint16_t)br; + return(setModulationParams(this->bitRate, this->codingRateFLRC, this->shaping)); + + } + + return(RADIOLIB_ERR_WRONG_MODEM); +} + +int16_t SX128x::setFrequencyDeviation(float freqDev) { + // check active modem + uint8_t modem = getPacketType(); + if(!((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_BLE))) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set frequency deviation to lowest available setting (required for digimodes) + float newFreqDev = freqDev; + if(freqDev < 0.0) { + newFreqDev = 62.5; + } + + RADIOLIB_CHECK_RANGE(newFreqDev, 62.5, 1000.0, RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + + // override for the lowest possible frequency deviation - required for some PhysicalLayer protocols + if(newFreqDev == 0.0) { + this->modIndex = RADIOLIB_SX128X_BLE_GFSK_MOD_IND_0_35; + this->bitRate = RADIOLIB_SX128X_BLE_GFSK_BR_0_125_BW_0_3; + return(setModulationParams(this->bitRate, this->modIndex, this->shaping)); + } + + // update modulation parameters + uint8_t modIndex = (uint8_t)((8.0 * (newFreqDev / (float)this->bitRateKbps)) - 1.0); + if(modIndex > RADIOLIB_SX128X_BLE_GFSK_MOD_IND_4_00) { + return(RADIOLIB_ERR_INVALID_MODULATION_PARAMETERS); + } + + // update modulation parameters + this->modIndex = modIndex; + return(setModulationParams(this->bitRate, this->modIndex, this->shaping)); +} + +int16_t SX128x::setDataShaping(uint8_t sh) { + // check active modem + uint8_t modem = getPacketType(); + if(!((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_BLE) || (modem == RADIOLIB_SX128X_PACKET_TYPE_FLRC))) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set data this->shaping + switch(sh) { + case RADIOLIB_SHAPING_NONE: + this->shaping = RADIOLIB_SX128X_BLE_GFSK_BT_OFF; + break; + case RADIOLIB_SHAPING_0_5: + this->shaping = RADIOLIB_SX128X_BLE_GFSK_BT_0_5; + break; + case RADIOLIB_SHAPING_1_0: + this->shaping = RADIOLIB_SX128X_BLE_GFSK_BT_1_0; + break; + default: + return(RADIOLIB_ERR_INVALID_DATA_SHAPING); + } + + // update modulation parameters + if((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_BLE)) { + return(setModulationParams(this->bitRate, this->modIndex, this->shaping)); + } else { + return(setModulationParams(this->bitRate, this->codingRateFLRC, this->shaping)); + } +} + +int16_t SX128x::setSyncWord(uint8_t* syncWord, uint8_t len) { + // check active modem + uint8_t modem = getPacketType(); + if(!((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_FLRC))) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + if(modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) { + // GFSK can use up to 5 bytes as sync word + if(len > 5) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + + // calculate sync word length parameter value + if(len > 0) { + this->syncWordLen = (len - 1)*2; + } + + } else { + // FLRC requires 32-bit sync word + if(!((len == 0) || (len == 4))) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + + // save sync word length parameter value + this->syncWordLen = len; + } + + // reverse sync word byte order + uint8_t syncWordBuff[] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; + for(uint8_t i = 0; i < len; i++) { + syncWordBuff[4 - i] = syncWord[i]; + } + + // update sync word + int16_t state = SX128x::writeRegister(RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_4, syncWordBuff, 5); + RADIOLIB_ASSERT(state); + + // update packet parameters + if(this->syncWordLen == 0) { + this->syncWordMatch = RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_OFF; + } else { + /// \todo add support for multiple sync words + this->syncWordMatch = RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_1; + } + return(setPacketParamsGFSK(this->preambleLengthGFSK, this->syncWordLen, this->syncWordMatch, this->crcGFSK, this->whitening)); +} + +int16_t SX128x::setSyncWord(uint8_t syncWord, uint8_t controlBits) { + // check active modem + if(getPacketType() != RADIOLIB_SX128X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // update register + uint8_t data[2] = {(uint8_t)((syncWord & 0xF0) | ((controlBits & 0xF0) >> 4)), (uint8_t)(((syncWord & 0x0F) << 4) | (controlBits & 0x0F))}; + return(writeRegister(RADIOLIB_SX128X_REG_LORA_SYNC_WORD_MSB, data, 2)); +} + +int16_t SX128x::setCRC(uint8_t len, uint32_t initial, uint16_t polynomial) { + // check active modem + uint8_t modem = getPacketType(); + + int16_t state; + if((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_FLRC)) { + // update packet parameters + if(modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) { + if(len > 2) { + return(RADIOLIB_ERR_INVALID_CRC_CONFIGURATION); + } + } else { + if(len > 3) { + return(RADIOLIB_ERR_INVALID_CRC_CONFIGURATION); + } + } + this->crcGFSK = len << 4; + state = setPacketParamsGFSK(this->preambleLengthGFSK, this->syncWordLen, this->syncWordMatch, this->crcGFSK, this->whitening); + RADIOLIB_ASSERT(state); + + // set initial CRC value + uint8_t data[] = { (uint8_t)((initial >> 8) & 0xFF), (uint8_t)(initial & 0xFF) }; + state = writeRegister(RADIOLIB_SX128X_REG_CRC_INITIAL_MSB, data, 2); + RADIOLIB_ASSERT(state); + + // set CRC polynomial + data[0] = (uint8_t)((polynomial >> 8) & 0xFF); + data[1] = (uint8_t)(polynomial & 0xFF); + state = writeRegister(RADIOLIB_SX128X_REG_CRC_POLYNOMIAL_MSB, data, 2); + return(state); + + } else if(modem == RADIOLIB_SX128X_PACKET_TYPE_BLE) { + // update packet parameters + if(len == 0) { + this->crcBLE = RADIOLIB_SX128X_BLE_CRC_OFF; + } else if(len == 3) { + this->crcBLE = RADIOLIB_SX128X_BLE_CRC_3_BYTE; + } else { + return(RADIOLIB_ERR_INVALID_CRC_CONFIGURATION); + } + state = setPacketParamsBLE(this->connectionState, this->crcBLE, this->bleTestPayload, this->whitening); + RADIOLIB_ASSERT(state); + + // set initial CRC value + uint8_t data[] = { (uint8_t)((initial >> 16) & 0xFF), (uint8_t)((initial >> 8) & 0xFF), (uint8_t)(initial & 0xFF) }; + state = writeRegister(RADIOLIB_SX128X_REG_BLE_CRC_INITIAL_MSB, data, 3); + return(state); + + } else if((modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) || (modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING)) { + // update packet parameters + if(len == 0) { + this->crcLoRa = RADIOLIB_SX128X_LORA_CRC_OFF; + } else if(len == 2) { + this->crcLoRa = RADIOLIB_SX128X_LORA_CRC_ON; + } else { + return(RADIOLIB_ERR_INVALID_CRC_CONFIGURATION); + } + state = setPacketParamsLoRa(this->preambleLengthLoRa, this->headerType, this->payloadLen, this->crcLoRa, this->invertIQEnabled); + return(state); + } + + return(RADIOLIB_ERR_UNKNOWN); +} + +int16_t SX128x::setWhitening(bool enabled) { + // check active modem + uint8_t modem = getPacketType(); + if(!((modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) || (modem == RADIOLIB_SX128X_PACKET_TYPE_BLE))) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // update packet parameters + if(enabled) { + this->whitening = RADIOLIB_SX128X_GFSK_BLE_WHITENING_ON; + } else { + this->whitening = RADIOLIB_SX128X_GFSK_BLE_WHITENING_OFF; + } + + if(modem == RADIOLIB_SX128X_PACKET_TYPE_GFSK) { + return(setPacketParamsGFSK(this->preambleLengthGFSK, this->syncWordLen, this->syncWordMatch, this->crcGFSK, this->whitening)); + } + return(setPacketParamsBLE(this->connectionState, this->crcBLE, this->bleTestPayload, this->whitening)); +} + +int16_t SX128x::setAccessAddress(uint32_t addr) { + // check active modem + if(getPacketType() != RADIOLIB_SX128X_PACKET_TYPE_BLE) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // set the address + uint8_t addrBuff[] = { (uint8_t)((addr >> 24) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)(addr & 0xFF) }; + return(SX128x::writeRegister(RADIOLIB_SX128X_REG_ACCESS_ADDRESS_BYTE_3, addrBuff, 4)); +} + +int16_t SX128x::setHighSensitivityMode(bool enable) { + // read the current registers + uint8_t RxGain = 0; + int16_t state = readRegister(RADIOLIB_SX128X_REG_GAIN_MODE, &RxGain, 1); + RADIOLIB_ASSERT(state); + + if(enable) { + RxGain |= 0xC0; // Set bits 6 and 7 + } else { + RxGain &= ~0xC0; // Unset bits 6 and 7 + } + + // update all values + state = writeRegister(RADIOLIB_SX128X_REG_GAIN_MODE, &RxGain, 1); + return(state); +} + +int16_t SX128x::setGainControl(uint8_t gain) { + // read the current registers + uint8_t ManualGainSetting = 0; + int16_t state = readRegister(RADIOLIB_SX128X_REG_MANUAL_GAIN_CONTROL_ENABLE_2, &ManualGainSetting, 1); + RADIOLIB_ASSERT(state); + uint8_t LNAGainValue = 0; + state = readRegister(RADIOLIB_SX128X_REG_MANUAL_GAIN_SETTING, &LNAGainValue, 1); + RADIOLIB_ASSERT(state); + uint8_t LNAGainControl = 0; + state = readRegister(RADIOLIB_SX128X_REG_MANUAL_GAIN_CONTROL_ENABLE_1, &LNAGainControl, 1); + RADIOLIB_ASSERT(state); + + // set the gain + if (gain > 0 && gain < 14) { + // Set manual gain + ManualGainSetting &= ~0x01; // Set bit 0 to 0 (Enable Manual Gain Control) + LNAGainValue &= 0xF0; // Bits 0, 1, 2 and 3 to 0 + LNAGainValue |= gain; // Set bits 0, 1, 2 and 3 to Manual Gain Setting (1-13) + LNAGainControl |= 0x80; // Set bit 7 to 1 (Enable Manual Gain Control) + } else { + // Set automatic gain if 0 or out of range + ManualGainSetting |= 0x01; // Set bit 0 to 1 (Enable Automatic Gain Control) + LNAGainValue &= 0xF0; // Bits 0, 1, 2 and 3 to 0 + LNAGainValue |= 0x0A; // Set bits 0, 1, 2 and 3 to Manual Gain Setting (1-13) + LNAGainControl &= ~0x80; // Set bit 7 to 0 (Enable Automatic Gain Control) + } + + // update all values + state = writeRegister(RADIOLIB_SX128X_REG_MANUAL_GAIN_CONTROL_ENABLE_2, &ManualGainSetting, 1); + RADIOLIB_ASSERT(state); + state = writeRegister(RADIOLIB_SX128X_REG_MANUAL_GAIN_SETTING, &LNAGainValue, 1); + RADIOLIB_ASSERT(state); + state = writeRegister(RADIOLIB_SX128X_REG_MANUAL_GAIN_CONTROL_ENABLE_1, &LNAGainControl, 1); + return(state); +} + +float SX128x::getRSSI() { + // get packet status + uint8_t packetStatus[5]; + this->mod->SPIreadStream(RADIOLIB_SX128X_CMD_GET_PACKET_STATUS, packetStatus, 5); + + // check active modem + uint8_t modem = getPacketType(); + if((modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) || (modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING)) { + // LoRa or ranging + uint8_t rssiSync = packetStatus[0]; + float rssiMeasured = -1.0 * rssiSync/2.0; + float snr = getSNR(); + if(snr <= 0.0) { + return(rssiMeasured - snr); + } else { + return(rssiMeasured); + } + } else { + // GFSK, BLE or FLRC + uint8_t rssiSync = packetStatus[1]; + return(-1.0 * rssiSync/2.0); + } +} + +float SX128x::getSNR() { + // check active modem + uint8_t modem = getPacketType(); + if(!((modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) || (modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING))) { + return(0.0); + } + + // get packet status + uint8_t packetStatus[5]; + this->mod->SPIreadStream(RADIOLIB_SX128X_CMD_GET_PACKET_STATUS, packetStatus, 5); + + // calculate real SNR + uint8_t snr = packetStatus[1]; + if(snr < 128) { + return(snr/4.0); + } else { + return((snr - 256)/4.0); + } +} + +float SX128x::getFrequencyError() { + // check active modem + uint8_t modem = getPacketType(); + if(!((modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) || (modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING))) { + return(0.0); + } + + // read the raw frequency error register values + uint8_t efeRaw[3] = {0}; + int16_t state = readRegister(RADIOLIB_SX128X_REG_FEI_MSB, &efeRaw[0], 1); + RADIOLIB_ASSERT(state); + state = readRegister(RADIOLIB_SX128X_REG_FEI_MID, &efeRaw[1], 1); + RADIOLIB_ASSERT(state); + state = readRegister(RADIOLIB_SX128X_REG_FEI_LSB, &efeRaw[2], 1); + RADIOLIB_ASSERT(state); + uint32_t efe = ((uint32_t) efeRaw[0] << 16) | ((uint32_t) efeRaw[1] << 8) | efeRaw[2]; + efe &= 0x0FFFFF; + + float error = 0; + + // check the first bit + if (efe & 0x80000) { + // frequency error is negative + efe |= (uint32_t) 0xFFF00000; + efe = ~efe + 1; + error = 1.55 * (float) efe / (1600.0 / (float) this->bandwidthKhz) * -1.0; + } else { + error = 1.55 * (float) efe / (1600.0 / (float) this->bandwidthKhz); + } + + return(error); +} + +size_t SX128x::getPacketLength(bool update) { + (void)update; + + // in implicit mode, return the cached value + if((getPacketType() == RADIOLIB_SX128X_PACKET_TYPE_LORA) && (this->headerType == RADIOLIB_SX128X_LORA_HEADER_IMPLICIT)) { + return(this->payloadLen); + } + + uint8_t rxBufStatus[2] = {0, 0}; + this->mod->SPIreadStream(RADIOLIB_SX128X_CMD_GET_RX_BUFFER_STATUS, rxBufStatus, 2); + return((size_t)rxBufStatus[0]); +} + +uint32_t SX128x::getTimeOnAir(size_t len) { + // check active modem + uint8_t modem = getPacketType(); + if(modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) { + // calculate number of symbols + float N_symbol = 0; + uint8_t sf = this->spreadingFactor >> 4; + if(this->codingRateLoRa <= RADIOLIB_SX128X_LORA_CR_4_8) { + // legacy coding rate - nice and simple + + // get SF coefficients + float coeff1 = 0; + int16_t coeff2 = 0; + int16_t coeff3 = 0; + if(sf < 7) { + // SF5, SF6 + coeff1 = 6.25; + coeff2 = 4*sf; + coeff3 = 4*sf; + } else if(sf < 11) { + // SF7. SF8, SF9, SF10 + coeff1 = 4.25; + coeff2 = 4*sf + 8; + coeff3 = 4*sf; + } else { + // SF11, SF12 + coeff1 = 4.25; + coeff2 = 4*sf + 8; + coeff3 = 4*(sf - 2); + } + + // get CRC length + int16_t N_bitCRC = 16; + if(this->crcLoRa == RADIOLIB_SX128X_LORA_CRC_OFF) { + N_bitCRC = 0; + } + + // get header length + int16_t N_symbolHeader = 20; + if(this->headerType == RADIOLIB_SX128X_LORA_HEADER_IMPLICIT) { + N_symbolHeader = 0; + } + + // calculate number of LoRa preamble symbols + uint32_t N_symbolPreamble = (this->preambleLengthLoRa & 0x0F) * (uint32_t(1) << ((this->preambleLengthLoRa & 0xF0) >> 4)); + + // calculate the number of symbols + N_symbol = (float)N_symbolPreamble + coeff1 + 8.0 + ceil(RADIOLIB_MAX((int16_t)(8 * len + N_bitCRC - coeff2 + N_symbolHeader), (int16_t)0) / (float)coeff3) * (float)(this->codingRateLoRa + 4); + + } else { + // long interleaving - abandon hope all ye who enter here + /// \todo implement this mess - SX1280 datasheet v3.0 section 7.4.4.2 + + } + + // get time-on-air in us + return(((uint32_t(1) << sf) / this->bandwidthKhz) * N_symbol * 1000.0); + + } else { + return(((uint32_t)len * 8 * 1000) / this->bitRateKbps); + } + +} + +int16_t SX128x::implicitHeader(size_t len) { + return(setHeaderType(RADIOLIB_SX128X_LORA_HEADER_IMPLICIT, len)); +} + +int16_t SX128x::explicitHeader() { + return(setHeaderType(RADIOLIB_SX128X_LORA_HEADER_EXPLICIT)); +} + +int16_t SX128x::setEncoding(uint8_t encoding) { + return(setWhitening(encoding)); +} + +void SX128x::setRfSwitchPins(uint32_t rxEn, uint32_t txEn) { + this->mod->setRfSwitchPins(rxEn, txEn); +} + +void SX128x::setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]) { + this->mod->setRfSwitchTable(pins, table); +} + +uint8_t SX128x::randomByte() { + // it's unclear whether SX128x can measure RSSI while not receiving a packet + // this method is implemented only for PhysicalLayer compatibility + return(0); +} + +int16_t SX128x::invertIQ(bool enable) { + if(getPacketType() != RADIOLIB_SX128X_PACKET_TYPE_LORA) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + if(enable) { + this->invertIQEnabled = RADIOLIB_SX128X_LORA_IQ_INVERTED; + } else { + this->invertIQEnabled = RADIOLIB_SX128X_LORA_IQ_STANDARD; + } + + return(setPacketParamsLoRa(this->preambleLengthLoRa, this->headerType, this->payloadLen, this->crcLoRa, this->invertIQEnabled)); +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +void SX128x::setDirectAction(void (*func)(void)) { + // SX128x is unable to perform direct mode reception + // this method is implemented only for PhysicalLayer compatibility + (void)func; +} + +void SX128x::readBit(uint32_t pin) { + // SX128x is unable to perform direct mode reception + // this method is implemented only for PhysicalLayer compatibility + (void)pin; +} +#endif + +uint8_t SX128x::getStatus() { + uint8_t data = 0; + this->mod->SPIreadStream(RADIOLIB_SX128X_CMD_GET_STATUS, &data, 0); + return(data); +} + +int16_t SX128x::writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { + this->mod->SPIwriteRegisterBurst(addr, data, numBytes); + return(RADIOLIB_ERR_NONE); +} + +int16_t SX128x::readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { + // send the command + this->mod->SPIreadRegisterBurst(addr, numBytes, data); + + // check the status + int16_t state = this->mod->SPIcheckStream(); + return(state); +} + +int16_t SX128x::writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) { + uint8_t cmd[] = { RADIOLIB_SX128X_CMD_WRITE_BUFFER, offset }; + return(this->mod->SPIwriteStream(cmd, 2, data, numBytes)); +} + +int16_t SX128x::readBuffer(uint8_t* data, uint8_t numBytes) { + uint8_t cmd[] = { RADIOLIB_SX128X_CMD_READ_BUFFER, RADIOLIB_SX128X_CMD_NOP }; + return(this->mod->SPIreadStream(cmd, 2, data, numBytes)); +} + +int16_t SX128x::setTx(uint16_t periodBaseCount, uint8_t periodBase) { + uint8_t data[] = { periodBase, (uint8_t)((periodBaseCount >> 8) & 0xFF), (uint8_t)(periodBaseCount & 0xFF) }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_TX, data, 3)); +} + +int16_t SX128x::setRx(uint16_t periodBaseCount, uint8_t periodBase) { + uint8_t data[] = { periodBase, (uint8_t)((periodBaseCount >> 8) & 0xFF), (uint8_t)(periodBaseCount & 0xFF) }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_RX, data, 3)); +} + +int16_t SX128x::setCad() { + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_CAD, NULL, 0)); +} + +uint8_t SX128x::getPacketType() { + uint8_t data = 0xFF; + this->mod->SPIreadStream(RADIOLIB_SX128X_CMD_GET_PACKET_TYPE, &data, 1); + return(data); +} + +int16_t SX128x::setRfFrequency(uint32_t frf) { + uint8_t data[] = { (uint8_t)((frf >> 16) & 0xFF), (uint8_t)((frf >> 8) & 0xFF), (uint8_t)(frf & 0xFF) }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_RF_FREQUENCY, data, 3)); +} + +int16_t SX128x::setTxParams(uint8_t pwr, uint8_t rampTime) { + uint8_t data[] = { pwr, rampTime }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_TX_PARAMS, data, 2)); +} + +int16_t SX128x::setBufferBaseAddress(uint8_t txBaseAddress, uint8_t rxBaseAddress) { + uint8_t data[] = { txBaseAddress, rxBaseAddress }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_BUFFER_BASE_ADDRESS, data, 2)); +} + +int16_t SX128x::setModulationParams(uint8_t modParam1, uint8_t modParam2, uint8_t modParam3) { + uint8_t data[] = { modParam1, modParam2, modParam3 }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_MODULATION_PARAMS, data, 3)); +} + +int16_t SX128x::setPacketParamsGFSK(uint8_t preambleLen, uint8_t syncLen, uint8_t syncMatch, uint8_t crcLen, uint8_t whiten, uint8_t payLen, uint8_t hdrType) { + uint8_t data[] = { preambleLen, syncLen, syncMatch, hdrType, payLen, crcLen, whiten }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_PACKET_PARAMS, data, 7)); +} + +int16_t SX128x::setPacketParamsBLE(uint8_t connState, uint8_t crcLen, uint8_t bleTest, uint8_t whiten) { + uint8_t data[] = { connState, crcLen, bleTest, whiten, 0x00, 0x00, 0x00 }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_PACKET_PARAMS, data, 7)); +} + +int16_t SX128x::setPacketParamsLoRa(uint8_t preambleLen, uint8_t hdrType, uint8_t payLen, uint8_t crc, uint8_t invIQ) { + uint8_t data[] = { preambleLen, hdrType, payLen, crc, invIQ, 0x00, 0x00 }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_PACKET_PARAMS, data, 7)); +} + +int16_t SX128x::setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask) { + uint8_t data[] = { (uint8_t)((irqMask >> 8) & 0xFF), (uint8_t)(irqMask & 0xFF), + (uint8_t)((dio1Mask >> 8) & 0xFF), (uint8_t)(dio1Mask & 0xFF), + (uint8_t)((dio2Mask >> 8) & 0xFF), (uint8_t)(dio2Mask & 0xFF), + (uint8_t)((dio3Mask >> 8) & 0xFF), (uint8_t)(dio3Mask & 0xFF) }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_DIO_IRQ_PARAMS, data, 8)); +} + +uint16_t SX128x::getIrqStatus() { + uint8_t data[] = { 0x00, 0x00 }; + this->mod->SPIreadStream(RADIOLIB_SX128X_CMD_GET_IRQ_STATUS, data, 2); + return(((uint16_t)(data[0]) << 8) | data[1]); +} + +int16_t SX128x::clearIrqStatus(uint16_t clearIrqParams) { + uint8_t data[] = { (uint8_t)((clearIrqParams >> 8) & 0xFF), (uint8_t)(clearIrqParams & 0xFF) }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_CLEAR_IRQ_STATUS, data, 2)); +} + +int16_t SX128x::setRangingRole(uint8_t role) { + uint8_t data[] = { role }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_RANGING_ROLE, data, 1)); +} + +int16_t SX128x::setPacketType(uint8_t type) { + uint8_t data[] = { type }; + return(this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_PACKET_TYPE, data, 1)); +} + +int16_t SX128x::setHeaderType(uint8_t hdrType, size_t len) { + // check active modem + uint8_t modem = getPacketType(); + if(!((modem == RADIOLIB_SX128X_PACKET_TYPE_LORA) || (modem == RADIOLIB_SX128X_PACKET_TYPE_RANGING))) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // update packet parameters + this->headerType = hdrType; + this->payloadLen = len; + return(setPacketParamsLoRa(this->preambleLengthLoRa, this->headerType, this->payloadLen, this->crcLoRa, this->invertIQEnabled)); +} + +int16_t SX128x::config(uint8_t modem) { + // reset buffer base address + int16_t state = setBufferBaseAddress(); + RADIOLIB_ASSERT(state); + + // set modem + uint8_t data[1]; + data[0] = modem; + state = this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_PACKET_TYPE, data, 1); + RADIOLIB_ASSERT(state); + + // set CAD parameters + data[0] = RADIOLIB_SX128X_CAD_ON_8_SYMB; + state = this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_CAD_PARAMS, data, 1); + RADIOLIB_ASSERT(state); + + // set regulator mode to DC-DC + data[0] = RADIOLIB_SX128X_REGULATOR_DC_DC; + state = this->mod->SPIwriteStream(RADIOLIB_SX128X_CMD_SET_REGULATOR_MODE, data, 1); + RADIOLIB_ASSERT(state); + + return(RADIOLIB_ERR_NONE); +} + +int16_t SX128x::SPIparseStatus(uint8_t in) { + if((in & 0b00011100) == RADIOLIB_SX128X_STATUS_CMD_TIMEOUT) { + return(RADIOLIB_ERR_SPI_CMD_TIMEOUT); + } else if((in & 0b00011100) == RADIOLIB_SX128X_STATUS_CMD_ERROR) { + return(RADIOLIB_ERR_SPI_CMD_INVALID); + } else if((in & 0b00011100) == RADIOLIB_SX128X_STATUS_CMD_FAILED) { + return(RADIOLIB_ERR_SPI_CMD_FAILED); + } else if((in == 0x00) || (in == 0xFF)) { + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + return(RADIOLIB_ERR_NONE); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX128x.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX128x.h new file mode 100644 index 00000000..1aa69115 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/SX128x/SX128x.h @@ -0,0 +1,853 @@ +#if !defined(_RADIOLIB_SX128X_H) +#define _RADIOLIB_SX128X_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SX128X) + +#include "../../Module.h" + +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" + +// SX128X physical layer properties +#define RADIOLIB_SX128X_FREQUENCY_STEP_SIZE 198.3642578 +#define RADIOLIB_SX128X_MAX_PACKET_LENGTH 255 +#define RADIOLIB_SX128X_CRYSTAL_FREQ 52.0 +#define RADIOLIB_SX128X_DIV_EXPONENT 18 + +// SX128X SPI commands +#define RADIOLIB_SX128X_CMD_NOP 0x00 +#define RADIOLIB_SX128X_CMD_GET_STATUS 0xC0 +#define RADIOLIB_SX128X_CMD_WRITE_REGISTER 0x18 +#define RADIOLIB_SX128X_CMD_READ_REGISTER 0x19 +#define RADIOLIB_SX128X_CMD_WRITE_BUFFER 0x1A +#define RADIOLIB_SX128X_CMD_READ_BUFFER 0x1B +#define RADIOLIB_SX128X_CMD_SET_SLEEP 0x84 +#define RADIOLIB_SX128X_CMD_SET_STANDBY 0x80 +#define RADIOLIB_SX128X_CMD_SET_FS 0xC1 +#define RADIOLIB_SX128X_CMD_SET_TX 0x83 +#define RADIOLIB_SX128X_CMD_SET_RX 0x82 +#define RADIOLIB_SX128X_CMD_SET_RX_DUTY_CYCLE 0x94 +#define RADIOLIB_SX128X_CMD_SET_CAD 0xC5 +#define RADIOLIB_SX128X_CMD_SET_TX_CONTINUOUS_WAVE 0xD1 +#define RADIOLIB_SX128X_CMD_SET_TX_CONTINUOUS_PREAMBLE 0xD2 +#define RADIOLIB_SX128X_CMD_SET_PACKET_TYPE 0x8A +#define RADIOLIB_SX128X_CMD_GET_PACKET_TYPE 0x03 +#define RADIOLIB_SX128X_CMD_SET_RF_FREQUENCY 0x86 +#define RADIOLIB_SX128X_CMD_SET_TX_PARAMS 0x8E +#define RADIOLIB_SX128X_CMD_SET_CAD_PARAMS 0x88 +#define RADIOLIB_SX128X_CMD_SET_BUFFER_BASE_ADDRESS 0x8F +#define RADIOLIB_SX128X_CMD_SET_MODULATION_PARAMS 0x8B +#define RADIOLIB_SX128X_CMD_SET_PACKET_PARAMS 0x8C +#define RADIOLIB_SX128X_CMD_GET_RX_BUFFER_STATUS 0x17 +#define RADIOLIB_SX128X_CMD_GET_PACKET_STATUS 0x1D +#define RADIOLIB_SX128X_CMD_GET_RSSI_INST 0x1F +#define RADIOLIB_SX128X_CMD_SET_DIO_IRQ_PARAMS 0x8D +#define RADIOLIB_SX128X_CMD_GET_IRQ_STATUS 0x15 +#define RADIOLIB_SX128X_CMD_CLEAR_IRQ_STATUS 0x97 +#define RADIOLIB_SX128X_CMD_SET_REGULATOR_MODE 0x96 +#define RADIOLIB_SX128X_CMD_SET_SAVE_CONTEXT 0xD5 +#define RADIOLIB_SX128X_CMD_SET_AUTO_TX 0x98 +#define RADIOLIB_SX128X_CMD_SET_AUTO_FS 0x9E +#define RADIOLIB_SX128X_CMD_SET_PERF_COUNTER_MODE 0x9C +#define RADIOLIB_SX128X_CMD_SET_LONG_PREAMBLE 0x9B +#define RADIOLIB_SX128X_CMD_SET_UART_SPEED 0x9D +#define RADIOLIB_SX128X_CMD_SET_RANGING_ROLE 0xA3 +#define RADIOLIB_SX128X_CMD_SET_ADVANCED_RANGING 0x9A + +// SX128X register map +#define RADIOLIB_SX128X_REG_GAIN_MODE 0x0891 +#define RADIOLIB_SX128X_REG_MANUAL_GAIN_CONTROL_ENABLE_2 0x0895 +#define RADIOLIB_SX128X_REG_MANUAL_GAIN_SETTING 0x089E +#define RADIOLIB_SX128X_REG_MANUAL_GAIN_CONTROL_ENABLE_1 0x089F +#define RADIOLIB_SX128X_REG_SYNCH_PEAK_ATTENUATION 0x08C2 +#define RADIOLIB_SX128X_REG_LORA_FIXED_PAYLOAD_LENGTH 0x0901 +#define RADIOLIB_SX128X_REG_LORA_HEADER_MODE 0x0903 +#define RADIOLIB_SX128X_REG_MASTER_RANGING_ADDRESS_BYTE_3 0x0912 +#define RADIOLIB_SX128X_REG_MASTER_RANGING_ADDRESS_BYTE_2 0x0913 +#define RADIOLIB_SX128X_REG_MASTER_RANGING_ADDRESS_BYTE_1 0x0914 +#define RADIOLIB_SX128X_REG_MASTER_RANGING_ADDRESS_BYTE_0 0x0915 +#define RADIOLIB_SX128X_REG_SLAVE_RANGING_ADDRESS_BYTE_3 0x0916 +#define RADIOLIB_SX128X_REG_SLAVE_RANGING_ADDRESS_BYTE_2 0x0917 +#define RADIOLIB_SX128X_REG_SLAVE_RANGING_ADDRESS_BYTE_1 0x0918 +#define RADIOLIB_SX128X_REG_SLAVE_RANGING_ADDRESS_BYTE_0 0x0919 +#define RADIOLIB_SX128X_REG_RANGING_FILTER_WINDOW_SIZE 0x091E +#define RADIOLIB_SX128X_REG_RANGING_FILTER_RESET 0x0923 +#define RADIOLIB_SX128X_REG_RANGING_TYPE 0x0924 +#define RADIOLIB_SX128X_REG_LORA_SF_CONFIG 0x0925 +#define RADIOLIB_SX128X_REG_RANGING_ADDRESS_SWITCH 0x0927 +#define RADIOLIB_SX128X_REG_RANGING_CALIBRATION_BYTE_2 0x092B +#define RADIOLIB_SX128X_REG_RANGING_CALIBRATION_MSB 0x092C +#define RADIOLIB_SX128X_REG_RANGING_CALIBRATION_LSB 0x092D +#define RADIOLIB_SX128X_REG_SLAVE_RANGING_ADDRESS_WIDTH 0x0931 +#define RADIOLIB_SX128X_REG_FREQ_ERROR_CORRECTION 0x093C +#define RADIOLIB_SX128X_REG_LORA_SYNC_WORD_MSB 0x0944 +#define RADIOLIB_SX128X_REG_LORA_SYNC_WORD_LSB 0x0945 +#define RADIOLIB_SX128X_REG_RANGING_FILTER_RSSI_OFFSET 0x0953 +#define RADIOLIB_SX128X_REG_FEI_MSB 0x0954 +#define RADIOLIB_SX128X_REG_FEI_MID 0x0955 +#define RADIOLIB_SX128X_REG_FEI_LSB 0x0956 +#define RADIOLIB_SX128X_REG_RANGING_ADDRESS_MSB 0x095F +#define RADIOLIB_SX128X_REG_RANGING_ADDRESS_LSB 0x0960 +#define RADIOLIB_SX128X_REG_RANGING_RESULT_MSB 0x0961 +#define RADIOLIB_SX128X_REG_RANGING_RESULT_MID 0x0962 +#define RADIOLIB_SX128X_REG_RANGING_RESULT_LSB 0x0963 +#define RADIOLIB_SX128X_REG_RANGING_RSSI 0x0964 +#define RADIOLIB_SX128X_REG_RANGING_LORA_CLOCK_ENABLE 0x097F +#define RADIOLIB_SX128X_REG_PACKET_PREAMBLE_SETTINGS 0x09C1 +#define RADIOLIB_SX128X_REG_WHITENING_INITIAL_VALUE 0x09C5 +#define RADIOLIB_SX128X_REG_CRC_POLYNOMIAL_MSB 0x09C6 +#define RADIOLIB_SX128X_REG_CRC_POLYNOMIAL_LSB 0x09C7 +#define RADIOLIB_SX128X_REG_CRC_INITIAL_MSB 0x09C8 +#define RADIOLIB_SX128X_REG_CRC_INITIAL_LSB 0x09C9 +#define RADIOLIB_SX128X_REG_BLE_CRC_INITIAL_MSB 0x09C7 +#define RADIOLIB_SX128X_REG_BLE_CRC_INITIAL_MID (RADIOLIB_SX128X_REG_CRC_INITIAL_MSB) +#define RADIOLIB_SX128X_REG_BLE_CRC_INITIAL_LSB (RADIOLIB_SX128X_REG_CRC_INITIAL_LSB) +#define RADIOLIB_SX128X_REG_SYNCH_ADDRESS_CONTROL 0x09CD +#define RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_4 0x09CE +#define RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_3 0x09CF +#define RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_2 0x09D0 +#define RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_1 0x09D1 +#define RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_0 0x09D2 +#define RADIOLIB_SX128X_REG_SYNC_WORD_2_BYTE_4 0x09D3 +#define RADIOLIB_SX128X_REG_SYNC_WORD_2_BYTE_3 0x09D4 +#define RADIOLIB_SX128X_REG_SYNC_WORD_2_BYTE_2 0x09D5 +#define RADIOLIB_SX128X_REG_SYNC_WORD_2_BYTE_1 0x09D6 +#define RADIOLIB_SX128X_REG_SYNC_WORD_2_BYTE_0 0x09D7 +#define RADIOLIB_SX128X_REG_SYNC_WORD_3_BYTE_4 0x09D8 +#define RADIOLIB_SX128X_REG_SYNC_WORD_3_BYTE_3 0x09D9 +#define RADIOLIB_SX128X_REG_SYNC_WORD_3_BYTE_2 0x09DA +#define RADIOLIB_SX128X_REG_SYNC_WORD_3_BYTE_1 0x09DB +#define RADIOLIB_SX128X_REG_SYNC_WORD_3_BYTE_0 0x09DC +#define RADIOLIB_SX128X_REG_ACCESS_ADDRESS_BYTE_3 (RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_3) +#define RADIOLIB_SX128X_REG_ACCESS_ADDRESS_BYTE_2 (RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_2) +#define RADIOLIB_SX128X_REG_ACCESS_ADDRESS_BYTE_1 (RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_1) +#define RADIOLIB_SX128X_REG_ACCESS_ADDRESS_BYTE_0 (RADIOLIB_SX128X_REG_SYNC_WORD_1_BYTE_0) + +// SX128X SPI command variables +//RADIOLIB_SX128X_CMD_GET_STATUS MSB LSB DESCRIPTION +#define RADIOLIB_SX128X_STATUS_MODE_STDBY_RC 0b01000000 // 7 5 current chip mode: STDBY_RC +#define RADIOLIB_SX128X_STATUS_MODE_STDBY_XOSC 0b01100000 // 7 5 STDBY_XOSC +#define RADIOLIB_SX128X_STATUS_MODE_FS 0b10000000 // 7 5 FS +#define RADIOLIB_SX128X_STATUS_MODE_RX 0b10100000 // 7 5 Rx +#define RADIOLIB_SX128X_STATUS_MODE_TX 0b11000000 // 7 5 Tx +#define RADIOLIB_SX128X_STATUS_CMD_PROCESSED 0b00000100 // 4 2 command status: processing OK +#define RADIOLIB_SX128X_STATUS_DATA_AVAILABLE 0b00001000 // 4 2 data available +#define RADIOLIB_SX128X_STATUS_CMD_TIMEOUT 0b00001100 // 4 2 timeout +#define RADIOLIB_SX128X_STATUS_CMD_ERROR 0b00010000 // 4 2 processing error +#define RADIOLIB_SX128X_STATUS_CMD_FAILED 0b00010100 // 4 2 failed to execute +#define RADIOLIB_SX128X_STATUS_TX_DONE 0b00011000 // 4 2 transmission finished +#define RADIOLIB_SX128X_STATUS_BUSY 0b00000001 // 0 0 chip busy +#define RADIOLIB_SX128X_STATUS_SPI_FAILED 0b11111111 // 7 0 SPI transaction failed + +//RADIOLIB_SX128X_CMD_SET_SLEEP +#define RADIOLIB_SX128X_SLEEP_DATA_BUFFER_FLUSH 0b00000000 // 1 1 data buffer behavior in sleep mode: flush +#define RADIOLIB_SX128X_SLEEP_DATA_BUFFER_RETAIN 0b00000010 // 1 1 retain +#define RADIOLIB_SX128X_SLEEP_DATA_RAM_FLUSH 0b00000000 // 0 0 data RAM (configuration) behavior in sleep mode: flush +#define RADIOLIB_SX128X_SLEEP_DATA_RAM_RETAIN 0b00000001 // 0 0 retain + +//RADIOLIB_SX128X_CMD_SET_STANDBY +#define RADIOLIB_SX128X_STANDBY_RC 0x00 // 7 0 standby mode: 13 MHz RC oscillator +#define RADIOLIB_SX128X_STANDBY_XOSC 0x01 // 7 0 52 MHz crystal oscillator + +//RADIOLIB_SX128X_CMD_SET_TX + RADIOLIB_SX128X_CMD_SET_RX + RADIOLIB_SX128X_CMD_SET_RX_DUTY_CYCLE +#define RADIOLIB_SX128X_PERIOD_BASE_15_625_US 0x00 // 7 0 time period step: 15.625 us +#define RADIOLIB_SX128X_PERIOD_BASE_62_5_US 0x01 // 7 0 62.5 us +#define RADIOLIB_SX128X_PERIOD_BASE_1_MS 0x02 // 7 0 1 ms +#define RADIOLIB_SX128X_PERIOD_BASE_4_MS 0x03 // 7 0 4 ms + +//RADIOLIB_SX128X_CMD_SET_TX +#define RADIOLIB_SX128X_TX_TIMEOUT_NONE 0x0000 // 15 0 Tx timeout duration: no timeout (Tx single mode) + +//RADIOLIB_SX128X_CMD_SET_RX +#define RADIOLIB_SX128X_RX_TIMEOUT_NONE 0x0000 // 15 0 Rx timeout duration: no timeout (Rx single mode) +#define RADIOLIB_SX128X_RX_TIMEOUT_INF 0xFFFF // 15 0 infinite (Rx continuous mode) + +//RADIOLIB_SX128X_CMD_SET_PACKET_TYPE +#define RADIOLIB_SX128X_PACKET_TYPE_GFSK 0x00 // 7 0 packet type: (G)FSK +#define RADIOLIB_SX128X_PACKET_TYPE_LORA 0x01 // 7 0 LoRa +#define RADIOLIB_SX128X_PACKET_TYPE_RANGING 0x02 // 7 0 ranging engine +#define RADIOLIB_SX128X_PACKET_TYPE_FLRC 0x03 // 7 0 FLRC +#define RADIOLIB_SX128X_PACKET_TYPE_BLE 0x04 // 7 0 BLE + +//RADIOLIB_SX128X_CMD_SET_TX_PARAMS +#define RADIOLIB_SX128X_PA_RAMP_02_US 0x00 // 7 0 PA ramp time: 2 us +#define RADIOLIB_SX128X_PA_RAMP_04_US 0x20 // 7 0 4 us +#define RADIOLIB_SX128X_PA_RAMP_06_US 0x40 // 7 0 6 us +#define RADIOLIB_SX128X_PA_RAMP_08_US 0x60 // 7 0 8 us +#define RADIOLIB_SX128X_PA_RAMP_10_US 0x80 // 7 0 10 us +#define RADIOLIB_SX128X_PA_RAMP_12_US 0xA0 // 7 0 12 us +#define RADIOLIB_SX128X_PA_RAMP_16_US 0xC0 // 7 0 16 us +#define RADIOLIB_SX128X_PA_RAMP_20_US 0xE0 // 7 0 20 us + +//RADIOLIB_SX128X_CMD_SET_CAD_PARAMS +#define RADIOLIB_SX128X_CAD_ON_1_SYMB 0x00 // 7 0 number of symbols used for CAD: 1 +#define RADIOLIB_SX128X_CAD_ON_2_SYMB 0x20 // 7 0 2 +#define RADIOLIB_SX128X_CAD_ON_4_SYMB 0x40 // 7 0 4 +#define RADIOLIB_SX128X_CAD_ON_8_SYMB 0x60 // 7 0 8 +#define RADIOLIB_SX128X_CAD_ON_16_SYMB 0x80 // 7 0 16 + +//RADIOLIB_SX128X_CMD_SET_MODULATION_PARAMS +#define RADIOLIB_SX128X_BLE_GFSK_BR_2_000_BW_2_4 0x04 // 7 0 GFSK/BLE bit rate and bandwidth setting: 2.0 Mbps 2.4 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_1_600_BW_2_4 0x28 // 7 0 1.6 Mbps 2.4 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_1_000_BW_2_4 0x4C // 7 0 1.0 Mbps 2.4 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_1_000_BW_1_2 0x45 // 7 0 1.0 Mbps 1.2 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_800_BW_2_4 0x70 // 7 0 0.8 Mbps 2.4 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_800_BW_1_2 0x69 // 7 0 0.8 Mbps 1.2 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_500_BW_1_2 0x8D // 7 0 0.5 Mbps 1.2 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_500_BW_0_6 0x86 // 7 0 0.5 Mbps 0.6 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_400_BW_1_2 0xB1 // 7 0 0.4 Mbps 1.2 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_400_BW_0_6 0xAA // 7 0 0.4 Mbps 0.6 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_250_BW_0_6 0xCE // 7 0 0.25 Mbps 0.6 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_250_BW_0_3 0xC7 // 7 0 0.25 Mbps 0.3 MHz +#define RADIOLIB_SX128X_BLE_GFSK_BR_0_125_BW_0_3 0xEF // 7 0 0.125 Mbps 0.3 MHz +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_0_35 0x00 // 7 0 GFSK/BLE modulation index: 0.35 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_0_50 0x01 // 7 0 0.50 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_0_75 0x02 // 7 0 0.75 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_1_00 0x03 // 7 0 1.00 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_1_25 0x04 // 7 0 1.25 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_1_50 0x05 // 7 0 1.50 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_1_75 0x06 // 7 0 1.75 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_2_00 0x07 // 7 0 2.00 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_2_25 0x08 // 7 0 2.25 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_2_50 0x09 // 7 0 2.50 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_2_75 0x0A // 7 0 2.75 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_3_00 0x0B // 7 0 3.00 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_3_25 0x0C // 7 0 3.25 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_3_50 0x0D // 7 0 3.50 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_3_75 0x0E // 7 0 3.75 +#define RADIOLIB_SX128X_BLE_GFSK_MOD_IND_4_00 0x0F // 7 0 4.00 +#define RADIOLIB_SX128X_BLE_GFSK_BT_OFF 0x00 // 7 0 GFSK Gaussian filter BT product: filter disabled +#define RADIOLIB_SX128X_BLE_GFSK_BT_1_0 0x10 // 7 0 1.0 +#define RADIOLIB_SX128X_BLE_GFSK_BT_0_5 0x20 // 7 0 0.5 +#define RADIOLIB_SX128X_FLRC_BR_1_300_BW_1_2 0x45 // 7 0 FLRC bit rate and bandwidth setting: 1.3 Mbps 1.2 MHz +#define RADIOLIB_SX128X_FLRC_BR_1_000_BW_1_2 0x69 // 7 0 1.04 Mbps 1.2 MHz +#define RADIOLIB_SX128X_FLRC_BR_0_650_BW_0_6 0x86 // 7 0 0.65 Mbps 0.6 MHz +#define RADIOLIB_SX128X_FLRC_BR_0_520_BW_0_6 0xAA // 7 0 0.52 Mbps 0.6 MHz +#define RADIOLIB_SX128X_FLRC_BR_0_325_BW_0_3 0xC7 // 7 0 0.325 Mbps 0.3 MHz +#define RADIOLIB_SX128X_FLRC_BR_0_260_BW_0_3 0xEB // 7 0 0.260 Mbps 0.3 MHz +#define RADIOLIB_SX128X_FLRC_CR_1_2 0x00 // 7 0 FLRC coding rate: 1/2 +#define RADIOLIB_SX128X_FLRC_CR_3_4 0x02 // 7 0 3/4 +#define RADIOLIB_SX128X_FLRC_CR_1_0 0x04 // 7 0 1/1 +#define RADIOLIB_SX128X_FLRC_BT_OFF 0x00 // 7 0 FLRC Gaussian filter BT product: filter disabled +#define RADIOLIB_SX128X_FLRC_BT_1_0 0x10 // 7 0 1.0 +#define RADIOLIB_SX128X_FLRC_BT_0_5 0x20 // 7 0 0.5 +#define RADIOLIB_SX128X_LORA_SF_5 0x50 // 7 0 LoRa spreading factor: 5 +#define RADIOLIB_SX128X_LORA_SF_6 0x60 // 7 0 6 +#define RADIOLIB_SX128X_LORA_SF_7 0x70 // 7 0 7 +#define RADIOLIB_SX128X_LORA_SF_8 0x80 // 7 0 8 +#define RADIOLIB_SX128X_LORA_SF_9 0x90 // 7 0 9 +#define RADIOLIB_SX128X_LORA_SF_10 0xA0 // 7 0 10 +#define RADIOLIB_SX128X_LORA_SF_11 0xB0 // 7 0 11 +#define RADIOLIB_SX128X_LORA_SF_12 0xC0 // 7 0 12 +#define RADIOLIB_SX128X_LORA_BW_1625_00 0x0A // 7 0 LoRa bandwidth: 1625.0 kHz +#define RADIOLIB_SX128X_LORA_BW_812_50 0x18 // 7 0 812.5 kHz +#define RADIOLIB_SX128X_LORA_BW_406_25 0x26 // 7 0 406.25 kHz +#define RADIOLIB_SX128X_LORA_BW_203_125 0x34 // 7 0 203.125 kHz +#define RADIOLIB_SX128X_LORA_CR_4_5 0x01 // 7 0 LoRa coding rate: 4/5 +#define RADIOLIB_SX128X_LORA_CR_4_6 0x02 // 7 0 4/6 +#define RADIOLIB_SX128X_LORA_CR_4_7 0x03 // 7 0 4/7 +#define RADIOLIB_SX128X_LORA_CR_4_8 0x04 // 7 0 4/8 +#define RADIOLIB_SX128X_LORA_CR_4_5_LI 0x05 // 7 0 4/5, long interleaving +#define RADIOLIB_SX128X_LORA_CR_4_6_LI 0x06 // 7 0 4/6, long interleaving +#define RADIOLIB_SX128X_LORA_CR_4_7_LI 0x07 // 7 0 4/7, long interleaving + +//RADIOLIB_SX128X_CMD_SET_PACKET_PARAMS +#define RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_OFF 0x00 // 7 0 GFSK/FLRC sync word used: none +#define RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_1 0x10 // 7 0 sync word 1 +#define RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_2 0x20 // 7 0 sync word 2 +#define RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_1_2 0x30 // 7 0 sync words 1 and 2 +#define RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_3 0x40 // 7 0 sync word 3 +#define RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_1_3 0x50 // 7 0 sync words 1 and 3 +#define RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_2_3 0x60 // 7 0 sync words 2 and 3 +#define RADIOLIB_SX128X_GFSK_FLRC_SYNC_WORD_1_2_3 0x70 // 7 0 sync words 1, 2 and 3 +#define RADIOLIB_SX128X_GFSK_FLRC_PACKET_FIXED 0x00 // 7 0 GFSK/FLRC packet length mode: fixed +#define RADIOLIB_SX128X_GFSK_FLRC_PACKET_VARIABLE 0x20 // 7 0 variable +#define RADIOLIB_SX128X_GFSK_FLRC_CRC_OFF 0x00 // 7 0 GFSK/FLRC packet CRC: none +#define RADIOLIB_SX128X_GFSK_FLRC_CRC_1_BYTE 0x10 // 7 0 1 byte +#define RADIOLIB_SX128X_GFSK_FLRC_CRC_2_BYTE 0x20 // 7 0 2 bytes +#define RADIOLIB_SX128X_GFSK_FLRC_CRC_3_BYTE 0x30 // 7 0 3 bytes (FLRC only) +#define RADIOLIB_SX128X_GFSK_BLE_WHITENING_ON 0x00 // 7 0 GFSK/BLE whitening: enabled +#define RADIOLIB_SX128X_GFSK_BLE_WHITENING_OFF 0x08 // 7 0 disabled +#define RADIOLIB_SX128X_BLE_PAYLOAD_LENGTH_MAX_31 0x00 // 7 0 BLE maximum payload length: 31 bytes +#define RADIOLIB_SX128X_BLE_PAYLOAD_LENGTH_MAX_37 0x20 // 7 0 37 bytes +#define RADIOLIB_SX128X_BLE_PAYLOAD_LENGTH_TEST 0x40 // 7 0 63 bytes (test mode) +#define RADIOLIB_SX128X_BLE_PAYLOAD_LENGTH_MAX_255 0x80 // 7 0 255 bytes (Bluetooth 4.2 and above) +#define RADIOLIB_SX128X_BLE_CRC_OFF 0x00 // 7 0 BLE packet CRC: none +#define RADIOLIB_SX128X_BLE_CRC_3_BYTE 0x10 // 7 0 3 byte +#define RADIOLIB_SX128X_BLE_PRBS_9 0x00 // 7 0 BLE test payload contents: PRNG sequence using x^9 + x^5 + x +#define RADIOLIB_SX128X_BLE_EYELONG 0x04 // 7 0 repeated 0xF0 +#define RADIOLIB_SX128X_BLE_EYESHORT 0x08 // 7 0 repeated 0xAA +#define RADIOLIB_SX128X_BLE_PRBS_15 0x0C // 7 0 PRNG sequence using x^15 + x^14 + x^13 + x^12 + x^2 + x + 1 +#define RADIOLIB_SX128X_BLE_ALL_1 0x10 // 7 0 repeated 0xFF +#define RADIOLIB_SX128X_BLE_ALL_0 0x14 // 7 0 repeated 0x00 +#define RADIOLIB_SX128X_BLE_EYELONG_INV 0x18 // 7 0 repeated 0x0F +#define RADIOLIB_SX128X_BLE_EYESHORT_INV 0x1C // 7 0 repeated 0x55 +#define RADIOLIB_SX128X_FLRC_SYNC_WORD_OFF 0x00 // 7 0 FLRC sync word: disabled +#define RADIOLIB_SX128X_FLRC_SYNC_WORD_ON 0x04 // 7 0 enabled +#define RADIOLIB_SX128X_LORA_HEADER_EXPLICIT 0x00 // 7 0 LoRa header mode: explicit +#define RADIOLIB_SX128X_LORA_HEADER_IMPLICIT 0x80 // 7 0 implicit +#define RADIOLIB_SX128X_LORA_CRC_OFF 0x00 // 7 0 LoRa packet CRC: disabled +#define RADIOLIB_SX128X_LORA_CRC_ON 0x20 // 7 0 enabled +#define RADIOLIB_SX128X_LORA_IQ_STANDARD 0x40 // 7 0 LoRa IQ: standard +#define RADIOLIB_SX128X_LORA_IQ_INVERTED 0x00 // 7 0 inverted + +//RADIOLIB_SX128X_CMD_GET_PACKET_STATUS +#define RADIOLIB_SX128X_PACKET_STATUS_SYNC_ERROR 0b01000000 // 6 6 packet status errors byte: sync word error +#define RADIOLIB_SX128X_PACKET_STATUS_LENGTH_ERROR 0b00100000 // 5 5 packet length error +#define RADIOLIB_SX128X_PACKET_STATUS_CRC_ERROR 0b00010000 // 4 4 CRC error +#define RADIOLIB_SX128X_PACKET_STATUS_ABORT_ERROR 0b00001000 // 3 3 packet reception aborted +#define RADIOLIB_SX128X_PACKET_STATUS_HEADER_RECEIVED 0b00000100 // 2 2 header received +#define RADIOLIB_SX128X_PACKET_STATUS_PACKET_RECEIVED 0b00000010 // 1 1 packet received +#define RADIOLIB_SX128X_PACKET_STATUS_PACKET_CTRL_BUSY 0b00000001 // 0 0 packet controller is busy +#define RADIOLIB_SX128X_PACKET_STATUS_RX_PID 0b11000000 // 7 6 packet status status byte: PID field of the received packet +#define RADIOLIB_SX128X_PACKET_STATUS_NO_ACK 0b00100000 // 5 5 NO_ACK field of the received packet +#define RADIOLIB_SX128X_PACKET_STATUS_RX_PID_ERROR 0b00010000 // 4 4 PID field error +#define RADIOLIB_SX128X_PACKET_STATUS_PACKET_SENT 0b00000001 // 0 0 packet sent +#define RADIOLIB_SX128X_PACKET_STATUS_SYNC_DET_ERROR 0b00000000 // 2 0 packet status sync byte: sync word detection error +#define RADIOLIB_SX128X_PACKET_STATUS_SYNC_DET_1 0b00000001 // 2 0 detected sync word 1 +#define RADIOLIB_SX128X_PACKET_STATUS_SYNC_DET_2 0b00000010 // 2 0 detected sync word 2 +#define RADIOLIB_SX128X_PACKET_STATUS_SYNC_DET_3 0b00000100 // 2 0 detected sync word 3 + +//RADIOLIB_SX128X_CMD_SET_DIO_IRQ_PARAMS +#define RADIOLIB_SX128X_IRQ_RADIOLIB_PREAMBLE_DETECTED 0x8000 // 15 15 interrupt source: preamble detected +#define RADIOLIB_SX128X_IRQ_ADVANCED_RANGING_DONE 0x8000 // 15 15 advanced ranging done +#define RADIOLIB_SX128X_IRQ_RX_TX_TIMEOUT 0x4000 // 14 14 Rx or Tx timeout +#define RADIOLIB_SX128X_IRQ_CAD_DETECTED 0x2000 // 13 13 channel activity detected +#define RADIOLIB_SX128X_IRQ_CAD_DONE 0x1000 // 12 12 CAD finished +#define RADIOLIB_SX128X_IRQ_RANGING_SLAVE_REQ_VALID 0x0800 // 11 11 ranging request valid (slave) +#define RADIOLIB_SX128X_IRQ_RANGING_MASTER_TIMEOUT 0x0400 // 10 10 ranging timeout (master) +#define RADIOLIB_SX128X_IRQ_RANGING_MASTER_RES_VALID 0x0200 // 9 9 ranging result valid (master) +#define RADIOLIB_SX128X_IRQ_RANGING_SLAVE_REQ_DISCARD 0x0100 // 8 8 ranging result valid (master) +#define RADIOLIB_SX128X_IRQ_RANGING_SLAVE_RESP_DONE 0x0080 // 7 7 ranging response complete (slave) +#define RADIOLIB_SX128X_IRQ_CRC_ERROR 0x0040 // 6 6 CRC error +#define RADIOLIB_SX128X_IRQ_HEADER_ERROR 0x0020 // 5 5 header error +#define RADIOLIB_SX128X_IRQ_HEADER_VALID 0x0010 // 4 4 header valid +#define RADIOLIB_SX128X_IRQ_SYNC_WORD_ERROR 0x0008 // 3 3 sync word error +#define RADIOLIB_SX128X_IRQ_SYNC_WORD_VALID 0x0004 // 2 2 sync word valid +#define RADIOLIB_SX128X_IRQ_RX_DONE 0x0002 // 1 1 Rx done +#define RADIOLIB_SX128X_IRQ_TX_DONE 0x0001 // 0 0 Tx done +#define RADIOLIB_SX128X_IRQ_RX_DEFAULT 0x4062 // 15 0 default for Rx (RX_DONE, RX_TX_TIMEOUT, CRC_ERROR and HEADER_ERROR) +#define RADIOLIB_SX128X_IRQ_NONE 0x0000 // 15 0 none +#define RADIOLIB_SX128X_IRQ_ALL 0xFFFF // 15 0 all + +//RADIOLIB_SX128X_CMD_SET_REGULATOR_MODE +#define RADIOLIB_SX128X_REGULATOR_LDO 0x00 // 7 0 set regulator mode: LDO (default) +#define RADIOLIB_SX128X_REGULATOR_DC_DC 0x01 // 7 0 DC-DC + +//RADIOLIB_SX128X_CMD_SET_RANGING_ROLE +#define RADIOLIB_SX128X_RANGING_ROLE_MASTER 0x01 // 7 0 ranging role: master +#define RADIOLIB_SX128X_RANGING_ROLE_SLAVE 0x00 // 7 0 slave + +//RADIOLIB_SX128X_REG_LORA_SYNC_WORD_1 - RADIOLIB_SX128X_REG_LORA_SYNC_WORD_2 +#define RADIOLIB_SX128X_SYNC_WORD_PRIVATE 0x12 + +/*! + \class SX128x + \brief Base class for %SX128x series. All derived classes for %SX128x (e.g. SX1280 or SX1281) inherit from this base class. + This class should not be instantiated directly from Arduino sketch, only from its derived classes. +*/ +class SX128x: public PhysicalLayer { + public: + // introduce PhysicalLayer overloads + using PhysicalLayer::transmit; + using PhysicalLayer::receive; + using PhysicalLayer::startTransmit; + using PhysicalLayer::readData; + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX128x(Module* mod); + + Module* getMod(); + + // basic methods + + /*! + \brief Initialization method for LoRa modem. + \param freq Carrier frequency in MHz. Defaults to 2400.0 MHz. + \param bw LoRa bandwidth in kHz. Defaults to 812.5 kHz. + \param sf LoRa spreading factor. Defaults to 9. + \param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7). + \param syncWord 2-byte LoRa sync word. Defaults to RADIOLIB_SX128X_SYNC_WORD_PRIVATE (0x12). + \param pwr Output power in dBm. Defaults to 10 dBm. + \param preambleLength LoRa preamble length in symbols. Defaults to 12 symbols. + \returns \ref status_codes + */ + int16_t begin(float freq = 2400.0, float bw = 812.5, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX128X_SYNC_WORD_PRIVATE, int8_t pwr = 10, uint16_t preambleLength = 12); + + /*! + \brief Initialization method for GFSK modem. + \param freq Carrier frequency in MHz. Defaults to 2400.0 MHz. + \param br FSK bit rate in kbps. Defaults to 800 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz. Defaults to 400.0 kHz. + \param pwr Output power in dBm. Defaults to 10 dBm. + \param preambleLength FSK preamble length in bits. Defaults to 16 bits. + \returns \ref status_codes + */ + int16_t beginGFSK(float freq = 2400.0, uint16_t br = 800, float freqDev = 400.0, int8_t pwr = 10, uint16_t preambleLength = 16); + + /*! + \brief Initialization method for BLE modem. + \param freq Carrier frequency in MHz. Defaults to 2400.0 MHz. + \param br BLE bit rate in kbps. Defaults to 800 kbps. + \param freqDev Frequency deviation from carrier frequency in kHz. Defaults to 400.0 kHz. + \param pwr Output power in dBm. Defaults to 10 dBm. + \param dataShaping Time-bandwidth product of the Gaussian filter to be used for shaping. Defaults to 0.5. + \returns \ref status_codes + */ + int16_t beginBLE(float freq = 2400.0, uint16_t br = 800, float freqDev = 400.0, int8_t pwr = 10, uint8_t dataShaping = RADIOLIB_SHAPING_0_5); + + /*! + \brief Initialization method for FLRC modem. + \param freq Carrier frequency in MHz. Defaults to 2400.0 MHz. + \param br FLRC bit rate in kbps. Defaults to 650 kbps. + \param cr FLRC coding rate. Defaults to 3 (coding rate 3/4). + \param pwr Output power in dBm. Defaults to 10 dBm. + \param preambleLength FLRC preamble length in bits. Defaults to 16 bits. + \param dataShaping Time-bandwidth product of the Gaussian filter to be used for shaping. Defaults to 0.5. + \returns \ref status_codes + */ + int16_t beginFLRC(float freq = 2400.0, uint16_t br = 650, uint8_t cr = 3, int8_t pwr = 10, uint16_t preambleLength = 16, uint8_t dataShaping = RADIOLIB_SHAPING_0_5); + + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + \param verify Whether correct module startup should be verified. When set to true, RadioLib will attempt to verify the module has started correctly + by repeatedly issuing setStandby command. Enabled by default. + \returns \ref status_codes + */ + int16_t reset(bool verify = true); + + /*! + \brief Blocking binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Address to send the data to. Unsupported, compatibility only. + \returns \ref status_codes + */ + int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Blocking binary receive method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \returns \ref status_codes + */ + int16_t receive(uint8_t* data, size_t len) override; + + /*! + \brief Starts direct mode transmission. + \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0) override; + + /*! + \brief Starts direct mode reception. Only implemented for PhysicalLayer compatibility, + as %SX128x series does not support direct mode reception. Will always return RADIOLIB_ERR_UNKNOWN. + \returns \ref status_codes + */ + int16_t receiveDirect() override; + + /*! + \brief Performs scan for LoRa transmission in the current channel. Detects both preamble and payload. + \returns \ref status_codes + */ + int16_t scanChannel(); + + /*! + \brief Sets the module to sleep mode. To wake the device up, call standby(). + \param retainConfig Set to true to retain configuration and data buffer or to false + to discard current configuration and data buffer. Defaults to true. + \returns \ref status_codes + */ + int16_t sleep(bool retainConfig = true); + + /*! + \brief Sets the module to standby mode (overload for PhysicalLayer compatibility, uses 13 MHz RC oscillator). + \returns \ref status_codes + */ + int16_t standby() override; + + /*! + \brief Sets the module to standby mode. + \param mode Oscillator to be used in standby mode. Can be set to RADIOLIB_SX128X_STANDBY_RC + (13 MHz RC oscillator) or RADIOLIB_SX128X_STANDBY_XOSC (52 MHz external crystal oscillator). + \param wakeup Whether to force the module to wake up. Setting to true will immediately attempt to wake up the module. + \returns \ref status_codes + */ + int16_t standby(uint8_t mode, bool wakeup = false); + + // interrupt methods + + /*! + \brief Sets interrupt service routine to call when DIO1 activates. + \param func ISR to call. + */ + void setDio1Action(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when DIO1 activates. + */ + void clearDio1Action(); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + void clearPacketSentAction(); + + /*! + \brief Interrupt-driven binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Address to send the data to. Unsupported, compatibility only. + \returns \ref status_codes + */ + int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Clean up after transmission is done. + \returns \ref status_codes + */ + int16_t finishTransmit() override; + + /*! + \brief Interrupt-driven receive method with default parameters. + Implemented for compatibility with PhysicalLayer. + + \returns \ref status_codes + */ + int16_t startReceive(); + + /*! + \brief Interrupt-driven receive method. DIO1 will be activated when full packet is received. + \param timeout Raw timeout value, expressed as multiples of 15.625 us. Defaults to + RADIOLIB_SX128X_RX_TIMEOUT_INF for infinite timeout (Rx continuous mode), + set to RADIOLIB_SX128X_RX_TIMEOUT_NONE for no timeout (Rx single mode). + If timeout other than infinite is set, signal will be generated on DIO1. + + \param irqFlags Sets the IRQ flags, defaults to RADIOLIB_SX128X_IRQ_RX_DEFAULT. + \param irqMask Sets the mask of IRQ flags that will trigger DIO1, defaults to RADIOLIB_SX128X_IRQ_RX_DONE. + \param len Only for PhysicalLayer compatibility, not used. + \returns \ref status_codes + */ + int16_t startReceive(uint16_t timeout, uint16_t irqFlags = RADIOLIB_SX128X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX128X_IRQ_RX_DONE, size_t len = 0); + + /*! + \brief Reads the current IRQ status. + \returns IRQ status bits + */ + uint16_t getIrqStatus(); + + /*! + \brief Reads data received after calling startReceive method. When the packet length is not known in advance, + getPacketLength method must be called BEFORE calling readData! + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be read. When set to 0, the packet length will be retrieved automatically. + When more bytes than received are requested, only the number of bytes requested will be returned. + \returns \ref status_codes + */ + int16_t readData(uint8_t* data, size_t len) override; + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values are in range from 2400.0 to 2500.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets LoRa bandwidth. Allowed values are 203.125, 406.25, 812.5 and 1625.0 kHz. + \param bw LoRa bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setBandwidth(float bw); + + /*! + \brief Sets LoRa spreading factor. Allowed values range from 5 to 12. + \param sf LoRa spreading factor to be set. + \returns \ref status_codes + */ + int16_t setSpreadingFactor(uint8_t sf); + + /*! + \brief Sets LoRa coding rate denominator. Allowed values range from 5 to 8. + \param cr LoRa coding rate denominator to be set. + \param longInterleaving Whether to enable long interleaving mode. Not available for coding rate 4/7, + defaults to false. + \returns \ref status_codes + */ + int16_t setCodingRate(uint8_t cr, bool longInterleaving = false); + + /*! + \brief Sets output power. Allowed values are in range from -18 to 13 dBm. + \param pwr Output power to be set in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t pwr); + + /*! + \brief Sets preamble length for currently active modem. Allowed values range from 1 to 65535. + \param preambleLength Preamble length to be set in symbols (LoRa) or bits (FSK/BLE/FLRC). + \returns \ref status_codes + */ + int16_t setPreambleLength(uint32_t preambleLength); + + /*! + \brief Sets FSK or FLRC bit rate. Allowed values are 125, 250, 400, 500, 800, 1000, + 1600 and 2000 kbps (for FSK modem) or 260, 325, 520, 650, 1000 and 1300 (for FLRC modem). + \param br FSK/FLRC bit rate to be set in kbps. + \returns \ref status_codes + */ + int16_t setBitRate(float br); + + /*! + \brief Sets FSK frequency deviation. Allowed values range from 0.0 to 3200.0 kHz. + \param freqDev FSK frequency deviation to be set in kHz. + \returns \ref status_codes + */ + int16_t setFrequencyDeviation(float freqDev) override; + + /*! + \brief Sets time-bandwidth product of Gaussian filter applied for shaping. + Allowed values are RADIOLIB_SHAPING_0_5 or RADIOLIB_SHAPING_1_0. Set to RADIOLIB_SHAPING_NONE to disable data shaping. + \param sh Time-bandwidth product of Gaussian filter to be set. + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! + \brief Sets FSK/FLRC sync word in the form of array of up to 5 bytes (FSK). For FLRC modem, + the sync word must be exactly 4 bytes long + \param syncWord Sync word to be set. + \param len Sync word length in bytes. + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t* syncWord, uint8_t len); + + /*! + \brief Sets LoRa sync word. + \param syncWord LoRa sync word to be set. + \param controlBits Undocumented control bits, required for compatibility purposes. + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t syncWord, uint8_t controlBits = 0x44); + + /*! + \brief Sets CRC configuration. + \param len CRC length in bytes, Allowed values are 1, 2 or 3, set to 0 to disable CRC. + \param initial Initial CRC value. Defaults to 0x1D0F (CCIT CRC), not available for LoRa modem. + \param polynomial Polynomial for CRC calculation. Defaults to 0x1021 (CCIT CRC), not available for LoRa or BLE modem. + \returns \ref status_codes + */ + int16_t setCRC(uint8_t len, uint32_t initial = 0x1D0F, uint16_t polynomial = 0x1021); + + /*! + \brief Sets whitening parameters, not available for LoRa or FLRC modem. + \param enabled Set to true to enable whitening. + \returns \ref status_codes + */ + int16_t setWhitening(bool enabled); + + /*! + \brief Sets BLE access address. + \param addr BLE access address. + \returns \ref status_codes + */ + int16_t setAccessAddress(uint32_t addr); + + /*! + \brief Enables or disables receiver high sensitivity mode. + \param enable True to enable and false to disable. + \returns \ref status_codes + */ + int16_t setHighSensitivityMode(bool enable); + + /*! + \brief Enables or disables receiver manual gain control. + \param gain Use 0 for automatic gain, 1 for minimum gain and up to 13 for maximum gain. + \returns \ref status_codes + */ + int16_t setGainControl(uint8_t gain = 0); + + /*! + \brief Gets RSSI (Recorded Signal Strength Indicator) of the last received packet. + \returns RSSI of the last received packet in dBm. + */ + float getRSSI(); + + /*! + \brief Gets SNR (Signal to Noise Ratio) of the last received packet. Only available for LoRa or ranging modem. + \returns SNR of the last received packet in dB. + */ + float getSNR(); + + /*! + \brief Gets frequency error of the latest received packet. + \returns Frequency error in Hz. + */ + float getFrequencyError(); + + /*! + \brief Query modem for the packet length of received payload. + \param update Update received packet length. Will return cached value when set to false. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update = true) override; + + /*! + \brief Get expected time-on-air for a given size of payload. + \param len Payload length in bytes. + \returns Expected time-on-air in microseconds. + */ + uint32_t getTimeOnAir(size_t len); + + /*! + \brief Set implicit header mode for future reception/transmission. + \returns \ref status_codes + */ + int16_t implicitHeader(size_t len); + + /*! + \brief Set explicit header mode for future reception/transmission. + \param len Payload length in bytes. + \returns \ref status_codes + */ + int16_t explicitHeader(); + + /*! + \brief Sets transmission encoding. Serves only as alias for PhysicalLayer compatibility. + \param encoding Encoding to be used. Set to 0 for NRZ, and 2 for whitening. + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding) override; + + /*! \copydoc Module::setRfSwitchPins */ + void setRfSwitchPins(uint32_t rxEn, uint32_t txEn); + + /*! \copydoc Module::setRfSwitchTable */ + void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]); + + /*! + \brief Dummy random method, to ensure PhysicalLayer compatibility. + \returns Always returns 0. + */ + uint8_t randomByte(); + + /*! + \brief Enable/disable inversion of the I and Q signals + \param enable QI inversion enabled (true) or disabled (false); + \returns \ref status_codes + */ + int16_t invertIQ(bool enable); + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + /*! + \brief Dummy method, to ensure PhysicalLayer compatibility. + \param func Ignored. + */ + void setDirectAction(void (*func)(void)); + + /*! + \brief Dummy method, to ensure PhysicalLayer compatibility. + \param pin Ignored. + */ + void readBit(uint32_t pin); + #endif + +#if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) + protected: +#endif + Module* mod; + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + + // cached LoRa parameters + float bandwidthKhz = 0; + uint8_t bandwidth = 0, spreadingFactor = 0, codingRateLoRa = 0; + uint8_t preambleLengthLoRa = 0, headerType = 0, payloadLen = 0, crcLoRa = 0; + + // SX128x SPI command implementations + uint8_t getStatus(); + int16_t writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes); + int16_t readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes); + int16_t writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset = 0x00); + int16_t readBuffer(uint8_t* data, uint8_t numBytes); + int16_t setTx(uint16_t periodBaseCount = RADIOLIB_SX128X_TX_TIMEOUT_NONE, uint8_t periodBase = RADIOLIB_SX128X_PERIOD_BASE_15_625_US); + int16_t setRx(uint16_t periodBaseCount, uint8_t periodBase = RADIOLIB_SX128X_PERIOD_BASE_15_625_US); + int16_t setCad(); + uint8_t getPacketType(); + int16_t setRfFrequency(uint32_t frf); + int16_t setTxParams(uint8_t pwr, uint8_t rampTime = RADIOLIB_SX128X_PA_RAMP_10_US); + int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00); + int16_t setModulationParams(uint8_t modParam1, uint8_t modParam2, uint8_t modParam3); + int16_t setPacketParamsGFSK(uint8_t preambleLen, uint8_t syncLen, uint8_t syncMatch, uint8_t crcLen, uint8_t whiten, uint8_t payLen = 0xFF, uint8_t hdrType = RADIOLIB_SX128X_GFSK_FLRC_PACKET_VARIABLE); + int16_t setPacketParamsBLE(uint8_t connState, uint8_t crcLen, uint8_t bleTest, uint8_t whiten); + int16_t setPacketParamsLoRa(uint8_t preambleLen, uint8_t hdrType, uint8_t payLen, uint8_t crc, uint8_t invIQ = RADIOLIB_SX128X_LORA_IQ_STANDARD); + int16_t setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask = RADIOLIB_SX128X_IRQ_NONE, uint16_t dio3Mask = RADIOLIB_SX128X_IRQ_NONE); + int16_t clearIrqStatus(uint16_t clearIrqParams = RADIOLIB_SX128X_IRQ_ALL); + int16_t setRangingRole(uint8_t role); + int16_t setPacketType(uint8_t type); + + int16_t setHeaderType(uint8_t hdrType, size_t len = 0xFF); + +#if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) + private: +#endif + + // common low-level SPI interface + static int16_t SPIparseStatus(uint8_t in); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + // common parameters + uint8_t power = 0; + + // cached LoRa parameters + uint8_t invertIQEnabled = RADIOLIB_SX128X_LORA_IQ_STANDARD; + + // cached GFSK parameters + float modIndexReal = 0; + uint16_t bitRateKbps = 0; + uint8_t bitRate = 0, modIndex = 0, shaping = 0; + uint8_t preambleLengthGFSK = 0, syncWordLen = 0, syncWordMatch = 0, crcGFSK = 0, whitening = 0; + + // cached FLRC parameters + uint8_t codingRateFLRC = 0; + + // cached BLE parameters + uint8_t connectionState = 0, crcBLE = 0, bleTestPayload = 0; + + int16_t config(uint8_t modem); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4430.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4430.cpp new file mode 100644 index 00000000..9de46ae1 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4430.cpp @@ -0,0 +1,38 @@ +#include "Si4430.h" +#if !defined(RADIOLIB_EXCLUDE_SI443X) + +Si4430::Si4430(Module* mod) : Si4432(mod) { + +} + +int16_t Si4430::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) { + // execute common part + int16_t state = Si443x::begin(br, freqDev, rxBw, preambleLen); + RADIOLIB_ASSERT(state); + RADIOLIB_DEBUG_PRINTLN("M\tSi4430"); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t Si4430::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE(freq, 900.0, 960.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // set frequency + return(Si443x::setFrequencyRaw(freq)); +} + +int16_t Si4430::setOutputPower(int8_t power) { + RADIOLIB_CHECK_RANGE(power, -8, 13, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + + // set output power + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_TX_POWER, (uint8_t)((power + 8) / 3), 2, 0)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4430.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4430.h new file mode 100644 index 00000000..5b073509 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4430.h @@ -0,0 +1,67 @@ +#if !defined(_RADIOLIB_SI4430_H) +#define _RADIOLIB_SI4430_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SI443X) + +#include "../../Module.h" +#include "Si4432.h" + +/*! + \class Si4430 + \brief Derived class for %Si4430 modules. +*/ +class Si4430: public Si4432 { + public: + + // constructor + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio chip. + */ + Si4430(Module* mod); + + // basic methods + + /*! + \brief Initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 900.0 MHz to 960.0 MHz. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 0.123 to 256.0 kbps. + \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.625 to 320.0 kbps. + \param rxBw Receiver bandwidth in kHz. Allowed values range from 2.6 to 620.7 kHz. + \param power Transmission output power in dBm. Allowed values range from -8 to 13 dBm in 3 dBm steps. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 181.1, int8_t power = 10, uint8_t preambleLen = 16); + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 900.0 MHz to 960.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets output power. Allowed values range from -8 to 13 dBm in 3 dBm steps. + \param power Output power to be set in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + +#if !defined(RADIOLIB_GODMODE) + private: +#endif +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4431.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4431.cpp new file mode 100644 index 00000000..566b245a --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4431.cpp @@ -0,0 +1,31 @@ +#include "Si4431.h" +#if !defined(RADIOLIB_EXCLUDE_SI443X) + +Si4431::Si4431(Module* mod) : Si4432(mod) { + +} + +int16_t Si4431::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) { + // execute common part + int16_t state = Si443x::begin(br, freqDev, rxBw, preambleLen); + RADIOLIB_ASSERT(state); + RADIOLIB_DEBUG_PRINTLN("M\tSi4431"); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t Si4431::setOutputPower(int8_t power) { + RADIOLIB_CHECK_RANGE(power, -8, 13, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + + // set output power + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_TX_POWER, (uint8_t)((power + 8) / 3), 2, 0)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4431.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4431.h new file mode 100644 index 00000000..8ca35a34 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4431.h @@ -0,0 +1,60 @@ +#if !defined(_RADIOLIB_SI4431_H) +#define _RADIOLIB_SI4431_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SI443X) + +#include "../../Module.h" +#include "Si4432.h" + +/*! + \class Si4431 + \brief Derived class for %Si4431 modules. +*/ +class Si4431: public Si4432 { + public: + + // constructor + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio chip. + */ + Si4431(Module* mod); + + // basic methods + + /*! + \brief Initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 240.0 MHz to 930.0 MHz. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 0.123 to 256.0 kbps. + \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.625 to 320.0 kbps. + \param rxBw Receiver bandwidth in kHz. Allowed values range from 2.6 to 620.7 kHz. + \param power Transmission output power in dBm. Allowed values range from -8 to 13 dBm in 3 dBm steps. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 181.1, int8_t power = 10, uint8_t preambleLen = 16); + + // configuration methods + + /*! + \brief Sets output power. Allowed values range from -8 to 13 dBm in 3 dBm steps. + \param power Output power to be set in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + +#if !defined(RADIOLIB_GODMODE) + private: +#endif +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4432.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4432.cpp new file mode 100644 index 00000000..0f679d67 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4432.cpp @@ -0,0 +1,38 @@ +#include "Si4432.h" +#if !defined(RADIOLIB_EXCLUDE_SI443X) + +Si4432::Si4432(Module* mod) : Si443x(mod) { + +} + +int16_t Si4432::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) { + // execute common part + int16_t state = Si443x::begin(br, freqDev, rxBw, preambleLen); + RADIOLIB_ASSERT(state); + RADIOLIB_DEBUG_PRINTLN("M\tSi4432"); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t Si4432::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE(freq, 240.0, 930.0, RADIOLIB_ERR_INVALID_FREQUENCY); + + // set frequency + return(Si443x::setFrequencyRaw(freq)); +} + +int16_t Si4432::setOutputPower(int8_t power) { + RADIOLIB_CHECK_RANGE(power, -1, 20, RADIOLIB_ERR_INVALID_OUTPUT_POWER); + + // set output power + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_TX_POWER, (uint8_t)((power + 1) / 3), 2, 0)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4432.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4432.h new file mode 100644 index 00000000..3903a5ac --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si4432.h @@ -0,0 +1,67 @@ +#if !defined(_RADIOLIB_SI4432_H) +#define _RADIOLIB_SI4432_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SI443X) + +#include "../../Module.h" +#include "Si443x.h" + +/*! + \class Si4432 + \brief Derived class for %Si4432 modules. +*/ +class Si4432: public Si443x { + public: + + // constructor + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio chip. + */ + Si4432(Module* mod); + + // basic methods + + /*! + \brief Initialization method. Must be called at least once from Arduino sketch to initialize the module. + \param freq Carrier frequency in MHz. Allowed values range from 240.0 MHz to 930.0 MHz. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 0.123 to 256.0 kbps. + \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.625 to 320.0 kbps. + \param rxBw Receiver bandwidth in kHz. Allowed values range from 2.6 to 620.7 kHz. + \param power Transmission output power in dBm. Allowed values range from -1 to 20 dBm in 3 dBm steps. + \param preambleLen Preamble Length in bits. Defaults to 16 bits. + \returns \ref status_codes + */ + int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 181.1, int8_t power = 10, uint8_t preambleLen = 16); + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 240.0 MHz to 930.0 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets output power. Allowed values range from -1 to 20 dBm in 3 dBm steps. + \param power Output power to be set in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t power); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + +#if !defined(RADIOLIB_GODMODE) + private: +#endif +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si443x.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si443x.cpp new file mode 100644 index 00000000..2b2bf835 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si443x.cpp @@ -0,0 +1,813 @@ +#include "Si443x.h" +#include +#if !defined(RADIOLIB_EXCLUDE_SI443X) + +Si443x::Si443x(Module* mod) : PhysicalLayer(RADIOLIB_SI443X_FREQUENCY_STEP_SIZE, RADIOLIB_SI443X_MAX_PACKET_LENGTH) { + this->mod = mod; +} + +Module* Si443x::getMod() { + return(this->mod); +} + +int16_t Si443x::begin(float br, float freqDev, float rxBw, uint8_t preambleLen) { + // set module properties + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + + // try to find the Si443x chip + if(!Si443x::findChip()) { + RADIOLIB_DEBUG_PRINTLN("No Si443x found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } else { + RADIOLIB_DEBUG_PRINTLN("M\tSi443x"); + } + + // reset the device + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, RADIOLIB_SI443X_SOFTWARE_RESET); + + // clear POR interrupt + clearIRQFlags(); + + // configure settings not accessible by API + int16_t state = config(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setBitRate(br); + RADIOLIB_ASSERT(state); + + state = setFrequencyDeviation(freqDev); + RADIOLIB_ASSERT(state); + + state = setRxBandwidth(rxBw); + RADIOLIB_ASSERT(state); + + state = setPreambleLength(preambleLen); + RADIOLIB_ASSERT(state); + + uint8_t syncWord[] = {0x12, 0xAD}; + state = setSyncWord(syncWord, sizeof(syncWord)); + RADIOLIB_ASSERT(state); + + state = packetMode(); + RADIOLIB_ASSERT(state); + + state = setDataShaping(0); + RADIOLIB_ASSERT(state); + + state = setEncoding(0); + RADIOLIB_ASSERT(state); + + state = variablePacketLengthMode(); + + return(state); +} + +void Si443x::reset() { + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + this->mod->hal->delay(1); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + this->mod->hal->delay(100); +} + +int16_t Si443x::transmit(uint8_t* data, size_t len, uint8_t addr) { + // calculate timeout (5ms + 500 % of expected time-on-air) + uint32_t timeout = 5000000 + (uint32_t)((((float)(len * 8)) / (this->bitRate * 1000.0)) * 5000000.0); + + // start transmission + int16_t state = startTransmit(data, len, addr); + RADIOLIB_ASSERT(state); + + // wait for transmission end or timeout + uint32_t start = this->mod->hal->micros(); + while(this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + if(this->mod->hal->micros() - start > timeout) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + + return(finishTransmit()); +} + +int16_t Si443x::receive(uint8_t* data, size_t len) { + // calculate timeout (500 ms + 400 full 64-byte packets at current bit rate) + uint32_t timeout = 500000 + (1.0/(this->bitRate*1000.0))*(RADIOLIB_SI443X_MAX_PACKET_LENGTH*400.0); + + // start reception + int16_t state = startReceive(); + RADIOLIB_ASSERT(state); + + // wait for packet reception or timeout + uint32_t start = this->mod->hal->micros(); + while(this->mod->hal->digitalRead(this->mod->getIrq())) { + if(this->mod->hal->micros() - start > timeout) { + standby(); + clearIRQFlags(); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } + + // read packet data + return(readData(data, len)); +} + +int16_t Si443x::sleep() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + + // disable wakeup timer interrupt + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1, 0x00); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2, 0x00); + RADIOLIB_ASSERT(state); + + // enable wakeup timer to set mode to sleep + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, RADIOLIB_SI443X_ENABLE_WAKEUP_TIMER); + + return(state); +} + +int16_t Si443x::standby() { + return(standby(RADIOLIB_SI443X_XTAL_ON)); +} + +int16_t Si443x::standby(uint8_t mode) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_IDLE); + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, mode, 7, 0, 10)); +} + +int16_t Si443x::transmitDirect(uint32_t frf) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // user requested to start transmitting immediately (required for RTTY) + if(frf != 0) { + // convert the 24-bit frequency to the format accepted by the module + /// \todo integers only + float newFreq = frf / 6400.0; + + // check high/low band + uint8_t bandSelect = RADIOLIB_SI443X_BAND_SELECT_LOW; + uint8_t freqBand = (newFreq / 10) - 24; + if(newFreq >= 480.0) { + bandSelect = RADIOLIB_SI443X_BAND_SELECT_HIGH; + freqBand = (newFreq / 20) - 24; + } + + // calculate register values + uint16_t freqCarrier = ((newFreq / (10 * ((bandSelect >> 5) + 1))) - freqBand - 24) * (uint32_t)64000; + + // update registers + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_FREQUENCY_BAND_SELECT, RADIOLIB_SI443X_SIDE_BAND_SELECT_LOW | bandSelect | freqBand); + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_1, (uint8_t)((freqCarrier & 0xFF00) >> 8)); + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_0, (uint8_t)(freqCarrier & 0xFF)); + + // start direct transmission + directMode(); + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, RADIOLIB_SI443X_TX_ON | RADIOLIB_SI443X_XTAL_ON); + + return(RADIOLIB_ERR_NONE); + } + + // activate direct mode + int16_t state = directMode(); + RADIOLIB_ASSERT(state); + + // start transmitting + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, RADIOLIB_SI443X_TX_ON | RADIOLIB_SI443X_XTAL_ON); + return(state); +} + +int16_t Si443x::receiveDirect() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // activate direct mode + int16_t state = directMode(); + RADIOLIB_ASSERT(state); + + // start receiving + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, RADIOLIB_SI443X_RX_ON | RADIOLIB_SI443X_XTAL_ON); + return(state); +} + +int16_t Si443x::packetMode() { + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2, RADIOLIB_SI443X_MODULATION_FSK, 1, 0); + RADIOLIB_ASSERT(state); + + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2, RADIOLIB_SI443X_TX_DATA_SOURCE_FIFO, 5, 4)); +} + +void Si443x::setIrqAction(void (*func)(void)) { + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq()), func, this->mod->hal->GpioInterruptFalling); +} + +void Si443x::clearIrqAction() { + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq())); +} + +void Si443x::setPacketReceivedAction(void (*func)(void)) { + this->setIrqAction(func); +} + +void Si443x::clearPacketReceivedAction() { + this->clearIrqAction(); +} + +void Si443x::setPacketSentAction(void (*func)(void)) { + this->setIrqAction(func); +} + +void Si443x::clearPacketSentAction() { + this->clearIrqAction(); +} + +int16_t Si443x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { + // check packet length + if(len > RADIOLIB_SI443X_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // clear Tx FIFO + this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_2, RADIOLIB_SI443X_TX_FIFO_RESET, 0, 0); + this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_2, RADIOLIB_SI443X_TX_FIFO_CLEAR, 0, 0); + + // clear interrupt flags + clearIRQFlags(); + + // set packet length + if (this->packetLengthConfig == RADIOLIB_SI443X_FIXED_PACKET_LENGTH_OFF) { + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_TRANSMIT_PACKET_LENGTH, len); + } + + /// \todo use header as address field? + (void)addr; + + // write packet to FIFO + this->mod->SPIwriteRegisterBurst(RADIOLIB_SI443X_REG_FIFO_ACCESS, data, len); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // set interrupt mapping + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1, RADIOLIB_SI443X_PACKET_SENT_ENABLED); + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2, 0x00); + + // set mode to transmit + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, RADIOLIB_SI443X_TX_ON | RADIOLIB_SI443X_XTAL_ON); + + return(state); +} + +int16_t Si443x::finishTransmit() { + // clear interrupt flags + clearIRQFlags(); + + // set mode to standby to disable transmitter/RF switch + return(standby()); +} + +int16_t Si443x::startReceive() { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // clear Rx FIFO + this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_2, RADIOLIB_SI443X_RX_FIFO_RESET, 1, 1); + this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_2, RADIOLIB_SI443X_RX_FIFO_CLEAR, 1, 1); + + // clear interrupt flags + clearIRQFlags(); + + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // set interrupt mapping + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1, RADIOLIB_SI443X_VALID_PACKET_RECEIVED_ENABLED | RADIOLIB_SI443X_CRC_ERROR_ENABLED); + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2, 0x00); + + // set mode to receive + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, RADIOLIB_SI443X_RX_ON | RADIOLIB_SI443X_XTAL_ON); + + return(state); +} + +int16_t Si443x::startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len) { + (void)timeout; + (void)irqFlags; + (void)irqMask; + (void)len; + return(startReceive()); +} + +int16_t Si443x::readData(uint8_t* data, size_t len) { + // clear interrupt flags + clearIRQFlags(); + + // get packet length + size_t length = getPacketLength(); + size_t dumpLen = 0; + if((len != 0) && (len < length)) { + // user requested less data than we got, only return what was requested + dumpLen = length - len; + length = len; + } + + // read packet data + this->mod->SPIreadRegisterBurst(RADIOLIB_SI443X_REG_FIFO_ACCESS, length, data); + + // dump the bytes that weren't requested + if(dumpLen != 0) { + clearFIFO(dumpLen); + } + + // clear internal flag so getPacketLength can return the new packet length + this->packetLengthQueried = false; + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // clear interrupt flags + clearIRQFlags(); + + return(RADIOLIB_ERR_NONE); +} + +int16_t Si443x::setBitRate(float br) { + RADIOLIB_CHECK_RANGE(br, 0.123, 256.0, RADIOLIB_ERR_INVALID_BIT_RATE); + + // check high data rate + uint8_t dataRateMode = RADIOLIB_SI443X_LOW_DATA_RATE_MODE; + uint8_t exp = 21; + if(br >= 30.0) { + // bit rate above 30 kbps + dataRateMode = RADIOLIB_SI443X_HIGH_DATA_RATE_MODE; + exp = 16; + } + + // calculate raw data rate value + uint16_t txDr = (br * ((uint32_t)1 << exp)) / 1000.0; + + // update registers + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1, dataRateMode, 5, 5); + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_TX_DATA_RATE_1, (uint8_t)((txDr & 0xFF00) >> 8)); + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_TX_DATA_RATE_0, (uint8_t)(txDr & 0xFF)); + + if(state == RADIOLIB_ERR_NONE) { + this->bitRate = br; + } + RADIOLIB_ASSERT(state); + + // update clock recovery + state = updateClockRecovery(); + + return(state); +} + +int16_t Si443x::setFrequencyDeviation(float freqDev) { + // set frequency deviation to lowest available setting (required for digimodes) + float newFreqDev = freqDev; + if(freqDev < 0.0) { + newFreqDev = 0.625; + } + + RADIOLIB_CHECK_RANGE(newFreqDev, 0.625, 320.0, RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + + // calculate raw frequency deviation value + uint16_t fdev = (uint16_t)(newFreqDev / 0.625); + + // update registers + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2, (uint8_t)((fdev & 0x0100) >> 6), 2, 2); + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_FREQUENCY_DEVIATION, (uint8_t)(fdev & 0xFF)); + + if(state == RADIOLIB_ERR_NONE) { + this->frequencyDev = newFreqDev; + } + + return(state); +} + +int16_t Si443x::setRxBandwidth(float rxBw) { + RADIOLIB_CHECK_RANGE(rxBw, 2.6, 620.7, RADIOLIB_ERR_INVALID_RX_BANDWIDTH); + + // decide which approximation to use for decimation rate and filter tap calculation + uint8_t bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_OFF; + uint8_t decRate = RADIOLIB_SI443X_IF_FILTER_DEC_RATE; + uint8_t filterSet = RADIOLIB_SI443X_IF_FILTER_COEFF_SET; + + // this is the "well-behaved" section - can be linearly approximated + if((rxBw >= 2.6) && (rxBw <= 4.5)) { + decRate = 5; + filterSet = ((rxBw - 2.1429)/0.3250 + 0.5); + } else if((rxBw > 4.5) && (rxBw <= 8.8)) { + decRate = 4; + filterSet = ((rxBw - 3.9857)/0.6643 + 0.5); + } else if((rxBw > 8.8) && (rxBw <= 17.5)) { + decRate = 3; + filterSet = ((rxBw - 7.6714)/1.3536 + 0.5); + } else if((rxBw > 17.5) && (rxBw <= 34.7)) { + decRate = 2; + filterSet = ((rxBw - 15.2000)/2.6893 + 0.5); + } else if((rxBw > 34.7) && (rxBw <= 69.2)) { + decRate = 1; + filterSet = ((rxBw - 30.2430)/5.3679 + 0.5); + } else if((rxBw > 69.2) && (rxBw <= 137.9)) { + decRate = 0; + filterSet = ((rxBw - 60.286)/10.7000 + 0.5); + + // this is the "Lord help thee who tread 'ere" section - no way to approximate this mess + /// \todo float tolerance equality as macro? + } else if(fabs(rxBw - 142.8) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 1; + filterSet = 4; + } else if(fabs(rxBw - 167.8) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 1; + filterSet = 5; + } else if(fabs(rxBw - 181.1) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 1; + filterSet = 6; + } else if(fabs(rxBw - 191.5) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 15; + } else if(fabs(rxBw - 225.1) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 1; + } else if(fabs(rxBw - 248.8) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 2; + } else if(fabs(rxBw - 269.3) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 3; + } else if(fabs(rxBw - 284.8) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 4; + } else if(fabs(rxBw -335.5) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 8; + } else if(fabs(rxBw - 391.8) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 9; + } else if(fabs(rxBw - 420.2) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 10; + } else if(fabs(rxBw - 468.4) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 11; + } else if(fabs(rxBw - 518.8) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 12; + } else if(fabs(rxBw - 577.0) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 13; + } else if(fabs(rxBw - 620.7) <= 0.001) { + bypass = RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON; + decRate = 0; + filterSet = 14; + } else { + return(RADIOLIB_ERR_INVALID_RX_BANDWIDTH); + } + + // shift decimation rate bits + decRate <<= 4; + + // update register + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_IF_FILTER_BANDWIDTH, bypass | decRate | filterSet); + RADIOLIB_ASSERT(state); + + // update clock recovery + state = updateClockRecovery(); + + return(state); +} + +int16_t Si443x::setSyncWord(uint8_t* syncWord, size_t len) { + RADIOLIB_CHECK_RANGE(len, 1, 4, RADIOLIB_ERR_INVALID_SYNC_WORD); + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set sync word length + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_HEADER_CONTROL_2, (uint8_t)(len - 1) << 1, 2, 1); + RADIOLIB_ASSERT(state); + + // set sync word bytes + this->mod->SPIwriteRegisterBurst(RADIOLIB_SI443X_REG_SYNC_WORD_3, syncWord, len); + + return(state); +} + +int16_t Si443x::setPreambleLength(uint8_t preambleLen) { + // Si443x configures preamble length in 4-bit nibbles + if(preambleLen % 4 != 0) { + return(RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH); + } + + // set default preamble length + uint8_t preLenNibbles = preambleLen / 4; + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_PREAMBLE_LENGTH, preLenNibbles); + RADIOLIB_ASSERT(state); + + // set default preamble detection threshold to 5/8 of preamble length (in units of 4 bits) + uint8_t preThreshold = 5*preLenNibbles / 8; + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_PREAMBLE_DET_CONTROL, preThreshold << 3, 7, 3)); +} + +size_t Si443x::getPacketLength(bool update) { + if(!this->packetLengthQueried && update) { + if (this->packetLengthConfig == RADIOLIB_SI443X_FIXED_PACKET_LENGTH_ON) { + this->packetLength = this->mod->SPIreadRegister(RADIOLIB_SI443X_REG_TRANSMIT_PACKET_LENGTH); + } else { + this->packetLength = this->mod->SPIreadRegister(RADIOLIB_SI443X_REG_RECEIVED_PACKET_LENGTH); + } + this->packetLengthQueried = true; + } + + return(this->packetLength); +} + +int16_t Si443x::setEncoding(uint8_t encoding) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set encoding + /// \todo - add inverted Manchester? + switch(encoding) { + case RADIOLIB_ENCODING_NRZ: + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1, RADIOLIB_SI443X_MANCHESTER_INVERTED_OFF | RADIOLIB_SI443X_MANCHESTER_OFF | RADIOLIB_SI443X_WHITENING_OFF, 2, 0)); + case RADIOLIB_ENCODING_MANCHESTER: + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1, RADIOLIB_SI443X_MANCHESTER_INVERTED_OFF | RADIOLIB_SI443X_MANCHESTER_ON | RADIOLIB_SI443X_WHITENING_OFF, 2, 0)); + case RADIOLIB_ENCODING_WHITENING: + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1, RADIOLIB_SI443X_MANCHESTER_INVERTED_OFF | RADIOLIB_SI443X_MANCHESTER_OFF | RADIOLIB_SI443X_WHITENING_ON, 2, 0)); + default: + return(RADIOLIB_ERR_INVALID_ENCODING); + } +} + +int16_t Si443x::setDataShaping(uint8_t sh) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set data shaping + switch(sh) { + case RADIOLIB_SHAPING_NONE: + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1, RADIOLIB_SI443X_MANCHESTER_INVERTED_OFF | RADIOLIB_SI443X_MANCHESTER_OFF | RADIOLIB_SI443X_WHITENING_OFF, 2, 0)); + case RADIOLIB_SHAPING_0_3: + return(RADIOLIB_ERR_INVALID_ENCODING); + case RADIOLIB_SHAPING_0_5: + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2, RADIOLIB_SI443X_MODULATION_GFSK, 1, 0)); + case RADIOLIB_SHAPING_1_0: + return(this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1, RADIOLIB_SI443X_MANCHESTER_INVERTED_OFF | RADIOLIB_SI443X_MANCHESTER_OFF | RADIOLIB_SI443X_WHITENING_ON, 2, 0)); + default: + return(RADIOLIB_ERR_INVALID_ENCODING); + } +} + +void Si443x::setRfSwitchPins(uint32_t rxEn, uint32_t txEn) { + this->mod->setRfSwitchPins(rxEn, txEn); +} + +void Si443x::setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]) { + this->mod->setRfSwitchTable(pins, table); +} + +uint8_t Si443x::randomByte() { + // set mode to Rx + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1, RADIOLIB_SI443X_RX_ON | RADIOLIB_SI443X_XTAL_ON); + + // wait a bit for the RSSI reading to stabilise + this->mod->hal->delay(10); + + // read RSSI value 8 times, always keep just the least significant bit + uint8_t randByte = 0x00; + for(uint8_t i = 0; i < 8; i++) { + randByte |= ((this->mod->SPIreadRegister(RADIOLIB_SI443X_REG_RSSI) & 0x01) << i); + } + + // set mode to standby + standby(); + + return(randByte); +} + +int16_t Si443x::getChipVersion() { + return(this->mod->SPIgetRegValue(RADIOLIB_SI443X_REG_DEVICE_VERSION)); +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +void Si443x::setDirectAction(void (*func)(void)) { + setIrqAction(func); +} + +void Si443x::readBit(uint32_t pin) { + updateDirectBuffer((uint8_t)this->mod->hal->digitalRead(pin)); +} +#endif + +int16_t Si443x::fixedPacketLengthMode(uint8_t len) { + return(Si443x::setPacketMode(RADIOLIB_SI443X_FIXED_PACKET_LENGTH_ON, len)); +} + +int16_t Si443x::variablePacketLengthMode(uint8_t maxLen) { + return(Si443x::setPacketMode(RADIOLIB_SI443X_FIXED_PACKET_LENGTH_OFF, maxLen)); +} + +int16_t Si443x::setFrequencyRaw(float newFreq) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // check high/low band + uint8_t bandSelect = RADIOLIB_SI443X_BAND_SELECT_LOW; + uint8_t freqBand = (newFreq / 10) - 24; + uint8_t afcLimiter = 80; + this->frequency = newFreq; + if(newFreq >= 480.0) { + bandSelect = RADIOLIB_SI443X_BAND_SELECT_HIGH; + freqBand = (newFreq / 20) - 24; + afcLimiter = 40; + } + + // calculate register values + uint16_t freqCarrier = ((newFreq / (10 * ((bandSelect >> 5) + 1))) - freqBand - 24) * (uint32_t)64000; + + // update registers + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_FREQUENCY_BAND_SELECT, bandSelect | freqBand, 5, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_1, (uint8_t)((freqCarrier & 0xFF00) >> 8)); + state |= this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_0, (uint8_t)(freqCarrier & 0xFF)); + state |= this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_AFC_LIMITER, afcLimiter); + + return(state); +} + +int16_t Si443x::setPacketMode(uint8_t mode, uint8_t len) { + // check packet length + if (len > RADIOLIB_SI443X_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set to fixed packet length + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_HEADER_CONTROL_2, mode, 3, 3); + RADIOLIB_ASSERT(state); + + // set length to register + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_TRANSMIT_PACKET_LENGTH, len); + RADIOLIB_ASSERT(state); + + // update cached value + this->packetLengthConfig = mode; + return(state); +} + +bool Si443x::findChip() { + uint8_t i = 0; + bool flagFound = false; + while((i < 10) && !flagFound) { + // reset the module + reset(); + + // check version register + uint8_t version = this->mod->SPIreadRegister(RADIOLIB_SI443X_REG_DEVICE_VERSION); + if(version == RADIOLIB_SI443X_DEVICE_VERSION) { + flagFound = true; + } else { + RADIOLIB_DEBUG_PRINTLN("Si443x not found! (%d of 10 tries) RADIOLIB_SI443X_REG_DEVICE_VERSION == 0x%02X, expected 0x0%X", i + 1, version, RADIOLIB_SI443X_DEVICE_VERSION); + this->mod->hal->delay(10); + i++; + } + } + + return(flagFound); +} + +void Si443x::clearIRQFlags() { + uint8_t buff[2]; + this->mod->SPIreadRegisterBurst(RADIOLIB_SI443X_REG_INTERRUPT_STATUS_1, 2, buff); +} + +void Si443x::clearFIFO(size_t count) { + while(count) { + this->mod->SPIreadRegister(RADIOLIB_SI443X_REG_FIFO_ACCESS); + count--; + } +} + +int16_t Si443x::config() { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // disable POR and chip ready interrupts + this->mod->SPIwriteRegister(RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2, 0x00); + + // enable AGC + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_AGC_OVERRIDE_1, RADIOLIB_SI443X_AGC_GAIN_INCREASE_ON | RADIOLIB_SI443X_AGC_ON, 6, 5); + RADIOLIB_ASSERT(state); + + // disable packet header + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_HEADER_CONTROL_2, RADIOLIB_SI443X_SYNC_WORD_TIMEOUT_OFF | RADIOLIB_SI443X_HEADER_LENGTH_HEADER_NONE, 7, 4); + RADIOLIB_ASSERT(state); + + // set antenna switching + this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_GPIO0_CONFIG, RADIOLIB_SI443X_GPIOX_TX_STATE_OUT, 4, 0); + this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_GPIO1_CONFIG, RADIOLIB_SI443X_GPIOX_RX_STATE_OUT, 4, 0); + + // disable packet header checking + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_HEADER_CONTROL_1, RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_NONE | RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_NONE); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t Si443x::updateClockRecovery() { + // get the parameters + uint8_t bypass = this->mod->SPIgetRegValue(RADIOLIB_SI443X_REG_IF_FILTER_BANDWIDTH, 7, 7) >> 7; + uint8_t decRate = this->mod->SPIgetRegValue(RADIOLIB_SI443X_REG_IF_FILTER_BANDWIDTH, 6, 4) >> 4; + uint8_t manch = this->mod->SPIgetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1, 1, 1) >> 1; + + // calculate oversampling ratio, NCO offset and clock recovery gain + int8_t ndecExp = (int8_t)decRate - 3; + float ndec = 0; + if(ndecExp > 0) { + ndec = (uint16_t)1 << ndecExp; + } else { + ndecExp *= -1; + ndec = 1.0/(float)((uint16_t)1 << ndecExp); + } + float rxOsr = ((float)(500 * (1 + 2*bypass))) / (ndec * this->bitRate * ((float)(1 + manch))); + uint32_t ncoOff = (this->bitRate * (1 + manch) * ((uint32_t)(1) << (20 + decRate))) / (500 * (1 + 2*bypass)); + uint16_t crGain = 2 + (((float)(65536.0 * (1 + manch)) * this->bitRate) / (rxOsr * (this->frequencyDev / 0.625))); + uint16_t rxOsr_fixed = (uint16_t)rxOsr; + + // print that whole mess + RADIOLIB_DEBUG_PRINTLN("%X\n%X\n%X", bypass, decRate, manch); + RADIOLIB_DEBUG_PRINT_FLOAT(rxOsr, 2); + RADIOLIB_DEBUG_PRINTLN("\t%d\t%X\n%lu\t%lX\n%d\t%X", rxOsr_fixed, rxOsr_fixed, ncoOff, ncoOff, crGain, crGain); + + // update oversampling ratio + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_2, (uint8_t)((rxOsr_fixed & 0x0700) >> 3), 7, 5); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_CLOCK_REC_OVERSAMP_RATIO, (uint8_t)(rxOsr_fixed & 0x00FF)); + RADIOLIB_ASSERT(state); + + // update NCO offset + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_2, (uint8_t)((ncoOff & 0x0F0000) >> 16), 3, 0); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_1, (uint8_t)((ncoOff & 0x00FF00) >> 8)); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_0, (uint8_t)(ncoOff & 0x0000FF)); + RADIOLIB_ASSERT(state); + + // update clock recovery loop gain + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_1, (uint8_t)((crGain & 0x0700) >> 8), 2, 0); + RADIOLIB_ASSERT(state); + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_0, (uint8_t)(crGain & 0x00FF)); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t Si443x::directMode() { + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2, RADIOLIB_SI443X_TX_DATA_SOURCE_GPIO, 5, 4); + RADIOLIB_ASSERT(state); + + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_GPIO1_CONFIG, RADIOLIB_SI443X_GPIOX_TX_RX_DATA_CLK_OUT, 4, 0); + RADIOLIB_ASSERT(state); + + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_GPIO2_CONFIG, RADIOLIB_SI443X_GPIOX_TX_DATA_IN, 4, 0); + RADIOLIB_ASSERT(state); + + state = this->mod->SPIsetRegValue(RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2, RADIOLIB_SI443X_MODULATION_FSK, 1, 0); + return(state); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si443x.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si443x.h new file mode 100644 index 00000000..463b6851 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/Si443x/Si443x.h @@ -0,0 +1,861 @@ +#if !defined(_RADIOLIB_SI443X_H) +#define _RADIOLIB_SI443X_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SI443X) + +#include "../../Module.h" + +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" + +// Si443x physical layer properties +#define RADIOLIB_SI443X_FREQUENCY_STEP_SIZE 156.25 +#define RADIOLIB_SI443X_MAX_PACKET_LENGTH 64 + +// Si443x series common registers +#define RADIOLIB_SI443X_REG_DEVICE_TYPE 0x00 +#define RADIOLIB_SI443X_REG_DEVICE_VERSION 0x01 +#define RADIOLIB_SI443X_REG_DEVICE_STATUS 0x02 +#define RADIOLIB_SI443X_REG_INTERRUPT_STATUS_1 0x03 +#define RADIOLIB_SI443X_REG_INTERRUPT_STATUS_2 0x04 +#define RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1 0x05 +#define RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2 0x06 +#define RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1 0x07 +#define RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_2 0x08 +#define RADIOLIB_SI443X_REG_XOSC_LOAD_CAPACITANCE 0x09 +#define RADIOLIB_SI443X_REG_MCU_OUTPUT_CLOCK 0x0A +#define RADIOLIB_SI443X_REG_GPIO0_CONFIG 0x0B +#define RADIOLIB_SI443X_REG_GPIO1_CONFIG 0x0C +#define RADIOLIB_SI443X_REG_GPIO2_CONFIG 0x0D +#define RADIOLIB_SI443X_REG_IO_PORT_CONFIG 0x0E +#define RADIOLIB_SI443X_REG_ADC_CONFIG 0x0F +#define RADIOLIB_SI443X_REG_ADC_SENSOR_AMP_OFFSET 0x10 +#define RADIOLIB_SI443X_REG_ADC_VALUE 0x11 +#define RADIOLIB_SI443X_REG_TEMP_SENSOR_CONTROL 0x12 +#define RADIOLIB_SI443X_REG_TEMP_VALUE_OFFSET 0x13 +#define RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_1 0x14 +#define RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_2 0x15 +#define RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_3 0x16 +#define RADIOLIB_SI443X_REG_WAKEUP_TIMER_VALUE_1 0x17 +#define RADIOLIB_SI443X_REG_WAKEUP_TIMER_VALUE_2 0x18 +#define RADIOLIB_SI443X_REG_LOW_DC_MODE_DURATION 0x19 +#define RADIOLIB_SI443X_REG_LOW_BATT_DET_THRESHOLD 0x1A +#define RADIOLIB_SI443X_REG_BATT_VOLTAGE_LEVEL 0x1B +#define RADIOLIB_SI443X_REG_IF_FILTER_BANDWIDTH 0x1C +#define RADIOLIB_SI443X_REG_AFC_LOOP_GEARSHIFT_OVERRIDE 0x1D +#define RADIOLIB_SI443X_REG_AFC_TIMING_CONTROL 0x1E +#define RADIOLIB_SI443X_REG_CLOCK_REC_GEARSHIFT_OVERRIDE 0x1F +#define RADIOLIB_SI443X_REG_CLOCK_REC_OVERSAMP_RATIO 0x20 +#define RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_2 0x21 +#define RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_1 0x22 +#define RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_0 0x23 +#define RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_1 0x24 +#define RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_0 0x25 +#define RADIOLIB_SI443X_REG_RSSI 0x26 +#define RADIOLIB_SI443X_REG_RSSI_CLEAR_CHANNEL_THRESHOLD 0x27 +#define RADIOLIB_SI443X_REG_ANTENNA_DIVERSITY_1 0x28 +#define RADIOLIB_SI443X_REG_ANTENNA_DIVERSITY_2 0x29 +#define RADIOLIB_SI443X_REG_AFC_LIMITER 0x2A +#define RADIOLIB_SI443X_REG_AFC_CORRECTION 0x2B +#define RADIOLIB_SI443X_REG_OOK_COUNTER_1 0x2C +#define RADIOLIB_SI443X_REG_OOK_COUNTER_2 0x2D +#define RADIOLIB_SI443X_REG_SLICER_PEAK_HOLD 0x2E +#define RADIOLIB_SI443X_REG_DATA_ACCESS_CONTROL 0x30 +#define RADIOLIB_SI443X_REG_EZMAC_STATUS 0x31 +#define RADIOLIB_SI443X_REG_HEADER_CONTROL_1 0x32 +#define RADIOLIB_SI443X_REG_HEADER_CONTROL_2 0x33 +#define RADIOLIB_SI443X_REG_PREAMBLE_LENGTH 0x34 +#define RADIOLIB_SI443X_REG_PREAMBLE_DET_CONTROL 0x35 +#define RADIOLIB_SI443X_REG_SYNC_WORD_3 0x36 +#define RADIOLIB_SI443X_REG_SYNC_WORD_2 0x37 +#define RADIOLIB_SI443X_REG_SYNC_WORD_1 0x38 +#define RADIOLIB_SI443X_REG_SYNC_WORD_0 0x39 +#define RADIOLIB_SI443X_REG_TRANSMIT_HEADER_3 0x3A +#define RADIOLIB_SI443X_REG_TRANSMIT_HEADER_2 0x3B +#define RADIOLIB_SI443X_REG_TRANSMIT_HEADER_1 0x3C +#define RADIOLIB_SI443X_REG_TRANSMIT_HEADER_0 0x3D +#define RADIOLIB_SI443X_REG_TRANSMIT_PACKET_LENGTH 0x3E +#define RADIOLIB_SI443X_REG_CHECK_HEADER_3 0x3F +#define RADIOLIB_SI443X_REG_CHECK_HEADER_2 0x40 +#define RADIOLIB_SI443X_REG_CHECK_HEADER_1 0x41 +#define RADIOLIB_SI443X_REG_CHECK_HEADER_0 0x42 +#define RADIOLIB_SI443X_REG_HEADER_ENABLE_3 0x43 +#define RADIOLIB_SI443X_REG_HEADER_ENABLE_2 0x44 +#define RADIOLIB_SI443X_REG_HEADER_ENABLE_1 0x45 +#define RADIOLIB_SI443X_REG_HEADER_ENABLE_0 0x46 +#define RADIOLIB_SI443X_REG_RECEIVED_HEADER_3 0x47 +#define RADIOLIB_SI443X_REG_RECEIVED_HEADER_2 0x48 +#define RADIOLIB_SI443X_REG_RECEIVED_HEADER_1 0x49 +#define RADIOLIB_SI443X_REG_RECEIVED_HEADER_0 0x4A +#define RADIOLIB_SI443X_REG_RECEIVED_PACKET_LENGTH 0x4B +#define RADIOLIB_SI443X_REG_ADC8_CONTROL 0x4F +#define RADIOLIB_SI443X_REG_CHANNEL_FILTER_COEFF 0x60 +#define RADIOLIB_SI443X_REG_XOSC_CONTROL_TEST 0x62 +#define RADIOLIB_SI443X_REG_AGC_OVERRIDE_1 0x69 +#define RADIOLIB_SI443X_REG_TX_POWER 0x6D +#define RADIOLIB_SI443X_REG_TX_DATA_RATE_1 0x6E +#define RADIOLIB_SI443X_REG_TX_DATA_RATE_0 0x6F +#define RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1 0x70 +#define RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2 0x71 +#define RADIOLIB_SI443X_REG_FREQUENCY_DEVIATION 0x72 +#define RADIOLIB_SI443X_REG_FREQUENCY_OFFSET_1 0x73 +#define RADIOLIB_SI443X_REG_FREQUENCY_OFFSET_2 0x74 +#define RADIOLIB_SI443X_REG_FREQUENCY_BAND_SELECT 0x75 +#define RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_1 0x76 +#define RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_0 0x77 +#define RADIOLIB_SI443X_REG_FREQUENCY_HOPPING_CHANNEL_SEL 0x79 +#define RADIOLIB_SI443X_REG_FREQUENCY_HOPPING_STEP_SIZE 0x7A +#define RADIOLIB_SI443X_REG_TX_FIFO_CONTROL_1 0x7C +#define RADIOLIB_SI443X_REG_TX_FIFO_CONTROL_2 0x7D +#define RADIOLIB_SI443X_REG_RX_FIFO_CONTROL 0x7E +#define RADIOLIB_SI443X_REG_FIFO_ACCESS 0x7F + +// RADIOLIB_SI443X_REG_DEVICE_TYPE MSB LSB DESCRIPTION +#define RADIOLIB_SI443X_DEVICE_TYPE 0x08 // 4 0 device identification register + +// RADIOLIB_SI443X_REG_DEVICE_VERSION +#define RADIOLIB_SI443X_DEVICE_VERSION 0x06 // 4 0 chip version register + +// RADIOLIB_SI443X_REG_DEVICE_STATUS +#define RADIOLIB_SI443X_RX_TX_FIFO_OVERFLOW 0b10000000 // 7 7 Rx/Tx FIFO overflow flag +#define RADIOLIB_SI443X_RX_TX_FIFO_UNDERFLOW 0b01000000 // 6 6 Rx/Tx FIFO underflow flag +#define RADIOLIB_SI443X_RX_FIFO_EMPTY 0b00100000 // 5 5 Rx FIFO empty flag +#define RADIOLIB_SI443X_HEADER_ERROR 0b00010000 // 4 4 header error flag +#define RADIOLIB_SI443X_FREQUENCY_ERROR 0b00001000 // 3 3 frequency error flag (frequency outside allowed range) +#define RADIOLIB_SI443X_TX 0b00000010 // 1 0 power state: Tx +#define RADIOLIB_SI443X_RX 0b00000001 // 1 0 Rx +#define RADIOLIB_SI443X_IDLE 0b00000000 // 1 0 idle + +// RADIOLIB_SI443X_REG_INTERRUPT_STATUS_1 +#define RADIOLIB_SI443X_FIFO_LEVEL_ERROR_INTERRUPT 0b10000000 // 7 7 Tx/Rx FIFO overflow or underflow +#define RADIOLIB_SI443X_TX_FIFO_ALMOST_FULL_INTERRUPT 0b01000000 // 6 6 Tx FIFO almost full +#define RADIOLIB_SI443X_TX_FIFO_ALMOST_EMPTY_INTERRUPT 0b00100000 // 5 5 Tx FIFO almost empty +#define RADIOLIB_SI443X_RX_FIFO_ALMOST_FULL_INTERRUPT 0b00010000 // 4 4 Rx FIFO almost full +#define RADIOLIB_SI443X_EXTERNAL_INTERRUPT 0b00001000 // 3 3 external interrupt occurred on GPIOx +#define RADIOLIB_SI443X_PACKET_SENT_INTERRUPT 0b00000100 // 2 2 packet transmission done +#define RADIOLIB_SI443X_VALID_PACKET_RECEIVED_INTERRUPT 0b00000010 // 1 1 valid packet has been received +#define RADIOLIB_SI443X_CRC_ERROR_INTERRUPT 0b00000001 // 0 0 CRC failed + +// RADIOLIB_SI443X_REG_INTERRUPT_STATUS_2 +#define RADIOLIB_SI443X_SYNC_WORD_DETECTED_INTERRUPT 0b10000000 // 7 7 sync word has been detected +#define RADIOLIB_SI443X_VALID_RADIOLIB_PREAMBLE_DETECTED_INTERRUPT 0b01000000 // 6 6 valid preamble has been detected +#define RADIOLIB_SI443X_INVALID_RADIOLIB_PREAMBLE_DETECTED_INTERRUPT 0b00100000 // 5 5 invalid preamble has been detected +#define RADIOLIB_SI443X_RSSI_INTERRUPT 0b00010000 // 4 4 RSSI exceeded programmed threshold +#define RADIOLIB_SI443X_WAKEUP_TIMER_INTERRUPT 0b00001000 // 3 3 wake-up timer expired +#define RADIOLIB_SI443X_LOW_BATTERY_INTERRUPT 0b00000100 // 2 2 low battery detected +#define RADIOLIB_SI443X_CHIP_READY_INTERRUPT 0b00000010 // 1 1 chip ready event detected +#define RADIOLIB_SI443X_POWER_ON_RESET_INTERRUPT 0b00000001 // 0 0 power-on-reset detected + +// RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1 +#define RADIOLIB_SI443X_FIFO_LEVEL_ERROR_ENABLED 0b10000000 // 7 7 Tx/Rx FIFO overflow or underflow interrupt enabled +#define RADIOLIB_SI443X_TX_FIFO_ALMOST_FULL_ENABLED 0b01000000 // 6 6 Tx FIFO almost full interrupt enabled +#define RADIOLIB_SI443X_TX_FIFO_ALMOST_EMPTY_ENABLED 0b00100000 // 5 5 Tx FIFO almost empty interrupt enabled +#define RADIOLIB_SI443X_RX_FIFO_ALMOST_FULL_ENABLED 0b00010000 // 4 4 Rx FIFO almost full interrupt enabled +#define RADIOLIB_SI443X_EXTERNAL_ENABLED 0b00001000 // 3 3 external interrupt interrupt enabled +#define RADIOLIB_SI443X_PACKET_SENT_ENABLED 0b00000100 // 2 2 packet transmission done interrupt enabled +#define RADIOLIB_SI443X_VALID_PACKET_RECEIVED_ENABLED 0b00000010 // 1 1 valid packet received interrupt enabled +#define RADIOLIB_SI443X_CRC_ERROR_ENABLED 0b00000001 // 0 0 CRC failed interrupt enabled + +// RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2 +#define RADIOLIB_SI443X_SYNC_WORD_DETECTED_ENABLED 0b10000000 // 7 7 sync word interrupt enabled +#define RADIOLIB_SI443X_VALID_RADIOLIB_PREAMBLE_DETECTED_ENABLED 0b01000000 // 6 6 valid preamble interrupt enabled +#define RADIOLIB_SI443X_INVALID_RADIOLIB_PREAMBLE_DETECTED_ENABLED 0b00100000 // 5 5 invalid preamble interrupt enabled +#define RADIOLIB_SI443X_RSSI_ENABLED 0b00010000 // 4 4 RSSI exceeded programmed threshold interrupt enabled +#define RADIOLIB_SI443X_WAKEUP_TIMER_ENABLED 0b00001000 // 3 3 wake-up timer interrupt enabled +#define RADIOLIB_SI443X_LOW_BATTERY_ENABLED 0b00000100 // 2 2 low battery interrupt enabled +#define RADIOLIB_SI443X_CHIP_READY_ENABLED 0b00000010 // 1 1 chip ready event interrupt enabled +#define RADIOLIB_SI443X_POWER_ON_RESET_ENABLED 0b00000001 // 0 0 power-on-reset interrupt enabled + +// RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1 +#define RADIOLIB_SI443X_SOFTWARE_RESET 0b10000000 // 7 7 reset all registers to default values +#define RADIOLIB_SI443X_ENABLE_LOW_BATTERY_DETECT 0b01000000 // 6 6 enable low battery detection +#define RADIOLIB_SI443X_ENABLE_WAKEUP_TIMER 0b00100000 // 5 5 enable wakeup timer +#define RADIOLIB_SI443X_32_KHZ_RC 0b00000000 // 4 4 32.768 kHz source: RC oscillator (default) +#define RADIOLIB_SI443X_32_KHZ_XOSC 0b00010000 // 4 4 crystal oscillator +#define RADIOLIB_SI443X_TX_ON 0b00001000 // 3 3 Tx on in manual transmit mode +#define RADIOLIB_SI443X_RX_ON 0b00000100 // 2 2 Rx on in manual receive mode +#define RADIOLIB_SI443X_PLL_ON 0b00000010 // 1 1 PLL on (tune mode) +#define RADIOLIB_SI443X_XTAL_OFF 0b00000000 // 0 0 crystal oscillator: off (standby mode) +#define RADIOLIB_SI443X_XTAL_ON 0b00000001 // 0 0 on (ready mode) + +// RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_2 +#define RADIOLIB_SI443X_ANT_DIV_TR_HL_IDLE_L 0b00000000 // 7 5 GPIO1/2 states: Tx/Rx GPIO1 H, GPIO2 L; idle low (default) +#define RADIOLIB_SI443X_ANT_DIV_TR_LH_IDLE_L 0b00100000 // 7 5 Tx/Rx GPIO1 L, GPIO2 H; idle low +#define RADIOLIB_SI443X_ANT_DIV_TR_HL_IDLE_H 0b01000000 // 7 5 Tx/Rx GPIO1 H, GPIO2 L; idle high +#define RADIOLIB_SI443X_ANT_DIV_TR_LH_IDLE_H 0b01100000 // 7 5 Tx/Rx GPIO1 L, GPIO2 H; idle high +#define RADIOLIB_SI443X_ANT_DIV_TR_ALG_IDLE_L 0b10000000 // 7 5 Tx/Rx diversity algorithm; idle low +#define RADIOLIB_SI443X_ANT_DIV_TR_ALG_IDLE_H 0b10100000 // 7 5 Tx/Rx diversity algorithm; idle high +#define RADIOLIB_SI443X_ANT_DIV_TR_ALG_BEACON_IDLE_L 0b11000000 // 7 5 Tx/Rx diversity algorithm (beacon); idle low +#define RADIOLIB_SI443X_ANT_DIV_TR_ALG_BEACON_IDLE_H 0b11100000 // 7 5 Tx/Rx diversity algorithm (beacon); idle high +#define RADIOLIB_SI443X_RX_MULTIPACKET_OFF 0b00000000 // 4 4 Rx multipacket: disabled (default) +#define RADIOLIB_SI443X_RX_MULTIPACKET_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_SI443X_AUTO_TX_OFF 0b00000000 // 3 3 Tx autotransmit on FIFO almost full: disabled (default) +#define RADIOLIB_SI443X_AUTO_TX_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_SI443X_LOW_DUTY_CYCLE_OFF 0b00000000 // 2 2 low duty cycle mode: disabled (default) +#define RADIOLIB_SI443X_LOW_DUTY_CYCLE_ON 0b00000100 // 2 2 enabled +#define RADIOLIB_SI443X_RX_FIFO_RESET 0b00000010 // 1 1 Rx FIFO reset/clear: reset (call first) +#define RADIOLIB_SI443X_RX_FIFO_CLEAR 0b00000000 // 1 1 clear (call second) +#define RADIOLIB_SI443X_TX_FIFO_RESET 0b00000001 // 0 0 Tx FIFO reset/clear: reset (call first) +#define RADIOLIB_SI443X_TX_FIFO_CLEAR 0b00000000 // 0 0 clear (call second) + +// RADIOLIB_SI443X_REG_XOSC_LOAD_CAPACITANCE +#define RADIOLIB_SI443X_XTAL_SHIFT 0b00000000 // 7 7 crystal capacitance configuration: +#define RADIOLIB_SI443X_XTAL_LOAD_CAPACITANCE 0b01111111 // 6 0 C_int = 1.8 pF + 0.085 pF * RADIOLIB_SI443X_XTAL_LOAD_CAPACITANCE + 3.7 pF * RADIOLIB_SI443X_XTAL_SHIFT + +// RADIOLIB_SI443X_REG_MCU_OUTPUT_CLOCK +#define RADIOLIB_SI443X_CLOCK_TAIL_CYCLES_OFF 0b00000000 // 5 4 additional clock cycles: none (default) +#define RADIOLIB_SI443X_CLOCK_TAIL_CYCLES_128 0b00010000 // 5 4 128 +#define RADIOLIB_SI443X_CLOCK_TAIL_CYCLES_256 0b00100000 // 5 4 256 +#define RADIOLIB_SI443X_CLOCK_TAIL_CYCLES_512 0b00110000 // 5 4 512 +#define RADIOLIB_SI443X_LOW_FREQ_CLOCK_OFF 0b00000000 // 3 3 32.768 kHz clock output: disabled (default) +#define RADIOLIB_SI443X_LOW_FREQ_CLOCK_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_SI443X_MCU_CLOCK_30_MHZ 0b00000000 // 2 0 GPIO clock output: 30 MHz +#define RADIOLIB_SI443X_MCU_CLOCK_15_MHZ 0b00000001 // 2 0 15 MHz +#define RADIOLIB_SI443X_MCU_CLOCK_10_MHZ 0b00000010 // 2 0 10 MHz +#define RADIOLIB_SI443X_MCU_CLOCK_4_MHZ 0b00000011 // 2 0 4 MHz +#define RADIOLIB_SI443X_MCU_CLOCK_3_MHZ 0b00000100 // 2 0 3 MHz +#define RADIOLIB_SI443X_MCU_CLOCK_2_MHZ 0b00000101 // 2 0 2 MHz +#define RADIOLIB_SI443X_MCU_CLOCK_1_MHZ 0b00000110 // 2 0 1 MHz (default) +#define RADIOLIB_SI443X_MCU_CLOCK_32_KHZ 0b00000111 // 2 0 32.768 kHz + +// RADIOLIB_SI443X_REG_GPIO0_CONFIG + RADIOLIB_SI443X_REG_GPIO1_CONFIG + RADIOLIB_SI443X_REG_GPIO2_CONFIG +#define RADIOLIB_SI443X_GPIOX_DRIVE_STRENGTH 0b00000000 // 7 6 GPIOx drive strength (higher number = stronger drive) +#define RADIOLIB_SI443X_GPIOX_PULLUP_OFF 0b00000000 // 5 5 GPIOx internal 200k pullup: disabled (default) +#define RADIOLIB_SI443X_GPIOX_PULLUP_ON 0b00100000 // 5 5 enabled +#define RADIOLIB_SI443X_GPIO0_POWER_ON_RESET_OUT 0b00000000 // 4 0 GPIOx function: power-on-reset output (GPIO0 only, default) +#define RADIOLIB_SI443X_GPIO1_POWER_ON_RESET_INV_OUT 0b00000000 // 4 0 inverted power-on-reset output (GPIO1 only, default) +#define RADIOLIB_SI443X_GPIO2_MCU_CLOCK_OUT 0b00000000 // 4 0 MCU clock output (GPIO2 only, default) +#define RADIOLIB_SI443X_GPIOX_WAKEUP_OUT 0b00000001 // 4 0 wakeup timer expired output +#define RADIOLIB_SI443X_GPIOX_LOW_BATTERY_OUT 0b00000010 // 4 0 low battery detect output +#define RADIOLIB_SI443X_GPIOX_DIGITAL_OUT 0b00000011 // 4 0 direct digital output +#define RADIOLIB_SI443X_GPIOX_EXT_INT_FALLING_IN 0b00000100 // 4 0 external interrupt, falling edge +#define RADIOLIB_SI443X_GPIOX_EXT_INT_RISING_IN 0b00000101 // 4 0 external interrupt, rising edge +#define RADIOLIB_SI443X_GPIOX_EXT_INT_CHANGE_IN 0b00000110 // 4 0 external interrupt, state change +#define RADIOLIB_SI443X_GPIOX_ADC_IN 0b00000111 // 4 0 ADC analog input +#define RADIOLIB_SI443X_GPIOX_ANALOG_TEST_N_IN 0b00001000 // 4 0 analog test N input +#define RADIOLIB_SI443X_GPIOX_ANALOG_TEST_P_IN 0b00001001 // 4 0 analog test P input +#define RADIOLIB_SI443X_GPIOX_DIGITAL_IN 0b00001010 // 4 0 direct digital input +#define RADIOLIB_SI443X_GPIOX_DIGITAL_TEST_OUT 0b00001011 // 4 0 digital test output +#define RADIOLIB_SI443X_GPIOX_ANALOG_TEST_N_OUT 0b00001100 // 4 0 analog test N output +#define RADIOLIB_SI443X_GPIOX_ANALOG_TEST_P_OUT 0b00001101 // 4 0 analog test P output +#define RADIOLIB_SI443X_GPIOX_REFERENCE_VOLTAGE_OUT 0b00001110 // 4 0 reference voltage output +#define RADIOLIB_SI443X_GPIOX_TX_RX_DATA_CLK_OUT 0b00001111 // 4 0 Tx/Rx clock output in direct mode +#define RADIOLIB_SI443X_GPIOX_TX_DATA_IN 0b00010000 // 4 0 Tx data input direct mode +#define RADIOLIB_SI443X_GPIOX_EXT_RETRANSMIT_REQUEST_IN 0b00010001 // 4 0 external retransmission request input +#define RADIOLIB_SI443X_GPIOX_TX_STATE_OUT 0b00010010 // 4 0 Tx state output +#define RADIOLIB_SI443X_GPIOX_TX_FIFO_ALMOST_FULL_OUT 0b00010011 // 4 0 Tx FIFO almost full output +#define RADIOLIB_SI443X_GPIOX_RX_DATA_OUT 0b00010100 // 4 0 Rx data output +#define RADIOLIB_SI443X_GPIOX_RX_STATE_OUT 0b00010101 // 4 0 Rx state output +#define RADIOLIB_SI443X_GPIOX_RX_FIFO_ALMOST_FULL_OUT 0b00010110 // 4 0 Rx FIFO almost full output +#define RADIOLIB_SI443X_GPIOX_ANT_DIV_1_OUT 0b00010111 // 4 0 antenna diversity output 1 +#define RADIOLIB_SI443X_GPIOX_ANT_DIV_2_OUT 0b00011000 // 4 0 antenna diversity output 2 +#define RADIOLIB_SI443X_GPIOX_VALID_PREAMBLE_OUT 0b00011001 // 4 0 valid preamble detected output +#define RADIOLIB_SI443X_GPIOX_INVALID_PREAMBLE_OUT 0b00011010 // 4 0 invalid preamble detected output +#define RADIOLIB_SI443X_GPIOX_SYNC_WORD_DETECTED_OUT 0b00011011 // 4 0 sync word detected output +#define RADIOLIB_SI443X_GPIOX_CLEAR_CHANNEL_OUT 0b00011100 // 4 0 clear channel assessment output +#define RADIOLIB_SI443X_GPIOX_VDD 0b00011101 // 4 0 VDD +#define RADIOLIB_SI443X_GPIOX_GND 0b00011110 // 4 0 GND + +// RADIOLIB_SI443X_REG_IO_PORT_CONFIG +#define RADIOLIB_SI443X_GPIO2_EXT_INT_STATE_MASK 0b01000000 // 6 6 external interrupt state mask for: GPIO2 +#define RADIOLIB_SI443X_GPIO1_EXT_INT_STATE_MASK 0b00100000 // 5 5 GPIO1 +#define RADIOLIB_SI443X_GPIO0_EXT_INT_STATE_MASK 0b00010000 // 4 4 GPIO0 +#define RADIOLIB_SI443X_IRQ_BY_SDO_OFF 0b00000000 // 3 3 output IRQ state on SDO pin: disabled (default) +#define RADIOLIB_SI443X_IRQ_BY_SDO_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_SI443X_GPIO2_DIGITAL_STATE_MASK 0b00000100 // 2 2 digital state mask for: GPIO2 +#define RADIOLIB_SI443X_GPIO1_DIGITAL_STATE_MASK 0b00000010 // 1 1 GPIO1 +#define RADIOLIB_SI443X_GPIO0_DIGITAL_STATE_MASK 0b00000001 // 0 0 GPIO0 + +// RADIOLIB_SI443X_REG_ADC_CONFIG +#define RADIOLIB_SI443X_ADC_START 0b10000000 // 7 7 ADC control: start measurement +#define RADIOLIB_SI443X_ADC_RUNNING 0b00000000 // 7 7 measurement in progress +#define RADIOLIB_SI443X_ADC_DONE 0b10000000 // 7 7 done +#define RADIOLIB_SI443X_ADC_SOURCE_TEMPERATURE 0b00000000 // 6 4 ADC source: internal temperature sensor (default) +#define RADIOLIB_SI443X_ADC_SOURCE_GPIO0_SINGLE 0b00010000 // 6 4 single-ended on GPIO0 +#define RADIOLIB_SI443X_ADC_SOURCE_GPIO1_SINGLE 0b00100000 // 6 4 single-ended on GPIO1 +#define RADIOLIB_SI443X_ADC_SOURCE_GPIO2_SINGLE 0b00110000 // 6 4 single-ended on GPIO2 +#define RADIOLIB_SI443X_ADC_SOURCE_GPIO01_DIFF 0b01000000 // 6 4 differential on GPIO0 (+) and GPIO1 (-) +#define RADIOLIB_SI443X_ADC_SOURCE_GPIO12_DIFF 0b01010000 // 6 4 differential on GPIO1 (+) and GPIO2 (-) +#define RADIOLIB_SI443X_ADC_SOURCE_GPIO02_DIFF 0b01100000 // 6 4 differential on GPIO0 (+) and GPIO2 (-) +#define RADIOLIB_SI443X_ADC_SOURCE_GND 0b01110000 // 6 4 GND +#define RADIOLIB_SI443X_ADC_REFERNCE_BAND_GAP 0b00000000 // 3 2 ADC reference: internal bandgap 1.2 V (default) +#define RADIOLIB_SI443X_ADC_REFERNCE_VDD_3 0b00001000 // 3 2 VDD/3 +#define RADIOLIB_SI443X_ADC_REFERNCE_VDD_2 0b00001100 // 3 2 VDD/2 +#define RADIOLIB_SI443X_ADC_GAIN 0b00000000 // 1 0 ADC amplifier gain + +// RADIOLIB_SI443X_REG_ADC_SENSOR_AMP_OFFSET +#define RADIOLIB_SI443X_ADC_OFFSET 0b00000000 // 3 0 ADC offset + +// RADIOLIB_SI443X_REG_TEMP_SENSOR_CONTROL +#define RADIOLIB_SI443X_TEMP_SENSOR_RANGE_64_TO_64_C 0b00000000 // 7 6 temperature sensor range: -64 to 64 deg. C, 0.5 deg. C resolution (default) +#define RADIOLIB_SI443X_TEMP_SENSOR_RANGE_64_TO_192_C 0b01000000 // 7 6 -64 to 192 deg. C, 1.0 deg. C resolution +#define RADIOLIB_SI443X_TEMP_SENSOR_RANGE_0_TO_128_C 0b11000000 // 7 6 0 to 128 deg. C, 0.5 deg. C resolution +#define RADIOLIB_SI443X_TEMP_SENSOR_RANGE_40_TO_216_F 0b10000000 // 7 6 -40 to 216 deg. F, 1.0 deg. F resolution +#define RADIOLIB_SI443X_TEMP_SENSOR_KELVIN_TO_CELSIUS_OFF 0b00000000 // 5 5 Kelvin to Celsius offset: disabled +#define RADIOLIB_SI443X_TEMP_SENSOR_KELVIN_TO_CELSIUS_ON 0b00100000 // 5 5 enabled (default) +#define RADIOLIB_SI443X_TEMP_SENSOR_TRIM_OFF 0b00000000 // 4 4 temperature sensor trim: disabled (default) +#define RADIOLIB_SI443X_TEMP_SENSOR_TRIM_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_SI443X_TEMP_SENSOR_TRIM_VALUE 0b00000000 // 3 0 temperature sensor trim value + +// RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_1 +#define RADIOLIB_SI443X_WAKEUP_TIMER_EXPONENT 0b00000011 // 4 0 wakeup timer value exponent + +// RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_2 + RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_3 +#define RADIOLIB_SI443X_WAKEUP_TIMER_MANTISSA_MSB 0x00 // 7 0 wakeup timer value: +#define RADIOLIB_SI443X_WAKEUP_TIMER_MANTISSA_LSB 0x01 // 7 0 T = (4 * RADIOLIB_SI443X_WAKEUP_TIMER_MANTISSA * 2 ^ RADIOLIB_SI443X_WAKEUP_TIMER_EXPONENT) / 32.768 ms + +// RADIOLIB_SI443X_REG_LOW_DC_MODE_DURATION +#define RADIOLIB_SI443X_LOW_DC_MODE_DURATION_MANTISSA 0x01 // 7 0 low duty cycle mode duration: T = (4 * RADIOLIB_SI443X_LOW_DC_MODE_DURATION_MANTISSA * 2 ^ RADIOLIB_SI443X_WAKEUP_TIMER_EXPONENT) / 32.768 ms + +// RADIOLIB_SI443X_REG_LOW_BATT_DET_THRESHOLD +#define RADIOLIB_SI443X_LOW_BATT_DET_THRESHOLD 0b00010100 // 4 0 low battery detection threshold: Vth = 1.7 + RADIOLIB_SI443X_LOW_BATT_DET_THRESHOLD * 0.05 V (defaults to 2.7 V) + +// RADIOLIB_SI443X_REG_IF_FILTER_BANDWIDTH +#define RADIOLIB_SI443X_BYPASS_DEC_BY_3_OFF 0b00000000 // 7 7 bypass decimate-by-3 stage: disabled (default) +#define RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON 0b10000000 // 7 7 enabled +#define RADIOLIB_SI443X_IF_FILTER_DEC_RATE 0b00000000 // 6 4 IF filter decimation rate +#define RADIOLIB_SI443X_IF_FILTER_COEFF_SET 0b00000001 // 3 0 IF filter coefficient set selection + +// RADIOLIB_SI443X_REG_AFC_LOOP_GEARSHIFT_OVERRIDE +#define RADIOLIB_SI443X_AFC_WIDEBAND_OFF 0b00000000 // 7 7 AFC wideband: disabled (default) +#define RADIOLIB_SI443X_AFC_WIDEBAND_ON 0b10000000 // 7 7 enabled +#define RADIOLIB_SI443X_AFC_OFF 0b00000000 // 6 6 AFC: disabled +#define RADIOLIB_SI443X_AFC_ON 0b01000000 // 6 6 enabled (default) +#define RADIOLIB_SI443X_AFC_HIGH_GEAR_SETTING 0b00000000 // 5 3 AFC high gear setting +#define RADIOLIB_SI443X_SECOND_PHASE_BIAS_0_DB 0b00000100 // 2 2 second phase antenna selection bias: 0 dB (default) +#define RADIOLIB_SI443X_SECOND_PHASE_BIAS_1_5_DB 0b00000000 // 2 2 1.5 dB +#define RADIOLIB_SI443X_MOVING_AVERAGE_TAP_8 0b00000010 // 1 1 moving average filter tap length: 8*Tb +#define RADIOLIB_SI443X_MOVING_AVERAGE_TAP_4 0b00000000 // 1 1 4*Tb after first preamble (default) +#define RADIOLIB_SI443X_ZERO_PHASE_RESET_5 0b00000000 // 0 0 reset preamble detector after: 5 zero phases (default) +#define RADIOLIB_SI443X_ZERO_PHASE_RESET_2 0b00000001 // 0 0 3 zero phases + +// RADIOLIB_SI443X_REG_AFC_TIMING_CONTROL +#define RADIOLIB_SI443X_SW_ANT_TIMER 0b00000000 // 7 6 number of periods to wait for RSSI to stabilize during antenna switching +#define RADIOLIB_SI443X_SHORT_WAIT 0b00001000 // 5 3 period to wait after AFC correction +#define RADIOLIB_SI443X_ANTENNA_SWITCH_WAIT 0b00000010 // 2 0 antenna switching wait time + +// RADIOLIB_SI443X_REG_CLOCK_REC_GEARSHIFT_OVERRIDE +#define RADIOLIB_SI443X_CLOCK_RECOVER_FAST_GEARSHIFT 0b00000000 // 5 3 clock recovery fast gearshift value +#define RADIOLIB_SI443X_CLOCK_RECOVER_SLOW_GEARSHIFT 0b00000011 // 2 0 clock recovery slow gearshift value + +// RADIOLIB_SI443X_REG_CLOCK_REC_OVERSAMP_RATIO +#define RADIOLIB_SI443X_CLOCK_REC_OVERSAMP_RATIO_LSB 0b01100100 // 7 0 oversampling rate LSB, defaults to 12.5 clock cycles per bit + +// RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_2 +#define RADIOLIB_SI443X_CLOCK_REC_OVERSAMP_RATIO_MSB 0b00000000 // 7 5 oversampling rate MSB, defaults to 12.5 clock cycles per bit +#define RADIOLIB_SI443X_SECOND_PHASE_SKIP_THRESHOLD 0b00000000 // 4 4 skip seconds phase antenna diversity threshold +#define RADIOLIB_SI443X_NCO_OFFSET_MSB 0b00000001 // 3 0 NCO offset MSB + +// RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_1 +#define RADIOLIB_SI443X_NCO_OFFSET_MID 0b01000111 // 7 0 NCO offset MID + +// RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_0 +#define RADIOLIB_SI443X_NCO_OFFSET_LSB 0b10101110 // 7 0 NCO offset LSB + +// RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_1 +#define RADIOLIB_SI443X_RX_COMPENSATION_OFF 0b00000000 // 4 4 Rx compensation for high data rate: disabled (default) +#define RADIOLIB_SI443X_RX_COMPENSATION_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_SI443X_CLOCK_REC_GAIN_DOUBLE_OFF 0b00000000 // 3 3 clock recovery gain doubling: disabled (default) +#define RADIOLIB_SI443X_CLOCK_REC_GAIN_DOUBLE_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_SI443X_CLOCK_REC_LOOP_GAIN_MSB 0b00000010 // 2 0 clock recovery timing loop gain MSB + +// RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_0 +#define RADIOLIB_SI443X_CLOCK_REC_LOOP_GAIN_LSB 0b10001111 // 7 0 clock recovery timing loop gain LSB + +// RADIOLIB_SI443X_REG_RSSI_CLEAR_CHANNEL_THRESHOLD +#define RADIOLIB_SI443X_RSSI_CLEAR_CHANNEL_THRESHOLD 0b00011110 // 7 0 RSSI clear channel interrupt threshold + +// RADIOLIB_SI443X_REG_AFC_LIMITER +#define RADIOLIB_SI443X_AFC_LIMITER 0x00 // 7 0 AFC limiter value + +// RADIOLIB_SI443X_REG_OOK_COUNTER_1 +#define RADIOLIB_SI443X_OOK_FREEZE_OFF 0b00000000 // 5 5 OOK moving average detector freeze: disabled (default) +#define RADIOLIB_SI443X_OOK_FREEZE_ON 0b00100000 // 5 5 enabled +#define RADIOLIB_SI443X_PEAK_DETECTOR_OFF 0b00000000 // 4 4 peak detector: disabled +#define RADIOLIB_SI443X_PEAK_DETECTOR_ON 0b00010000 // 4 4 enabled (default) +#define RADIOLIB_SI443X_OOK_MOVING_AVERAGE_OFF 0b00000000 // 3 3 OOK moving average: disabled +#define RADIOLIB_SI443X_OOK_MOVING_AVERAGE_ON 0b00001000 // 3 3 enabled (default) +#define RADIOLIB_SI443X_OOK_COUNTER_MSB 0b00000000 // 2 0 OOK counter MSB + +// RADIOLIB_SI443X_REG_OOK_COUNTER_2 +#define RADIOLIB_SI443X_OOK_COUNTER_LSB 0b10111100 // 7 0 OOK counter LSB + +// RADIOLIB_SI443X_REG_SLICER_PEAK_HOLD +#define RADIOLIB_SI443X_PEAK_DETECTOR_ATTACK 0b00010000 // 6 4 OOK peak detector attach time +#define RADIOLIB_SI443X_PEAK_DETECTOR_DECAY 0b00001100 // 3 0 OOK peak detector decay time + +// RADIOLIB_SI443X_REG_DATA_ACCESS_CONTROL +#define RADIOLIB_SI443X_PACKET_RX_HANDLING_OFF 0b00000000 // 7 7 packet Rx handling: disabled +#define RADIOLIB_SI443X_PACKET_RX_HANDLING_ON 0b10000000 // 7 7 enabled (default) +#define RADIOLIB_SI443X_LSB_FIRST_OFF 0b00000000 // 6 6 LSB first transmission: disabled (default) +#define RADIOLIB_SI443X_LSB_FIRST_ON 0b01000000 // 6 6 enabled +#define RADIOLIB_SI443X_CRC_DATA_ONLY_OFF 0b00000000 // 5 5 CRC calculated only from data fields: disabled (default) +#define RADIOLIB_SI443X_CRC_DATA_ONLY_ON 0b00100000 // 5 5 enabled +#define RADIOLIB_SI443X_SKIP_SECOND_PHASE_PREAMBLE_DET_OFF 0b00000000 // 4 4 skip second phase of preamble detection: disabled (default) +#define RADIOLIB_SI443X_SKIP_SECOND_PHASE_PREAMBLE_DET_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_SI443X_PACKET_TX_HANDLING_OFF 0b00000000 // 3 3 packet Tx handling: disabled +#define RADIOLIB_SI443X_PACKET_TX_HANDLING_ON 0b00001000 // 3 3 enabled (default) +#define RADIOLIB_SI443X_CRC_OFF 0b00000000 // 2 2 CRC: disabled +#define RADIOLIB_SI443X_CRC_ON 0b00000100 // 2 2 enabled (default) +#define RADIOLIB_SI443X_CRC_CCITT 0b00000000 // 1 0 CRC type: CCITT +#define RADIOLIB_SI443X_CRC_IBM_CRC16 0b00000001 // 1 0 IBM CRC-16 (default) +#define RADIOLIB_SI443X_CRC_IEC16 0b00000010 // 1 0 IEC-16 +#define RADIOLIB_SI443X_CRC_BIACHEVA 0b00000011 // 1 0 Biacheva + +// RADIOLIB_SI443X_REG_EZMAC_STATUS +#define RADIOLIB_SI443X_CRC_ALL_ONE 0b01000000 // 6 6 last received CRC was all ones +#define RADIOLIB_SI443X_PACKET_SEARCHING 0b00100000 // 5 5 radio is searching for a valid packet +#define RADIOLIB_SI443X_PACKET_RECEIVING 0b00010000 // 4 4 radio is currently receiving packet +#define RADIOLIB_SI443X_VALID_PACKET_RECEIVED 0b00001000 // 3 3 valid packet was received +#define RADIOLIB_SI443X_CRC_ERROR 0b00000100 // 2 2 CRC check failed +#define RADIOLIB_SI443X_PACKET_TRANSMITTING 0b00000010 // 1 1 radio is currently transmitting packet +#define RADIOLIB_SI443X_PACKET_SENT 0b00000001 // 0 0 packet sent + +// RADIOLIB_SI443X_REG_HEADER_CONTROL_1 +#define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_NONE 0b00000000 // 7 4 broadcast address check: none (default) +#define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_BYTE0 0b00010000 // 7 4 on byte 0 +#define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_BYTE1 0b00100000 // 7 4 on byte 1 +#define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_BYTE2 0b01000000 // 7 4 on byte 2 +#define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_BYTE3 0b10000000 // 7 4 on byte 3 +#define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_NONE 0b00000000 // 3 0 received header check: none +#define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_BYTE0 0b00000001 // 3 0 on byte 0 +#define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_BYTE1 0b00000010 // 3 0 on byte 1 +#define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_BYTE2 0b00000100 // 3 0 on byte 2 (default) +#define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_BYTE3 0b00001000 // 3 0 on byte 3 (default) + +// RADIOLIB_SI443X_REG_HEADER_CONTROL_2 +#define RADIOLIB_SI443X_SYNC_WORD_TIMEOUT_OFF 0b00000000 // 7 7 ignore timeout period when searching for sync word: disabled (default) +#define RADIOLIB_SI443X_SYNC_WORD_TIMEOUT_ON 0b10000000 // 7 7 enabled +#define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_NONE 0b00000000 // 6 4 header length: none +#define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_3 0b00010000 // 6 4 header 3 +#define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_32 0b00100000 // 6 4 header 3 and 2 +#define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_321 0b00110000 // 6 4 header 3, 2 and 1 (default) +#define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_3210 0b01000000 // 6 4 header 3, 2, 1, and 0 +#define RADIOLIB_SI443X_FIXED_PACKET_LENGTH_OFF 0b00000000 // 3 3 fixed packet length mode: disabled (default) +#define RADIOLIB_SI443X_FIXED_PACKET_LENGTH_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_SI443X_SYNC_LENGTH_SYNC_3 0b00000000 // 2 1 sync word length: sync 3 +#define RADIOLIB_SI443X_SYNC_LENGTH_SYNC_32 0b00000010 // 2 1 sync 3 and 2 (default) +#define RADIOLIB_SI443X_SYNC_LENGTH_SYNC_321 0b00000100 // 2 1 sync 3, 2 and 1 +#define RADIOLIB_SI443X_SYNC_LENGTH_SYNC_3210 0b00000110 // 2 1 sync 3, 2, 1 and 0 +#define RADIOLIB_SI443X_PREAMBLE_LENGTH_MSB 0b00000000 // 0 0 preamble length MSB + +// RADIOLIB_SI443X_REG_PREAMBLE_LENGTH +#define RADIOLIB_SI443X_PREAMBLE_LENGTH_LSB 0b00001000 // 0 0 preamble length LSB, defaults to 32 bits + +// RADIOLIB_SI443X_REG_PREAMBLE_DET_CONTROL +#define RADIOLIB_SI443X_PREAMBLE_DET_THRESHOLD 0b00101000 // 7 3 number of 4-bit nibbles in valid preamble, defaults to 20 bits +#define RADIOLIB_SI443X_RSSI_OFFSET 0b00000010 // 2 0 RSSI calculation offset, defaults to +8 dB + +// RADIOLIB_SI443X_REG_SYNC_WORD_3 - RADIOLIB_SI443X_REG_SYNC_WORD_0 +#define RADIOLIB_SI443X_SYNC_WORD_3 0x2D // 7 0 sync word: 4th byte (MSB) +#define RADIOLIB_SI443X_SYNC_WORD_2 0xD4 // 7 0 3rd byte +#define RADIOLIB_SI443X_SYNC_WORD_1 0x00 // 7 0 2nd byte +#define RADIOLIB_SI443X_SYNC_WORD_0 0x00 // 7 0 1st byte (LSB) + +// RADIOLIB_SI443X_REG_CHANNEL_FILTER_COEFF +#define RADIOLIB_SI443X_INVALID_PREAMBLE_THRESHOLD 0b00000000 // 7 4 invalid preamble threshold in nibbles + +// RADIOLIB_SI443X_REG_XOSC_CONTROL_TEST +#define RADIOLIB_SI443X_STATE_LOW_POWER 0b00000000 // 7 5 chip power state: low power +#define RADIOLIB_SI443X_STATE_READY 0b00100000 // 7 5 ready +#define RADIOLIB_SI443X_STATE_TUNE 0b01100000 // 7 5 tune +#define RADIOLIB_SI443X_STATE_TX 0b01000000 // 7 5 Tx +#define RADIOLIB_SI443X_STATE_RX 0b11100000 // 7 5 Rx + +// RADIOLIB_SI443X_REG_AGC_OVERRIDE_1 +#define RADIOLIB_SI443X_AGC_GAIN_INCREASE_OFF 0b00000000 // 6 6 AGC gain increase override: disabled (default) +#define RADIOLIB_SI443X_AGC_GAIN_INCREASE_ON 0b01000000 // 6 6 enabled +#define RADIOLIB_SI443X_AGC_OFF 0b00000000 // 5 5 AGC loop: disabled +#define RADIOLIB_SI443X_AGC_ON 0b00100000 // 5 5 enabled (default) +#define RADIOLIB_SI443X_LNA_GAIN_MIN 0b00000000 // 4 4 LNA gain select: 5 dB (default) +#define RADIOLIB_SI443X_LNA_GAIN_MAX 0b00010000 // 4 4 25 dB +#define RADIOLIB_SI443X_PGA_GAIN_OVERRIDE 0b00000000 // 3 0 PGA gain override, gain = RADIOLIB_SI443X_PGA_GAIN_OVERRIDE * 3 dB + +// RADIOLIB_SI443X_REG_TX_POWER +#define RADIOLIB_SI443X_LNA_SWITCH_OFF 0b00000000 // 3 3 LNA switch control: disabled +#define RADIOLIB_SI443X_LNA_SWITCH_ON 0b00001000 // 3 3 enabled (default) +#define RADIOLIB_SI443X_OUTPUT_POWER 0b00000000 // 2 0 output power in 3 dB steps, 0 is chip min, 7 is chip max + +// RADIOLIB_SI443X_REG_TX_DATA_RATE_1 + RADIOLIB_SI443X_REG_TX_DATA_RATE_0 +#define RADIOLIB_SI443X_DATA_RATE_MSB 0x0A // 7 0 data rate: DR = 10^6 * (RADIOLIB_SI443X_DATA_RATE / 2^16) in high data rate mode or +#define RADIOLIB_SI443X_DATA_RATE_LSB 0x3D // 7 0 DR = 10^6 * (RADIOLIB_SI443X_DATA_RATE / 2^21) in low data rate mode (defaults to 40 kbps) + +// RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1 +#define RADIOLIB_SI443X_HIGH_DATA_RATE_MODE 0b00000000 // 5 5 data rate: above 30 kbps (default) +#define RADIOLIB_SI443X_LOW_DATA_RATE_MODE 0b00100000 // 5 5 below 30 kbps +#define RADIOLIB_SI443X_PACKET_HANDLER_POWER_DOWN_OFF 0b00000000 // 4 4 power off packet handler in low power mode: disabled (default) +#define RADIOLIB_SI443X_PACKET_HANDLER_POWER_DOWN_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_SI443X_MANCHESTER_PREAMBLE_POL_LOW 0b00000000 // 3 3 preamble polarity in Manchester mode: low +#define RADIOLIB_SI443X_MANCHESTER_PREAMBLE_POL_HIGH 0b00001000 // 3 3 high (default) +#define RADIOLIB_SI443X_MANCHESTER_INVERTED_OFF 0b00000000 // 2 2 inverted Manchester encoding: disabled +#define RADIOLIB_SI443X_MANCHESTER_INVERTED_ON 0b00000100 // 2 2 enabled (default) +#define RADIOLIB_SI443X_MANCHESTER_OFF 0b00000000 // 1 1 Manchester encoding: disabled (default) +#define RADIOLIB_SI443X_MANCHESTER_ON 0b00000010 // 1 1 enabled +#define RADIOLIB_SI443X_WHITENING_OFF 0b00000000 // 0 0 data whitening: disabled (default) +#define RADIOLIB_SI443X_WHITENING_ON 0b00000001 // 0 0 enabled + +// RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2 +#define RADIOLIB_SI443X_TX_DATA_CLOCK_NONE 0b00000000 // 7 6 Tx data clock: disabled (default) +#define RADIOLIB_SI443X_TX_DATA_CLOCK_GPIO 0b01000000 // 7 6 GPIO pin +#define RADIOLIB_SI443X_TX_DATA_CLOCK_SDI 0b10000000 // 7 6 SDI pin +#define RADIOLIB_SI443X_TX_DATA_CLOCK_NIRQ 0b11000000 // 7 6 nIRQ pin +#define RADIOLIB_SI443X_TX_DATA_SOURCE_GPIO 0b00000000 // 5 4 Tx data source in direct mode: GPIO pin (default) +#define RADIOLIB_SI443X_TX_DATA_SOURCE_SDI 0b00010000 // 5 4 SDI pin +#define RADIOLIB_SI443X_TX_DATA_SOURCE_FIFO 0b00100000 // 5 4 FIFO +#define RADIOLIB_SI443X_TX_DATA_SOURCE_PN9 0b00110000 // 5 4 PN9 internal +#define RADIOLIB_SI443X_TX_RX_INVERTED_OFF 0b00000000 // 3 3 Tx/Rx data inverted: disabled (default) +#define RADIOLIB_SI443X_TX_RX_INVERTED_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_SI443X_FREQUENCY_DEVIATION_MSB 0b00000000 // 2 2 frequency deviation MSB +#define RADIOLIB_SI443X_MODULATION_NONE 0b00000000 // 1 0 modulation type: unmodulated carrier (default) +#define RADIOLIB_SI443X_MODULATION_OOK 0b00000001 // 1 0 OOK +#define RADIOLIB_SI443X_MODULATION_FSK 0b00000010 // 1 0 FSK +#define RADIOLIB_SI443X_MODULATION_GFSK 0b00000011 // 1 0 GFSK + +// RADIOLIB_SI443X_REG_FREQUENCY_DEVIATION +#define RADIOLIB_SI443X_FREQUENCY_DEVIATION_LSB 0b00100000 // 7 0 frequency deviation LSB, Fd = 625 Hz * RADIOLIB_SI443X_FREQUENCY_DEVIATION, defaults to 20 kHz + +// RADIOLIB_SI443X_REG_FREQUENCY_OFFSET_1 + RADIOLIB_SI443X_REG_FREQUENCY_OFFSET_2 +#define RADIOLIB_SI443X_FREQUENCY_OFFSET_MSB 0x00 // 7 0 frequency offset: +#define RADIOLIB_SI443X_FREQUENCY_OFFSET_LSB 0x00 // 1 0 Foff = 156.25 Hz * (RADIOLIB_SI443X_BAND_SELECT + 1) * RADIOLIB_SI443X_FREQUENCY_OFFSET, defaults to 156.25 Hz + +// RADIOLIB_SI443X_REG_FREQUENCY_BAND_SELECT +#define RADIOLIB_SI443X_SIDE_BAND_SELECT_LOW 0b00000000 // 6 6 Rx LO tuning: below channel frequency (default) +#define RADIOLIB_SI443X_SIDE_BAND_SELECT_HIGH 0b01000000 // 6 6 above channel frequency +#define RADIOLIB_SI443X_BAND_SELECT_LOW 0b00000000 // 5 5 band select: low, 240 - 479.9 MHz +#define RADIOLIB_SI443X_BAND_SELECT_HIGH 0b00100000 // 5 5 high, 480 - 960 MHz (default) +#define RADIOLIB_SI443X_FREQUENCY_BAND_SELECT 0b00010101 // 4 0 frequency band select + +// RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_1 + RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_0 +#define RADIOLIB_SI443X_NOM_CARRIER_FREQUENCY_MSB 0b10111011 // 7 0 nominal carrier frequency: +#define RADIOLIB_SI443X_NOM_CARRIER_FREQUENCY_LSB 0b10000000 // 7 0 Fc = (RADIOLIB_SI443X_BAND_SELECT + 1)*10*(RADIOLIB_SI443X_FREQUENCY_BAND_SELECT + 24) + (RADIOLIB_SI443X_NOM_CARRIER_FREQUENCY - RADIOLIB_SI443X_FREQUENCY_OFFSET)/6400 [MHz] + +// RADIOLIB_SI443X_REG_FREQUENCY_HOPPING_CHANNEL_SEL +#define RADIOLIB_SI443X_FREQUENCY_HOPPING_CHANNEL 0x00 // 7 0 frequency hopping channel number + +// RADIOLIB_SI443X_REG_FREQUENCY_HOPPING_STEP_SIZE +#define RADIOLIB_SI443X_FREQUENCY_HOPPING_STEP_SIZE 0x00 // 7 0 frequency hopping step size + +// RADIOLIB_SI443X_REG_TX_FIFO_CONTROL_1 +#define RADIOLIB_SI443X_TX_FIFO_ALMOST_FULL_THRESHOLD 0x37 // 5 0 Tx FIFO almost full threshold + +// RADIOLIB_SI443X_REG_TX_FIFO_CONTROL_2 +#define RADIOLIB_SI443X_TX_FIFO_ALMOST_EMPTY_THRESHOLD 0x04 // 5 0 Tx FIFO almost full threshold + +// RADIOLIB_SI443X_REG_RX_FIFO_CONTROL +#define RADIOLIB_SI443X_RX_FIFO_ALMOST_FULL_THRESHOLD 0x37 // 5 0 Rx FIFO almost full threshold + +/*! + \class Si443x + \brief Base class for Si443x series. All derived classes for Si443x (e.g. Si4431 or Si4432) inherit from this base class. + This class should not be instantiated directly from Arduino sketch, only from its derived classes. +*/ +class Si443x: public PhysicalLayer { + public: + // introduce PhysicalLayer overloads + using PhysicalLayer::transmit; + using PhysicalLayer::receive; + using PhysicalLayer::startTransmit; + using PhysicalLayer::readData; + + // constructor + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + Si443x(Module* mod); + + Module* getMod(); + + // basic methods + + /*! + \brief Initialization method. + \param br Bit rate of the FSK transmission in kbps (kilobits per second). + \param freqDev Frequency deviation of the FSK transmission in kHz. + \param rxBw Receiver bandwidth in kHz. + \param preambleLen Preamble Length in bits. + \returns \ref status_codes + */ + int16_t begin(float br, float freqDev, float rxBw, uint8_t preambleLen); + + /*! + \brief Reset method. Will reset the chip to the default state using SDN pin. + */ + void reset(); + + /*! + \brief Binary transmit method. Will transmit arbitrary binary data up to 64 bytes long. + For overloads to transmit Arduino String or C-string, see PhysicalLayer::transmit. + \param data Binary data that will be transmitted. + \param len Length of binary data to transmit (in bytes). + \param addr Node address to transmit the packet to. + \returns \ref status_codes + */ + int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Binary receive method. Will attempt to receive arbitrary binary data up to 64 bytes long. + For overloads to receive Arduino String, see PhysicalLayer::receive. + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be received. Must be known in advance for binary transmissions. + \returns \ref status_codes + */ + int16_t receive(uint8_t* data, size_t len) override; + + /*! + \brief Sets the module to sleep to save power. %Module will not be able to transmit or receive any data while in sleep mode. + %Module will wake up automatically when methods like transmit or receive are called. + \returns \ref status_codes + */ + int16_t sleep(); + + /*! + \brief Sets the module to standby (with XTAL on). + \returns \ref status_codes + */ + int16_t standby() override; + + /*! + \brief Sets the module to standby. + \param mode Standby mode to be used. + \returns \ref status_codes + */ + int16_t standby(uint8_t mode) override; + + /*! + \brief Enables direct transmission mode. While in direct mode, the module will not be able to transmit or receive packets. + \param frf 24-bit raw frequency value to start transmitting at. Required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0) override; + + /*! + \brief Enables direct reception mode. While in direct mode, the module will not be able to transmit or receive packets. + \returns \ref status_codes + */ + int16_t receiveDirect() override; + + /*! + \brief Disables direct mode and enables packet mode, allowing the module to receive packets. + \returns \ref status_codes + */ + int16_t packetMode(); + + // interrupt methods + + /*! + \brief Sets interrupt service routine to call when IRQ activates. + \param func ISR to call. + */ + void setIrqAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when IRQ activates. + */ + void clearIrqAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + void clearPacketSentAction(); + + /*! + \brief Interrupt-driven binary transmit method. Will start transmitting arbitrary binary data up to 64 bytes long. + \param data Binary data that will be transmitted. + \param len Length of binary data to transmit (in bytes). + \param addr Node address to transmit the packet to. + \returns \ref status_codes + */ + int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + + /*! + \brief Clean up after transmission is done. + \returns \ref status_codes + */ + int16_t finishTransmit() override; + + /*! + \brief Interrupt-driven receive method. IRQ will be activated when full valid packet is received. + \returns \ref status_codes + */ + int16_t startReceive(); + + /*! + \brief Interrupt-driven receive method, implemented for compatibility with PhysicalLayer. + \param timeout Ignored. + \param irqFlags Ignored. + \param irqMask Ignored. + \param len Ignored. + \returns \ref status_codes + */ + int16_t startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len); + + /*! + \brief Reads data that was received after calling startReceive method. When the packet length is not known in advance, + getPacketLength method must be called BEFORE calling readData! + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be read. When set to 0, the packet length will be retrieved automatically. + When more bytes than received are requested, only the number of bytes requested will be returned. + \returns \ref status_codes + */ + int16_t readData(uint8_t* data, size_t len) override; + + // configuration methods + + /*! + \brief Sets FSK bit rate. Allowed values range from 0.123 to 256.0 kbps. + \param br Bit rate to be set (in kbps). + \returns \ref status_codes + */ + int16_t setBitRate(float br); + + /*! + \brief Sets FSK frequency deviation from carrier frequency. Allowed values range from 0.625 to 320.0 kHz. + \param freqDev Frequency deviation to be set (in kHz). + \returns \ref status_codes + */ + int16_t setFrequencyDeviation(float freqDev) override; + + /*! + \brief Sets receiver bandwidth. Allowed values range from 2.6 to 620.7 kHz. + \param rxBw Receiver bandwidth to be set in kHz. + \returns \ref status_codes + */ + int16_t setRxBandwidth(float rxBw); + + /*! + \brief Sets sync word. Up to 4 bytes can be set as sync word. + \param syncWord Pointer to the array of sync word bytes. + \param len Sync word length in bytes. + */ + int16_t setSyncWord(uint8_t* syncWord, size_t len); + + /*! + \brief Sets preamble length. + \param preambleLen Preamble length to be set (in bits). + \returns \ref status_codes + */ + int16_t setPreambleLength(uint8_t preambleLen); + + /*! + \brief Query modem for the packet length of received payload. + \param update Update received packet length. Will return cached value when set to false. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update = true) override; + + /*! + \brief Sets transmission encoding. Only available in FSK mode. + Allowed values are RADIOLIB_ENCODING_NRZ, RADIOLIB_ENCODING_MANCHESTER and RADIOLIB_ENCODING_WHITENING. + \param encoding Encoding to be used. + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding) override; + + /*! + \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. Only available in FSK mode with FSK modulation. + Allowed values are RADIOLIB_SHAPING_0_5 or RADIOLIB_SHAPING_1_0. Set to RADIOLIB_SHAPING_NONE to disable data shaping. + \param sh Gaussian shaping bandwidth-time product that will be used for data shaping + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! \copydoc Module::setRfSwitchPins */ + void setRfSwitchPins(uint32_t rxEn, uint32_t txEn); + + /*! \copydoc Module::setRfSwitchTable */ + void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]); + + /*! + \brief Get one truly random byte from RSSI noise. + \returns TRNG byte. + */ + uint8_t randomByte(); + + /*! + \brief Read version SPI register. Should return RADIOLIB_SI443X_DEVICE_VERSION (0x06) if Si443x is connected and working. + \returns Version register contents or \ref status_codes + */ + int16_t getChipVersion(); + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + /*! + \brief Set interrupt service routine function to call when data bit is received in direct mode. + \param func Pointer to interrupt service routine. + */ + void setDirectAction(void (*func)(void)); + + /*! + \brief Function to read and process data bit in direct reception mode. + \param pin Pin on which to read. + */ + void readBit(uint32_t pin); + #endif + + /*! + \brief Set modem in fixed packet length mode. + \param len Packet length. + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_SI443X_MAX_PACKET_LENGTH); + + /*! + \brief Set modem in variable packet length mode. + \param maxLen Maximum packet length. + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_SI443X_MAX_PACKET_LENGTH); + +#if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) + protected: +#endif + Module* mod; + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + + float bitRate = 0; + float frequencyDev = 0; + float frequency = 0; + + size_t packetLength = 0; + bool packetLengthQueried = false; + uint8_t packetLengthConfig = RADIOLIB_SI443X_FIXED_PACKET_LENGTH_ON; + + int16_t setFrequencyRaw(float newFreq); + int16_t setPacketMode(uint8_t mode, uint8_t len); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + bool findChip(); + void clearIRQFlags(); + void clearFIFO(size_t count); + int16_t config(); + int16_t updateClockRecovery(); + int16_t directMode(); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/nRF24/nRF24.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/nRF24/nRF24.cpp new file mode 100644 index 00000000..c48b5b17 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/nRF24/nRF24.cpp @@ -0,0 +1,657 @@ +#include "nRF24.h" +#include +#if !defined(RADIOLIB_EXCLUDE_NRF24) + +nRF24::nRF24(Module* mod) : PhysicalLayer(RADIOLIB_NRF24_FREQUENCY_STEP_SIZE, RADIOLIB_NRF24_MAX_PACKET_LENGTH) { + this->mod = mod; +} + +Module* nRF24::getMod() { + return(this->mod); +} + +int16_t nRF24::begin(int16_t freq, int16_t dr, int8_t pwr, uint8_t addrWidth) { + // set module properties + this->mod->SPIreadCommand = RADIOLIB_NRF24_CMD_READ; + this->mod->SPIwriteCommand = RADIOLIB_NRF24_CMD_WRITE; + this->mod->init(); + this->mod->hal->pinMode(this->mod->getIrq(), this->mod->hal->GpioModeInput); + + // set pin mode on RST (connected to nRF24 CE pin) + this->mod->hal->pinMode(this->mod->getRst(), this->mod->hal->GpioModeOutput); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + + // wait for minimum power-on reset duration + this->mod->hal->delay(100); + + // check SPI connection + int16_t val = this->mod->SPIgetRegValue(RADIOLIB_NRF24_REG_SETUP_AW); + if(!((val >= 0) && (val <= 3))) { + RADIOLIB_DEBUG_PRINTLN("No nRF24 found!"); + this->mod->term(); + return(RADIOLIB_ERR_CHIP_NOT_FOUND); + } + RADIOLIB_DEBUG_PRINTLN("M\tnRF24"); + + // configure settings inaccessible by public API + int16_t state = config(); + RADIOLIB_ASSERT(state); + + // set mode to standby + state = standby(); + RADIOLIB_ASSERT(state); + + // set frequency + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + // set data rate + state = setBitRate(dr); + RADIOLIB_ASSERT(state); + + // set output power + state = setOutputPower(pwr); + RADIOLIB_ASSERT(state); + + // set address width + state = setAddressWidth(addrWidth); + RADIOLIB_ASSERT(state); + + // set CRC + state = setCrcFiltering(true); + RADIOLIB_ASSERT(state); + + // set auto-ACK on all pipes + state = setAutoAck(true); + RADIOLIB_ASSERT(state); + + return(state); +} + +int16_t nRF24::sleep() { + return(this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_POWER_DOWN, 1, 1)); +} + +int16_t nRF24::standby() { + return(standby(RADIOLIB_NRF24_POWER_UP)); +} + +int16_t nRF24::standby(uint8_t mode) { + // make sure carrier output is disabled + this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_CONT_WAVE_OFF, 7, 7); + this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_PLL_LOCK_OFF, 4, 4); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + + // use standby-1 mode + return(this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, mode, 1, 1)); +} + +int16_t nRF24::transmit(uint8_t* data, size_t len, uint8_t addr) { + // start transmission + int16_t state = startTransmit(data, len, addr); + RADIOLIB_ASSERT(state); + + // wait until transmission is finished + uint32_t start = this->mod->hal->micros(); + while(this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + + // check maximum number of retransmits + if(getStatus(RADIOLIB_NRF24_MAX_RT)) { + finishTransmit(); + return(RADIOLIB_ERR_ACK_NOT_RECEIVED); + } + + // check timeout: 15 retries * 4ms (max Tx time as per datasheet) + if(this->mod->hal->micros() - start >= 60000) { + finishTransmit(); + return(RADIOLIB_ERR_TX_TIMEOUT); + } + } + + return(finishTransmit()); +} + +int16_t nRF24::receive(uint8_t* data, size_t len) { + // start reception + int16_t state = startReceive(); + RADIOLIB_ASSERT(state); + + // wait for Rx_DataReady or timeout + uint32_t start = this->mod->hal->micros(); + while(this->mod->hal->digitalRead(this->mod->getIrq())) { + this->mod->hal->yield(); + + // check timeout: 15 retries * 4ms (max Tx time as per datasheet) + if(this->mod->hal->micros() - start >= 60000) { + standby(); + clearIRQ(); + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } + + // read the received data + return(readData(data, len)); +} + +int16_t nRF24::transmitDirect(uint32_t frf) { + // set raw frequency value + if(frf != 0) { + uint8_t freqRaw = frf - 2400; + this->mod->SPIwriteRegister(RADIOLIB_NRF24_REG_RF_CH, freqRaw & 0b01111111); + } + + // output carrier + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_PTX, 0, 0); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_CONT_WAVE_ON, 7, 7); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_PLL_LOCK_ON, 4, 4); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + return(state); +} + +int16_t nRF24::receiveDirect() { + // nRF24 is unable to directly output demodulated data + // this method is implemented only for PhysicalLayer compatibility + return(RADIOLIB_ERR_NONE); +} + +void nRF24::setIrqAction(void (*func)(void)) { + this->mod->hal->attachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq()), func, this->mod->hal->GpioInterruptFalling); +} + +void nRF24::clearIrqAction() { + this->mod->hal->detachInterrupt(this->mod->hal->pinToInterrupt(this->mod->getIrq())); +} + +void nRF24::setPacketReceivedAction(void (*func)(void)) { + this->setIrqAction(func); +} + +void nRF24::clearPacketReceivedAction() { + this->clearIrqAction(); +} + +void nRF24::setPacketSentAction(void (*func)(void)) { + this->setIrqAction(func); +} + +void nRF24::clearPacketSentAction() { + this->clearIrqAction(); +} + +int16_t nRF24::startTransmit(uint8_t* data, size_t len, uint8_t addr) { + // suppress unused variable warning + (void)addr; + + // check packet length + if(len > RADIOLIB_NRF24_MAX_PACKET_LENGTH) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // enable primary Tx mode + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_PTX, 0, 0); + + // clear interrupts + clearIRQ(); + + // enable Tx_DataSent interrupt + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_MASK_TX_DS_IRQ_ON, 5, 5); + RADIOLIB_ASSERT(state); + + // flush Tx FIFO + SPItransfer(RADIOLIB_NRF24_CMD_FLUSH_TX); + + // fill Tx FIFO + uint8_t buff[32]; + memset(buff, 0x00, 32); + memcpy(buff, data, len); + SPIwriteTxPayload(data, len); + + // CE high to start transmitting + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + this->mod->hal->delay(1); + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelLow); + + return(state); +} + +int16_t nRF24::finishTransmit() { + // clear interrupt flags + clearIRQ(); + + // set mode to standby to disable transmitter/RF switch + return(standby()); +} + +int16_t nRF24::startReceive() { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // enable primary Rx mode + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_PRX, 0, 0); + RADIOLIB_ASSERT(state); + + // enable Rx_DataReady interrupt + clearIRQ(); + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_MASK_RX_DR_IRQ_ON, 6, 6); + RADIOLIB_ASSERT(state); + + // flush Rx FIFO + SPItransfer(RADIOLIB_NRF24_CMD_FLUSH_RX); + + // CE high to start receiving + this->mod->hal->digitalWrite(this->mod->getRst(), this->mod->hal->GpioLevelHigh); + + // wait to enter Rx state + this->mod->hal->delay(1); + + return(state); +} + +int16_t nRF24::startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len) { + (void)timeout; + (void)irqFlags; + (void)irqMask; + (void)len; + return(startReceive()); +} + +int16_t nRF24::readData(uint8_t* data, size_t len) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // get packet length + size_t length = getPacketLength(); + if((len != 0) && (len < length)) { + // user requested less data than we got, only return what was requested + length = len; + } + + // read packet data + SPIreadRxPayload(data, length); + + // clear interrupt + clearIRQ(); + + return(RADIOLIB_ERR_NONE); +} + +int16_t nRF24::setFrequency(float freq) { + RADIOLIB_CHECK_RANGE((uint16_t)freq, 2400, 2525, RADIOLIB_ERR_INVALID_FREQUENCY); + + // set frequency + uint8_t freqRaw = (uint16_t)freq - 2400; + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_CH, freqRaw, 6, 0); + + if(state == RADIOLIB_ERR_NONE) { + this->frequency = freq; + } + + return(state); +} + +int16_t nRF24::setBitRate(float br) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set data rate + uint16_t dataRate = (uint16_t)br; + if(dataRate == 250) { + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_DR_250_KBPS, 5, 5); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_DR_250_KBPS, 3, 3); + } else if(dataRate == 1000) { + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_DR_1_MBPS, 5, 5); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_DR_1_MBPS, 3, 3); + } else if(dataRate == 2000) { + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_DR_2_MBPS, 5, 5); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, RADIOLIB_NRF24_DR_2_MBPS, 3, 3); + } else { + return(RADIOLIB_ERR_INVALID_DATA_RATE); + } + + if(state == RADIOLIB_ERR_NONE) { + this->dataRate = dataRate; + } + + + return(state); +} + +int16_t nRF24::setOutputPower(int8_t pwr) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // check allowed values + uint8_t powerRaw = 0; + switch(pwr) { + case -18: + powerRaw = RADIOLIB_NRF24_RF_PWR_18_DBM; + break; + case -12: + powerRaw = RADIOLIB_NRF24_RF_PWR_12_DBM; + break; + case -6: + powerRaw = RADIOLIB_NRF24_RF_PWR_6_DBM; + break; + case 0: + powerRaw = RADIOLIB_NRF24_RF_PWR_0_DBM; + break; + default: + return(RADIOLIB_ERR_INVALID_OUTPUT_POWER); + } + + // write new register value + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RF_SETUP, powerRaw, 2, 1); + + if(state == RADIOLIB_ERR_NONE) { + this->power = pwr; + } + + return(state); +} + +int16_t nRF24::setAddressWidth(uint8_t addrWidth) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set address width + switch(addrWidth) { + case 2: + // Even if marked as 'Illegal' on the datasheet this will work: + // http://travisgoodspeed.blogspot.com/2011/02/promiscuity-is-nrf24l01s-duty.html + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_SETUP_AW, RADIOLIB_NRF24_ADDRESS_2_BYTES, 1, 0); + break; + case 3: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_SETUP_AW, RADIOLIB_NRF24_ADDRESS_3_BYTES, 1, 0); + break; + case 4: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_SETUP_AW, RADIOLIB_NRF24_ADDRESS_4_BYTES, 1, 0); + break; + case 5: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_SETUP_AW, RADIOLIB_NRF24_ADDRESS_5_BYTES, 1, 0); + break; + default: + return(RADIOLIB_ERR_INVALID_ADDRESS_WIDTH); + } + + // save address width + if(state == RADIOLIB_ERR_NONE) { + this->addressWidth = addrWidth; + } + + return(state); +} + +int16_t nRF24::setTransmitPipe(uint8_t* addr) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set transmit address + this->mod->SPIwriteRegisterBurst(RADIOLIB_NRF24_REG_TX_ADDR, addr, this->addressWidth); + + // set Rx pipe 0 address (for ACK) + this->mod->SPIwriteRegisterBurst(RADIOLIB_NRF24_REG_RX_ADDR_P0, addr, this->addressWidth); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P0_ON, 0, 0); + + return(state); +} + +int16_t nRF24::setReceivePipe(uint8_t pipeNum, uint8_t* addr) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // write full pipe 0 - 1 address and enable the pipe + switch(pipeNum) { + case 0: + this->mod->SPIwriteRegisterBurst(RADIOLIB_NRF24_REG_RX_ADDR_P0, addr, this->addressWidth); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P0_ON, 0, 0); + break; + case 1: + this->mod->SPIwriteRegisterBurst(RADIOLIB_NRF24_REG_RX_ADDR_P1, addr, this->addressWidth); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P1_ON, 1, 1); + break; + default: + return(RADIOLIB_ERR_INVALID_PIPE_NUMBER); + } + + return(state); +} + +int16_t nRF24::setReceivePipe(uint8_t pipeNum, uint8_t addrByte) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // write unique pipe 2 - 5 address and enable the pipe + switch(pipeNum) { + case 2: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RX_ADDR_P2, addrByte); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P2_ON, 2, 2); + break; + case 3: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RX_ADDR_P3, addrByte); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P3_ON, 3, 3); + break; + case 4: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RX_ADDR_P4, addrByte); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P4_ON, 4, 4); + break; + case 5: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_RX_ADDR_P5, addrByte); + state |= this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P5_ON, 5, 5); + break; + default: + return(RADIOLIB_ERR_INVALID_PIPE_NUMBER); + } + + return(state); +} + +int16_t nRF24::disablePipe(uint8_t pipeNum) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + switch(pipeNum) { + case 0: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P0_OFF, 0, 0); + break; + case 1: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P1_OFF, 1, 1); + break; + case 2: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P2_OFF, 2, 2); + break; + case 3: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P3_OFF, 3, 3); + break; + case 4: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P4_OFF, 4, 4); + break; + case 5: + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_RXADDR, RADIOLIB_NRF24_P5_OFF, 5, 5); + break; + default: + return(RADIOLIB_ERR_INVALID_PIPE_NUMBER); + } + + return(state); +} + +int16_t nRF24::getStatus(uint8_t mask) { + return(this->mod->SPIgetRegValue(RADIOLIB_NRF24_REG_STATUS) & mask); +} + +bool nRF24::isCarrierDetected() { + return(this->mod->SPIgetRegValue(RADIOLIB_NRF24_REG_RPD, 0, 0) == 1); +} + +int16_t nRF24::setFrequencyDeviation(float freqDev) { + // nRF24 is unable to set frequency deviation + // this method is implemented only for PhysicalLayer compatibility + (void)freqDev; + return(RADIOLIB_ERR_NONE); +} + +size_t nRF24::getPacketLength(bool update) { + (void)update; + uint8_t length = 0; + SPItransfer(RADIOLIB_NRF24_CMD_READ_RX_PAYLOAD_WIDTH, false, NULL, &length, 1); + return((size_t)length); +} + +int16_t nRF24::setCrcFiltering(bool crcOn) { + // Auto Ack needs to be disabled in order to disable CRC. + if (!crcOn) { + int16_t status = setAutoAck(false); + RADIOLIB_ASSERT(status) + } + + // Disable CRC + return this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, (crcOn ? RADIOLIB_NRF24_CRC_ON : RADIOLIB_NRF24_CRC_OFF), 3, 3); +} + +int16_t nRF24::setAutoAck(bool autoAckOn){ + return this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_AA, (autoAckOn ? RADIOLIB_NRF24_AA_ALL_ON : RADIOLIB_NRF24_AA_ALL_OFF), 5, 0); +} + +int16_t nRF24::setAutoAck(uint8_t pipeNum, bool autoAckOn){ + switch(pipeNum) { + case 0: + return this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_AA, (autoAckOn ? RADIOLIB_NRF24_AA_P0_ON : RADIOLIB_NRF24_AA_P0_OFF), 0, 0); + break; + case 1: + return this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_AA, (autoAckOn ? RADIOLIB_NRF24_AA_P1_ON : RADIOLIB_NRF24_AA_P1_OFF), 1, 1); + break; + case 2: + return this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_AA, (autoAckOn ? RADIOLIB_NRF24_AA_P2_ON : RADIOLIB_NRF24_AA_P2_OFF), 2, 2); + break; + case 3: + return this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_AA, (autoAckOn ? RADIOLIB_NRF24_AA_P3_ON : RADIOLIB_NRF24_AA_P3_OFF), 3, 3); + break; + case 4: + return this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_AA, (autoAckOn ? RADIOLIB_NRF24_AA_P4_ON : RADIOLIB_NRF24_AA_P4_OFF), 4, 4); + break; + case 5: + return this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_EN_AA, (autoAckOn ? RADIOLIB_NRF24_AA_P5_ON : RADIOLIB_NRF24_AA_P5_OFF), 5, 5); + break; + default: + return (RADIOLIB_ERR_INVALID_PIPE_NUMBER); + } +} + +int16_t nRF24::setDataShaping(uint8_t sh) { + // nRF24 is unable to set data shaping + // this method is implemented only for PhysicalLayer compatibility + (void)sh; + return(RADIOLIB_ERR_NONE); +} + +int16_t nRF24::setEncoding(uint8_t encoding) { + // nRF24 is unable to set encoding + // this method is implemented only for PhysicalLayer compatibility + (void)encoding; + return(RADIOLIB_ERR_NONE); +} + +void nRF24::clearIRQ() { + // clear status bits + this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_STATUS, RADIOLIB_NRF24_RX_DR | RADIOLIB_NRF24_TX_DS | RADIOLIB_NRF24_MAX_RT, 6, 4); + + // disable interrupts + this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_MASK_RX_DR_IRQ_OFF | RADIOLIB_NRF24_MASK_TX_DS_IRQ_OFF | RADIOLIB_NRF24_MASK_MAX_RT_IRQ_OFF, 6, 4); +} + +int16_t nRF24::config() { + // enable 16-bit CRC + int16_t state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_CRC_ON | RADIOLIB_NRF24_CRC_16, 3, 2); + RADIOLIB_ASSERT(state); + + // set 15 retries and delay 1500 (5*250) us + this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_SETUP_RETR, (5 << 4) | 5); + + // set features: dynamic payload on, payload with ACK packets off, dynamic ACK off + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_FEATURE, RADIOLIB_NRF24_DPL_ON | RADIOLIB_NRF24_ACK_PAY_OFF | RADIOLIB_NRF24_DYN_ACK_OFF, 2, 0); + RADIOLIB_ASSERT(state); + + // enable dynamic payloads + state = this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_DYNPD, RADIOLIB_NRF24_DPL_ALL_ON, 5, 0); + RADIOLIB_ASSERT(state); + + // reset IRQ + clearIRQ(); + + // clear status + this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_STATUS, RADIOLIB_NRF24_RX_DR | RADIOLIB_NRF24_TX_DS | RADIOLIB_NRF24_MAX_RT, 6, 4); + + // flush FIFOs + SPItransfer(RADIOLIB_NRF24_CMD_FLUSH_TX); + SPItransfer(RADIOLIB_NRF24_CMD_FLUSH_RX); + + // power up + this->mod->SPIsetRegValue(RADIOLIB_NRF24_REG_CONFIG, RADIOLIB_NRF24_POWER_UP, 1, 1); + this->mod->hal->delay(5); + + return(state); +} + +void nRF24::SPIreadRxPayload(uint8_t* data, uint8_t numBytes) { + SPItransfer(RADIOLIB_NRF24_CMD_READ_RX_PAYLOAD, false, NULL, data, numBytes); +} + +void nRF24::SPIwriteTxPayload(uint8_t* data, uint8_t numBytes) { + SPItransfer(RADIOLIB_NRF24_CMD_WRITE_TX_PAYLOAD, true, data, NULL, numBytes); +} + +void nRF24::SPItransfer(uint8_t cmd, bool write, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes) { + // prepare the buffers + size_t buffLen = 1 + numBytes; + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t buffOut[RADIOLIB_STATIC_ARRAY_SIZE]; + uint8_t buffIn[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + uint8_t* buffOut = new uint8_t[buffLen]; + uint8_t* buffIn = new uint8_t[buffLen]; + #endif + uint8_t* buffOutPtr = buffOut; + + // copy the command + *(buffOutPtr++) = cmd; + + // copy the data + if(write) { + memcpy(buffOutPtr, dataOut, numBytes); + } else { + memset(buffOutPtr, 0x00, numBytes); + } + + // do the transfer + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelLow); + this->mod->hal->spiBeginTransaction(); + this->mod->hal->spiTransfer(buffOut, buffLen, buffIn); + this->mod->hal->spiEndTransaction(); + this->mod->hal->digitalWrite(this->mod->getCs(), this->mod->hal->GpioLevelHigh); + + // copy the data + if(!write) { + memcpy(dataIn, &buffIn[1], numBytes); + } + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] buffOut; + delete[] buffIn; + #endif +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/modules/nRF24/nRF24.h b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/nRF24/nRF24.h new file mode 100644 index 00000000..5a59877f --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/modules/nRF24/nRF24.h @@ -0,0 +1,492 @@ +#if !defined(_RADIOLIB_NRF24_H) && !defined(RADIOLIB_EXCLUDE_NRF24) +#define _RADIOLIB_NRF24_H + +#include "../../Module.h" +#include "../../TypeDef.h" + +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" + +// nRF24 physical layer properties +#define RADIOLIB_NRF24_FREQUENCY_STEP_SIZE 1000000.0 +#define RADIOLIB_NRF24_MAX_PACKET_LENGTH 32 + +// nRF24 SPI commands +#define RADIOLIB_NRF24_CMD_READ 0b00000000 +#define RADIOLIB_NRF24_CMD_WRITE 0b00100000 +#define RADIOLIB_NRF24_CMD_READ_RX_PAYLOAD 0b01100001 +#define RADIOLIB_NRF24_CMD_WRITE_TX_PAYLOAD 0b10100000 +#define RADIOLIB_NRF24_CMD_FLUSH_TX 0b11100001 +#define RADIOLIB_NRF24_CMD_FLUSH_RX 0b11100010 +#define RADIOLIB_NRF24_CMD_REUSE_TX_PAXLOAD 0b11100011 +#define RADIOLIB_NRF24_CMD_READ_RX_PAYLOAD_WIDTH 0b01100000 +#define RADIOLIB_NRF24_CMD_WRITE_ACK_PAYLOAD 0b10101000 +#define RADIOLIB_NRF24_CMD_WRITE_TX_PAYLOAD_NOACK 0b10110000 +#define RADIOLIB_NRF24_CMD_NOP 0b11111111 + +// nRF24 register map +#define RADIOLIB_NRF24_REG_CONFIG 0x00 +#define RADIOLIB_NRF24_REG_EN_AA 0x01 +#define RADIOLIB_NRF24_REG_EN_RXADDR 0x02 +#define RADIOLIB_NRF24_REG_SETUP_AW 0x03 +#define RADIOLIB_NRF24_REG_SETUP_RETR 0x04 +#define RADIOLIB_NRF24_REG_RF_CH 0x05 +#define RADIOLIB_NRF24_REG_RF_SETUP 0x06 +#define RADIOLIB_NRF24_REG_STATUS 0x07 +#define RADIOLIB_NRF24_REG_OBSERVE_TX 0x08 +#define RADIOLIB_NRF24_REG_RPD 0x09 +#define RADIOLIB_NRF24_REG_RX_ADDR_P0 0x0A +#define RADIOLIB_NRF24_REG_RX_ADDR_P1 0x0B +#define RADIOLIB_NRF24_REG_RX_ADDR_P2 0x0C +#define RADIOLIB_NRF24_REG_RX_ADDR_P3 0x0D +#define RADIOLIB_NRF24_REG_RX_ADDR_P4 0x0E +#define RADIOLIB_NRF24_REG_RX_ADDR_P5 0x0F +#define RADIOLIB_NRF24_REG_TX_ADDR 0x10 +#define RADIOLIB_NRF24_REG_RX_PW_P0 0x11 +#define RADIOLIB_NRF24_REG_RX_PW_P1 0x12 +#define RADIOLIB_NRF24_REG_RX_PW_P2 0x13 +#define RADIOLIB_NRF24_REG_RX_PW_P3 0x14 +#define RADIOLIB_NRF24_REG_RX_PW_P4 0x15 +#define RADIOLIB_NRF24_REG_RX_PW_P5 0x16 +#define RADIOLIB_NRF24_REG_FIFO_STATUS 0x17 +#define RADIOLIB_NRF24_REG_DYNPD 0x1C +#define RADIOLIB_NRF24_REG_FEATURE 0x1D + +// RADIOLIB_NRF24_REG_CONFIG MSB LSB DESCRIPTION +#define RADIOLIB_NRF24_MASK_RX_DR_IRQ_OFF 0b01000000 // 6 6 RX_DR will not be reflected on IRQ pin +#define RADIOLIB_NRF24_MASK_RX_DR_IRQ_ON 0b00000000 // 6 6 RX_DR will be reflected on IRQ pin as active low (default) +#define RADIOLIB_NRF24_MASK_TX_DS_IRQ_OFF 0b00100000 // 5 5 TX_DS will not be reflected on IRQ pin +#define RADIOLIB_NRF24_MASK_TX_DS_IRQ_ON 0b00000000 // 5 5 TX_DS will be reflected on IRQ pin as active low (default) +#define RADIOLIB_NRF24_MASK_MAX_RT_IRQ_OFF 0b00010000 // 4 4 MAX_RT will not be reflected on IRQ pin +#define RADIOLIB_NRF24_MASK_MAX_RT_IRQ_ON 0b00000000 // 4 4 MAX_RT will be reflected on IRQ pin as active low (default) +#define RADIOLIB_NRF24_CRC_OFF 0b00000000 // 3 3 CRC calculation: disabled +#define RADIOLIB_NRF24_CRC_ON 0b00001000 // 3 3 enabled (default) +#define RADIOLIB_NRF24_CRC_8 0b00000000 // 2 2 CRC scheme: CRC8 (default) +#define RADIOLIB_NRF24_CRC_16 0b00000100 // 2 2 CRC16 +#define RADIOLIB_NRF24_POWER_UP 0b00000010 // 1 1 power up +#define RADIOLIB_NRF24_POWER_DOWN 0b00000000 // 1 1 power down +#define RADIOLIB_NRF24_PTX 0b00000000 // 0 0 enable primary Tx +#define RADIOLIB_NRF24_PRX 0b00000001 // 0 0 enable primary Rx + +// RADIOLIB_NRF24_REG_EN_AA +#define RADIOLIB_NRF24_AA_ALL_OFF 0b00000000 // 5 0 auto-ACK on all pipes: disabled +#define RADIOLIB_NRF24_AA_ALL_ON 0b00111111 // 5 0 enabled (default) +#define RADIOLIB_NRF24_AA_P5_OFF 0b00000000 // 5 5 auto-ACK on pipe 5: disabled +#define RADIOLIB_NRF24_AA_P5_ON 0b00100000 // 5 5 enabled (default) +#define RADIOLIB_NRF24_AA_P4_OFF 0b00000000 // 4 4 auto-ACK on pipe 4: disabled +#define RADIOLIB_NRF24_AA_P4_ON 0b00010000 // 4 4 enabled (default) +#define RADIOLIB_NRF24_AA_P3_OFF 0b00000000 // 3 3 auto-ACK on pipe 3: disabled +#define RADIOLIB_NRF24_AA_P3_ON 0b00001000 // 3 3 enabled (default) +#define RADIOLIB_NRF24_AA_P2_OFF 0b00000000 // 2 2 auto-ACK on pipe 2: disabled +#define RADIOLIB_NRF24_AA_P2_ON 0b00000100 // 2 2 enabled (default) +#define RADIOLIB_NRF24_AA_P1_OFF 0b00000000 // 1 1 auto-ACK on pipe 1: disabled +#define RADIOLIB_NRF24_AA_P1_ON 0b00000010 // 1 1 enabled (default) +#define RADIOLIB_NRF24_AA_P0_OFF 0b00000000 // 0 0 auto-ACK on pipe 0: disabled +#define RADIOLIB_NRF24_AA_P0_ON 0b00000001 // 0 0 enabled (default) + +// RADIOLIB_NRF24_REG_EN_RXADDR +#define RADIOLIB_NRF24_P5_OFF 0b00000000 // 5 5 receive pipe 5: disabled (default) +#define RADIOLIB_NRF24_P5_ON 0b00100000 // 5 5 enabled +#define RADIOLIB_NRF24_P4_OFF 0b00000000 // 4 4 receive pipe 4: disabled (default) +#define RADIOLIB_NRF24_P4_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_NRF24_P3_OFF 0b00000000 // 3 3 receive pipe 3: disabled (default) +#define RADIOLIB_NRF24_P3_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_NRF24_P2_OFF 0b00000000 // 2 2 receive pipe 2: disabled (default) +#define RADIOLIB_NRF24_P2_ON 0b00000100 // 2 2 enabled +#define RADIOLIB_NRF24_P1_OFF 0b00000000 // 1 1 receive pipe 1: disabled +#define RADIOLIB_NRF24_P1_ON 0b00000010 // 1 1 enabled (default) +#define RADIOLIB_NRF24_P0_OFF 0b00000000 // 0 0 receive pipe 0: disabled +#define RADIOLIB_NRF24_P0_ON 0b00000001 // 0 0 enabled (default) + +// RADIOLIB_NRF24_REG_SETUP_AW +#define RADIOLIB_NRF24_ADDRESS_2_BYTES 0b00000000 // 1 0 address width: 2 bytes +#define RADIOLIB_NRF24_ADDRESS_3_BYTES 0b00000001 // 1 0 3 bytes +#define RADIOLIB_NRF24_ADDRESS_4_BYTES 0b00000010 // 1 0 4 bytes +#define RADIOLIB_NRF24_ADDRESS_5_BYTES 0b00000011 // 1 0 5 bytes (default) + +// RADIOLIB_NRF24_REG_SETUP_RETR +#define RADIOLIB_NRF24_ARD 0b00000000 // 7 4 auto retransmit delay: t[us] = (NRF24_ARD + 1) * 250 us +#define RADIOLIB_NRF24_ARC_OFF 0b00000000 // 3 0 auto retransmit count: auto retransmit disabled +#define RADIOLIB_NRF24_ARC 0b00000011 // 3 0 up to 3 retransmits on AA fail (default) + +// RADIOLIB_NRF24_REG_RF_CH +#define RADIOLIB_NRF24_RF_CH 0b00000010 // 6 0 RF channel: f_CH[MHz] = 2400 MHz + NRF24_RF_CH + +// RADIOLIB_NRF24_REG_RF_SETUP +#define RADIOLIB_NRF24_CONT_WAVE_OFF 0b00000000 // 7 7 continuous carrier transmit: disabled (default) +#define RADIOLIB_NRF24_CONT_WAVE_ON 0b10000000 // 7 7 enabled +#define RADIOLIB_NRF24_DR_250_KBPS 0b00100000 // 5 5 data rate: 250 kbps +#define RADIOLIB_NRF24_DR_1_MBPS 0b00000000 // 3 3 1 Mbps (default) +#define RADIOLIB_NRF24_DR_2_MBPS 0b00001000 // 3 3 2 Mbps +#define RADIOLIB_NRF24_PLL_LOCK_ON 0b00010000 // 4 4 force PLL lock: enabled +#define RADIOLIB_NRF24_PLL_LOCK_OFF 0b00000000 // 4 4 disabled (default) +#define RADIOLIB_NRF24_RF_PWR_18_DBM 0b00000000 // 2 1 output power: -18 dBm +#define RADIOLIB_NRF24_RF_PWR_12_DBM 0b00000010 // 2 1 -12 dBm +#define RADIOLIB_NRF24_RF_PWR_6_DBM 0b00000100 // 2 1 -6 dBm +#define RADIOLIB_NRF24_RF_PWR_0_DBM 0b00000110 // 2 1 0 dBm (default) + +// RADIOLIB_NRF24_REG_STATUS +#define RADIOLIB_NRF24_RX_DR 0b01000000 // 6 6 Rx data ready +#define RADIOLIB_NRF24_TX_DS 0b00100000 // 5 5 Tx data sent +#define RADIOLIB_NRF24_MAX_RT 0b00010000 // 4 4 maximum number of retransmits reached (must be cleared to continue) +#define RADIOLIB_NRF24_RX_FIFO_EMPTY 0b00001110 // 3 1 Rx FIFO is empty +#define RADIOLIB_NRF24_RX_P_NO 0b00000000 // 3 1 number of data pipe that received data +#define RADIOLIB_NRF24_TX_FIFO_FULL 0b00000001 // 0 0 Tx FIFO is full + +// RADIOLIB_NRF24_REG_OBSERVE_TX +#define RADIOLIB_NRF24_PLOS_CNT 0b00000000 // 7 4 number of lost packets +#define RADIOLIB_NRF24_ARC_CNT 0b00000000 // 3 0 number of retransmitted packets + +// RADIOLIB_NRF24_REG_RPD +#define RADIOLIB_NRF24_RP_BELOW_64_DBM 0b00000000 // 0 0 received power in the current channel: less than -64 dBm +#define RADIOLIB_NRF24_RP_ABOVE_64_DBM 0b00000001 // 0 0 more than -64 dBm + +// RADIOLIB_NRF24_REG_FIFO_STATUS +#define RADIOLIB_NRF24_TX_REUSE 0b01000000 // 6 6 reusing last transmitted payload +#define RADIOLIB_NRF24_TX_FIFO_FULL_FLAG 0b00100000 // 5 5 Tx FIFO is full +#define RADIOLIB_NRF24_TX_FIFO_EMPTY_FLAG 0b00010000 // 4 4 Tx FIFO is empty +#define RADIOLIB_NRF24_RX_FIFO_FULL_FLAG 0b00000010 // 1 1 Rx FIFO is full +#define RADIOLIB_NRF24_RX_FIFO_EMPTY_FLAG 0b00000001 // 0 0 Rx FIFO is empty + +// RADIOLIB_NRF24_REG_DYNPD +#define RADIOLIB_NRF24_DPL_P5_OFF 0b00000000 // 5 5 dynamic payload length on pipe 5: disabled (default) +#define RADIOLIB_NRF24_DPL_P5_ON 0b00100000 // 5 5 enabled +#define RADIOLIB_NRF24_DPL_P4_OFF 0b00000000 // 4 4 dynamic payload length on pipe 4: disabled (default) +#define RADIOLIB_NRF24_DPL_P4_ON 0b00010000 // 4 4 enabled +#define RADIOLIB_NRF24_DPL_P3_OFF 0b00000000 // 3 3 dynamic payload length on pipe 3: disabled (default) +#define RADIOLIB_NRF24_DPL_P3_ON 0b00001000 // 3 3 enabled +#define RADIOLIB_NRF24_DPL_P2_OFF 0b00000000 // 2 2 dynamic payload length on pipe 2: disabled (default) +#define RADIOLIB_NRF24_DPL_P2_ON 0b00000100 // 2 2 enabled +#define RADIOLIB_NRF24_DPL_P1_OFF 0b00000000 // 1 1 dynamic payload length on pipe 1: disabled (default) +#define RADIOLIB_NRF24_DPL_P1_ON 0b00000010 // 1 1 enabled +#define RADIOLIB_NRF24_DPL_P0_OFF 0b00000000 // 0 0 dynamic payload length on pipe 0: disabled (default) +#define RADIOLIB_NRF24_DPL_P0_ON 0b00000001 // 0 0 enabled +#define RADIOLIB_NRF24_DPL_ALL_OFF 0b00000000 // 5 0 disable all dynamic payloads +#define RADIOLIB_NRF24_DPL_ALL_ON 0b00111111 // 5 0 enable all dynamic payloads + +// RADIOLIB_NRF24_REG_FEATURE +#define RADIOLIB_NRF24_DPL_OFF 0b00000000 // 2 2 dynamic payload length: disabled (default) +#define RADIOLIB_NRF24_DPL_ON 0b00000100 // 2 2 enabled +#define RADIOLIB_NRF24_ACK_PAY_OFF 0b00000000 // 1 1 payload with ACK packets: disabled (default) +#define RADIOLIB_NRF24_ACK_PAY_ON 0b00000010 // 1 1 enabled +#define RADIOLIB_NRF24_DYN_ACK_OFF 0b00000000 // 0 0 payloads without ACK: disabled (default) +#define RADIOLIB_NRF24_DYN_ACK_ON 0b00000001 // 0 0 enabled + +// RadioLib defaults +#define RADIOLIB_NRF24_DEFAULT_FREQ 2400 +#define RADIOLIB_NRF24_DEFAULT_DR 1000 +#define RADIOLIB_NRF24_DEFAULT_POWER -12 +#define RADIOLIB_NRF24_DEFAULT_ADDRWIDTH 5 + +/*! + \class nRF24 + \brief Control class for %nRF24 module. +*/ +class nRF24: public PhysicalLayer { + public: + // introduce PhysicalLayer overloads + using PhysicalLayer::transmit; + using PhysicalLayer::receive; + using PhysicalLayer::startTransmit; + using PhysicalLayer::readData; + + /*! + \brief Default constructor. + \param mod Instance of Module that will be used to communicate with the radio. + */ + nRF24(Module* mod); + + Module* getMod(); + + // basic methods + + /*! + \brief Initialization method. + \param freq Carrier frequency in MHz. Defaults to 2400 MHz. + \param dr Data rate to be used in kbps. Defaults to 1000 kbps. + \param pwr Output power in dBm. Defaults to -12 dBm. + \param addrWidth Address width in bytes. Defaults to 5 bytes. + \returns \ref status_codes + */ + int16_t begin( + int16_t freq = RADIOLIB_NRF24_DEFAULT_FREQ, + int16_t dr = RADIOLIB_NRF24_DEFAULT_DR, + int8_t pwr = RADIOLIB_NRF24_DEFAULT_POWER, + uint8_t addrWidth = RADIOLIB_NRF24_DEFAULT_ADDRWIDTH); + + /*! + \brief Sets the module to sleep mode. + \returns \ref status_codes + */ + int16_t sleep(); + + /*! + \brief Sets the module to standby mode. + \returns \ref status_codes + */ + int16_t standby() override; + + /*! + \brief Sets the module to standby. + \param mode Standby mode to be used. + \returns \ref status_codes + */ + int16_t standby(uint8_t mode) override; + + /*! + \brief Blocking binary transmit method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Dummy address parameter, to ensure PhysicalLayer compatibility. + \returns \ref status_codes + */ + int16_t transmit(uint8_t* data, size_t len, uint8_t addr) override; + + /*! + \brief Blocking binary receive method. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \returns \ref status_codes + */ + int16_t receive(uint8_t* data, size_t len) override; + + /*! + \brief Starts direct mode transmission. + \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0) override; + + /*! + \brief Dummy direct mode reception method, to ensure PhysicalLayer compatibility. + \returns \ref status_codes + */ + int16_t receiveDirect() override; + + // interrupt methods + + /*! + \brief Sets interrupt service routine to call when IRQ activates. + \param func ISR to call. + */ + void setIrqAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine . + */ + void clearIrqAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + void clearPacketSentAction(); + + /*! + \brief Interrupt-driven binary transmit method. IRQ will be activated when full packet is transmitted. + Overloads for string-based transmissions are implemented in PhysicalLayer. + \param data Binary data to be sent. + \param len Number of bytes to send. + \param addr Dummy address parameter, to ensure PhysicalLayer compatibility. + \returns \ref status_codes + */ + int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr) override; + + /*! + \brief Clean up after transmission is done. + \returns \ref status_codes + */ + int16_t finishTransmit() override; + + /*! + \brief Interrupt-driven receive method. IRQ will be activated when full packet is received. + \returns \ref status_codes + */ + int16_t startReceive(); + + /*! + \brief Interrupt-driven receive method, implemented for compatibility with PhysicalLayer. + \param timeout Ignored. + \param irqFlags Ignored. + \param irqMask Ignored. + \param len Ignored. + \returns \ref status_codes + */ + int16_t startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len); + + /*! + \brief Reads data received after calling startReceive method. When the packet length is not known in advance, + getPacketLength method must be called BEFORE calling readData! + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be received. Must be known in advance for binary transmissions. + \returns \ref status_codes + */ + int16_t readData(uint8_t* data, size_t len) override; + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 2400 MHz to 2525 MHz. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + /*! + \brief Sets bit rate. Allowed values are 2000, 1000 or 250 kbps. + \param br Bit rate to be set in kbps. + \returns \ref status_codes + */ + int16_t setBitRate(float br); + + /*! + \brief Sets output power. Allowed values are -18, -12, -6 or 0 dBm. + \param pwr Output power to be set in dBm. + \returns \ref status_codes + */ + int16_t setOutputPower(int8_t pwr); + + /*! + \brief Sets address width of transmit and receive pipes in bytes. Allowed values are 3, 4 or 5 bytes. + \param addrWidth Address width to be set in bytes. + \returns \ref status_codes + */ + int16_t setAddressWidth(uint8_t addrWidth); + + /*! + \brief Sets address of transmit pipe. The address width must be the same as the same + as the configured in setAddressWidth. + \param addr Address to which the next packet shall be transmitted. + \returns \ref status_codes + */ + int16_t setTransmitPipe(uint8_t* addr); + + /*! + \brief Sets address of receive pipes 0 or 1. The address width must be the same as the same + as the configured in setAddressWidth. + \param pipeNum Number of pipe to which the address shall be set. Either 0 or 1, + other pipes are handled using overloaded method. + \param addr Address from which %nRF24 shall receive new packets on the specified pipe. + \returns \ref status_codes + */ + int16_t setReceivePipe(uint8_t pipeNum, uint8_t* addr); + + /*! + \brief Sets address of receive pipes 2 - 5. The first 2 - 4 address bytes for these pipes + are the same as for address pipe 1, only the last byte can be set. + \param pipeNum Number of pipe to which the address shall be set. Allowed values range from 2 to 5. + \param addrByte LSB of address from which %nRF24 shall receive new packets on the specified pipe. + \returns \ref status_codes + */ + int16_t setReceivePipe(uint8_t pipeNum, uint8_t addrByte); + + /*! + \brief Disables specified receive pipe. + \param pipeNum Receive pipe to be disabled. + \returns \ref status_codes + */ + int16_t disablePipe(uint8_t pipeNum); + + /*! + \brief Gets nRF24 status register. + \param mask Bit mask to be used on the returned register value. + \returns Status register value or \ref status_codes + */ + int16_t getStatus(uint8_t mask = 0xFF); + + /*! + \brief Checks if carrier was detected during last RX + \returns Whatever the carrier was above threshold. + */ + bool isCarrierDetected(); + + /*! + \brief Dummy configuration method, to ensure PhysicalLayer compatibility. + \param freqDev Dummy frequency deviation parameter, no configuration will be changed. + \returns \ref status_codes + */ + int16_t setFrequencyDeviation(float freqDev) override; + + /*! + \brief Query modem for the packet length of received payload. + \param update Update received packet length. Will return cached value when set to false. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update = true) override; + + /*! + \brief Enable CRC filtering and generation. + \param crcOn Set or unset CRC check. + \returns \ref status_codes + */ + int16_t setCrcFiltering(bool crcOn = true); + + /*! + \brief Enable or disable auto-acknowledge packets on all pipes. + \param autoAckOn Enable (true) or disable (false) auto-acks. + \returns \ref status_codes + */ + int16_t setAutoAck(bool autoAckOn = true); + + /*! + \brief Enable or disable auto-acknowledge packets on given pipe. + \param pipeNum Number of pipe to which enable / disable auto-acks. + \param autoAckOn Enable (true) or disable (false) auto-acks. + \returns \ref status_codes + */ + int16_t setAutoAck(uint8_t pipeNum, bool autoAckOn); + + /*! + \brief Dummy data shaping configuration method, to ensure PhysicalLayer compatibility. + \param sh Ignored. + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! + \brief Dummy encoding configuration method, to ensure PhysicalLayer compatibility. + \param sh Ignored. + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding) override; + +#if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) + protected: +#endif + Module* mod; + + void SPIreadRxPayload(uint8_t* data, uint8_t numBytes); + void SPIwriteTxPayload(uint8_t* data, uint8_t numBytes); + void SPItransfer(uint8_t cmd, bool write = false, uint8_t* dataOut = NULL, uint8_t* dataIn = NULL, uint8_t numBytes = 0); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + + int16_t frequency = RADIOLIB_NRF24_DEFAULT_FREQ; + int16_t dataRate = RADIOLIB_NRF24_DEFAULT_DR; + int8_t power = RADIOLIB_NRF24_DEFAULT_POWER; + uint8_t addressWidth = RADIOLIB_NRF24_DEFAULT_ADDRWIDTH; + + int16_t config(); + void clearIRQ(); +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AFSK/AFSK.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AFSK/AFSK.cpp new file mode 100644 index 00000000..6d7e518d --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AFSK/AFSK.cpp @@ -0,0 +1,42 @@ +#include "AFSK.h" +#if !defined(RADIOLIB_EXCLUDE_AFSK) + +AFSKClient::AFSKClient(PhysicalLayer* phy, uint32_t pin): outPin(pin) { + phyLayer = phy; +} + +AFSKClient::AFSKClient(AFSKClient* aud) { + phyLayer = aud->phyLayer; + outPin = aud->outPin; +} + +int16_t AFSKClient::begin() { + return(phyLayer->startDirect()); +} + +int16_t AFSKClient::tone(uint16_t freq, bool autoStart) { + if(freq == 0) { + return(RADIOLIB_ERR_INVALID_FREQUENCY); + } + + if(autoStart) { + int16_t state = phyLayer->transmitDirect(); + RADIOLIB_ASSERT(state); + } + + Module* mod = phyLayer->getMod(); + mod->hal->tone(outPin, freq); + return(RADIOLIB_ERR_NONE); +} + +int16_t AFSKClient::noTone(bool keepOn) { + Module* mod = phyLayer->getMod(); + mod->hal->noTone(outPin); + if(keepOn) { + return(0); + } + + return(phyLayer->standby()); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AFSK/AFSK.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AFSK/AFSK.h new file mode 100644 index 00000000..3b69f308 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AFSK/AFSK.h @@ -0,0 +1,70 @@ +#if !defined(_RADIOLIB_AFSK_H) +#define _RADIOLIB_AFSK_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_AFSK) + +#include "../../Module.h" + +#include "../PhysicalLayer/PhysicalLayer.h" + +/*! + \class AFSKClient + \brief Client for audio-based transmissions. Requires Arduino tone() function, and a module capable of direct mode transmission using DIO pins. +*/ +class AFSKClient { + public: + /*! + \brief Default contructor. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + \param pin The pin that will be used for audio output. + */ + AFSKClient(PhysicalLayer* phy, uint32_t pin); + + /*! + \brief Copy contructor. + \param aud Pointer to the AFSKClient instance to copy. + */ + AFSKClient(AFSKClient* aud); + + /*! + \brief Initialization method. + \returns \ref status_codes + */ + int16_t begin(); + + /*! + \brief Start transmitting audio tone. + \param freq Frequency of the tone in Hz. + \param autoStart Whether to automatically enter transmission mode. Defaults to true. + \returns \ref status_codes + */ + int16_t tone(uint16_t freq, bool autoStart = true); + + /*! + \brief Stops transmitting audio tone. + \param freq Keep transmitter on - this may limit noise when switching transmitter on or off. + \returns \ref status_codes + */ + int16_t noTone(bool keepOn = false); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + PhysicalLayer* phyLayer; + uint32_t outPin; + + // allow specific classes access the private PhysicalLayer pointer + friend class RTTYClient; + friend class MorseClient; + friend class HellClient; + friend class SSTVClient; + friend class AX25Client; + friend class FSK4Client; + friend class BellClient; +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/APRS/APRS.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/APRS/APRS.cpp new file mode 100644 index 00000000..3458272e --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/APRS/APRS.cpp @@ -0,0 +1,267 @@ +#include "APRS.h" +#include +#include +#include +#if !defined(RADIOLIB_EXCLUDE_APRS) + +APRSClient::APRSClient(AX25Client* ax) { + axClient = ax; + phyLayer = nullptr; +} + +APRSClient::APRSClient(PhysicalLayer* phy) { + axClient = nullptr; + phyLayer = phy; +} + +int16_t APRSClient::begin(char sym, char* callsign, uint8_t ssid, bool alt) { + RADIOLIB_CHECK_RANGE(sym, ' ', '}', RADIOLIB_ERR_INVALID_SYMBOL); + symbol = sym; + + if(alt) { + table = '\\'; + } else { + table = '/'; + } + + if(strlen(callsign) > RADIOLIB_AX25_MAX_CALLSIGN_LEN) { + return(RADIOLIB_ERR_INVALID_CALLSIGN); + } + + memcpy(this->src, callsign, strlen(callsign)); + this->id = ssid; + + return(RADIOLIB_ERR_NONE); +} + +int16_t APRSClient::sendPosition(char* destCallsign, uint8_t destSSID, char* lat, char* lon, char* msg, char* time) { + size_t len = 1 + strlen(lat) + 1 + strlen(lon); + if(msg != NULL) { + len += 1 + strlen(msg); + } + if(time != NULL) { + len += strlen(time); + } + #if !defined(RADIOLIB_STATIC_ONLY) + char* info = new char[len + 1]; + #else + char info[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + + // build the info field + if((msg == NULL) && (time == NULL)) { + // no message, no timestamp + sprintf(info, RADIOLIB_APRS_DATA_TYPE_POSITION_NO_TIME_NO_MSG "%s%c%s%c", lat, table, lon, symbol); + } else if((msg != NULL) && (time == NULL)) { + // message, no timestamp + sprintf(info, RADIOLIB_APRS_DATA_TYPE_POSITION_NO_TIME_MSG "%s%c%s%c%s", lat, table, lon, symbol, msg); + } else if((msg == NULL) && (time != NULL)) { + // timestamp, no message + sprintf(info, RADIOLIB_APRS_DATA_TYPE_POSITION_TIME_NO_MSG "%s%s%c%s%c", time, lat, table, lon, symbol); + } else { + // timestamp and message + sprintf(info, RADIOLIB_APRS_DATA_TYPE_POSITION_TIME_MSG "%s%s%c%s%c%s", time, lat, table, lon, symbol, msg); + } + info[len] = '\0'; + + // send the frame + int16_t state = sendFrame(destCallsign, destSSID, info); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] info; + #endif + return(state); +} + +int16_t APRSClient::sendMicE(float lat, float lon, uint16_t heading, uint16_t speed, uint8_t type, uint8_t* telem, size_t telemLen, char* grid, char* status, int32_t alt) { + // sanity checks first + if(((telemLen == 0) && (telem != NULL)) || ((telemLen != 0) && (telem == NULL))) { + return(RADIOLIB_ERR_INVALID_MIC_E_TELEMETRY); + } + + if((telemLen != 0) && (telemLen != 2) && (telemLen != 5)) { + return(RADIOLIB_ERR_INVALID_MIC_E_TELEMETRY_LENGTH); + } + + if((telemLen > 0) && ((grid != NULL) || (status != NULL) || (alt != RADIOLIB_APRS_MIC_E_ALTITUDE_UNUSED))) { + // can't have both telemetry and status + return(RADIOLIB_ERR_MIC_E_TELEMETRY_STATUS); + } + + // prepare buffers + char destCallsign[7]; + #if !defined(RADIOLIB_STATIC_ONLY) + size_t infoLen = 10; + if(telemLen > 0) { + infoLen += 1 + telemLen; + } else { + if(grid != NULL) { + infoLen += strlen(grid) + 2; + } + if(status != NULL) { + infoLen += strlen(status); + } + if(alt > RADIOLIB_APRS_MIC_E_ALTITUDE_UNUSED) { + infoLen += 4; + } + } + char* info = new char[infoLen]; + #else + char info[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + size_t infoPos = 0; + + // the following is based on APRS Mic-E implementation by https://github.com/omegat + // as discussed in https://github.com/jgromes/RadioLib/issues/430 + + // latitude first, because that is in the destination field + float lat_abs = RADIOLIB_ABS(lat); + int lat_deg = (int)lat_abs; + int lat_min = (lat_abs - (float)lat_deg) * 60.0f; + int lat_hun = (((lat_abs - (float)lat_deg) * 60.0f) - lat_min) * 100.0f; + destCallsign[0] = lat_deg/10; + destCallsign[1] = lat_deg%10; + destCallsign[2] = lat_min/10; + destCallsign[3] = lat_min%10; + destCallsign[4] = lat_hun/10; + destCallsign[5] = lat_hun%10; + + // next, add the extra bits + if(type & 0x04) { destCallsign[0] += RADIOLIB_APRS_MIC_E_DEST_BIT_OFFSET; } + if(type & 0x02) { destCallsign[1] += RADIOLIB_APRS_MIC_E_DEST_BIT_OFFSET; } + if(type & 0x01) { destCallsign[2] += RADIOLIB_APRS_MIC_E_DEST_BIT_OFFSET; } + if(lat >= 0) { destCallsign[3] += RADIOLIB_APRS_MIC_E_DEST_BIT_OFFSET; } + if(lon >= 100 || lon <= -100) { destCallsign[4] += RADIOLIB_APRS_MIC_E_DEST_BIT_OFFSET; } + if(lon < 0) { destCallsign[5] += RADIOLIB_APRS_MIC_E_DEST_BIT_OFFSET; } + destCallsign[6] = '\0'; + + // now convert to Mic-E characters to get the "callsign" + for(uint8_t i = 0; i < 6; i++) { + if(destCallsign[i] <= 9) { + destCallsign[i] += '0'; + } else { + destCallsign[i] += ('A' - 10); + } + } + + // setup the information field + info[infoPos++] = RADIOLIB_APRS_MIC_E_GPS_DATA_CURRENT; + + // encode the longtitude + float lon_abs = RADIOLIB_ABS(lon); + int32_t lon_deg = (int32_t)lon_abs; + int32_t lon_min = (lon_abs - (float)lon_deg) * 60.0f; + int32_t lon_hun = (((lon_abs - (float)lon_deg) * 60.0f) - lon_min) * 100.0f; + + if(lon_deg <= 9) { + info[infoPos++] = lon_deg + 118; + } else if(lon_deg <= 99) { + info[infoPos++] = lon_deg + 28; + } else if(lon_deg <= 109) { + info[infoPos++] = lon_deg + 8; + } else { + info[infoPos++] = lon_deg - 72; + } + + if(lon_min <= 9){ + info[infoPos++] = lon_min + 88; + } else { + info[infoPos++] = lon_min + 28; + } + + info[infoPos++] = lon_hun + 28; + + // now the speed and heading - this gets really weird + int32_t speed_hun_ten = speed/10; + int32_t speed_uni = speed%10; + int32_t head_hun = heading/100; + int32_t head_ten_uni = heading%100; + + if(speed <= 199) { + info[infoPos++] = speed_hun_ten + 'l'; + } else { + info[infoPos++] = speed_hun_ten + '0'; + } + + info[infoPos++] = speed_uni*10 + head_hun + 32; + info[infoPos++] = head_ten_uni + 28; + info[infoPos++] = symbol; + info[infoPos++] = table; + + // onto the optional stuff - check telemetry first + if(telemLen > 0) { + if(telemLen == 2) { + info[infoPos++] = RADIOLIB_APRS_MIC_E_TELEMETRY_LEN_2; + } else { + info[infoPos++] = RADIOLIB_APRS_MIC_E_TELEMETRY_LEN_5; + } + for(uint8_t i = 0; i < telemLen; i++) { + sprintf(&(info[infoPos]), "%02X", telem[i]); + infoPos += 2; + } + + } else { + if(grid != NULL) { + memcpy(&(info[infoPos]), grid, strlen(grid)); + infoPos += strlen(grid); + info[infoPos++] = '/'; + info[infoPos++] = 'G'; + } + if(status != NULL) { + info[infoPos++] = ' '; + memcpy(&(info[infoPos]), status, strlen(status)); + infoPos += strlen(status); + } + if(alt > RADIOLIB_APRS_MIC_E_ALTITUDE_UNUSED) { + // altitude is offset by -10 km + int32_t alt_val = alt + 10000; + + // ... and encoded in base 91 for some reason + info[infoPos++] = (alt_val / 8281) + 33; + info[infoPos++] = ((alt_val % 8281) / 91) + 33; + info[infoPos++] = ((alt_val % 8281) % 91) + 33; + info[infoPos++] = '}'; + } + } + info[infoPos++] = '\0'; + + // send the frame + uint8_t destSSID = 0; + if(this->phyLayer != nullptr) { + // TODO make SSID configurable? + destSSID = 1; + } + int16_t state = sendFrame(destCallsign, destSSID, info); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] info; + #endif + return(state); +} + +int16_t APRSClient::sendFrame(char* destCallsign, uint8_t destSSID, char* info) { + // encoding depends on whether AX.25 should be used or not + if(this->axClient != nullptr) { + // AX.25/classical mode, get AX.25 callsign + char srcCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1]; + axClient->getCallsign(srcCallsign); + + AX25Frame frameUI(destCallsign, destSSID, srcCallsign, axClient->getSSID(), RADIOLIB_AX25_CONTROL_U_UNNUMBERED_INFORMATION | + RADIOLIB_AX25_CONTROL_POLL_FINAL_DISABLED | RADIOLIB_AX25_CONTROL_UNNUMBERED_FRAME, + RADIOLIB_AX25_PID_NO_LAYER_3, (const char*)info); + + return(axClient->sendFrame(&frameUI)); + + } else if(this->phyLayer != nullptr) { + // non-AX.25/LoRa mode + size_t len = RADIOLIB_APRS_LORA_HEADER_LEN + strlen(this->src) + 4 + strlen(destCallsign) + 11 + strlen(info); + char* buff = new char[len]; + snprintf(buff, len, RADIOLIB_APRS_LORA_HEADER "%s-%d>%s,WIDE%d-%d:%s", this->src, this->id, destCallsign, destSSID, destSSID, info); + + int16_t res = this->phyLayer->transmit((uint8_t*)buff, strlen(buff)); + delete[] buff; + return(res); + } + + return(RADIOLIB_ERR_WRONG_MODEM); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/APRS/APRS.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/APRS/APRS.h new file mode 100644 index 00000000..ee74cfa0 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/APRS/APRS.h @@ -0,0 +1,148 @@ +#if !defined(_RADIOLIB_RADIOLIB_APRS_H) +#define _RADIOLIB_RADIOLIB_APRS_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_APRS) + +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../AX25/AX25.h" + +// APRS data type identifiers +#define RADIOLIB_APRS_DATA_TYPE_POSITION_NO_TIME_NO_MSG "!" +#define RADIOLIB_APRS_DATA_TYPE_GPS_RAW "$" +#define RADIOLIB_APRS_DATA_TYPE_ITEM ")" +#define RADIOLIB_APRS_DATA_TYPE_TEST "," +#define RADIOLIB_APRS_DATA_TYPE_POSITION_TIME_NO_MSG "/" +#define RADIOLIB_APRS_DATA_TYPE_MSG ":" +#define RADIOLIB_APRS_DATA_TYPE_OBJECT ";" +#define RADIOLIB_APRS_DATA_TYPE_STATION_CAPABILITES "<" +#define RADIOLIB_APRS_DATA_TYPE_POSITION_NO_TIME_MSG "=" +#define RADIOLIB_APRS_DATA_TYPE_STATUS ">" +#define RADIOLIB_APRS_DATA_TYPE_QUERY "?" +#define RADIOLIB_APRS_DATA_TYPE_POSITION_TIME_MSG "@" +#define RADIOLIB_APRS_DATA_TYPE_TELEMETRY "T" +#define RADIOLIB_APRS_DATA_TYPE_MAIDENHEAD_BEACON "[" +#define RADIOLIB_APRS_DATA_TYPE_WEATHER_REPORT "_" +#define RADIOLIB_APRS_DATA_TYPE_USER_DEFINED "{" +#define RADIOLIB_APRS_DATA_TYPE_THIRD_PARTY "}" + +/*! + \defgroup mic_e_message_types Mic-E message types. + + \{ +*/ +#define RADIOLIB_APRS_MIC_E_TYPE_OFF_DUTY 0b00000111 +#define RADIOLIB_APRS_MIC_E_TYPE_EN_ROUTE 0b00000110 +#define RADIOLIB_APRS_MIC_E_TYPE_IN_SERVICE 0b00000101 +#define RADIOLIB_APRS_MIC_E_TYPE_RETURNING 0b00000100 +#define RADIOLIB_APRS_MIC_E_TYPE_COMMITTED 0b00000011 +#define RADIOLIB_APRS_MIC_E_TYPE_SPECIAL 0b00000010 +#define RADIOLIB_APRS_MIC_E_TYPE_PRIORITY 0b00000001 +#define RADIOLIB_APRS_MIC_E_TYPE_EMERGENCY 0b00000000 +/*! + \} +*/ + +// magic offset applied to encode extra bits in the Mic-E destination field +#define RADIOLIB_APRS_MIC_E_DEST_BIT_OFFSET 25 + +// Mic-E data types +#define RADIOLIB_APRS_MIC_E_GPS_DATA_CURRENT '`' +#define RADIOLIB_APRS_MIC_E_GPS_DATA_OLD '\'' + +// Mic-E telemetry flags +#define RADIOLIB_APRS_MIC_E_TELEMETRY_LEN_2 '`' +#define RADIOLIB_APRS_MIC_E_TELEMETRY_LEN_5 '\'' + +// alias for unused altitude in Mic-E +#define RADIOLIB_APRS_MIC_E_ALTITUDE_UNUSED -1000000 + +// special header applied for APRS over LoRa +#define RADIOLIB_APRS_LORA_HEADER "<\xff\x01" +#define RADIOLIB_APRS_LORA_HEADER_LEN (3) + +/*! + \class APRSClient + \brief Client for APRS communication. +*/ +class APRSClient { + public: + /*! + \brief Constructor for "classic" mode using AX.25/AFSK. + \param ax Pointer to the instance of AX25Client to be used for APRS. + */ + explicit APRSClient(AX25Client* ax); + + /*! + \brief Constructor for LoRa mode. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + explicit APRSClient(PhysicalLayer* phy); + + // basic methods + + /*! + \brief Initialization method. + \param sym APRS symbol to be displayed. + \param callsign Source callsign. Required and only used for APRS over LoRa, ignored in classic mode. + \param ssid Source SSID. Only used for APRS over LoRa, ignored in classic mode, defaults to 0. + \param alt Whether to use the primary (false) or alternate (true) symbol table. Defaults to primary table. + \returns \ref status_codes + */ + int16_t begin(char sym, char* callsign = NULL, uint8_t ssid = 0, bool alt = false); + + /*! + \brief Transmit position. + \param destCallsign Destination station callsign. + \param destSSID Destination station SSID. + \param lat Latitude as a null-terminated string. + \param long Longitude as a null-terminated string. + \param msg Message to be transmitted. Defaults to NULL (no message). + \param msg Position timestamp. Defaults to NULL (no timestamp). + \returns \ref status_codes + */ + int16_t sendPosition(char* destCallsign, uint8_t destSSID, char* lat, char* lon, char* msg = NULL, char* time = NULL); + + /*! + \brief Transmit position using Mic-E encoding. + \param lat Geographical latitude, positive for north, negative for south. + \param lon Geographical longitude, positive for east, negative for west. + \param heading Heading in degrees. + \param speed Speed in knots. + \param type Mic-E message type - see \ref mic_e_message_types. + \param telem Pointer to telemetry array (either 2 or 5 bytes long). NULL when telemetry is not used. + \param telemLen Telemetry length, 2 or 5. 0 when telemetry is not used. + \param grid Maidenhead grid locator. NULL when not used. + \param status Status message to send. NULL when not used. + \param alt Altitude to send. RADIOLIB_APRS_MIC_E_ALTITUDE_UNUSED when not used. + */ + int16_t sendMicE(float lat, float lon, uint16_t heading, uint16_t speed, uint8_t type, uint8_t* telem = NULL, size_t telemLen = 0, char* grid = NULL, char* status = NULL, int32_t alt = RADIOLIB_APRS_MIC_E_ALTITUDE_UNUSED); + + /*! + \brief Transmit generic APRS frame. + \param destCallsign Destination station callsign. + \param destSSID Destination station SSID. + \param info AX.25 info field contents. + \returns \ref status_codes + */ + int16_t sendFrame(char* destCallsign, uint8_t destSSID, char* info); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + AX25Client* axClient; + PhysicalLayer* phyLayer; + + // default APRS symbol (car) + char symbol = '>'; + char table = '/'; + + // source callsign when using APRS over LoRa + char src[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1] = { 0 }; + uint8_t id = 0; +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AX25/AX25.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AX25/AX25.cpp new file mode 100644 index 00000000..fc3e24e0 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AX25/AX25.cpp @@ -0,0 +1,450 @@ +#include "AX25.h" +#include +#if !defined(RADIOLIB_EXCLUDE_AX25) + +AX25Frame::AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control) +: AX25Frame(destCallsign, destSSID, srcCallsign, srcSSID, control, 0, NULL, 0) { + +} + +AX25Frame::AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, const char* info) + : AX25Frame(destCallsign, destSSID, srcCallsign, srcSSID, control, protocolID, (uint8_t*)info, strlen(info)) { + +} + +AX25Frame::AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, uint8_t* info, uint16_t infoLen) { + // destination callsign/SSID + memcpy(this->destCallsign, destCallsign, strlen(destCallsign)); + this->destCallsign[strlen(destCallsign)] = '\0'; + this->destSSID = destSSID; + + // source callsign/SSID + memcpy(this->srcCallsign, srcCallsign, strlen(srcCallsign)); + this->srcCallsign[strlen(srcCallsign)] = '\0'; + this->srcSSID = srcSSID; + + // set repeaters + this->numRepeaters = 0; + #if !defined(RADIOLIB_STATIC_ONLY) + this->repeaterCallsigns = NULL; + this->repeaterSSIDs = NULL; + #endif + + // control field + this->control = control; + + // sequence numbers + this->rcvSeqNumber = 0; + this->sendSeqNumber = 0; + + // PID field + this->protocolID = protocolID; + + // info field + this->infoLen = infoLen; + if(infoLen > 0) { + #if !defined(RADIOLIB_STATIC_ONLY) + this->info = new uint8_t[infoLen]; + #endif + memcpy(this->info, info, infoLen); + } +} + +AX25Frame::AX25Frame(const AX25Frame& frame) { + *this = frame; +} + +AX25Frame::~AX25Frame() { + #if !defined(RADIOLIB_STATIC_ONLY) + // deallocate info field + if(infoLen > 0) { + delete[] this->info; + } + + // deallocate repeaters + if(this->numRepeaters > 0) { + for(uint8_t i = 0; i < this->numRepeaters; i++) { + delete[] this->repeaterCallsigns[i]; + } + delete[] this->repeaterCallsigns; + delete[] this->repeaterSSIDs; + } + #endif +} + +AX25Frame& AX25Frame::operator=(const AX25Frame& frame) { + // destination callsign/SSID + memcpy(this->destCallsign, frame.destCallsign, strlen(frame.destCallsign)); + this->destCallsign[strlen(frame.destCallsign)] = '\0'; + this->destSSID = frame.destSSID; + + // source callsign/SSID + memcpy(this->srcCallsign, frame.srcCallsign, strlen(frame.srcCallsign)); + this->srcCallsign[strlen(frame.srcCallsign)] = '\0'; + this->srcSSID = frame.srcSSID; + + // repeaters + this->numRepeaters = frame.numRepeaters; + for(uint8_t i = 0; i < this->numRepeaters; i++) { + memcpy(this->repeaterCallsigns[i], frame.repeaterCallsigns[i], strlen(frame.repeaterCallsigns[i])); + } + memcpy(this->repeaterSSIDs, frame.repeaterSSIDs, this->numRepeaters); + + // control field + this->control = frame.control; + + // sequence numbers + this->rcvSeqNumber = frame.rcvSeqNumber; + this->sendSeqNumber = frame.sendSeqNumber; + + // PID field + this->protocolID = frame.protocolID; + + // info field + this->infoLen = frame.infoLen; + memcpy(this->info, frame.info, this->infoLen); + + return(*this); +} + +int16_t AX25Frame::setRepeaters(char** repeaterCallsigns, uint8_t* repeaterSSIDs, uint8_t numRepeaters) { + // check number of repeaters + if((numRepeaters < 1) || (numRepeaters > 8)) { + return(RADIOLIB_ERR_INVALID_NUM_REPEATERS); + } + + // check repeater configuration + if((repeaterCallsigns == NULL) || (repeaterSSIDs == NULL)) { + return(RADIOLIB_ERR_INVALID_NUM_REPEATERS); + } + for(uint16_t i = 0; i < numRepeaters; i++) { + if(strlen(repeaterCallsigns[i]) > RADIOLIB_AX25_MAX_CALLSIGN_LEN) { + return(RADIOLIB_ERR_INVALID_REPEATER_CALLSIGN); + } + } + + // create buffers + #if !defined(RADIOLIB_STATIC_ONLY) + this->repeaterCallsigns = new char*[numRepeaters]; + for(uint8_t i = 0; i < numRepeaters; i++) { + this->repeaterCallsigns[i] = new char[strlen(repeaterCallsigns[i]) + 1]; + } + this->repeaterSSIDs = new uint8_t[numRepeaters]; + #endif + + // copy data + this->numRepeaters = numRepeaters; + for(uint8_t i = 0; i < numRepeaters; i++) { + memcpy(this->repeaterCallsigns[i], repeaterCallsigns[i], strlen(repeaterCallsigns[i])); + this->repeaterCallsigns[i][strlen(repeaterCallsigns[i])] = '\0'; + } + memcpy(this->repeaterSSIDs, repeaterSSIDs, numRepeaters); + + return(RADIOLIB_ERR_NONE); +} + +void AX25Frame::setRecvSequence(uint8_t seqNumber) { + this->rcvSeqNumber = seqNumber; +} + +void AX25Frame::setSendSequence(uint8_t seqNumber) { + this->sendSeqNumber = seqNumber; +} + +AX25Client::AX25Client(PhysicalLayer* phy) { + phyLayer = phy; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + bellModem = nullptr; + #endif +} + +#if !defined(RADIOLIB_EXCLUDE_AFSK) +AX25Client::AX25Client(AFSKClient* audio) { + phyLayer = audio->phyLayer; + bellModem = new BellClient(audio); + bellModem->setModem(Bell202); +} + +int16_t AX25Client::setCorrection(int16_t mark, int16_t space, float length) { + BellModem_t modem; + modem.freqMark = Bell202.freqMark + mark; + modem.freqSpace = Bell202.freqSpace + space; + modem.freqMarkReply = modem.freqMark; + modem.freqSpaceReply = modem.freqSpace; + modem.baudRate = length*(float)Bell202.baudRate; + bellModem->setModem(modem); + return(RADIOLIB_ERR_NONE); +} +#endif + +int16_t AX25Client::begin(const char* srcCallsign, uint8_t srcSSID, uint8_t preLen) { + // set source SSID + sourceSSID = srcSSID; + + // check source callsign length (6 characters max) + if(strlen(srcCallsign) > RADIOLIB_AX25_MAX_CALLSIGN_LEN) { + return(RADIOLIB_ERR_INVALID_CALLSIGN); + } + + // copy callsign + memcpy(sourceCallsign, srcCallsign, strlen(srcCallsign)); + sourceCallsign[strlen(srcCallsign)] = '\0'; + + // save preamble length + preambleLen = preLen; + + // configure for direct mode + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(bellModem != nullptr) { + return(phyLayer->startDirect()); + } + #endif + return(RADIOLIB_ERR_NONE); +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t AX25Client::transmit(String& str, const char* destCallsign, uint8_t destSSID) { + return(transmit(str.c_str(), destCallsign, destSSID)); +} +#endif + +int16_t AX25Client::transmit(const char* str, const char* destCallsign, uint8_t destSSID) { + // create control field + uint8_t controlField = RADIOLIB_AX25_CONTROL_U_UNNUMBERED_INFORMATION | RADIOLIB_AX25_CONTROL_POLL_FINAL_DISABLED | RADIOLIB_AX25_CONTROL_UNNUMBERED_FRAME; + + // build the frame + AX25Frame frame(destCallsign, destSSID, sourceCallsign, sourceSSID, controlField, RADIOLIB_AX25_PID_NO_LAYER_3, (uint8_t*)str, strlen(str)); + + // send Unnumbered Information frame + return(sendFrame(&frame)); +} + +int16_t AX25Client::sendFrame(AX25Frame* frame) { + // check destination callsign length (6 characters max) + if(strlen(frame->destCallsign) > RADIOLIB_AX25_MAX_CALLSIGN_LEN) { + return(RADIOLIB_ERR_INVALID_CALLSIGN); + } + + // check repeater configuration + #if !defined(RADIOLIB_STATIC_ONLY) + if(!(((frame->repeaterCallsigns == NULL) && (frame->repeaterSSIDs == NULL) && (frame->numRepeaters == 0)) || + ((frame->repeaterCallsigns != NULL) && (frame->repeaterSSIDs != NULL) && (frame->numRepeaters != 0)))) { + return(RADIOLIB_ERR_INVALID_NUM_REPEATERS); + } + for(uint16_t i = 0; i < frame->numRepeaters; i++) { + if(strlen(frame->repeaterCallsigns[i]) > RADIOLIB_AX25_MAX_CALLSIGN_LEN) { + return(RADIOLIB_ERR_INVALID_REPEATER_CALLSIGN); + } + } + #endif + + // calculate frame length without FCS (destination address, source address, repeater addresses, control, PID, info) + size_t frameBuffLen = ((2 + frame->numRepeaters)*(RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1)) + 1 + 1 + frame->infoLen; + // create frame buffer without preamble, start or stop flags + #if !defined(RADIOLIB_STATIC_ONLY) + uint8_t* frameBuff = new uint8_t[frameBuffLen + 2]; + #else + uint8_t frameBuff[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + uint8_t* frameBuffPtr = frameBuff; + + // set destination callsign - all address field bytes are shifted by one bit to make room for HDLC address extension bit + memset(frameBuffPtr, ' ' << 1, RADIOLIB_AX25_MAX_CALLSIGN_LEN); + for(size_t i = 0; i < strlen(frame->destCallsign); i++) { + *(frameBuffPtr + i) = frame->destCallsign[i] << 1; + } + frameBuffPtr += RADIOLIB_AX25_MAX_CALLSIGN_LEN; + + // set destination SSID + *(frameBuffPtr++) = RADIOLIB_AX25_SSID_RESPONSE_DEST | RADIOLIB_AX25_SSID_RESERVED_BITS | (frame->destSSID & 0x0F) << 1 | RADIOLIB_AX25_SSID_HDLC_EXTENSION_CONTINUE; + + // set source callsign - all address field bytes are shifted by one bit to make room for HDLC address extension bit + memset(frameBuffPtr, ' ' << 1, RADIOLIB_AX25_MAX_CALLSIGN_LEN); + for(size_t i = 0; i < strlen(frame->srcCallsign); i++) { + *(frameBuffPtr + i) = frame->srcCallsign[i] << 1; + } + frameBuffPtr += RADIOLIB_AX25_MAX_CALLSIGN_LEN; + + // set source SSID + *(frameBuffPtr++) = RADIOLIB_AX25_SSID_COMMAND_SOURCE | RADIOLIB_AX25_SSID_RESERVED_BITS | (frame->srcSSID & 0x0F) << 1 | RADIOLIB_AX25_SSID_HDLC_EXTENSION_CONTINUE; + + // set repeater callsigns + for(uint16_t i = 0; i < frame->numRepeaters; i++) { + memset(frameBuffPtr, ' ' << 1, RADIOLIB_AX25_MAX_CALLSIGN_LEN); + for(size_t j = 0; j < strlen(frame->repeaterCallsigns[i]); j++) { + *(frameBuffPtr + j) = frame->repeaterCallsigns[i][j] << 1; + } + frameBuffPtr += RADIOLIB_AX25_MAX_CALLSIGN_LEN; + *(frameBuffPtr++) = RADIOLIB_AX25_SSID_HAS_NOT_BEEN_REPEATED | RADIOLIB_AX25_SSID_RESERVED_BITS | (frame->repeaterSSIDs[i] & 0x0F) << 1 | RADIOLIB_AX25_SSID_HDLC_EXTENSION_CONTINUE; + } + + // set HDLC extension end bit + *(frameBuffPtr - 1) |= RADIOLIB_AX25_SSID_HDLC_EXTENSION_END; + + // set sequence numbers of the frames that have it + uint8_t controlField = frame->control; + if((frame->control & 0x01) == 0) { + // information frame, set both sequence numbers + controlField |= frame->rcvSeqNumber << 5; + controlField |= frame->sendSeqNumber << 1; + } else if((frame->control & 0x02) == 0) { + // supervisory frame, set only receive sequence number + controlField |= frame->rcvSeqNumber << 5; + } + + // set control field + *(frameBuffPtr++) = controlField; + + // set PID field of the frames that have it + if(frame->protocolID != 0x00) { + *(frameBuffPtr++) = frame->protocolID; + } + + // set info field of the frames that have it + if(frame->infoLen > 0) { + memcpy(frameBuffPtr, frame->info, frame->infoLen); + frameBuffPtr += frame->infoLen; + } + + // flip bit order + for(size_t i = 0; i < frameBuffLen; i++) { + frameBuff[i] = Module::reflect(frameBuff[i], 8); + } + + // calculate + RadioLibCRCInstance.size = 16; + RadioLibCRCInstance.poly = RADIOLIB_CRC_CCITT_POLY; + RadioLibCRCInstance.init = RADIOLIB_CRC_CCITT_INIT; + RadioLibCRCInstance.out = RADIOLIB_CRC_CCITT_OUT; + RadioLibCRCInstance.refIn = false; + RadioLibCRCInstance.refOut = false; + uint16_t fcs = RadioLibCRCInstance.checksum(frameBuff, frameBuffLen); + *(frameBuffPtr++) = (uint8_t)((fcs >> 8) & 0xFF); + *(frameBuffPtr++) = (uint8_t)(fcs & 0xFF); + + // prepare buffer for the final frame (stuffed, with added preamble + flags and NRZI-encoded) + #if !defined(RADIOLIB_STATIC_ONLY) + // worst-case scenario: sequence of 1s, will have 120% of the original length, stuffed frame also includes both flags + uint8_t* stuffedFrameBuff = new uint8_t[preambleLen + 1 + (6*frameBuffLen)/5 + 2]; + #else + uint8_t stuffedFrameBuff[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + + // initialize buffer to all zeros + memset(stuffedFrameBuff, 0x00, preambleLen + 1 + (6*frameBuffLen)/5 + 2); + + // stuff bits (skip preamble and both flags) + uint16_t stuffedFrameBuffLenBits = 8*(preambleLen + 1); + uint8_t count = 0; + for(size_t i = 0; i < frameBuffLen + 2; i++) { + for(int8_t shift = 7; shift >= 0; shift--) { + uint16_t stuffedFrameBuffPos = stuffedFrameBuffLenBits + 7 - 2*(stuffedFrameBuffLenBits%8); + if((frameBuff[i] >> shift) & 0x01) { + // copy 1 and increment counter + SET_BIT_IN_ARRAY(stuffedFrameBuff, stuffedFrameBuffPos); + stuffedFrameBuffLenBits++; + count++; + + // check 5 consecutive 1s + if(count == 5) { + // get the new position in stuffed frame + stuffedFrameBuffPos = stuffedFrameBuffLenBits + 7 - 2*(stuffedFrameBuffLenBits%8); + + // insert 0 and reset counter + CLEAR_BIT_IN_ARRAY(stuffedFrameBuff, stuffedFrameBuffPos); + stuffedFrameBuffLenBits++; + count = 0; + } + + } else { + // copy 0 and reset counter + CLEAR_BIT_IN_ARRAY(stuffedFrameBuff, stuffedFrameBuffPos); + stuffedFrameBuffLenBits++; + count = 0; + } + + } + } + + // deallocate memory + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] frameBuff; + #endif + + // set preamble bytes and start flag field + for(uint16_t i = 0; i < preambleLen + 1; i++) { + stuffedFrameBuff[i] = RADIOLIB_AX25_FLAG; + } + + // get stuffed frame length in bytes + size_t stuffedFrameBuffLen = stuffedFrameBuffLenBits/8 + 1; + uint8_t trailingLen = stuffedFrameBuffLenBits % 8; + + // set end flag field (may be split into two bytes due to misalignment caused by extra stuffing bits) + if(trailingLen != 0) { + stuffedFrameBuffLen++; + stuffedFrameBuff[stuffedFrameBuffLen - 2] |= RADIOLIB_AX25_FLAG >> trailingLen; + stuffedFrameBuff[stuffedFrameBuffLen - 1] = RADIOLIB_AX25_FLAG << (8 - trailingLen); + } else { + stuffedFrameBuff[stuffedFrameBuffLen - 1] = RADIOLIB_AX25_FLAG; + } + + // convert to NRZI + for(size_t i = preambleLen + 1; i < stuffedFrameBuffLen*8; i++) { + size_t currBitPos = i + 7 - 2*(i%8); + size_t prevBitPos = (i - 1) + 7 - 2*((i - 1)%8); + if(TEST_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos)) { + // bit is 1, no change, copy previous bit + if(TEST_BIT_IN_ARRAY(stuffedFrameBuff, prevBitPos)) { + SET_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos); + } else { + CLEAR_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos); + } + + } else { + // bit is 0, transition, copy inversion of the previous bit + if(TEST_BIT_IN_ARRAY(stuffedFrameBuff, prevBitPos)) { + CLEAR_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos); + } else { + SET_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos); + } + } + } + + // transmit + int16_t state = RADIOLIB_ERR_NONE; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(bellModem != nullptr) { + bellModem->idle(); + + // iterate over all bytes in the buffer + for(uint32_t i = 0; i < stuffedFrameBuffLen; i++) { + bellModem->write(stuffedFrameBuff[i]); + } + + bellModem->standby(); + + } else { + #endif + state = phyLayer->transmit(stuffedFrameBuff, stuffedFrameBuffLen); + #if !defined(RADIOLIB_EXCLUDE_AFSK) + } + #endif + + // deallocate memory + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] stuffedFrameBuff; + #endif + + return(state); +} + +void AX25Client::getCallsign(char* buff) { + strncpy(buff, sourceCallsign, RADIOLIB_AX25_MAX_CALLSIGN_LEN); +} + +uint8_t AX25Client::getSSID() { + return(sourceSSID); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AX25/AX25.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AX25/AX25.h new file mode 100644 index 00000000..9d6c60a6 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/AX25/AX25.h @@ -0,0 +1,326 @@ +#if !defined(_RADIOLIB_RADIOLIB_AX25_H) +#define _RADIOLIB_RADIOLIB_AX25_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_AX25) + +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../AFSK/AFSK.h" +#include "../BellModem/BellModem.h" +#include "../../utils/CRC.h" + +// macros to access bits in byte array, from http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html +#define SET_BIT_IN_ARRAY(A, k) ( A[(k/8)] |= (1 << (k%8)) ) +#define CLEAR_BIT_IN_ARRAY(A, k) ( A[(k/8)] &= ~(1 << (k%8)) ) +#define TEST_BIT_IN_ARRAY(A, k) ( A[(k/8)] & (1 << (k%8)) ) +#define GET_BIT_IN_ARRAY(A, k) ( (A[(k/8)] & (1 << (k%8))) ? 1 : 0 ) + +// maximum callsign length in bytes +#define RADIOLIB_AX25_MAX_CALLSIGN_LEN 6 + +// flag field MSB LSB DESCRIPTION +#define RADIOLIB_AX25_FLAG 0b01111110 // 7 0 AX.25 frame start/end flag + +// address field +#define RADIOLIB_AX25_SSID_COMMAND_DEST 0b10000000 // 7 7 frame type: command (set in destination SSID) +#define RADIOLIB_AX25_SSID_COMMAND_SOURCE 0b00000000 // 7 7 command (set in source SSID) +#define RADIOLIB_AX25_SSID_RESPONSE_DEST 0b00000000 // 7 7 response (set in destination SSID) +#define RADIOLIB_AX25_SSID_RESPONSE_SOURCE 0b10000000 // 7 7 response (set in source SSID) +#define RADIOLIB_AX25_SSID_HAS_NOT_BEEN_REPEATED 0b00000000 // 7 7 not repeated yet (set in repeater SSID) +#define RADIOLIB_AX25_SSID_HAS_BEEN_REPEATED 0b10000000 // 7 7 repeated (set in repeater SSID) +#define RADIOLIB_AX25_SSID_RESERVED_BITS 0b01100000 // 6 5 reserved bits in SSID +#define RADIOLIB_AX25_SSID_HDLC_EXTENSION_CONTINUE 0b00000000 // 0 0 HDLC extension bit: next octet contains more address information +#define RADIOLIB_AX25_SSID_HDLC_EXTENSION_END 0b00000001 // 0 0 address field end + +// control field +#define RADIOLIB_AX25_CONTROL_U_SET_ASYNC_BAL_MODE 0b01101100 // 7 2 U frame type: set asynchronous balanced mode (connect request) +#define RADIOLIB_AX25_CONTROL_U_SET_ASYNC_BAL_MODE_EXT 0b00101100 // 7 2 set asynchronous balanced mode extended (connect request with module 128) +#define RADIOLIB_AX25_CONTROL_U_DISCONNECT 0b01000000 // 7 2 disconnect request +#define RADIOLIB_AX25_CONTROL_U_DISCONNECT_MODE 0b00001100 // 7 2 disconnect mode (system busy or disconnected) +#define RADIOLIB_AX25_CONTROL_U_UNNUMBERED_ACK 0b01100000 // 7 2 unnumbered acknowledge +#define RADIOLIB_AX25_CONTROL_U_FRAME_REJECT 0b10000100 // 7 2 frame reject +#define RADIOLIB_AX25_CONTROL_U_UNNUMBERED_INFORMATION 0b00000000 // 7 2 unnumbered information +#define RADIOLIB_AX25_CONTROL_U_EXHANGE_IDENTIFICATION 0b10101100 // 7 2 exchange ID +#define RADIOLIB_AX25_CONTROL_U_TEST 0b11100000 // 7 2 test +#define RADIOLIB_AX25_CONTROL_POLL_FINAL_ENABLED 0b00010000 // 4 4 control field poll/final bit: enabled +#define RADIOLIB_AX25_CONTROL_POLL_FINAL_DISABLED 0b00000000 // 4 4 disabled +#define RADIOLIB_AX25_CONTROL_S_RECEIVE_READY 0b00000000 // 3 2 S frame type: receive ready (system ready to receive) +#define RADIOLIB_AX25_CONTROL_S_RECEIVE_NOT_READY 0b00000100 // 3 2 receive not ready (TNC buffer full) +#define RADIOLIB_AX25_CONTROL_S_REJECT 0b00001000 // 3 2 reject (out of sequence or duplicate) +#define RADIOLIB_AX25_CONTROL_S_SELECTIVE_REJECT 0b00001100 // 3 2 selective reject (single frame repeat request) +#define RADIOLIB_AX25_CONTROL_INFORMATION_FRAME 0b00000000 // 0 0 frame type: information (I frame) +#define RADIOLIB_AX25_CONTROL_SUPERVISORY_FRAME 0b00000001 // 1 0 supervisory (S frame) +#define RADIOLIB_AX25_CONTROL_UNNUMBERED_FRAME 0b00000011 // 1 0 unnumbered (U frame) + +// protocol identifier field +#define RADIOLIB_AX25_PID_ISO_8208 0x01 +#define RADIOLIB_AX25_PID_TCP_IP_COMPRESSED 0x06 +#define RADIOLIB_AX25_PID_TCP_IP_UNCOMPRESSED 0x07 +#define RADIOLIB_AX25_PID_SEGMENTATION_FRAGMENT 0x08 +#define RADIOLIB_AX25_PID_TEXNET_DATAGRAM_PROTOCOL 0xC3 +#define RADIOLIB_AX25_PID_LINK_QUALITY_PROTOCOL 0xC4 +#define RADIOLIB_AX25_PID_APPLETALK 0xCA +#define RADIOLIB_AX25_PID_APPLETALK_ARP 0xCB +#define RADIOLIB_AX25_PID_ARPA_INTERNET_PROTOCOL 0xCC +#define RADIOLIB_AX25_PID_ARPA_ADDRESS_RESOLUTION 0xCD +#define RADIOLIB_AX25_PID_FLEXNET 0xCE +#define RADIOLIB_AX25_PID_NET_ROM 0xCF +#define RADIOLIB_AX25_PID_NO_LAYER_3 0xF0 +#define RADIOLIB_AX25_PID_ESCAPE_CHARACTER 0xFF + +/*! + \class AX25Frame + \brief Abstraction of AX.25 frame format. +*/ +class AX25Frame { + public: + /*! + \brief Callsign of the destination station. + */ + char destCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1]; + + /*! + \brief SSID of the destination station. + */ + uint8_t destSSID; + + /*! + \brief Callsign of the source station. + */ + char srcCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1]; + + /*! + \brief SSID of the source station. + */ + uint8_t srcSSID; + + /*! + \brief Number of repeaters to be used. + */ + uint8_t numRepeaters; + + /*! + \brief The control field. + */ + uint8_t control; + + /*! + \brief The protocol identifier (PID) field. + */ + uint8_t protocolID; + + /*! + \brief Number of bytes in the information field. + */ + uint16_t infoLen; + + /*! + \brief Receive sequence number. + */ + uint8_t rcvSeqNumber; + + /*! + \brief Send sequence number. + */ + uint16_t sendSeqNumber; + + #if !defined(RADIOLIB_STATIC_ONLY) + /*! + \brief The info field. + */ + uint8_t* info; + + /*! + \brief Array of repeater callsigns. + */ + char** repeaterCallsigns; + + /*! + \brief Array of repeater SSIDs. + */ + uint8_t* repeaterSSIDs; + #else + /*! + \brief The info field. + */ + uint8_t info[RADIOLIB_STATIC_ARRAY_SIZE]; + + /*! + \brief Array of repeater callsigns. + */ + char repeaterCallsigns[8][RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1]; + + /*! + \brief Array of repeater SSIDs. + */ + uint8_t repeaterSSIDs[8]; + #endif + + /*! + \brief Overloaded constructor, for frames without info field. + \param destCallsign Callsign of the destination station. + \param destSSID SSID of the destination station. + \param srcCallsign Callsign of the source station. + \param srcSSID SSID of the source station. + \param control The control field. + */ + AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control); + + /*! + \brief Overloaded constructor, for frames with C-string info field. + \param destCallsign Callsign of the destination station. + \param destSSID SSID of the destination station. + \param srcCallsign Callsign of the source station. + \param srcSSID SSID of the source station. + \param control The control field. + \param protocolID The protocol identifier (PID) field. Set to zero if the frame doesn't have this field. + \param info Information field, in the form of null-terminated C-string. + */ + AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, const char* info); + + /*! + \brief Default constructor. + \param destCallsign Callsign of the destination station. + \param destSSID SSID of the destination station. + \param srcCallsign Callsign of the source station. + \param srcSSID SSID of the source station. + \param control The control field. + \param protocolID The protocol identifier (PID) field. Set to zero if the frame doesn't have this field. + \param info Information field, in the form of arbitrary binary buffer. + \param infoLen Number of bytes in the information field. + */ + AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, uint8_t* info, uint16_t infoLen); + + /*! + \brief Copy constructor. + \param frame AX25Frame instance to copy. + */ + AX25Frame(const AX25Frame& frame); + + /*! + \brief Default destructor. + */ + ~AX25Frame(); + + /*! + \brief Overload for assignment operator. + \param frame rvalue AX25Frame. + */ + AX25Frame& operator=(const AX25Frame& frame); + + /*! + \brief Method to set the repeater callsigns and SSIDs. + \param repeaterCallsigns Array of repeater callsigns in the form of null-terminated C-strings. + \param repeaterSSIDs Array of repeater SSIDs. + \param numRepeaters Number of repeaters, maximum is 8. + \returns \ref status_codes + */ + int16_t setRepeaters(char** repeaterCallsigns, uint8_t* repeaterSSIDs, uint8_t numRepeaters); + + /*! + \brief Method to set receive sequence number. + \param seqNumber Sequence number to set, 0 to 7. + */ + void setRecvSequence(uint8_t seqNumber); + + /*! + \brief Method to set send sequence number. + \param seqNumber Sequence number to set, 0 to 7. + */ + void setSendSequence(uint8_t seqNumber); +}; + +/*! + \class AX25Client + \brief Client for AX25 communication. +*/ +class AX25Client { + public: + /*! + \brief Constructor for 2-FSK mode. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + explicit AX25Client(PhysicalLayer* phy); + + #if !defined(RADIOLIB_EXCLUDE_AFSK) + /*! + \brief Constructor for AFSK mode. + \param audio Pointer to the AFSK instance providing audio. + */ + explicit AX25Client(AFSKClient* audio); + + /*! + \brief Set AFSK tone correction offset. On some platforms, this is required to get the audio produced + by the setup to match the expected 1200/2200 Hz tones. + \param mark Positive or negative correction offset for mark audio frequency in Hz. + \param space Positive or negative correction offset for space audio frequency in Hz. + \param length Audio tone length modifier, defaults to 1.0. + \returns \ref status_codes + */ + int16_t setCorrection(int16_t mark, int16_t space, float length = 1.0f); + #endif + + // basic methods + + /*! + \brief Initialization method. + \param srcCallsign Callsign of the source station. + \param srcSSID 4-bit SSID of the source station (in case there are more stations with the same callsign). + Defaults to 0. + \param preLen Number of "preamble" bytes (RADIOLIB_AX25_FLAG) sent ahead of the actual AX.25 frame. + Does not include the first RADIOLIB_AX25_FLAG byte, which is considered part of the frame. Defaults to 8. + \returns \ref status_codes + */ + int16_t begin(const char* srcCallsign, uint8_t srcSSID = 0x00, uint8_t preLen = 8); + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Transmit unnumbered information (UI) frame. + \param str Data to be sent as Arduino String. + \param destCallsign Callsign of the destination station. + \param destSSID 4-bit SSID of the destination station (in case there are more stations with the same callsign). + Defaults to 0. + \returns \ref status_codes + */ + int16_t transmit(String& str, const char* destCallsign, uint8_t destSSID = 0x00); + #endif + + /*! + \brief Transmit unnumbered information (UI) frame. + \param str Data to be sent. + \param destCallsign Callsign of the destination station. + \param destSSID 4-bit SSID of the destination station (in case there are more stations with the same callsign). + Defaults to 0. + \returns \ref status_codes + */ + int16_t transmit(const char* str, const char* destCallsign, uint8_t destSSID = 0x00); + + /*! + \brief Transmit arbitrary AX.25 frame. + \param frame Frame to be sent. + \returns \ref status_codes + */ + int16_t sendFrame(AX25Frame* frame); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + friend class APRSClient; + + PhysicalLayer* phyLayer; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + BellClient* bellModem; + #endif + + char sourceCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1] = {0, 0, 0, 0, 0, 0, 0}; + uint8_t sourceSSID = 0; + uint16_t preambleLen = 0; + + void getCallsign(char* buff); + uint8_t getSSID(); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/BellModem/BellModem.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/BellModem/BellModem.cpp new file mode 100644 index 00000000..087bde17 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/BellModem/BellModem.cpp @@ -0,0 +1,98 @@ +#include "BellModem.h" +#if !defined(RADIOLIB_EXCLUDE_BELL) + +const struct BellModem_t Bell101 { + .freqMark = 1270, + .freqSpace = 1070, + .baudRate = 110, + .freqMarkReply = 2225, + .freqSpaceReply = 2025, +}; + +const struct BellModem_t Bell103 { + .freqMark = 1270, + .freqSpace = 1070, + .baudRate = 300, + .freqMarkReply = 2225, + .freqSpaceReply = 2025, +}; + +const struct BellModem_t Bell202 { + .freqMark = 1200, + .freqSpace = 2200, + .baudRate = 1200, + .freqMarkReply = 1200, + .freqSpaceReply = 2200, +}; + +BellClient::BellClient(PhysicalLayer* phy, uint32_t pin) : AFSKClient(phy, pin) { + this->reply = false; +} + +BellClient::BellClient(AFSKClient* aud) : AFSKClient(aud) { + this->reply = false; +} + +int16_t BellClient::begin(const BellModem_t& modem) { + int16_t state = setModem(modem); + RADIOLIB_ASSERT(state); + + state = phyLayer->startDirect(); + return(state); +} + +int16_t BellClient::setModem(const BellModem_t& modem) { + this->modemType = modem; + this->toneLen = (1000000.0/(float)this->modemType.baudRate)*this->correction; + return(RADIOLIB_ERR_NONE); +} + +int16_t BellClient::setCorrection(float corr) { + this->correction = corr; + return(RADIOLIB_ERR_NONE); +} + +size_t BellClient::write(uint8_t b) { + // first get the frequencies + uint16_t toneMark = this->modemType.freqMark; + uint16_t toneSpace = this->modemType.freqSpace; + if(this->reply) { + toneMark = this->modemType.freqMarkReply; + toneMark = this->modemType.freqSpaceReply; + } + + // get the Module pointer to access HAL + Module* mod = this->phyLayer->getMod(); + + if(this->autoStart) { + phyLayer->transmitDirect(); + } + + // iterate over the bits and set correct frequencies + for(uint16_t mask = 0x80; mask >= 0x01; mask >>= 1) { + uint32_t start = mod->hal->micros(); + if(b & mask) { + this->tone(toneMark, false); + } else { + this->tone(toneSpace, false); + } + mod->waitForMicroseconds(start, this->toneLen); + } + + if(this->autoStart) { + phyLayer->standby(); + } + return(1); +} + +int16_t BellClient::idle() { + this->autoStart = false; + return(phyLayer->transmitDirect()); +} + +int16_t BellClient::standby() { + this->autoStart = true; + return(phyLayer->standby()); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/BellModem/BellModem.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/BellModem/BellModem.h new file mode 100644 index 00000000..13ab7106 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/BellModem/BellModem.h @@ -0,0 +1,131 @@ +#if !defined(_RADIOLIB_BELL_MODEM_H) +#define _RADIOLIB_BELL_MODEM_H + +#include "../../TypeDef.h" +#include "../../Module.h" +#if defined(RADIOLIB_BUILD_ARDUINO) +#include "../../ArduinoHal.h" +#endif + +#if !defined(RADIOLIB_EXCLUDE_BELL) + +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../AFSK/AFSK.h" +#include "../Print/Print.h" +#include "../Print/ITA2String.h" + +/*! + \struct BellModem_t + \brief Definition of the Bell-compatible modem. +*/ +struct BellModem_t { + /*! + \brief Frequency of the mark tone. + */ + int16_t freqMark; + + /*! + \brief Frequency of the space tone. + */ + int16_t freqSpace; + + /*! + \brief Baud rate. + */ + int16_t baudRate; + + /*! + \brief Frequency of the mark tone when replying. + */ + int16_t freqMarkReply; + + /*! + \brief Frequency of the space tone when replying. + */ + int16_t freqSpaceReply; +}; + +// currently implemented Bell modems +extern const struct BellModem_t Bell101; +extern const struct BellModem_t Bell103; +extern const struct BellModem_t Bell202; + +/*! + \class BellClient + \brief Client for Bell modem communication. The public interface is the same as Arduino Serial. +*/ +class BellClient: public AFSKClient, public RadioLibPrint { + + public: + + /*! + \brief Whether the modem is replying. + On some modems, the replying station has different tone frequencies. + */ + bool reply; + + /*! + \brief Default constructor. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + \param pin The GPIO pin at which the tones will be generated. + */ + explicit BellClient(PhysicalLayer* phy, uint32_t pin); + + /*! + \brief Audio-client constructor. Can be used when AFSKClient instance already exists. + \param aud Audio client to use. + */ + BellClient(AFSKClient* aud); + + /*! + \brief Initialization method. + \param modem Definition of the Bell modem to use for communication. + \returns \ref status_codes + */ + int16_t begin(const BellModem_t& modem); + + /*! + \brief Set Bell modem. + \param modem Definition of the Bell modem to use for communication. + \returns \ref status_codes + */ + int16_t setModem(const BellModem_t& modem); + + /*! + \brief Set correction coefficient for tone length. + \param correction Timing correction factor, used to adjust the length of tones. + Less than 1.0 leads to shorter tones, defaults to 1.0 (no correction). + \returns \ref status_codes + */ + int16_t setCorrection(float corr); + + /*! + \brief Write one byte. Implementation of interface of the RadioLibPrint/Print class. + \param b Byte to write. + \returns 1 if the byte was written, 0 otherwise. + */ + size_t write(uint8_t b); + + /*! + \brief Set the modem to idle (ready to transmit). + */ + int16_t idle(); + + /*! + \brief Set the modem to standby (transmitter off). + */ + int16_t standby(); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + BellModem_t modemType; + float correction = 1.0; + uint16_t toneLen = 0; + bool autoStart = true; + +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/ExternalRadio/ExternalRadio.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/ExternalRadio/ExternalRadio.cpp new file mode 100644 index 00000000..0748b495 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/ExternalRadio/ExternalRadio.cpp @@ -0,0 +1,47 @@ +#include "ExternalRadio.h" + +#if defined(RADIOLIB_BUILD_ARDUINO) +ExternalRadio::ExternalRadio(uint32_t pin) : PhysicalLayer(1, 0) { + mod = new Module(RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC, pin); + mod->hal->pinMode(pin, mod->hal->GpioModeOutput); + this->prevFrf = 0; +} +#endif + +ExternalRadio::ExternalRadio(RadioLibHal *hal, uint32_t pin) : PhysicalLayer(1, 0) { + mod = new Module(hal, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC, pin); + mod->hal->pinMode(pin, mod->hal->GpioModeOutput); + this->prevFrf = 0; +} + +Module* ExternalRadio::getMod() { + return(mod); +} + +int16_t ExternalRadio::setFrequencyDeviation(float freqDev) { + (void)freqDev; + return(RADIOLIB_ERR_NONE); +} + +int16_t ExternalRadio::setDataShaping(uint8_t sh) { + (void)sh; + return(RADIOLIB_ERR_NONE); +} + +int16_t ExternalRadio::setEncoding(uint8_t encoding) { + (void)encoding; + return(RADIOLIB_ERR_NONE); +} + +int16_t ExternalRadio::transmitDirect(uint32_t frf) { + if(frf != this->prevFrf) { + uint32_t val = this->mod->hal->GpioLevelLow; + if(frf > this->prevFrf) { + val = this->mod->hal->GpioLevelHigh; + } + this->prevFrf = frf; + this->mod->hal->digitalWrite(this->mod->getGpio(), val); + } + + return(RADIOLIB_ERR_NONE); +} \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/ExternalRadio/ExternalRadio.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/ExternalRadio/ExternalRadio.h new file mode 100644 index 00000000..25908fd0 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/ExternalRadio/ExternalRadio.h @@ -0,0 +1,69 @@ +#if !defined(_RADIOLIB_EXTERNAL_RADIO_H) +#define _RADIOLIB_EXTERNAL_RADIO_H + +#include "../../TypeDef.h" +#include "../../Module.h" +#if defined(RADIOLIB_BUILD_ARDUINO) +#include "../../ArduinoHal.h" +#endif + +#include "../PhysicalLayer/PhysicalLayer.h" + +class ExternalRadio: public PhysicalLayer { + public: + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Default constructor. + \param pin Output pin when using direct transmission, defaults to unused pin. + */ + ExternalRadio(uint32_t pin = RADIOLIB_NC); + #endif + + /*! + \brief Default constructor. + \param hal Pointer to the hardware abstraction layer to use. + \param pin Output pin when using direct transmission, defaults to unused pin. + */ + ExternalRadio(RadioLibHal *hal, uint32_t pin = RADIOLIB_NC); + + /*! + \brief Method to retrieve pointer to the underlying Module instance. + \returns Pointer to the Module instance. + */ + Module* getMod(); + + /*! + \brief Dummy implementation overriding PhysicalLayer. + \param freqDev Ignored. + \returns \ref status_codes + */ + int16_t setFrequencyDeviation(float freqDev) override; + + /*! + \brief Dummy implementation overriding PhysicalLayer. + \param sh Ignored. + \returns \ref status_codes + */ + int16_t setDataShaping(uint8_t sh) override; + + /*! + \brief Dummy implementation overriding PhysicalLayer. + \param encoding Ignored. + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding) override; + + /*! + \brief Direct transmission to drive external radio. + \param frf "Frequency" to control the output pin. If the frequency is higher than the one sent previously, + the output pin will be set to logic high. Otherwise it will be set to logic low. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0); + + private: + Module* mod; + uint32_t prevFrf; +}; + +#endif \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/FSK4/FSK4.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/FSK4/FSK4.cpp new file mode 100644 index 00000000..bb24e5be --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/FSK4/FSK4.cpp @@ -0,0 +1,129 @@ +#include "FSK4.h" +#include +#if !defined(RADIOLIB_EXCLUDE_FSK4) + +FSK4Client::FSK4Client(PhysicalLayer* phy) { + phyLayer = phy; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + audioClient = nullptr; + #endif +} + +#if !defined(RADIOLIB_EXCLUDE_AFSK) + FSK4Client::FSK4Client(AFSKClient* audio) { + phyLayer = audio->phyLayer; + audioClient = audio; + } +#endif + +int16_t FSK4Client::begin(float base, uint32_t shift, uint16_t rate) { + // save configuration + baseFreqHz = base; + shiftFreqHz = shift; + + // calculate duration of 1 bit + bitDuration = (uint32_t)1000000/rate; + + // calculate carrier shift + shiftFreq = getRawShift(shift); + + // Write resultant tones into arrays for quick lookup when modulating. + for(uint8_t i = 0; i < 4; i++) { + tones[i] = shiftFreq*i; + tonesHz[i] = shiftFreqHz*i; + } + + // calculate 24-bit frequency + baseFreq = (base * 1000000.0) / phyLayer->getFreqStep(); + + // configure for direct mode + return(phyLayer->startDirect()); +} + +void FSK4Client::idle() { + // Idle at Tone 0. + tone(0); +} + +int16_t FSK4Client::setCorrection(int16_t offsets[], float length) { + for(uint8_t i = 0; i < 4; i++) { + tones[i] += getRawShift(offsets[i]); + tonesHz[i] += offsets[i]; + } + bitDuration *= length; + return(RADIOLIB_ERR_NONE); +} + +size_t FSK4Client::write(uint8_t* buff, size_t len) { + size_t n = 0; + for(size_t i = 0; i < len; i++) { + n += FSK4Client::write(buff[i]); + } + FSK4Client::standby(); + return(n); +} + +size_t FSK4Client::write(uint8_t b) { + // send symbols MSB first + for(uint8_t i = 0; i < 4; i++) { + // Extract 4FSK symbol (2 bits) + uint8_t symbol = (b & 0xC0) >> 6; + + // Modulate + FSK4Client::tone(symbol); + + // Shift to next symbol + b = b << 2; + } + + return(1); +} + +void FSK4Client::tone(uint8_t i) { + Module* mod = phyLayer->getMod(); + uint32_t start = mod->hal->micros(); + transmitDirect(baseFreq + tones[i], baseFreqHz + tonesHz[i]); + mod->waitForMicroseconds(start, bitDuration); +} + +int16_t FSK4Client::transmitDirect(uint32_t freq, uint32_t freqHz) { + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + return(audioClient->tone(freqHz)); + } + #endif + return(phyLayer->transmitDirect(freq)); +} + +int16_t FSK4Client::standby() { + // ensure everything is stopped in interrupt timing mode + Module* mod = phyLayer->getMod(); + mod->waitForMicroseconds(0, 0); + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + return(audioClient->noTone()); + } + #endif + return(phyLayer->standby()); +} + +int32_t FSK4Client::getRawShift(int32_t shift) { + // calculate module carrier frequency resolution + int32_t step = round(phyLayer->getFreqStep()); + + // check minimum shift value + if(abs(shift) < step / 2) { + return(0); + } + + // round shift to multiples of frequency step size + if(abs(shift) % step < (step / 2)) { + return(shift / step); + } + if(shift < 0) { + return((shift / step) - 1); + } + return((shift / step) + 1); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/FSK4/FSK4.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/FSK4/FSK4.h new file mode 100644 index 00000000..d466d642 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/FSK4/FSK4.h @@ -0,0 +1,99 @@ +#if !defined(_RADIOLIB_FSK4_H) +#define _RADIOLIB_FSK4_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_FSK4) + +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../AFSK/AFSK.h" + +/*! + \class FSK4Client + \brief Client for FSK-4 communication. The public interface is the same as Arduino Serial. +*/ +class FSK4Client { + public: + /*! + \brief Constructor for FSK-4 mode. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + explicit FSK4Client(PhysicalLayer* phy); + + #if !defined(RADIOLIB_EXCLUDE_AFSK) + /*! + \brief Constructor for AFSK mode. + \param audio Pointer to the AFSK instance providing audio. + */ + explicit FSK4Client(AFSKClient* audio); + #endif + + // basic methods + + /*! + \brief Initialization method. + \param base Base (space) frequency to be used in MHz (in FSK-4 mode), + or the space tone frequency in Hz (in AFSK mode) + \param shift Frequency shift between each tone in Hz. + \param rate Baud rate to be used during transmission. + \returns \ref status_codes + */ + int16_t begin(float base, uint32_t shift, uint16_t rate); + + /*! + \brief Send out idle condition (RF tone at mark frequency). + */ + void idle(); + + /*! + \brief Set correction coefficients for frequencies and tone length. + \param offsets Four positive or negative correction offsets for audio frequencies in Hz. + \param length Tone length modifier, defaults to 1.0. + \returns \ref status_codes + */ + int16_t setCorrection(int16_t offsets[4], float length = 1.0f); + + /*! + \brief Transmit binary data. + \param buff Buffer to transmit. + \param len Number of bytes to transmit. + \returns Number of transmitted bytes. + */ + size_t write(uint8_t* buff, size_t len); + + /*! + \brief Transmit a single byte. + \param b Byte to transmit. + \returns Number of transmitted bytes. + */ + size_t write(uint8_t b); + + /*! + \brief Stop transmitting. + \returns \ref status_codes + */ + int16_t standby(); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + PhysicalLayer* phyLayer; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + AFSKClient* audioClient; + #endif + + uint32_t baseFreq = 0, baseFreqHz = 0; + uint32_t shiftFreq = 0, shiftFreqHz = 0; + uint32_t bitDuration = 0; + uint32_t tones[4]; + uint32_t tonesHz[4]; + + void tone(uint8_t i); + + int16_t transmitDirect(uint32_t freq = 0, uint32_t freqHz = 0); + int32_t getRawShift(int32_t shift); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Hellschreiber/Hellschreiber.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Hellschreiber/Hellschreiber.cpp new file mode 100644 index 00000000..06eaae79 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Hellschreiber/Hellschreiber.cpp @@ -0,0 +1,102 @@ +#include "Hellschreiber.h" + +#if !defined(RADIOLIB_EXCLUDE_HELLSCHREIBER) + +HellClient::HellClient(PhysicalLayer* phy) { + phyLayer = phy; + lineFeed = " "; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + audioClient = nullptr; + #endif +} + +#if !defined(RADIOLIB_EXCLUDE_AFSK) +HellClient::HellClient(AFSKClient* audio) { + phyLayer = audio->phyLayer; + lineFeed = " "; + audioClient = audio; +} +#endif + +int16_t HellClient::begin(float base, float rate) { + // calculate 24-bit frequency + baseFreqHz = base; + baseFreq = (base * 1000000.0) / phyLayer->getFreqStep(); + + // calculate "pixel" duration + pixelDuration = 1000000.0/rate; + + // configure for direct mode + return(phyLayer->startDirect()); +} + +size_t HellClient::printGlyph(uint8_t* buff) { + // print the character + Module* mod = phyLayer->getMod(); + bool transmitting = false; + for(uint8_t mask = 0x40; mask >= 0x01; mask >>= 1) { + for(int8_t i = RADIOLIB_HELL_FONT_HEIGHT - 1; i >= 0; i--) { + uint32_t start = mod->hal->micros(); + if((buff[i] & mask) && (!transmitting)) { + transmitting = true; + transmitDirect(baseFreq, baseFreqHz); + } else if((!(buff[i] & mask)) && (transmitting)) { + transmitting = false; + standby(); + } + mod->waitForMicroseconds(start, pixelDuration); + } + } + + // make sure transmitter is off + standby(); + + return(1); +} + +void HellClient::setInversion(bool inv) { + invert = inv; +} + +size_t HellClient::write(uint8_t b) { + // convert to position in font buffer + uint8_t pos = b; + if((pos >= ' ') && (pos <= '_')) { + pos -= ' '; + } else if((pos >= 'a') && (pos <= 'z')) { + pos -= (2*' '); + } else { + return(0); + } + + // fetch character from flash + uint8_t buff[RADIOLIB_HELL_FONT_WIDTH]; + buff[0] = 0x00; + for(uint8_t i = 0; i < RADIOLIB_HELL_FONT_WIDTH - 2; i++) { + buff[i + 1] = RADIOLIB_NONVOLATILE_READ_BYTE(&HellFont[pos][i]); + } + buff[RADIOLIB_HELL_FONT_WIDTH - 1] = 0x00; + + // print the character + return(printGlyph(buff)); +} + +int16_t HellClient::transmitDirect(uint32_t freq, uint32_t freqHz) { + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + return(audioClient->tone(freqHz)); + } + #endif + return(phyLayer->transmitDirect(freq)); +} + +int16_t HellClient::standby() { + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + return(audioClient->noTone(invert)); + } + #endif + return(phyLayer->standby(RADIOLIB_STANDBY_WARM)); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Hellschreiber/Hellschreiber.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Hellschreiber/Hellschreiber.h new file mode 100644 index 00000000..7855dee8 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Hellschreiber/Hellschreiber.h @@ -0,0 +1,156 @@ +#if !defined(_RADIOLIB_HELLSCHREIBER_H) +#define _RADIOLIB_HELLSCHREIBER_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_HELLSCHREIBER) + +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../AFSK/AFSK.h" +#include "../Print/Print.h" + +#define RADIOLIB_HELL_FONT_WIDTH 7 +#define RADIOLIB_HELL_FONT_HEIGHT 7 + +// font definition: characters are stored in rows, +// least significant byte of each character is the first row +// Hellschreiber use 7x7 characters, but this simplified font uses only 5x5 +// the extra bytes aren't stored +static const uint8_t HellFont[64][RADIOLIB_HELL_FONT_WIDTH - 2] RADIOLIB_NONVOLATILE = { + { 0b0000000, 0b0000000, 0b0000000, 0b0000000, 0b0000000 }, // space + { 0b0001000, 0b0001000, 0b0001000, 0b0000000, 0b0001000 }, // ! + { 0b0010100, 0b0010100, 0b0000000, 0b0000000, 0b0000000 }, // " + { 0b0010100, 0b0111110, 0b0010100, 0b0111110, 0b0010100 }, // # + { 0b0111110, 0b0101000, 0b0111110, 0b0001010, 0b0111110 }, // $ + { 0b0110010, 0b0110100, 0b0001000, 0b0010110, 0b0100110 }, // % + { 0b0010000, 0b0101000, 0b0010000, 0b0101000, 0b0110100 }, // & + { 0b0001000, 0b0001000, 0b0000000, 0b0000000, 0b0000000 }, // ' + { 0b0000100, 0b0001000, 0b0001000, 0b0001000, 0b0000100 }, // ( + { 0b0010000, 0b0001000, 0b0001000, 0b0001000, 0b0010000 }, // ) + { 0b0010100, 0b0001000, 0b0010100, 0b0000000, 0b0000000 }, // * + { 0b0001000, 0b0001000, 0b0111110, 0b0001000, 0b0001000 }, // + + { 0b0000000, 0b0000000, 0b0000000, 0b0001000, 0b0010000 }, // , + { 0b0000000, 0b0000000, 0b0111110, 0b0000000, 0b0000000 }, // - + { 0b0000000, 0b0000000, 0b0000000, 0b0000000, 0b0001000 }, // . + { 0b0000010, 0b0000100, 0b0001000, 0b0010000, 0b0100000 }, // / + { 0b0011100, 0b0100110, 0b0101010, 0b0110010, 0b0011100 }, // 0 + { 0b0011000, 0b0001000, 0b0001000, 0b0001000, 0b0001000 }, // 1 + { 0b0011000, 0b0100100, 0b0001000, 0b0010000, 0b0111100 }, // 2 + { 0b0111100, 0b0000100, 0b0011100, 0b0000100, 0b0111100 }, // 3 + { 0b0100100, 0b0100100, 0b0111100, 0b0000100, 0b0000100 }, // 4 + { 0b0011100, 0b0100000, 0b0111100, 0b0000100, 0b0111100 }, // 5 + { 0b0111100, 0b0100000, 0b0111100, 0b0100100, 0b0111100 }, // 6 + { 0b0111100, 0b0000100, 0b0001000, 0b0010000, 0b0100000 }, // 7 + { 0b0111100, 0b0100100, 0b0011000, 0b0100100, 0b0111100 }, // 8 + { 0b0111100, 0b0100100, 0b0111100, 0b0000100, 0b0111100 }, // 9 + { 0b0000000, 0b0001000, 0b0000000, 0b0000000, 0b0001000 }, // : + { 0b0000000, 0b0001000, 0b0000000, 0b0001000, 0b0001000 }, // ; + { 0b0000100, 0b0001000, 0b0010000, 0b0001000, 0b0000100 }, // < + { 0b0000000, 0b0111110, 0b0000000, 0b0111110, 0b0000000 }, // = + { 0b0010000, 0b0001000, 0b0000100, 0b0001000, 0b0010000 }, // > + { 0b0011100, 0b0000100, 0b0001000, 0b0000000, 0b0001000 }, // ? + { 0b0011100, 0b0100010, 0b0101110, 0b0101010, 0b0001100 }, // @ + { 0b0111110, 0b0100010, 0b0111110, 0b0100010, 0b0100010 }, // A + { 0b0111100, 0b0010010, 0b0011110, 0b0010010, 0b0111100 }, // B + { 0b0011110, 0b0110000, 0b0100000, 0b0110000, 0b0011110 }, // C + { 0b0111100, 0b0100010, 0b0100010, 0b0100010, 0b0111100 }, // D + { 0b0111110, 0b0100000, 0b0111100, 0b0100000, 0b0111110 }, // E + { 0b0111110, 0b0100000, 0b0111100, 0b0100000, 0b0100000 }, // F + { 0b0111110, 0b0100000, 0b0101110, 0b0100010, 0b0111110 }, // G + { 0b0100010, 0b0100010, 0b0111110, 0b0100010, 0b0100010 }, // H + { 0b0011100, 0b0001000, 0b0001000, 0b0001000, 0b0011100 }, // I + { 0b0111100, 0b0001000, 0b0001000, 0b0101000, 0b0111000 }, // J + { 0b0100100, 0b0101000, 0b0110000, 0b0101000, 0b0100100 }, // K + { 0b0100000, 0b0100000, 0b0100000, 0b0100000, 0b0111100 }, // L + { 0b0100010, 0b0110110, 0b0101010, 0b0100010, 0b0100010 }, // M + { 0b0100010, 0b0110010, 0b0101010, 0b0100110, 0b0100010 }, // N + { 0b0011100, 0b0100010, 0b0100010, 0b0100010, 0b0011100 }, // O + { 0b0111110, 0b0100010, 0b0111110, 0b0100000, 0b0100000 }, // P + { 0b0111110, 0b0100010, 0b0100010, 0b0100110, 0b0111110 }, // Q + { 0b0111110, 0b0100010, 0b0111110, 0b0100100, 0b0100010 }, // R + { 0b0111110, 0b0100000, 0b0111110, 0b0000010, 0b0111110 }, // S + { 0b0111110, 0b0001000, 0b0001000, 0b0001000, 0b0001000 }, // T + { 0b0100010, 0b0100010, 0b0100010, 0b0100010, 0b0111110 }, // U + { 0b0100010, 0b0100010, 0b0010100, 0b0010100, 0b0001000 }, // V + { 0b0100010, 0b0100010, 0b0101010, 0b0110110, 0b0100010 }, // W + { 0b0100010, 0b0010100, 0b0001000, 0b0010100, 0b0100010 }, // X + { 0b0100010, 0b0010100, 0b0001000, 0b0001000, 0b0001000 }, // Y + { 0b0111110, 0b0000100, 0b0001000, 0b0010000, 0b0111110 }, // Z + { 0b0001100, 0b0001000, 0b0001000, 0b0001000, 0b0001100 }, // [ + { 0b0100000, 0b0010000, 0b0001000, 0b0000100, 0b0000010 }, // backslash + { 0b0011000, 0b0001000, 0b0001000, 0b0001000, 0b0011000 }, // ] + { 0b0001000, 0b0010100, 0b0000000, 0b0000000, 0b0000000 }, // ^ + { 0b0000000, 0b0000000, 0b0000000, 0b0000000, 0b0111110 } // _ +}; + +/*! + \class HellClient + \brief Client for Hellschreiber transmissions. +*/ +class HellClient: public RadioLibPrint { + public: + /*! + \brief Constructor for 2-FSK mode. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + explicit HellClient(PhysicalLayer* phy); + + #if !defined(RADIOLIB_EXCLUDE_AFSK) + /*! + \brief Constructor for AFSK mode. + \param audio Pointer to the AFSK instance providing audio. + */ + explicit HellClient(AFSKClient* audio); + #endif + + // basic methods + + /*! + \brief Initialization method. + \param base Base RF frequency to be used in MHz (in 2-FSK mode), or the tone frequency in Hz (in AFSK mode). + \param rate Baud rate to be used during transmission. Defaults to 122.5 ("Feld Hell") + */ + int16_t begin(float base, float rate = 122.5); + + /*! + \brief Method to "print" a buffer of pixels, this is exposed to allow users to send custom characters. + \param buff Buffer of pixels to send, in a 7x7 pixel array. + \returns Always returns the number of printed glyphs (1). + */ + size_t printGlyph(uint8_t* buff); + + /*! + \brief Invert text color. + \param inv Whether to enable color inversion (white text on black background), or not (black text on white background) + */ + void setInversion(bool inv); + + /*! + \brief Write one byte. Implementation of interface of the RadioLibPrint/Print class. + \param b Byte to write. + \returns 1 if the byte was written, 0 otherwise. + */ + size_t write(uint8_t b); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + PhysicalLayer* phyLayer; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + AFSKClient* audioClient; + #endif + + uint32_t baseFreq = 0, baseFreqHz = 0; + uint32_t pixelDuration = 0; + bool invert = false; + + size_t printNumber(unsigned long, uint8_t); + size_t printFloat(double, uint8_t); + + int16_t transmitDirect(uint32_t freq = 0, uint32_t freqHz = 0); + int16_t standby(); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWAN.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWAN.cpp new file mode 100644 index 00000000..30ffe5ee --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWAN.cpp @@ -0,0 +1,1829 @@ +#include "LoRaWAN.h" + +#include + +#if !defined(RADIOLIB_EXCLUDE_LORAWAN) + +// flag to indicate whether we have received a downlink +static volatile bool downlinkReceived = false; + +#if defined(RADIOLIB_EEPROM_UNSUPPORTED) + #warning "Persistent storage not supported!" +#endif + +// interrupt service routine to handle downlinks automatically +#if defined(ESP8266) || defined(ESP32) + IRAM_ATTR +#endif +static void LoRaWANNodeOnDownlink(void) { + downlinkReceived = true; +} + +// flag to indicate whether channel scan operation is complete +static volatile bool scanFlag = false; + +// interrupt service routine to handle downlinks automatically +#if defined(ESP8266) || defined(ESP32) + IRAM_ATTR +#endif +static void LoRaWANNodeOnChannelScan(void) { + scanFlag = true; +} + +LoRaWANNode::LoRaWANNode(PhysicalLayer* phy, const LoRaWANBand_t* band) { + this->phyLayer = phy; + this->band = band; + this->FSK = false; + this->startChannel = -1; + this->numChannels = -1; + this->backupFreq = this->band->backupChannel.freqStart; + this->difsSlots = 2; + this->backoffMax = 6; + this->enableCSMA = false; + +} + +void LoRaWANNode::wipe() { + Module* mod = this->phyLayer->getMod(); + mod->hal->wipePersistentStorage(); +} + +void LoRaWANNode::setCSMA(uint8_t backoffMax, uint8_t difsSlots, bool enableCSMA) { + this->backoffMax = backoffMax; + this->difsSlots = difsSlots; + this->enableCSMA = enableCSMA; +} + + +int16_t LoRaWANNode::restoreOTAA() { + int16_t state = this->setPhyProperties(); + RADIOLIB_ASSERT(state); + + // check the magic value + Module* mod = this->phyLayer->getMod(); + if(mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_MAGIC_ID) != RADIOLIB_LORAWAN_MAGIC) { + // the magic value is not set, user will have to do perform the join procedure + return(RADIOLIB_ERR_NETWORK_NOT_JOINED); + } + + // in case of future revisions of NVM, use a version parameter to allow transitioning from one version to another while keeping session alive + uint16_t nvm_table_version = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION_ID); + // if (RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION > nvm_table_version) { + // // set default values for variables that are new or something + // } + (void)nvm_table_version; + + // pull all needed information from persistent storage + this->devAddr = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_ADDR_ID); + mod->hal->readPersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_APP_S_KEY_ID), this->appSKey, RADIOLIB_AES128_BLOCK_SIZE); + mod->hal->readPersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_FNWK_SINT_KEY_ID), this->fNwkSIntKey, RADIOLIB_AES128_BLOCK_SIZE); + mod->hal->readPersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_SNWK_SINT_KEY_ID), this->sNwkSIntKey, RADIOLIB_AES128_BLOCK_SIZE); + mod->hal->readPersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_NWK_SENC_KEY_ID), this->nwkSEncKey, RADIOLIB_AES128_BLOCK_SIZE); + RADIOLIB_DEBUG_PRINTLN("appSKey:"); + RADIOLIB_DEBUG_HEXDUMP(this->appSKey, RADIOLIB_AES128_BLOCK_SIZE); + + uint32_t dlSettings = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_DL_SETTINGS_ID); + this->rev = (dlSettings & RADIOLIB_LORAWAN_JOIN_ACCEPT_R_1_1) >> 7; + uint8_t rx1DrOffset = (dlSettings & 0x70) >> 4; + uint8_t rx2DataRate = dlSettings & 0x0F; + RADIOLIB_DEBUG_PRINTLN("LoRaWAN revision: %d", this->rev); + + // TODO process the RX2 data rate + (void)rx2DataRate; + + // TODO process the data rate offset + (void)rx1DrOffset; + + // parse Rx1 delay (and subsequently Rx2) + this->rxDelays[0] = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_RX_DELAY_ID); + if(this->rxDelays[0] == 0) { + this->rxDelays[0] = RADIOLIB_LORAWAN_RECEIVE_DELAY_1_MS; + } + this->rxDelays[1] = this->rxDelays[0] + 1000; + + // process CFlist if any bit is non-zero + uint8_t cfList[RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN] = { 0 }; + uint8_t allZero[RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN] = { 0 }; + mod->hal->readPersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_CF_LIST_ID), cfList, RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN); + RADIOLIB_DEBUG_PRINTLN("cfList:"); + RADIOLIB_DEBUG_HEXDUMP(cfList, RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN); + if(memcmp(cfList, allZero, RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN)) { + if(this->band->cfListType == RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES) { + // list of frequencies + for(uint8_t i = 0; i < 5; i++) { + uint32_t freq = LoRaWANNode::ntoh(&cfList[3*i], 3); + availableChannelsFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK][i] = (float)freq/10000.0; + availableChannelsFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK][i] = availableChannelsFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK][i]; + RADIOLIB_DEBUG_PRINTLN("Channel UL/DL %d frequency = %f MHz", i, availableChannelsFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK][i]); + } + + } else { + // frequency mask, we need to find out which frequencies are actually being used + uint8_t channelId = 0; + uint8_t chSpan = 0; + uint8_t chNum = 0; + for(uint8_t i = 0; i < 5; i++) { + uint16_t mask = LoRaWANNode::ntoh(&cfList[2*i]); + RADIOLIB_DEBUG_PRINTLN("mask[%d] = 0x%04x", i, mask); + for(uint8_t j = 0; j < 16; j++) { + if(chNum >= this->band->defaultChannels[chSpan].numChannels) { + chNum -= this->band->defaultChannels[chSpan].numChannels; + chSpan++; + + if(chSpan >= this->band->numChannelSpans) { + RADIOLIB_DEBUG_PRINTLN("channel bitmask overrun!"); + return(RADIOLIB_ERR_UNKNOWN); + } + } + + if(mask & (1UL << j)) { + RADIOLIB_DEBUG_PRINTLN("chNum = %d, chSpan = %d", chNum, chSpan); + uint8_t dir = this->band->defaultChannels[chSpan].direction; + float freq = this->band->defaultChannels[chSpan].freqStart + chNum*this->band->defaultChannels[chSpan].freqStep; + availableChannelsFreq[dir][channelId] = freq; + RADIOLIB_DEBUG_PRINTLN("Channel %cL %d frequency = %f MHz", dir ? 'U': 'D', channelId, availableChannelsFreq[dir][channelId]); + channelId++; + } + + chNum++; + } + } + + } + } + + uint8_t queueBuff[sizeof(LoRaWANMacCommandQueue_t)] = { 0 }; + mod->hal->readPersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_FOPTS_ID), queueBuff, sizeof(LoRaWANMacCommandQueue_t)); + memcpy(&queueBuff, &this->commandsUp, sizeof(LoRaWANMacCommandQueue_t)); + + state = this->setupChannels(); + RADIOLIB_ASSERT(state); + + return(RADIOLIB_ERR_NONE); +} + +int16_t LoRaWANNode::beginOTAA(uint64_t joinEUI, uint64_t devEUI, uint8_t* nwkKey, uint8_t* appKey, bool force) { + // check if we actually need to send the join request + Module* mod = this->phyLayer->getMod(); + if(!force && (mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_MAGIC_ID) == RADIOLIB_LORAWAN_MAGIC)) { + // the device has joined already, we can just pull the data from persistent storage + return(this->restoreOTAA()); + } + + // set the physical layer configuration + int16_t state = this->setPhyProperties(); + RADIOLIB_ASSERT(state); + + // setup uplink/downlink frequencies and datarates + state = this->setupChannels(); + RADIOLIB_ASSERT(state); + + // get dev nonce from persistent storage and increment it + uint16_t devNonce = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_NONCE_ID); + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_NONCE_ID, devNonce + 1); + + // build the join-request message + uint8_t joinRequestMsg[RADIOLIB_LORAWAN_JOIN_REQUEST_LEN]; + + // set the packet fields + joinRequestMsg[0] = RADIOLIB_LORAWAN_MHDR_MTYPE_JOIN_REQUEST | RADIOLIB_LORAWAN_MHDR_MAJOR_R1; + LoRaWANNode::hton(&joinRequestMsg[RADIOLIB_LORAWAN_JOIN_REQUEST_JOIN_EUI_POS], joinEUI); + LoRaWANNode::hton(&joinRequestMsg[RADIOLIB_LORAWAN_JOIN_REQUEST_DEV_EUI_POS], devEUI); + LoRaWANNode::hton(&joinRequestMsg[RADIOLIB_LORAWAN_JOIN_REQUEST_DEV_NONCE_POS], devNonce); + + // add the authentication code + uint32_t mic = this->generateMIC(joinRequestMsg, RADIOLIB_LORAWAN_JOIN_REQUEST_LEN - sizeof(uint32_t), nwkKey); + LoRaWANNode::hton(&joinRequestMsg[RADIOLIB_LORAWAN_JOIN_REQUEST_LEN - sizeof(uint32_t)], mic); + + // send it + state = this->phyLayer->transmit(joinRequestMsg, RADIOLIB_LORAWAN_JOIN_REQUEST_LEN); + RADIOLIB_ASSERT(state); + + // configure for downlink with default configuration + state = this->configureChannel(RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK); + RADIOLIB_ASSERT(state); + + // set the function that will be called when the reply is received + this->phyLayer->setPacketReceivedAction(LoRaWANNodeOnDownlink); + + // downlink messages are sent with inverted IQ + // TODO use downlink() for this + if(!this->FSK) { + state = this->phyLayer->invertIQ(true); + RADIOLIB_ASSERT(state); + } + + // start receiving + uint32_t start = mod->hal->millis(); + downlinkReceived = false; + state = this->phyLayer->startReceive(); + RADIOLIB_ASSERT(state); + + // wait for the reply or timeout + while(!downlinkReceived) { + if(mod->hal->millis() - start >= RADIOLIB_LORAWAN_JOIN_ACCEPT_DELAY_2_MS + 2000) { + downlinkReceived = false; + if(!this->FSK) { + this->phyLayer->invertIQ(false); + } + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } + + // we have a message, reset the IQ inversion + downlinkReceived = false; + this->phyLayer->clearPacketReceivedAction(); + if(!this->FSK) { + state = this->phyLayer->invertIQ(false); + RADIOLIB_ASSERT(state); + } + + // build the buffer for the reply data + uint8_t joinAcceptMsgEnc[RADIOLIB_LORAWAN_JOIN_ACCEPT_MAX_LEN]; + + // check received length + size_t lenRx = this->phyLayer->getPacketLength(true); + if((lenRx != RADIOLIB_LORAWAN_JOIN_ACCEPT_MAX_LEN) && (lenRx != RADIOLIB_LORAWAN_JOIN_ACCEPT_MAX_LEN - RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN)) { + RADIOLIB_DEBUG_PRINTLN("joinAccept reply length mismatch, expected %luB got %luB", RADIOLIB_LORAWAN_JOIN_ACCEPT_MAX_LEN, lenRx); + return(RADIOLIB_ERR_DOWNLINK_MALFORMED); + } + + // read the packet + state = this->phyLayer->readData(joinAcceptMsgEnc, lenRx); + // downlink frames are sent without CRC, which will raise error on SX127x + // we can ignore that error + if(state != RADIOLIB_ERR_LORA_HEADER_DAMAGED) { + RADIOLIB_ASSERT(state); + } + + // check reply message type + if((joinAcceptMsgEnc[0] & RADIOLIB_LORAWAN_MHDR_MTYPE_MASK) != RADIOLIB_LORAWAN_MHDR_MTYPE_JOIN_ACCEPT) { + RADIOLIB_DEBUG_PRINTLN("joinAccept reply message type invalid, expected 0x%02x got 0x%02x", RADIOLIB_LORAWAN_MHDR_MTYPE_JOIN_ACCEPT, joinAcceptMsgEnc[0]); + return(RADIOLIB_ERR_DOWNLINK_MALFORMED); + } + + // decrypt the join accept message + // this is done by encrypting again in ECB mode + // the first byte is the MAC header which is not encrypted + uint8_t joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_MAX_LEN]; + joinAcceptMsg[0] = joinAcceptMsgEnc[0]; + RadioLibAES128Instance.init(nwkKey); + RadioLibAES128Instance.encryptECB(&joinAcceptMsgEnc[1], RADIOLIB_LORAWAN_JOIN_ACCEPT_MAX_LEN - 1, &joinAcceptMsg[1]); + + RADIOLIB_DEBUG_PRINTLN("joinAcceptMsg:"); + RADIOLIB_DEBUG_HEXDUMP(joinAcceptMsg, lenRx); + + // get current JoinNonce from downlink and previous JoinNonce from NVM + uint32_t joinNonce = LoRaWANNode::ntoh(&joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_JOIN_NONCE_POS], 3); + uint32_t joinNoncePrev = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_JOIN_NONCE_ID); + RADIOLIB_DEBUG_PRINTLN("JoinNoncePrev: %d, JoinNonce: %d", joinNoncePrev, joinNonce); + + // JoinNonce received must be greater than the last JoinNonce heard, else error + if(joinNonce <= joinNoncePrev) { + return(RADIOLIB_ERR_JOIN_NONCE_INVALID); + } + + // check LoRaWAN revision (the MIC verification depends on this) + uint8_t dlSettings = joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_DL_SETTINGS_POS]; + this->rev = (dlSettings & RADIOLIB_LORAWAN_JOIN_ACCEPT_R_1_1) >> 7; + RADIOLIB_DEBUG_PRINTLN("LoRaWAN revision: 1.%d", this->rev); + + // verify MIC + if(this->rev == 1) { + // 1.1 version, first we need to derive the join accept integrity key + uint8_t keyDerivationBuff[RADIOLIB_AES128_BLOCK_SIZE] = { 0 }; + keyDerivationBuff[0] = RADIOLIB_LORAWAN_JOIN_ACCEPT_JS_INT_KEY; + LoRaWANNode::hton(&keyDerivationBuff[1], devEUI); + RadioLibAES128Instance.init(nwkKey); + RadioLibAES128Instance.encryptECB(keyDerivationBuff, RADIOLIB_AES128_BLOCK_SIZE, this->jSIntKey); + + // prepare the buffer for MIC calculation + uint8_t micBuff[3*RADIOLIB_AES128_BLOCK_SIZE] = { 0 }; + micBuff[0] = RADIOLIB_LORAWAN_JOIN_REQUEST_TYPE; + LoRaWANNode::hton(&micBuff[1], joinEUI); + LoRaWANNode::hton(&micBuff[9], devNonce); + memcpy(&micBuff[11], joinAcceptMsg, lenRx); + + if(!verifyMIC(micBuff, lenRx + 11, this->jSIntKey)) { + return(RADIOLIB_ERR_CRC_MISMATCH); + } + + } else { + // 1.0 version + if(!verifyMIC(joinAcceptMsg, lenRx, nwkKey)) { + return(RADIOLIB_ERR_CRC_MISMATCH); + } + + } + uint8_t rx1DrOffset = (dlSettings & 0x70) >> 4; + uint8_t rx2DataRate = dlSettings & 0x0F; + + // TODO process the RX2 data rate + (void)rx2DataRate; + + // TODO process the data rate offset + (void)rx1DrOffset; + + // parse other contents + uint32_t homeNetId = LoRaWANNode::ntoh(&joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_HOME_NET_ID_POS], 3); + this->devAddr = LoRaWANNode::ntoh(&joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_DEV_ADDR_POS]); + + // parse Rx1 delay (and subsequently Rx2) + this->rxDelays[0] = joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_RX_DELAY_POS]*1000; + if(this->rxDelays[0] == 0) { + this->rxDelays[0] = RADIOLIB_LORAWAN_RECEIVE_DELAY_1_MS; + } + this->rxDelays[1] = this->rxDelays[0] + 1000; + + // process CFlist if present + uint8_t cfList[RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN] = { 0 }; + if(lenRx == RADIOLIB_LORAWAN_JOIN_ACCEPT_MAX_LEN) { + memcpy(&cfList[0], &joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_POS], RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN); + if(this->band->cfListType == RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES) { + // list of frequencies + for(uint8_t i = 0; i < 5; i++) { + uint32_t freq = LoRaWANNode::ntoh(&joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_POS + 3*i], 3); + availableChannelsFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK][i] = (float)freq/10000.0; + availableChannelsFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK][i] = availableChannelsFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK][i]; + RADIOLIB_DEBUG_PRINT("Channel UL/DL %d frequency = ", i); + RADIOLIB_DEBUG_PRINT_FLOAT(availableChannelsFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK][i], 3); + RADIOLIB_DEBUG_PRINTLN(" MHz"); + } + + } else { + // frequency mask, we need to find out which frequencies are actually being used + uint8_t channelId = 0; + uint8_t chSpan = 0; + uint8_t chNum = 0; + for(uint8_t i = 0; i < 5; i++) { + uint16_t mask = LoRaWANNode::ntoh(&joinAcceptMsg[RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_POS + 2*i]); + RADIOLIB_DEBUG_PRINTLN("mask[%d] = 0x%04x", i, mask); + for(uint8_t j = 0; j < 16; j++) { + if(chNum >= this->band->defaultChannels[chSpan].numChannels) { + chNum -= this->band->defaultChannels[chSpan].numChannels; + chSpan++; + + if(chSpan >= this->band->numChannelSpans) { + RADIOLIB_DEBUG_PRINTLN("channel bitmask overrun!"); + return(RADIOLIB_ERR_UNKNOWN); + } + } + + if(mask & (1UL << j)) { + RADIOLIB_DEBUG_PRINTLN("chNum = %d, chSpan = %d", chNum, chSpan); + uint8_t dir = this->band->defaultChannels[chSpan].direction; + float freq = this->band->defaultChannels[chSpan].freqStart + chNum*this->band->defaultChannels[chSpan].freqStep; + availableChannelsFreq[dir][channelId] = freq; + RADIOLIB_DEBUG_PRINT("Channel %cL %d frequency = ", dir ? 'U': 'D', channelId); + RADIOLIB_DEBUG_PRINT_FLOAT(availableChannelsFreq[dir][channelId], 3); + RADIOLIB_DEBUG_PRINTLN(" MHz"); + channelId++; + } + + chNum++; + } + } + + } + } + + // prepare buffer for key derivation + uint8_t keyDerivationBuff[RADIOLIB_AES128_BLOCK_SIZE] = { 0 }; + LoRaWANNode::hton(&keyDerivationBuff[RADIOLIB_LORAWAN_JOIN_ACCEPT_JOIN_NONCE_POS], joinNonce, 3); + + // check protocol version (1.0 vs 1.1) + if(this->rev == 1) { + // 1.1 version, derive the keys + LoRaWANNode::hton(&keyDerivationBuff[RADIOLIB_LORAWAN_JOIN_ACCEPT_JOIN_EUI_POS], joinEUI); + LoRaWANNode::hton(&keyDerivationBuff[RADIOLIB_LORAWAN_JOIN_ACCEPT_DEV_NONCE_POS], devNonce); + keyDerivationBuff[0] = RADIOLIB_LORAWAN_JOIN_ACCEPT_APP_S_KEY; + + RadioLibAES128Instance.init(appKey); + RadioLibAES128Instance.encryptECB(keyDerivationBuff, RADIOLIB_AES128_BLOCK_SIZE, this->appSKey); + + keyDerivationBuff[0] = RADIOLIB_LORAWAN_JOIN_ACCEPT_F_NWK_S_INT_KEY; + RadioLibAES128Instance.init(nwkKey); + RadioLibAES128Instance.encryptECB(keyDerivationBuff, RADIOLIB_AES128_BLOCK_SIZE, this->fNwkSIntKey); + + keyDerivationBuff[0] = RADIOLIB_LORAWAN_JOIN_ACCEPT_S_NWK_S_INT_KEY; + RadioLibAES128Instance.init(nwkKey); + RadioLibAES128Instance.encryptECB(keyDerivationBuff, RADIOLIB_AES128_BLOCK_SIZE, this->sNwkSIntKey); + + keyDerivationBuff[0] = RADIOLIB_LORAWAN_JOIN_ACCEPT_NWK_S_ENC_KEY; + RadioLibAES128Instance.init(nwkKey); + RadioLibAES128Instance.encryptECB(keyDerivationBuff, RADIOLIB_AES128_BLOCK_SIZE, this->nwkSEncKey); + + // enqueue the RekeyInd MAC command to be sent in the next uplink + LoRaWANMacCommand_t cmd = { + .cid = RADIOLIB_LORAWAN_MAC_CMD_REKEY, + .len = sizeof(uint8_t), + .payload = { this->rev }, + .repeat = RADIOLIB_LORAWAN_ADR_ACK_LIMIT, + }; + state = pushMacCommand(&cmd, &this->commandsUp); + RADIOLIB_ASSERT(state); + + } else { + // 1.0 version, just derive the keys + LoRaWANNode::hton(&keyDerivationBuff[RADIOLIB_LORAWAN_JOIN_ACCEPT_HOME_NET_ID_POS], homeNetId, 3); + LoRaWANNode::hton(&keyDerivationBuff[RADIOLIB_LORAWAN_JOIN_ACCEPT_DEV_ADDR_POS], devNonce); + keyDerivationBuff[0] = RADIOLIB_LORAWAN_JOIN_ACCEPT_APP_S_KEY; + RadioLibAES128Instance.init(nwkKey); + RadioLibAES128Instance.encryptECB(keyDerivationBuff, RADIOLIB_AES128_BLOCK_SIZE, this->appSKey); + + keyDerivationBuff[0] = RADIOLIB_LORAWAN_JOIN_ACCEPT_F_NWK_S_INT_KEY; + RadioLibAES128Instance.init(nwkKey); + RadioLibAES128Instance.encryptECB(keyDerivationBuff, RADIOLIB_AES128_BLOCK_SIZE, this->fNwkSIntKey); + + memcpy(this->sNwkSIntKey, this->fNwkSIntKey, RADIOLIB_AES128_KEY_SIZE); + memcpy(this->nwkSEncKey, this->fNwkSIntKey, RADIOLIB_AES128_KEY_SIZE); + + } + + // save the device address + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_ADDR_ID, this->devAddr); + + // update the keys + mod->hal->writePersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_APP_S_KEY_ID), this->appSKey, RADIOLIB_AES128_BLOCK_SIZE); + mod->hal->writePersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_FNWK_SINT_KEY_ID), this->fNwkSIntKey, RADIOLIB_AES128_BLOCK_SIZE); + mod->hal->writePersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_SNWK_SINT_KEY_ID), this->sNwkSIntKey, RADIOLIB_AES128_BLOCK_SIZE); + mod->hal->writePersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_NWK_SENC_KEY_ID), this->nwkSEncKey, RADIOLIB_AES128_BLOCK_SIZE); + + // save uplink parameters + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_JOIN_NONCE_ID, joinNonce); + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_HOME_NET_ID, homeNetId); + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_RX_DELAY_ID, this->rxDelays[0]); + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_DL_SETTINGS_ID, (uint32_t)dlSettings); + + // save cfList (all 0 if none is present) + mod->hal->writePersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_CF_LIST_ID), cfList, RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN); + + // all complete, reset device counters and set the magic number + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_UP_ID, 0); + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_N_FCNT_DOWN_ID, 0); + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_A_FCNT_DOWN_ID, 0); + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_MAGIC_ID, RADIOLIB_LORAWAN_MAGIC); + + // everything written to NVM, write current version to NVM + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION_ID, RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION); + return(RADIOLIB_ERR_NONE); +} + +int16_t LoRaWANNode::beginABP(uint32_t addr, uint8_t* nwkSKey, uint8_t* appSKey, uint8_t* fNwkSIntKey, uint8_t* sNwkSIntKey) { + this->devAddr = addr; + memcpy(this->appSKey, appSKey, RADIOLIB_AES128_KEY_SIZE); + memcpy(this->nwkSEncKey, nwkSKey, RADIOLIB_AES128_KEY_SIZE); + if(fNwkSIntKey) { + this->rev = 1; + memcpy(this->fNwkSIntKey, fNwkSIntKey, RADIOLIB_AES128_KEY_SIZE); + } else { + memcpy(this->fNwkSIntKey, nwkSKey, RADIOLIB_AES128_KEY_SIZE); + } + if(sNwkSIntKey) { + memcpy(this->sNwkSIntKey, sNwkSIntKey, RADIOLIB_AES128_KEY_SIZE); + } + + // set the physical layer configuration + int16_t state = this->setPhyProperties(); + RADIOLIB_ASSERT(state); + + // setup uplink/downlink frequencies and datarates + state = this->setupChannels(); + RADIOLIB_ASSERT(state); + + // everything written to NVM, write current version to NVM + Module* mod = this->phyLayer->getMod(); + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION_ID, RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION); + + return(RADIOLIB_ERR_NONE); +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t LoRaWANNode::uplink(String& str, uint8_t port) { + return(this->uplink(str.c_str(), port)); +} +#endif + +int16_t LoRaWANNode::uplink(const char* str, uint8_t port) { + return(this->uplink((uint8_t*)str, strlen(str), port)); +} + +int16_t LoRaWANNode::uplink(uint8_t* data, size_t len, uint8_t port) { + // check destination port + if(port > 0xDF) { + return(RADIOLIB_ERR_INVALID_PORT); + } + // port 0 is only allowed for MAC-only payloads + if(port == RADIOLIB_LORAWAN_FPORT_MAC_COMMAND) { + if (!isMACPayload) { + return(RADIOLIB_ERR_INVALID_PORT); + } + // if this is MAC only payload, continue and reset for next uplink + isMACPayload = false; + } + + Module* mod = this->phyLayer->getMod(); + + // check if there are some MAC commands to piggyback (only when piggybacking onto a application-frame) + uint8_t foptsLen = 0; + size_t foptsBufSize = 0; + if(this->commandsUp.numCommands > 0 && port != RADIOLIB_LORAWAN_FPORT_MAC_COMMAND) { + // there are, assume the maximum possible FOpts len for buffer allocation + foptsLen = this->commandsUp.len; + foptsBufSize = 15; + } + + // check maximum payload len as defined in phy + if(len > this->band->payloadLenMax[this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]]) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + + // configure for uplink + // TODO select randomly from available channels + int16_t state = this->configureChannel(RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK); + RADIOLIB_ASSERT(state); + + // check if sufficient time has elapsed since the last uplink + if(mod->hal->millis() - this->rxDelayStart < rxDelays[1]) { + // not enough time elapsed since the last uplink, we may still be in an RX window + return(RADIOLIB_ERR_UPLINK_UNAVAILABLE); + } + + // build the uplink message + // the first 16 bytes are reserved for MIC calculation blocks + size_t uplinkMsgLen = RADIOLIB_LORAWAN_FRAME_LEN(len, foptsBufSize); + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t uplinkMsg[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + uint8_t* uplinkMsg = new uint8_t[uplinkMsgLen]; + #endif + + // set the packet fields + uplinkMsg[RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS] = RADIOLIB_LORAWAN_MHDR_MTYPE_UNCONF_DATA_UP | RADIOLIB_LORAWAN_MHDR_MAJOR_R1; + LoRaWANNode::hton(&uplinkMsg[RADIOLIB_LORAWAN_FHDR_DEV_ADDR_POS], this->devAddr); + + // TODO implement adaptive data rate + // length of fopts will be added later + uplinkMsg[RADIOLIB_LORAWAN_FHDR_FCTRL_POS] = 0x00; + + // get frame counter from persistent storage + uint32_t fcnt = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_UP_ID) + 1; + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_UP_ID, fcnt); + LoRaWANNode::hton(&uplinkMsg[RADIOLIB_LORAWAN_FHDR_FCNT_POS], (uint16_t)fcnt); + + // check if we have some MAC commands to append + if(foptsLen > 0) { + uint8_t foptsNum = this->commandsUp.numCommands; + uint8_t foptsBuff[foptsBufSize]; + size_t idx = 0; + for (size_t i = 0; i < foptsNum; i++) { + LoRaWANMacCommand_t cmd = { .cid = 0, .len = 0, .payload = { 0 }, .repeat = 0, }; + popMacCommand(&cmd, &this->commandsUp, i); + if (cmd.cid == 0) { + break; + } + foptsBuff[idx] = cmd.cid; + for(size_t i = 1; i < cmd.len; i++) { + foptsBuff[idx + i] = cmd.payload[i]; + } + idx += cmd.len + 1; + } + + RADIOLIB_DEBUG_PRINTLN("Uplink MAC payload (%d commands):", foptsNum); + RADIOLIB_DEBUG_HEXDUMP(foptsBuff, foptsBufSize); + + uplinkMsgLen = RADIOLIB_LORAWAN_FRAME_LEN(len, foptsLen); + uplinkMsg[RADIOLIB_LORAWAN_FHDR_FCTRL_POS] |= foptsLen; + + // encrypt it + processAES(foptsBuff, foptsLen, this->nwkSEncKey, &uplinkMsg[RADIOLIB_LORAWAN_FHDR_FOPTS_POS], fcnt, RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, 0x01, true); + + // write the current MAC command queue to nvm for next uplink + uint8_t queueBuff[sizeof(LoRaWANMacCommandQueue_t)]; + memcpy(&queueBuff, &this->commandsUp, sizeof(LoRaWANMacCommandQueue_t)); + mod->hal->writePersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_FOPTS_ID), queueBuff, sizeof(LoRaWANMacCommandQueue_t)); + } + + // set the port + uplinkMsg[RADIOLIB_LORAWAN_FHDR_FPORT_POS(foptsLen)] = port; + + // select encryption key based on the target port + uint8_t* encKey = this->appSKey; + if(port == RADIOLIB_LORAWAN_FPORT_MAC_COMMAND) { + encKey = this->nwkSEncKey; + } + + // encrypt the frame payload + // TODO check ctrId --> erratum says it should be 0x01? + processAES(data, len, encKey, &uplinkMsg[RADIOLIB_LORAWAN_FRAME_PAYLOAD_POS(foptsLen)], fcnt, RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, 0x00, true); + + // create blocks for MIC calculation + uint8_t block0[RADIOLIB_AES128_BLOCK_SIZE] = { 0 }; + block0[RADIOLIB_LORAWAN_BLOCK_MAGIC_POS] = RADIOLIB_LORAWAN_MIC_BLOCK_MAGIC; + block0[RADIOLIB_LORAWAN_BLOCK_DIR_POS] = RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK; + LoRaWANNode::hton(&block0[RADIOLIB_LORAWAN_BLOCK_DEV_ADDR_POS], this->devAddr); + LoRaWANNode::hton(&block0[RADIOLIB_LORAWAN_BLOCK_FCNT_POS], fcnt); + block0[RADIOLIB_LORAWAN_MIC_BLOCK_LEN_POS] = uplinkMsgLen - RADIOLIB_AES128_BLOCK_SIZE - sizeof(uint32_t); + + uint8_t block1[RADIOLIB_AES128_BLOCK_SIZE] = { 0 }; + memcpy(block1, block0, RADIOLIB_AES128_BLOCK_SIZE); + // TODO implement confirmed frames + block1[RADIOLIB_LORAWAN_MIC_DATA_RATE_POS] = this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]; + block1[RADIOLIB_LORAWAN_MIC_CH_INDEX_POS] = this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]; + + RADIOLIB_DEBUG_PRINTLN("uplinkMsg pre-MIC:"); + RADIOLIB_DEBUG_HEXDUMP(uplinkMsg, uplinkMsgLen); + + // calculate authentication codes + memcpy(uplinkMsg, block1, RADIOLIB_AES128_BLOCK_SIZE); + uint32_t micS = this->generateMIC(uplinkMsg, uplinkMsgLen - sizeof(uint32_t), this->sNwkSIntKey); + memcpy(uplinkMsg, block0, RADIOLIB_AES128_BLOCK_SIZE); + uint32_t micF = this->generateMIC(uplinkMsg, uplinkMsgLen - sizeof(uint32_t), this->fNwkSIntKey); + + // check LoRaWAN revision + if(this->rev == 1) { + uint32_t mic = ((uint32_t)(micF & 0x0000FF00) << 16) | ((uint32_t)(micF & 0x0000000FF) << 16) | ((uint32_t)(micS & 0x0000FF00) >> 0) | ((uint32_t)(micS & 0x0000000FF) >> 0); + LoRaWANNode::hton(&uplinkMsg[uplinkMsgLen - sizeof(uint32_t)], mic); + } else { + LoRaWANNode::hton(&uplinkMsg[uplinkMsgLen - sizeof(uint32_t)], micF); + } + + // perform CSMA if enabled. + if (enableCSMA) { + performCSMA(); + } + + RADIOLIB_DEBUG_PRINTLN("uplinkMsg:"); + RADIOLIB_DEBUG_HEXDUMP(uplinkMsg, uplinkMsgLen); + + // send it (without the MIC calculation blocks) + uint32_t txStart = mod->hal->millis(); + uint32_t timeOnAir = this->phyLayer->getTimeOnAir(uplinkMsgLen - RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS) / 1000; + state = this->phyLayer->transmit(&uplinkMsg[RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS], uplinkMsgLen - RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] uplinkMsg; + #endif + RADIOLIB_ASSERT(state); + + // set the timestamp so that we can measure when to start receiving + this->rxDelayStart = txStart + timeOnAir; + return(RADIOLIB_ERR_NONE); +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t LoRaWANNode::downlink(String& str) { + int16_t state = RADIOLIB_ERR_NONE; + + // build a temporary buffer + // LoRaWAN downlinks can have 250 bytes at most with 1 extra byte for NULL + size_t length = 0; + uint8_t data[251]; + + // wait for downlink + state = this->downlink(data, &length); + if(state == RADIOLIB_ERR_NONE) { + // add null terminator + data[length] = '\0'; + + // initialize Arduino String class + str = String((char*)data); + } + + return(state); +} +#endif + +int16_t LoRaWANNode::downlink(uint8_t* data, size_t* len) { + // check if there are any upcoming Rx windows + Module* mod = this->phyLayer->getMod(); + const uint32_t scanGuard = 500; + if(mod->hal->millis() - this->rxDelayStart > (this->rxDelays[1] + scanGuard)) { + // time since last Tx is greater than RX2 delay + some guard period + // we have nothing to downlink + return(RADIOLIB_ERR_NO_RX_WINDOW); + } + + // configure for downlink + int16_t state = this->configureChannel(RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK); + RADIOLIB_ASSERT(state); + + // downlink messages are sent with inverted IQ + if(!this->FSK) { + state = this->phyLayer->invertIQ(true); + RADIOLIB_ASSERT(state); + } + + // calculate the channel scanning timeout + // according to the spec, this must be at least enough time to effectively detect a preamble + uint32_t scanTimeout = this->phyLayer->getTimeOnAir(0)/1000; + + // set up everything for channel scan + downlinkReceived = false; + scanFlag = false; + bool packetDetected = false; + this->phyLayer->setChannelScanAction(LoRaWANNodeOnChannelScan); + + // perform listening in the two Rx windows + for(uint8_t i = 0; i < 2; i++) { + // wait for the start of the Rx window + // the waiting duration is shortened a bit to cover any possible timing errors + uint32_t waitLen = this->rxDelays[i] - (mod->hal->millis() - this->rxDelayStart); + if(waitLen > scanGuard) { + waitLen -= scanGuard; + } + mod->hal->delay(waitLen); + + // wait until we get a preamble + uint32_t scanStart = mod->hal->millis(); + while((mod->hal->millis() - scanStart) < (scanTimeout + scanGuard)) { + // check channel detection timeout + state = this->phyLayer->startChannelScan(); + RADIOLIB_ASSERT(state); + + // wait with some timeout, though it should not be hit + uint32_t cadStart = mod->hal->millis(); + while(!scanFlag) { + mod->hal->yield(); + if(mod->hal->millis() - cadStart >= 3000) { + // timed out, stop waiting + break; + } + } + + // check the scan result + scanFlag = false; + state = this->phyLayer->getChannelScanResult(); + if((state == RADIOLIB_PREAMBLE_DETECTED) || (state == RADIOLIB_LORA_DETECTED)) { + packetDetected = true; + break; + } + + } + + // check if we have a packet + if(packetDetected) { + break; + + } else if(i == 0) { + // nothing in the first window, configure for the second + state = this->phyLayer->setFrequency(this->backupFreq); + RADIOLIB_ASSERT(state); + + DataRate_t dataRate; + findDataRate(RADIOLIB_LORAWAN_DATA_RATE_UNUSED, &dataRate, &this->band->backupChannel); + state = this->phyLayer->setDataRate(dataRate); + RADIOLIB_ASSERT(state); + + } + + } + + // check if we received a packet at all + if(!packetDetected) { + this->phyLayer->standby(); + if(!this->FSK) { + this->phyLayer->invertIQ(false); + } + + // restore the original uplink channel + this->configureChannel(RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK); + + return(RADIOLIB_ERR_RX_TIMEOUT); + } + + // channel scan is finished, swap the actions + this->phyLayer->clearChannelScanAction(); + downlinkReceived = false; + this->phyLayer->setPacketReceivedAction(LoRaWANNodeOnDownlink); + + // start receiving + state = this->phyLayer->startReceive(); + RADIOLIB_ASSERT(state); + + // wait for reception with some timeout + uint32_t rxStart = mod->hal->millis(); + while(!downlinkReceived) { + mod->hal->yield(); + // let's hope 30 seconds is long enough timeout + if(mod->hal->millis() - rxStart >= 30000) { + // timed out + this->phyLayer->standby(); + if(!this->FSK) { + this->phyLayer->invertIQ(false); + } + return(RADIOLIB_ERR_RX_TIMEOUT); + } + } + + // we have a message, clear actions, go to standby and reset the IQ inversion + downlinkReceived = false; + this->phyLayer->standby(); + this->phyLayer->clearPacketReceivedAction(); + if(!this->FSK) { + state = this->phyLayer->invertIQ(false); + RADIOLIB_ASSERT(state); + } + + // get the packet length + size_t downlinkMsgLen = this->phyLayer->getPacketLength(); + + // check the minimum required frame length + // an extra byte is subtracted because downlink frames may not have a port + if(downlinkMsgLen < RADIOLIB_LORAWAN_FRAME_LEN(0, 0) - 1 - RADIOLIB_AES128_BLOCK_SIZE) { + RADIOLIB_DEBUG_PRINTLN("Downlink message too short (%lu bytes)", downlinkMsgLen); + return(RADIOLIB_ERR_DOWNLINK_MALFORMED); + } + + // build the buffer for the downlink message + // the first 16 bytes are reserved for MIC calculation block + #if !defined(RADIOLIB_STATIC_ONLY) + uint8_t* downlinkMsg = new uint8_t[RADIOLIB_AES128_BLOCK_SIZE + downlinkMsgLen]; + #else + uint8_t downlinkMsg[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + + // set the MIC calculation block + // TODO implement confirmed frames + memset(downlinkMsg, 0x00, RADIOLIB_AES128_BLOCK_SIZE); + downlinkMsg[RADIOLIB_LORAWAN_BLOCK_MAGIC_POS] = RADIOLIB_LORAWAN_MIC_BLOCK_MAGIC; + LoRaWANNode::hton(&downlinkMsg[RADIOLIB_LORAWAN_BLOCK_DEV_ADDR_POS], this->devAddr); + downlinkMsg[RADIOLIB_LORAWAN_BLOCK_DIR_POS] = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK; + downlinkMsg[RADIOLIB_LORAWAN_MIC_BLOCK_LEN_POS] = downlinkMsgLen - sizeof(uint32_t); + + // read the data + state = this->phyLayer->readData(&downlinkMsg[RADIOLIB_AES128_BLOCK_SIZE], downlinkMsgLen); + // downlink frames are sent without CRC, which will raise error on SX127x + // we can ignore that error + if(state == RADIOLIB_ERR_LORA_HEADER_DAMAGED) { + state = RADIOLIB_ERR_NONE; + } + + if(state != RADIOLIB_ERR_NONE) { + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] downlinkMsg; + #endif + return(state); + } + + // get the frame counter and set it to the MIC calculation block + // TODO cache the ADR bit? + uint16_t fcnt16 = LoRaWANNode::ntoh(&downlinkMsg[RADIOLIB_LORAWAN_FHDR_FCNT_POS]); + LoRaWANNode::hton(&downlinkMsg[RADIOLIB_LORAWAN_BLOCK_FCNT_POS], fcnt16); + uint32_t fcnt32 = fcnt16; // calculate possible rollover once decided if this is network downlink or application downlink + + RADIOLIB_DEBUG_PRINTLN("downlinkMsg:"); + RADIOLIB_DEBUG_HEXDUMP(downlinkMsg, RADIOLIB_AES128_BLOCK_SIZE + downlinkMsgLen); + + // calculate length of FOpts and payload + uint8_t foptsLen = downlinkMsg[RADIOLIB_LORAWAN_FHDR_FCTRL_POS] & RADIOLIB_LORAWAN_FHDR_FOPTS_LEN_MASK; + int payLen = downlinkMsgLen - 8 - foptsLen - sizeof(uint32_t); + + bool isAppDownlink = true; + if (payLen <= 0 && this->rev == 1) { // no payload => MAC commands only => Network frame (LoRaWAN v1.1 only) + isAppDownlink = false; + } + + // check the FcntDown value (Network or Application) + uint32_t fcntDownPrev = 0; + if (isAppDownlink) { + fcntDownPrev = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_A_FCNT_DOWN_ID); + } else { + fcntDownPrev = mod->hal->getPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_N_FCNT_DOWN_ID); + } + + // assume a 16-bit to 32-bit rollover when difference in LSB is smaller than MAX_FCNT_GAP + // if that isn't the case and the received fcnt is smaller or equal to the last heard fcnt, then error + if ((fcnt16 <= fcntDownPrev) && ((0xFFFF - (uint16_t)fcntDownPrev + fcnt16) > RADIOLIB_LORAWAN_MAX_FCNT_GAP)) { + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] downlinkMsg; + #endif + if (isAppDownlink) { + return(RADIOLIB_ERR_A_FCNT_DOWN_INVALID); + } else { + return(RADIOLIB_ERR_N_FCNT_DOWN_INVALID); + } + } else if (fcnt16 <= fcntDownPrev) { + uint16_t msb = (fcntDownPrev >> 16) + 1; // assume a rollover + fcnt32 |= (msb << 16); // add back the MSB part + } + + // save current fcnt to NVM + if (isAppDownlink) { + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_A_FCNT_DOWN_ID, fcnt32); + } else { + mod->hal->setPersistentParameter(RADIOLIB_PERSISTENT_PARAM_LORAWAN_N_FCNT_DOWN_ID, fcnt32); + } + + // check the MIC + if(!verifyMIC(downlinkMsg, RADIOLIB_AES128_BLOCK_SIZE + downlinkMsgLen, this->sNwkSIntKey)) { + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] downlinkMsg; + #endif + return(RADIOLIB_ERR_CRC_MISMATCH); + } + + // check the address + uint32_t addr = LoRaWANNode::ntoh(&downlinkMsg[RADIOLIB_LORAWAN_FHDR_DEV_ADDR_POS]); + if(addr != this->devAddr) { + RADIOLIB_DEBUG_PRINTLN("Device address mismatch, expected 0x%08X, got 0x%08X", this->devAddr, addr); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] downlinkMsg; + #endif + return(RADIOLIB_ERR_DOWNLINK_MALFORMED); + } + + // process FOpts (if there are any) + if(foptsLen > 0) { + // there are some Fopts, decrypt them + uint8_t fopts[RADIOLIB_LORAWAN_FHDR_FOPTS_LEN_MASK]; + + // TODO it COULD be the case that the assumed rollover is incorrect, if possible figure out a way to catch this and retry with just fcnt16 + uint8_t ctrId = 0x01 + isAppDownlink; // see LoRaWAN v1.1 errata + processAES(&downlinkMsg[RADIOLIB_LORAWAN_FHDR_FOPTS_POS], (size_t)foptsLen, this->nwkSEncKey, fopts, fcnt32, RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, ctrId, true); + + RADIOLIB_DEBUG_PRINTLN("fopts:"); + RADIOLIB_DEBUG_HEXDUMP(fopts, foptsLen); + + // process the MAC command(s) + int8_t remLen = foptsLen; + uint8_t* foptsPtr = fopts; + while(remLen > 0) { + LoRaWANMacCommand_t cmd = { + .cid = *foptsPtr, + .len = (uint8_t)(remLen - 1), + .payload = { 0 }, + .repeat = 0, + }; + memcpy(cmd.payload, foptsPtr + 1, cmd.len); + + // try to process the mac command + // TODO how to handle incomplete commands? + size_t processedLen = execMacCommand(&cmd) + 1; + + // processing succeeded, move in the buffer to the next command + remLen -= processedLen; + foptsPtr += processedLen; + } + + // if FOptsLen for the next uplink is larger than can be piggybacked onto an uplink, send separate uplink + if(this->commandsUp.len > 15) { + uint8_t foptsNum = this->commandsUp.numCommands; + size_t foptsBufSize = this->commandsUp.len; + uint8_t foptsBuff[foptsBufSize]; + size_t idx = 0; + for(size_t i = 0; i < foptsNum; i++) { + LoRaWANMacCommand_t cmd = { .cid = 0, .len = 0, .payload = { 0 }, .repeat = 0, }; + popMacCommand(&cmd, &this->commandsUp, i); + if(cmd.cid == 0) { + break; + } + foptsBuff[idx] = cmd.cid; + for(size_t i = 1; i < cmd.len; i++) { + foptsBuff[idx + i] = cmd.payload[i]; + } + idx += cmd.len + 1; + } + RADIOLIB_DEBUG_PRINTLN("Uplink MAC payload (%d commands):", foptsNum); + RADIOLIB_DEBUG_HEXDUMP(foptsBuff, foptsBufSize); + + isMACPayload = true; + this->uplink(foptsBuff, foptsBufSize, RADIOLIB_LORAWAN_FPORT_MAC_COMMAND); + uint8_t strDown[this->band->payloadLenMax[this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK]]]; + size_t lenDown = 0; + state = this->downlink(strDown, &lenDown); + RADIOLIB_ASSERT(state); + } + + // write the MAC command queue to nvm for next uplink + uint8_t queueBuff[sizeof(LoRaWANMacCommandQueue_t)]; + memcpy(&queueBuff, &this->commandsUp, sizeof(LoRaWANMacCommandQueue_t)); + mod->hal->writePersistentStorage(mod->hal->getPersistentAddr(RADIOLIB_PERSISTENT_PARAM_LORAWAN_FOPTS_ID), queueBuff, sizeof(LoRaWANMacCommandQueue_t)); + } + + // process payload (if there is any) + if(payLen <= 0) { + // no payload + *len = 0; + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] downlinkMsg; + #endif + + return(RADIOLIB_ERR_NONE); + } + + // there is payload, and so there should be a port too + // TODO pass the port? + *len = payLen - 1; + // TODO it COULD be the case that the assumed rollover is incorrect, then figure out a way to catch this and retry with just fcnt16 + // TODO does the erratum hold here as well? + processAES(&downlinkMsg[RADIOLIB_LORAWAN_FHDR_FOPTS_POS], downlinkMsgLen, this->appSKey, data, fcnt32, RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, 0x00, true); + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] downlinkMsg; + #endif + + return(state); +} + +void LoRaWANNode::setDeviceStatus(uint8_t battLevel) { + this->battLevel = battLevel; +} + +uint32_t LoRaWANNode::generateMIC(uint8_t* msg, size_t len, uint8_t* key) { + if((msg == NULL) || (len == 0)) { + return(0); + } + + RadioLibAES128Instance.init(key); + uint8_t cmac[RADIOLIB_AES128_BLOCK_SIZE]; + RadioLibAES128Instance.generateCMAC(msg, len, cmac); + return(((uint32_t)cmac[0]) | ((uint32_t)cmac[1] << 8) | ((uint32_t)cmac[2] << 16) | ((uint32_t)cmac[3]) << 24); +} + +bool LoRaWANNode::verifyMIC(uint8_t* msg, size_t len, uint8_t* key) { + if((msg == NULL) || (len < sizeof(uint32_t))) { + return(0); + } + + // extract MIC from the message + uint32_t micReceived = LoRaWANNode::ntoh(&msg[len - sizeof(uint32_t)]); + + // calculate the expected value and compare + uint32_t micCalculated = generateMIC(msg, len - sizeof(uint32_t), key); + if(micCalculated != micReceived) { + RADIOLIB_DEBUG_PRINTLN("MIC mismatch, expected %08x, got %08x", micCalculated, micReceived); + return(false); + } + + return(true); +} + +int16_t LoRaWANNode::setPhyProperties() { + // set the physical layer configuration + int16_t state = RADIOLIB_ERR_NONE; + if(this->FSK) { + // for FSK, configure the channel + state = this->phyLayer->setFrequency(this->band->fskFreq); + RADIOLIB_ASSERT(state); + DataRate_t dr; + dr.fsk.bitRate = 50; + dr.fsk.freqDev = 25; + state = this->phyLayer->setDataRate(dr); + RADIOLIB_ASSERT(state); + state = this->phyLayer->setDataShaping(RADIOLIB_SHAPING_1_0); + RADIOLIB_ASSERT(state); + state = this->phyLayer->setEncoding(RADIOLIB_ENCODING_WHITENING); + } + RADIOLIB_ASSERT(state); + + // set the maximum power supported by both the module and the band + int8_t pwr = this->band->powerMax; + state = RADIOLIB_ERR_INVALID_OUTPUT_POWER; + while(state == RADIOLIB_ERR_INVALID_OUTPUT_POWER) { + // go from the highest power in band and lower it until we hit one supported by the module + state = this->phyLayer->setOutputPower(pwr--); + } + RADIOLIB_ASSERT(state); + + uint8_t syncWord[3] = { 0 }; + uint8_t syncWordLen = 0; + size_t preLen = 0; + if(this->FSK) { + preLen = 8*RADIOLIB_LORAWAN_GFSK_PREAMBLE_LEN; + syncWord[0] = (uint8_t)(RADIOLIB_LORAWAN_GFSK_SYNC_WORD >> 16); + syncWord[1] = (uint8_t)(RADIOLIB_LORAWAN_GFSK_SYNC_WORD >> 8); + syncWord[2] = (uint8_t)RADIOLIB_LORAWAN_GFSK_SYNC_WORD; + syncWordLen = 3; + + } else { + preLen = RADIOLIB_LORAWAN_LORA_PREAMBLE_LEN; + syncWord[0] = RADIOLIB_LORAWAN_LORA_SYNC_WORD; + syncWordLen = 1; + + } + + state = this->phyLayer->setSyncWord(syncWord, syncWordLen); + RADIOLIB_ASSERT(state); + + state = this->phyLayer->setPreambleLength(preLen); + return(state); +} + +int16_t LoRaWANNode::setupChannels() { + // find appropriate channel IDs for uplink and downlink, the uplink channel is random + int8_t chMin = -1; + int8_t chMax = -1; + if(this->band->cfListType == RADIOLIB_LORAWAN_CFLIST_TYPE_MASK) { + chMin = this->startChannel; + chMax = this->startChannel + this->numChannels; + } + int16_t state = this->findChannelId(RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, + &this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK], + &this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK], chMin, chMax); + RADIOLIB_ASSERT(state); + + // RX1 channel is not random, but determined by uplink channel + if(this->band->cfListType == RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES) { + // for frequency-list type bands, it's just the previous uplink channel + this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK] = this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]; + this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK] = this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]; + + } else { + // for mask type bands, it's the uplink mod num_downlink_channels + for(uint8_t i = 0; i < this->band->numChannelSpans; i++) { + const LoRaWANChannelSpan_t* span = &this->band->defaultChannels[i]; + if(span->direction == RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK) { + this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK] = this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK] % span->numChannels; + this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK] = span->joinRequestDataRate; + break; + } + } + } + + // based on the channel IDs, find the frequencies + state = this->findChannelFreq(RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, + this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK], + &this->channelFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]); + RADIOLIB_ASSERT(state); + state = this->findChannelFreq(RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK], + &this->channelFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK]); + RADIOLIB_ASSERT(state); + + // configure channel for uplink + state = this->configureChannel(RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK); + return(state); +} + +uint8_t LoRaWANNode::findDataRate(uint8_t dr, DataRate_t* dataRate, const LoRaWANChannelSpan_t* span) { + uint8_t dataRateBand = 0; + uint8_t dataRateFound = 0; + if(dr == RADIOLIB_LORAWAN_DATA_RATE_UNUSED) { + for(uint8_t i = 0; i < RADIOLIB_LORAWAN_CHANNEL_NUM_DATARATES; i++) { + if(span->dataRates[i] != RADIOLIB_LORAWAN_DATA_RATE_UNUSED) { + dataRateBand = span->dataRates[i]; + dataRateFound = i; + break; + } + } + } else { + dataRateBand = span->dataRates[dr]; + dataRateFound = dr; + } + + if(dataRateBand & RADIOLIB_LORAWAN_DATA_RATE_FSK_50_K) { + dataRate->fsk.bitRate = 50; + dataRate->fsk.freqDev = 25; + + } else { + uint8_t bw = dataRateBand & 0x0C; + switch(bw) { + case(RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ): + dataRate->lora.bandwidth = 125.0; + break; + case(RADIOLIB_LORAWAN_DATA_RATE_BW_250_KHZ): + dataRate->lora.bandwidth = 250.0; + break; + case(RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ): + dataRate->lora.bandwidth = 500.0; + break; + default: + dataRate->lora.bandwidth = 125.0; + } + + dataRate->lora.spreadingFactor = ((dataRateBand & 0x70) >> 4) + 6; + dataRate->lora.codingRate = (dataRateBand & 0x03) + 5; + } + + return(dataRateFound); +} + +int16_t LoRaWANNode::findChannelId(uint8_t dir, uint8_t* ch, uint8_t* dr, int8_t min, int8_t max) { + // find the first channel span that supports the requested direction + uint8_t spanId = 0; + LoRaWANChannelSpan_t* span = NULL; + for(; spanId < this->band->numChannelSpans; spanId++) { + span = (LoRaWANChannelSpan_t*)&this->band->defaultChannels[spanId]; + if((span->direction == dir) || (span->direction == RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH)) { + break; + } + } + + // shouldn't happen, but just to be sure + if(!span) { + RADIOLIB_DEBUG_PRINTLN("findChannelId span not found"); + return(RADIOLIB_ERR_INVALID_CHANNEL); + } + + // if requested, save the data rate + if(dr) { + *dr = span->joinRequestDataRate; + } + + // determine min and max based on number of channels in span and user constraints + uint8_t chMin = (min > 0) ? min : 0; + uint8_t chMax = (max > 0) ? max : span->numChannels; + + // select channel ID as random number between min and max (global number 0 - N for single direction) + int32_t chId = this->phyLayer->random(chMin, chMax); + *ch = chId; + return(RADIOLIB_ERR_NONE); +} + +LoRaWANChannelSpan_t* LoRaWANNode::findChannelSpan(uint8_t dir, uint8_t ch, uint8_t* spanChannelId) { + // find the span based on the channel ID + uint8_t chanCtr = 0; + *spanChannelId = 0; + for(uint8_t span = 0; span < this->band->numChannelSpans; span++) { + // check if this channel span can be used + uint8_t direction = this->band->defaultChannels[span].direction; + if((direction != dir) && (direction != RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH)) { + continue; + } + + // iterate over the usable spans to the channel ID + for(; *spanChannelId < this->band->defaultChannels[span].numChannels; (*spanChannelId)++) { + if(chanCtr >= ch) { + // we found it, return the pointer (channel ID within the span is already set) + return((LoRaWANChannelSpan_t*)&this->band->defaultChannels[span]); + } + chanCtr++; + } + } + + return(NULL); +} + +int16_t LoRaWANNode::findChannelFreq(uint8_t dir, uint8_t ch, float* freq) { + // find the channel span based on channel ID and direction + uint8_t spanChannelId = 0; + LoRaWANChannelSpan_t* span = findChannelSpan(dir, ch, &spanChannelId); + if(!span) { + return(RADIOLIB_ERR_INVALID_CHANNEL); + } + + // set the frequency + *freq = span->freqStart + span->freqStep * (float)spanChannelId; + return(RADIOLIB_ERR_NONE); +} + +int16_t LoRaWANNode::configureChannel(uint8_t dir) { + // set the frequency + RADIOLIB_DEBUG_PRINT("Channel frequency %cL = ", dir ? 'D' : 'U'); + RADIOLIB_DEBUG_PRINT_FLOAT(this->channelFreq[dir], 3); + RADIOLIB_DEBUG_PRINTLN(" MHz"); + int state = this->phyLayer->setFrequency(this->channelFreq[dir]); + RADIOLIB_ASSERT(state); + + // find the channel span based on channel ID and direction + uint8_t spanChannelId = 0; + LoRaWANChannelSpan_t* span = findChannelSpan(dir, this->chIndex[dir], &spanChannelId); + if(!span) { + return(RADIOLIB_ERR_INVALID_CHANNEL); + } + + // set the data rate + DataRate_t dataRate; + this->dataRate[dir] = findDataRate(this->dataRate[dir], &dataRate, span); + state = this->phyLayer->setDataRate(dataRate); + return(state); +} + +int16_t LoRaWANNode::sendMacCommand(uint8_t cid, uint8_t* payload, size_t payloadLen, uint8_t* reply, size_t replyLen) { + // build the command + size_t macReqLen = 1 + payloadLen; + #if !defined(RADIOLIB_STATIC_ONLY) + uint8_t* macReqBuff = new uint8_t[macReqLen]; + #else + uint8_t macReqBuff[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + macReqBuff[0] = cid; + memcpy(&macReqBuff[1], payload, payloadLen); + + // uplink it + int16_t state = this->uplink(macReqBuff, macReqLen, RADIOLIB_LORAWAN_FPORT_MAC_COMMAND); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] macReqBuff; + #endif + RADIOLIB_ASSERT(state); + + // build the reply buffer + size_t macRplLen = 1 + replyLen; + #if !defined(RADIOLIB_STATIC_ONLY) + uint8_t* macRplBuff = new uint8_t[this->band->payloadLenMax[this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK]]]; + #else + uint8_t macRplBuff[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + + // wait for reply from the server + size_t rxRplLen = 0; + state = this->downlink(macRplBuff, &rxRplLen); + if(state != RADIOLIB_ERR_NONE) { + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] macRplBuff; + #endif + return(state); + } + + RADIOLIB_DEBUG_PRINTLN("macRplBuff:"); + RADIOLIB_DEBUG_HEXDUMP(macRplBuff, rxRplLen); + + // check the length - it may be longer than expected + // if the server decided to append more MAC commands, but never shorter + // TODO how to handle the additional command(s)? + if(rxRplLen < macRplLen) { + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] macRplBuff; + #endif + return(RADIOLIB_ERR_DOWNLINK_MALFORMED); + } + + // check the CID + if(macRplBuff[0] != cid) { + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] macRplBuff; + #endif + return(RADIOLIB_ERR_INVALID_CID); + } + + // copy the data + memcpy(reply, &macRplBuff[1], replyLen); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] macRplBuff; + #endif + + return(state); +} + +int16_t LoRaWANNode::pushMacCommand(LoRaWANMacCommand_t* cmd, LoRaWANMacCommandQueue_t* queue) { + if(queue->numCommands >= RADIOLIB_LORAWAN_MAC_COMMAND_QUEUE_SIZE) { + return(RADIOLIB_ERR_COMMAND_QUEUE_FULL); + } + + memcpy(&queue->commands[queue->numCommands], cmd, sizeof(LoRaWANMacCommand_t)); + /*RADIOLIB_DEBUG_PRINTLN("push MAC CID = %02x, len = %d, payload = %02x %02x %02x %02x %02x, repeat = %d ", + queue->commands[queue->numCommands - 1].cid, + queue->commands[queue->numCommands - 1].len, + queue->commands[queue->numCommands - 1].payload[0], + queue->commands[queue->numCommands - 1].payload[1], + queue->commands[queue->numCommands - 1].payload[2], + queue->commands[queue->numCommands - 1].payload[3], + queue->commands[queue->numCommands - 1].payload[4], + queue->commands[queue->numCommands - 1].repeat);*/ + queue->numCommands++; + queue->len += 1 + cmd->len; // 1 byte for command ID, len bytes for payload + + return(RADIOLIB_ERR_NONE); +} + +int16_t LoRaWANNode::popMacCommand(LoRaWANMacCommand_t* cmd, LoRaWANMacCommandQueue_t* queue, size_t index) { + if(queue->numCommands == 0) { + return(RADIOLIB_ERR_COMMAND_QUEUE_EMPTY); + } + + if(cmd) { + // RADIOLIB_DEBUG_PRINTLN("pop MAC CID = %02x, len = %d, payload = %02x %02x %02x %02x %02x, repeat = %d ", + // queue->commands[index].cid, + // queue->commands[index].len, + // queue->commands[index].payload[0], + // queue->commands[index].payload[1], + // queue->commands[index].payload[2], + // queue->commands[index].payload[3], + // queue->commands[index].payload[4], + // queue->commands[index].repeat); + memcpy(cmd, &queue->commands[index], sizeof(LoRaWANMacCommand_t)); + } + + if(queue->commands[index].repeat > 0) { + queue->commands[index].repeat--; + } else { + deleteMacCommand(queue->commands[index].cid, queue); + } + + return(RADIOLIB_ERR_NONE); +} + +int16_t LoRaWANNode::deleteMacCommand(uint8_t cid, LoRaWANMacCommandQueue_t* queue) { + if(queue->numCommands == 0) { + return(RADIOLIB_ERR_COMMAND_QUEUE_EMPTY); + } + + for(size_t index = 0; index < queue->numCommands; index++) { + if(queue->commands[index].cid == cid) { + // RADIOLIB_DEBUG_PRINTLN("delete MAC CID = %02x, len = %d, payload = %02x %02x %02x %02x %02x, repeat = %d ", + // queue->commands[index].cid, + // queue->commands[index].len, + // queue->commands[index].payload[0], + // queue->commands[index].payload[1], + // queue->commands[index].payload[2], + // queue->commands[index].payload[3], + // queue->commands[index].payload[4], + // queue->commands[index].repeat); + queue->len -= (1 + queue->commands[index].len); // 1 byte for command ID, len for payload + // move all subsequent commands one forward in the queue + if(index < RADIOLIB_LORAWAN_MAC_COMMAND_QUEUE_SIZE - 1) { + memmove(&queue->commands[index], &queue->commands[index + 1], (RADIOLIB_LORAWAN_MAC_COMMAND_QUEUE_SIZE - index) * sizeof(LoRaWANMacCommand_t)); + } + // set the latest element to all 0 + memset(&queue->commands[RADIOLIB_LORAWAN_MAC_COMMAND_QUEUE_SIZE - 1], 0x00, sizeof(LoRaWANMacCommand_t)); + queue->numCommands--; + return(RADIOLIB_ERR_NONE); + } + } + + return(RADIOLIB_ERR_COMMAND_QUEUE_ITEM_NOT_FOUND); +} + +size_t LoRaWANNode::execMacCommand(LoRaWANMacCommand_t* cmd) { + RADIOLIB_DEBUG_PRINTLN("exe MAC CID = %02x, len = %d", cmd->cid, cmd->len); + + if(cmd->cid >= RADIOLIB_LORAWAN_MAC_CMD_PROPRIETARY) { + // TODO call user-provided callback for proprietary MAC commands? + return(cmd->len - 1); + } + + switch(cmd->cid) { + case(RADIOLIB_LORAWAN_MAC_CMD_RESET): { + // get the server version + uint8_t srvVersion = cmd->payload[0]; + RADIOLIB_DEBUG_PRINTLN("Server version: 1.%d", srvVersion); + if(srvVersion == this->rev) { + // valid server version, stop sending the ResetInd MAC command + deleteMacCommand(RADIOLIB_LORAWAN_MAC_CMD_RESET, &this->commandsUp); + } + return(1); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_LINK_CHECK): { + // TODO sent by gateway as reply to node request, how to get this info to the user? + uint8_t margin = cmd->payload[0]; + uint8_t gwCnt = cmd->payload[1]; + RADIOLIB_DEBUG_PRINTLN("Link check: margin = %d dB, gwCnt = %d", margin, gwCnt); + (void)margin; + (void)gwCnt; + return(2); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_LINK_ADR): { + // get the ADR configuration + uint8_t dr = (cmd->payload[0] & 0xF0) >> 4; + uint8_t txPower = cmd->payload[0] & 0x0F; + uint16_t chMask = LoRaWANNode::ntoh(&cmd->payload[1]); + uint8_t chMaskCntl = (cmd->payload[3] & 0x70) >> 4; + uint8_t nbTrans = cmd->payload[3] & 0x0F; + RADIOLIB_DEBUG_PRINTLN("ADR REQ: dataRate = %d, txPower = %d, chMask = 0x%04x, chMaskCntl = %02x, nbTrans = %d", dr, txPower, chMask, chMaskCntl, nbTrans); + + // apply the configuration + uint8_t drAck = 0; + if(dr != 0x0F) { + // first figure out which channel span this data rate applies to + // TODO do that by processing the chMask/chMaskCntl? + uint8_t spanChannelId = 0; + LoRaWANChannelSpan_t* span = findChannelSpan(RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, this->chIndex[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK], &spanChannelId); + + // seems to be only applicable to uplink + if(span) { + DataRate_t dataRate; + this->dataRate[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK] = findDataRate(dr, &dataRate, span); + if(this->phyLayer->setDataRate(dataRate) == RADIOLIB_ERR_NONE) { + RADIOLIB_DEBUG_PRINTLN("ADR set dr = %d channel = %d", dr, spanChannelId); + drAck = 1; + } + } + + } else { + drAck = 1; + + } + + // try to apply the power configuration + uint8_t pwrAck = 0; + if(txPower != 0x0F) { + int8_t pwr = this->band->powerMax - 2*txPower; + if(this->phyLayer->setOutputPower(pwr) == RADIOLIB_ERR_NONE) { + RADIOLIB_DEBUG_PRINTLN("ADR set pwr = %d", pwr); + pwrAck = 1; + } + + } else { + pwrAck = 1; + } + + // TODO implement repeated uplinks with nbTrans + (void)nbTrans; + // TODO implement channel mask + uint8_t chMaskAck = 0; + (void)chMask; + (void)chMaskCntl; + + // send the reply + cmd->len = 1; + cmd->payload[0] = (pwrAck << 2) | (drAck << 1) | (chMaskAck << 0); + RADIOLIB_DEBUG_PRINTLN("ADR ANS: status = 0x%02x", cmd->payload[0]); + pushMacCommand(cmd, &this->commandsUp); + return(4); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_DUTY_CYCLE): { + uint8_t maxDutyCycle = cmd->payload[0] & 0x0F; + RADIOLIB_DEBUG_PRINTLN("Max duty cycle: 1/2^%d", maxDutyCycle); + + // TODO implement this + (void)maxDutyCycle; + return(1); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_RX_PARAM_SETUP): { + // get the configuration + uint8_t rx1DrOffset = (cmd->payload[0] & 0x70) >> 4; + uint8_t rx2DataRate = cmd->payload[0] & 0x0F; + uint32_t freqRaw = LoRaWANNode::ntoh(&cmd->payload[1], 3); + RADIOLIB_DEBUG_PRINTLN("RX Param: rx1DrOffset = %d, rx2DataRate = %d, freq = %d", rx1DrOffset, rx2DataRate, freqRaw); + + // apply the configuration + float freq = (float)freqRaw/10000.0; + float prevFreq = this->channelFreq[RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK]; + uint8_t chanAck = 0; + if(this->phyLayer->setFrequency(freq) == RADIOLIB_ERR_NONE) { + this->backupFreq = freq; + chanAck = 1; + this->phyLayer->setFrequency(prevFreq); + } + + // TODO process the RX2 data rate + (void)rx2DataRate; + uint8_t rx2Ack = 0; + + // TODO process the data rate offset + (void)rx1DrOffset; + uint8_t rx1OffsAck = 0; + + // send the reply + cmd->len = 1; + cmd->payload[0] = (rx1OffsAck << 2) | (rx2Ack << 1) | (chanAck << 0); + RADIOLIB_DEBUG_PRINTLN("Rx param ANS: status = 0x%02x", cmd->payload[0]); + pushMacCommand(cmd, &this->commandsUp); + return(4); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_DEV_STATUS): { + // set the uplink reply + cmd->len = 2; + cmd->payload[1] = this->battLevel; + int8_t snr = this->phyLayer->getSNR(); + cmd->payload[0] = snr & 0x3F; + + // push it to the uplink queue + pushMacCommand(cmd, &this->commandsUp); + return(0); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_NEW_CHANNEL): { + // get the configuration + uint8_t chIndex = cmd->payload[0]; + uint32_t freqRaw = LoRaWANNode::ntoh(&cmd->payload[1], 3); + float freq = (float)freqRaw/10000.0; + uint8_t maxDr = (cmd->payload[4] & 0xF0) >> 4; + uint8_t minDr = cmd->payload[4] & 0x0F; + RADIOLIB_DEBUG_PRINT("New channel: index = %d, freq = ", chIndex); + RADIOLIB_DEBUG_PRINT_FLOAT(freq, 3); + RADIOLIB_DEBUG_PRINTLN(" MHz, maxDr = %d, minDr = %d", maxDr, minDr); + + // TODO implement this + (void)chIndex; + (void)freq; + (void)maxDr; + (void)minDr; + return(5); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_RX_TIMING_SETUP): { + // get the configuration + uint8_t delay = cmd->payload[0] & 0x0F; + RADIOLIB_DEBUG_PRINTLN("RX timing: delay = %d sec", delay); + + // apply the configuration + if(delay == 0) { + delay = 1; + } + this->rxDelays[0] = delay * 1000; + this->rxDelays[1] = this->rxDelays[0] + 1000; + + // send the reply + cmd->len = 0; + + // TODO this should be sent repeatedly until the next downlink + pushMacCommand(cmd, &this->commandsUp); + + return(1); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_TX_PARAM_SETUP): { + uint8_t dlDwell = (cmd->payload[0] & 0x20) >> 5; + uint8_t ulDwell = (cmd->payload[0] & 0x10) >> 4; + uint8_t maxEirpRaw = cmd->payload[0] & 0x0F; + + // who the f came up with this ... + const uint8_t eirpEncoding[] = { 8, 10, 12, 13, 14, 16, 18, 20, 21, 24, 26, 27, 29, 30, 33, 36 }; + uint8_t maxEirp = eirpEncoding[maxEirpRaw]; + RADIOLIB_DEBUG_PRINTLN("TX timing: dlDwell = %d, dlDwell = %d, maxEirp = %d dBm", dlDwell, ulDwell, maxEirp); + + // TODO implement this + (void)dlDwell; + (void)ulDwell; + (void)maxEirp; + return(1); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_DL_CHANNEL): { + // get the configuration + uint8_t chIndex = cmd->payload[0]; + uint32_t freqRaw = LoRaWANNode::ntoh(&cmd->payload[1], 3); + float freq = (float)freqRaw/10000.0; + RADIOLIB_DEBUG_PRINT("DL channel: index = %d, freq = ", chIndex); + RADIOLIB_DEBUG_PRINT_FLOAT(freq, 3); + RADIOLIB_DEBUG_PRINTLN(" MHz"); + + // TODO implement this + (void)chIndex; + (void)freq; + return(4); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_REKEY): { + // get the server version + uint8_t srvVersion = cmd->payload[0]; + RADIOLIB_DEBUG_PRINTLN("Server version: 1.%d", srvVersion); + if((srvVersion > 0) && (srvVersion <= this->rev)) { + // valid server version, stop sending the ReKey MAC command + deleteMacCommand(RADIOLIB_LORAWAN_MAC_CMD_REKEY, &this->commandsUp); + } + return(1); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_ADR_PARAM_SETUP): { + // TODO implement this + uint8_t limitExp = (cmd->payload[0] & 0xF0) >> 4; + uint8_t delayExp = cmd->payload[0] & 0x0F; + RADIOLIB_DEBUG_PRINTLN("ADR param setup: limitExp = %d, delayExp = %d", limitExp, delayExp); + (void)limitExp; + (void)delayExp; + return(1); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_DEVICE_TIME): { + // TODO implement this - sent by gateway as reply to node request + uint32_t gpsEpoch = LoRaWANNode::ntoh(&cmd->payload[0]); + uint8_t fraction = cmd->payload[4]; + RADIOLIB_DEBUG_PRINT("Network time: gpsEpoch = %d s, delayExp = ", gpsEpoch, (float)fraction/256.0f); + RADIOLIB_DEBUG_PRINT_FLOAT((float)fraction/256.0f, 2); + RADIOLIB_DEBUG_PRINTLN(); + (void)gpsEpoch; + (void)fraction; + return(5); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_FORCE_REJOIN): { + // TODO implement this + uint16_t rejoinReq = LoRaWANNode::ntoh(&cmd->payload[0]); + uint8_t period = (rejoinReq & 0x3800) >> 11; + uint8_t maxRetries = (rejoinReq & 0x0700) >> 8; + uint8_t rejoinType = (rejoinReq & 0x0070) >> 4; + uint8_t dr = rejoinReq & 0x000F; + RADIOLIB_DEBUG_PRINTLN("Force rejoin: period = %d, maxRetries = %d, rejoinType = %d, dr = %d", period, maxRetries, rejoinType, dr); + (void)period; + (void)maxRetries; + (void)rejoinType; + (void)dr; + return(2); + } break; + + case(RADIOLIB_LORAWAN_MAC_CMD_REJOIN_PARAM_SETUP): { + // TODO implement this + uint8_t maxTime = (cmd->payload[0] & 0xF0) >> 4; + uint8_t maxCount = cmd->payload[0] & 0x0F; + RADIOLIB_DEBUG_PRINTLN("Rejoin setup: maxTime = %d, maxCount = %d", maxTime, maxCount); + (void)maxTime; + (void)maxCount; + return(0); + } break; + } + + return(0); +} + +void LoRaWANNode::processAES(uint8_t* in, size_t len, uint8_t* key, uint8_t* out, uint32_t fcnt, uint8_t dir, uint8_t ctrId, bool counter) { + // figure out how many encryption blocks are there + size_t numBlocks = len/RADIOLIB_AES128_BLOCK_SIZE; + if(len % RADIOLIB_AES128_BLOCK_SIZE) { + numBlocks++; + } + + // generate the encryption blocks + uint8_t encBuffer[RADIOLIB_AES128_BLOCK_SIZE] = { 0 }; + uint8_t encBlock[RADIOLIB_AES128_BLOCK_SIZE] = { 0 }; + encBlock[RADIOLIB_LORAWAN_BLOCK_MAGIC_POS] = RADIOLIB_LORAWAN_ENC_BLOCK_MAGIC; + encBlock[RADIOLIB_LORAWAN_ENC_BLOCK_COUNTER_ID_POS] = ctrId; + encBlock[RADIOLIB_LORAWAN_BLOCK_DIR_POS] = dir; + LoRaWANNode::hton(&encBlock[RADIOLIB_LORAWAN_BLOCK_DEV_ADDR_POS], this->devAddr); + LoRaWANNode::hton(&encBlock[RADIOLIB_LORAWAN_BLOCK_FCNT_POS], fcnt); + + // now encrypt the input + // on downlink frames, this has a decryption effect because server actually "decrypts" the plaintext + size_t remLen = len; + for(size_t i = 0; i < numBlocks; i++) { + if(counter) { + encBlock[RADIOLIB_LORAWAN_ENC_BLOCK_COUNTER_POS] = i + 1; + } + + // encrypt the buffer + RadioLibAES128Instance.init(key); + RadioLibAES128Instance.encryptECB(encBlock, RADIOLIB_AES128_BLOCK_SIZE, encBuffer); + + // now xor the buffer with the input + size_t xorLen = remLen; + if(xorLen > RADIOLIB_AES128_BLOCK_SIZE) { + xorLen = RADIOLIB_AES128_BLOCK_SIZE; + } + for(uint8_t j = 0; j < xorLen; j++) { + out[i*RADIOLIB_AES128_BLOCK_SIZE + j] = in[i*RADIOLIB_AES128_BLOCK_SIZE + j] ^ encBuffer[j]; + } + remLen -= xorLen; + } +} + +template +T LoRaWANNode::ntoh(uint8_t* buff, size_t size) { + uint8_t* buffPtr = buff; + size_t targetSize = sizeof(T); + if(size != 0) { + targetSize = size; + } + T res = 0; + for(size_t i = 0; i < targetSize; i++) { + res |= (uint32_t)(*(buffPtr++)) << 8*i; + } + return(res); +} + +template +void LoRaWANNode::hton(uint8_t* buff, T val, size_t size) { + uint8_t* buffPtr = buff; + size_t targetSize = sizeof(T); + if(size != 0) { + targetSize = size; + } + for(size_t i = 0; i < targetSize; i++) { + *(buffPtr++) = val >> 8*i; + } +} + +// The following function enables LMAC, a CSMA scheme for LoRa as specified +// in the LoRa Alliance Technical Recommendation #13. +// A user may enable CSMA to provide frames an additional layer of protection from interference. +// https://resources.lora-alliance.org/technical-recommendations/tr013-1-0-0-csma +void LoRaWANNode::performCSMA() { + + // Compute initial random back-off. + // When BO is reduced to zero, the function returns and the frame is transmitted. + uint32_t BO = this->phyLayer->random(1, this->backoffMax + 1); + + while (BO > 0) { + // DIFS: Check channel for DIFS_slots + bool channelFreeDuringDIFS = true; + for (uint8_t i = 0; i < this->difsSlots; i++) { + if (performCAD()) { + RADIOLIB_DEBUG_PRINTLN("OCCUPIED CHANNEL DURING DIFS"); + channelFreeDuringDIFS = false; + // Channel is occupied during DIFS, hop to another. + this->setupChannels(); + break; + } + } + + // Start reducing BO counter if DIFS slot was free. + if (channelFreeDuringDIFS) { + // Continue decrementing BO with per each CAD reporting free channel. + while (BO > 0) { + if (performCAD()) { + RADIOLIB_DEBUG_PRINTLN("OCCUPIED CHANNEL DURING BO"); + // Channel is busy during CAD, hop to another and return to DIFS state again. + this->setupChannels(); + break; // Exit loop. Go back to DIFS state. + } + BO--; // Decrement BO by one if channel is free + } + } + } +} + +bool LoRaWANNode::performCAD() { + int16_t state = this->phyLayer->scanChannel(); + + if ((state == RADIOLIB_PREAMBLE_DETECTED) || (state == RADIOLIB_LORA_DETECTED)) { + return true; // Channel is busy + } + return false; // Channel is free +} + +#endif \ No newline at end of file diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWAN.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWAN.h new file mode 100644 index 00000000..82b08127 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWAN.h @@ -0,0 +1,532 @@ +#if !defined(_RADIOLIB_LORAWAN_H) && !defined(RADIOLIB_EXCLUDE_LORAWAN) +#define _RADIOLIB_LORAWAN_H + +#include "../../TypeDef.h" +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../../utils/Cryptography.h" + +// version of NVM table layout (NOT the LoRaWAN version) +#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_VERSION (0x01) + +// preamble format +#define RADIOLIB_LORAWAN_LORA_SYNC_WORD (0x34) +#define RADIOLIB_LORAWAN_LORA_PREAMBLE_LEN (8) +#define RADIOLIB_LORAWAN_GFSK_SYNC_WORD (0xC194C1) +#define RADIOLIB_LORAWAN_GFSK_PREAMBLE_LEN (5) + +// MAC header field encoding MSB LSB DESCRIPTION +#define RADIOLIB_LORAWAN_MHDR_MTYPE_JOIN_REQUEST (0x00 << 5) // 7 5 message type: join request +#define RADIOLIB_LORAWAN_MHDR_MTYPE_JOIN_ACCEPT (0x01 << 5) // 7 5 join accept +#define RADIOLIB_LORAWAN_MHDR_MTYPE_UNCONF_DATA_UP (0x02 << 5) // 7 5 unconfirmed data up +#define RADIOLIB_LORAWAN_MHDR_MTYPE_UNCONF_DATA_DOWN (0x03 << 5) // 7 5 unconfirmed data down +#define RADIOLIB_LORAWAN_MHDR_MTYPE_CONF_DATA_UP (0x04 << 5) // 7 5 confirmed data up +#define RADIOLIB_LORAWAN_MHDR_MTYPE_CONF_DATA_DOWN (0x05 << 5) // 7 5 confirmed data down +#define RADIOLIB_LORAWAN_MHDR_MTYPE_PROPRIETARY (0x07 << 5) // 7 5 proprietary +#define RADIOLIB_LORAWAN_MHDR_MTYPE_MASK (0x07 << 5) // 7 5 bitmask of all possible options +#define RADIOLIB_LORAWAN_MHDR_MAJOR_R1 (0x00 << 0) // 1 0 major version: LoRaWAN R1 + +// frame control field encoding +#define RADIOLIB_LORAWAN_FCTRL_ADR_ENABLED (0x01 << 7) // 7 7 adaptive data rate: enabled +#define RADIOLIB_LORAWAN_FCTRL_ADR_DISABLED (0x00 << 7) // 7 7 disabled +#define RADIOLIB_LORAWAN_FCTRL_ADR_ACK_REQ (0x01 << 6) // 6 6 adaptive data rate ACK request +#define RADIOLIB_LORAWAN_FCTRL_ACK (0x01 << 5) // 5 5 confirmed message acknowledge +#define RADIOLIB_LORAWAN_FCTRL_FRAME_PENDING (0x01 << 4) // 4 4 downlink frame is pending + +// port field +#define RADIOLIB_LORAWAN_FPORT_MAC_COMMAND (0x00 << 0) // 7 0 payload contains MAC commands only +#define RADIOLIB_LORAWAN_FPORT_RESERVED (0xE0 << 0) // 7 0 reserved port values + +// MAC commands - only those sent from end-device to gateway +#define RADIOLIB_LORAWAN_LINK_CHECK_REQ (0x02 << 0) // 7 0 MAC command: request to check connectivity to network +#define RADIOLIB_LORAWAN_LINK_ADR_ANS (0x03 << 0) // 7 0 answer to ADR change +#define RADIOLIB_LORAWAN_DUTY_CYCLE_ANS (0x04 << 0) // 7 0 answer to duty cycle change +#define RADIOLIB_LORAWAN_RX_PARAM_SETUP_ANS (0x05 << 0) // 7 0 answer to reception slot setup request +#define RADIOLIB_LORAWAN_DEV_STATUS_ANS (0x06 << 0) // 7 0 device status information +#define RADIOLIB_LORAWAN_NEW_CHANNEL_ANS (0x07 << 0) // 7 0 acknowledges change of a radio channel +#define RADIOLIB_LORAWAN_RX_TIMING_SETUP_ANS (0x08 << 0) // 7 0 acknowledges change of a reception slots timing + +#define RADIOLIB_LORAWAN_NOPTS_LEN (8) + +// data rate encoding +#define RADIOLIB_LORAWAN_DATA_RATE_FSK_50_K (0x01 << 7) // 7 7 FSK @ 50 kbps +#define RADIOLIB_LORAWAN_DATA_RATE_SF_12 (0x06 << 4) // 6 4 LoRa spreading factor: SF12 +#define RADIOLIB_LORAWAN_DATA_RATE_SF_11 (0x05 << 4) // 6 4 SF11 +#define RADIOLIB_LORAWAN_DATA_RATE_SF_10 (0x04 << 4) // 6 4 SF10 +#define RADIOLIB_LORAWAN_DATA_RATE_SF_9 (0x03 << 4) // 6 4 SF9 +#define RADIOLIB_LORAWAN_DATA_RATE_SF_8 (0x02 << 4) // 6 4 SF8 +#define RADIOLIB_LORAWAN_DATA_RATE_SF_7 (0x01 << 4) // 6 4 SF7 +#define RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ (0x00 << 2) // 3 2 LoRa bandwidth: 500 kHz +#define RADIOLIB_LORAWAN_DATA_RATE_BW_250_KHZ (0x01 << 2) // 3 2 250 kHz +#define RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ (0x02 << 2) // 3 2 125 kHz +#define RADIOLIB_LORAWAN_DATA_RATE_BW_RESERVED (0x03 << 2) // 3 2 reserved value +#define RADIOLIB_LORAWAN_DATA_RATE_CR_4_5 (0x00 << 0) // 1 0 LoRa coding rate: 4/5 +#define RADIOLIB_LORAWAN_DATA_RATE_CR_4_6 (0x01 << 0) // 1 0 4/6 +#define RADIOLIB_LORAWAN_DATA_RATE_CR_4_7 (0x02 << 0) // 1 0 4/7 +#define RADIOLIB_LORAWAN_DATA_RATE_CR_4_8 (0x03 << 0) // 1 0 4/8 +#define RADIOLIB_LORAWAN_DATA_RATE_UNUSED (0xFF << 0) // 7 0 unused data rate + +#define RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK (0x00 << 0) +#define RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK (0x01 << 0) +#define RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH (0x02 << 0) +#define RADIOLIB_LORAWAN_CHANNEL_DIR_NONE (0x03 << 0) +#define RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES (0) +#define RADIOLIB_LORAWAN_CFLIST_TYPE_MASK (1) +#define RADIOLIB_LORAWAN_CHANNEL_NUM_DATARATES (16) + +// recommended default settings +#define RADIOLIB_LORAWAN_RECEIVE_DELAY_1_MS (1000) +#define RADIOLIB_LORAWAN_RECEIVE_DELAY_2_MS ((RADIOLIB_LORAWAN_RECEIVE_DELAY_1_MS) + 1000) +#define RADIOLIB_LORAWAN_RX_WINDOW_LEN_MS (500) +#define RADIOLIB_LORAWAN_RX1_DR_OFFSET (0) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_DELAY_1_MS (5000) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_DELAY_2_MS (6000) +#define RADIOLIB_LORAWAN_MAX_FCNT_GAP (16384) +#define RADIOLIB_LORAWAN_ADR_ACK_LIMIT (64) +#define RADIOLIB_LORAWAN_ADR_ACK_DELAY (32) +#define RADIOLIB_LORAWAN_RETRANSMIT_TIMEOUT_MIN_MS (1000) +#define RADIOLIB_LORAWAN_RETRANSMIT_TIMEOUT_MAX_MS (3000) +#define RADIOLIB_LORAWAN_POWER_STEP_SIZE_DBM (-2) + +// join request message layout +#define RADIOLIB_LORAWAN_JOIN_REQUEST_LEN (23) +#define RADIOLIB_LORAWAN_JOIN_REQUEST_JOIN_EUI_POS (1) +#define RADIOLIB_LORAWAN_JOIN_REQUEST_DEV_EUI_POS (9) +#define RADIOLIB_LORAWAN_JOIN_REQUEST_DEV_NONCE_POS (17) +#define RADIOLIB_LORAWAN_JOIN_REQUEST_TYPE (0xFF) +#define RADIOLIB_LORAWAN_JOIN_REQUEST_TYPE_0 (0x00) +#define RADIOLIB_LORAWAN_JOIN_REQUEST_TYPE_1 (0x01) +#define RADIOLIB_LORAWAN_JOIN_REQUEST_TYPE_2 (0x02) + +// join accept message layout +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_MAX_LEN (33) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_JOIN_NONCE_POS (1) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_HOME_NET_ID_POS (4) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_DEV_ADDR_POS (7) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_JOIN_EUI_POS (4) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_DL_SETTINGS_POS (11) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_RX_DELAY_POS (12) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_DEV_NONCE_POS (12) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_POS (13) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN (16) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_TYPE_POS (RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_POS + RADIOLIB_LORAWAN_JOIN_ACCEPT_CFLIST_LEN - 1) + +// join accept message variables +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_R_1_0 (0x00 << 7) // 7 7 LoRaWAN revision: 1.0 +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_R_1_1 (0x01 << 7) // 7 7 1.1 +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_F_NWK_S_INT_KEY (0x01) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_APP_S_KEY (0x02) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_S_NWK_S_INT_KEY (0x03) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_NWK_S_ENC_KEY (0x04) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_JS_ENC_KEY (0x05) +#define RADIOLIB_LORAWAN_JOIN_ACCEPT_JS_INT_KEY (0x06) + +// frame header layout +#define RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS (16) +#define RADIOLIB_LORAWAN_FHDR_DEV_ADDR_POS (RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS + 1) +#define RADIOLIB_LORAWAN_FHDR_FCTRL_POS (RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS + 5) +#define RADIOLIB_LORAWAN_FHDR_FCNT_POS (RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS + 6) +#define RADIOLIB_LORAWAN_FHDR_FOPTS_POS (RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS + 8) +#define RADIOLIB_LORAWAN_FHDR_FOPTS_LEN_MASK (0x0F) +#define RADIOLIB_LORAWAN_FHDR_FOPTS_MAX_LEN (RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS + 16) +#define RADIOLIB_LORAWAN_FHDR_FPORT_POS(FOPTS) (RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS + 8 + (FOPTS)) +#define RADIOLIB_LORAWAN_FRAME_PAYLOAD_POS(FOPTS) (RADIOLIB_LORAWAN_FHDR_LEN_START_OFFS + 9 + (FOPTS)) +#define RADIOLIB_LORAWAN_FRAME_LEN(PAYLOAD, FOPTS) (16 + 13 + (PAYLOAD) + (FOPTS)) + +// payload encryption/MIC blocks common layout +#define RADIOLIB_LORAWAN_BLOCK_MAGIC_POS (0) +#define RADIOLIB_LORAWAN_BLOCK_DIR_POS (5) +#define RADIOLIB_LORAWAN_BLOCK_DEV_ADDR_POS (6) +#define RADIOLIB_LORAWAN_BLOCK_FCNT_POS (10) + +// payload encryption block layout +#define RADIOLIB_LORAWAN_ENC_BLOCK_MAGIC (0x01) +#define RADIOLIB_LORAWAN_ENC_BLOCK_COUNTER_ID_POS (4) +#define RADIOLIB_LORAWAN_ENC_BLOCK_COUNTER_POS (15) + +// payload MIC blocks layout +#define RADIOLIB_LORAWAN_MIC_BLOCK_MAGIC (0x49) +#define RADIOLIB_LORAWAN_MIC_BLOCK_LEN_POS (15) +#define RADIOLIB_LORAWAN_MIC_DATA_RATE_POS (3) +#define RADIOLIB_LORAWAN_MIC_CH_INDEX_POS (4) + +// magic word saved in persistent memory upon activation +#define RADIOLIB_LORAWAN_MAGIC (0x12AD101B) + +// MAC commands +#define RADIOLIB_LORAWAN_MAC_CMD_RESET (0x01) +#define RADIOLIB_LORAWAN_MAC_CMD_LINK_CHECK (0x02) +#define RADIOLIB_LORAWAN_MAC_CMD_LINK_ADR (0x03) +#define RADIOLIB_LORAWAN_MAC_CMD_DUTY_CYCLE (0x04) +#define RADIOLIB_LORAWAN_MAC_CMD_RX_PARAM_SETUP (0x05) +#define RADIOLIB_LORAWAN_MAC_CMD_DEV_STATUS (0x06) +#define RADIOLIB_LORAWAN_MAC_CMD_NEW_CHANNEL (0x07) +#define RADIOLIB_LORAWAN_MAC_CMD_RX_TIMING_SETUP (0x08) +#define RADIOLIB_LORAWAN_MAC_CMD_TX_PARAM_SETUP (0x09) +#define RADIOLIB_LORAWAN_MAC_CMD_DL_CHANNEL (0x0A) +#define RADIOLIB_LORAWAN_MAC_CMD_REKEY (0x0B) +#define RADIOLIB_LORAWAN_MAC_CMD_ADR_PARAM_SETUP (0x0C) +#define RADIOLIB_LORAWAN_MAC_CMD_DEVICE_TIME (0x0D) +#define RADIOLIB_LORAWAN_MAC_CMD_FORCE_REJOIN (0x0E) +#define RADIOLIB_LORAWAN_MAC_CMD_REJOIN_PARAM_SETUP (0x0F) +#define RADIOLIB_LORAWAN_MAC_CMD_PROPRIETARY (0x80) + +// the length of internal MAC command queue - hopefully this is enough for most use cases +#define RADIOLIB_LORAWAN_MAC_COMMAND_QUEUE_SIZE (8) + +// the maximum number of simultaneously available channels +#define RADIOLIB_LORAWAN_NUM_AVAILABLE_CHANNELS (8) + +/*! + \struct LoRaWANChannelSpan_t + \brief Structure to save information about LoRaWAN channels. + To save space, adjacent channels are saved in "spans". +*/ +struct LoRaWANChannelSpan_t { + /*! \brief Whether this channel span is for uplink, downlink, or both directions*/ + uint8_t direction; + + /*! \brief Allowed data rates for a join request message */ + uint8_t joinRequestDataRate; + + /*! \brief Total number of channels in the span */ + uint8_t numChannels; + + /*! \brief Center frequency of the first channel in span */ + float freqStart; + + /*! \brief Frequency step between adjacent channels */ + float freqStep; + + /*! \brief Array of datarates supported by all channels in the span */ + uint8_t dataRates[RADIOLIB_LORAWAN_CHANNEL_NUM_DATARATES]; +}; + +// alias for unused channel span +#define RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE { .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_NONE, .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, .numChannels = 0, .freqStart = 0, .freqStep = 0, .dataRates = { 0 } } + +/*! + \struct LoRaWANBand_t + \brief Structure to save information about LoRaWAN band +*/ +struct LoRaWANBand_t { + /*! \brief The base downlink data rate. Used to calculate data rate changes for adaptive data rate */ + uint8_t downlinkDataRateBase; + + /*! \brief The minimum allowed downlink data rate. Used to calculate data rate changes for adaptive data rate */ + uint8_t downlinkDataRateMin; + + /*! \brief Array of allowed maximum payload lengths for each data rate */ + uint8_t payloadLenMax[RADIOLIB_LORAWAN_CHANNEL_NUM_DATARATES]; + + /*! \brief Maximum allowed output power in this band in dBm */ + int8_t powerMax; + + /*! \brief Number of power steps in this band */ + int8_t powerNumSteps; + + /*! \brief Whether the optional channels are defined as list of frequencies or bit mask */ + uint8_t cfListType; + + /*! \brief FSK channel frequency */ + float fskFreq; + + /*! \brief Number of channel spans in the band */ + uint8_t numChannelSpans; + + /*! \brief Default uplink (TX/RX1) channels defined by LoRaWAN Regional Parameters */ + LoRaWANChannelSpan_t defaultChannels[3]; + + /*! \brief Backup downlink (RX2) channel - just a single channel, but using the same structure for convenience */ + LoRaWANChannelSpan_t backupChannel; +}; + +// supported bands +extern const LoRaWANBand_t EU868; +extern const LoRaWANBand_t US915; +extern const LoRaWANBand_t CN780; +extern const LoRaWANBand_t EU433; +extern const LoRaWANBand_t AU915; +extern const LoRaWANBand_t CN500; +extern const LoRaWANBand_t AS923; +extern const LoRaWANBand_t KR920; +extern const LoRaWANBand_t IN865; + +/*! + \struct LoRaWANMacCommand_t + \brief Structure to save information about MAC command +*/ +struct LoRaWANMacCommand_t { + /*! \brief The command ID */ + uint8_t cid; + + /*! \brief Length of the payload */ + uint8_t len; + + /*! \brief Payload buffer (5 bytes is the longest possible) */ + uint8_t payload[5]; + + /*! \brief Repetition counter (the command will be uplinked repeat + 1 times) */ + uint8_t repeat; +}; + +struct LoRaWANMacCommandQueue_t { + LoRaWANMacCommand_t commands[RADIOLIB_LORAWAN_MAC_COMMAND_QUEUE_SIZE]; + size_t numCommands; + size_t len; +}; + +/*! + \class LoRaWANNode + \brief LoRaWAN-compatible node (class A device). +*/ +class LoRaWANNode { + public: + /*! \brief Set to true to force the node to only use FSK channels. Set to false by default. */ + bool FSK; + + /*! \brief Starting channel offset. + Some band plans only support a subset of available channels. + Set to a positive value to set the first channel that will be used (e.g. 8 for US915 FSB2 used by TTN). + By default -1 (no channel offset). */ + int8_t startChannel; + + /*! \brief Number of supported channels. + Some band plans only support a subset of available channels. + Set to a positive value to set the number of channels that will be used + (e.g. 8 for US915 FSB2 used by TTN). By default -1 (no channel offset). */ + int8_t numChannels; + + /*! \brief Num of Back Off(BO) slots to be decremented after DIFS phase. 0 to disable BO. + A random BO avoids collisions in the case where two or more nodes start the CSMA + process at the same time. */ + uint8_t backoffMax; + + /*! \brief Num of CADs to estimate a clear CH. */ + uint8_t difsSlots; + + /*! \brief enable/disable CSMA for LoRaWAN. */ + bool enableCSMA; + + /*! + \brief Default constructor. + \param phy Pointer to the PhysicalLayer radio module. + \param band Pointer to the LoRaWAN band to use. + */ + LoRaWANNode(PhysicalLayer* phy, const LoRaWANBand_t* band); + + /*! + \brief Wipe internal persistent parameters. + This will reset all counters and saved variables, so the device will have to rejoin the network. + */ + void wipe(); + + /*! + \brief Configures CSMA for LoRaWAN as per TR-13, LoRa Alliance. + \param backoffMax Num of BO slots to be decremented after DIFS phase. 0 to disable BO. + \param difsSlots Num of CADs to estimate a clear CH. + \param enableCSMA enable/disable CSMA for LoRaWAN. + */ + void setCSMA(uint8_t backoffMax, uint8_t difsSlots, bool enableCSMA = false); + + /*! + \brief Restore OTAA session by loading information from persistent storage. + \returns \ref status_codes + */ + int16_t restoreOTAA(); + + /*! + \brief Join network by performing over-the-air activation. By this procedure, + the device will perform an exchange with the network server and set all necessary configuration. + \param joinEUI 8-byte application identifier. + \param devEUI 8-byte device identifier. + \param nwkKey Pointer to the network AES-128 key. + \param appKey Pointer to the application AES-128 key. + \param force Set to true to force joining even if previously joined. + \returns \ref status_codes + */ + int16_t beginOTAA(uint64_t joinEUI, uint64_t devEUI, uint8_t* nwkKey, uint8_t* appKey, bool force = false); + + /*! + \brief Join network by performing activation by personalization. + In this procedure, all necessary configuration must be provided by the user. + \param addr Device address. + \param nwkSKey Pointer to the network session AES-128 key (LoRaWAN 1.0) or MAC command network session key (LoRaWAN 1.1). + \param appSKey Pointer to the application session AES-128 key. + \param fNwkSIntKey Pointer to the network session F key (LoRaWAN 1.1), unused for LoRaWAN 1.0. + \param sNwkSIntKey Pointer to the network session S key (LoRaWAN 1.1), unused for LoRaWAN 1.0. + \returns \ref status_codes + */ + int16_t beginABP(uint32_t addr, uint8_t* nwkSKey, uint8_t* appSKey, uint8_t* fNwkSIntKey = NULL, uint8_t* sNwkSIntKey = NULL); + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Send a message to the server. + \param str Address of Arduino String that will be transmitted. + \param port Port number to send the message to. + \returns \ref status_codes + */ + int16_t uplink(String& str, uint8_t port); + #endif + + /*! + \brief Send a message to the server. + \param str C-string that will be transmitted. + \param port Port number to send the message to. + \returns \ref status_codes + */ + int16_t uplink(const char* str, uint8_t port); + + /*! + \brief Send a message to the server. + \param data Data to send. + \param len Length of the data. + \param port Port number to send the message to. + \returns \ref status_codes + */ + int16_t uplink(uint8_t* data, size_t len, uint8_t port); + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Wait for downlink from the server in either RX1 or RX2 window. + \param str Address of Arduino String to save the received data. + \returns \ref status_codes + */ + int16_t downlink(String& str); + #endif + + /*! + \brief Wait for downlink from the server in either RX1 or RX2 window. + \param data Buffer to save received data into. + \param len Pointer to variable that will be used to save the number of received bytes. + \returns \ref status_codes + */ + int16_t downlink(uint8_t* data, size_t* len); + + /*! + \brief Set device status. + \param battLevel Battery level to set. 0 for external power source, 1 for lowest battery, + 254 for highest battery, 255 for unable to measure. + */ + void setDeviceStatus(uint8_t battLevel); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + PhysicalLayer* phyLayer = NULL; + const LoRaWANBand_t* band = NULL; + + LoRaWANMacCommandQueue_t commandsUp = { + .commands = { { .cid = 0, .len = 0, .payload = { 0 }, .repeat = 0, } }, + .numCommands = 0, + .len = 0, + }; + LoRaWANMacCommandQueue_t commandsDown = { + .commands = { { .cid = 0, .len = 0, .payload = { 0 }, .repeat = 0, } }, + .numCommands = 0, + .len = 0, + }; + + // the following is either provided by the network server (OTAA) + // or directly entered by the user (ABP) + uint32_t devAddr = 0; + uint8_t appSKey[RADIOLIB_AES128_KEY_SIZE] = { 0 }; + uint8_t fNwkSIntKey[RADIOLIB_AES128_KEY_SIZE] = { 0 }; + uint8_t sNwkSIntKey[RADIOLIB_AES128_KEY_SIZE] = { 0 }; + uint8_t nwkSEncKey[RADIOLIB_AES128_KEY_SIZE] = { 0 }; + uint8_t jSIntKey[RADIOLIB_AES128_KEY_SIZE] = { 0 }; + + // available channel frequencies from list passed during OTA activation + float availableChannelsFreq[2][RADIOLIB_LORAWAN_NUM_AVAILABLE_CHANNELS] = { { 0 }, { 0 } }; + + // currently configured channel frequency + float channelFreq[2] = { 0 }; + + // LoRaWAN revision (1.0 vs 1.1) + uint8_t rev = 0; + + // currently configured data rate for uplink and downlink: DR0 - DR15 (band-dependent!) + uint8_t dataRate[2] = { 0 }; + + // currently configured channel for uplink and downlink (band-dependent!) + uint8_t chIndex[2] = { 0 }; + + // backup channel properties - may be changed by MAC command + float backupFreq = 0; + uint8_t backupDataRate = 0; + + // timestamp to measure the RX1/2 delay (from uplink end) + uint32_t rxDelayStart = 0; + + // delays between the uplink and RX1/2 windows + uint32_t rxDelays[2] = { RADIOLIB_LORAWAN_RECEIVE_DELAY_1_MS, RADIOLIB_LORAWAN_RECEIVE_DELAY_2_MS }; + + // device status - battery level + uint8_t battLevel = 0xFF; + + // indicates whether an uplink has MAC commands as payload + bool isMACPayload = false; + + // method to generate message integrity code + uint32_t generateMIC(uint8_t* msg, size_t len, uint8_t* key); + + // method to verify message integrity code + // it assumes that the MIC is the last 4 bytes of the message + bool verifyMIC(uint8_t* msg, size_t len, uint8_t* key); + + // configure the common physical layer properties (preamble, sync word etc.) + // channels must be configured separately by setupChannels()! + int16_t setPhyProperties(); + + // setup uplink/downlink channel data rates and frequencies + // will attempt to randomly select based on currently used band plan + int16_t setupChannels(); + + // find the first usable data rate in a given channel span + uint8_t findDataRate(uint8_t dr, DataRate_t* dataRate, const LoRaWANChannelSpan_t* span); + + // find a channel ID that conforms to the requested direction and ID range + int16_t findChannelId(uint8_t dir, uint8_t* ch, uint8_t* dr, int8_t min, int8_t max); + + // find a channel span that any given channel id belongs to + LoRaWANChannelSpan_t* findChannelSpan(uint8_t dir, uint8_t ch, uint8_t* spanChannelId); + + // calculate channel frequency in MHz based on channel ID and direction + int16_t findChannelFreq(uint8_t dir, uint8_t ch, float* freq); + + // configure channel based on cached data rate ID and frequency + int16_t configureChannel(uint8_t dir); + + // send a MAC command to the network server + int16_t sendMacCommand(uint8_t cid, uint8_t* payload, size_t payloadLen, uint8_t* reply, size_t replyLen); + + // push MAC command to queue, done by copy + int16_t pushMacCommand(LoRaWANMacCommand_t* cmd, LoRaWANMacCommandQueue_t* queue); + + // pop MAC command from queue, done by copy unless CMD is NULL + int16_t popMacCommand(LoRaWANMacCommand_t* cmd, LoRaWANMacCommandQueue_t* queue, size_t index); + + // delete a specific MAC command from queue, indicated by the command ID + int16_t deleteMacCommand(uint8_t cid, LoRaWANMacCommandQueue_t* queue); + + // execute mac command, return the number of processed bytes for sequential processing + size_t execMacCommand(LoRaWANMacCommand_t* cmd); + + // function to encrypt and decrypt payloads + void processAES(uint8_t* in, size_t len, uint8_t* key, uint8_t* out, uint32_t fcnt, uint8_t dir, uint8_t ctrId, bool counter); + + // network-to-host conversion method - takes data from network packet and converts it to the host endians + template + static T ntoh(uint8_t* buff, size_t size = 0); + + // host-to-network conversion method - takes data from host variable and and converts it to network packet endians + template + static void hton(uint8_t* buff, T val, size_t size = 0); + + // perform a single CAD operation for the under SF/CH combination. Returns either busy or otherwise. + bool performCAD(); + + // Performs CSMA as per LoRa Alliance Technical Reccomendation 13 (TR-013). + void performCSMA(); +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWANBands.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWANBands.cpp new file mode 100644 index 00000000..c25b0af9 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/LoRaWAN/LoRaWANBands.cpp @@ -0,0 +1,731 @@ +#include "LoRaWAN.h" + +#if !defined(RADIOLIB_EXCLUDE_LORAWAN) + +uint8_t getDownlinkDataRate(uint8_t uplink, uint8_t offset, uint8_t base, uint8_t lim) { + int8_t dr = uplink - offset + base; + if(dr < lim) { + dr = lim; + } + return(dr); +} + +const LoRaWANBand_t EU868 = { + .downlinkDataRateBase = 0, + .downlinkDataRateMin = 0, + .payloadLenMax = { + 59, 59, 59, 123, 230, 230, 230, 230, + 0, 0, 0, 0, 0, 0, 0, 0 }, + .powerMax = 16, + .powerNumSteps = 7, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES, + .fskFreq = 868.8, + .numChannelSpans = 1, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 3, + .freqStart = 868.1, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_250_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_FSK_50_K, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED + } + }, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 869.858, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +const LoRaWANBand_t US915 = { + .downlinkDataRateBase = 10, + .downlinkDataRateMin = 8, + .payloadLenMax = { + 19, 61, 133, 250, 250, 0, 0, 0, + 41, 117, 230, 230, 230, 230, 0, 0 }, + .powerMax = 30, + .powerNumSteps = 10, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_MASK, + .fskFreq = 0, + .numChannelSpans = 3, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, + .joinRequestDataRate = 0, + .numChannels = 64, + .freqStart = 902.3, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + }, { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, + .joinRequestDataRate = 4, + .numChannels = 8, + .freqStart = 903, + .freqStep = 1.6, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + }, { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = 10, + .numChannels = 8, + .freqStart = 923.3, + .freqStep = 0.6, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + }, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 923.3, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +const LoRaWANBand_t CN780 = { + .downlinkDataRateBase = 0, + .downlinkDataRateMin = 0, + .payloadLenMax = { + 59, 59, 59, 123, 230, 230, 250, 230, + 0, 0, 0, 0, 0, 0, 0, 0 }, + .powerMax = 12, + .powerNumSteps = 5, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES, + .fskFreq = 0, + .numChannelSpans = 1, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 6, + .freqStart = 779.5, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_250_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_FSK_50_K, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED + } + }, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 786, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +const LoRaWANBand_t EU433 = { + .downlinkDataRateBase = 0, + .downlinkDataRateMin = 0, + .payloadLenMax = { + 59, 59, 59, 123, 230, 230, 230, 230, + 0, 0, 0, 0, 0, 0, 0, 0 }, + .powerMax = 12, + .powerNumSteps = 5, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES, + .fskFreq = 0, + .numChannelSpans = 1, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 3, + .freqStart = 433.175, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_250_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_FSK_50_K, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED + } + }, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 434.665, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +const LoRaWANBand_t AU915 = { + .downlinkDataRateBase = 8, + .downlinkDataRateMin = 8, + .payloadLenMax = { + 59, 59, 59, 123, 230, 230, 230, 0, + 41, 117, 230, 230, 230, 230, 0, 0 }, + .powerMax = 30, + .powerNumSteps = 10, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_MASK, + .fskFreq = 0, + .numChannelSpans = 3, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, + .joinRequestDataRate = 0, + .numChannels = 64, + .freqStart = 915.2, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + }, { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, + .joinRequestDataRate = 6, + .numChannels = 8, + .freqStart = 915.9, + .freqStep = 1.6, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + }, { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 8, + .freqStart = 923.3, + .freqStep = 0.6, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + }, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 923.3, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_500_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +const LoRaWANBand_t CN500 = { + .downlinkDataRateBase = 0, + .downlinkDataRateMin = 0, + .payloadLenMax = { + 59, 59, 59, 123, 230, 230, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + .powerMax = 19, + .powerNumSteps = 7, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_MASK, + .fskFreq = 0, + .numChannelSpans = 2, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 96, + .freqStart = 470.3, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + }, { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 48, + .freqStart = 500.3, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + }, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 505.3, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_5, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +const LoRaWANBand_t AS923 = { + .downlinkDataRateBase = 0, + .downlinkDataRateMin = 0, + .payloadLenMax = { + 59, 59, 59, 123, 230, 230, 230, 230, + 0, 0, 0, 0, 0, 0, 0, 0 }, + .powerMax = 16, + .powerNumSteps = 7, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES, + .fskFreq = 921.8, + .numChannelSpans = 1, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH, + .joinRequestDataRate = 2, + .numChannels = 2, + .freqStart = 923.2, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_250_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_FSK_50_K, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED + } + }, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 923.2, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +const LoRaWANBand_t KR920 = { + .downlinkDataRateBase = 0, + .downlinkDataRateMin = 0, + .payloadLenMax = { + 59, 59, 59, 123, 230, 230, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + .powerMax = 14, + .powerNumSteps = 7, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES, + .fskFreq = 0, + .numChannelSpans = 1, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 3, + .freqStart = 922.1, + .freqStep = 0.2, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_250_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_FSK_50_K, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED + } + }, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 921.9, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +const LoRaWANBand_t IN865 = { + .downlinkDataRateBase = 0, + .downlinkDataRateMin = 0, + .payloadLenMax = { + 59, 59, 59, 123, 230, 230, 230, 230, + 0, 0, 0, 0, 0, 0, 0, 0 }, + .powerMax = 30, + .powerNumSteps = 10, + .cfListType = RADIOLIB_LORAWAN_CFLIST_TYPE_FREQUENCIES, + .fskFreq = 0, + .numChannelSpans = 1, + .defaultChannels = { + { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_BOTH, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 3, + .freqStart = 865.0625, + .freqStep = 0.36, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_SF_12 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_11 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_9 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_8 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_SF_7 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_FSK_50_K, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED + } + }, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + RADIOLIB_LORAWAN_CHANNEL_SPAN_NONE, + }, + .backupChannel = { + .direction = RADIOLIB_LORAWAN_CHANNEL_DIR_DOWNLINK, + .joinRequestDataRate = RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + .numChannels = 1, + .freqStart = 866.55, + .freqStep = 0, + .dataRates = { + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_SF_10 | RADIOLIB_LORAWAN_DATA_RATE_BW_125_KHZ | RADIOLIB_LORAWAN_DATA_RATE_CR_4_7, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + RADIOLIB_LORAWAN_DATA_RATE_UNUSED, + } + } +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Morse/Morse.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Morse/Morse.cpp new file mode 100644 index 00000000..27cb5eac --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Morse/Morse.cpp @@ -0,0 +1,187 @@ +#include "Morse.h" + +#include + +#if !defined(RADIOLIB_EXCLUDE_MORSE) + +MorseClient::MorseClient(PhysicalLayer* phy) { + phyLayer = phy; + lineFeed = "^"; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + audioClient = nullptr; + #endif +} + +#if !defined(RADIOLIB_EXCLUDE_AFSK) +MorseClient::MorseClient(AFSKClient* audio) { + phyLayer = audio->phyLayer; + lineFeed = "^"; + audioClient = audio; +} +#endif + +int16_t MorseClient::begin(float base, uint8_t speed) { + // calculate 24-bit frequency + baseFreqHz = base; + baseFreq = (base * 1000000.0) / phyLayer->getFreqStep(); + + // calculate tone period for decoding + basePeriod = (1000000.0f/base)/2.0f; + + // calculate symbol lengths (assumes PARIS as typical word) + dotLength = 1200 / speed; + dashLength = 3*dotLength; + letterSpace = 3*dotLength; + wordSpace = 4*dotLength; + + // configure for direct mode + return(phyLayer->startDirect()); +} + +size_t MorseClient::startSignal() { + return(MorseClient::write('_')); +} + +char MorseClient::decode(uint8_t symbol, uint8_t len) { + // add the guard bit + symbol |= (RADIOLIB_MORSE_DASH << len); + + // iterate over the table + for(uint8_t i = 0; i < sizeof(MorseTable); i++) { + uint8_t code = RADIOLIB_NONVOLATILE_READ_BYTE(&MorseTable[i]); + if(code == symbol) { + // match, return the index + ASCII offset + return((char)(i + RADIOLIB_MORSE_ASCII_OFFSET)); + } + } + + // nothing found + return(RADIOLIB_MORSE_UNSUPPORTED); +} + +#if !defined(RADIOLIB_EXCLUDE_AFSK) +int MorseClient::read(uint8_t* symbol, uint8_t* len, float low, float high) { + Module* mod = phyLayer->getMod(); + + // measure pulse duration in us + uint32_t duration = mod->hal->pulseIn(audioClient->outPin, mod->hal->GpioLevelLow, 4*basePeriod); + + // decide if this is a signal, or pause + if((duration > low*basePeriod) && (duration < high*basePeriod)) { + // this is a signal + signalCounter++; + } else if(duration == 0) { + // this is a pause + pauseCounter++; + } + + // update everything + if((pauseCounter > 0) && (signalCounter == 1)) { + // start of dot or dash + pauseCounter = 0; + signalStart = mod->hal->millis(); + uint32_t pauseLen = mod->hal->millis() - pauseStart; + + if((pauseLen >= low*(float)letterSpace) && (pauseLen <= high*(float)letterSpace)) { + return(RADIOLIB_MORSE_CHAR_COMPLETE); + } else if(pauseLen > wordSpace) { + RADIOLIB_DEBUG_PRINTLN("\n"); + return(RADIOLIB_MORSE_WORD_COMPLETE); + } + + } else if((signalCounter > 0) && (pauseCounter == 1)) { + // end of dot or dash + signalCounter = 0; + pauseStart = mod->hal->millis(); + uint32_t signalLen = mod->hal->millis() - signalStart; + + if((signalLen >= low*(float)dotLength) && (signalLen <= high*(float)dotLength)) { + RADIOLIB_DEBUG_PRINT("."); + (*symbol) |= (RADIOLIB_MORSE_DOT << (*len)); + (*len)++; + } else if((signalLen >= low*(float)dashLength) && (signalLen <= high*(float)dashLength)) { + RADIOLIB_DEBUG_PRINT("-"); + (*symbol) |= (RADIOLIB_MORSE_DASH << (*len)); + (*len)++; + } else { + RADIOLIB_DEBUG_PRINTLN("", signalLen); + } + } + + return(RADIOLIB_MORSE_INTER_SYMBOL); +} +#endif + +size_t MorseClient::write(uint8_t b) { + Module* mod = phyLayer->getMod(); + + // check unprintable ASCII characters and boundaries + if((b < ' ') || (b == 0x60) || (b > 'z')) { + return(0); + } + + // inter-word pause (space) + if(b == ' ') { + RADIOLIB_DEBUG_PRINTLN("space"); + standby(); + mod->waitForMicroseconds(mod->hal->micros(), wordSpace*1000); + return(1); + } + + // get morse code from lookup table + uint8_t code = RADIOLIB_NONVOLATILE_READ_BYTE(&MorseTable[(uint8_t)(toupper(b) - RADIOLIB_MORSE_ASCII_OFFSET)]); + + // check unsupported characters + if(code == RADIOLIB_MORSE_UNSUPPORTED) { + return(0); + } + + // iterate through codeword until guard bit is reached + while(code > RADIOLIB_MORSE_GUARDBIT) { + + // send dot or dash + if (code & RADIOLIB_MORSE_DASH) { + RADIOLIB_DEBUG_PRINT("-"); + transmitDirect(baseFreq, baseFreqHz); + mod->waitForMicroseconds(mod->hal->micros(), dashLength*1000); + } else { + RADIOLIB_DEBUG_PRINT("."); + transmitDirect(baseFreq, baseFreqHz); + mod->waitForMicroseconds(mod->hal->micros(), dotLength*1000); + } + + // symbol space + standby(); + mod->waitForMicroseconds(mod->hal->micros(), dotLength*1000); + + // move onto the next bit + code >>= 1; + } + + // letter space + standby(); + mod->waitForMicroseconds(mod->hal->micros(), letterSpace*1000 - dotLength*1000); + RADIOLIB_DEBUG_PRINTLN(); + + return(1); +} + +int16_t MorseClient::transmitDirect(uint32_t freq, uint32_t freqHz) { + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + return(audioClient->tone(freqHz)); + } + #endif + return(phyLayer->transmitDirect(freq)); +} + +int16_t MorseClient::standby() { + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + return(audioClient->noTone(true)); + } + #endif + return(phyLayer->standby()); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Morse/Morse.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Morse/Morse.h new file mode 100644 index 00000000..df44bc1f --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Morse/Morse.h @@ -0,0 +1,181 @@ +#if !defined(_RADIOLIB_RADIOLIB_MORSE_H) && !defined(RADIOLIB_EXCLUDE_MORSE) +#define _RADIOLIB_RADIOLIB_MORSE_H + +#include "../../TypeDef.h" +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../AFSK/AFSK.h" +#include "../Print/Print.h" + +#define RADIOLIB_MORSE_DOT 0b0 +#define RADIOLIB_MORSE_DASH 0b1 +#define RADIOLIB_MORSE_GUARDBIT 0b1 +#define RADIOLIB_MORSE_UNSUPPORTED 0xFF +#define RADIOLIB_MORSE_ASCII_OFFSET 32 +#define RADIOLIB_MORSE_INTER_SYMBOL 0x00 +#define RADIOLIB_MORSE_CHAR_COMPLETE 0x01 +#define RADIOLIB_MORSE_WORD_COMPLETE 0x02 + +// Morse character table: - using codes defined in ITU-R M.1677-1 +// - Morse code representation is saved LSb first, using additional bit as guard +// - position in array corresponds ASCII code minus RADIOLIB_MORSE_ASCII_OFFSET +// - ASCII characters marked RADIOLIB_MORSE_UNSUPPORTED do not have ITU-R M.1677-1 equivalent +static const uint8_t MorseTable[] RADIOLIB_NONVOLATILE = { + 0b00, // space + 0b110101, // ! (unsupported) + 0b1010010, // " + RADIOLIB_MORSE_UNSUPPORTED, // # (unsupported) + RADIOLIB_MORSE_UNSUPPORTED, // $ (unsupported) + RADIOLIB_MORSE_UNSUPPORTED, // % (unsupported) + RADIOLIB_MORSE_UNSUPPORTED, // & (unsupported) + 0b1011110, // ' + 0b101101, // ( + 0b1101101, // ) + RADIOLIB_MORSE_UNSUPPORTED, // * (unsupported) + 0b101010, // + + 0b1110011, // , + 0b1100001, // - + 0b1101010, // . + 0b101001, // / + 0b111111, // 0 + 0b111110, // 1 + 0b111100, // 2 + 0b111000, // 3 + 0b110000, // 4 + 0b100000, // 5 + 0b100001, // 6 + 0b100011, // 7 + 0b100111, // 8 + 0b101111, // 9 + 0b1000111, // : + RADIOLIB_MORSE_UNSUPPORTED, // ; (unsupported) + RADIOLIB_MORSE_UNSUPPORTED, // < (unsupported) + 0b110001, // = + RADIOLIB_MORSE_UNSUPPORTED, // > (unsupported) + 0b1001100, // ? + 0b1010110, // @ + 0b110, // A + 0b10001, // B + 0b10101, // C + 0b1001, // D + 0b10, // E + 0b10100, // F + 0b1011, // G + 0b10000, // H + 0b100, // I + 0b11110, // J + 0b1101, // K + 0b10010, // L + 0b111, // M + 0b101, // N + 0b1111, // O + 0b10110, // P + 0b11011, // Q + 0b1010, // R + 0b1000, // S + 0b11, // T + 0b1100, // U + 0b11000, // V + 0b1110, // W + 0b11001, // X + 0b11101, // Y + 0b10011, // Z + RADIOLIB_MORSE_UNSUPPORTED, // [ (unsupported) + RADIOLIB_MORSE_UNSUPPORTED, // \ (unsupported) + RADIOLIB_MORSE_UNSUPPORTED, // ] (unsupported) + 0b1101000, // ^ (unsupported, used as alias for end of work) + 0b110101 // _ (unsupported, used as alias for starting signal) +}; + +/*! + \class MorseClient + \brief Client for Morse Code communication. The public interface is the same as Arduino Serial. +*/ +class MorseClient: public RadioLibPrint { + public: + /*! + \brief Constructor for 2-FSK mode. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + explicit MorseClient(PhysicalLayer* phy); + + #if !defined(RADIOLIB_EXCLUDE_AFSK) + /*! + \brief Constructor for AFSK mode. + \param audio Pointer to the AFSK instance providing audio. + */ + explicit MorseClient(AFSKClient* audio); + #endif + + // basic methods + + /*! + \brief Initialization method. + \param base Base RF frequency to be used in MHz (in 2-FSK mode), or the tone frequency in Hz (in AFSK mode) + \param speed Coding speed in words per minute. + \returns \ref status_codes + */ + int16_t begin(float base, uint8_t speed = 20); + + /*! + \brief Send start signal. + \returns Number of bytes sent (always 0). + */ + size_t startSignal(); + + /*! + \brief Decode Morse symbol to ASCII. + \param symbol Morse code symbol, represented as outlined in MorseTable. + \param len Symbol length (number of dots and dashes). + \returns ASCII character matching the symbol, or 0xFF if no match is found. + */ + static char decode(uint8_t symbol, uint8_t len); + + /*! + \brief Read Morse tone on input pin. + \param symbol Pointer to the symbol buffer. + \param len Pointer to the length counter. + \param low Low threshold for decision limit (dot length, pause length etc.), defaults to 0.75. + \param high High threshold for decision limit (dot length, pause length etc.), defaults to 1.25. + \returns 0 if not enough symbols were decoded, 1 if inter-character space was detected, + 2 if inter-word space was detected. + */ + #if !defined(RADIOLIB_EXCLUDE_AFSK) + int read(uint8_t* symbol, uint8_t* len, float low = 0.75f, float high = 1.25f); + #endif + + /*! + \brief Write one byte. Implementation of interface of the RadioLibPrint/Print class. + \param b Byte to write. + \returns 1 if the byte was written, 0 otherwise. + */ + size_t write(uint8_t b); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + PhysicalLayer* phyLayer; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + AFSKClient* audioClient; + #endif + + uint32_t baseFreq = 0, baseFreqHz = 0; + float basePeriod = 0.0f; + uint32_t dotLength = 0; + uint32_t dashLength = 0; + uint32_t letterSpace = 0; + uint16_t wordSpace = 0; + + // variables to keep decoding state + uint32_t signalCounter = 0; + uint32_t signalStart = 0; + uint32_t pauseCounter = 0; + uint32_t pauseStart = 0; + + size_t printNumber(unsigned long, uint8_t); + size_t printFloat(double, uint8_t); + + int16_t transmitDirect(uint32_t freq = 0, uint32_t freqHz = 0); + int16_t standby(); +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Pager/Pager.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Pager/Pager.cpp new file mode 100644 index 00000000..1416247a --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Pager/Pager.cpp @@ -0,0 +1,556 @@ +#include "Pager.h" +#include +#include +#if !defined(RADIOLIB_EXCLUDE_PAGER) + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +// this is a massive hack, but we need a global-scope ISR to manage the bit reading +// let's hope nobody ever tries running two POCSAG receivers at the same time +static PhysicalLayer* readBitInstance = NULL; +static uint32_t readBitPin = RADIOLIB_NC; + +#if defined(ESP8266) || defined(ESP32) + IRAM_ATTR +#endif +static void PagerClientReadBit(void) { + if(readBitInstance) { + readBitInstance->readBit(readBitPin); + } +} +#endif + +PagerClient::PagerClient(PhysicalLayer* phy) { + phyLayer = phy; + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + readBitInstance = phyLayer; + #endif +} + +int16_t PagerClient::begin(float base, uint16_t speed, bool invert, uint16_t shift) { + // calculate duration of 1 bit in us + dataRate = (float)speed/1000.0f; + bitDuration = (uint32_t)1000000/speed; + + // calculate 24-bit frequency + baseFreq = base; + baseFreqRaw = (baseFreq * 1000000.0) / phyLayer->getFreqStep(); + + // calculate module carrier frequency resolution + uint16_t step = round(phyLayer->getFreqStep()); + + // calculate raw frequency shift + shiftFreqHz = shift; + shiftFreq = shiftFreqHz/step; + inv = invert; + + // initialize BCH encoder + RadioLibBCHInstance.begin(RADIOLIB_PAGER_BCH_N, RADIOLIB_PAGER_BCH_K, RADIOLIB_PAGER_BCH_PRIMITIVE_POLY); + + // configure for direct mode + return(phyLayer->startDirect()); +} + +int16_t PagerClient::sendTone(uint32_t addr) { + return(PagerClient::transmit(NULL, 0, addr)); +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t PagerClient::transmit(String& str, uint32_t addr, uint8_t encoding, uint8_t function) { + return(PagerClient::transmit(str.c_str(), addr, encoding, function)); +} +#endif + +int16_t PagerClient::transmit(const char* str, uint32_t addr, uint8_t encoding, uint8_t function) { + return(PagerClient::transmit((uint8_t*)str, strlen(str), addr, encoding, function)); +} + +int16_t PagerClient::transmit(uint8_t* data, size_t len, uint32_t addr, uint8_t encoding, uint8_t function) { + if(addr > RADIOLIB_PAGER_ADDRESS_MAX) { + return(RADIOLIB_ERR_INVALID_ADDRESS_WIDTH); + } + + if(((data == NULL) && (len > 0)) || ((data != NULL) && (len == 0))) { + return(RADIOLIB_ERR_INVALID_PAYLOAD); + } + + // get symbol bit length based on encoding + uint8_t symbolLength = 0; + if(encoding == RADIOLIB_PAGER_BCD) { + symbolLength = 4; + + } else if(encoding == RADIOLIB_PAGER_ASCII) { + symbolLength = 7; + + } else { + return(RADIOLIB_ERR_INVALID_ENCODING); + + } + + // Automatically set function bits based on given encoding + if (function == RADIOLIB_PAGER_FUNC_AUTO) { + if(encoding == RADIOLIB_PAGER_BCD) { + function = RADIOLIB_PAGER_FUNC_BITS_NUMERIC; + + } else if(encoding == RADIOLIB_PAGER_ASCII) { + function = RADIOLIB_PAGER_FUNC_BITS_ALPHA; + + } else { + return(RADIOLIB_ERR_INVALID_ENCODING); + + } + if(len == 0) { + function = RADIOLIB_PAGER_FUNC_BITS_TONE; + } + } + if (function > RADIOLIB_PAGER_FUNC_BITS_ALPHA) { + return(RADIOLIB_ERR_INVALID_FUNCTION); + } + + // get target position in batch (3 LSB from address determine frame position in batch) + uint8_t framePos = 2*(addr & 0x07); + + // get address that will be written into address frame + uint32_t frameAddr = ((addr >> 3) << RADIOLIB_PAGER_ADDRESS_POS) | (function << RADIOLIB_PAGER_FUNC_BITS_POS); + + // calculate the number of 20-bit data blocks + size_t numDataBlocks = (len * symbolLength) / RADIOLIB_PAGER_MESSAGE_BITS_LENGTH; + if((len * symbolLength) % RADIOLIB_PAGER_MESSAGE_BITS_LENGTH > 0) { + numDataBlocks += 1; + } + + // calculate number of batches + size_t numBatches = (1 + framePos + numDataBlocks) / RADIOLIB_PAGER_BATCH_LEN + 1; + if((1 + numDataBlocks) % RADIOLIB_PAGER_BATCH_LEN == 0) { + numBatches -= 1; + } + + // calculate message length in 32-bit code words + size_t msgLen = RADIOLIB_PAGER_PREAMBLE_LENGTH + (1 + RADIOLIB_PAGER_BATCH_LEN) * numBatches; + + #if defined(RADIOLIB_STATIC_ONLY) + uint32_t msg[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + uint32_t* msg = new uint32_t[msgLen]; + #endif + + // build the message + memset(msg, 0x00, msgLen*sizeof(uint32_t)); + + // set preamble + for(size_t i = 0; i < RADIOLIB_PAGER_PREAMBLE_LENGTH; i++) { + msg[i] = RADIOLIB_PAGER_PREAMBLE_CODE_WORD; + } + + // start by setting everything after preamble to idle + for(size_t i = RADIOLIB_PAGER_PREAMBLE_LENGTH; i < msgLen; i++) { + msg[i] = RADIOLIB_PAGER_IDLE_CODE_WORD; + } + + // set frame synchronization code words + for(size_t i = 0; i < numBatches; i++) { + msg[RADIOLIB_PAGER_PREAMBLE_LENGTH + i*(1 + RADIOLIB_PAGER_BATCH_LEN)] = RADIOLIB_PAGER_FRAME_SYNC_CODE_WORD; + } + + // write address code word + msg[RADIOLIB_PAGER_PREAMBLE_LENGTH + 1 + framePos] = RadioLibBCHInstance.encode(frameAddr); + + // write the data as 20-bit code blocks + if(len > 0) { + int8_t remBits = 0; + uint8_t dataPos = 0; + for(size_t i = 0; i < numDataBlocks + numBatches - 1; i++) { + uint8_t blockPos = RADIOLIB_PAGER_PREAMBLE_LENGTH + 1 + framePos + 1 + i; + + // check if we need to skip a frame sync marker + if(((blockPos - (RADIOLIB_PAGER_PREAMBLE_LENGTH + 1)) % RADIOLIB_PAGER_BATCH_LEN) == 0) { + blockPos++; + i++; + } + + // mark this as a message code word + msg[blockPos] = RADIOLIB_PAGER_MESSAGE_CODE_WORD << (RADIOLIB_PAGER_CODE_WORD_LEN - 1); + + // first insert the remainder from previous code word (if any) + if(remBits > 0) { + // this doesn't apply to BCD messages, so no need to check that here + uint8_t prev = Module::reflect(data[dataPos - 1], 8); + prev >>= 1; + msg[blockPos] |= (uint32_t)prev << (RADIOLIB_PAGER_CODE_WORD_LEN - 1 - remBits); + } + + // set all message symbols until we overflow to the next code word or run out of message symbols + int8_t symbolPos = RADIOLIB_PAGER_CODE_WORD_LEN - 1 - symbolLength - remBits; + while(symbolPos > (RADIOLIB_PAGER_FUNC_BITS_POS - symbolLength)) { + + // for BCD, encode the symbol + uint8_t symbol = data[dataPos++]; + if(encoding == RADIOLIB_PAGER_BCD) { + symbol = encodeBCD(symbol); + } + symbol = Module::reflect(symbol, 8); + symbol >>= (8 - symbolLength); + + // insert the next message symbol + msg[blockPos] |= (uint32_t)symbol << symbolPos; + symbolPos -= symbolLength; + + // check if we ran out of message symbols + if(dataPos >= len) { + // in BCD mode, pad the rest of the code word with spaces (0xC) + if(encoding == RADIOLIB_PAGER_BCD) { + uint8_t numSteps = (symbolPos - RADIOLIB_PAGER_FUNC_BITS_POS + symbolLength)/symbolLength; + for(uint8_t i = 0; i < numSteps; i++) { + symbol = encodeBCD(' '); + symbol = Module::reflect(symbol, 8); + symbol >>= (8 - symbolLength); + msg[blockPos] |= (uint32_t)symbol << symbolPos; + symbolPos -= symbolLength; + } + } + break; + } + } + + // ensure the parity bits are not set due to overflow + msg[blockPos] &= ~(RADIOLIB_PAGER_BCH_BITS_MASK); + + // save the number of overflown bits + remBits = RADIOLIB_PAGER_FUNC_BITS_POS - symbolPos - symbolLength; + + // do the FEC + msg[blockPos] = RadioLibBCHInstance.encode(msg[blockPos]); + } + } + + // transmit the message + PagerClient::write(msg, msgLen); + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] msg; + #endif + + // turn transmitter off + phyLayer->standby(); + + return(RADIOLIB_ERR_NONE); +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +int16_t PagerClient::startReceive(uint32_t pin, uint32_t addr, uint32_t mask) { + // save the variables + readBitPin = pin; + filterAddr = addr; + filterMask = mask; + + // set the carrier frequency + int16_t state = phyLayer->setFrequency(baseFreq); + RADIOLIB_ASSERT(state); + + // set bitrate + state = phyLayer->setBitRate(dataRate); + RADIOLIB_ASSERT(state); + + // set frequency deviation to 4.5 khz + state = phyLayer->setFrequencyDeviation((float)shiftFreqHz / 1000.0f); + RADIOLIB_ASSERT(state); + + // now set up the direct mode reception + Module* mod = phyLayer->getMod(); + mod->hal->pinMode(pin, mod->hal->GpioModeInput); + + // set direct sync word to the frame sync word + // the logic here is inverted, because modules like SX1278 + // assume high frequency to be logic 1, which is opposite to POCSAG + if(!inv) { + phyLayer->setDirectSyncWord(~RADIOLIB_PAGER_FRAME_SYNC_CODE_WORD, 32); + } else { + phyLayer->setDirectSyncWord(RADIOLIB_PAGER_FRAME_SYNC_CODE_WORD, 32); + } + + phyLayer->setDirectAction(PagerClientReadBit); + phyLayer->receiveDirect(); + + return(state); +} + +size_t PagerClient::available() { + return(phyLayer->available() + sizeof(uint32_t))/(sizeof(uint32_t) * (RADIOLIB_PAGER_BATCH_LEN + 1)); +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t PagerClient::readData(String& str, size_t len, uint32_t* addr) { + int16_t state = RADIOLIB_ERR_NONE; + + // determine the message length, based on user input or the amount of received data + size_t length = len; + if(length == 0) { + // one batch can contain at most 80 message symbols + length = available()*80; + } + + // build a temporary buffer + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t data[RADIOLIB_STATIC_ARRAY_SIZE + 1]; + #else + uint8_t* data = new uint8_t[length + 1]; + if(!data) { + return(RADIOLIB_ERR_MEMORY_ALLOCATION_FAILED); + } + #endif + + // read the received data + state = readData(data, &length, addr); + + if(state == RADIOLIB_ERR_NONE) { + // check tone-only tramsissions + if(length == 0) { + length = 6; + strncpy((char*)data, "", length + 1); + } + + // add null terminator + data[length] = 0; + + // initialize Arduino String class + str = String((char*)data); + } + + // deallocate temporary buffer + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] data; + #endif + + return(state); +} +#endif + +int16_t PagerClient::readData(uint8_t* data, size_t* len, uint32_t* addr) { + // find the correct address + bool match = false; + uint8_t framePos = 0; + uint8_t symbolLength = 0; + while(!match && phyLayer->available()) { + uint32_t cw = read(); + framePos++; + + // check if it's the idle code word + if(cw == RADIOLIB_PAGER_IDLE_CODE_WORD) { + continue; + } + + // check if it's the sync word + if(cw == RADIOLIB_PAGER_FRAME_SYNC_CODE_WORD) { + framePos = 0; + continue; + } + + // not an idle code word, check if it's an address word + if(cw & (RADIOLIB_PAGER_MESSAGE_CODE_WORD << (RADIOLIB_PAGER_CODE_WORD_LEN - 1))) { + // this is pretty weird, it seems to be a message code word without address + continue; + } + + // should be an address code word, extract the address + uint32_t addr_found = ((cw & RADIOLIB_PAGER_ADDRESS_BITS_MASK) >> (RADIOLIB_PAGER_ADDRESS_POS - 3)) | (framePos/2); + if((addr_found & filterMask) == (filterAddr & filterMask)) { + // we have a match! + match = true; + if(addr) { + *addr = addr_found; + } + + // determine the encoding from the function bits + if((cw & RADIOLIB_PAGER_FUNCTION_BITS_MASK) >> RADIOLIB_PAGER_FUNC_BITS_POS == RADIOLIB_PAGER_FUNC_BITS_NUMERIC) { + symbolLength = 4; + } else { + symbolLength = 7; + } + } + } + + if(!match) { + // address not found + return(RADIOLIB_ERR_ADDRESS_NOT_FOUND); + } + + // we have the address, start pulling out the message + bool complete = false; + size_t decodedBytes = 0; + uint32_t prevCw = 0; + bool overflow = false; + int8_t ovfBits = 0; + while(!complete && phyLayer->available()) { + uint32_t cw = read(); + + // check if it's the idle code word + if(cw == RADIOLIB_PAGER_IDLE_CODE_WORD) { + complete = true; + break; + } + + // skip the sync words + if(cw == RADIOLIB_PAGER_FRAME_SYNC_CODE_WORD) { + continue; + } + + // check overflow from previous code word + uint8_t bitPos = RADIOLIB_PAGER_CODE_WORD_LEN - 1 - symbolLength; + if(overflow) { + overflow = false; + + // this is a bit convoluted - first, build masks for both previous and current code word + uint8_t currPos = RADIOLIB_PAGER_CODE_WORD_LEN - 1 - symbolLength + ovfBits; + uint8_t prevPos = RADIOLIB_PAGER_MESSAGE_END_POS; + uint32_t prevMask = (0x7FUL << prevPos) & ~((uint32_t)0x7FUL << (RADIOLIB_PAGER_MESSAGE_END_POS + ovfBits)); + uint32_t currMask = (0x7FUL << currPos) & ~((uint32_t)1 << (RADIOLIB_PAGER_CODE_WORD_LEN - 1)); + + // next, get the two parts of the message symbol and stick them together + uint8_t prevSymbol = (prevCw & prevMask) >> prevPos; + uint8_t currSymbol = (cw & currMask) >> currPos; + uint32_t symbol = prevSymbol << (symbolLength - ovfBits) | currSymbol; + + // finally, we can flip the bits + symbol = Module::reflect((uint8_t)symbol, 8); + symbol >>= (8 - symbolLength); + + // decode BCD and we're done + if(symbolLength == 4) { + symbol = decodeBCD(symbol); + } + data[decodedBytes++] = symbol; + + // adjust the bit position of the next message symbol + bitPos += ovfBits; + bitPos -= symbolLength; + } + + // get the message symbols based on the encoding type + while(bitPos >= RADIOLIB_PAGER_MESSAGE_END_POS) { + // get the message symbol from the code word and reverse bits + uint32_t symbol = (cw & (0x7FUL << bitPos)) >> bitPos; + symbol = Module::reflect((uint8_t)symbol, 8); + symbol >>= (8 - symbolLength); + + // decode BCD if needed + if(symbolLength == 4) { + symbol = decodeBCD(symbol); + } + data[decodedBytes++] = symbol; + + // now calculate if the next symbol is overflowing to the following code word + int8_t remBits = bitPos - RADIOLIB_PAGER_MESSAGE_END_POS; + if(remBits < symbolLength) { + // overflow! + prevCw = cw; + overflow = true; + ovfBits = remBits; + } + bitPos -= symbolLength; + } + + } + + // save the number of decoded bytes + *len = decodedBytes; + return(RADIOLIB_ERR_NONE); +} +#endif + +void PagerClient::write(uint32_t* data, size_t len) { + // write code words from buffer + for(size_t i = 0; i < len; i++) { + PagerClient::write(data[i]); + } +} + +void PagerClient::write(uint32_t codeWord) { + // write single code word + Module* mod = phyLayer->getMod(); + for(int8_t i = 31; i >= 0; i--) { + uint32_t mask = (uint32_t)0x01 << i; + uint32_t start = mod->hal->micros(); + + // figure out the shift direction - start by assuming the bit is 0 + int16_t change = shiftFreq; + + // now check if it's actually 1 + if(codeWord & mask) { + change = -shiftFreq; + } + + // finally, check if inversion is enabled + if(inv) { + change = -change; + } + + // now transmit the shifted frequency + phyLayer->transmitDirect(baseFreqRaw + change); + + // this is pretty silly, while(mod->hal->micros() ... ) would be enough + // but for some reason, MegaCore throws a linker error on it + // "relocation truncated to fit: R_AVR_7_PCREL against `no symbol'" + uint32_t now = mod->hal->micros(); + while(now - start < bitDuration) { + now = mod->hal->micros(); + } + } +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +uint32_t PagerClient::read() { + uint32_t codeWord = 0; + codeWord |= (uint32_t)phyLayer->read() << 24; + codeWord |= (uint32_t)phyLayer->read() << 16; + codeWord |= (uint32_t)phyLayer->read() << 8; + codeWord |= (uint32_t)phyLayer->read(); + + // check if we need to invert bits + // the logic here is inverted, because modules like SX1278 + // assume high frequency to be logic 1, which is opposite to POCSAG + if(!inv) { + codeWord = ~codeWord; + } + + RADIOLIB_VERBOSE_PRINTLN("R\t%lX", codeWord); + // TODO BCH error correction here + return(codeWord); +} +#endif + +uint8_t PagerClient::encodeBCD(char c) { + switch(c) { + case '*': + return(0x0A); + case 'U': + return(0x0B); + case ' ': + return(0x0C); + case '-': + return(0x0D); + case ')': + return(0x0E); + case '(': + return(0x0F); + } + return(c - '0'); +} + +char PagerClient::decodeBCD(uint8_t b) { + switch(b) { + case 0x0A: + return('*'); + case 0x0B: + return('U'); + case 0x0C: + return(' '); + case 0x0D: + return('-'); + case 0x0E: + return(')'); + case 0x0F: + return('('); + } + return(b + '0'); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Pager/Pager.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Pager/Pager.h new file mode 100644 index 00000000..a7ecef46 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Pager/Pager.h @@ -0,0 +1,191 @@ +#if !defined(_RADIOLIB_PAGER_H) && !defined(RADIOLIB_EXCLUDE_PAGER) +#define _RADIOLIB_PAGER_H + +#include "../../TypeDef.h" +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../../utils/FEC.h" + +// frequency shift in Hz +#define RADIOLIB_PAGER_FREQ_SHIFT_HZ (4500) + +// supported encoding schemes +#define RADIOLIB_PAGER_ASCII (0) +#define RADIOLIB_PAGER_BCD (1) + +// preamble length in 32-bit code words +#define RADIOLIB_PAGER_PREAMBLE_LENGTH (18) + +// protocol-specified code words +#define RADIOLIB_PAGER_PREAMBLE_CODE_WORD (0xAAAAAAAA) +#define RADIOLIB_PAGER_FRAME_SYNC_CODE_WORD (0x7CD215D8) +#define RADIOLIB_PAGER_IDLE_CODE_WORD (0x7A89C197) + +// code word type identification flags +#define RADIOLIB_PAGER_ADDRESS_CODE_WORD (0UL) +#define RADIOLIB_PAGER_MESSAGE_CODE_WORD (1UL) + +// length of code word in bits +#define RADIOLIB_PAGER_CODE_WORD_LEN (32) + +// number of message bits in a single code block +#define RADIOLIB_PAGER_ADDRESS_POS (13) +#define RADIOLIB_PAGER_FUNC_BITS_POS (11) +#define RADIOLIB_PAGER_MESSAGE_BITS_LENGTH (20) +#define RADIOLIB_PAGER_MESSAGE_END_POS (11) + +// number of code words in a batch +#define RADIOLIB_PAGER_BATCH_LEN (16) + +// mask for address bits in a single code word +#define RADIOLIB_PAGER_ADDRESS_BITS_MASK (0x7FFFE000UL) + +// mask for function bits in a single code word +#define RADIOLIB_PAGER_FUNCTION_BITS_MASK (0x00001800UL) + +// mask for BCH bits in a single code word +#define RADIOLIB_PAGER_BCH_BITS_MASK (0x000007FFUL) + +// message type functional bits +#define RADIOLIB_PAGER_FUNC_BITS_NUMERIC (0b00) +#define RADIOLIB_PAGER_FUNC_BITS_TONE (0b01) +#define RADIOLIB_PAGER_FUNC_BITS_ACTIVATION (0b10) +#define RADIOLIB_PAGER_FUNC_BITS_ALPHA (0b11) +#define RADIOLIB_PAGER_FUNC_AUTO 0xFF + +// the maximum allowed address (2^22 - 1) +#define RADIOLIB_PAGER_ADDRESS_MAX (2097151) + +/*! + \class PagerClient + \brief Client for Pager communication. +*/ +class PagerClient { + public: + /*! + \brief Default constructor. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + explicit PagerClient(PhysicalLayer* phy); + + // basic methods + + /*! + \brief Initialization method. + \param base Base (center) frequency to be used in MHz. + \param speed Bit rate to use in bps. Common POCSAG decoders can receive 512, 1200 and 2400 bps. + \param invert Enable frequency inversion. Disabled by default (high frequency is digital 0). + \param shift Set custom frequency shift, defaults to 4500 Hz. + \returns \ref status_codes + */ + int16_t begin(float base, uint16_t speed, bool invert = false, uint16_t shift = RADIOLIB_PAGER_FREQ_SHIFT_HZ); + + /*! + \brief Method to send a tone-only alert to a destination pager. + \param addr Address of the destination pager. Allowed values are 0 to 2097151 - values above 2000000 are reserved. + \returns \ref status_codes + */ + int16_t sendTone(uint32_t addr); + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Arduino String transmit method. + \param str Address of Arduino string that will be transmitted. + \param addr Address of the destination pager. Allowed values are 0 to 2097151 - values above 2000000 are reserved. + \param encoding Encoding to be used (BCD or ASCII). Defaults to RADIOLIB_PAGER_BCD. + \param function bits (NUMERIC, TONE, ACTIVATION, ALPHANUMERIC). Allowed values 0 to 3. Defaults to auto select by specified encoding + \returns \ref status_codes + */ + int16_t transmit(String& str, uint32_t addr, uint8_t encoding = RADIOLIB_PAGER_BCD, uint8_t function = RADIOLIB_PAGER_FUNC_AUTO); + #endif + + /*! + \brief C-string transmit method. + \param str C-string that will be transmitted. + \param addr Address of the destination pager. Allowed values are 0 to 2097151 - values above 2000000 are reserved. + \param encoding Encoding to be used (BCD or ASCII). Defaults to RADIOLIB_PAGER_BCD. + \param function bits (NUMERIC, TONE, ACTIVATION, ALPHANUMERIC). Allowed values 0 to 3. Defaults to auto select by specified encoding + \returns \ref status_codes + */ + int16_t transmit(const char* str, uint32_t addr, uint8_t encoding = RADIOLIB_PAGER_BCD, uint8_t function = RADIOLIB_PAGER_FUNC_AUTO); + + /*! + \brief Binary transmit method. Will transmit arbitrary binary data. + \param data Binary data that will be transmitted. + \param len Length of binary data to transmit (in bytes). + \param addr Address of the destination pager. Allowed values are 0 to 2097151 - values above 2000000 are reserved. + \param encoding Encoding to be used (BCD or ASCII). Defaults to RADIOLIB_PAGER_BCD. + \param function bits (NUMERIC, TONE, ACTIVATION, ALPHANUMERIC). Allowed values 0 to 3. Defaults to auto select by specified encoding + \returns \ref status_codes + */ + int16_t transmit(uint8_t* data, size_t len, uint32_t addr, uint8_t encoding = RADIOLIB_PAGER_BCD, uint8_t function = RADIOLIB_PAGER_FUNC_AUTO); + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + /*! + \brief Start reception of POCSAG packets. + \param pin Pin to receive digital data on (e.g., DIO2 for SX127x). + \param addr Address of this "pager". Allowed values are 0 to 2097151 - values above 2000000 are reserved. + \param mask Address filter mask - set individual bits to enable or disable match on that bit of the address. + Set to 0xFFFFF (all bits checked) by default. + \returns \ref status_codes + */ + int16_t startReceive(uint32_t pin, uint32_t addr, uint32_t mask = 0xFFFFF); + + /*! + \brief Get the number of POCSAG batches available in buffer. Limited by the size of direct mode buffer! + \returns Number of available batches. + */ + size_t available(); + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Reads data that was received after calling startReceive method. + \param str Address of Arduino String to save the received data. + \param len Expected number of characters in the message. When set to 0, the message length will be retrieved + automatically. When more bytes than received are requested, only the number of bytes requested will be returned. + \param addr Pointer to variable holding the address of the received pager message. + Set to NULL to not retrieve address. + \returns \ref status_codes + */ + int16_t readData(String& str, size_t len = 0, uint32_t* addr = NULL); + #endif + + /*! + \brief Reads data that was received after calling startReceive method. + \param data Pointer to array to save the received message. + \param len Pointer to variable holding the number of bytes that will be read. When set to 0, the packet length + will be retrieved automatically. When more bytes than received are requested, only the number of bytes + requested will be returned. Upon completion, the number of bytes received will be written to this variable. + \param addr Pointer to variable holding the address of the received pager message. + Set to NULL to not retrieve address. + \returns \ref status_codes + */ + int16_t readData(uint8_t* data, size_t* len, uint32_t* addr = NULL); +#endif + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + PhysicalLayer* phyLayer; + + float baseFreq; + float dataRate; + uint32_t baseFreqRaw; + uint16_t shiftFreq; + uint16_t shiftFreqHz; + uint16_t bitDuration; + uint32_t filterAddr; + uint32_t filterMask; + bool inv = false; + + void write(uint32_t* data, size_t len); + void write(uint32_t codeWord); + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + uint32_t read(); +#endif + + uint8_t encodeBCD(char c); + char decodeBCD(uint8_t b); +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/PhysicalLayer/PhysicalLayer.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/PhysicalLayer/PhysicalLayer.cpp new file mode 100644 index 00000000..b244b856 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/PhysicalLayer/PhysicalLayer.cpp @@ -0,0 +1,475 @@ +#include "PhysicalLayer.h" +#include + +PhysicalLayer::PhysicalLayer(float step, size_t maxLen) { + this->freqStep = step; + this->maxPacketLength = maxLen; + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + this->bufferBitPos = 0; + this->bufferWritePos = 0; + #endif +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t PhysicalLayer::transmit(__FlashStringHelper* fstr, uint8_t addr) { + // read flash string length + size_t len = 0; + PGM_P p = reinterpret_cast(fstr); + while(true) { + char c = RADIOLIB_NONVOLATILE_READ_BYTE(p++); + len++; + if(c == '\0') { + break; + } + } + + // dynamically allocate memory + #if defined(RADIOLIB_STATIC_ONLY) + char str[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + char* str = new char[len]; + #endif + + // copy string from flash + p = reinterpret_cast(fstr); + for(size_t i = 0; i < len; i++) { + str[i] = RADIOLIB_NONVOLATILE_READ_BYTE(p + i); + } + + // transmit string + int16_t state = transmit(str, addr); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] str; + #endif + return(state); +} + +int16_t PhysicalLayer::transmit(String& str, uint8_t addr) { + return(transmit(str.c_str(), addr)); +} +#endif + +int16_t PhysicalLayer::transmit(const char* str, uint8_t addr) { + return(transmit((uint8_t*)str, strlen(str), addr)); +} + +int16_t PhysicalLayer::transmit(uint8_t* data, size_t len, uint8_t addr) { + (void)data; + (void)len; + (void)addr; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t PhysicalLayer::receive(String& str, size_t len) { + int16_t state = RADIOLIB_ERR_NONE; + + // user can override the length of data to read + size_t length = len; + + // build a temporary buffer + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t data[RADIOLIB_STATIC_ARRAY_SIZE + 1]; + #else + uint8_t* data = NULL; + if(length == 0) { + data = new uint8_t[this->maxPacketLength + 1]; + } else { + data = new uint8_t[length + 1]; + } + if(!data) { + return(RADIOLIB_ERR_MEMORY_ALLOCATION_FAILED); + } + #endif + + // attempt packet reception + state = receive(data, length); + + // any of the following leads to at least some data being available + // let's leave the decision of whether to keep it or not up to the user + if((state == RADIOLIB_ERR_NONE) || (state == RADIOLIB_ERR_CRC_MISMATCH) || (state == RADIOLIB_ERR_LORA_HEADER_DAMAGED)) { + // read the number of actually received bytes (for unknown packets) + if(len == 0) { + length = getPacketLength(false); + } + + // add null terminator + data[length] = 0; + + // initialize Arduino String class + str = String((char*)data); + } + + // deallocate temporary buffer + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] data; + #endif + + return(state); +} +#endif + +int16_t PhysicalLayer::receive(uint8_t* data, size_t len) { + (void)data; + (void)len; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::sleep() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::standby() { + return(standby(RADIOLIB_STANDBY_DEFAULT)); +} + +int16_t PhysicalLayer::standby(uint8_t mode) { + (void)mode; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::startReceive() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len) { + (void)timeout; + (void)irqFlags; + (void)irqMask; + (void)len; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t PhysicalLayer::startTransmit(String& str, uint8_t addr) { + return(startTransmit(str.c_str(), addr)); +} +#endif + +int16_t PhysicalLayer::startTransmit(const char* str, uint8_t addr) { + return(startTransmit((uint8_t*)str, strlen(str), addr)); +} + +int16_t PhysicalLayer::startTransmit(uint8_t* data, size_t len, uint8_t addr) { + (void)data; + (void)len; + (void)addr; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::finishTransmit() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +int16_t PhysicalLayer::readData(String& str, size_t len) { + int16_t state = RADIOLIB_ERR_NONE; + + // read the number of actually received bytes + size_t length = getPacketLength(); + + if((len < length) && (len != 0)) { + // user requested less bytes than were received, this is allowed (but frowned upon) + // requests for more data than were received will only return the number of actually received bytes (unlike PhysicalLayer::receive()) + length = len; + } + + // build a temporary buffer + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t data[RADIOLIB_STATIC_ARRAY_SIZE + 1]; + #else + uint8_t* data = new uint8_t[length + 1]; + if(!data) { + return(RADIOLIB_ERR_MEMORY_ALLOCATION_FAILED); + } + #endif + + // read the received data + state = readData(data, length); + + // any of the following leads to at least some data being available + // let's leave the decision of whether to keep it or not up to the user + if((state == RADIOLIB_ERR_NONE) || (state == RADIOLIB_ERR_CRC_MISMATCH) || (state == RADIOLIB_ERR_LORA_HEADER_DAMAGED)) { + // add null terminator + data[length] = 0; + + // initialize Arduino String class + str = String((char*)data); + } + + // deallocate temporary buffer + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] data; + #endif + + return(state); +} +#endif + +int16_t PhysicalLayer::readData(uint8_t* data, size_t len) { + (void)data; + (void)len; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::transmitDirect(uint32_t frf) { + (void)frf; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::receiveDirect() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setFrequency(float freq) { + (void)freq; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setBitRate(float br) { + (void)br; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setFrequencyDeviation(float freqDev) { + (void)freqDev; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setDataShaping(uint8_t sh) { + (void)sh; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setEncoding(uint8_t encoding) { + (void)encoding; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::invertIQ(bool enable) { + (void)enable; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setOutputPower(int8_t power) { + (void)power; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setSyncWord(uint8_t* sync, size_t len) { + (void)sync; + (void)len; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setPreambleLength(size_t len) { + (void)len; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::setDataRate(DataRate_t dr) { + (void)dr; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +float PhysicalLayer::getFreqStep() const { + return(this->freqStep); +} + +size_t PhysicalLayer::getPacketLength(bool update) { + (void)update; + return(0); +} + +float PhysicalLayer::getRSSI() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +float PhysicalLayer::getSNR() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +uint32_t PhysicalLayer::getTimeOnAir(size_t len) { + (void)len; + return(0); +} + +int16_t PhysicalLayer::startChannelScan() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::getChannelScanResult() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int16_t PhysicalLayer::scanChannel() { + return(RADIOLIB_ERR_UNSUPPORTED); +} + +int32_t PhysicalLayer::random(int32_t max) { + if(max == 0) { + return(0); + } + + // get random bytes from the radio + uint8_t randBuff[4]; + for(uint8_t i = 0; i < 4; i++) { + randBuff[i] = randomByte(); + } + + // create 32-bit TRNG number + int32_t randNum = ((int32_t)randBuff[0] << 24) | ((int32_t)randBuff[1] << 16) | ((int32_t)randBuff[2] << 8) | ((int32_t)randBuff[3]); + if(randNum < 0) { + randNum *= -1; + } + return(randNum % max); +} + +int32_t PhysicalLayer::random(int32_t min, int32_t max) { + if(min >= max) { + return(min); + } + + return(PhysicalLayer::random(max - min) + min); +} + +uint8_t PhysicalLayer::randomByte() { + return(0); +} + +int16_t PhysicalLayer::startDirect() { + // disable encodings + int16_t state = setEncoding(RADIOLIB_ENCODING_NRZ); + RADIOLIB_ASSERT(state); + + // disable shaping + state = setDataShaping(RADIOLIB_SHAPING_NONE); + RADIOLIB_ASSERT(state); + + // set frequency deviation to the lowest possible value + state = setFrequencyDeviation(-1); + return(state); +} + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) +int16_t PhysicalLayer::available() { + return(this->bufferWritePos); +} + +void PhysicalLayer::dropSync() { + if(this->directSyncWordLen > 0) { + this->gotSync = false; + this->syncBuffer = 0; + } +} + +uint8_t PhysicalLayer::read(bool drop) { + if(drop) { + dropSync(); + } + this->bufferWritePos--; + return(this->buffer[this->bufferReadPos++]); +} + +int16_t PhysicalLayer::setDirectSyncWord(uint32_t syncWord, uint8_t len) { + if(len > 32) { + return(RADIOLIB_ERR_INVALID_SYNC_WORD); + } + this->directSyncWordMask = 0xFFFFFFFF >> (32 - len); + this->directSyncWordLen = len; + this->directSyncWord = syncWord; + + // override sync word matching when length is set to 0 + if(this->directSyncWordLen == 0) { + this->gotSync = true; + } + + return(RADIOLIB_ERR_NONE); +} + +void PhysicalLayer::updateDirectBuffer(uint8_t bit) { + // check sync word + if(!this->gotSync) { + this->syncBuffer <<= 1; + this->syncBuffer |= bit; + + RADIOLIB_VERBOSE_PRINTLN("S\t%lu", this->syncBuffer); + + if((this->syncBuffer & this->directSyncWordMask) == this->directSyncWord) { + this->gotSync = true; + this->bufferWritePos = 0; + this->bufferReadPos = 0; + this->bufferBitPos = 0; + } + + } else { + // save the bit + if(bit) { + this->buffer[this->bufferWritePos] |= 0x01 << this->bufferBitPos; + } else { + this->buffer[this->bufferWritePos] &= ~(0x01 << this->bufferBitPos); + } + this->bufferBitPos++; + + // check complete byte + if(this->bufferBitPos == 8) { + this->buffer[this->bufferWritePos] = Module::reflect(this->buffer[this->bufferWritePos], 8); + RADIOLIB_VERBOSE_PRINTLN("R\t%X", this->buffer[this->bufferWritePos]); + + this->bufferWritePos++; + this->bufferBitPos = 0; + } + } +} + +void PhysicalLayer::setDirectAction(void (*func)(void)) { + (void)func; +} + +void PhysicalLayer::readBit(uint32_t pin) { + (void)pin; +} + +#endif + +int16_t PhysicalLayer::setDIOMapping(uint32_t pin, uint32_t value) { + (void)pin; + (void)value; + return(RADIOLIB_ERR_UNSUPPORTED); +} + +void PhysicalLayer::setPacketReceivedAction(void (*func)(void)) { + (void)func; +} + +void PhysicalLayer::clearPacketReceivedAction() { + +} + +void PhysicalLayer::setPacketSentAction(void (*func)(void)) { + (void)func; +} + +void PhysicalLayer::clearPacketSentAction() { + +} + +void PhysicalLayer::setChannelScanAction(void (*func)(void)) { + (void)func; +} + +void PhysicalLayer::clearChannelScanAction() { + +} + +#if defined(RADIOLIB_INTERRUPT_TIMING) +void PhysicalLayer::setInterruptSetup(void (*func)(uint32_t)) { + Module* mod = getMod(); + mod->TimerSetupCb = func; +} + +void PhysicalLayer::setTimerFlag() { + Module* mod = getMod(); + mod->TimerFlag = true; +} +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/PhysicalLayer/PhysicalLayer.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/PhysicalLayer/PhysicalLayer.h new file mode 100644 index 00000000..c083e476 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/PhysicalLayer/PhysicalLayer.h @@ -0,0 +1,501 @@ +#if !defined(_RADIOLIB_PHYSICAL_LAYER_H) +#define _RADIOLIB_PHYSICAL_LAYER_H + +#include "../../TypeDef.h" +#include "../../Module.h" + +// data rate structure interpretation in case LoRa is used +struct LoRaRate_t { + uint8_t spreadingFactor; + float bandwidth; + uint8_t codingRate; +}; + +// data rate structure interpretation in case FSK is used +struct FSKRate_t { + float bitRate; + float freqDev; +}; + +// common data rate +union DataRate_t { + LoRaRate_t lora; + FSKRate_t fsk; +}; + +/*! + \class PhysicalLayer + + \brief Provides common interface for protocols that run on %LoRa/FSK modules, such as RTTY or LoRaWAN. + Also extracts some common module-independent methods. Using this interface class allows to use the protocols + on various modules without much code duplicity. Because this class is used mainly as interface, + all of its virtual members must be implemented in the module class. +*/ +class PhysicalLayer { + public: + + // constructor + + /*! + \brief Default constructor. + \param step Frequency step of the synthesizer in Hz. + \param maxLen Maximum length of packet that can be received by the module. + */ + PhysicalLayer(float step, size_t maxLen); + + // basic methods + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Arduino Flash String transmit method. + \param str Pointer to Arduino Flash String that will be transmitted. + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + int16_t transmit(__FlashStringHelper* fstr, uint8_t addr = 0); + + /*! + \brief Arduino String transmit method. + \param str Address of Arduino string that will be transmitted. + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + int16_t transmit(String& str, uint8_t addr = 0); + #endif + + /*! + \brief C-string transmit method. + \param str C-string that will be transmitted. + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + int16_t transmit(const char* str, uint8_t addr = 0); + + /*! + \brief Binary transmit method. Must be implemented in module class. + \param data Binary data that will be transmitted. + \param len Length of binary data to transmit (in bytes). + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + virtual int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0); + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Arduino String receive method. + \param str Address of Arduino String to save the received data. + \param len Expected number of characters in the message. Leave as 0 if expecting a unknown size packet + \returns \ref status_codes + */ + int16_t receive(String& str, size_t len = 0); + #endif + + /*! + \brief Sets module to sleep. + \returns \ref status_codes + */ + virtual int16_t sleep(); + + /*! + \brief Sets module to standby. + \returns \ref status_codes + */ + virtual int16_t standby(); + + /*! + \brief Sets module to a specific standby mode. + \returns \ref status_codes + */ + virtual int16_t standby(uint8_t mode); + + /*! + \brief Sets module to received mode using its default configuration. + \returns \ref status_codes + */ + virtual int16_t startReceive(); + + /*! + \brief Interrupt-driven receive method. A DIO pin will be activated when full packet is received. + Must be implemented in module class. + \param timeout Raw timeout value. Some modules use this argument to specify operation mode + (single vs. continuous receive). + \param irqFlags Sets the IRQ flags. + \param irqMask Sets the mask of IRQ flags that will trigger the DIO pin. + \param len Packet length, needed for some modules under special circumstances (e.g. LoRa implicit header mode). + \returns \ref status_codes + */ + virtual int16_t startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len); + + /*! + \brief Binary receive method. Must be implemented in module class. + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be received. Must be known in advance for binary transmissions. + \returns \ref status_codes + */ + virtual int16_t receive(uint8_t* data, size_t len); + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Interrupt-driven Arduino String transmit method. Unlike the standard transmit method, this one is non-blocking. + Interrupt pin will be activated when transmission finishes. + \param str Address of Arduino String that will be transmitted. + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + int16_t startTransmit(String& str, uint8_t addr = 0); + #endif + + /*! + \brief Interrupt-driven Arduino String transmit method. Unlike the standard transmit method, this one is non-blocking. + Interrupt pin will be activated when transmission finishes. + \param str C-string that will be transmitted. + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + int16_t startTransmit(const char* str, uint8_t addr = 0); + + /*! + \brief Interrupt-driven binary transmit method. + \param data Binary data that will be transmitted. + \param len Length of binary data to transmit (in bytes). + \param addr Node address to transmit the packet to. Only used in FSK mode. + \returns \ref status_codes + */ + virtual int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0); + + /*! + \brief Clean up after transmission is done. + \returns \ref status_codes + */ + virtual int16_t finishTransmit(); + + #if defined(RADIOLIB_BUILD_ARDUINO) + /*! + \brief Reads data that was received after calling startReceive method. + \param str Address of Arduino String to save the received data. + \param len Expected number of characters in the message. When set to 0, the packet length will be retrieved + automatically. When more bytes than received are requested, only the number of bytes requested will be returned. + \returns \ref status_codes + */ + int16_t readData(String& str, size_t len = 0); + #endif + + /*! + \brief Reads data that was received after calling startReceive method. + \param data Pointer to array to save the received binary data. + \param len Number of bytes that will be read. When set to 0, the packet length will be retrieved automatically. + When more bytes than received are requested, only the number of bytes requested will be returned. + \returns \ref status_codes + */ + virtual int16_t readData(uint8_t* data, size_t len); + + /*! + \brief Enables direct transmission mode on pins DIO1 (clock) and DIO2 (data). Must be implemented in module class. + While in direct mode, the module will not be able to transmit or receive packets. Can only be activated in FSK mode. + \param frf 24-bit raw frequency value to start transmitting at. Required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + virtual int16_t transmitDirect(uint32_t frf = 0); + + /*! + \brief Enables direct reception mode on pins DIO1 (clock) and DIO2 (data). Must be implemented in module class. + While in direct mode, the module will not be able to transmit or receive packets. Can only be activated in FSK mode. + \returns \ref status_codes + */ + virtual int16_t receiveDirect(); + + // configuration methods + + /*! + \brief Sets carrier frequency. Must be implemented in module class. + \param freq Carrier frequency to be set in MHz. + \returns \ref status_codes + */ + virtual int16_t setFrequency(float freq); + + /*! + \brief Sets FSK bit rate. Only available in FSK mode. Must be implemented in module class. + \param br Bit rate to be set (in kbps). + \returns \ref status_codes + */ + virtual int16_t setBitRate(float br); + + /*! + \brief Sets FSK frequency deviation from carrier frequency. Only available in FSK mode. + Must be implemented in module class. + \param freqDev Frequency deviation to be set (in kHz). + \returns \ref status_codes + */ + virtual int16_t setFrequencyDeviation(float freqDev); + + /*! + \brief Sets GFSK data shaping. Only available in FSK mode. Must be implemented in module class. + \param sh Shaping to be set. See \ref config_shaping for possible values. + \returns \ref status_codes + */ + virtual int16_t setDataShaping(uint8_t sh); + + /*! + \brief Sets FSK data encoding. Only available in FSK mode. Must be implemented in module class. + \param enc Encoding to be used. See \ref config_encoding for possible values. + \returns \ref status_codes + */ + virtual int16_t setEncoding(uint8_t encoding); + + /*! + \brief Set IQ inversion. Must be implemented in module class if the module supports it. + \param enable True to use inverted IQ, false for non-inverted. + \returns \ref status_codes + */ + virtual int16_t invertIQ(bool enable); + + /*! + \brief Set output power. Must be implemented in module class if the module supports it. + \param power Output power in dBm. The allowed range depends on the module used. + \returns \ref status_codes + */ + virtual int16_t setOutputPower(int8_t power); + + /*! + \brief Set sync word. Must be implemented in module class if the module supports it. + \param sync Pointer to the sync word. + \param len Sync word length in bytes. Maximum length depends on the module used. + \returns \ref status_codes + */ + virtual int16_t setSyncWord(uint8_t* sync, size_t len); + + /*! + \brief Set preamble length. Must be implemented in module class if the module supports it. + \param len Preamble length in bytes. Maximum length depends on the module used. + \returns \ref status_codes + */ + virtual int16_t setPreambleLength(size_t len); + + /*! + \brief Set data. Must be implemented in module class if the module supports it. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + virtual int16_t setDataRate(DataRate_t dr); + + /*! + \brief Gets the module frequency step size that was set in constructor. + \returns Synthesizer frequency step size in Hz. + */ + float getFreqStep() const; + + /*! + \brief Query modem for the packet length of received payload. Must be implemented in module class. + \param update Update received packet length. Will return cached value when set to false. + \returns Length of last received packet in bytes. + */ + virtual size_t getPacketLength(bool update = true); + + /*! + \brief Gets RSSI (Recorded Signal Strength Indicator) of the last received packet. + \returns RSSI of the last received packet in dBm. + */ + virtual float getRSSI(); + + /*! + \brief Gets SNR (Signal to Noise Ratio) of the last received packet. Only available for LoRa modem. + \returns SNR of the last received packet in dB. + */ + virtual float getSNR(); + + /*! + \brief Get expected time-on-air for a given size of payload + \param len Payload length in bytes. + \returns Expected time-on-air in microseconds. + */ + virtual uint32_t getTimeOnAir(size_t len); + + /*! + \brief Interrupt-driven channel activity detection method. interrupt will be activated + when packet is detected. Must be implemented in module class. + \returns \ref status_codes + */ + virtual int16_t startChannelScan(); + + /*! + \brief Read the channel scan result + \returns \ref status_codes + */ + virtual int16_t getChannelScanResult(); + + /*! + \brief Check whether the current communication channel is free or occupied. Performs CAD for LoRa modules, + or RSSI measurement for FSK modules. + \returns RADIOLIB_CHANNEL_FREE when channel is free, + RADIOLIB_PREAMBLE_DETECTEDwhen occupied or other \ref status_codes. + */ + virtual int16_t scanChannel(); + + /*! + \brief Get truly random number in range 0 - max. + \param max The maximum value of the random number (non-inclusive). + \returns Random number. + */ + int32_t random(int32_t max); + + /*! + \brief Get truly random number in range min - max. + \param min The minimum value of the random number (inclusive). + \param max The maximum value of the random number (non-inclusive). + \returns Random number. + */ + int32_t random(int32_t min, int32_t max); + + /*! + \brief Get one truly random byte from RSSI noise. Must be implemented in module class. + \returns TRNG byte. + */ + virtual uint8_t randomByte(); + + /*! + \brief Configure module parameters for direct modes. Must be called prior to "ham" modes like RTTY or AX.25. + Only available in FSK mode. + \returns \ref status_codes + */ + int16_t startDirect(); + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + /*! + \brief Set sync word to be used to determine start of packet in direct reception mode. + \param syncWord Sync word bits. + \param len Sync word length in bits. Set to zero to disable sync word matching. + \returns \ref status_codes + */ + int16_t setDirectSyncWord(uint32_t syncWord, uint8_t len); + + /*! + \brief Set interrupt service routine function to call when data bit is received in direct mode. + Must be implemented in module class. + \param func Pointer to interrupt service routine. + */ + virtual void setDirectAction(void (*func)(void)); + + /*! + \brief Function to read and process data bit in direct reception mode. Must be implemented in module class. + \param pin Pin on which to read. + */ + virtual void readBit(uint32_t pin); + + /*! + \brief Get the number of direct mode bytes currently available in buffer. + \returns Number of available bytes. + */ + int16_t available(); + + /*! + \brief Forcefully drop synchronization. + */ + void dropSync(); + + /*! + \brief Get data from direct mode buffer. + \param drop Drop synchronization on read - next reading will require waiting for the sync word again. + Defaults to true. + \returns Byte from direct mode buffer. + */ + uint8_t read(bool drop = true); + #endif + + /*! + \brief Configure DIO pin mapping to get a given signal on a DIO pin (if available). + \param pin Pin number onto which a signal is to be placed. + \param value The value that indicates which function to place on that pin. See chip datasheet for details. + \returns \ref status_codes + */ + virtual int16_t setDIOMapping(uint32_t pin, uint32_t value); + + /*! + \brief Sets interrupt service routine to call when a packet is received. + \param func ISR to call. + */ + virtual void setPacketReceivedAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is received. + */ + virtual void clearPacketReceivedAction(); + + /*! + \brief Sets interrupt service routine to call when a packet is sent. + \param func ISR to call. + */ + virtual void setPacketSentAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a packet is sent. + */ + virtual void clearPacketSentAction(); + + /*! + \brief Sets interrupt service routine to call when a channel scan is finished. + \param func ISR to call. + */ + virtual void setChannelScanAction(void (*func)(void)); + + /*! + \brief Clears interrupt service routine to call when a channel scan is finished. + */ + virtual void clearChannelScanAction(); + + #if defined(RADIOLIB_INTERRUPT_TIMING) + + /*! + \brief Set function to be called to set up the timing interrupt. + For details, see https://github.com/jgromes/RadioLib/wiki/Interrupt-Based-Timing + \param func Setup function to be called, with one argument (pulse length in microseconds). + */ + void setInterruptSetup(void (*func)(uint32_t)); + + /*! + \brief Set timing interrupt flag. + For details, see https://github.com/jgromes/RadioLib/wiki/Interrupt-Based-Timing + */ + void setTimerFlag(); + + #endif + +#if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + protected: + void updateDirectBuffer(uint8_t bit); +#endif + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + float freqStep; + size_t maxPacketLength; + + #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) + uint8_t bufferBitPos; + uint8_t bufferWritePos; + uint8_t bufferReadPos; + uint8_t buffer[RADIOLIB_STATIC_ARRAY_SIZE]; + uint32_t syncBuffer; + uint32_t directSyncWord; + uint8_t directSyncWordLen; + uint32_t directSyncWordMask; + bool gotSync; + #endif + + virtual Module* getMod() = 0; + + // allow specific classes access the private getMod method + friend class AFSKClient; + friend class RTTYClient; + friend class MorseClient; + friend class HellClient; + friend class SSTVClient; + friend class AX25Client; + friend class FSK4Client; + friend class PagerClient; + friend class BellClient; + friend class FT8Client; + friend class LoRaWANNode; +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/ITA2String.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/ITA2String.cpp new file mode 100644 index 00000000..b162b259 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/ITA2String.cpp @@ -0,0 +1,113 @@ +#include "ITA2String.h" + +#include + +ITA2String::ITA2String(char c) { + asciiLen = 1; + #if !defined(RADIOLIB_STATIC_ONLY) + strAscii = new char[1]; + #endif + strAscii[0] = c; + ita2Len = 0; +} + +ITA2String::ITA2String(const char* str) { + asciiLen = strlen(str); + #if !defined(RADIOLIB_STATIC_ONLY) + strAscii = new char[asciiLen + 1]; + #endif + strcpy(strAscii, str); + ita2Len = 0; +} + +ITA2String::~ITA2String() { + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] strAscii; + #endif +} + +size_t ITA2String::length() { + // length returned by this method is different than the length of ASCII-encoded strAscii + // ITA2-encoded string length varies based on how many number and characters the string contains + + if(ita2Len == 0) { + // ITA2 length wasn't calculated yet, call byteArr() to calculate it + byteArr(); + } + + return(ita2Len); +} + +uint8_t* ITA2String::byteArr() { + // create temporary array 2x the string length (figures may be 3 bytes) + #if defined(RADIOLIB_STATIC_ONLY) + uint8_t temp[RADIOLIB_STATIC_ARRAY_SIZE*2 + 1]; + #else + uint8_t* temp = new uint8_t[asciiLen*2 + 1]; + #endif + + size_t arrayLen = 0; + bool flagFigure = false; + for(size_t i = 0; i < asciiLen; i++) { + uint16_t code = getBits(strAscii[i]); + uint8_t shift = (code >> 5) & 0b11111; + uint8_t character = code & 0b11111; + // check if the code is letter or figure + if(shift == RADIOLIB_ITA2_FIGS) { + // check if this is the first figure in sequence + if(!flagFigure) { + flagFigure = true; + temp[arrayLen++] = RADIOLIB_ITA2_FIGS; + } + + // add the character code + temp[arrayLen++] = character & 0b11111; + + // check the following character (skip for message end) + if(i < (asciiLen - 1)) { + uint16_t nextCode = getBits(strAscii[i+1]); + uint8_t nextShift = (nextCode >> 5) & 0b11111; + if(nextShift == RADIOLIB_ITA2_LTRS) { + // next character is a letter, terminate figure shift + temp[arrayLen++] = RADIOLIB_ITA2_LTRS; + flagFigure = false; + } + } else { + // reached the end of the message, terminate figure shift + temp[arrayLen++] = RADIOLIB_ITA2_LTRS; + flagFigure = false; + } + } else { + temp[arrayLen++] = character & 0b11111; + } + } + + // save ITA2 string length + ita2Len = arrayLen; + + uint8_t* arr = new uint8_t[arrayLen]; + memcpy(arr, temp, arrayLen); + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] temp; + #endif + + return(arr); +} + +uint16_t ITA2String::getBits(char c) { + // search ITA2 table + uint16_t code = 0x0000; + for(uint8_t i = 0; i < RADIOLIB_ITA2_LENGTH; i++) { + if(RADIOLIB_NONVOLATILE_READ_BYTE(&ITA2Table[i][0]) == c) { + // character is in letter shift + code = (RADIOLIB_ITA2_LTRS << 5) | i; + break; + } else if(RADIOLIB_NONVOLATILE_READ_BYTE(&ITA2Table[i][1]) == c) { + // character is in figures shift + code = (RADIOLIB_ITA2_FIGS << 5) | i; + break; + } + } + + return(code); +} diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/ITA2String.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/ITA2String.h new file mode 100644 index 00000000..556c0a3b --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/ITA2String.h @@ -0,0 +1,70 @@ +#if !defined(_RADIOLIB_ITA2_STRING_H) +#define _RADIOLIB_ITA2_STRING_H + +#include "../../TypeDef.h" + +#define RADIOLIB_ITA2_FIGS 0x1B +#define RADIOLIB_ITA2_LTRS 0x1F +#define RADIOLIB_ITA2_LENGTH 32 + +// ITA2 character table: - position in array corresponds to 5-bit ITA2 code +// - characters to the left are in letters shift, characters to the right in figures shift +// - characters marked 0x7F do not have ASCII equivalent +static const char ITA2Table[RADIOLIB_ITA2_LENGTH][2] RADIOLIB_NONVOLATILE = { + {'\0', '\0'}, {'E', '3'}, {'\n', '\n'}, {'A', '-'}, {' ', ' '}, {'S', '\''}, {'I', '8'}, {'U', '7'}, + {'\r', '\r'}, {'D', 0x05}, {'R', '4'}, {'J', '\a'}, {'N', ','}, {'F', '!'}, {'C', ':'}, {'K', '('}, + {'T', '5'}, {'Z', '+'}, {'L', ')'}, {'W', '2'}, {'H', 0x7F}, {'Y', '6'}, {'P', '0'}, {'Q', '1'}, + {'O', '9'}, {'B', '?'}, {'G', '&'}, {0x7F, 0x7F}, {'M', '.'}, {'X', '/'}, {'V', ';'}, {0x7F, 0x7F} +}; + +/*! + \class ITA2String + \brief ITA2-encoded string. +*/ +class ITA2String { + public: + /*! + \brief Default single-character constructor. + \param c ASCII-encoded character to encode as ITA2. + */ + ITA2String(char c); + + /*! + \brief Default string constructor. + \param str ASCII-encoded string to encode as ITA2. + */ + ITA2String(const char* str); + + /*! + \brief Default destructor. + */ + ~ITA2String(); + + /*! + \brief Gets the length of the ITA2 string. This number is not the same as the length of ASCII-encoded string! + \returns Length of ITA2-encoded string. + */ + size_t length(); + + /*! + \brief Gets the ITA2 representation of the ASCII string set in constructor. + \returns Pointer to dynamically allocated array, which contains ITA2-encoded bytes. + It is the caller's responsibility to deallocate this memory! + */ + uint8_t* byteArr(); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + #if defined(RADIOLIB_STATIC_ONLY) + char strAscii[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + char* strAscii; + #endif + size_t asciiLen; + size_t ita2Len; + + static uint16_t getBits(char c); +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/Print.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/Print.cpp new file mode 100644 index 00000000..f944ec75 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/Print.cpp @@ -0,0 +1,312 @@ +#include "Print.h" + +#include +#include + +size_t RadioLibPrint::print(ITA2String& ita2) { + uint8_t enc = this->encoding; + this->encoding = RADIOLIB_ITA2; + uint8_t* arr = ita2.byteArr(); + size_t n = write(arr, ita2.length()); + delete[] arr; + this->encoding = enc; + return(n); +} + +size_t RadioLibPrint::println(ITA2String& ita2) { + size_t n = RadioLibPrint::print(ita2); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::write(const uint8_t *buffer, size_t size) { + size_t n = 0; + while (size--) { + if (write(*buffer++)) n++; + else break; + } + return n; +} + +#if defined(RADIOLIB_BUILD_ARDUINO) +size_t RadioLibPrint::print(const __FlashStringHelper* fstr) { + // read flash string length + size_t len = 0; + RADIOLIB_NONVOLATILE_PTR p = reinterpret_cast(fstr); + while(true) { + char c = RADIOLIB_NONVOLATILE_READ_BYTE(p++); + len++; + if(c == '\0') { + break; + } + } + + // dynamically allocate memory + #if defined(RADIOLIB_STATIC_ONLY) + char str[RADIOLIB_STATIC_ARRAY_SIZE]; + #else + char* str = new char[len]; + #endif + + // copy string from flash + p = reinterpret_cast(fstr); + for(size_t i = 0; i < len; i++) { + str[i] = RADIOLIB_NONVOLATILE_READ_BYTE(p + i); + } + + size_t n = 0; + if(this->encoding == RADIOLIB_ITA2) { + ITA2String ita2 = ITA2String(str); + n = RadioLibPrint::print(ita2); + } else { + n = write((uint8_t*)str, len); + } + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] str; + #endif + return(n); +} + +size_t RadioLibPrint::print(const String& str) { + size_t n = 0; + if(this->encoding == RADIOLIB_ITA2) { + ITA2String ita2 = ITA2String(str.c_str()); + n = RadioLibPrint::print(ita2); + } else { + n = write((uint8_t*)str.c_str(), str.length()); + } + return(n); +} + +size_t RadioLibPrint::println(const __FlashStringHelper* fstr) { + size_t n = RadioLibPrint::print(fstr); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(const String& str) { + size_t n = RadioLibPrint::print(str); + n += RadioLibPrint::println(); + return(n); +} +#endif + +size_t RadioLibPrint::print(const char str[]) { + size_t n = 0; + if(this->encoding == RADIOLIB_ITA2) { + ITA2String ita2 = ITA2String(str); + n = RadioLibPrint::print(ita2); + } else { + n = write((uint8_t*)str, strlen(str)); + } + return(n); +} + +size_t RadioLibPrint::print(char c) { + size_t n = 0; + if(this->encoding == RADIOLIB_ITA2) { + ITA2String ita2 = ITA2String(c); + n = RadioLibPrint::print(ita2); + } else { + n = write(c); + } + return(n); +} + +size_t RadioLibPrint::print(unsigned char b, int base) { + return(RadioLibPrint::print((unsigned long)b, base)); +} + +size_t RadioLibPrint::print(int n, int base) { + return(RadioLibPrint::print((long)n, base)); +} + +size_t RadioLibPrint::print(unsigned int n, int base) { + return(RadioLibPrint::print((unsigned long)n, base)); +} + +size_t RadioLibPrint::print(long n, int base) { + if(base == 0) { + return(write(n)); + } else if(base == DEC) { + if (n < 0) { + int t = RadioLibPrint::print('-'); + n = -n; + return(RadioLibPrint::printNumber(n, DEC) + t); + } + return(RadioLibPrint::printNumber(n, DEC)); + } else { + return(RadioLibPrint::printNumber(n, base)); + } +} + +size_t RadioLibPrint::print(unsigned long n, int base) { + if(base == 0) { + return(write(n)); + } else { + return(RadioLibPrint::printNumber(n, base)); + } +} + +size_t RadioLibPrint::print(double n, int digits) { + return(RadioLibPrint::printFloat(n, digits)); +} + +size_t RadioLibPrint::println(const char* str) { + size_t n = RadioLibPrint::print(str); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(char c) { + size_t n = RadioLibPrint::print(c); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(unsigned char b, int base) { + size_t n = RadioLibPrint::print(b, base); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(int num, int base) { + size_t n = RadioLibPrint::print(num, base); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(unsigned int num, int base) { + size_t n = RadioLibPrint::print(num, base); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(long num, int base) { + size_t n = RadioLibPrint::print(num, base); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(unsigned long num, int base) { + size_t n = RadioLibPrint::print(num, base); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(double d, int digits) { + size_t n = RadioLibPrint::print(d, digits); + n += RadioLibPrint::println(); + return(n); +} + +size_t RadioLibPrint::println(void) { + size_t n = 0; + if(this->encoding == RADIOLIB_ITA2) { + ITA2String lf = ITA2String("\r\n"); + n = RadioLibPrint::print(lf); + } else { + n = write("\r\n"); + } + return(n); +} + +size_t RadioLibPrint::printNumber(unsigned long n, uint8_t base) { + char buf[8 * sizeof(long) + 1]; + char *str = &buf[sizeof(buf) - 1]; + + *str = '\0'; + + if(base < 2) { + base = 10; + } + + do { + char c = n % base; + n /= base; + + *--str = c < 10 ? c + '0' : c + 'A' - 10; + } while(n); + + size_t l = 0; + if(this->encoding == RADIOLIB_ITA2) { + ITA2String ita2 = ITA2String(str); + uint8_t* arr = ita2.byteArr(); + l = write(arr, ita2.length()); + delete[] arr; + } else { + l = write(str); + } + + return(l); +} + +/// \todo improve ITA2 float print speed (characters are sent one at a time) +size_t RadioLibPrint::printFloat(double number, uint8_t digits) { + size_t n = 0; + + char code[] = {0x00, 0x00, 0x00, 0x00}; + if (isnan(number)) strcpy(code, "nan"); + if (isinf(number)) strcpy(code, "inf"); + if (number > 4294967040.0) strcpy(code, "ovf"); // constant determined empirically + if (number <-4294967040.0) strcpy(code, "ovf"); // constant determined empirically + + if(code[0] != 0x00) { + if(this->encoding == RADIOLIB_ITA2) { + ITA2String ita2 = ITA2String(code); + uint8_t* arr = ita2.byteArr(); + n = write(arr, ita2.length()); + delete[] arr; + return(n); + } else { + return(write(code)); + } + } + + // Handle negative numbers + if (number < 0.0) { + if(this->encoding == RADIOLIB_ITA2) { + ITA2String ita2 = ITA2String("-"); + uint8_t* arr = ita2.byteArr(); + n += write(arr, ita2.length()); + delete[] arr; + } else { + n += RadioLibPrint::print('-'); + } + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for(uint8_t i = 0; i < digits; ++i) { + rounding /= 10.0; + } + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + n += RadioLibPrint::print(int_part); + + // Print the decimal point, but only if there are digits beyond + if(digits > 0) { + if(encoding == RADIOLIB_ITA2) { + ITA2String ita2 = ITA2String("."); + uint8_t* arr = ita2.byteArr(); + n += write(arr, ita2.length()); + delete[] arr; + } else { + n += RadioLibPrint::print('.'); + } + } + + // Extract digits from the remainder one at a time + while(digits-- > 0) { + remainder *= 10.0; + unsigned int toPrint = (unsigned int)(remainder); + n += RadioLibPrint::print(toPrint); + remainder -= toPrint; + } + + return n; +} diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/Print.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/Print.h new file mode 100644 index 00000000..a132cf61 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/Print/Print.h @@ -0,0 +1,67 @@ +#if !defined(_RADIOLIB_PRINT_H) +#define _RADIOLIB_PRINT_H + +#include + +#include "ITA2String.h" + +// supported encoding schemes +#define RADIOLIB_ASCII 0 +#define RADIOLIB_ASCII_EXTENDED 1 +#define RADIOLIB_ITA2 2 + +// based on Arduino Print class +class RadioLibPrint { + public: + virtual size_t write(uint8_t) = 0; + size_t write(const char *str) { + if (str == NULL) return 0; + return write((const uint8_t *)str, strlen(str)); + } + virtual size_t write(const uint8_t *buffer, size_t size); + size_t write(const char *buffer, size_t size) { + return write((const uint8_t *)buffer, size); + } + + size_t print(ITA2String& ita2); + size_t println(ITA2String& ita2); + + #if defined(RADIOLIB_BUILD_ARDUINO) + size_t print(const __FlashStringHelper *); + size_t print(const String &); + + size_t println(const __FlashStringHelper *); + size_t println(const String &); + #endif + + size_t print(const char[]); + size_t print(char); + size_t print(unsigned char, int = DEC); + size_t print(int, int = DEC); + size_t print(unsigned int, int = DEC); + size_t print(long, int = DEC); + size_t print(unsigned long, int = DEC); + size_t print(double, int = 2); + + size_t println(const char[]); + size_t println(char); + size_t println(unsigned char, int = DEC); + size_t println(int, int = DEC); + size_t println(unsigned int, int = DEC); + size_t println(long, int = DEC); + size_t println(unsigned long, int = DEC); + size_t println(double, int = 2); + size_t println(void); + +#if !defined(RADIOLIB_GODMODE) + protected: +#endif + uint8_t encoding = RADIOLIB_ASCII_EXTENDED; + const char* lineFeed; + + size_t printNumber(unsigned long, uint8_t); + size_t printFloat(double, uint8_t); + +}; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/RTTY/RTTY.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/RTTY/RTTY.cpp new file mode 100644 index 00000000..eff2d7ad --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/RTTY/RTTY.cpp @@ -0,0 +1,127 @@ +#include "RTTY.h" + +#include + +#if !defined(RADIOLIB_EXCLUDE_RTTY) + +RTTYClient::RTTYClient(PhysicalLayer* phy) { + phyLayer = phy; + lineFeed = "\r\n"; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + audioClient = nullptr; + #endif +} + +#if !defined(RADIOLIB_EXCLUDE_AFSK) +RTTYClient::RTTYClient(AFSKClient* audio) { + phyLayer = audio->phyLayer; + lineFeed = "\r\n"; + audioClient = audio; +} +#endif + +int16_t RTTYClient::begin(float base, uint32_t shift, uint16_t rate, uint8_t enc, uint8_t stopBits) { + // save configuration + RadioLibPrint::encoding = enc; + stopBitsNum = stopBits; + baseFreqHz = base; + shiftFreqHz = shift; + + // calculate duration of 1 bit + bitDuration = (uint32_t)1000000/rate; + + // calculate module carrier frequency resolution + uint32_t step = round(phyLayer->getFreqStep()); + + // check minimum shift value + if(shift < step / 2) { + return(RADIOLIB_ERR_INVALID_RTTY_SHIFT); + } + + // round shift to multiples of frequency step size + if(shift % step < (step / 2)) { + shiftFreq = shift / step; + } else { + shiftFreq = (shift / step) + 1; + } + + // calculate 24-bit frequency + baseFreq = (base * 1000000.0) / phyLayer->getFreqStep(); + + // configure for direct mode + return(phyLayer->startDirect()); +} + +void RTTYClient::idle() { + mark(); +} + +size_t RTTYClient::write(uint8_t b) { + uint8_t dataBitsNum = 0; + switch(RadioLibPrint::encoding) { + case RADIOLIB_ASCII: + dataBitsNum = 7; + break; + case RADIOLIB_ASCII_EXTENDED: + dataBitsNum = 8; + break; + case RADIOLIB_ITA2: + dataBitsNum = 5; + break; + default: + return(0); + } + space(); + + uint16_t maxDataMask = 0x01 << (dataBitsNum - 1); + for(uint16_t mask = 0x01; mask <= maxDataMask; mask <<= 1) { + if(b & mask) { + mark(); + } else { + space(); + } + } + + for(uint8_t i = 0; i < stopBitsNum; i++) { + mark(); + } + + return(1); +} + +void RTTYClient::mark() { + Module* mod = phyLayer->getMod(); + uint32_t start = mod->hal->micros(); + transmitDirect(baseFreq + shiftFreq, baseFreqHz + shiftFreqHz); + mod->waitForMicroseconds(start, bitDuration); +} + +void RTTYClient::space() { + Module* mod = phyLayer->getMod(); + uint32_t start = mod->hal->micros(); + transmitDirect(baseFreq, baseFreqHz); + mod->waitForMicroseconds(start, bitDuration); +} + +int16_t RTTYClient::transmitDirect(uint32_t freq, uint32_t freqHz) { + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + return(audioClient->tone(freqHz)); + } + #endif + return(phyLayer->transmitDirect(freq)); +} + +int16_t RTTYClient::standby() { + // ensure everything is stopped in interrupt timing mode + Module* mod = phyLayer->getMod(); + mod->waitForMicroseconds(0, 0); + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + return(audioClient->noTone()); + } + #endif + return(phyLayer->standby()); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/RTTY/RTTY.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/RTTY/RTTY.h new file mode 100644 index 00000000..4ebbc7cc --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/RTTY/RTTY.h @@ -0,0 +1,85 @@ +#if !defined(_RADIOLIB_RTTY_H) +#define _RADIOLIB_RTTY_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_RTTY) + +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../AFSK/AFSK.h" +#include "../Print/Print.h" +#include "../Print/ITA2String.h" + +/*! + \class RTTYClient + \brief Client for RTTY communication. The public interface is the same as Arduino Serial. +*/ +class RTTYClient: public RadioLibPrint { + public: + /*! + \brief Constructor for 2-FSK mode. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + explicit RTTYClient(PhysicalLayer* phy); + + #if !defined(RADIOLIB_EXCLUDE_AFSK) + /*! + \brief Constructor for AFSK mode. + \param audio Pointer to the AFSK instance providing audio. + */ + explicit RTTYClient(AFSKClient* audio); + #endif + + // basic methods + + /*! + \brief Initialization method. + \param base Base (space) frequency to be used in MHz (in 2-FSK mode), or the space tone frequency in Hz (in AFSK mode) + \param shift Frequency shift between mark and space in Hz. + \param rate Baud rate to be used during transmission. + \param enc Encoding to be used. Defaults to ASCII. + \param stopBits Number of stop bits to be used. + \returns \ref status_codes + */ + int16_t begin(float base, uint32_t shift, uint16_t rate, uint8_t enc = RADIOLIB_ASCII, uint8_t stopBits = 1); + + /*! + \brief Send out idle condition (RF tone at mark frequency). + */ + void idle(); + + /*! + \brief Stops transmitting. + \returns \ref status_codes + */ + int16_t standby(); + + /*! + \brief Write one byte. Implementation of interface of the RadioLibPrint/Print class. + \param b Byte to write. + \returns 1 if the byte was written, 0 otherwise. + */ + size_t write(uint8_t b); + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + PhysicalLayer* phyLayer; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + AFSKClient* audioClient; + #endif + + uint32_t baseFreq = 0, baseFreqHz = 0; + uint32_t shiftFreq = 0, shiftFreqHz = 0; + uint32_t bitDuration = 0; + uint8_t stopBitsNum = 0; + + void mark(); + void space(); + + int16_t transmitDirect(uint32_t freq = 0, uint32_t freqHz = 0); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/SSTV/SSTV.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/SSTV/SSTV.cpp new file mode 100644 index 00000000..107674fd --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/SSTV/SSTV.cpp @@ -0,0 +1,307 @@ +#include "SSTV.h" +#if !defined(RADIOLIB_EXCLUDE_SSTV) + +const SSTVMode_t Scottie1 { + .visCode = RADIOLIB_SSTV_SCOTTIE_1, + .width = 320, + .height = 256, + .scanPixelLen = 432, + .numTones = 7, + .tones = { + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 9000, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 } + } +}; + +const SSTVMode_t Scottie2 { + .visCode = RADIOLIB_SSTV_SCOTTIE_2, + .width = 320, + .height = 256, + .scanPixelLen = 275, + .numTones = 7, + .tones = { + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 9000, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 } + } +}; + +const SSTVMode_t ScottieDX { + .visCode = RADIOLIB_SSTV_SCOTTIE_DX, + .width = 320, + .height = 256, + .scanPixelLen = 1080, + .numTones = 7, + .tones = { + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 9000, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 1500, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 } + } +}; + +const SSTVMode_t Martin1 { + .visCode = RADIOLIB_SSTV_MARTIN_1, + .width = 320, + .height = 256, + .scanPixelLen = 458, + .numTones = 8, + .tones = { + { .type = tone_t::GENERIC, .len = 4862, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 572, .freq = 1500 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 572, .freq = 1500 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 572, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 572, .freq = 1500 } + } +}; + +const SSTVMode_t Martin2 { + .visCode = RADIOLIB_SSTV_MARTIN_2, + .width = 320, + .height = 256, + .scanPixelLen = 229, + .numTones = 8, + .tones = { + { .type = tone_t::GENERIC, .len = 4862, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 572, .freq = 1500 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 572, .freq = 1500 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 572, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 572, .freq = 1500 } + } +}; + +const SSTVMode_t Wrasse { + .visCode = RADIOLIB_SSTV_WRASSE_SC2_180, + .width = 320, + .height = 256, + .scanPixelLen = 734, + .numTones = 5, + .tones = { + { .type = tone_t::GENERIC, .len = 5523, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 500, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 } + } +}; + +const SSTVMode_t PasokonP3 { + .visCode = RADIOLIB_SSTV_PASOKON_P3, + .width = 640, + .height = 496, + .scanPixelLen = 208, + .numTones = 7, + .tones = { + { .type = tone_t::GENERIC, .len = 5208, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 1042, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 1042, .freq = 1500 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 1042, .freq = 1500 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 } + } +}; + +const SSTVMode_t PasokonP5 { + .visCode = RADIOLIB_SSTV_PASOKON_P5, + .width = 640, + .height = 496, + .scanPixelLen = 312, + .numTones = 7, + .tones = { + { .type = tone_t::GENERIC, .len = 7813, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 1563, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 1563, .freq = 1500 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 1563, .freq = 1500 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 } + } +}; + +const SSTVMode_t PasokonP7 { + .visCode = RADIOLIB_SSTV_PASOKON_P7, + .width = 640, + .height = 496, + .scanPixelLen = 417, + .numTones = 7, + .tones = { + { .type = tone_t::GENERIC, .len = 10417, .freq = 1200 }, + { .type = tone_t::GENERIC, .len = 2083, .freq = 1500 }, + { .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 2083, .freq = 1500 }, + { .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 }, + { .type = tone_t::GENERIC, .len = 2083, .freq = 1500 }, + { .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 } + } +}; + +SSTVClient::SSTVClient(PhysicalLayer* phy) { + phyLayer = phy; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + audioClient = nullptr; + #endif +} + +#if !defined(RADIOLIB_EXCLUDE_AFSK) +SSTVClient::SSTVClient(AFSKClient* audio) { + phyLayer = audio->phyLayer; + audioClient = audio; +} +#endif + +#if !defined(RADIOLIB_EXCLUDE_AFSK) +int16_t SSTVClient::begin(const SSTVMode_t& mode) { + if(audioClient == nullptr) { + // this initialization method can only be used in AFSK mode + return(RADIOLIB_ERR_WRONG_MODEM); + } + + return(begin(0, mode)); +} +#endif + +int16_t SSTVClient::begin(float base, const SSTVMode_t& mode) { + // save mode + txMode = mode; + + // calculate 24-bit frequency + baseFreq = (base * 1000000.0) / phyLayer->getFreqStep(); + + // configure for direct mode + return(phyLayer->startDirect()); +} + +int16_t SSTVClient::setCorrection(float correction) { + // check if mode is initialized + if(txMode.visCode == 0) { + return(RADIOLIB_ERR_WRONG_MODEM); + } + + // apply correction factor to all timings + txMode.scanPixelLen *= correction; + for(uint8_t i = 0; i < txMode.numTones; i++) { + txMode.tones[i].len *= correction; + } + return(RADIOLIB_ERR_NONE); +} + +void SSTVClient::idle() { + phyLayer->transmitDirect(); + this->tone(RADIOLIB_SSTV_TONE_LEADER); +} + +void SSTVClient::sendHeader() { + // save first header flag for Scottie modes + firstLine = true; + phyLayer->transmitDirect(); + + // send the first part of header (leader-break-leader) + this->tone(RADIOLIB_SSTV_TONE_LEADER, RADIOLIB_SSTV_HEADER_LEADER_LENGTH); + this->tone(RADIOLIB_SSTV_TONE_BREAK, RADIOLIB_SSTV_HEADER_BREAK_LENGTH); + this->tone(RADIOLIB_SSTV_TONE_LEADER, RADIOLIB_SSTV_HEADER_LEADER_LENGTH); + + // VIS start bit + this->tone(RADIOLIB_SSTV_TONE_BREAK, RADIOLIB_SSTV_HEADER_BIT_LENGTH); + + // VIS code + uint8_t parityCount = 0; + for(uint8_t mask = 0x01; mask < 0x80; mask <<= 1) { + if(txMode.visCode & mask) { + this->tone(RADIOLIB_SSTV_TONE_VIS_1, RADIOLIB_SSTV_HEADER_BIT_LENGTH); + parityCount++; + } else { + this->tone(RADIOLIB_SSTV_TONE_VIS_0, RADIOLIB_SSTV_HEADER_BIT_LENGTH); + } + } + + // VIS parity + if(parityCount % 2 == 0) { + // even parity + this->tone(RADIOLIB_SSTV_TONE_VIS_0, RADIOLIB_SSTV_HEADER_BIT_LENGTH); + } else { + // odd parity + this->tone(RADIOLIB_SSTV_TONE_VIS_1, RADIOLIB_SSTV_HEADER_BIT_LENGTH); + } + + // VIS stop bit + this->tone(RADIOLIB_SSTV_TONE_BREAK, RADIOLIB_SSTV_HEADER_BIT_LENGTH); +} + +void SSTVClient::sendLine(uint32_t* imgLine) { + // check first line flag in Scottie modes + if(firstLine && ((txMode.visCode == RADIOLIB_SSTV_SCOTTIE_1) || (txMode.visCode == RADIOLIB_SSTV_SCOTTIE_2) || (txMode.visCode == RADIOLIB_SSTV_SCOTTIE_DX))) { + firstLine = false; + + // send start sync tone + this->tone(RADIOLIB_SSTV_TONE_BREAK, 9000); + } + + // send all tones in sequence + for(uint8_t i = 0; i < txMode.numTones; i++) { + if((txMode.tones[i].type == tone_t::GENERIC) && (txMode.tones[i].len > 0)) { + // sync/porch tones + this->tone(txMode.tones[i].freq, txMode.tones[i].len); + } else { + // scan lines + for(uint16_t j = 0; j < txMode.width; j++) { + uint32_t color = imgLine[j]; + switch(txMode.tones[i].type) { + case(tone_t::SCAN_RED): + color &= 0x00FF0000; + color >>= 16; + break; + case(tone_t::SCAN_GREEN): + color &= 0x0000FF00; + color >>= 8; + break; + case(tone_t::SCAN_BLUE): + color &= 0x000000FF; + break; + case(tone_t::GENERIC): + break; + } + this->tone(RADIOLIB_SSTV_TONE_BRIGHTNESS_MIN + ((float)color * 3.1372549), txMode.scanPixelLen); + } + } + } +} + +uint16_t SSTVClient::getPictureHeight() const { + return(txMode.height); +} + +void SSTVClient::tone(float freq, uint32_t len) { + Module* mod = phyLayer->getMod(); + uint32_t start = mod->hal->micros(); + #if !defined(RADIOLIB_EXCLUDE_AFSK) + if(audioClient != nullptr) { + audioClient->tone(freq, false); + } else { + phyLayer->transmitDirect(baseFreq + (freq / phyLayer->getFreqStep())); + } + #else + phyLayer->transmitDirect(baseFreq + (freq / phyLayer->getFreqStep())); + #endif + mod->waitForMicroseconds(start, len); +} + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/SSTV/SSTV.h b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/SSTV/SSTV.h new file mode 100644 index 00000000..df73d8f2 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/protocols/SSTV/SSTV.h @@ -0,0 +1,202 @@ +#if !defined(_RADIOLIB_RADIOLIB_SSTV_H) +#define _RADIOLIB_RADIOLIB_SSTV_H + +#include "../../TypeDef.h" + +#if !defined(RADIOLIB_EXCLUDE_SSTV) + +#include "../PhysicalLayer/PhysicalLayer.h" +#include "../AFSK/AFSK.h" + +// the following implementation is based on information from +// http://www.barberdsp.com/downloads/Dayton%20Paper.pdf + +// VIS codes +#define RADIOLIB_SSTV_SCOTTIE_1 60 +#define RADIOLIB_SSTV_SCOTTIE_2 56 +#define RADIOLIB_SSTV_SCOTTIE_DX 76 +#define RADIOLIB_SSTV_MARTIN_1 44 +#define RADIOLIB_SSTV_MARTIN_2 40 +#define RADIOLIB_SSTV_WRASSE_SC2_180 55 +#define RADIOLIB_SSTV_PASOKON_P3 113 +#define RADIOLIB_SSTV_PASOKON_P5 114 +#define RADIOLIB_SSTV_PASOKON_P7 115 + +// SSTV tones in Hz +#define RADIOLIB_SSTV_TONE_LEADER 1900 +#define RADIOLIB_SSTV_TONE_BREAK 1200 +#define RADIOLIB_SSTV_TONE_VIS_1 1100 +#define RADIOLIB_SSTV_TONE_VIS_0 1300 +#define RADIOLIB_SSTV_TONE_BRIGHTNESS_MIN 1500 +#define RADIOLIB_SSTV_TONE_BRIGHTNESS_MAX 2300 + +// calibration header timing in us +#define RADIOLIB_SSTV_HEADER_LEADER_LENGTH 300000 +#define RADIOLIB_SSTV_HEADER_BREAK_LENGTH 10000 +#define RADIOLIB_SSTV_HEADER_BIT_LENGTH 30000 + +/*! + \struct tone_t + \brief Structure to save data about tone. +*/ +struct tone_t { + + /*! + \brief Tone type: GENERIC for sync and porch tones, SCAN_GREEN, SCAN_BLUE and SCAN_RED for scan lines. + */ + enum { + GENERIC = 0, + SCAN_GREEN, + SCAN_BLUE, + SCAN_RED + } type; + + /*! + \brief Length of tone in us, set to 0 for picture scan tones. + */ + uint32_t len; + + /*! + \brief Frequency of tone in Hz, set to 0 for picture scan tones. + */ + uint16_t freq; +}; + +/*! + \struct SSTVMode_t + \brief Structure to save data about supported SSTV modes. +*/ +struct SSTVMode_t { + + /*! + \brief Unique VIS code of the SSTV mode. + */ + uint8_t visCode; + + /*! + \brief Picture width in pixels. + */ + uint16_t width; + + /*! + \brief Picture height in pixels. + */ + uint16_t height; + + /*! + \brief Pixel scan length in us. + */ + uint16_t scanPixelLen; + + /*! + \brief Number of tones in each transmission line. Picture scan data is considered single tone. + */ + uint8_t numTones; + + /*! + \brief Sequence of tones in each transmission line. This is used to create the correct encoding sequence. + */ + tone_t tones[8]; +}; + +// all currently supported SSTV modes +extern const SSTVMode_t Scottie1; +extern const SSTVMode_t Scottie2; +extern const SSTVMode_t ScottieDX; +extern const SSTVMode_t Martin1; +extern const SSTVMode_t Martin2; +extern const SSTVMode_t Wrasse; +extern const SSTVMode_t PasokonP3; +extern const SSTVMode_t PasokonP5; +extern const SSTVMode_t PasokonP7; + +/*! + \class SSTVClient + \brief Client for SSTV transmissions. +*/ +class SSTVClient { + public: + /*! + \brief Constructor for 2-FSK mode. + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + explicit SSTVClient(PhysicalLayer* phy); + + #if !defined(RADIOLIB_EXCLUDE_AFSK) + /*! + \brief Constructor for AFSK mode. + \param audio Pointer to the AFSK instance providing audio. + */ + explicit SSTVClient(AFSKClient* audio); + #endif + + // basic methods + + /*! + \brief Initialization method for 2-FSK. + \param base Base "0 Hz tone" RF frequency to be used in MHz. + \param mode SSTV mode to be used. Currently supported modes are Scottie1, Scottie2, + ScottieDX, Martin1, Martin2, Wrasse, PasokonP3, PasokonP5 and PasokonP7. + \returns \ref status_codes + */ + int16_t begin(float base, const SSTVMode_t& mode); + + #if !defined(RADIOLIB_EXCLUDE_AFSK) + /*! + \brief Initialization method for AFSK. + \param mode SSTV mode to be used. Currently supported modes are Scottie1, Scottie2, + ScottieDX, Martin1, Martin2, Wrasse, PasokonP3, PasokonP5 and PasokonP7. + \returns \ref status_codes + */ + int16_t begin(const SSTVMode_t& mode); + #endif + + /*! + \brief Set correction coefficient for tone length. + \param correction Timing correction factor, used to adjust the length of timing pulses. + Less than 1.0 leads to shorter timing pulses, defaults to 1.0 (no correction). + \returns \ref status_codes + */ + int16_t setCorrection(float correction); + + /*! + \brief Sends out tone at 1900 Hz. + */ + void idle(); + + /*! + \brief Sends synchronization header for the SSTV mode set in begin method. + */ + void sendHeader(); + + /*! + \brief Sends single picture line in the currently configured SSTV mode. + \param imgLine Image line to send, in 24-bit RGB. It is up to the user to ensure that + imgLine has enough pixels to send it in the current SSTV mode. + */ + void sendLine(uint32_t* imgLine); + + /*! + \brief Get picture height of the currently configured SSTV mode. + \returns Picture height of the currently configured SSTV mode in pixels. + */ + uint16_t getPictureHeight() const; + +#if !defined(RADIOLIB_GODMODE) + private: +#endif + PhysicalLayer* phyLayer; + #if !defined(RADIOLIB_EXCLUDE_AFSK) + AFSKClient* audioClient; + #endif + + uint32_t baseFreq = 0; + SSTVMode_t txMode = Scottie1; + bool firstLine = true; + + void tone(float freq, uint32_t len = 0); +}; + +#endif + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/utils/CRC.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/CRC.cpp new file mode 100644 index 00000000..4422942b --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/CRC.cpp @@ -0,0 +1,35 @@ +#include "CRC.h" + +RadioLibCRC::RadioLibCRC() { + +} + +uint32_t RadioLibCRC::checksum(uint8_t* buff, size_t len) { + uint32_t crc = this->init; + size_t pos = 0; + for(size_t i = 0; i < 8*len; i++) { + if(i % 8 == 0) { + uint32_t in = buff[pos++]; + if(this->refIn) { + in = Module::reflect(in, 8); + } + crc ^= (in << (this->size - 8)); + } + + if(crc & ((uint32_t)1 << (this->size - 1))) { + crc <<= (uint32_t)1; + crc ^= this->poly; + } else { + crc <<= (uint32_t)1; + } + } + + crc ^= this->out; + if(this->refOut) { + crc = Module::reflect(crc, this->size); + } + crc &= (uint32_t)0xFFFFFFFF >> (32 - this->size); + return(crc); +} + +RadioLibCRC RadioLibCRCInstance; diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/utils/CRC.h b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/CRC.h new file mode 100644 index 00000000..124fa49d --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/CRC.h @@ -0,0 +1,68 @@ +#if !defined(_RADIOLIB_CRC_H) +#define _RADIOLIB_CRC_H + +#include "../TypeDef.h" +#include "../Module.h" +#if defined(RADIOLIB_BUILD_ARDUINO) +#include "../ArduinoHal.h" +#endif + +// CCITT CRC properties (used by AX.25) +#define RADIOLIB_CRC_CCITT_POLY (0x1021) +#define RADIOLIB_CRC_CCITT_INIT (0xFFFF) +#define RADIOLIB_CRC_CCITT_OUT (0xFFFF) + +/*! + \class RadioLibCRC + \brief Class to calculate CRCs of varying formats. +*/ +class RadioLibCRC { + public: + /*! + \brief CRC size in bits. + */ + uint8_t size; + + /*! + \brief CRC polynomial. + */ + uint32_t poly; + + /*! + \brief Initial value. + */ + uint32_t init; + + /*! + \brief Final XOR value. + */ + uint32_t out; + + /*! + \brief Whether to reflect input bytes. + */ + bool refIn; + + /*! + \brief Whether to reflect the result. + */ + bool refOut; + + /*! + \brief Default constructor. + */ + RadioLibCRC(); + + /*! + \brief Calculate checksum of a buffer. + \param buff Buffer to calculate the checksum over. + \param len Size of the buffer in bytes. + \returns The resulting checksum. + */ + uint32_t checksum(uint8_t* buff, size_t len); +}; + +// the global singleton +extern RadioLibCRC RadioLibCRCInstance; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/utils/Cryptography.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/Cryptography.cpp new file mode 100644 index 00000000..16d1c46d --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/Cryptography.cpp @@ -0,0 +1,294 @@ +#include "Cryptography.h" + +#include + +RadioLibAES128::RadioLibAES128() { + +} + +void RadioLibAES128::init(uint8_t* key) { + this->keyPtr = key; + this->keyExpansion(this->roundKey, key); +} + +size_t RadioLibAES128::encryptECB(uint8_t* in, size_t len, uint8_t* out) { + size_t num_blocks = len / RADIOLIB_AES128_BLOCK_SIZE; + if(len % RADIOLIB_AES128_BLOCK_SIZE) { + num_blocks++; + } + + memset(out, 0x00, RADIOLIB_AES128_BLOCK_SIZE * num_blocks); + memcpy(out, in, len); + + for(size_t i = 0; i < num_blocks; i++) { + this->cipher((state_t*)(out + (RADIOLIB_AES128_BLOCK_SIZE * i)), this->roundKey); + } + + return(num_blocks*RADIOLIB_AES128_BLOCK_SIZE); +} + +size_t RadioLibAES128::decryptECB(uint8_t* in, size_t len, uint8_t* out) { + size_t num_blocks = len / RADIOLIB_AES128_BLOCK_SIZE; + if(len % RADIOLIB_AES128_BLOCK_SIZE) { + num_blocks++; + } + + memset(out, 0x00, RADIOLIB_AES128_BLOCK_SIZE * num_blocks); + memcpy(out, in, len); + + for(size_t i = 0; i < num_blocks; i++) { + this->decipher((state_t*)(out + (RADIOLIB_AES128_BLOCK_SIZE * i)), this->roundKey); + } + + return(num_blocks*RADIOLIB_AES128_BLOCK_SIZE); +} + +void RadioLibAES128::generateCMAC(uint8_t* in, size_t len, uint8_t* cmac) { + uint8_t key1[RADIOLIB_AES128_BLOCK_SIZE]; + uint8_t key2[RADIOLIB_AES128_BLOCK_SIZE]; + this->generateSubkeys(key1, key2); + + size_t num_blocks = len / RADIOLIB_AES128_BLOCK_SIZE; + bool flag = true; + if(len % RADIOLIB_AES128_BLOCK_SIZE) { + num_blocks++; + flag = false; + } + + uint8_t* buff = new uint8_t[num_blocks * RADIOLIB_AES128_BLOCK_SIZE]; + memset(buff, 0, num_blocks * RADIOLIB_AES128_BLOCK_SIZE); + memcpy(buff, in, len); + if (flag) { + this->blockXor(&buff[(num_blocks - 1)*RADIOLIB_AES128_BLOCK_SIZE], &buff[(num_blocks - 1)*RADIOLIB_AES128_BLOCK_SIZE], key1); + } else { + buff[len] = 0x80; + this->blockXor(&buff[(num_blocks - 1)*RADIOLIB_AES128_BLOCK_SIZE], &buff[(num_blocks - 1)*RADIOLIB_AES128_BLOCK_SIZE], key2); + } + + uint8_t X[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + uint8_t Y[RADIOLIB_AES128_BLOCK_SIZE]; + + for(size_t i = 0; i < num_blocks - 1; i++) { + this->blockXor(Y, &buff[i*RADIOLIB_AES128_BLOCK_SIZE], X); + this->encryptECB(Y, RADIOLIB_AES128_BLOCK_SIZE, X); + } + this->blockXor(Y, &buff[(num_blocks - 1)*RADIOLIB_AES128_BLOCK_SIZE], X); + this->encryptECB(Y, RADIOLIB_AES128_BLOCK_SIZE, cmac); + delete[] buff; +} + +bool RadioLibAES128::verifyCMAC(uint8_t* in, size_t len, uint8_t* cmac) { + uint8_t cmacReal[RADIOLIB_AES128_BLOCK_SIZE]; + this->generateCMAC(in, len, cmacReal); + for(size_t i = 0; i < RADIOLIB_AES128_BLOCK_SIZE; i++) { + if((cmacReal[i] != cmac[i])) { + return(false); + } + } + return(true); +} + +void RadioLibAES128::keyExpansion(uint8_t* roundKey, uint8_t* key) { + uint8_t tmp[4]; + + // the first round key is the key itself + for(uint8_t i = 0; i < RADIOLIB_AES128_N_K; i++) { + for(uint8_t j = 0; j < 4; j++) { + roundKey[(i * 4) + j] = key[(i * 4) + j]; + } + } + + // All other round keys are found from the previous round keys. + for(uint8_t i = RADIOLIB_AES128_N_K; i < RADIOLIB_AES128_N_B * (RADIOLIB_AES128_N_R + 1); ++i) { + uint8_t j = (i - 1) * 4; + for(uint8_t k = 0; k < 4; k++) { + tmp[k] = roundKey[j + k]; + } + + if(i % RADIOLIB_AES128_N_K == 0) { + this->rotWord(tmp); + this->subWord(tmp); + tmp[0] = tmp[0] ^ aesRcon[i/RADIOLIB_AES128_N_K]; + } + + j = i * 4; + uint8_t k = (i - RADIOLIB_AES128_N_K) * 4; + for(uint8_t l = 0; l < 4; l++) { + roundKey[j + l] = roundKey[k + l] ^ tmp[l]; + } + } +} + +void RadioLibAES128::cipher(state_t* state, uint8_t* roundKey) { + this->addRoundKey(0, state, roundKey); + for(uint8_t round = 1; round < RADIOLIB_AES128_N_R; round++) { + this->subBytes(state, aesSbox); + this->shiftRows(state, false); + this->mixColumns(state, false); + this->addRoundKey(round, state, roundKey); + } + + this->subBytes(state, aesSbox); + this->shiftRows(state, false); + this->addRoundKey(RADIOLIB_AES128_N_R, state, roundKey); +} + + +void RadioLibAES128::decipher(state_t* state, uint8_t* roundKey) { + this->addRoundKey(RADIOLIB_AES128_N_R, state, roundKey); + for(uint8_t round = RADIOLIB_AES128_N_R - 1; round > 0; --round) { + this->shiftRows(state, true); + this->subBytes(state, aesSboxInv); + this->addRoundKey(round, state, roundKey); + this->mixColumns(state, true); + } + + this->shiftRows(state, true); + this->subBytes(state, aesSboxInv); + this->addRoundKey(0, state, roundKey); +} + +void RadioLibAES128::subWord(uint8_t* word) { + for(size_t i = 0; i < 4; i++) { + word[i] = RADIOLIB_NONVOLATILE_READ_BYTE(&aesSbox[word[i]]); + } +} + +void RadioLibAES128::rotWord(uint8_t* word) { + uint8_t tmp[4]; + memcpy(tmp, word, 4); + for(size_t i = 0; i < 4; i++) { + word[i] = tmp[(i + 1) % 4]; + } +} + +void RadioLibAES128::addRoundKey(uint8_t round, state_t* state, uint8_t* roundKey) { + for(size_t row = 0; row < 4; row++) { + for(size_t col = 0; col < 4; col++) { + (*state)[row][col] ^= roundKey[(round * RADIOLIB_AES128_N_B * 4) + (row * RADIOLIB_AES128_N_B) + col]; + } + } +} + +void RadioLibAES128::blockXor(uint8_t* dst, uint8_t* a, uint8_t* b) { + for(uint8_t j = 0; j < RADIOLIB_AES128_BLOCK_SIZE; j++) { + dst[j] = a[j] ^ b[j]; + } +} + +void RadioLibAES128::blockLeftshift(uint8_t* dst, uint8_t* src) { + uint8_t ovf = 0x00; + for(int8_t i = RADIOLIB_AES128_BLOCK_SIZE - 1; i >= 0; i--) { + dst[i] = src[i] << 1; + dst[i] |= ovf; + ovf = (src[i] & 0x80) ? 1 : 0; + } +} + +void RadioLibAES128::generateSubkeys(uint8_t* key1, uint8_t* key2) { + uint8_t const_Zero[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + + uint8_t const_Rb[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x87 + }; + + uint8_t L[RADIOLIB_AES128_BLOCK_SIZE]; + this->encryptECB(const_Zero, RADIOLIB_AES128_BLOCK_SIZE, L); + this->blockLeftshift(key1, L); + if(L[0] & 0x80) { + this->blockXor(key1, key1, const_Rb); + } + + this->blockLeftshift(key2, key1); + if(key1[0] & 0x80) { + this->blockXor(key2, key2, const_Rb); + } +} + +void RadioLibAES128::subBytes(state_t* state, const uint8_t* box) { + for(size_t row = 0; row < 4; row++) { + for(size_t col = 0; col < 4; col++) { + (*state)[col][row] = RADIOLIB_NONVOLATILE_READ_BYTE(&box[(*state)[col][row]]); + } + } +} + +void RadioLibAES128::shiftRows(state_t* state, bool inv) { + uint8_t tmp[4]; + for(size_t row = 1; row < 4; row++) { + for(size_t col = 0; col < 4; col++) { + if(!inv) { + tmp[col] = (*state)[(row + col) % 4][row]; + } else { + tmp[(row + col) % 4] = (*state)[col][row]; + } + } + for(size_t col = 0; col < 4; col++) { + (*state)[col][row] = tmp[col]; + } + } +} + +void RadioLibAES128::mixColumns(state_t* state, bool inv) { + uint8_t tmp[4]; + uint8_t matmul[][4] = { + 0x02, 0x03, 0x01, 0x01, + 0x01, 0x02, 0x03, 0x01, + 0x01, 0x01, 0x02, 0x03, + 0x03, 0x01, 0x01, 0x02 + }; + if(inv) { + uint8_t matmul_inv[][4] = { + 0x0e, 0x0b, 0x0d, 0x09, + 0x09, 0x0e, 0x0b, 0x0d, + 0x0d, 0x09, 0x0e, 0x0b, + 0x0b, 0x0d, 0x09, 0x0e + }; + memcpy(matmul, matmul_inv, sizeof(matmul_inv)); + } + + for(size_t col = 0; col < 4; col++) { + for(size_t row = 0; row < 4; row++) { + tmp[row] = (*state)[col][row]; + } + for(size_t i = 0; i < 4; i++) { + (*state)[col][i] = 0x00; + for(size_t j = 0; j < 4; j++) { + (*state)[col][i] ^= mul(matmul[i][j], tmp[j]); + } + } + } +} + +uint8_t RadioLibAES128::mul(uint8_t a, uint8_t b) { + uint8_t sb[4]; + uint8_t out = 0; + sb[0] = b; + for(size_t i = 1; i < 4; i++) { + sb[i] = sb[i - 1] << 1; + if (sb[i - 1] & 0x80) { + sb[i] ^= 0x1b; + } + } + for(size_t i = 0; i < 4; i++) { + if(a >> i & 0x01) { + out ^= sb[i]; + } + } + return(out); +} + +RadioLibAES128 RadioLibAES128Instance; diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/utils/Cryptography.h b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/Cryptography.h new file mode 100644 index 00000000..661996c5 --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/Cryptography.h @@ -0,0 +1,174 @@ +#if !defined(_RADIOLIB_CRYPTOGRAPHY_H) +#define _RADIOLIB_CRYPTOGRAPHY_H + +#include "../TypeDef.h" +#include "../Module.h" + +// AES-128 constants +#define RADIOLIB_AES128_BLOCK_SIZE (16) +#define RADIOLIB_AES128_KEY_SIZE (RADIOLIB_AES128_BLOCK_SIZE) +#define RADIOLIB_AES128_N_K ((RADIOLIB_AES128_BLOCK_SIZE) / sizeof(uint32_t)) +#define RADIOLIB_AES128_N_B (4) +#define RADIOLIB_AES128_N_R (10) +#define RADIOLIB_AES128_KEY_EXP_SIZE (176) + +// helper type +typedef uint8_t state_t[4][4]; + +// AES lookup tables +static const uint8_t aesSbox[] RADIOLIB_NONVOLATILE = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +static const uint8_t aesSboxInv[] RADIOLIB_NONVOLATILE = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, + 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, + 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, + 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, + 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, + 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, + 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, + 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, + 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, + 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, + 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, + 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, + 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, + 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, + 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, + 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +}; + +static const uint8_t aesRcon[] = { 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 }; + +/*! + \class RadioLibAES128 + Most of the implementation here is adapted from https://github.com/kokke/tiny-AES-c + Additional code and CMAC calculation is from https://github.com/megrxu/AES-CMAC + \brief Class to perform AES encryption, decryption and CMAC. +*/ +class RadioLibAES128 { + public: + /*! + \brief Default constructor. + */ + RadioLibAES128(); + + /*! + \brief Initialize the AES. + \param key AES key to use. + */ + void init(uint8_t* key); + + /*! + \brief Perform ECB-type AES encryption. + \param in Input plaintext data (unpadded). + \param len Length of the input data. + \param out Buffer to save the output ciphertext into. It is up to the caller + to ensure the buffer is sufficiently large to save the data! + \returns The number of bytes saved into the output buffer. + */ + size_t encryptECB(uint8_t* in, size_t len, uint8_t* out); + + /*! + \brief Perform ECB-type AES decryption. + \param in Input ciphertext data. + \param len Length of the input data. + \param out Buffer to save the output plaintext into. It is up to the caller + to ensure the buffer is sufficiently large to save the data! + \returns The number of bytes saved into the output buffer. + */ + size_t decryptECB(uint8_t* in, size_t len, uint8_t* out); + + /*! + \brief Calculate message authentication code according to RFC4493. + \param in Input data (unpadded). + \param len Length of the input data. + \param cmac Buffer to save the output MAC into. The buffer must be at least 16 bytes long! + */ + void generateCMAC(uint8_t* in, size_t len, uint8_t* cmac); + + /*! + \brief Verify the received CMAC. This just calculates the CMAC again and compares the results. + \param in Input data (unpadded). + \param len Length of the input data. + \param cmac CMAC to verify. + \returns True if valid, false otherwise. + */ + bool verifyCMAC(uint8_t* in, size_t len, uint8_t* cmac); + + private: + uint8_t* keyPtr; + uint8_t roundKey[RADIOLIB_AES128_KEY_EXP_SIZE]; + + void keyExpansion(uint8_t* roundKey, uint8_t* key); + void cipher(state_t* state, uint8_t* roundKey); + void decipher(state_t* state, uint8_t* roundKey); + + void subWord(uint8_t* word); + void rotWord(uint8_t* word); + + void addRoundKey(uint8_t round, state_t* state, uint8_t* roundKey); + + void blockXor(uint8_t* dst, uint8_t* a, uint8_t* b); + void blockLeftshift(uint8_t* dst, uint8_t* src); + void generateSubkeys(uint8_t* key1, uint8_t* key2); + + void subBytes(state_t* state, const uint8_t* box); + void shiftRows(state_t* state, bool inv); + void mixColumns(state_t* state, bool inv); + + uint8_t mul(uint8_t a, uint8_t b); +}; + +// the global singleton +extern RadioLibAES128 RadioLibAES128Instance; + +#endif diff --git a/Code/BITS/BITSv5/radio-test/radiolib-src/utils/FEC.cpp b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/FEC.cpp new file mode 100644 index 00000000..e8cf260e --- /dev/null +++ b/Code/BITS/BITSv5/radio-test/radiolib-src/utils/FEC.cpp @@ -0,0 +1,293 @@ +#include "FEC.h" +#include + +RadioLibBCH::RadioLibBCH() { + +} + +/* + BCH Encoder based on https://www.codeproject.com/articles/13189/pocsag-encoder + + Significantly cleaned up and slightly fixed. +*/ +void RadioLibBCH::begin(uint8_t n, uint8_t k, uint32_t poly) { + this->n = n; + this->k = k; + this->poly = poly; + #if !defined(RADIOLIB_STATIC_ONLY) + this->alphaTo = new int32_t[n + 1]; + this->indexOf = new int32_t[n + 1]; + this->generator = new int32_t[n - k + 1]; + #endif + + // find the maximum power of the polynomial + for(this->m = 0; this->m < 31; this->m++) { + if((poly >> this->m) == 1) { + break; + } + } + + /* + * generate GF(2**m) from the irreducible polynomial p(X) in p[0]..p[m] + * lookup tables: index->polynomial form this->alphaTo[] contains j=alpha**i; + * polynomial form -> index form this->indexOf[j=alpha**i] = i alpha=2 is the + * primitive element of GF(2**m) + */ + + int32_t mask = 1; + this->alphaTo[this->m] = 0; + + for(uint8_t i = 0; i < this->m; i++) { + this->alphaTo[i] = mask; + + this->indexOf[this->alphaTo[i]] = i; + + if(this->poly & ((uint32_t)0x01 << i)) { + this->alphaTo[this->m] ^= mask; + } + + mask <<= 1; + } + + this->indexOf[this->alphaTo[this->m]] = this->m; + mask >>= 1; + + for(uint8_t i = this->m + 1; i < this->n; i++) { + if(this->alphaTo[i - 1] >= mask) { + this->alphaTo[i] = this->alphaTo[this->m] ^ ((this->alphaTo[i - 1] ^ mask) << 1); + } else { + this->alphaTo[i] = this->alphaTo[i - 1] << 1; + } + + this->indexOf[this->alphaTo[i]] = i; + } + + this->indexOf[0] = -1; + + /* + * Compute generator polynomial of BCH code of length = 31, redundancy = 10 + * (OK, this is not very efficient, but we only do it once, right? :) + */ + + int32_t ii = 0; + int32_t jj = 1; + int32_t ll = 0; + int32_t kaux = 0; + bool test = false; + int32_t aux = 0; + int32_t cycle[15][6] = { { 0 } }; + int32_t size[15] = { 0 }; + + // Generate cycle sets modulo 31 + cycle[0][0] = 0; size[0] = 1; + cycle[1][0] = 1; size[1] = 1; + + do { + // Generate the jj-th cycle set + ii = 0; + do { + ii++; + cycle[jj][ii] = (cycle[jj][ii - 1] * 2) % this->n; + size[jj]++; + aux = (cycle[jj][ii] * 2) % this->n; + } while(aux != cycle[jj][0]); + + // Next cycle set representative + ll = 0; + do { + ll++; + test = false; + for(ii = 1; ((ii <= jj) && !test); ii++) { + // Examine previous cycle sets + for(kaux = 0; ((kaux < size[ii]) && !test); kaux++) { + test = (ll == cycle[ii][kaux]); + } + } + } while(test && (ll < (this->n - 1))); + + if(!test) { + jj++; // next cycle set index + cycle[jj][0] = ll; + size[jj] = 1; + } + + } while(ll < (this->n - 1)); + + // Search for roots 1, 2, ..., m-1 in cycle sets + int32_t rdncy = 0; + #if defined(RADIOLIB_STATIC_ONLY) + int32_t min[RADIOLIB_BCH_MAX_N - RADIOLIB_BCH_MAX_K + 1]; + #else + int32_t* min = new int32_t[this->n - this->k + 1]; + #endif + kaux = 0; + + for(ii = 1; ii <= jj; ii++) { + min[kaux] = 0; + for(jj = 0; jj < size[ii]; jj++) { + for(uint8_t root = 1; root < this->m; root++) { + if(root == cycle[ii][jj]) { + min[kaux] = ii; + } + } + } + + if(min[kaux]) { + rdncy += size[min[kaux]]; + kaux++; + } + } + + int32_t noterms = kaux; + #if defined(RADIOLIB_STATIC_ONLY) + int32_t zeros[RADIOLIB_BCH_MAX_N - RADIOLIB_BCH_MAX_K + 1]; + #else + int32_t* zeros = new int32_t[this->n - this->k + 1]; + #endif + kaux = 1; + + for(ii = 0; ii < noterms; ii++) { + for(jj = 0; jj < size[min[ii]]; jj++) { + zeros[kaux] = cycle[min[ii]][jj]; + kaux++; + } + } + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] min; + #endif + + // Compute generator polynomial + this->generator[0] = this->alphaTo[zeros[1]]; + this->generator[1] = 1; // g(x) = (X + zeros[1]) initially + + for(ii = 2; ii <= rdncy; ii++) { + this->generator[ii] = 1; + for(jj = ii - 1; jj > 0; jj--) { + if(this->generator[jj] != 0) { + this->generator[jj] = this->generator[jj - 1] ^ this->alphaTo[(this->indexOf[this->generator[jj]] + zeros[ii]) % this->n]; + } else { + this->generator[jj] = this->generator[jj - 1]; + } + } + this->generator[0] = this->alphaTo[(this->indexOf[this->generator[0]] + zeros[ii]) % this->n]; + } + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] zeros; + #endif +} + +/* + BCH Encoder based on https://www.codeproject.com/articles/13189/pocsag-encoder + + Significantly cleaned up and slightly fixed. +*/ +uint32_t RadioLibBCH::encode(uint32_t dataword) { + // we only use the "k" most significant bits + #if defined(RADIOLIB_STATIC_ONLY) + int32_t data[RADIOLIB_BCH_MAX_K]; + #else + int32_t* data = new int32_t[this->k]; + #endif + int32_t j1 = 0; + for(int32_t i = this->n; i > (this->n - this->k); i--) { + if(dataword & ((uint32_t)1<n]; + #endif + memset(Mr, 0x00, this->n*sizeof(int32_t)); + + // copy the contents of data into Mr and add the zeros + memcpy(Mr, data, this->k*sizeof(int32_t)); + + int32_t j = 0; + int32_t start = 0; + int32_t end = this->n - this->k; + while(end < this->n) { + for(int32_t i = end; i > start-2; --i) { + if(Mr[start]) { + Mr[i] ^= this->generator[j]; + ++j; + } else { + ++start; + j = 0; + end = start + this->n - this->k; + break; + } + } + } + + #if defined(RADIOLIB_STATIC_ONLY) + int32_t bb[RADIOLIB_BCH_MAX_N - RADIOLIB_BCH_MAX_K + 1]; + #else + int32_t* bb = new int32_t[this->n - this->k + 1]; + #endif + j = 0; + for(int32_t i = start; i < end; ++i) { + bb[j] = Mr[i]; + ++j; + } + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] Mr; + #endif + + int32_t iEvenParity = 0; + #if defined(RADIOLIB_STATIC_ONLY) + int32_t recd[RADIOLIB_BCH_MAX_N + 1]; + #else + int32_t* recd = new int32_t[this->n + 1]; + #endif + for(uint8_t i = 0; i < this->k; i++) { + recd[this->n - i] = data[i]; + if(data[i] == 1) { + iEvenParity++; + } + } + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] data; + #endif + + for(uint8_t i = 0; i < this->n - this->k + 1; i++) { + recd[this->n - this->k - i] = bb[i]; + if(bb[i] == 1) { + iEvenParity++; + } + } + + #if !defined(RADIOLIB_STATIC_ONLY) + delete[] bb; + #endif + + if((iEvenParity % 2) == 0) { + recd[0] = 0; + } else { + recd[0] = 1; + } + + int32_t res = 0; + for(int32_t i = 0; i < this->n + 1; i++) { + if(recd[i]) { + res |= ((uint32_t)1< + +#include "hardware/gpio.h" +#include "hardware/spi.h" +#include "pico/stdlib.h" + +SX126x::SX126x(int spiSelect, int reset, int busy, int interrupt) { + SX126x_SPI_SELECT = spiSelect; + SX126x_RESET = reset; + SX126x_BUSY = busy; + SX126x_INT0 = interrupt; + + txActive = false; + + gpio_init(SX126x_SPI_SELECT); + gpio_set_dir(SX126x_SPI_SELECT, GPIO_OUT); + + gpio_init(SX126x_RESET); + gpio_set_dir(SX126x_RESET, GPIO_OUT); + + gpio_init(SX126x_BUSY); + gpio_set_dir(SX126x_BUSY, GPIO_IN); + + gpio_init(SX126x_INT0); + gpio_set_dir(SX126x_INT0, GPIO_IN); + + spi_init(spi0, 2000000); +} + +int16_t SX126x::begin(uint8_t packetType, uint32_t frequencyInHz, + int8_t txPowerInDbm) { + if (txPowerInDbm > 22) txPowerInDbm = 22; + if (txPowerInDbm < -3) txPowerInDbm = -3; + + Reset(); + + if (0x2A != GetStatus()) { + // Serial.println("SX126x error, maybe no SPI connection?"); + return ERR_INVALID_MODE; + } + SetStandby(SX126X_STANDBY_RC); + + SetDio3AsTcxoCtrl( + SX126X_DIO3_OUTPUT_3_3, + RADIO_TCXO_SETUP_TIME << 6); // convert from ms to SX126x time base + + Calibrate(SX126X_CALIBRATE_IMAGE_ON | SX126X_CALIBRATE_ADC_BULK_P_ON | + SX126X_CALIBRATE_ADC_BULK_N_ON | SX126X_CALIBRATE_ADC_PULSE_ON | + SX126X_CALIBRATE_PLL_ON | SX126X_CALIBRATE_RC13M_ON | + SX126X_CALIBRATE_RC64K_ON); + + SetDio2AsRfSwitchCtrl(true); + + SetStandby(SX126X_STANDBY_RC); + SetRegulatorMode(SX126X_REGULATOR_DC_DC); + SetBufferBaseAddress(0, 0); + SetPaConfig(0x04, 0x07, 0x00, 0x01); + SetOvercurrentProtection(0x38); // current max 30mA for the whole device + SetPowerConfig(txPowerInDbm, SX126X_PA_RAMP_200U); // 0 fuer Empfaenger + SetDioIrqParams(SX126X_IRQ_ALL, // all interrupts enabled + (SX126X_IRQ_RX_DONE | SX126X_IRQ_TX_DONE | + SX126X_IRQ_TIMEOUT), // interrupts on DIO1 + SX126X_IRQ_NONE, // interrupts on DIO2 + SX126X_IRQ_NONE); // interrupts on DIO3 + + SetRfFrequency(frequencyInHz); +} + +int16_t SX126x::LoRaConfig(uint8_t spreadingFactor, uint8_t bandwidth, + uint8_t codingRate, uint16_t preambleLength, + uint8_t payloadLen, bool crcOn, bool invertIrq) { + uint8_t ldro; // LowDataRateOptimize + + SetStopRxTimerOnPreambleDetect(false); + SetLoRaSymbNumTimeout(0); + SetPacketType( + SX126X_PACKET_TYPE_LORA); // RadioSetModem( ( + // SX126x.ModulationParams.PacketType + // == PACKET_TYPE_GFSK ) ? + // MODEM_FSK : MODEM_LORA ); + SetModulationParams(spreadingFactor, bandwidth, codingRate, ldro); + + PacketParams[0] = (preambleLength >> 8) & 0xFF; + PacketParams[1] = preambleLength; + if (payloadLen) { + // fixed payload length + PacketParams[2] = 0x01; + PacketParams[3] = payloadLen; + } else { + PacketParams[2] = 0x00; + PacketParams[3] = 0xFF; + } + + if (crcOn) + PacketParams[4] = 0x01; + else + PacketParams[4] = 0x00; + + if (invertIrq) + PacketParams[5] = 0x01; + else + PacketParams[5] = 0x00; + + SPIwriteCommand(SX126X_CMD_SET_PACKET_PARAMS, PacketParams, 6); + SetDioIrqParams(SX126X_IRQ_ALL, // all interrupts enabled + (SX126X_IRQ_RX_DONE | SX126X_IRQ_TX_DONE, + SX126X_IRQ_TIMEOUT), // interrupts on DIO1 + SX126X_IRQ_NONE, // interrupts on DIO2 + SX126X_IRQ_NONE); + // receive state no receive timeoout + SetRx(0xFFFFFF); +} + +uint8_t SX126x::Receive(uint8_t *pData, uint16_t len) { + uint8_t rxLen = 0; + uint16_t irqRegs = GetIrqStatus(); + + if (irqRegs & SX126X_IRQ_RX_DONE) { + ClearIrqStatus(SX126X_IRQ_RX_DONE); + ReadBuffer(pData, &rxLen, len); + } + + return rxLen; +} + +bool SX126x::Send(uint8_t *pData, uint8_t len, uint8_t mode) { + uint16_t irq; + bool rv = false; + + if (txActive == false) { + txActive = true; + PacketParams[2] = 0x00; // Variable length packet (explicit header) + PacketParams[3] = len; + SPIwriteCommand(SX126X_CMD_SET_PACKET_PARAMS, PacketParams, 6); + + ClearIrqStatus(SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT); + + WriteBuffer(pData, len); + SetTx(500); + + if (mode & SX126x_TXMODE_SYNC) { + irq = GetIrqStatus(); + while ((!(irq & SX126X_IRQ_TX_DONE)) && + (!(irq & SX126X_IRQ_TIMEOUT))) { + irq = GetIrqStatus(); + } + txActive = false; + + SetRx(0xFFFFFF); + + if (irq != SX126X_IRQ_TIMEOUT) rv = true; + } else { + rv = true; + } + } + + return rv; +} + +bool SX126x::ReceiveMode(void) { + uint16_t irq; + bool rv = false; + + if (txActive == false) { + rv = true; + } else { + irq = GetIrqStatus(); + if (irq & (SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT)) { + SetRx(0xFFFFFF); + txActive = false; + rv = true; + } + } + + return rv; +} + +void SX126x::ReceiveStatus(uint8_t *rssiPacket, uint8_t *snrPacket) { + uint8_t buf[3]; + + SPIreadCommand(SX126X_CMD_GET_PACKET_STATUS, buf, 3); + + (buf[1] < 128) ? (*snrPacket = buf[1] >> 2) + : (*snrPacket = ((buf[1] - 256) >> 2)); + *rssiPacket = -buf[0] >> 1; +} + +void SX126x::SetTxPower(int8_t txPowerInDbm) { + SetPowerConfig(txPowerInDbm, SX126X_PA_RAMP_200U); +} + +void SX126x::Reset(void) { + sleep_ms(10); + gpio_put(SX126x_RESET, false); + sleep_ms(20); + gpio_put(SX126x_RESET, true); + sleep_ms(10); + while (gpio_get(SX126x_BUSY)) + ; +} + +void SX126x::Wakeup(void) { GetStatus(); } + +//---------------------------------------------------------------------------------------------------------------------------- +// The command SetStandby(...) is used to set the device in a configuration +// mode which is at an intermediate level of consumption. In this mode, the +// chip is placed in halt mode waiting for instructions via SPI. This mode is +// dedicated to chip configuration using high level commands such as +// SetPacketType(...). By default, after battery insertion or reset operation +// (pin NRESET goes low), the chip will enter in STDBY_RC mode running with a +// 13 MHz RC clock +// +// Parameters +// ---------- +// 0: Device running on RC13M, set STDBY_RC mode +// 1: Device running on XTAL 32MHz, set STDBY_XOSC mode +// +// Return value +// ------------ +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetStandby(uint8_t mode) { + uint8_t data = mode; + SPIwriteCommand(SX126X_CMD_SET_STANDBY, &data, 1); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The host can retrieve chip status directly through the command GetStatus() : +// this command can be issued at any time and the device returns the status of +// the device. The command GetStatus() is not strictly necessary since device +// returns status information also on command bytes. +// +// Parameters: +// none +// +// Return value: +// Bit 6:4 Chipmode:0x0: Unused +// Bit 3:1 Command Status +// Bit 0: unused +// Bit 7: unused +//---------------------------------------------------------------------------------------------------------------------------- +uint8_t SX126x::GetStatus(void) { + uint8_t rv; + SPIreadCommand(SX126X_CMD_GET_STATUS, &rv, 1); + return rv; +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The BUSY line is mandatory to ensure the host controller is ready to accept +// SPI commands. When BUSY is high, the host controller must wait until it goes +// down again before sending another command. +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::WaitOnBusy(void) { + while (gpio_get(SX126x_BUSY) == 1) + ; +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetDio3AsTcxoCtrl(uint8_t tcxoVoltage, uint32_t timeout) { + uint8_t buf[4]; + + buf[0] = tcxoVoltage & 0x07; + buf[1] = (uint8_t)((timeout >> 16) & 0xFF); + buf[2] = (uint8_t)((timeout >> 8) & 0xFF); + buf[3] = (uint8_t)(timeout & 0xFF); + + SPIwriteCommand(SX126X_CMD_SET_DIO3_AS_TCXO_CTRL, buf, 4); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::Calibrate(uint8_t calibParam) { + uint8_t data = calibParam; + SPIwriteCommand(SX126X_CMD_CALIBRATE, &data, 1); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetDio2AsRfSwitchCtrl(uint8_t enable) { + uint8_t data = enable; + SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, &data, 1); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetRfFrequency(uint32_t frequency) { + uint8_t buf[4]; + uint32_t freq = 0; + + CalibrateImage(frequency); + + freq = (uint32_t)((double)frequency / (double)FREQ_STEP); + buf[0] = (uint8_t)((freq >> 24) & 0xFF); + buf[1] = (uint8_t)((freq >> 16) & 0xFF); + buf[2] = (uint8_t)((freq >> 8) & 0xFF); + buf[3] = (uint8_t)(freq & 0xFF); + SPIwriteCommand(SX126X_CMD_SET_RF_FREQUENCY, buf, 4); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::CalibrateImage(uint32_t frequency) { + uint8_t calFreq[2]; + + if (frequency > 900000000) { + calFreq[0] = 0xE1; + calFreq[1] = 0xE9; + } else if (frequency > 850000000) { + calFreq[0] = 0xD7; + calFreq[1] = 0xD8; + } else if (frequency > 770000000) { + calFreq[0] = 0xC1; + calFreq[1] = 0xC5; + } else if (frequency > 460000000) { + calFreq[0] = 0x75; + calFreq[1] = 0x81; + } else if (frequency > 425000000) { + calFreq[0] = 0x6B; + calFreq[1] = 0x6F; + } + SPIwriteCommand(SX126X_CMD_CALIBRATE_IMAGE, calFreq, 2); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetRegulatorMode(uint8_t mode) { + uint8_t data = mode; + SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, &data, 1); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetBufferBaseAddress(uint8_t txBaseAddress, + uint8_t rxBaseAddress) { + uint8_t buf[2]; + + buf[0] = txBaseAddress; + buf[1] = rxBaseAddress; + SPIwriteCommand(SX126X_CMD_SET_BUFFER_BASE_ADDRESS, buf, 2); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetPowerConfig(int8_t power, uint8_t rampTime) { + uint8_t buf[2]; + + if (power > 22) { + power = 22; + } else if (power < -3) { + power = -3; + } + + buf[0] = power; + buf[1] = (uint8_t)rampTime; + SPIwriteCommand(SX126X_CMD_SET_TX_PARAMS, buf, 2); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetPaConfig(uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, + uint8_t paLut) { + uint8_t buf[4]; + + buf[0] = paDutyCycle; + buf[1] = hpMax; + buf[2] = deviceSel; + buf[3] = paLut; + SPIwriteCommand(SX126X_CMD_SET_PA_CONFIG, buf, 4); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The OCP is configurable by steps of 2.5 mA and the default value is +// re-configured automatically each time the function SetPaConfig(...) is +// called. If the user wants to adjust the OCP value, it is necessary to change +// the register as a second step after calling the function SetPaConfig. +// +// Parameters: +// value: steps of 2,5mA (0x18 = 60mA) +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetOvercurrentProtection(uint8_t value) { + uint8_t buf[3]; + + buf[0] = ((SX126X_REG_OCP_CONFIGURATION & 0xFF00) >> 8); + buf[1] = (SX126X_REG_OCP_CONFIGURATION & 0x00FF); + buf[2] = value; + SPIwriteCommand(SX126X_CMD_WRITE_REGISTER, buf, 3); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, + uint16_t dio2Mask, uint16_t dio3Mask) { + uint8_t buf[8]; + + buf[0] = (uint8_t)((irqMask >> 8) & 0x00FF); + buf[1] = (uint8_t)(irqMask & 0x00FF); + buf[2] = (uint8_t)((dio1Mask >> 8) & 0x00FF); + buf[3] = (uint8_t)(dio1Mask & 0x00FF); + buf[4] = (uint8_t)((dio2Mask >> 8) & 0x00FF); + buf[5] = (uint8_t)(dio2Mask & 0x00FF); + buf[6] = (uint8_t)((dio3Mask >> 8) & 0x00FF); + buf[7] = (uint8_t)(dio3Mask & 0x00FF); + SPIwriteCommand(SX126X_CMD_SET_DIO_IRQ_PARAMS, buf, 8); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetStopRxTimerOnPreambleDetect(bool enable) { + uint8_t data = (uint8_t)enable; + SPIwriteCommand(SX126X_CMD_STOP_TIMER_ON_PREAMBLE, &data, 1); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// In LoRa mode, when going into Rx, the modem will lock as soon as a LoRa® +// symbol has been detected which may lead to false detection. This phenomena +// is quite rare but nevertheless possible. To avoid this, the command +// SetLoRaSymbNumTimeout can be used to define the number of symbols which will +// be used to validate the correct reception of a packet. +// +// Parameters: +// 0: validate the reception as soon as a LoRa® Symbol has been detected +// 1..255: When SymbNum is different from 0, the modem will wait for a total of +// SymbNum LoRa® symbol to validate, or not, the +// correct detection of a LoRa packet. If the various states of the +// demodulator are not locked at this moment, the radio will generate +// the RxTimeout IRQ. +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetLoRaSymbNumTimeout(uint8_t SymbNum) { + uint8_t data = SymbNum; + SPIwriteCommand(SX126X_CMD_SET_LORA_SYMB_NUM_TIMEOUT, &data, 1); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetPacketType(uint8_t packetType) { + uint8_t data = packetType; + SPIwriteCommand(SX126X_CMD_SET_PACKET_TYPE, &data, 1); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetModulationParams(uint8_t spreadingFactor, uint8_t bandwidth, + uint8_t codingRate, + uint8_t lowDataRateOptimize) { + uint8_t data[4]; + // currently only LoRa supported + data[0] = spreadingFactor; + data[1] = bandwidth; + data[2] = codingRate; + data[3] = lowDataRateOptimize; + SPIwriteCommand(SX126X_CMD_SET_MODULATION_PARAMS, data, 4); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +uint16_t SX126x::GetIrqStatus(void) { + uint8_t data[2]; + SPIreadCommand(SX126X_CMD_GET_IRQ_STATUS, data, 2); + return (data[0] << 8) | data[1]; +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::ClearIrqStatus(uint16_t irq) { + uint8_t buf[2]; + + buf[0] = (uint8_t)(((uint16_t)irq >> 8) & 0x00FF); + buf[1] = (uint8_t)((uint16_t)irq & 0x00FF); + SPIwriteCommand(SX126X_CMD_CLEAR_IRQ_STATUS, buf, 2); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetRx(uint32_t timeout) { + uint8_t buf[3]; + + buf[0] = (uint8_t)((timeout >> 16) & 0xFF); + buf[1] = (uint8_t)((timeout >> 8) & 0xFF); + buf[2] = (uint8_t)(timeout & 0xFF); + SPIwriteCommand(SX126X_CMD_SET_RX, buf, 3); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command SetTx() sets the device in transmit mode. When the last bit of +// the packet has been sent, an IRQ TX_DONE is generated. A TIMEOUT IRQ is +// triggered if the TX_DONE IRQ is not generated within the given timeout +// period. The chip goes back to STBY_RC mode after a TIMEOUT IRQ or a TX_DONE +// IRQ. he timeout duration can be computed with the formula: Timeout duration +// = Timeout * 15.625 μs +// +// Parameters: +// 0: Timeout disable, Tx Single mode, the device will stay in TX Mode until +// the packet is transmitted other: Timeout in milliseconds, timeout active, +// the device remains in TX mode. The maximum timeout is then 262 s. +// +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::SetTx(uint32_t timeoutInMs) { + uint8_t buf[3]; + uint32_t tout = (uint32_t)(timeoutInMs * 0.015625); + buf[0] = (uint8_t)((tout >> 16) & 0xFF); + buf[1] = (uint8_t)((tout >> 8) & 0xFF); + buf[2] = (uint8_t)(tout & 0xFF); + SPIwriteCommand(SX126X_CMD_SET_TX, buf, 3); +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +void SX126x::GetRxBufferStatus(uint8_t *payloadLength, + uint8_t *rxStartBufferPointer) { + uint8_t buf[2]; + + SPIreadCommand(SX126X_CMD_GET_RX_BUFFER_STATUS, buf, 2); + + *payloadLength = buf[0]; + *rxStartBufferPointer = buf[1]; +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +uint8_t SX126x::ReadBuffer(uint8_t *rxData, uint8_t *rxDataLen, + uint8_t maxLen) { + uint8_t offset = 0; + + GetRxBufferStatus(rxDataLen, &offset); + if (*rxDataLen > maxLen) { + return 1; + } + + while (gpio_get(SX126x_BUSY)) + ; + + gpio_put(SX126x_SPI_SELECT, false); + // SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); + + uint8_t temp1 = SX126X_CMD_READ_BUFFER; + uint8_t temp2 = SX126X_CMD_NOP; + + spi_write_blocking(spi0, &temp1, 1); + spi_write_blocking(spi0, &offset, 1); + spi_write_blocking(spi0, &temp1, 1); + + for (uint16_t i = 0; i < *rxDataLen; i++) { + spi_write_read_blocking(spi0, &temp2, &rxData[i], 1); + } + gpio_put(SX126x_SPI_SELECT, true); + + while (gpio_get(SX126x_BUSY)) + ; + + return 0; +} + +//---------------------------------------------------------------------------------------------------------------------------- +// The command... +// +// Parameters: +// none +// +// +// Return value: +// none +// +//---------------------------------------------------------------------------------------------------------------------------- +uint8_t SX126x::WriteBuffer(uint8_t *txData, uint8_t txDataLen) { + // Serial.print("SPI write: CMD=0x"); + // Serial.print(SX126X_CMD_WRITE_BUFFER, HEX); + // Serial.print(" DataOut: "); + gpio_put(SX126x_SPI_SELECT, false); + // SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); + const uint8_t temp1 = SX126X_CMD_WRITE_BUFFER; + + spi_write_blocking(spi0, &temp1, 1); + spi_write_blocking(spi0, 0, 1); + // Serial.print(" 0 "); + for (uint16_t i = 0; i < txDataLen; i++) { + // Serial.print(txData[i]); + // Serial.print(" "); + spi_write_blocking(spi0, &txData[i], 2); + } + gpio_put(SX126x_SPI_SELECT, true); + // Serial.println(""); + while (gpio_get(SX126x_BUSY)) + ; + + return 0; +} + +void SX126x::SPIwriteCommand(uint8_t cmd, uint8_t *data, uint8_t numBytes, + bool waitForBusy) { + SPItransfer(cmd, true, data, NULL, numBytes, waitForBusy); +} + +void SX126x::SPIreadCommand(uint8_t cmd, uint8_t *data, uint8_t numBytes, + bool waitForBusy) { + SPItransfer(cmd, false, NULL, data, numBytes, waitForBusy); +} + +void SX126x::SPItransfer(uint8_t cmd, bool write, uint8_t *dataOut, + uint8_t *dataIn, uint8_t numBytes, bool waitForBusy) { + // ensure BUSY is low (state meachine ready) + // TODO timeout + while (gpio_get(SX126x_BUSY)) + ; + + // start transfer + gpio_put(SX126x_SPI_SELECT, false); + // SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); + + // send command byte + spi_write_blocking(spi0, &cmd, 1); + + // send/receive all bytes + if (write) { + // Serial.print("SPI write: CMD=0x"); + // Serial.print(cmd, HEX); + // Serial.print(" DataOut: "); + for (uint8_t n = 0; n < numBytes; n++) { + uint8_t in = 0; + spi_write_read_blocking(spi0, &in, &dataOut[n], 1); + // Serial.print(dataOut[n], HEX); + // Serial.print(" "); + } + // Serial.println(); + } else { + // Serial.print("SPI read: CMD=0x"); + // Serial.print(cmd, HEX); + // skip the first byte for read-type commands (status-only) + uint8_t in = 0; + spi_write_read_blocking(spi0, &in, SX126X_CMD_NOP, 1); + ////Serial.println((SX126X_CMD_NOP, HEX)); + // Serial.print(" DataIn: "); + + for (uint8_t n = 0; n < numBytes; n++) { + spi_write_read_blocking(spi0, &dataIn[n], SX126X_CMD_NOP, 1); + ////Serial.println((SX126X_CMD_NOP, HEX)); + // Serial.print(dataIn[n], HEX); + // Serial.print(" "); + } + // Serial.println(); + } + + // stop transfer + spi_deinit(spi0); + gpio_put(SX126x_SPI_SELECT, true); + + // wait for BUSY to go high and then low + // TODO timeout + if (waitForBusy) { + sleep_us(1); + while (gpio_get(SX126x_BUSY)) + ; + } +} diff --git a/Code/BITS/BITSv5/test/SX126x.h b/Code/BITS/BITSv5/test/SX126x.h new file mode 100644 index 00000000..8f2a8272 --- /dev/null +++ b/Code/BITS/BITSv5/test/SX126x.h @@ -0,0 +1,512 @@ +#ifndef _SX126X_H +#define _SX126X_H + +#include "pico/stdlib.h" + +// return values +#define ERR_NONE 0 +#define ERR_PACKET_TOO_LONG 1 +#define ERR_UNKNOWN 2 +#define ERR_TX_TIMEOUT 3 +#define ERR_RX_TIMEOUT 4 +#define ERR_CRC_MISMATCH 5 +#define ERR_WRONG_MODEM 6 +#define ERR_INVALID_BANDWIDTH 7 +#define ERR_INVALID_SPREADING_FACTOR 8 +#define ERR_INVALID_CODING_RATE 9 +#define ERR_INVALID_FREQUENCY_DEVIATION 10 +#define ERR_INVALID_BIT_RATE 11 +#define ERR_INVALID_RX_BANDWIDTH 12 +#define ERR_INVALID_DATA_SHAPING 13 +#define ERR_INVALID_SYNC_WORD 14 +#define ERR_INVALID_OUTPUT_POWER 15 +#define ERR_INVALID_MODE 16 + +// SX126X physical layer properties +#define XTAL_FREQ (double)32000000 +#define FREQ_DIV (double)pow(2.0, 25.0) +#define FREQ_STEP (double)(XTAL_FREQ / FREQ_DIV) + +// SX126X SPI commands +// operational modes commands +#define SX126X_CMD_NOP 0x00 +#define SX126X_CMD_SET_SLEEP 0x84 +#define SX126X_CMD_SET_STANDBY 0x80 +#define SX126X_CMD_SET_FS 0xC1 +#define SX126X_CMD_SET_TX 0x83 +#define SX126X_CMD_SET_RX 0x82 +#define SX126X_CMD_STOP_TIMER_ON_PREAMBLE 0x9F +#define SX126X_CMD_SET_RX_DUTY_CYCLE 0x94 +#define SX126X_CMD_SET_CAD 0xC5 +#define SX126X_CMD_SET_TX_CONTINUOUS_WAVE 0xD1 +#define SX126X_CMD_SET_TX_INFINITE_PREAMBLE 0xD2 +#define SX126X_CMD_SET_REGULATOR_MODE 0x96 +#define SX126X_CMD_CALIBRATE 0x89 +#define SX126X_CMD_CALIBRATE_IMAGE 0x98 +#define SX126X_CMD_SET_PA_CONFIG 0x95 +#define SX126X_CMD_SET_RX_TX_FALLBACK_MODE 0x93 + +// register and buffer access commands +#define SX126X_CMD_WRITE_REGISTER 0x0D +#define SX126X_CMD_READ_REGISTER 0x1D +#define SX126X_CMD_WRITE_BUFFER 0x0E +#define SX126X_CMD_READ_BUFFER 0x1E + +// DIO and IRQ control +#define SX126X_CMD_SET_DIO_IRQ_PARAMS 0x08 +#define SX126X_CMD_GET_IRQ_STATUS 0x12 +#define SX126X_CMD_CLEAR_IRQ_STATUS 0x02 +#define SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL 0x9D +#define SX126X_CMD_SET_DIO3_AS_TCXO_CTRL 0x97 + +// RF, modulation and packet commands +#define SX126X_CMD_SET_RF_FREQUENCY 0x86 +#define SX126X_CMD_SET_PACKET_TYPE 0x8A +#define SX126X_CMD_GET_PACKET_TYPE 0x11 +#define SX126X_CMD_SET_TX_PARAMS 0x8E +#define SX126X_CMD_SET_MODULATION_PARAMS 0x8B +#define SX126X_CMD_SET_PACKET_PARAMS 0x8C +#define SX126X_CMD_SET_CAD_PARAMS 0x88 +#define SX126X_CMD_SET_BUFFER_BASE_ADDRESS 0x8F +#define SX126X_CMD_SET_LORA_SYMB_NUM_TIMEOUT 0xA0 + +#define SX126X_PA_CONFIG_SX1261 0x01 +#define SX126X_PA_CONFIG_SX1262 0x00 + +// status commands +#define SX126X_CMD_GET_STATUS 0xC0 +#define SX126X_CMD_GET_RSSI_INST 0x15 +#define SX126X_CMD_GET_RX_BUFFER_STATUS 0x13 +#define SX126X_CMD_GET_PACKET_STATUS 0x14 +#define SX126X_CMD_GET_DEVICE_ERRORS 0x17 +#define SX126X_CMD_CLEAR_DEVICE_ERRORS 0x07 +#define SX126X_CMD_GET_STATS 0x10 +#define SX126X_CMD_RESET_STATS 0x00 + +// SX126X register map +#define SX126X_REG_WHITENING_INITIAL_MSB 0x06B8 +#define SX126X_REG_WHITENING_INITIAL_LSB 0x06B9 +#define SX126X_REG_CRC_INITIAL_MSB 0x06BC +#define SX126X_REG_CRC_INITIAL_LSB 0x06BD +#define SX126X_REG_CRC_POLYNOMIAL_MSB 0x06BE +#define SX126X_REG_CRC_POLYNOMIAL_LSB 0x06BF +#define SX126X_REG_SYNC_WORD_0 0x06C0 +#define SX126X_REG_SYNC_WORD_1 0x06C1 +#define SX126X_REG_SYNC_WORD_2 0x06C2 +#define SX126X_REG_SYNC_WORD_3 0x06C3 +#define SX126X_REG_SYNC_WORD_4 0x06C4 +#define SX126X_REG_SYNC_WORD_5 0x06C5 +#define SX126X_REG_SYNC_WORD_6 0x06C6 +#define SX126X_REG_SYNC_WORD_7 0x06C7 +#define SX126X_REG_NODE_ADDRESS 0x06CD +#define SX126X_REG_BROADCAST_ADDRESS 0x06CE +#define SX126X_REG_LORA_SYNC_WORD_MSB 0x0740 +#define SX126X_REG_LORA_SYNC_WORD_LSB 0x0741 +#define SX126X_REG_RANDOM_NUMBER_0 0x0819 +#define SX126X_REG_RANDOM_NUMBER_1 0x081A +#define SX126X_REG_RANDOM_NUMBER_2 0x081B +#define SX126X_REG_RANDOM_NUMBER_3 0x081C +#define SX126X_REG_RX_GAIN 0x08AC +#define SX126X_REG_OCP_CONFIGURATION 0x08E7 +#define SX126X_REG_XTA_TRIM 0x0911 +#define SX126X_REG_XTB_TRIM 0x0912 + +// SX126X SPI command variables +// SX126X_CMD_SET_SLEEP +#define SX126X_SLEEP_START_COLD \ + 0b00000000 // 2 2 sleep mode: cold start, configuration is lost + // (default) +#define SX126X_SLEEP_START_WARM \ + 0b00000100 // 2 2 warm start, configuration is + // retained +#define SX126X_SLEEP_RTC_OFF \ + 0b00000000 // 0 0 wake on RTC timeout: disabled +#define SX126X_SLEEP_RTC_ON \ + 0b00000001 // 0 0 enabled + +// SX126X_CMD_SET_STANDBY +#define SX126X_STANDBY_RC \ + 0x00 // 7 0 standby mode: 13 MHz RC oscillator +#define SX126X_STANDBY_XOSC \ + 0x01 // 7 0 32 MHz crystal oscillator + +// SX126X_CMD_SET_RX +#define SX126X_RX_TIMEOUT_NONE \ + 0x000000 // 23 0 Rx timeout duration: no timeout (Rx single mode) +#define SX126X_RX_TIMEOUT_INF \ + 0xFFFFFF // 23 0 infinite (Rx continuous mode) + +// SX126X_CMD_STOP_TIMER_ON_PREAMBLE +#define SX126X_STOP_ON_PREAMBLE_OFF \ + 0x00 // 7 0 stop timer on: sync word or header (default) +#define SX126X_STOP_ON_PREAMBLE_ON \ + 0x01 // 7 0 preamble detection + +// SX126X_CMD_SET_REGULATOR_MODE +#define SX126X_REGULATOR_LDO \ + 0x00 // 7 0 set regulator mode: LDO (default) +#define SX126X_REGULATOR_DC_DC 0x01 // 7 0 DC-DC + +// SX126X_CMD_CALIBRATE +#define SX126X_CALIBRATE_IMAGE_OFF \ + 0b00000000 // 6 6 image calibration: disabled +#define SX126X_CALIBRATE_IMAGE_ON \ + 0b01000000 // 6 6 enabled +#define SX126X_CALIBRATE_ADC_BULK_P_OFF \ + 0b00000000 // 5 5 ADC bulk P calibration: disabled +#define SX126X_CALIBRATE_ADC_BULK_P_ON \ + 0b00100000 // 5 5 enabled +#define SX126X_CALIBRATE_ADC_BULK_N_OFF \ + 0b00000000 // 4 4 ADC bulk N calibration: disabled +#define SX126X_CALIBRATE_ADC_BULK_N_ON \ + 0b00010000 // 4 4 enabled +#define SX126X_CALIBRATE_ADC_PULSE_OFF \ + 0b00000000 // 3 3 ADC pulse calibration: disabled +#define SX126X_CALIBRATE_ADC_PULSE_ON \ + 0b00001000 // 3 3 enabled +#define SX126X_CALIBRATE_PLL_OFF \ + 0b00000000 // 2 2 PLL calibration: disabled +#define SX126X_CALIBRATE_PLL_ON \ + 0b00000100 // 2 2 enabled +#define SX126X_CALIBRATE_RC13M_OFF \ + 0b00000000 // 1 1 13 MHz RC osc. calibration: disabled +#define SX126X_CALIBRATE_RC13M_ON \ + 0b00000010 // 1 1 enabled +#define SX126X_CALIBRATE_RC64K_OFF \ + 0b00000000 // 0 0 64 kHz RC osc. calibration: disabled +#define SX126X_CALIBRATE_RC64K_ON \ + 0b00000001 // 0 0 enabled + +// SX126X_CMD_CALIBRATE_IMAGE +#define SX126X_CAL_IMG_430_MHZ_1 0x6B +#define SX126X_CAL_IMG_430_MHZ_2 0x6F +#define SX126X_CAL_IMG_470_MHZ_1 0x75 +#define SX126X_CAL_IMG_470_MHZ_2 0x81 +#define SX126X_CAL_IMG_779_MHZ_1 0xC1 +#define SX126X_CAL_IMG_779_MHZ_2 0xC5 +#define SX126X_CAL_IMG_863_MHZ_1 0xD7 +#define SX126X_CAL_IMG_863_MHZ_2 0xDB +#define SX126X_CAL_IMG_902_MHZ_1 0xE1 +#define SX126X_CAL_IMG_902_MHZ_2 0xE9 + +// SX126X_CMD_SET_PA_CONFIG +#define SX126X_PA_CONFIG_HP_MAX 0x07 +#define SX126X_PA_CONFIG_SX1268 0x01 +#define SX126X_PA_CONFIG_PA_LUT 0x01 + +// SX126X_CMD_SET_RX_TX_FALLBACK_MODE +#define SX126X_RX_TX_FALLBACK_MODE_FS \ + 0x40 // 7 0 after Rx/Tx go to: FS mode +#define SX126X_RX_TX_FALLBACK_MODE_STDBY_XOSC \ + 0x30 // 7 0 standby with crystal oscillator +#define SX126X_RX_TX_FALLBACK_MODE_STDBY_RC \ + 0x20 // 7 0 standby with RC oscillator + // (default) + +// SX126X_CMD_SET_DIO_IRQ_PARAMS +#define SX126X_IRQ_TIMEOUT 0b1000000000 // 9 9 Rx or Tx timeout +#define SX126X_IRQ_CAD_DETECTED \ + 0b0100000000 // 8 8 channel activity detected +#define SX126X_IRQ_CAD_DONE \ + 0b0010000000 // 7 7 channel activity detection finished +#define SX126X_IRQ_CRC_ERR 0b0001000000 // 6 6 wrong CRC received +#define SX126X_IRQ_HEADER_ERR \ + 0b0000100000 // 5 5 LoRa header CRC error +#define SX126X_IRQ_HEADER_VALID \ + 0b0000010000 // 4 4 valid LoRa header received +#define SX126X_IRQ_SYNC_WORD_VALID \ + 0b0000001000 // 3 3 valid sync word detected +#define SX126X_IRQ_PREAMBLE_DETECTED \ + 0b0000000100 // 2 2 preamble detected +#define SX126X_IRQ_RX_DONE 0b0000000010 // 1 1 packet received +#define SX126X_IRQ_TX_DONE \ + 0b0000000001 // 0 0 packet transmission completed +#define SX126X_IRQ_ALL 0b1111111111 // 9 0 all interrupts +#define SX126X_IRQ_NONE 0b0000000000 // 9 0 no interrupts + +// SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL +#define SX126X_DIO2_AS_IRQ 0x00 // 7 0 DIO2 configuration: IRQ +#define SX126X_DIO2_AS_RF_SWITCH \ + 0x01 // 7 0 RF switch control + +// SX126X_CMD_SET_DIO3_AS_TCXO_CTRL +#define SX126X_DIO3_OUTPUT_1_6 \ + 0x00 // 7 0 DIO3 voltage output for TCXO: 1.6 V +#define SX126X_DIO3_OUTPUT_1_7 \ + 0x01 // 7 0 1.7 V +#define SX126X_DIO3_OUTPUT_1_8 \ + 0x02 // 7 0 1.8 V +#define SX126X_DIO3_OUTPUT_2_2 \ + 0x03 // 7 0 2.2 V +#define SX126X_DIO3_OUTPUT_2_4 \ + 0x04 // 7 0 2.4 V +#define SX126X_DIO3_OUTPUT_2_7 \ + 0x05 // 7 0 2.7 V +#define SX126X_DIO3_OUTPUT_3_0 \ + 0x06 // 7 0 3.0 V +#define SX126X_DIO3_OUTPUT_3_3 \ + 0x07 // 7 0 3.3 V + +// Radio complete Wake-up Time with TCXO stabilisation time +#define RADIO_TCXO_SETUP_TIME 5 // [ms] + +// SX126X_CMD_SET_PACKET_TYPE +#define SX126X_PACKET_TYPE_GFSK 0x00 // 7 0 packet type: GFSK +#define SX126X_PACKET_TYPE_LORA 0x01 // 7 0 LoRa + +// SX126X_CMD_SET_TX_PARAMS +#define SX126X_PA_RAMP_10U 0x00 // 7 0 ramp time: 10 us +#define SX126X_PA_RAMP_20U 0x01 // 7 0 20 us +#define SX126X_PA_RAMP_40U 0x02 // 7 0 40 us +#define SX126X_PA_RAMP_80U 0x03 // 7 0 80 us +#define SX126X_PA_RAMP_200U 0x04 // 7 0 200 us +#define SX126X_PA_RAMP_800U 0x05 // 7 0 800 us +#define SX126X_PA_RAMP_1700U 0x06 // 7 0 1700 us +#define SX126X_PA_RAMP_3400U 0x07 // 7 0 3400 us + +// SX126X_CMD_SET_MODULATION_PARAMS +#define SX126X_GFSK_FILTER_NONE 0x00 // 7 0 GFSK filter: none +#define SX126X_GFSK_FILTER_GAUSS_0_3 \ + 0x08 // 7 0 Gaussian, BT = 0.3 +#define SX126X_GFSK_FILTER_GAUSS_0_5 \ + 0x09 // 7 0 Gaussian, BT = 0.5 +#define SX126X_GFSK_FILTER_GAUSS_0_7 \ + 0x0A // 7 0 Gaussian, BT = 0.7 +#define SX126X_GFSK_FILTER_GAUSS_1 \ + 0x0B // 7 0 Gaussian, BT = 1 +#define SX126X_GFSK_RX_BW_4_8 0x1F // 7 0 GFSK Rx bandwidth: 4.8 kHz +#define SX126X_GFSK_RX_BW_5_8 0x17 // 7 0 5.8 kHz +#define SX126X_GFSK_RX_BW_7_3 0x0F // 7 0 7.3 kHz +#define SX126X_GFSK_RX_BW_9_7 0x1E // 7 0 9.7 kHz +#define SX126X_GFSK_RX_BW_11_7 0x16 // 7 0 11.7 kHz +#define SX126X_GFSK_RX_BW_14_6 0x0E // 7 0 14.6 kHz +#define SX126X_GFSK_RX_BW_19_5 0x1D // 7 0 19.5 kHz +#define SX126X_GFSK_RX_BW_23_4 0x15 // 7 0 23.4 kHz +#define SX126X_GFSK_RX_BW_29_3 0x0D // 7 0 29.3 kHz +#define SX126X_GFSK_RX_BW_39_0 0x1C // 7 0 39.0 kHz +#define SX126X_GFSK_RX_BW_46_9 0x14 // 7 0 46.9 kHz +#define SX126X_GFSK_RX_BW_58_6 0x0C // 7 0 58.6 kHz +#define SX126X_GFSK_RX_BW_78_2 0x1B // 7 0 78.2 kHz +#define SX126X_GFSK_RX_BW_93_8 0x13 // 7 0 93.8 kHz +#define SX126X_GFSK_RX_BW_117_3 \ + 0x0B // 7 0 117.3 kHz +#define SX126X_GFSK_RX_BW_156_2 \ + 0x1A // 7 0 156.2 kHz +#define SX126X_GFSK_RX_BW_187_2 \ + 0x12 // 7 0 187.2 kHz +#define SX126X_GFSK_RX_BW_234_3 \ + 0x0A // 7 0 234.3 kHz +#define SX126X_GFSK_RX_BW_312_0 \ + 0x19 // 7 0 312.0 kHz +#define SX126X_GFSK_RX_BW_373_6 \ + 0x11 // 7 0 373.6 kHz +#define SX126X_GFSK_RX_BW_467_0 \ + 0x09 // 7 0 467.0 kHz +#define SX126X_LORA_BW_7_8 0x00 // 7 0 LoRa bandwidth: 7.8 kHz +#define SX126X_LORA_BW_10_4 0x08 // 7 0 10.4 kHz +#define SX126X_LORA_BW_15_6 0x01 // 7 0 15.6 kHz +#define SX126X_LORA_BW_20_8 0x09 // 7 0 20.8 kHz +#define SX126X_LORA_BW_31_25 0x02 // 7 0 31.25 kHz +#define SX126X_LORA_BW_41_7 0x0A // 7 0 41.7 kHz +#define SX126X_LORA_BW_62_5 0x03 // 7 0 62.5 kHz +#define SX126X_LORA_BW_125_0 0x04 // 7 0 125.0 kHz +#define SX126X_LORA_BW_250_0 0x05 // 7 0 250.0 kHz +#define SX126X_LORA_BW_500_0 0x06 // 7 0 500.0 kHz +#define SX126X_LORA_CR_4_5 0x01 // 7 0 LoRa coding rate: 4/5 +#define SX126X_LORA_CR_4_6 0x02 // 7 0 4/6 +#define SX126X_LORA_CR_4_7 0x03 // 7 0 4/7 +#define SX126X_LORA_CR_4_8 0x04 // 7 0 4/8 +#define SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_OFF \ + 0x00 // 7 0 LoRa low data rate optimization: disabled +#define SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON \ + 0x01 // 7 0 enabled + +// SX126X_CMD_SET_PACKET_PARAMS +#define SX126X_GFSK_PREAMBLE_DETECT_OFF \ + 0x00 // 7 0 GFSK minimum preamble length before reception starts: + // detector disabled +#define SX126X_GFSK_PREAMBLE_DETECT_8 0x04 // 7 0 8 bits +#define SX126X_GFSK_PREAMBLE_DETECT_16 0x05 // 7 0 16 bits +#define SX126X_GFSK_PREAMBLE_DETECT_24 0x06 // 7 0 24 bits +#define SX126X_GFSK_PREAMBLE_DETECT_32 0x07 // 7 0 32 bits +#define SX126X_GFSK_ADDRESS_FILT_OFF \ + 0x00 // 7 0 GFSK address filtering: disabled +#define SX126X_GFSK_ADDRESS_FILT_NODE \ + 0x01 // 7 0 node only +#define SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST \ + 0x02 // 7 0 node and broadcast +#define SX126X_GFSK_PACKET_FIXED \ + 0x00 // 7 0 GFSK packet type: fixed (payload length known in + // advance to both sides) +#define SX126X_GFSK_PACKET_VARIABLE \ + 0x01 // 7 0 variable (payload length added to + // packet) +#define SX126X_GFSK_CRC_OFF 0x01 // 7 0 GFSK packet CRC: disabled +#define SX126X_GFSK_CRC_1_BYTE 0x00 // 7 0 1 byte +#define SX126X_GFSK_CRC_2_BYTE 0x02 // 7 0 2 byte +#define SX126X_GFSK_CRC_1_BYTE_INV \ + 0x04 // 7 0 1 byte, inverted +#define SX126X_GFSK_CRC_2_BYTE_INV \ + 0x06 // 7 0 2 byte, inverted +#define SX126X_GFSK_WHITENING_OFF \ + 0x00 // 7 0 GFSK data whitening: disabled +#define SX126X_GFSK_WHITENING_ON \ + 0x01 // 7 0 enabled +#define SX126X_LORA_HEADER_EXPLICIT \ + 0x00 // 7 0 LoRa header mode: explicit +#define SX126X_LORA_HEADER_IMPLICIT \ + 0x01 // 7 0 implicit +#define SX126X_LORA_CRC_OFF 0x00 // 7 0 LoRa CRC mode: disabled +#define SX126X_LORA_CRC_ON 0x01 // 7 0 enabled +#define SX126X_LORA_IQ_STANDARD 0x00 // 7 0 LoRa IQ setup: standard +#define SX126X_LORA_IQ_INVERTED 0x01 // 7 0 inverted + +// SX126X_CMD_SET_CAD_PARAMS +#define SX126X_CAD_ON_1_SYMB \ + 0x00 // 7 0 number of symbols used for CAD: 1 +#define SX126X_CAD_ON_2_SYMB \ + 0x01 // 7 0 2 +#define SX126X_CAD_ON_4_SYMB \ + 0x02 // 7 0 4 +#define SX126X_CAD_ON_8_SYMB \ + 0x03 // 7 0 8 +#define SX126X_CAD_ON_16_SYMB \ + 0x04 // 7 0 16 +#define SX126X_CAD_GOTO_STDBY \ + 0x00 // 7 0 after CAD is done, always go to STDBY_RC mode +#define SX126X_CAD_GOTO_RX \ + 0x01 // 7 0 after CAD is done, go to Rx mode if activity is + // detected + +// SX126X_CMD_GET_STATUS +#define SX126X_STATUS_MODE_STDBY_RC \ + 0b00100000 // 6 4 current chip mode: STDBY_RC +#define SX126X_STATUS_MODE_STDBY_XOSC \ + 0b00110000 // 6 4 STDBY_XOSC +#define SX126X_STATUS_MODE_FS 0b01000000 // 6 4 FS +#define SX126X_STATUS_MODE_RX 0b01010000 // 6 4 RX +#define SX126X_STATUS_MODE_TX 0b01100000 // 6 4 TX +#define SX126X_STATUS_DATA_AVAILABLE \ + 0b00000100 // 3 1 command status: packet received and data can be + // retrieved +#define SX126X_STATUS_CMD_TIMEOUT \ + 0b00000110 // 3 1 SPI command timed out +#define SX126X_STATUS_CMD_INVALID \ + 0b00001000 // 3 1 invalid SPI command +#define SX126X_STATUS_CMD_FAILED \ + 0b00001010 // 3 1 SPI command failed to execute +#define SX126X_STATUS_TX_DONE \ + 0b00001100 // 3 1 packet transmission done + +// SX126X_CMD_GET_PACKET_STATUS +#define SX126X_GFSK_RX_STATUS_PREAMBLE_ERR \ + 0b10000000 // 7 7 GFSK Rx status: preamble error +#define SX126X_GFSK_RX_STATUS_SYNC_ERR \ + 0b01000000 // 6 6 sync word error +#define SX126X_GFSK_RX_STATUS_ADRS_ERR \ + 0b00100000 // 5 5 address error +#define SX126X_GFSK_RX_STATUS_CRC_ERR \ + 0b00010000 // 4 4 CRC error +#define SX126X_GFSK_RX_STATUS_LENGTH_ERR \ + 0b00001000 // 3 3 length error +#define SX126X_GFSK_RX_STATUS_ABORT_ERR \ + 0b00000100 // 2 2 abort error +#define SX126X_GFSK_RX_STATUS_PACKET_RECEIVED \ + 0b00000010 // 2 2 packet received +#define SX126X_GFSK_RX_STATUS_PACKET_SENT \ + 0b00000001 // 2 2 packet sent + +// SX126X_CMD_GET_DEVICE_ERRORS +#define SX126X_PA_RAMP_ERR \ + 0b100000000 // 8 8 device errors: PA ramping failed +#define SX126X_PLL_LOCK_ERR \ + 0b001000000 // 6 6 PLL failed to lock +#define SX126X_XOSC_START_ERR \ + 0b000100000 // 5 5 crystal oscillator failed to + // start +#define SX126X_IMG_CALIB_ERR \ + 0b000010000 // 4 4 image calibration failed +#define SX126X_ADC_CALIB_ERR \ + 0b000001000 // 3 3 ADC calibration failed +#define SX126X_PLL_CALIB_ERR \ + 0b000000100 // 2 2 PLL calibration failed +#define SX126X_RC13M_CALIB_ERR \ + 0b000000010 // 1 1 RC13M calibration failed +#define SX126X_RC64K_CALIB_ERR \ + 0b000000001 // 0 0 RC64K calibration failed + +// SX126X SPI register variables +// SX126X_REG_LORA_SYNC_WORD_MSB + LSB +#define SX126X_SYNC_WORD_PUBLIC 0x3444 +#define SX126X_SYNC_WORD_PRIVATE 0x1424 + +#define SX126x_TXMODE_ASYNC 0x01 +#define SX126x_TXMODE_SYNC 0x02 +#define SX126x_TXMODE_BACK2RX 0x04 + +// common low-level SPI interface +class SX126x { + public: + SX126x(int spiSelect, int reset, int busy, int interrupt); + + int16_t begin(uint8_t packetType, uint32_t frequencyInHz, + int8_t txPowerInDbm); + int16_t LoRaConfig(uint8_t spreadingFactor, uint8_t bandwidth, + uint8_t codingRate, uint16_t preambleLength, + uint8_t payloadLen, bool crcOn, bool invertIrq); + uint8_t Receive(uint8_t *pData, uint16_t len); + bool Send(uint8_t *pData, uint8_t len, uint8_t mode); + bool ReceiveMode(void); + void ReceiveStatus(uint8_t *rssiPacket, uint8_t *snrPacket); + void SetTxPower(int8_t txPowerInDbm); + + private: + uint8_t PacketParams[6]; + bool txActive; + + int SX126x_SPI_SELECT; + int SX126x_RESET; + int SX126x_BUSY; + int SX126x_INT0; + + void SPIwriteCommand(uint8_t cmd, uint8_t *data, uint8_t numBytes, + bool waitForBusy = true); + void SPIreadCommand(uint8_t cmd, uint8_t *data, uint8_t numBytes, + bool waitForBusy = true); + void SPItransfer(uint8_t cmd, bool write, uint8_t *dataOut, uint8_t *dataIn, + uint8_t numBytes, bool waitForBusy); + + void SetDio3AsTcxoCtrl(uint8_t tcxoVoltage, uint32_t timeout); + void SetDio2AsRfSwitchCtrl(uint8_t enable); + void Reset(void); + uint8_t GetStatus(void); + void SetStandby(uint8_t mode); + void WaitOnBusy(void); + void SetRfFrequency(uint32_t frequency); + void Calibrate(uint8_t calibParam); + void CalibrateImage(uint32_t frequency); + void SetRegulatorMode(uint8_t mode); + void SetBufferBaseAddress(uint8_t txBaseAddress, uint8_t rxBaseAddress); + void SetPowerConfig(int8_t power, uint8_t rampTime); + void SetOvercurrentProtection(uint8_t value); + void SetPaConfig(uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, + uint8_t paLut); + void SetDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, + uint16_t dio3Mask); + void SetStopRxTimerOnPreambleDetect(bool enable); + void SetLoRaSymbNumTimeout(uint8_t SymbNum); + void SetPacketType(uint8_t packetType); + void SetModulationParams(uint8_t spreadingFactor, uint8_t bandwidth, + uint8_t codingRate, uint8_t lowDataRateOptimize); + uint16_t GetIrqStatus(void); + void ClearIrqStatus(uint16_t irq); + void SetRx(uint32_t timeout); + void SetTx(uint32_t timeoutInMs); + void GetRxBufferStatus(uint8_t *payloadLength, + uint8_t *rxStartBufferPointer); + void Wakeup(void); + uint8_t ReadBuffer(uint8_t *rxData, uint8_t *rxDataLen, uint8_t maxLen); + uint8_t WriteBuffer(uint8_t *txData, uint8_t txDataLen); +}; + +#endif \ No newline at end of file diff --git a/Code/BITS/BITSv5/test/build/CMakeCache.txt b/Code/BITS/BITSv5/test/build/CMakeCache.txt index b39d0651..6687a3ab 100644 --- a/Code/BITS/BITSv5/test/build/CMakeCache.txt +++ b/Code/BITS/BITSv5/test/build/CMakeCache.txt @@ -503,7 +503,7 @@ PICO_BOOT_STAGE2_DIR:INTERNAL=/Users/michaelshipman/Developer/command_module/Cod PICO_CMAKE_PRELOAD_PLATFORM_DIR:INTERNAL=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/cmake/preload/platforms PICO_CMAKE_PRELOAD_PLATFORM_FILE:INTERNAL=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/cmake/preload/platforms/rp2040.cmake PICO_COMPILER_ASM:INTERNAL=/opt/homebrew/bin/arm-none-eabi-gcc -PICO_DOXYGEN_EXCLUDE_PATHS:INTERNAL= /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs +PICO_DOXYGEN_EXCLUDE_PATHS:INTERNAL= /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs PICO_DOXYGEN_PATHS:INTERNAL= /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/cyw43-driver/src /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040 PICO_NO_HARDWARE:INTERNAL=0 PICO_ON_DEVICE:INTERNAL=1 diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/Makefile2 b/Code/BITS/BITSv5/test/build/CMakeFiles/Makefile2 index e05d9460..01d48988 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/Makefile2 +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/Makefile2 @@ -1507,12 +1507,12 @@ CMakeFiles/test.dir/all: CMakeFiles/ELF2UF2Build.dir/all CMakeFiles/test.dir/all: pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default_padded_checksummed_asm.dir/all $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/depend $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93 "Built target test" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95 "Built target test" .PHONY : CMakeFiles/test.dir/all # Build rule for subdir invocation for target. CMakeFiles/test.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles 83 + $(CMAKE_COMMAND) -E cmake_progress_start /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles 85 $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/test.dir/all $(CMAKE_COMMAND) -E cmake_progress_start /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles 0 .PHONY : CMakeFiles/test.dir/rule diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/progress.marks b/Code/BITS/BITSv5/test/build/CMakeFiles/progress.marks index 7fe4e495..c67f579c 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/progress.marks +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/progress.marks @@ -1 +1 @@ -91 +93 diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/DependInfo.cmake b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/DependInfo.cmake index 56f3e6b6..83c15a44 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/DependInfo.cmake +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/DependInfo.cmake @@ -117,6 +117,7 @@ set(CMAKE_ASM_TARGET_INCLUDE_PATH "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/hw" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include" + "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include" ) # The set of dependency files which are needed: @@ -154,6 +155,7 @@ set(CMAKE_DEPENDS_DEPENDENCY_FILES "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj.d" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj.d" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj.d" + "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj.d" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj.d" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj.d" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj.d" @@ -178,8 +180,9 @@ set(CMAKE_DEPENDS_DEPENDENCY_FILES "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj.d" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj.d" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj.d" - "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.c" "CMakeFiles/test.dir/test.c.obj" "gcc" "CMakeFiles/test.dir/test.c.obj.d" + "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp" "CMakeFiles/test.dir/SX126x.cpp.obj" "gcc" "CMakeFiles/test.dir/SX126x.cpp.obj.d" "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj" "gcc" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj.d" + "/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp" "CMakeFiles/test.dir/test.cpp.obj" "gcc" "CMakeFiles/test.dir/test.cpp.obj.d" ) # Targets to which this target links which contain Fortran sources. diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/SX126x.cpp.obj b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/SX126x.cpp.obj new file mode 100644 index 0000000000000000000000000000000000000000..5e8136ed60469571ea184cedb7f8766ff4994851 GIT binary patch literal 18672 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 literal 0 HcmV?d00001 diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/SX126x.cpp.obj.d b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/SX126x.cpp.obj.d new file mode 100644 index 00000000..c4226d01 --- /dev/null +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/SX126x.cpp.obj.d @@ -0,0 +1,109 @@ +CMakeFiles/test.dir/SX126x.cpp.obj: \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include/pico/stdlib.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/assert.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cassert \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/cpu_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/version.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/config.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/config_autogen.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include/boards/pico.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include/pico/platform.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/platform_defs.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/error.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include/pico/stdio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include/pico/time.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include/hardware/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include/hardware/gpio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/sio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/interp.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/padsbank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pads_bank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/iobank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_bank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include/hardware/irq.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/intctrl.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/m0plus.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include/hardware/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/math.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cmath \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/requires_hosted.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/cpp_type_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/type_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/math.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/reent.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/lock.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/specfun.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_algobase.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/functexcept.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/exception_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/numeric_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_pair.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/type_traits \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/move.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/utility.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_funcs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/concept_check.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/assertions.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/ptr_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/debug.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/predefined_ops.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bit \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/limits \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/gamma.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/special_function_util.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/bessel_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/beta_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/ell_integral.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/exp_integral.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/hypergeometric.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/legendre_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/modified_bessel_func.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_hermite.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_laguerre.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/riemann_zeta.tcc \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include/hardware/spi.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/spi.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/spi.h diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/build.make b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/build.make index c3b27bc9..ecb54bdd 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/build.make +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/build.make @@ -69,24 +69,38 @@ include CMakeFiles/test.dir/progress.make # Include the compile flags for this target's objects. include CMakeFiles/test.dir/flags.make -CMakeFiles/test.dir/test.c.obj: CMakeFiles/test.dir/flags.make -CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.c -CMakeFiles/test.dir/test.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object CMakeFiles/test.dir/test.c.obj" - /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/test.c.obj -MF CMakeFiles/test.dir/test.c.obj.d -o CMakeFiles/test.dir/test.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.c - -CMakeFiles/test.dir/test.c.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/test.dir/test.c.i" - /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.c > CMakeFiles/test.dir/test.c.i - -CMakeFiles/test.dir/test.c.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/test.dir/test.c.s" - /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.c -o CMakeFiles/test.dir/test.c.s +CMakeFiles/test.dir/test.cpp.obj: CMakeFiles/test.dir/flags.make +CMakeFiles/test.dir/test.cpp.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp +CMakeFiles/test.dir/test.cpp.obj: CMakeFiles/test.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/test.dir/test.cpp.obj" + /opt/homebrew/bin/arm-none-eabi-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/test.dir/test.cpp.obj -MF CMakeFiles/test.dir/test.cpp.obj.d -o CMakeFiles/test.dir/test.cpp.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp + +CMakeFiles/test.dir/test.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/test.dir/test.cpp.i" + /opt/homebrew/bin/arm-none-eabi-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp > CMakeFiles/test.dir/test.cpp.i + +CMakeFiles/test.dir/test.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/test.dir/test.cpp.s" + /opt/homebrew/bin/arm-none-eabi-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp -o CMakeFiles/test.dir/test.cpp.s + +CMakeFiles/test.dir/SX126x.cpp.obj: CMakeFiles/test.dir/flags.make +CMakeFiles/test.dir/SX126x.cpp.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp +CMakeFiles/test.dir/SX126x.cpp.obj: CMakeFiles/test.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/test.dir/SX126x.cpp.obj" + /opt/homebrew/bin/arm-none-eabi-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/test.dir/SX126x.cpp.obj -MF CMakeFiles/test.dir/SX126x.cpp.obj.d -o CMakeFiles/test.dir/SX126x.cpp.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp + +CMakeFiles/test.dir/SX126x.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/test.dir/SX126x.cpp.i" + /opt/homebrew/bin/arm-none-eabi-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp > CMakeFiles/test.dir/SX126x.cpp.i + +CMakeFiles/test.dir/SX126x.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/test.dir/SX126x.cpp.s" + /opt/homebrew/bin/arm-none-eabi-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp -o CMakeFiles/test.dir/SX126x.cpp.s CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.i: cmake_force @@ -100,7 +114,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.i: cmake_force @@ -114,7 +128,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.i: cmake_force @@ -128,7 +142,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.i: cmake_force @@ -142,7 +156,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.i: cmake_force @@ -156,7 +170,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.i: cmake_force @@ -169,7 +183,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.i: cmake_force @@ -183,7 +197,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.i: cmake_force @@ -197,7 +211,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.i: cmake_force @@ -211,7 +225,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.i: cmake_force @@ -225,7 +239,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.i: cmake_force @@ -239,7 +253,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.i: cmake_force @@ -253,7 +267,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.i: cmake_force @@ -267,7 +281,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.i: cmake_force @@ -281,7 +295,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.i: cmake_force @@ -295,7 +309,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.i: cmake_force @@ -309,7 +323,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.i: cmake_force @@ -323,7 +337,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.i: cmake_force @@ -337,7 +351,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.i: cmake_force @@ -351,7 +365,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.i: cmake_force @@ -365,7 +379,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.i: cmake_force @@ -379,7 +393,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.i: cmake_force @@ -393,7 +407,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.i: cmake_force @@ -406,7 +420,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S.i: cmake_force @@ -420,7 +434,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.i: cmake_force @@ -434,7 +448,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.i: cmake_force @@ -447,7 +461,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.i: cmake_force @@ -461,7 +475,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.i: cmake_force @@ -474,7 +488,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_31) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.i: cmake_force @@ -487,7 +501,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_31) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_32) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.i: cmake_force @@ -501,7 +515,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_32) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_33) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.i: cmake_force @@ -515,7 +529,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_33) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_34) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.i: cmake_force @@ -528,7 +542,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_34) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_35) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.i: cmake_force @@ -541,7 +555,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_35) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_36) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.i: cmake_force @@ -554,7 +568,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_36) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_37) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.i: cmake_force @@ -568,7 +582,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_37) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_38) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.i: cmake_force @@ -582,7 +596,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_38) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_39) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.i: cmake_force @@ -595,7 +609,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_39) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_40) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.i: cmake_force @@ -609,7 +623,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_40) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_41) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.i: cmake_force @@ -622,7 +636,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_41) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_42) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.i: cmake_force @@ -635,7 +649,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_42) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_43) "Building ASM object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(ASM_DEFINES) $(ASM_INCLUDES) $(ASM_FLAGS) -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.i: cmake_force @@ -649,7 +663,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_43) "Building CXX object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_44) "Building CXX object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj" /opt/homebrew/bin/arm-none-eabi-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.i: cmake_force @@ -663,7 +677,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_44) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_45) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.i: cmake_force @@ -677,7 +691,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_45) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_46) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.i: cmake_force @@ -691,7 +705,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_46) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_47) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.i: cmake_force @@ -705,7 +719,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_47) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_48) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.i: cmake_force @@ -719,7 +733,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_48) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_49) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.i: cmake_force @@ -733,7 +747,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_49) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_50) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.i: cmake_force @@ -747,7 +761,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_50) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_51) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.i: cmake_force @@ -761,7 +775,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_51) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_52) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.i: cmake_force @@ -775,7 +789,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_52) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_53) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.i: cmake_force @@ -789,7 +803,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_53) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_54) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.i: cmake_force @@ -803,7 +817,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_54) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_55) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.i: cmake_force @@ -817,7 +831,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_55) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_56) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.i: cmake_force @@ -831,7 +845,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_56) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_57) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.i: cmake_force @@ -845,7 +859,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_57) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_58) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.i: cmake_force @@ -859,7 +873,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_58) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_59) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.i: cmake_force @@ -873,7 +887,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_59) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_60) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.i: cmake_force @@ -887,7 +901,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_60) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_61) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.i: cmake_force @@ -901,7 +915,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_61) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_62) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.i: cmake_force @@ -915,7 +929,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_62) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_63) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.i: cmake_force @@ -929,7 +943,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_63) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_64) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.i: cmake_force @@ -943,7 +957,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_64) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_65) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.i: cmake_force @@ -957,7 +971,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_65) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_66) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.i: cmake_force @@ -971,7 +985,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_66) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_67) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.i: cmake_force @@ -985,7 +999,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_67) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_68) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.i: cmake_force @@ -999,7 +1013,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_68) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_69) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.i: cmake_force @@ -1013,7 +1027,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_69) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_70) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.i: cmake_force @@ -1027,7 +1041,7 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj: CMakeFiles/test.dir/flags.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj: CMakeFiles/test.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_70) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_71) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.i: cmake_force @@ -1038,9 +1052,24 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.s" /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.s +CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj: CMakeFiles/test.dir/flags.make +CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c +CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj: CMakeFiles/test.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_72) "Building C object CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj" + /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj -MF CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj.d -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj -c /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c + +CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.i" + /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c > CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.i + +CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.s" + /opt/homebrew/bin/arm-none-eabi-gcc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c -o CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.s + # Object files for target test test_OBJECTS = \ -"CMakeFiles/test.dir/test.c.obj" \ +"CMakeFiles/test.dir/test.cpp.obj" \ +"CMakeFiles/test.dir/SX126x.cpp.obj" \ "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj" \ "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj" \ "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj" \ @@ -1109,12 +1138,14 @@ test_OBJECTS = \ "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj" \ "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj" \ "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj" \ -"CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj" +"CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj" \ +"CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj" # External object files for target test test_EXTERNAL_OBJECTS = -test.elf: CMakeFiles/test.dir/test.c.obj +test.elf: CMakeFiles/test.dir/test.cpp.obj +test.elf: CMakeFiles/test.dir/SX126x.cpp.obj test.elf: CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj test.elf: CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj test.elf: CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj @@ -1184,10 +1215,11 @@ test.elf: CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code test.elf: CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj test.elf: CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj test.elf: CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj +test.elf: CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj test.elf: CMakeFiles/test.dir/build.make test.elf: pico-sdk/src/rp2_common/boot_stage2/bs2_default_padded_checksummed.S test.elf: CMakeFiles/test.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_71) "Linking CXX executable test.elf" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_73) "Linking CXX executable test.elf" $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/test.dir/link.txt --verbose=$(VERBOSE) /opt/homebrew/bin/arm-none-eabi-objcopy -Oihex /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/test.elf test.hex /opt/homebrew/bin/arm-none-eabi-objcopy -Obinary /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/test.elf test.bin diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/cmake_clean.cmake b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/cmake_clean.cmake index 4f08e83f..7448afce 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/cmake_clean.cmake +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/cmake_clean.cmake @@ -1,4 +1,6 @@ file(REMOVE_RECURSE + "CMakeFiles/test.dir/SX126x.cpp.obj" + "CMakeFiles/test.dir/SX126x.cpp.obj.d" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj.d" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj" @@ -67,6 +69,8 @@ file(REMOVE_RECURSE "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj.d" + "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj" + "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj.d" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj.d" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj" @@ -126,8 +130,8 @@ file(REMOVE_RECURSE "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj.d" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj.d" - "CMakeFiles/test.dir/test.c.obj" - "CMakeFiles/test.dir/test.c.obj.d" + "CMakeFiles/test.dir/test.cpp.obj" + "CMakeFiles/test.dir/test.cpp.obj.d" "test.elf" "test.pdb" ) diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/compiler_depend.internal b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/compiler_depend.internal index f2c18ce4..988a2d04 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/compiler_depend.internal +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/compiler_depend.internal @@ -1,6 +1,114 @@ # CMAKE generated file: DO NOT EDIT! # Generated by "Unix Makefiles" Generator, CMake Version 3.27 +CMakeFiles/test.dir/SX126x.cpp.obj + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/cpu_defines.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bit + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/concept_check.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/cpp_type_traits.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/exception_defines.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/functexcept.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/move.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/predefined_ops.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/ptr_traits.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/requires_hosted.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/specfun.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_algobase.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_funcs.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_pair.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/utility.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cassert + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cmath + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/assertions.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/debug.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/numeric_traits.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/type_traits.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/limits + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/math.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/bessel_function.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/beta_function.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/ell_integral.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/exp_integral.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/gamma.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/hypergeometric.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/legendre_function.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/modified_bessel_func.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_hermite.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_laguerre.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/riemann_zeta.tcc + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/special_function_util.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/type_traits + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/stdlib.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/math.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdlib.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/lock.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/reent.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include/boards/pico.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/assert.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/config.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/error.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include/pico/stdlib.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include/pico/time.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/platform_defs.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/intctrl.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_bank0.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/m0plus.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pads_bank0.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/spi.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/timer.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/uart.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/interp.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/iobank0.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/padsbank0.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/sio.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/spi.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/timer.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/uart.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include/hardware/gpio.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include/hardware/irq.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include/hardware/spi.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include/hardware/timer.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include/hardware/uart.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include/pico/platform.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include/pico/stdio.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/config_autogen.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/version.h + CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h @@ -1545,6 +1653,48 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/config_autogen.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/version.h +CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include/boards/pico.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/assert.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/config.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/error.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/platform_defs.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/clocks.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/resets.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/spi.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/clocks.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/resets.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/spi.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include/hardware/clocks.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include/hardware/resets.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include/hardware/spi.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include/pico/platform.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/config_autogen.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/version.h + CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h @@ -2745,12 +2895,20 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/config_autogen.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/version.h -CMakeFiles/test.dir/test.c.obj - /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.c +CMakeFiles/test.dir/test.cpp.obj + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/cpu_defines.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cassert + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cstdlib + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/stdlib.h /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h @@ -2815,6 +2973,7 @@ CMakeFiles/test.dir/test.c.obj /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include/pico/stdio.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/config_autogen.h /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/version.h diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/compiler_depend.make b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/compiler_depend.make index c472e017..15c899bd 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/compiler_depend.make +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/compiler_depend.make @@ -1,6 +1,113 @@ # CMAKE generated file: DO NOT EDIT! # Generated by "Unix Makefiles" Generator, CMake Version 3.27 +CMakeFiles/test.dir/SX126x.cpp.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/cpu_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bit \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/concept_check.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/cpp_type_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/exception_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/functexcept.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/move.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/predefined_ops.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/ptr_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/requires_hosted.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/specfun.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_algobase.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_funcs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_pair.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/utility.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cassert \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cmath \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/assertions.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/debug.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/numeric_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/type_traits.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/limits \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/math.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/bessel_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/beta_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/ell_integral.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/exp_integral.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/gamma.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/hypergeometric.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/legendre_function.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/modified_bessel_func.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_hermite.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_laguerre.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/riemann_zeta.tcc \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/special_function_util.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/type_traits \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/math.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/lock.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/reent.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include/boards/pico.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/assert.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/config.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/error.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include/pico/stdlib.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include/pico/time.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/platform_defs.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/intctrl.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_bank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/m0plus.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pads_bank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/spi.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/interp.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/iobank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/padsbank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/sio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/spi.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include/hardware/gpio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include/hardware/irq.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include/hardware/spi.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include/hardware/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include/hardware/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include/pico/platform.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include/pico/stdio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.h \ + generated/pico_base/pico/config_autogen.h \ + generated/pico_base/pico/version.h + CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h \ @@ -1512,6 +1619,47 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS generated/pico_base/pico/config_autogen.h \ generated/pico_base/pico/version.h +CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include/boards/pico.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/assert.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/config.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/error.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/platform_defs.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/clocks.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/resets.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/spi.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/clocks.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/resets.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/spi.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include/hardware/clocks.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include/hardware/resets.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include/hardware/spi.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include/pico/platform.h \ + generated/pico_base/pico/config_autogen.h \ + generated/pico_base/pico/version.h + CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h \ @@ -2687,11 +2835,19 @@ CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITS generated/pico_base/pico/config_autogen.h \ generated/pico_base/pico/version.h -CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.c \ +CMakeFiles/test.dir/test.cpp.obj: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/cpu_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cassert \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cstdlib \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/stdlib.h \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h \ /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h \ @@ -2756,10 +2912,13 @@ CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/C /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include/pico/stdio.h \ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h \ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.h \ generated/pico_base/pico/config_autogen.h \ generated/pico_base/pico/version.h +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp: + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c: @@ -2774,18 +2933,8 @@ CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/C /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h: - /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cstdlib: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/include/pico/unique_id.h: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h: - /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/boot_stage2/include/boot_stage2/config.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info/defs.h: @@ -2802,19 +2951,11 @@ CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/C /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/time.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/types.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/timespec.h: - /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/select.h: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/sched.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_timeval.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_timespec.h: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_pthreadtypes.h: @@ -2822,67 +2963,67 @@ CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/C /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/time.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_time.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/endian.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_endian.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/stdlib.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/xosc.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_time.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_endian.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/include/pico/printf.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info/structure.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c: - /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/tbman.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sysinfo.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/include/pico/float.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include/pico/fix/rp2040_usb_device_enumeration.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c: - /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/include/pico/double.h: + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include/pico/bootrom/sf_table.h: + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/psm.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c: + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/include/hardware/vreg.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/vreg_and_chip_reset.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/uart.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_timeval.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/math.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/times.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_mcu.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/vreg_and_chip_reset.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include/pico/bootrom.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/times.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include/hardware/flash.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/ssi.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/ioqspi.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/ssi.h: @@ -2890,41 +3031,23 @@ CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/C /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/include/hardware/xosc.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/strings.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include/hardware/timer.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include/hardware/uart.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include/boards/pico.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include/hardware/timer.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/strings.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include/hardware/clocks.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/psm.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/sio.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/xosc.h: - /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/pll.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/padsbank0.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/osal/osal.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/interp.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pll.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include/pico/mutex.h: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/xosc.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pads_bank0.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/watchdog.h: @@ -2936,6 +3059,8 @@ CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/C /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include/pico/timeout_helper.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/ell_integral.tcc: + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cassert: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c: @@ -2952,28 +3077,18 @@ CMakeFiles/test.dir/test.c.obj: /Users/michaelshipman/Developer/command_module/C /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/syslimits.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/limits.h: - /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/time.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/syslimits.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/uart.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/limits.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/ssi.h: - /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.h: - generated/pico_base/pico/config_autogen.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.h: + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/clocks.h: @@ -2986,67 +3101,59 @@ generated/pico_base/pico/config_autogen.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/include/pico/float.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/ptr_traits.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/inttypes.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/stdlib.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include/hardware/resets.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include/hardware/irq.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/usb.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdlib.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/math.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/m0plus.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/resets.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/intctrl.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_bank0.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/usb.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/limits.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_private.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/cpp_type_traits.h: + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/timer.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include/pico/stdlib.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb/reset_interface.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/concept_check.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/stdlib.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/float.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pads_bank0.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb_option.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c: -generated/pico_base/pico/version.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/ioqspi.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_types.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include/pico/time.h: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_timespec.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include/hardware/gpio.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c: - -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include/pico/sem.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/include/hardware/sync.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_debug.h: @@ -3054,13 +3161,11 @@ generated/pico_base/pico/version.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include/pico/lock_core.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_bank0.h: - -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/usb.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/osal/osal_pico.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include/pico/critical_section.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/interp.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/osal/osal.h: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h: @@ -3072,105 +3177,209 @@ generated/pico_base/pico/version.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_verify.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/functexcept.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/timer.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_verify.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_timeout.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_compiler.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/modified_bessel_func.tcc: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_types.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_hermite.tcc: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_sigset.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_common.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/string.h: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/stdio.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/unistd.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_locale.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/include/pico/malloc.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/include/hardware/watchdog.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/tusb_config.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c: +generated/pico_base/pico/version.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/move.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb_option.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/reent.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/vreg_and_chip_reset.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/iobank0.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_mcu.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_types.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/endian.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/type_traits.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/string.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_compiler.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/include/hardware/watchdog.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/tusb_config.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include/hardware/flash.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/clocks.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator_base_funcs.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_types.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdio.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include/pico/stdio.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/exception_defines.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include/hardware/irq.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/beta_function.tcc: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/include/hardware/pll.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/inttypes.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/uart.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include/hardware/resets.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/padsbank0.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/iobank0.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/assert.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pll.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_pvt.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include/hardware/spi.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/requires_hosted.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/uart.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/timer.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include/hardware/gpio.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/m0plus.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/types.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/spi.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/intctrl.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/platform_defs.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/timespec.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_locale.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_common.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_sigset.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/scb.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.cpp: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/include/pico/util/datetime.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include/pico/time.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb/reset_interface.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include/pico/stdlib.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/gamma.tcc: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include/pico/platform.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/spi.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/config.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_pvt.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/assert.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info/structure.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/poly_laguerre.tcc: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_pair.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/include/pico/unique_id.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include/pico/mutex.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/math.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/psm.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/xosc.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/sio.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/hypergeometric.tcc: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/error.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/resets.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/debug.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include/pico/sem.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/scb.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/type_traits: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c: @@ -3180,54 +3389,88 @@ generated/pico_base/pico/version.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/dcd.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/string.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/legendre_function.tcc: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/usb.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/float.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/debug/assertions.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/bessel_function.tcc: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/limits: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/include/hardware/sync.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/include/pico/double.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include/pico/platform.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include/pico/bootrom/sf_table.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/ext/numeric_traits.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/config.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/exp_integral.tcc: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/string.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/clocks.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cmath: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_types.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/special_function_util.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdio.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include/pico/critical_section.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/osal/osal_pico.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/utility.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/specfun.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bit: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdlib.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/unistd.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/include/pico/malloc.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_algobase.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/limits.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/predefined_ops.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h: /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c: /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h: -/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include/pico/stdio.h: +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/stl_iterator.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include/pico/bootrom.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h: -/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.h: +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/include/pico/util/datetime.h: + +/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/reent.h: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/tr1/riemann_zeta.tcc: + +/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h: diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/flags.make b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/flags.make index c8532ae9..7388a61d 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/flags.make +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/flags.make @@ -6,19 +6,19 @@ # compile CXX with /opt/homebrew/bin/arm-none-eabi-g++ ASM_DEFINES = -DCFG_TUSB_MCU=OPT_MCU_RP2040 -DCFG_TUSB_OS=OPT_OS_PICO -DLIB_PICO_BIT_OPS=1 -DLIB_PICO_BIT_OPS_PICO=1 -DLIB_PICO_DIVIDER=1 -DLIB_PICO_DIVIDER_HARDWARE=1 -DLIB_PICO_DOUBLE=1 -DLIB_PICO_DOUBLE_PICO=1 -DLIB_PICO_FIX_RP2040_USB_DEVICE_ENUMERATION=1 -DLIB_PICO_FLOAT=1 -DLIB_PICO_FLOAT_PICO=1 -DLIB_PICO_INT64_OPS=1 -DLIB_PICO_INT64_OPS_PICO=1 -DLIB_PICO_MALLOC=1 -DLIB_PICO_MEM_OPS=1 -DLIB_PICO_MEM_OPS_PICO=1 -DLIB_PICO_PLATFORM=1 -DLIB_PICO_PRINTF=1 -DLIB_PICO_PRINTF_PICO=1 -DLIB_PICO_RUNTIME=1 -DLIB_PICO_STANDARD_LINK=1 -DLIB_PICO_STDIO=1 -DLIB_PICO_STDIO_UART=1 -DLIB_PICO_STDIO_USB=1 -DLIB_PICO_STDLIB=1 -DLIB_PICO_SYNC=1 -DLIB_PICO_SYNC_CRITICAL_SECTION=1 -DLIB_PICO_SYNC_MUTEX=1 -DLIB_PICO_SYNC_SEM=1 -DLIB_PICO_TIME=1 -DLIB_PICO_UNIQUE_ID=1 -DLIB_PICO_UTIL=1 -DPICO_BOARD=\"pico\" -DPICO_BUILD=1 -DPICO_CMAKE_BUILD_TYPE=\"Release\" -DPICO_COPY_TO_RAM=0 -DPICO_CXX_ENABLE_EXCEPTIONS=0 -DPICO_NO_FLASH=0 -DPICO_NO_HARDWARE=0 -DPICO_ON_DEVICE=1 -DPICO_RP2040_USB_DEVICE_UFRAME_FIX=1 -DPICO_TARGET_NAME=\"test\" -DPICO_USE_BLOCKED_RAM=0 -ASM_INCLUDES = -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_bit_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_usb_reset_interface/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/boot_stage2/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/hw -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include +ASM_INCLUDES = -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_bit_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_usb_reset_interface/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/boot_stage2/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/hw -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include ASM_FLAGS = -mcpu=cortex-m0plus -mthumb -O3 -DNDEBUG -ffunction-sections -fdata-sections C_DEFINES = -DCFG_TUSB_MCU=OPT_MCU_RP2040 -DCFG_TUSB_OS=OPT_OS_PICO -DLIB_PICO_BIT_OPS=1 -DLIB_PICO_BIT_OPS_PICO=1 -DLIB_PICO_DIVIDER=1 -DLIB_PICO_DIVIDER_HARDWARE=1 -DLIB_PICO_DOUBLE=1 -DLIB_PICO_DOUBLE_PICO=1 -DLIB_PICO_FIX_RP2040_USB_DEVICE_ENUMERATION=1 -DLIB_PICO_FLOAT=1 -DLIB_PICO_FLOAT_PICO=1 -DLIB_PICO_INT64_OPS=1 -DLIB_PICO_INT64_OPS_PICO=1 -DLIB_PICO_MALLOC=1 -DLIB_PICO_MEM_OPS=1 -DLIB_PICO_MEM_OPS_PICO=1 -DLIB_PICO_PLATFORM=1 -DLIB_PICO_PRINTF=1 -DLIB_PICO_PRINTF_PICO=1 -DLIB_PICO_RUNTIME=1 -DLIB_PICO_STANDARD_LINK=1 -DLIB_PICO_STDIO=1 -DLIB_PICO_STDIO_UART=1 -DLIB_PICO_STDIO_USB=1 -DLIB_PICO_STDLIB=1 -DLIB_PICO_SYNC=1 -DLIB_PICO_SYNC_CRITICAL_SECTION=1 -DLIB_PICO_SYNC_MUTEX=1 -DLIB_PICO_SYNC_SEM=1 -DLIB_PICO_TIME=1 -DLIB_PICO_UNIQUE_ID=1 -DLIB_PICO_UTIL=1 -DPICO_BOARD=\"pico\" -DPICO_BUILD=1 -DPICO_CMAKE_BUILD_TYPE=\"Release\" -DPICO_COPY_TO_RAM=0 -DPICO_CXX_ENABLE_EXCEPTIONS=0 -DPICO_NO_FLASH=0 -DPICO_NO_HARDWARE=0 -DPICO_ON_DEVICE=1 -DPICO_RP2040_USB_DEVICE_UFRAME_FIX=1 -DPICO_TARGET_NAME=\"test\" -DPICO_USE_BLOCKED_RAM=0 -C_INCLUDES = -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_bit_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_usb_reset_interface/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/boot_stage2/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/hw -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include +C_INCLUDES = -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_bit_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_usb_reset_interface/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/boot_stage2/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/hw -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include C_FLAGS = -mcpu=cortex-m0plus -mthumb -O3 -DNDEBUG -std=gnu11 -ffunction-sections -fdata-sections CXX_DEFINES = -DCFG_TUSB_MCU=OPT_MCU_RP2040 -DCFG_TUSB_OS=OPT_OS_PICO -DLIB_PICO_BIT_OPS=1 -DLIB_PICO_BIT_OPS_PICO=1 -DLIB_PICO_DIVIDER=1 -DLIB_PICO_DIVIDER_HARDWARE=1 -DLIB_PICO_DOUBLE=1 -DLIB_PICO_DOUBLE_PICO=1 -DLIB_PICO_FIX_RP2040_USB_DEVICE_ENUMERATION=1 -DLIB_PICO_FLOAT=1 -DLIB_PICO_FLOAT_PICO=1 -DLIB_PICO_INT64_OPS=1 -DLIB_PICO_INT64_OPS_PICO=1 -DLIB_PICO_MALLOC=1 -DLIB_PICO_MEM_OPS=1 -DLIB_PICO_MEM_OPS_PICO=1 -DLIB_PICO_PLATFORM=1 -DLIB_PICO_PRINTF=1 -DLIB_PICO_PRINTF_PICO=1 -DLIB_PICO_RUNTIME=1 -DLIB_PICO_STANDARD_LINK=1 -DLIB_PICO_STDIO=1 -DLIB_PICO_STDIO_UART=1 -DLIB_PICO_STDIO_USB=1 -DLIB_PICO_STDLIB=1 -DLIB_PICO_SYNC=1 -DLIB_PICO_SYNC_CRITICAL_SECTION=1 -DLIB_PICO_SYNC_MUTEX=1 -DLIB_PICO_SYNC_SEM=1 -DLIB_PICO_TIME=1 -DLIB_PICO_UNIQUE_ID=1 -DLIB_PICO_UTIL=1 -DPICO_BOARD=\"pico\" -DPICO_BUILD=1 -DPICO_CMAKE_BUILD_TYPE=\"Release\" -DPICO_COPY_TO_RAM=0 -DPICO_CXX_ENABLE_EXCEPTIONS=0 -DPICO_NO_FLASH=0 -DPICO_NO_HARDWARE=0 -DPICO_ON_DEVICE=1 -DPICO_RP2040_USB_DEVICE_UFRAME_FIX=1 -DPICO_TARGET_NAME=\"test\" -DPICO_USE_BLOCKED_RAM=0 -CXX_INCLUDES = -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_bit_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_usb_reset_interface/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/boot_stage2/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/hw -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include +CXX_INCLUDES = -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_resets/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_bit_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_divider/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_usb_reset_interface/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/boot_stage2/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/hw -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include -I/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/include CXX_FLAGS = -mcpu=cortex-m0plus -mthumb -O3 -DNDEBUG -std=gnu++17 -ffunction-sections -fdata-sections -fno-exceptions -fno-unwind-tables -fno-rtti -fno-use-cxa-atexit diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/link.txt b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/link.txt index df0e1509..27358228 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/link.txt +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/link.txt @@ -1 +1 @@ -/opt/homebrew/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -O3 -DNDEBUG -Wl,--build-id=none --specs=nosys.specs -Wl,--wrap=sprintf -Wl,--wrap=snprintf -Wl,--wrap=vsnprintf -Wl,--wrap=__clzsi2 -Wl,--wrap=__clzdi2 -Wl,--wrap=__ctzsi2 -Wl,--wrap=__ctzdi2 -Wl,--wrap=__popcountsi2 -Wl,--wrap=__popcountdi2 -Wl,--wrap=__clz -Wl,--wrap=__clzl -Wl,--wrap=__clzll -Wl,--wrap=__aeabi_idiv -Wl,--wrap=__aeabi_idivmod -Wl,--wrap=__aeabi_ldivmod -Wl,--wrap=__aeabi_uidiv -Wl,--wrap=__aeabi_uidivmod -Wl,--wrap=__aeabi_uldivmod -Wl,--wrap=__aeabi_dadd -Wl,--wrap=__aeabi_ddiv -Wl,--wrap=__aeabi_dmul -Wl,--wrap=__aeabi_drsub -Wl,--wrap=__aeabi_dsub -Wl,--wrap=__aeabi_cdcmpeq -Wl,--wrap=__aeabi_cdrcmple -Wl,--wrap=__aeabi_cdcmple -Wl,--wrap=__aeabi_dcmpeq -Wl,--wrap=__aeabi_dcmplt -Wl,--wrap=__aeabi_dcmple -Wl,--wrap=__aeabi_dcmpge -Wl,--wrap=__aeabi_dcmpgt -Wl,--wrap=__aeabi_dcmpun -Wl,--wrap=__aeabi_i2d -Wl,--wrap=__aeabi_l2d -Wl,--wrap=__aeabi_ui2d -Wl,--wrap=__aeabi_ul2d -Wl,--wrap=__aeabi_d2iz -Wl,--wrap=__aeabi_d2lz -Wl,--wrap=__aeabi_d2uiz -Wl,--wrap=__aeabi_d2ulz -Wl,--wrap=__aeabi_d2f -Wl,--wrap=sqrt -Wl,--wrap=cos -Wl,--wrap=sin -Wl,--wrap=tan -Wl,--wrap=atan2 -Wl,--wrap=exp -Wl,--wrap=log -Wl,--wrap=ldexp -Wl,--wrap=copysign -Wl,--wrap=trunc -Wl,--wrap=floor -Wl,--wrap=ceil -Wl,--wrap=round -Wl,--wrap=sincos -Wl,--wrap=asin -Wl,--wrap=acos -Wl,--wrap=atan -Wl,--wrap=sinh -Wl,--wrap=cosh -Wl,--wrap=tanh -Wl,--wrap=asinh -Wl,--wrap=acosh -Wl,--wrap=atanh -Wl,--wrap=exp2 -Wl,--wrap=log2 -Wl,--wrap=exp10 -Wl,--wrap=log10 -Wl,--wrap=pow -Wl,--wrap=powint -Wl,--wrap=hypot -Wl,--wrap=cbrt -Wl,--wrap=fmod -Wl,--wrap=drem -Wl,--wrap=remainder -Wl,--wrap=remquo -Wl,--wrap=expm1 -Wl,--wrap=log1p -Wl,--wrap=fma -Wl,--wrap=__aeabi_lmul -Wl,--wrap=__aeabi_fadd -Wl,--wrap=__aeabi_fdiv -Wl,--wrap=__aeabi_fmul -Wl,--wrap=__aeabi_frsub -Wl,--wrap=__aeabi_fsub -Wl,--wrap=__aeabi_cfcmpeq -Wl,--wrap=__aeabi_cfrcmple -Wl,--wrap=__aeabi_cfcmple -Wl,--wrap=__aeabi_fcmpeq -Wl,--wrap=__aeabi_fcmplt -Wl,--wrap=__aeabi_fcmple -Wl,--wrap=__aeabi_fcmpge -Wl,--wrap=__aeabi_fcmpgt -Wl,--wrap=__aeabi_fcmpun -Wl,--wrap=__aeabi_i2f -Wl,--wrap=__aeabi_l2f -Wl,--wrap=__aeabi_ui2f -Wl,--wrap=__aeabi_ul2f -Wl,--wrap=__aeabi_f2iz -Wl,--wrap=__aeabi_f2lz -Wl,--wrap=__aeabi_f2uiz -Wl,--wrap=__aeabi_f2ulz -Wl,--wrap=__aeabi_f2d -Wl,--wrap=sqrtf -Wl,--wrap=cosf -Wl,--wrap=sinf -Wl,--wrap=tanf -Wl,--wrap=atan2f -Wl,--wrap=expf -Wl,--wrap=logf -Wl,--wrap=ldexpf -Wl,--wrap=copysignf -Wl,--wrap=truncf -Wl,--wrap=floorf -Wl,--wrap=ceilf -Wl,--wrap=roundf -Wl,--wrap=sincosf -Wl,--wrap=asinf -Wl,--wrap=acosf -Wl,--wrap=atanf -Wl,--wrap=sinhf -Wl,--wrap=coshf -Wl,--wrap=tanhf -Wl,--wrap=asinhf -Wl,--wrap=acoshf -Wl,--wrap=atanhf -Wl,--wrap=exp2f -Wl,--wrap=log2f -Wl,--wrap=exp10f -Wl,--wrap=log10f -Wl,--wrap=powf -Wl,--wrap=powintf -Wl,--wrap=hypotf -Wl,--wrap=cbrtf -Wl,--wrap=fmodf -Wl,--wrap=dremf -Wl,--wrap=remainderf -Wl,--wrap=remquof -Wl,--wrap=expm1f -Wl,--wrap=log1pf -Wl,--wrap=fmaf -Wl,--wrap=malloc -Wl,--wrap=calloc -Wl,--wrap=realloc -Wl,--wrap=free -Wl,--wrap=memcpy -Wl,--wrap=memset -Wl,--wrap=__aeabi_memcpy -Wl,--wrap=__aeabi_memset -Wl,--wrap=__aeabi_memcpy4 -Wl,--wrap=__aeabi_memset4 -Wl,--wrap=__aeabi_memcpy8 -Wl,--wrap=__aeabi_memset8 -Wl,-Map=test.elf.map -Wl,--script=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/memmap_default.ld -Wl,-z,max-page-size=4096 -Wl,--gc-sections -Wl,--no-warn-rwx-segments -Wl,--wrap=printf -Wl,--wrap=vprintf -Wl,--wrap=puts -Wl,--wrap=putchar -Wl,--wrap=getchar CMakeFiles/test.dir/test.c.obj "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj" -o test.elf pico-sdk/src/rp2_common/boot_stage2/bs2_default_padded_checksummed.S +/opt/homebrew/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -O3 -DNDEBUG -Wl,--build-id=none --specs=nosys.specs -Wl,--wrap=sprintf -Wl,--wrap=snprintf -Wl,--wrap=vsnprintf -Wl,--wrap=__clzsi2 -Wl,--wrap=__clzdi2 -Wl,--wrap=__ctzsi2 -Wl,--wrap=__ctzdi2 -Wl,--wrap=__popcountsi2 -Wl,--wrap=__popcountdi2 -Wl,--wrap=__clz -Wl,--wrap=__clzl -Wl,--wrap=__clzll -Wl,--wrap=__aeabi_idiv -Wl,--wrap=__aeabi_idivmod -Wl,--wrap=__aeabi_ldivmod -Wl,--wrap=__aeabi_uidiv -Wl,--wrap=__aeabi_uidivmod -Wl,--wrap=__aeabi_uldivmod -Wl,--wrap=__aeabi_dadd -Wl,--wrap=__aeabi_ddiv -Wl,--wrap=__aeabi_dmul -Wl,--wrap=__aeabi_drsub -Wl,--wrap=__aeabi_dsub -Wl,--wrap=__aeabi_cdcmpeq -Wl,--wrap=__aeabi_cdrcmple -Wl,--wrap=__aeabi_cdcmple -Wl,--wrap=__aeabi_dcmpeq -Wl,--wrap=__aeabi_dcmplt -Wl,--wrap=__aeabi_dcmple -Wl,--wrap=__aeabi_dcmpge -Wl,--wrap=__aeabi_dcmpgt -Wl,--wrap=__aeabi_dcmpun -Wl,--wrap=__aeabi_i2d -Wl,--wrap=__aeabi_l2d -Wl,--wrap=__aeabi_ui2d -Wl,--wrap=__aeabi_ul2d -Wl,--wrap=__aeabi_d2iz -Wl,--wrap=__aeabi_d2lz -Wl,--wrap=__aeabi_d2uiz -Wl,--wrap=__aeabi_d2ulz -Wl,--wrap=__aeabi_d2f -Wl,--wrap=sqrt -Wl,--wrap=cos -Wl,--wrap=sin -Wl,--wrap=tan -Wl,--wrap=atan2 -Wl,--wrap=exp -Wl,--wrap=log -Wl,--wrap=ldexp -Wl,--wrap=copysign -Wl,--wrap=trunc -Wl,--wrap=floor -Wl,--wrap=ceil -Wl,--wrap=round -Wl,--wrap=sincos -Wl,--wrap=asin -Wl,--wrap=acos -Wl,--wrap=atan -Wl,--wrap=sinh -Wl,--wrap=cosh -Wl,--wrap=tanh -Wl,--wrap=asinh -Wl,--wrap=acosh -Wl,--wrap=atanh -Wl,--wrap=exp2 -Wl,--wrap=log2 -Wl,--wrap=exp10 -Wl,--wrap=log10 -Wl,--wrap=pow -Wl,--wrap=powint -Wl,--wrap=hypot -Wl,--wrap=cbrt -Wl,--wrap=fmod -Wl,--wrap=drem -Wl,--wrap=remainder -Wl,--wrap=remquo -Wl,--wrap=expm1 -Wl,--wrap=log1p -Wl,--wrap=fma -Wl,--wrap=__aeabi_lmul -Wl,--wrap=__aeabi_fadd -Wl,--wrap=__aeabi_fdiv -Wl,--wrap=__aeabi_fmul -Wl,--wrap=__aeabi_frsub -Wl,--wrap=__aeabi_fsub -Wl,--wrap=__aeabi_cfcmpeq -Wl,--wrap=__aeabi_cfrcmple -Wl,--wrap=__aeabi_cfcmple -Wl,--wrap=__aeabi_fcmpeq -Wl,--wrap=__aeabi_fcmplt -Wl,--wrap=__aeabi_fcmple -Wl,--wrap=__aeabi_fcmpge -Wl,--wrap=__aeabi_fcmpgt -Wl,--wrap=__aeabi_fcmpun -Wl,--wrap=__aeabi_i2f -Wl,--wrap=__aeabi_l2f -Wl,--wrap=__aeabi_ui2f -Wl,--wrap=__aeabi_ul2f -Wl,--wrap=__aeabi_f2iz -Wl,--wrap=__aeabi_f2lz -Wl,--wrap=__aeabi_f2uiz -Wl,--wrap=__aeabi_f2ulz -Wl,--wrap=__aeabi_f2d -Wl,--wrap=sqrtf -Wl,--wrap=cosf -Wl,--wrap=sinf -Wl,--wrap=tanf -Wl,--wrap=atan2f -Wl,--wrap=expf -Wl,--wrap=logf -Wl,--wrap=ldexpf -Wl,--wrap=copysignf -Wl,--wrap=truncf -Wl,--wrap=floorf -Wl,--wrap=ceilf -Wl,--wrap=roundf -Wl,--wrap=sincosf -Wl,--wrap=asinf -Wl,--wrap=acosf -Wl,--wrap=atanf -Wl,--wrap=sinhf -Wl,--wrap=coshf -Wl,--wrap=tanhf -Wl,--wrap=asinhf -Wl,--wrap=acoshf -Wl,--wrap=atanhf -Wl,--wrap=exp2f -Wl,--wrap=log2f -Wl,--wrap=exp10f -Wl,--wrap=log10f -Wl,--wrap=powf -Wl,--wrap=powintf -Wl,--wrap=hypotf -Wl,--wrap=cbrtf -Wl,--wrap=fmodf -Wl,--wrap=dremf -Wl,--wrap=remainderf -Wl,--wrap=remquof -Wl,--wrap=expm1f -Wl,--wrap=log1pf -Wl,--wrap=fmaf -Wl,--wrap=malloc -Wl,--wrap=calloc -Wl,--wrap=realloc -Wl,--wrap=free -Wl,--wrap=memcpy -Wl,--wrap=memset -Wl,--wrap=__aeabi_memcpy -Wl,--wrap=__aeabi_memset -Wl,--wrap=__aeabi_memcpy4 -Wl,--wrap=__aeabi_memset4 -Wl,--wrap=__aeabi_memcpy8 -Wl,--wrap=__aeabi_memset8 -Wl,-Map=test.elf.map -Wl,--script=/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/memmap_default.ld -Wl,-z,max-page-size=4096 -Wl,--gc-sections -Wl,--no-warn-rwx-segments -Wl,--wrap=printf -Wl,--wrap=vprintf -Wl,--wrap=puts -Wl,--wrap=putchar -Wl,--wrap=getchar CMakeFiles/test.dir/test.cpp.obj CMakeFiles/test.dir/SX126x.cpp.obj "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/sem.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/timeout_helper.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/datetime.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/queue.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_math.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_math.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_malloc/pico_malloc.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/video/video_device.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj" "CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj" -o test.elf pico-sdk/src/rp2_common/boot_stage2/bs2_default_padded_checksummed.S diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/progress.make b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/progress.make index aa110f97..cd166c12 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/progress.make +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/progress.make @@ -69,4 +69,6 @@ CMAKE_PROGRESS_68 = 90 CMAKE_PROGRESS_69 = 91 CMAKE_PROGRESS_70 = 92 CMAKE_PROGRESS_71 = 93 +CMAKE_PROGRESS_72 = 94 +CMAKE_PROGRESS_73 = 95 diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.c.obj.d b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.c.obj.d index 7b71d823..aadb9581 100644 --- a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.c.obj.d +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.c.obj.d @@ -71,4 +71,5 @@ CMakeFiles/test.dir/test.c.obj: \ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/uart.h \ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h \ /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h \ - /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.h diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.cpp.obj b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.cpp.obj new file mode 100644 index 0000000000000000000000000000000000000000..5144d1afef886c0c594822ec3f7c84bb2e529b11 GIT binary patch literal 2052 zcma)6OK;Rx6h0o$WXSMJ(9jSHttS&8X@fP7kiIs_gqegU0YuUk6(sjg#$+sc9;IWfOH(ssEr|b((!j5pO264x%Yln zU9BmKLQ)i(qJc+rGv#Mevp!7GD2>qj!tR-x@U%16HOu8^hG^Ne?aqu=xwNsK(>5H@ zc3YO`S?w+DOoP+(c=zvGt#+mM$L`lVd;dM%`|B)eKqWsngwEN`_^~Wa0b4od}46eFE zza#C-(&FOV+SG#6(v~j2r)_jP_GVL9ZLL_=OS)s)MQy6mv+RZ@oYr{`zA-%=37)hWgV z=kdK0@&)#zqSA1zpW$el`#BiPAB^P>#r(rG$q}sCFRaJ-f2Jc0^!8@Vuf+ThV*bZ5 z|I?WNUCe(q^zqN5-2cz9Jb9+;>6_gyO*UxKBV%dxN@ZcyFx+0KInr@(f|ywABqgGCsUKw|>1?n%llmH@B>Iwb>GpV6m{;xh57n?OWDXwb^WX&3c`> zj@9;VMOd@zX1h_n%6W2a)9e~8HHC88PlV?-B${F66V^i7D^LkZp#_kg^O?uUq(WKIWr1bN6=d{lRDw>(j2^qc^j((=r0kMxG{ z1nG6xCEe-3(Xnoz7xh_=nYIoh2ZZDGx_qrs#}T*vuju}0^vzDIWw!bA z3)j|k;dzc#@9{|ezF*|QOXBa(p^zNhwSzb13C2}{eJoFKoG0&vbIdvL0zAwO@03^} zs3&dsxCxNQT!FH`CfhhmQow`Ev*NS@A+wzLi17$3ZVB+v*A3Qay%Bc8F>@y10del4 z_3m;3>(Ol%y2#Aq`-#aoJQ+C;2`=zJ;cF*|80n}UV-Zk?yEuV@0rIb zDzHMps|Ke3L=JkNm22S`_|oGb)?NxY5TKkj{0AI(#CnwNEGzoM|D#vg8=LeMI}c%m TBI}K^ALaeZ1$HEfQSzPvGP4Z* literal 0 HcmV?d00001 diff --git a/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.cpp.obj.d b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.cpp.obj.d new file mode 100644 index 00000000..7325d50f --- /dev/null +++ b/Code/BITS/BITSv5/test/build/CMakeFiles/test.dir/test.cpp.obj.d @@ -0,0 +1,83 @@ +CMakeFiles/test.dir/test.cpp.obj: \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/test.cpp \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdio.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/newlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_newlib_version.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/ieeefp.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/features.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/cdefs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_default_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stddef.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdarg.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/reent.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/_ansi.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/_types.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/lock.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/stdio.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cstdlib \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/c++config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/os_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi/thumb/v6-m/nofp/bits/cpu_defines.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/pstl/pstl_config.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/machine/stdlib.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/alloca.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/bits/std_abs.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/string.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_locale.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/strings.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/string.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/SX126x.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_stdlib/include/pico/stdlib.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/assert.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdbool.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/c++/13.2.1/cassert \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/assert.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include/stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/stdint.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_intsup.h \ + /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/arm-none-eabi/include/sys/_stdint.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/version.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/config.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/generated/pico_base/pico/config_autogen.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/boards/include/boards/pico.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/include/pico/platform.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/platform_defs.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/types.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_base/include/pico/error.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/include/pico/stdio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/include/pico/time.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/include/hardware/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/timer.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/include/hardware/gpio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/sio.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/interp.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/padsbank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pads_bank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/iobank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_bank0.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/include/hardware/irq.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/intctrl.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/m0plus.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/include/hardware/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/include/pico/stdio_uart.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/include/pico/stdio_usb.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/include/hardware/flash.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info/defs.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info/structure.h \ + /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_binary_info/include/pico/binary_info/code.h diff --git a/Code/BITS/BITSv5/test/build/Makefile b/Code/BITS/BITSv5/test/build/Makefile index f3ef699e..7737b4db 100644 --- a/Code/BITS/BITSv5/test/build/Makefile +++ b/Code/BITS/BITSv5/test/build/Makefile @@ -207,6 +207,30 @@ cyw43_driver_picow_cyw43_bus_pio_spi_pio_h/fast: $(MAKE) $(MAKESILENT) -f pico-sdk/src/rp2_common/pico_cyw43_driver/CMakeFiles/cyw43_driver_picow_cyw43_bus_pio_spi_pio_h.dir/build.make pico-sdk/src/rp2_common/pico_cyw43_driver/CMakeFiles/cyw43_driver_picow_cyw43_bus_pio_spi_pio_h.dir/build .PHONY : cyw43_driver_picow_cyw43_bus_pio_spi_pio_h/fast +SX126x.obj: SX126x.cpp.obj +.PHONY : SX126x.obj + +# target to build an object file +SX126x.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/SX126x.cpp.obj +.PHONY : SX126x.cpp.obj + +SX126x.i: SX126x.cpp.i +.PHONY : SX126x.i + +# target to preprocess a source file +SX126x.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/SX126x.cpp.i +.PHONY : SX126x.cpp.i + +SX126x.s: SX126x.cpp.s +.PHONY : SX126x.s + +# target to generate assembly for a file +SX126x.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/SX126x.cpp.s +.PHONY : SX126x.cpp.s + Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.obj: Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.obj .PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.obj @@ -1015,6 +1039,30 @@ Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_ $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.s .PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.s +Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.obj: Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj +.PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.obj + +# target to build an object file +Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj +.PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj + +Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.i: Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.i +.PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.i + +# target to preprocess a source file +Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.i +.PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.i + +Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.s: Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.s +.PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.s + +# target to generate assembly for a file +Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.s +.PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.s + Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.obj: Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj .PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.obj @@ -1687,29 +1735,29 @@ Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_ $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.s .PHONY : Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.s -test.obj: test.c.obj +test.obj: test.cpp.obj .PHONY : test.obj # target to build an object file -test.c.obj: - $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/test.c.obj -.PHONY : test.c.obj +test.cpp.obj: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/test.cpp.obj +.PHONY : test.cpp.obj -test.i: test.c.i +test.i: test.cpp.i .PHONY : test.i # target to preprocess a source file -test.c.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/test.c.i -.PHONY : test.c.i +test.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/test.cpp.i +.PHONY : test.cpp.i -test.s: test.c.s +test.s: test.cpp.s .PHONY : test.s # target to generate assembly for a file -test.c.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/test.c.s -.PHONY : test.c.s +test.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/test.dir/build.make CMakeFiles/test.dir/test.cpp.s +.PHONY : test.cpp.s # Help Target help: @@ -1726,6 +1774,9 @@ help: @echo "... cyw43_driver_picow_cyw43_bus_pio_spi_pio_h" @echo "... bs2_default" @echo "... test" + @echo "... SX126x.obj" + @echo "... SX126x.i" + @echo "... SX126x.s" @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.obj" @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.i" @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/audio/audio_device.s" @@ -1827,6 +1878,9 @@ help: @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.obj" @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.i" @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.s" + @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.obj" + @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.i" + @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.s" @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.obj" @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.i" @echo "... Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.s" diff --git a/Code/BITS/BITSv5/test/build/test.bin b/Code/BITS/BITSv5/test/build/test.bin index 99b0acbcafe66509bde6e61874eed938835b7118..e5208cd45f506e81194d6fff468a3287d8e2e5dd 100755 GIT binary patch delta 8224 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 T_~vX7KR_dXNr4{!0EqtycDM1# delta 4297 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 Ao&W#< diff --git a/Code/BITS/BITSv5/test/build/test.dis b/Code/BITS/BITSv5/test/build/test.dis index 86bae48d..24b82ed5 100644 --- a/Code/BITS/BITSv5/test/build/test.dis +++ b/Code/BITS/BITSv5/test/build/test.dis @@ -5,35 +5,35 @@ Sections: Idx Name Size VMA LMA File off Algn 0 .boot2 00000100 10000000 10000000 00001000 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .text 00006d18 10000100 10000100 00001100 2**3 + 1 .text 00007b60 10000100 10000100 00001100 2**3 CONTENTS, ALLOC, LOAD, READONLY, CODE - 2 .rodata 0000053c 10006e18 10006e18 00007e18 2**3 + 2 .rodata 0000054c 10007c60 10007c60 00008c60 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA - 3 .binary_info 00000028 10007354 10007354 00008354 2**2 + 3 .binary_info 00000028 100081ac 100081ac 000091ac 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA - 4 .ram_vector_table 000000c0 20000000 20000000 0000a000 2**2 + 4 .ram_vector_table 000000c0 20000000 20000000 0000b000 2**2 ALLOC - 5 .data 00000e38 200000c0 1000737c 000090c0 2**4 + 5 .data 00000efc 200000c0 100081d4 0000a0c0 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE - 6 .uninitialized_data 00000000 20000ef8 20000ef8 00009ef8 2**0 + 6 .uninitialized_data 00000000 20000fbc 20000fbc 0000afbc 2**0 CONTENTS - 7 .scratch_x 00000000 20040000 20040000 00009ef8 2**0 + 7 .scratch_x 00000000 20040000 20040000 0000afbc 2**0 CONTENTS - 8 .scratch_y 00000000 20041000 20041000 00009ef8 2**0 + 8 .scratch_y 00000000 20041000 20041000 0000afbc 2**0 CONTENTS - 9 .bss 00000d94 20000ef8 20000ef8 0000a000 2**3 + 9 .bss 00000dac 20000fc0 20000fc0 0000b000 2**3 ALLOC - 10 .heap 00000800 20001c8c 20001c8c 00009ef8 2**2 + 10 .heap 00000800 20001d6c 20001d6c 0000afbc 2**2 CONTENTS, READONLY - 11 .stack_dummy 00000800 20041000 20041000 0000a700 2**5 + 11 .stack_dummy 00000800 20041000 20041000 0000b7c0 2**5 CONTENTS, READONLY - 12 .ARM.attributes 00000028 00000000 00000000 0000af00 2**0 + 12 .ARM.attributes 00000028 00000000 00000000 0000bfc0 2**0 CONTENTS, READONLY - 13 .comment 00000044 00000000 00000000 0000af28 2**0 + 13 .comment 00000044 00000000 00000000 0000bfe8 2**0 CONTENTS, READONLY - 14 .debug_line_str 000000d2 00000000 00000000 0000af6c 2**0 + 14 .debug_line_str 000000d2 00000000 00000000 0000c02c 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS - 15 .debug_frame 00000028 00000000 00000000 0000b040 2**2 + 15 .debug_frame 00000028 00000000 00000000 0000c100 2**2 CONTENTS, READONLY, DEBUGGING, OCTETS /Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/test/build/test.elf: file format elf32-littlearm @@ -184,8 +184,8 @@ Disassembly of section .text: 100001d4 : 100001d4: 7188ebf2 .word 0x7188ebf2 -100001d8: 10007354 .word 0x10007354 -100001dc: 1000737c .word 0x1000737c +100001d8: 100081ac .word 0x100081ac +100001dc: 100081d4 .word 0x100081d4 100001e0: 10000234 .word 0x10000234 100001e4: e71aa390 .word 0xe71aa390 @@ -240,13 +240,13 @@ Disassembly of section .text: 10000232: 4770 bx lr 10000234 : -10000234: 1000737c .word 0x1000737c +10000234: 100081d4 .word 0x100081d4 10000238: 200000c0 .word 0x200000c0 -1000023c: 20000ef8 .word 0x20000ef8 -10000240: 100081b4 .word 0x100081b4 +1000023c: 20000fbc .word 0x20000fbc +10000240: 100090d0 .word 0x100090d0 10000244: 20040000 .word 0x20040000 10000248: 20040000 .word 0x20040000 -1000024c: 100081b4 .word 0x100081b4 +1000024c: 100090d0 .word 0x100090d0 10000250: 20041000 .word 0x20041000 10000254: 20041000 .word 0x20041000 10000258: 00000000 .word 0x00000000 @@ -254,29 +254,29 @@ Disassembly of section .text: 1000025e : 1000025e: 4809 ldr r0, [pc, #36] @ (10000284 ) -10000260: f003 fa54 bl 1000370c +10000260: f004 f8a6 bl 100043b0 10000264: 4700 bx r0 10000266: 0000 .short 0x0000 10000268: e000ed08 .word 0xe000ed08 1000026c: d0000000 .word 0xd0000000 -10000270: 20000ef8 .word 0x20000ef8 -10000274: 20001c8c .word 0x20001c8c -10000278: 10001e69 .word 0x10001e69 +10000270: 20000fc0 .word 0x20000fc0 +10000274: 20001d6c .word 0x20001d6c +10000278: 10002b0d .word 0x10002b0d 1000027c: 10000309 .word 0x10000309 -10000280: 10001f5d .word 0x10001f5d +10000280: 10002c01 .word 0x10002c01 10000284: 00005657 .word 0x00005657 10000288 <__bi_50>: -10000288: 50520006 5360b3ab 10006eec ..RP..`S.n.. +10000288: 50520006 5360b3ab 10007d44 ..RP..`SD}.. 10000294 <__bi_38>: -10000294: 50520006 02031c86 10006efc ..RP.....n.. +10000294: 50520006 02031c86 10007d54 ..RP....T}.. 100002a0 <__bi_30>: -100002a0: 50520006 9da22254 10006f04 ..RPT"...o.. +100002a0: 50520006 9da22254 10007d5c ..RPT"..\}.. 100002ac <__bi_22>: -100002ac: 50520005 68f465de 100081b4 ..RP.e.h.... +100002ac: 50520005 68f465de 100090d0 ..RP.e.h.... 100002b8 <_init>: 100002b8: b5f8 push {r3, r4, r5, r6, r7, lr} @@ -297,8 +297,8 @@ Disassembly of section .text: 100002d2: d000 beq.n 100002d6 100002d4: 4798 blx r3 100002d6: bd10 pop {r4, pc} -100002d8: 20000ef8 .word 0x20000ef8 -100002dc: 20000ef8 .word 0x20000ef8 +100002d8: 20000fbc .word 0x20000fbc +100002dc: 20000fbc .word 0x20000fbc 100002e0: 00000000 .word 0x00000000 100002e4 : @@ -314,13210 +314,14919 @@ Disassembly of section .text: 100002f8: bd10 pop {r4, pc} 100002fa: 46c0 nop @ (mov r8, r8) 100002fc: 00000000 .word 0x00000000 -10000300: 20001c10 .word 0x20001c10 -10000304: 10006e18 .word 0x10006e18 +10000300: 20001cf0 .word 0x20001cf0 +10000304: 10007c60 .word 0x10007c60 10000308

    : 10000308: b5f0 push {r4, r5, r6, r7, lr} -1000030a: 46c6 mov lr, r8 -1000030c: b500 push {lr} -1000030e: f004 faab bl 10004868 -10000312: 25d0 movs r5, #208 @ 0xd0 -10000314: 2000 movs r0, #0 -10000316: f000 f83b bl 10000390 -1000031a: 2301 movs r3, #1 -1000031c: 062d lsls r5, r5, #24 -1000031e: 626b str r3, [r5, #36] @ 0x24 -10000320: 4b0c ldr r3, [pc, #48] @ (10000354 ) -10000322: 2601 movs r6, #1 -10000324: 4698 mov r8, r3 -10000326: 4c0c ldr r4, [pc, #48] @ (10000358 ) -10000328: 4f0c ldr r7, [pc, #48] @ (1000035c ) -1000032a: 0021 movs r1, r4 -1000032c: 6822 ldr r2, [r4, #0] -1000032e: 4640 mov r0, r8 -10000330: f004 fa8e bl 10004850 <__wrap_printf> -10000334: 0038 movs r0, r7 -10000336: f004 f999 bl 1000466c <__wrap_puts> -1000033a: 20fa movs r0, #250 @ 0xfa -1000033c: 616e str r6, [r5, #20] -1000033e: 0080 lsls r0, r0, #2 -10000340: f000 fed2 bl 100010e8 -10000344: 20fa movs r0, #250 @ 0xfa -10000346: 61ae str r6, [r5, #24] -10000348: 0080 lsls r0, r0, #2 -1000034a: f000 fecd bl 100010e8 -1000034e: 3404 adds r4, #4 -10000350: e7eb b.n 1000032a -10000352: 46c0 nop @ (mov r8, r8) -10000354: 10006e18 .word 0x10006e18 -10000358: 10fff000 .word 0x10fff000 -1000035c: 10006e30 .word 0x10006e30 - -10000360 : -10000360: 4a09 ldr r2, [pc, #36] @ (10000388 ) -10000362: b510 push {r4, lr} -10000364: 4694 mov ip, r2 -10000366: 2440 movs r4, #64 @ 0x40 -10000368: 0083 lsls r3, r0, #2 -1000036a: 4463 add r3, ip -1000036c: 681a ldr r2, [r3, #0] -1000036e: 00c0 lsls r0, r0, #3 -10000370: 4062 eors r2, r4 -10000372: 3480 adds r4, #128 @ 0x80 -10000374: 4014 ands r4, r2 -10000376: 2280 movs r2, #128 @ 0x80 -10000378: 0152 lsls r2, r2, #5 -1000037a: 4313 orrs r3, r2 -1000037c: 601c str r4, [r3, #0] -1000037e: 4b03 ldr r3, [pc, #12] @ (1000038c ) -10000380: 469c mov ip, r3 -10000382: 4460 add r0, ip -10000384: 6041 str r1, [r0, #4] -10000386: bd10 pop {r4, pc} -10000388: 4001c004 .word 0x4001c004 -1000038c: 40014000 .word 0x40014000 - -10000390 : -10000390: 2301 movs r3, #1 -10000392: 22d0 movs r2, #208 @ 0xd0 -10000394: 4083 lsls r3, r0 -10000396: 0612 lsls r2, r2, #24 -10000398: 6293 str r3, [r2, #40] @ 0x28 -1000039a: 6193 str r3, [r2, #24] -1000039c: 4a09 ldr r2, [pc, #36] @ (100003c4 ) -1000039e: 2140 movs r1, #64 @ 0x40 -100003a0: 4694 mov ip, r2 -100003a2: 0083 lsls r3, r0, #2 -100003a4: 4463 add r3, ip -100003a6: 681a ldr r2, [r3, #0] -100003a8: 00c0 lsls r0, r0, #3 -100003aa: 404a eors r2, r1 -100003ac: 3180 adds r1, #128 @ 0x80 -100003ae: 4011 ands r1, r2 -100003b0: 2280 movs r2, #128 @ 0x80 -100003b2: 0152 lsls r2, r2, #5 -100003b4: 4313 orrs r3, r2 -100003b6: 6019 str r1, [r3, #0] -100003b8: 4b03 ldr r3, [pc, #12] @ (100003c8 ) -100003ba: 469c mov ip, r3 -100003bc: 2305 movs r3, #5 -100003be: 4460 add r0, ip -100003c0: 6043 str r3, [r0, #4] -100003c2: 4770 bx lr -100003c4: 4001c004 .word 0x4001c004 -100003c8: 40014000 .word 0x40014000 - -100003cc : -100003cc: 4b02 ldr r3, [pc, #8] @ (100003d8 ) -100003ce: 6818 ldr r0, [r3, #0] -100003d0: 0780 lsls r0, r0, #30 -100003d2: 0fc0 lsrs r0, r0, #31 -100003d4: 4770 bx lr -100003d6: 46c0 nop @ (mov r8, r8) -100003d8: 4006c000 .word 0x4006c000 - -100003dc : -100003dc: b570 push {r4, r5, r6, lr} -100003de: f3ef 8c10 mrs ip, PRIMASK -100003e2: b672 cpsid i -100003e4: 4d0d ldr r5, [pc, #52] @ (1000041c ) -100003e6: 682b ldr r3, [r5, #0] -100003e8: 2b00 cmp r3, #0 -100003ea: d0fc beq.n 100003e6 -100003ec: f3bf 8f5f dmb sy -100003f0: 2407 movs r4, #7 -100003f2: 08cb lsrs r3, r1, #3 -100003f4: 18c6 adds r6, r0, r3 -100003f6: 5cc0 ldrb r0, [r0, r3] -100003f8: 2301 movs r3, #1 -100003fa: 400c ands r4, r1 -100003fc: 40a3 lsls r3, r4 -100003fe: 001c movs r4, r3 -10000400: 4004 ands r4, r0 -10000402: 4203 tst r3, r0 -10000404: d107 bne.n 10000416 -10000406: 4318 orrs r0, r3 -10000408: 7030 strb r0, [r6, #0] -1000040a: f3bf 8f5f dmb sy -1000040e: 602c str r4, [r5, #0] -10000410: f38c 8810 msr PRIMASK, ip -10000414: bd70 pop {r4, r5, r6, pc} -10000416: 0010 movs r0, r2 -10000418: f001 fda4 bl 10001f64 -1000041c: d000012c .word 0xd000012c - -10000420 : -10000420: b5f8 push {r3, r4, r5, r6, r7, lr} -10000422: 4647 mov r7, r8 -10000424: 46ce mov lr, r9 -10000426: 4688 mov r8, r1 -10000428: b580 push {r7, lr} -1000042a: f3ef 8c10 mrs ip, PRIMASK -1000042e: b672 cpsid i -10000430: 4d21 ldr r5, [pc, #132] @ (100004b8 ) -10000432: 682c ldr r4, [r5, #0] -10000434: 2c00 cmp r4, #0 -10000436: d0fc beq.n 10000432 -10000438: f3bf 8f5f dmb sy -1000043c: 429a cmp r2, r3 -1000043e: d82c bhi.n 1000049a -10000440: 08d4 lsrs r4, r2, #3 -10000442: 2707 movs r7, #7 -10000444: 5d05 ldrb r5, [r0, r4] -10000446: 1906 adds r6, r0, r4 -10000448: 2401 movs r4, #1 -1000044a: 4017 ands r7, r2 -1000044c: 40bc lsls r4, r7 -1000044e: 422c tst r4, r5 -10000450: d01f beq.n 10000492 -10000452: 2107 movs r1, #7 -10000454: 2701 movs r7, #1 -10000456: 4689 mov r9, r1 -10000458: e009 b.n 1000046e -1000045a: 08d4 lsrs r4, r2, #3 -1000045c: 5d05 ldrb r5, [r0, r4] -1000045e: 1906 adds r6, r0, r4 -10000460: 464c mov r4, r9 -10000462: 0039 movs r1, r7 -10000464: 4014 ands r4, r2 -10000466: 40a1 lsls r1, r4 -10000468: 000c movs r4, r1 -1000046a: 4229 tst r1, r5 -1000046c: d011 beq.n 10000492 -1000046e: 3201 adds r2, #1 -10000470: 4293 cmp r3, r2 -10000472: d2f2 bcs.n 1000045a -10000474: 2001 movs r0, #1 -10000476: 4240 negs r0, r0 -10000478: f3bf 8f5f dmb sy -1000047c: 2200 movs r2, #0 -1000047e: 4b0e ldr r3, [pc, #56] @ (100004b8 ) -10000480: 601a str r2, [r3, #0] -10000482: f38c 8810 msr PRIMASK, ip -10000486: 2800 cmp r0, #0 -10000488: db0f blt.n 100004aa -1000048a: bcc0 pop {r6, r7} -1000048c: 46b9 mov r9, r7 -1000048e: 46b0 mov r8, r6 -10000490: bdf8 pop {r3, r4, r5, r6, r7, pc} -10000492: 4325 orrs r5, r4 -10000494: 0010 movs r0, r2 -10000496: 7035 strb r5, [r6, #0] -10000498: e7ee b.n 10000478 -1000049a: f3bf 8f5f dmb sy -1000049e: 2300 movs r3, #0 -100004a0: 602b str r3, [r5, #0] -100004a2: f38c 8810 msr PRIMASK, ip -100004a6: 2001 movs r0, #1 -100004a8: 4240 negs r0, r0 -100004aa: 4643 mov r3, r8 -100004ac: 2b00 cmp r3, #0 -100004ae: d0ec beq.n 1000048a -100004b0: 9808 ldr r0, [sp, #32] -100004b2: f001 fd57 bl 10001f64 -100004b6: 46c0 nop @ (mov r8, r8) -100004b8: d000012c .word 0xd000012c - -100004bc : -100004bc: 2100 movs r1, #0 -100004be: 4b04 ldr r3, [pc, #16] @ (100004d0 ) -100004c0: 4a04 ldr r2, [pc, #16] @ (100004d4 ) -100004c2: f3bf 8f5f dmb sy -100004c6: c302 stmia r3!, {r1} -100004c8: 4293 cmp r3, r2 -100004ca: d1fa bne.n 100004c2 -100004cc: 4770 bx lr -100004ce: 46c0 nop @ (mov r8, r8) -100004d0: d0000100 .word 0xd0000100 -100004d4: d0000180 .word 0xd0000180 - -100004d8 : -100004d8: 4a04 ldr r2, [pc, #16] @ (100004ec ) -100004da: 7810 ldrb r0, [r2, #0] -100004dc: 1c43 adds r3, r0, #1 -100004de: b2db uxtb r3, r3 -100004e0: 2b17 cmp r3, #23 -100004e2: d900 bls.n 100004e6 -100004e4: 2310 movs r3, #16 -100004e6: 7013 strb r3, [r2, #0] -100004e8: 4770 bx lr -100004ea: 46c0 nop @ (mov r8, r8) -100004ec: 20000de8 .word 0x20000de8 - -100004f0 : -100004f0: b510 push {r4, lr} -100004f2: 4b06 ldr r3, [pc, #24] @ (1000050c ) -100004f4: 4c06 ldr r4, [pc, #24] @ (10000510 ) -100004f6: b082 sub sp, #8 -100004f8: 0001 movs r1, r0 -100004fa: 9300 str r3, [sp, #0] -100004fc: 2218 movs r2, #24 -100004fe: 231f movs r3, #31 -10000500: 0020 movs r0, r4 -10000502: f7ff ff8d bl 10000420 -10000506: b002 add sp, #8 -10000508: bd10 pop {r4, pc} -1000050a: 46c0 nop @ (mov r8, r8) -1000050c: 10006e40 .word 0x10006e40 -10000510: 2000178c .word 0x2000178c - -10000514 : -10000514: 2301 movs r3, #1 -10000516: 4083 lsls r3, r0 -10000518: 2900 cmp r1, #0 -1000051a: d004 beq.n 10000526 -1000051c: 4a03 ldr r2, [pc, #12] @ (1000052c ) -1000051e: 6013 str r3, [r2, #0] -10000520: 4a03 ldr r2, [pc, #12] @ (10000530 ) -10000522: 6013 str r3, [r2, #0] -10000524: 4770 bx lr -10000526: 4a03 ldr r2, [pc, #12] @ (10000534 ) -10000528: 6013 str r3, [r2, #0] -1000052a: e7fb b.n 10000524 -1000052c: e000e280 .word 0xe000e280 -10000530: e000e100 .word 0xe000e100 -10000534: e000e180 .word 0xe000e180 - -10000538 : -10000538: 2301 movs r3, #1 -1000053a: 4083 lsls r3, r0 -1000053c: 4a01 ldr r2, [pc, #4] @ (10000544 ) -1000053e: 6013 str r3, [r2, #0] -10000540: 4770 bx lr -10000542: 46c0 nop @ (mov r8, r8) -10000544: e000e200 .word 0xe000e200 - -10000548 : -10000548: 4b08 ldr r3, [pc, #32] @ (1000056c ) -1000054a: 3010 adds r0, #16 -1000054c: 689b ldr r3, [r3, #8] -1000054e: 0080 lsls r0, r0, #2 -10000550: 58c3 ldr r3, [r0, r3] -10000552: 2b00 cmp r3, #0 -10000554: d007 beq.n 10000566 -10000556: 4a06 ldr r2, [pc, #24] @ (10000570 ) -10000558: 2000 movs r0, #0 -1000055a: 1a9b subs r3, r3, r2 -1000055c: 222f movs r2, #47 @ 0x2f -1000055e: 429a cmp r2, r3 -10000560: 4140 adcs r0, r0 -10000562: b2c0 uxtb r0, r0 -10000564: 4770 bx lr -10000566: 2000 movs r0, #0 -10000568: e7fc b.n 10000564 -1000056a: 46c0 nop @ (mov r8, r8) -1000056c: e000ed00 .word 0xe000ed00 -10000570: 20000dec .word 0x20000dec - -10000574 : -10000574: 4b02 ldr r3, [pc, #8] @ (10000580 ) -10000576: 3010 adds r0, #16 -10000578: 689b ldr r3, [r3, #8] -1000057a: 0080 lsls r0, r0, #2 -1000057c: 58c0 ldr r0, [r0, r3] -1000057e: 4770 bx lr -10000580: e000ed00 .word 0xe000ed00 - -10000584 : -10000584: b570 push {r4, r5, r6, lr} -10000586: 000d movs r5, r1 -10000588: f3ef 8610 mrs r6, PRIMASK -1000058c: b672 cpsid i -1000058e: 4a0f ldr r2, [pc, #60] @ (100005cc ) -10000590: 6813 ldr r3, [r2, #0] -10000592: 2b00 cmp r3, #0 -10000594: d0fc beq.n 10000590 -10000596: f3bf 8f5f dmb sy -1000059a: 4b0d ldr r3, [pc, #52] @ (100005d0 ) -1000059c: 3010 adds r0, #16 -1000059e: 689b ldr r3, [r3, #8] -100005a0: 0084 lsls r4, r0, #2 -100005a2: 591b ldr r3, [r3, r4] -100005a4: 4a0b ldr r2, [pc, #44] @ (100005d4 ) -100005a6: 4293 cmp r3, r2 -100005a8: d003 beq.n 100005b2 -100005aa: 429d cmp r5, r3 -100005ac: d001 beq.n 100005b2 -100005ae: f001 fcf1 bl 10001f94 -100005b2: 4b07 ldr r3, [pc, #28] @ (100005d0 ) -100005b4: 689b ldr r3, [r3, #8] -100005b6: 511d str r5, [r3, r4] -100005b8: f3bf 8f5f dmb sy -100005bc: f3bf 8f5f dmb sy -100005c0: 2200 movs r2, #0 -100005c2: 4b02 ldr r3, [pc, #8] @ (100005cc ) -100005c4: 601a str r2, [r3, #0] -100005c6: f386 8810 msr PRIMASK, r6 -100005ca: bd70 pop {r4, r5, r6, pc} -100005cc: d0000124 .word 0xd0000124 -100005d0: e000ed00 .word 0xe000ed00 -100005d4: 100001cd .word 0x100001cd - -100005d8 : -100005d8: b5f0 push {r4, r5, r6, r7, lr} -100005da: 4657 mov r7, sl -100005dc: 464e mov r6, r9 -100005de: 46de mov lr, fp -100005e0: 4645 mov r5, r8 -100005e2: b5e0 push {r5, r6, r7, lr} -100005e4: b085 sub sp, #20 -100005e6: 0006 movs r6, r0 -100005e8: 9100 str r1, [sp, #0] -100005ea: 0017 movs r7, r2 -100005ec: f3ef 8b10 mrs fp, PRIMASK -100005f0: b672 cpsid i -100005f2: 4a6a ldr r2, [pc, #424] @ (1000079c ) -100005f4: 6813 ldr r3, [r2, #0] -100005f6: 2b00 cmp r3, #0 -100005f8: d0fc beq.n 100005f4 -100005fa: f3bf 8f5f dmb sy -100005fe: 2500 movs r5, #0 -10000600: 4b67 ldr r3, [pc, #412] @ (100007a0 ) -10000602: 575d ldrsb r5, [r3, r5] -10000604: 469a mov sl, r3 -10000606: 2d00 cmp r5, #0 -10000608: da00 bge.n 1000060c -1000060a: e0a9 b.n 10000760 -1000060c: 006b lsls r3, r5, #1 -1000060e: 4c65 ldr r4, [pc, #404] @ (100007a4 ) -10000610: 9301 str r3, [sp, #4] -10000612: 195b adds r3, r3, r5 -10000614: 009b lsls r3, r3, #2 -10000616: 4698 mov r8, r3 -10000618: 46a1 mov r9, r4 -1000061a: 44c1 add r9, r8 -1000061c: 464b mov r3, r9 -1000061e: 4652 mov r2, sl -10000620: 799b ldrb r3, [r3, #6] -10000622: 3610 adds r6, #16 -10000624: 7013 strb r3, [r2, #0] -10000626: 4b60 ldr r3, [pc, #384] @ (100007a8 ) -10000628: 00b6 lsls r6, r6, #2 -1000062a: 689b ldr r3, [r3, #8] -1000062c: 5999 ldr r1, [r3, r6] -1000062e: 1b0b subs r3, r1, r4 -10000630: 2b2f cmp r3, #47 @ 0x2f -10000632: d933 bls.n 1000069c -10000634: 4b5d ldr r3, [pc, #372] @ (100007ac ) -10000636: 4299 cmp r1, r3 -10000638: d000 beq.n 1000063c -1000063a: e0ac b.n 10000796 -1000063c: 9b01 ldr r3, [sp, #4] -1000063e: 4642 mov r2, r8 -10000640: 469c mov ip, r3 -10000642: 4b5b ldr r3, [pc, #364] @ (100007b0 ) -10000644: 4465 add r5, ip -10000646: 00ad lsls r5, r5, #2 -10000648: 5363 strh r3, [r4, r5] -1000064a: 4b5a ldr r3, [pc, #360] @ (100007b4 ) -1000064c: 3202 adds r2, #2 -1000064e: 18a2 adds r2, r4, r2 -10000650: 3b04 subs r3, #4 -10000652: 1a9b subs r3, r3, r2 -10000654: 051b lsls r3, r3, #20 -10000656: 4a58 ldr r2, [pc, #352] @ (100007b8 ) -10000658: 0d5b lsrs r3, r3, #21 -1000065a: 1965 adds r5, r4, r5 -1000065c: 4313 orrs r3, r2 -1000065e: 806b strh r3, [r5, #2] -10000660: 4b56 ldr r3, [pc, #344] @ (100007bc ) -10000662: 2101 movs r1, #1 -10000664: 80ab strh r3, [r5, #4] -10000666: 23ff movs r3, #255 @ 0xff -10000668: 71ab strb r3, [r5, #6] -1000066a: 9b00 ldr r3, [sp, #0] -1000066c: 71ef strb r7, [r5, #7] -1000066e: 60ab str r3, [r5, #8] -10000670: 464b mov r3, r9 -10000672: 430b orrs r3, r1 -10000674: 0019 movs r1, r3 -10000676: 4b4c ldr r3, [pc, #304] @ (100007a8 ) -10000678: 689b ldr r3, [r3, #8] -1000067a: 5199 str r1, [r3, r6] -1000067c: f3bf 8f5f dmb sy -10000680: f3bf 8f5f dmb sy -10000684: 2200 movs r2, #0 -10000686: 4b45 ldr r3, [pc, #276] @ (1000079c ) -10000688: 601a str r2, [r3, #0] -1000068a: f38b 8810 msr PRIMASK, fp -1000068e: b005 add sp, #20 -10000690: bcf0 pop {r4, r5, r6, r7} -10000692: 46bb mov fp, r7 -10000694: 46b2 mov sl, r6 -10000696: 46a9 mov r9, r5 -10000698: 46a0 mov r8, r4 -1000069a: bdf0 pop {r4, r5, r6, r7, pc} -1000069c: 2001 movs r0, #1 -1000069e: 000a movs r2, r1 -100006a0: 4382 bics r2, r0 -100006a2: 79d3 ldrb r3, [r2, #7] -100006a4: 468c mov ip, r1 -100006a6: 42bb cmp r3, r7 -100006a8: d831 bhi.n 1000070e -100006aa: 4645 mov r5, r8 -100006ac: 0013 movs r3, r2 -100006ae: 4944 ldr r1, [pc, #272] @ (100007c0 ) -100006b0: 1b1b subs r3, r3, r4 -100006b2: 415b adcs r3, r3 -100006b4: 4359 muls r1, r3 -100006b6: 0d09 lsrs r1, r1, #20 -100006b8: 4b3d ldr r3, [pc, #244] @ (100007b0 ) -100006ba: 5363 strh r3, [r4, r5] -100006bc: 4b3d ldr r3, [pc, #244] @ (100007b4 ) -100006be: 3502 adds r5, #2 -100006c0: 1965 adds r5, r4, r5 -100006c2: 3b04 subs r3, #4 -100006c4: 1b5b subs r3, r3, r5 -100006c6: 051b lsls r3, r3, #20 -100006c8: 4d3b ldr r5, [pc, #236] @ (100007b8 ) -100006ca: 0d5b lsrs r3, r3, #21 -100006cc: 432b orrs r3, r5 -100006ce: 46aa mov sl, r5 -100006d0: 464d mov r5, r9 -100006d2: 806b strh r3, [r5, #2] -100006d4: 2504 movs r5, #4 -100006d6: 46ac mov ip, r5 -100006d8: 4655 mov r5, sl -100006da: 44e0 add r8, ip -100006dc: 1f13 subs r3, r2, #4 -100006de: 4444 add r4, r8 -100006e0: 1b1b subs r3, r3, r4 -100006e2: 051b lsls r3, r3, #20 -100006e4: 0d5b lsrs r3, r3, #21 -100006e6: 431d orrs r5, r3 -100006e8: 464b mov r3, r9 -100006ea: 7199 strb r1, [r3, #6] -100006ec: 9900 ldr r1, [sp, #0] -100006ee: 809d strh r5, [r3, #4] -100006f0: 6099 str r1, [r3, #8] -100006f2: 4649 mov r1, r9 -100006f4: 71df strb r7, [r3, #7] -100006f6: 4b33 ldr r3, [pc, #204] @ (100007c4 ) -100006f8: 4301 orrs r1, r0 -100006fa: 6013 str r3, [r2, #0] -100006fc: e7bb b.n 10000676 -100006fe: 0058 lsls r0, r3, #1 -10000700: 18c0 adds r0, r0, r3 -10000702: 0080 lsls r0, r0, #2 -10000704: 1820 adds r0, r4, r0 -10000706: 79c1 ldrb r1, [r0, #7] -10000708: 42b9 cmp r1, r7 -1000070a: d92f bls.n 1000076c -1000070c: 0002 movs r2, r0 -1000070e: 2306 movs r3, #6 -10000710: 56d3 ldrsb r3, [r2, r3] -10000712: 2b00 cmp r3, #0 -10000714: daf3 bge.n 100006fe -10000716: 9302 str r3, [sp, #8] -10000718: 4b2b ldr r3, [pc, #172] @ (100007c8 ) -1000071a: 4661 mov r1, ip -1000071c: 9303 str r3, [sp, #12] -1000071e: 1d13 adds r3, r2, #4 -10000720: 469a mov sl, r3 -10000722: 2304 movs r3, #4 -10000724: 425b negs r3, r3 -10000726: 469c mov ip, r3 -10000728: 44e1 add r9, ip -1000072a: 4650 mov r0, sl -1000072c: 464b mov r3, r9 -1000072e: 1a1b subs r3, r3, r0 -10000730: 051b lsls r3, r3, #20 -10000732: 0d5b lsrs r3, r3, #21 -10000734: 469c mov ip, r3 -10000736: 4b20 ldr r3, [pc, #128] @ (100007b8 ) -10000738: 7195 strb r5, [r2, #6] -1000073a: 4698 mov r8, r3 -1000073c: 4663 mov r3, ip -1000073e: 4640 mov r0, r8 -10000740: 4303 orrs r3, r0 -10000742: 8093 strh r3, [r2, #4] -10000744: 9b01 ldr r3, [sp, #4] -10000746: 195a adds r2, r3, r5 -10000748: 0092 lsls r2, r2, #2 -1000074a: 9b03 ldr r3, [sp, #12] -1000074c: 18a4 adds r4, r4, r2 -1000074e: 80a3 strh r3, [r4, #4] -10000750: 9b02 ldr r3, [sp, #8] -10000752: 4a1c ldr r2, [pc, #112] @ (100007c4 ) -10000754: 71a3 strb r3, [r4, #6] -10000756: 9b00 ldr r3, [sp, #0] -10000758: 6022 str r2, [r4, #0] -1000075a: 71e7 strb r7, [r4, #7] -1000075c: 60a3 str r3, [r4, #8] -1000075e: e78a b.n 10000676 -10000760: f001 fc18 bl 10001f94 -10000764: 2500 movs r5, #0 -10000766: 4653 mov r3, sl -10000768: 575d ldrsb r5, [r3, r5] -1000076a: e74f b.n 1000060c -1000076c: 8890 ldrh r0, [r2, #4] -1000076e: 9302 str r3, [sp, #8] -10000770: 0540 lsls r0, r0, #21 -10000772: 1d13 adds r3, r2, #4 -10000774: 469a mov sl, r3 -10000776: 1503 asrs r3, r0, #20 -10000778: 4661 mov r1, ip -1000077a: 469c mov ip, r3 -1000077c: 4640 mov r0, r8 -1000077e: 44d4 add ip, sl -10000780: 4663 mov r3, ip -10000782: 3004 adds r0, #4 -10000784: 1820 adds r0, r4, r0 -10000786: 1a18 subs r0, r3, r0 -10000788: 23e0 movs r3, #224 @ 0xe0 -1000078a: 0500 lsls r0, r0, #20 -1000078c: 0d40 lsrs r0, r0, #21 -1000078e: 021b lsls r3, r3, #8 -10000790: 4318 orrs r0, r3 -10000792: 9003 str r0, [sp, #12] -10000794: e7c5 b.n 10000722 -10000796: f001 fbfd bl 10001f94 -1000079a: e74f b.n 1000063c -1000079c: d0000124 .word 0xd0000124 -100007a0: 20001c85 .word 0x20001c85 -100007a4: 20000dec .word 0x20000dec -100007a8: e000ed00 .word 0xe000ed00 -100007ac: 100001cd .word 0x100001cd -100007b0: ffffa100 .word 0xffffa100 -100007b4: 20000e1c .word 0x20000e1c -100007b8: ffffe000 .word 0xffffe000 -100007bc: ffffbd01 .word 0xffffbd01 -100007c0: 0000aaaa .word 0x0000aaaa -100007c4: 47804801 .word 0x47804801 -100007c8: 0000bd01 .word 0x0000bd01 - -100007cc : -100007cc: b5f0 push {r4, r5, r6, r7, lr} -100007ce: 46de mov lr, fp -100007d0: 4657 mov r7, sl -100007d2: 464e mov r6, r9 -100007d4: 4645 mov r5, r8 -100007d6: b5e0 push {r5, r6, r7, lr} -100007d8: 000c movs r4, r1 -100007da: b083 sub sp, #12 -100007dc: f3ef 8810 mrs r8, PRIMASK -100007e0: b672 cpsid i -100007e2: 4a5d ldr r2, [pc, #372] @ (10000958 ) -100007e4: 6813 ldr r3, [r2, #0] -100007e6: 2b00 cmp r3, #0 -100007e8: d0fc beq.n 100007e4 -100007ea: f3bf 8f5f dmb sy -100007ee: 4b5b ldr r3, [pc, #364] @ (1000095c ) -100007f0: 495b ldr r1, [pc, #364] @ (10000960 ) -100007f2: 689a ldr r2, [r3, #8] -100007f4: 0003 movs r3, r0 -100007f6: 3310 adds r3, #16 -100007f8: 009f lsls r7, r3, #2 -100007fa: 59d5 ldr r5, [r2, r7] -100007fc: 428d cmp r5, r1 -100007fe: d039 beq.n 10000874 -10000800: 42a5 cmp r5, r4 -10000802: d04a beq.n 1000089a -10000804: 4e57 ldr r6, [pc, #348] @ (10000964 ) -10000806: 1baa subs r2, r5, r6 -10000808: 2a2f cmp r2, #47 @ 0x2f -1000080a: d833 bhi.n 10000874 -1000080c: 2201 movs r2, #1 -1000080e: 4692 mov sl, r2 -10000810: 4082 lsls r2, r0 -10000812: 4691 mov r9, r2 -10000814: 4648 mov r0, r9 -10000816: 4a54 ldr r2, [pc, #336] @ (10000968 ) -10000818: 6812 ldr r2, [r2, #0] -1000081a: 4010 ands r0, r2 -1000081c: 9001 str r0, [sp, #4] -1000081e: 4648 mov r0, r9 -10000820: 4a52 ldr r2, [pc, #328] @ (1000096c ) -10000822: 6010 str r0, [r2, #0] -10000824: f3bf 8f5f dmb sy -10000828: f3ef 8205 mrs r2, IPSR -1000082c: 4693 mov fp, r2 -1000082e: 2a00 cmp r2, #0 -10000830: d035 beq.n 1000089e -10000832: 4293 cmp r3, r2 -10000834: d001 beq.n 1000083a -10000836: f001 fbad bl 10001f94 -1000083a: 002a movs r2, r5 -1000083c: 4653 mov r3, sl -1000083e: 439a bics r2, r3 -10000840: 6890 ldr r0, [r2, #8] -10000842: 4284 cmp r4, r0 -10000844: d108 bne.n 10000858 -10000846: e075 b.n 10000934 -10000848: 004b lsls r3, r1, #1 -1000084a: 185b adds r3, r3, r1 -1000084c: 009b lsls r3, r3, #2 -1000084e: 18f3 adds r3, r6, r3 -10000850: 6898 ldr r0, [r3, #8] -10000852: 42a0 cmp r0, r4 -10000854: d034 beq.n 100008c0 -10000856: 001a movs r2, r3 -10000858: 2106 movs r1, #6 -1000085a: 5651 ldrsb r1, [r2, r1] -1000085c: 2900 cmp r1, #0 -1000085e: daf3 bge.n 10000848 -10000860: 4284 cmp r4, r0 -10000862: d053 beq.n 1000090c -10000864: 9b01 ldr r3, [sp, #4] -10000866: 2b00 cmp r3, #0 -10000868: d026 beq.n 100008b8 -1000086a: 464a mov r2, r9 -1000086c: 4b40 ldr r3, [pc, #256] @ (10000970 ) -1000086e: 601a str r2, [r3, #0] -10000870: 4b3d ldr r3, [pc, #244] @ (10000968 ) -10000872: 601a str r2, [r3, #0] -10000874: 4b39 ldr r3, [pc, #228] @ (1000095c ) -10000876: 689b ldr r3, [r3, #8] -10000878: 51dd str r5, [r3, r7] -1000087a: f3bf 8f5f dmb sy -1000087e: f3bf 8f5f dmb sy -10000882: 2200 movs r2, #0 -10000884: 4b34 ldr r3, [pc, #208] @ (10000958 ) -10000886: 601a str r2, [r3, #0] -10000888: f388 8810 msr PRIMASK, r8 -1000088c: b003 add sp, #12 -1000088e: bcf0 pop {r4, r5, r6, r7} -10000890: 46bb mov fp, r7 -10000892: 46b2 mov sl, r6 -10000894: 46a9 mov r9, r5 -10000896: 46a0 mov r8, r4 -10000898: bdf0 pop {r4, r5, r6, r7, pc} -1000089a: 000d movs r5, r1 -1000089c: e7ea b.n 10000874 -1000089e: 002a movs r2, r5 -100008a0: 4653 mov r3, sl -100008a2: 439a bics r2, r3 -100008a4: 6890 ldr r0, [r2, #8] -100008a6: 4284 cmp r4, r0 -100008a8: d1d6 bne.n 10000858 -100008aa: 2006 movs r0, #6 -100008ac: 5610 ldrsb r0, [r2, r0] -100008ae: 0013 movs r3, r2 -100008b0: 2800 cmp r0, #0 -100008b2: da09 bge.n 100008c8 -100008b4: 000d movs r5, r1 -100008b6: e031 b.n 1000091c -100008b8: 464a mov r2, r9 -100008ba: 4b2c ldr r3, [pc, #176] @ (1000096c ) -100008bc: 601a str r2, [r3, #0] -100008be: e7d9 b.n 10000874 -100008c0: 2006 movs r0, #6 -100008c2: 5618 ldrsb r0, [r3, r0] -100008c4: 2800 cmp r0, #0 -100008c6: db22 blt.n 1000090e -100008c8: 0042 lsls r2, r0, #1 -100008ca: 1811 adds r1, r2, r0 -100008cc: 0089 lsls r1, r1, #2 -100008ce: 1874 adds r4, r6, r1 -100008d0: 468a mov sl, r1 -100008d2: 68a1 ldr r1, [r4, #8] -100008d4: 6099 str r1, [r3, #8] -100008d6: 79e1 ldrb r1, [r4, #7] -100008d8: 71d9 strb r1, [r3, #7] -100008da: 2106 movs r1, #6 -100008dc: 5661 ldrsb r1, [r4, r1] -100008de: 7199 strb r1, [r3, #6] -100008e0: 2900 cmp r1, #0 -100008e2: db25 blt.n 10000930 -100008e4: 88a4 ldrh r4, [r4, #4] -100008e6: 1af1 subs r1, r6, r3 -100008e8: 0564 lsls r4, r4, #21 -100008ea: 1524 asrs r4, r4, #20 -100008ec: 4454 add r4, sl -100008ee: 1909 adds r1, r1, r4 -100008f0: 24e0 movs r4, #224 @ 0xe0 -100008f2: 0509 lsls r1, r1, #20 -100008f4: 0d49 lsrs r1, r1, #21 -100008f6: 0224 lsls r4, r4, #8 -100008f8: 4321 orrs r1, r4 -100008fa: 8099 strh r1, [r3, #4] -100008fc: 1813 adds r3, r2, r0 -100008fe: 4a1d ldr r2, [pc, #116] @ (10000974 ) -10000900: 009b lsls r3, r3, #2 -10000902: 7811 ldrb r1, [r2, #0] -10000904: 18f3 adds r3, r6, r3 -10000906: 7199 strb r1, [r3, #6] -10000908: 7010 strb r0, [r2, #0] -1000090a: e7ab b.n 10000864 -1000090c: 0013 movs r3, r2 -1000090e: 4659 mov r1, fp -10000910: 2900 cmp r1, #0 -10000912: d114 bne.n 1000093e -10000914: 31ff adds r1, #255 @ 0xff -10000916: 7191 strb r1, [r2, #6] -10000918: 4917 ldr r1, [pc, #92] @ (10000978 ) -1000091a: 8091 strh r1, [r2, #4] -1000091c: 4915 ldr r1, [pc, #84] @ (10000974 ) -1000091e: 780a ldrb r2, [r1, #0] -10000920: 719a strb r2, [r3, #6] -10000922: 4a16 ldr r2, [pc, #88] @ (1000097c ) -10000924: 1b9b subs r3, r3, r6 -10000926: 415b adcs r3, r3 -10000928: 435a muls r2, r3 -1000092a: 0d12 lsrs r2, r2, #20 -1000092c: 700a strb r2, [r1, #0] -1000092e: e799 b.n 10000864 -10000930: 4913 ldr r1, [pc, #76] @ (10000980 ) -10000932: e7e2 b.n 100008fa -10000934: 2006 movs r0, #6 -10000936: 5610 ldrsb r0, [r2, r0] -10000938: 0013 movs r3, r2 -1000093a: 2800 cmp r0, #0 -1000093c: dac4 bge.n 100008c8 -1000093e: 4a11 ldr r2, [pc, #68] @ (10000984 ) -10000940: 4911 ldr r1, [pc, #68] @ (10000988 ) -10000942: 1ad2 subs r2, r2, r3 -10000944: 3a08 subs r2, #8 -10000946: 0250 lsls r0, r2, #9 -10000948: 0d40 lsrs r0, r0, #21 -1000094a: 4301 orrs r1, r0 -1000094c: 8099 strh r1, [r3, #4] -1000094e: 490f ldr r1, [pc, #60] @ (1000098c ) -10000950: 0852 lsrs r2, r2, #1 -10000952: 430a orrs r2, r1 -10000954: 80da strh r2, [r3, #6] -10000956: e785 b.n 10000864 -10000958: d0000124 .word 0xd0000124 -1000095c: e000ed00 .word 0xe000ed00 -10000960: 100001cd .word 0x100001cd -10000964: 20000dec .word 0x20000dec -10000968: e000e100 .word 0xe000e100 -1000096c: e000e180 .word 0xe000e180 -10000970: e000e280 .word 0xe000e280 -10000974: 20001c85 .word 0x20001c85 -10000978: ffffbd01 .word 0xffffbd01 -1000097c: 0000aaaa .word 0x0000aaaa -10000980: 0000bd01 .word 0x0000bd01 -10000984: 20000e26 .word 0x20000e26 -10000988: fffff000 .word 0xfffff000 -1000098c: fffff800 .word 0xfffff800 - -10000990 : -10000990: b570 push {r4, r5, r6, lr} -10000992: f3ef 8105 mrs r1, IPSR -10000996: 2401 movs r4, #1 -10000998: 4304 orrs r4, r0 -1000099a: f3ef 8c10 mrs ip, PRIMASK -1000099e: b672 cpsid i -100009a0: 4a21 ldr r2, [pc, #132] @ (10000a28 ) -100009a2: 6813 ldr r3, [r2, #0] -100009a4: 2b00 cmp r3, #0 -100009a6: d0fc beq.n 100009a2 -100009a8: f3bf 8f5f dmb sy -100009ac: 4b1f ldr r3, [pc, #124] @ (10000a2c ) -100009ae: 0005 movs r5, r0 -100009b0: 4a1f ldr r2, [pc, #124] @ (10000a30 ) -100009b2: 1aed subs r5, r5, r3 -100009b4: 416d adcs r5, r5 -100009b6: 436a muls r2, r5 -100009b8: 0d12 lsrs r2, r2, #20 -100009ba: 4d1e ldr r5, [pc, #120] @ (10000a34 ) -100009bc: 0089 lsls r1, r1, #2 -100009be: 68ae ldr r6, [r5, #8] -100009c0: b252 sxtb r2, r2 -100009c2: 5876 ldr r6, [r6, r1] -100009c4: 42a6 cmp r6, r4 -100009c6: d01c beq.n 10000a02 -100009c8: 2106 movs r1, #6 -100009ca: 5659 ldrsb r1, [r3, r1] -100009cc: 4291 cmp r1, r2 -100009ce: d01c beq.n 10000a0a -100009d0: 2112 movs r1, #18 -100009d2: 5659 ldrsb r1, [r3, r1] -100009d4: 4291 cmp r1, r2 -100009d6: d022 beq.n 10000a1e -100009d8: 211e movs r1, #30 -100009da: 5659 ldrsb r1, [r3, r1] -100009dc: 4291 cmp r1, r2 -100009de: d020 beq.n 10000a22 -100009e0: 212a movs r1, #42 @ 0x2a -100009e2: 5659 ldrsb r1, [r3, r1] -100009e4: 2403 movs r4, #3 -100009e6: 4291 cmp r1, r2 -100009e8: d010 beq.n 10000a0c -100009ea: 4b13 ldr r3, [pc, #76] @ (10000a38 ) -100009ec: 7819 ldrb r1, [r3, #0] -100009ee: 701a strb r2, [r3, #0] -100009f0: 7181 strb r1, [r0, #6] -100009f2: f3bf 8f5f dmb sy -100009f6: 2200 movs r2, #0 -100009f8: 4b0b ldr r3, [pc, #44] @ (10000a28 ) -100009fa: 601a str r2, [r3, #0] -100009fc: f38c 8810 msr PRIMASK, ip -10000a00: bd70 pop {r4, r5, r6, pc} -10000a02: 68ab ldr r3, [r5, #8] -10000a04: 4c0d ldr r4, [pc, #52] @ (10000a3c ) -10000a06: 505c str r4, [r3, r1] -10000a08: e7ef b.n 100009ea -10000a0a: 2400 movs r4, #0 -10000a0c: 0061 lsls r1, r4, #1 -10000a0e: 1909 adds r1, r1, r4 -10000a10: 0089 lsls r1, r1, #2 -10000a12: 185b adds r3, r3, r1 -10000a14: 21ff movs r1, #255 @ 0xff -10000a16: 7199 strb r1, [r3, #6] -10000a18: 4909 ldr r1, [pc, #36] @ (10000a40 ) -10000a1a: 8099 strh r1, [r3, #4] -10000a1c: e7e5 b.n 100009ea -10000a1e: 2401 movs r4, #1 -10000a20: e7f4 b.n 10000a0c -10000a22: 2402 movs r4, #2 -10000a24: e7f2 b.n 10000a0c -10000a26: 46c0 nop @ (mov r8, r8) -10000a28: d0000124 .word 0xd0000124 -10000a2c: 20000dec .word 0x20000dec -10000a30: 0000aaaa .word 0x0000aaaa -10000a34: e000ed00 .word 0xe000ed00 -10000a38: 20001c85 .word 0x20001c85 -10000a3c: 100001cd .word 0x100001cd -10000a40: ffffbd01 .word 0xffffbd01 - -10000a44 : -10000a44: 4b05 ldr r3, [pc, #20] @ (10000a5c ) -10000a46: 4a06 ldr r2, [pc, #24] @ (10000a60 ) -10000a48: 6013 str r3, [r2, #0] -10000a4a: 4a06 ldr r2, [pc, #24] @ (10000a64 ) -10000a4c: 6013 str r3, [r2, #0] -10000a4e: 6053 str r3, [r2, #4] -10000a50: 6093 str r3, [r2, #8] -10000a52: 60d3 str r3, [r2, #12] -10000a54: 6113 str r3, [r2, #16] -10000a56: 6153 str r3, [r2, #20] -10000a58: 6193 str r3, [r2, #24] -10000a5a: 4770 bx lr -10000a5c: 80808080 .word 0x80808080 -10000a60: e000e400 .word 0xe000e400 -10000a64: e000e404 .word 0xe000e404 - -10000a68 : -10000a68: b510 push {r4, lr} -10000a6a: 4b08 ldr r3, [pc, #32] @ (10000a8c ) -10000a6c: 4c08 ldr r4, [pc, #32] @ (10000a90 ) -10000a6e: b082 sub sp, #8 -10000a70: 0001 movs r1, r0 -10000a72: 9300 str r3, [sp, #0] -10000a74: 2200 movs r2, #0 -10000a76: 2305 movs r3, #5 -10000a78: 0020 movs r0, r4 -10000a7a: f7ff fcd1 bl 10000420 -10000a7e: 2800 cmp r0, #0 -10000a80: db01 blt.n 10000a86 -10000a82: 231f movs r3, #31 -10000a84: 1a18 subs r0, r3, r0 -10000a86: b002 add sp, #8 -10000a88: bd10 pop {r4, pc} -10000a8a: 46c0 nop @ (mov r8, r8) -10000a8c: 10006e5c .word 0x10006e5c -10000a90: 20001c8a .word 0x20001c8a - -10000a94 : -10000a94: 4b02 ldr r3, [pc, #8] @ (10000aa0 ) -10000a96: 469c mov ip, r3 -10000a98: 4461 add r1, ip -10000a9a: 0089 lsls r1, r1, #2 -10000a9c: 6001 str r1, [r0, #0] -10000a9e: 4770 bx lr -10000aa0: 34000040 .word 0x34000040 - -10000aa4 : -10000aa4: b510 push {r4, lr} -10000aa6: 0004 movs r4, r0 -10000aa8: f7ff fd16 bl 100004d8 -10000aac: 0001 movs r1, r0 -10000aae: 0020 movs r0, r4 -10000ab0: f7ff fff0 bl 10000a94 -10000ab4: 23ff movs r3, #255 @ 0xff -10000ab6: 7123 strb r3, [r4, #4] -10000ab8: f3bf 8f5f dmb sy -10000abc: bd10 pop {r4, pc} -10000abe: 46c0 nop @ (mov r8, r8) - -10000ac0 : -10000ac0: b510 push {r4, lr} -10000ac2: 0004 movs r4, r0 -10000ac4: f7ff fd08 bl 100004d8 -10000ac8: 0001 movs r1, r0 -10000aca: 0020 movs r0, r4 -10000acc: f7ff ffe2 bl 10000a94 -10000ad0: 23ff movs r3, #255 @ 0xff -10000ad2: 80a3 strh r3, [r4, #4] -10000ad4: f3bf 8f5f dmb sy -10000ad8: bd10 pop {r4, pc} -10000ada: 46c0 nop @ (mov r8, r8) - -10000adc : -10000adc: b510 push {r4, lr} -10000ade: 0004 movs r4, r0 -10000ae0: 2001 movs r0, #1 -10000ae2: f7ff fd05 bl 100004f0 -10000ae6: 4b03 ldr r3, [pc, #12] @ (10000af4 ) -10000ae8: 18c3 adds r3, r0, r3 -10000aea: 009b lsls r3, r3, #2 -10000aec: 6023 str r3, [r4, #0] -10000aee: f3bf 8f5f dmb sy -10000af2: bd10 pop {r4, pc} -10000af4: 34000040 .word 0x34000040 - -10000af8 : -10000af8: 4b03 ldr r3, [pc, #12] @ (10000b08 ) -10000afa: 469c mov ip, r3 -10000afc: 4461 add r1, ip -10000afe: 0089 lsls r1, r1, #2 -10000b00: 6001 str r1, [r0, #0] -10000b02: f3bf 8f5f dmb sy -10000b06: 4770 bx lr -10000b08: 34000040 .word 0x34000040 - -10000b0c : -10000b0c: 6883 ldr r3, [r0, #8] -10000b0e: 480b ldr r0, [pc, #44] @ (10000b3c ) -10000b10: b510 push {r4, lr} -10000b12: 4684 mov ip, r0 -10000b14: 4461 add r1, ip -10000b16: 4462 add r2, ip -10000b18: 0112 lsls r2, r2, #4 -10000b1a: 0109 lsls r1, r1, #4 -10000b1c: 1859 adds r1, r3, r1 -10000b1e: 189b adds r3, r3, r2 -10000b20: 685c ldr r4, [r3, #4] -10000b22: 684a ldr r2, [r1, #4] -10000b24: 2001 movs r0, #1 -10000b26: 4294 cmp r4, r2 -10000b28: d801 bhi.n 10000b2e -10000b2a: d002 beq.n 10000b32 -10000b2c: 2000 movs r0, #0 -10000b2e: b2c0 uxtb r0, r0 -10000b30: bd10 pop {r4, pc} -10000b32: 681a ldr r2, [r3, #0] -10000b34: 680b ldr r3, [r1, #0] -10000b36: 429a cmp r2, r3 -10000b38: d8f9 bhi.n 10000b2e -10000b3a: e7f7 b.n 10000b2c -10000b3c: 0fffffff .word 0x0fffffff - -10000b40 : -10000b40: 4b0a ldr r3, [pc, #40] @ (10000b6c ) -10000b42: 6819 ldr r1, [r3, #0] -10000b44: f3ef 8010 mrs r0, PRIMASK -10000b48: b672 cpsid i -10000b4a: 680a ldr r2, [r1, #0] -10000b4c: 2a00 cmp r2, #0 -10000b4e: d0fc beq.n 10000b4a -10000b50: f3bf 8f5f dmb sy -10000b54: 681b ldr r3, [r3, #0] -10000b56: f3bf 8f5f dmb sy -10000b5a: 2200 movs r2, #0 -10000b5c: 601a str r2, [r3, #0] -10000b5e: f380 8810 msr PRIMASK, r0 -10000b62: bf40 sev -10000b64: 2000 movs r0, #0 -10000b66: 2100 movs r1, #0 -10000b68: 4770 bx lr -10000b6a: 46c0 nop @ (mov r8, r8) -10000b6c: 20001c4c .word 0x20001c4c - -10000b70 : -10000b70: b5f8 push {r3, r4, r5, r6, r7, lr} -10000b72: 4657 mov r7, sl -10000b74: 4645 mov r5, r8 -10000b76: 464e mov r6, r9 -10000b78: 46de mov lr, fp -10000b7a: b5e0 push {r5, r6, r7, lr} -10000b7c: 4698 mov r8, r3 -10000b7e: ab0c add r3, sp, #48 @ 0x30 -10000b80: 781c ldrb r4, [r3, #0] -10000b82: ab0d add r3, sp, #52 @ 0x34 -10000b84: 781b ldrb r3, [r3, #0] -10000b86: 0007 movs r7, r0 -10000b88: 4691 mov r9, r2 -10000b8a: 469a mov sl, r3 -10000b8c: 6805 ldr r5, [r0, #0] -10000b8e: 2c00 cmp r4, #0 -10000b90: d159 bne.n 10000c46 -10000b92: 7bac ldrb r4, [r5, #14] -10000b94: 2c00 cmp r4, #0 -10000b96: d03b beq.n 10000c10 -10000b98: 0066 lsls r6, r4, #1 -10000b9a: 6829 ldr r1, [r5, #0] -10000b9c: 1936 adds r6, r6, r4 -10000b9e: 3e03 subs r6, #3 -10000ba0: 1989 adds r1, r1, r6 -10000ba2: 784b ldrb r3, [r1, #1] -10000ba4: 73ab strb r3, [r5, #14] -10000ba6: 2b00 cmp r3, #0 -10000ba8: d100 bne.n 10000bac -10000baa: 73eb strb r3, [r5, #15] -10000bac: 2300 movs r3, #0 -10000bae: 708b strb r3, [r1, #2] -10000bb0: 704b strb r3, [r1, #1] -10000bb2: 700b strb r3, [r1, #0] -10000bb4: 4b2d ldr r3, [pc, #180] @ (10000c6c ) -10000bb6: 18e2 adds r2, r4, r3 -10000bb8: 68bb ldr r3, [r7, #8] -10000bba: 0112 lsls r2, r2, #4 -10000bbc: 189b adds r3, r3, r2 -10000bbe: 464a mov r2, r9 -10000bc0: 601a str r2, [r3, #0] -10000bc2: 4642 mov r2, r8 -10000bc4: 605a str r2, [r3, #4] -10000bc6: 9a0a ldr r2, [sp, #40] @ 0x28 -10000bc8: 609a str r2, [r3, #8] -10000bca: 9a0b ldr r2, [sp, #44] @ 0x2c -10000bcc: 60da str r2, [r3, #12] -10000bce: 2300 movs r3, #0 -10000bd0: 708b strb r3, [r1, #2] -10000bd2: 704b strb r3, [r1, #1] -10000bd4: 700b strb r3, [r1, #0] -10000bd6: 7b6b ldrb r3, [r5, #13] -10000bd8: 469b mov fp, r3 -10000bda: 2b00 cmp r3, #0 -10000bdc: d026 beq.n 10000c2c -10000bde: 0022 movs r2, r4 -10000be0: 686b ldr r3, [r5, #4] -10000be2: 4659 mov r1, fp -10000be4: 68a8 ldr r0, [r5, #8] -10000be6: 4798 blx r3 -10000be8: 465b mov r3, fp -10000bea: 005b lsls r3, r3, #1 -10000bec: 445b add r3, fp -10000bee: 682a ldr r2, [r5, #0] -10000bf0: 3b03 subs r3, #3 -10000bf2: 2800 cmp r0, #0 -10000bf4: d012 beq.n 10000c1c -10000bf6: 4658 mov r0, fp -10000bf8: 1996 adds r6, r2, r6 -10000bfa: 70b0 strb r0, [r6, #2] -10000bfc: 18d1 adds r1, r2, r3 -10000bfe: 5cd3 ldrb r3, [r2, r3] -10000c00: 2b00 cmp r3, #0 -10000c02: d000 beq.n 10000c06 -10000c04: 7073 strb r3, [r6, #1] -10000c06: 465b mov r3, fp -10000c08: 700c strb r4, [r1, #0] -10000c0a: 736b strb r3, [r5, #13] -10000c0c: 455c cmp r4, fp -10000c0e: d00e beq.n 10000c2e -10000c10: bcf0 pop {r4, r5, r6, r7} -10000c12: 46bb mov fp, r7 -10000c14: 46b2 mov sl, r6 -10000c16: 46a9 mov r9, r5 -10000c18: 46a0 mov r8, r4 -10000c1a: bdf8 pop {r3, r4, r5, r6, r7, pc} -10000c1c: 18d3 adds r3, r2, r3 -10000c1e: 709c strb r4, [r3, #2] -10000c20: 1991 adds r1, r2, r6 -10000c22: 5d92 ldrb r2, [r2, r6] -10000c24: 2a00 cmp r2, #0 -10000c26: d11c bne.n 10000c62 -10000c28: 465b mov r3, fp -10000c2a: 700b strb r3, [r1, #0] -10000c2c: 736c strb r4, [r5, #13] -10000c2e: 464a mov r2, r9 -10000c30: 4643 mov r3, r8 -10000c32: 7d38 ldrb r0, [r7, #20] -10000c34: f000 fbd8 bl 100013e8 -10000c38: 1e05 subs r5, r0, #0 -10000c3a: d10a bne.n 10000c52 -10000c3c: 9b0e ldr r3, [sp, #56] @ 0x38 -10000c3e: 2b00 cmp r3, #0 -10000c40: d0e6 beq.n 10000c10 -10000c42: 701d strb r5, [r3, #0] -10000c44: e7e4 b.n 10000c10 -10000c46: 0066 lsls r6, r4, #1 -10000c48: 6829 ldr r1, [r5, #0] -10000c4a: 1936 adds r6, r6, r4 -10000c4c: 3e03 subs r6, #3 -10000c4e: 1989 adds r1, r1, r6 -10000c50: e7b0 b.n 10000bb4 -10000c52: 4653 mov r3, sl -10000c54: 2b00 cmp r3, #0 -10000c56: d1f1 bne.n 10000c3c -10000c58: 0021 movs r1, r4 -10000c5a: 6838 ldr r0, [r7, #0] -10000c5c: f000 fddc bl 10001818 -10000c60: e7ec b.n 10000c3c -10000c62: 705a strb r2, [r3, #1] -10000c64: 465b mov r3, fp -10000c66: 700b strb r3, [r1, #0] -10000c68: 736c strb r4, [r5, #13] -10000c6a: e7e0 b.n 10000c2e -10000c6c: 0fffffff .word 0x0fffffff - -10000c70 : -10000c70: b5f0 push {r4, r5, r6, r7, lr} -10000c72: 46de mov lr, fp -10000c74: 4657 mov r7, sl -10000c76: 464e mov r6, r9 -10000c78: 4645 mov r5, r8 -10000c7a: 2300 movs r3, #0 -10000c7c: b5e0 push {r5, r6, r7, lr} -10000c7e: b08b sub sp, #44 @ 0x2c -10000c80: 9308 str r3, [sp, #32] -10000c82: 4b68 ldr r3, [pc, #416] @ (10000e24 ) -10000c84: 0082 lsls r2, r0, #2 -10000c86: 58d4 ldr r4, [r2, r3] -10000c88: 2300 movs r3, #0 -10000c8a: 469b mov fp, r3 -10000c8c: 9009 str r0, [sp, #36] @ 0x24 -10000c8e: f000 fb17 bl 100012c0 -10000c92: 0002 movs r2, r0 -10000c94: 000b movs r3, r1 -10000c96: 6860 ldr r0, [r4, #4] -10000c98: f3ef 8a10 mrs sl, PRIMASK -10000c9c: b672 cpsid i -10000c9e: 4656 mov r6, sl -10000ca0: 6801 ldr r1, [r0, #0] -10000ca2: 2900 cmp r1, #0 -10000ca4: d0fc beq.n 10000ca0 -10000ca6: 46b2 mov sl, r6 -10000ca8: f3bf 8f5f dmb sy -10000cac: 6821 ldr r1, [r4, #0] -10000cae: 7b4f ldrb r7, [r1, #13] -10000cb0: 468c mov ip, r1 -10000cb2: 2f00 cmp r7, #0 -10000cb4: d02e beq.n 10000d14 -10000cb6: 68a5 ldr r5, [r4, #8] -10000cb8: 495b ldr r1, [pc, #364] @ (10000e28 ) -10000cba: 46a9 mov r9, r5 -10000cbc: 1879 adds r1, r7, r1 -10000cbe: 0109 lsls r1, r1, #4 -10000cc0: 4489 add r9, r1 -10000cc2: 4649 mov r1, r9 -10000cc4: 6808 ldr r0, [r1, #0] -10000cc6: 6849 ldr r1, [r1, #4] -10000cc8: 0005 movs r5, r0 -10000cca: 000e movs r6, r1 -10000ccc: 1aad subs r5, r5, r2 -10000cce: 419e sbcs r6, r3 -10000cd0: 2e00 cmp r6, #0 -10000cd2: dd5f ble.n 10000d94 -10000cd4: 0002 movs r2, r0 -10000cd6: 000b movs r3, r1 -10000cd8: 9809 ldr r0, [sp, #36] @ 0x24 -10000cda: f000 fb85 bl 100013e8 -10000cde: 2300 movs r3, #0 -10000ce0: 2200 movs r2, #0 -10000ce2: 4699 mov r9, r3 -10000ce4: 2300 movs r3, #0 -10000ce6: 9206 str r2, [sp, #24] -10000ce8: 9307 str r3, [sp, #28] -10000cea: 2300 movs r3, #0 -10000cec: 4698 mov r8, r3 -10000cee: 6863 ldr r3, [r4, #4] -10000cf0: f3bf 8f5f dmb sy -10000cf4: 465a mov r2, fp -10000cf6: 601a str r2, [r3, #0] -10000cf8: f38a 8810 msr PRIMASK, sl -10000cfc: 4643 mov r3, r8 -10000cfe: 2b00 cmp r3, #0 -10000d00: d112 bne.n 10000d28 -10000d02: 2800 cmp r0, #0 -10000d04: d1c3 bne.n 10000c8e -10000d06: b00b add sp, #44 @ 0x2c -10000d08: bcf0 pop {r4, r5, r6, r7} -10000d0a: 46bb mov fp, r7 -10000d0c: 46b2 mov sl, r6 -10000d0e: 46a9 mov r9, r5 -10000d10: 46a0 mov r8, r4 -10000d12: bdf0 pop {r4, r5, r6, r7, pc} -10000d14: 2300 movs r3, #0 -10000d16: 2200 movs r2, #0 -10000d18: 4699 mov r9, r3 -10000d1a: 2300 movs r3, #0 -10000d1c: 9206 str r2, [sp, #24] -10000d1e: 9307 str r3, [sp, #28] -10000d20: 2300 movs r3, #0 -10000d22: 2000 movs r0, #0 -10000d24: 4698 mov r8, r3 -10000d26: e7e2 b.n 10000cee -10000d28: 9b08 ldr r3, [sp, #32] -10000d2a: 4649 mov r1, r9 -10000d2c: 0218 lsls r0, r3, #8 -10000d2e: 4338 orrs r0, r7 -10000d30: 47c0 blx r8 -10000d32: 6862 ldr r2, [r4, #4] -10000d34: 0005 movs r5, r0 -10000d36: 000e movs r6, r1 -10000d38: f3ef 8a10 mrs sl, PRIMASK -10000d3c: b672 cpsid i -10000d3e: 6813 ldr r3, [r2, #0] -10000d40: 2b00 cmp r3, #0 -10000d42: d0fc beq.n 10000d3e -10000d44: f3bf 8f5f dmb sy -10000d48: 2e00 cmp r6, #0 -10000d4a: db41 blt.n 10000dd0 -10000d4c: 002b movs r3, r5 -10000d4e: 4333 orrs r3, r6 -10000d50: d002 beq.n 10000d58 -10000d52: 6923 ldr r3, [r4, #16] -10000d54: 2b00 cmp r3, #0 -10000d56: d156 bne.n 10000e06 -10000d58: 6823 ldr r3, [r4, #0] -10000d5a: 7bd9 ldrb r1, [r3, #15] -10000d5c: 2900 cmp r1, #0 -10000d5e: d005 beq.n 10000d6c -10000d60: 681a ldr r2, [r3, #0] -10000d62: 0048 lsls r0, r1, #1 -10000d64: 1841 adds r1, r0, r1 -10000d66: 1852 adds r2, r2, r1 -10000d68: 3a03 subs r2, #3 -10000d6a: 7057 strb r7, [r2, #1] -10000d6c: 7b9a ldrb r2, [r3, #14] -10000d6e: 2a00 cmp r2, #0 -10000d70: d100 bne.n 10000d74 -10000d72: 739f strb r7, [r3, #14] -10000d74: 73df strb r7, [r3, #15] -10000d76: 68e2 ldr r2, [r4, #12] -10000d78: 3f01 subs r7, #1 -10000d7a: 5dd3 ldrb r3, [r2, r7] -10000d7c: 3301 adds r3, #1 -10000d7e: 55d3 strb r3, [r2, r7] -10000d80: 465b mov r3, fp -10000d82: 6123 str r3, [r4, #16] -10000d84: 6863 ldr r3, [r4, #4] -10000d86: f3bf 8f5f dmb sy -10000d8a: 465a mov r2, fp -10000d8c: 601a str r2, [r3, #0] -10000d8e: f38a 8810 msr PRIMASK, sl -10000d92: e77c b.n 10000c8e -10000d94: 2e00 cmp r6, #0 -10000d96: d102 bne.n 10000d9e -10000d98: 2d00 cmp r5, #0 -10000d9a: d000 beq.n 10000d9e -10000d9c: e79a b.n 10000cd4 -10000d9e: 2100 movs r1, #0 -10000da0: 4660 mov r0, ip -10000da2: f000 fcb7 bl 10001714 -10000da6: 464b mov r3, r9 -10000da8: 681a ldr r2, [r3, #0] -10000daa: 685b ldr r3, [r3, #4] -10000dac: 9206 str r2, [sp, #24] -10000dae: 9307 str r3, [sp, #28] -10000db0: 464b mov r3, r9 -10000db2: 689b ldr r3, [r3, #8] -10000db4: 4698 mov r8, r3 -10000db6: 464b mov r3, r9 -10000db8: 68db ldr r3, [r3, #12] -10000dba: 4699 mov r9, r3 -10000dbc: 68e3 ldr r3, [r4, #12] -10000dbe: 19db adds r3, r3, r7 -10000dc0: 3b01 subs r3, #1 -10000dc2: 781b ldrb r3, [r3, #0] -10000dc4: 9308 str r3, [sp, #32] -10000dc6: 021b lsls r3, r3, #8 -10000dc8: 4303 orrs r3, r0 -10000dca: 6123 str r3, [r4, #16] -10000dcc: 2000 movs r0, #0 -10000dce: e78e b.n 10000cee -10000dd0: 6923 ldr r3, [r4, #16] -10000dd2: 2b00 cmp r3, #0 -10000dd4: d0c0 beq.n 10000d58 -10000dd6: 9a06 ldr r2, [sp, #24] -10000dd8: 9b07 ldr r3, [sp, #28] -10000dda: 2180 movs r1, #128 @ 0x80 -10000ddc: 1b52 subs r2, r2, r5 -10000dde: 41b3 sbcs r3, r6 -10000de0: 0609 lsls r1, r1, #24 -10000de2: 428b cmp r3, r1 -10000de4: d302 bcc.n 10000dec -10000de6: 2201 movs r2, #1 -10000de8: 4b10 ldr r3, [pc, #64] @ (10000e2c ) -10000dea: 4252 negs r2, r2 -10000dec: 2100 movs r1, #0 -10000dee: 9104 str r1, [sp, #16] -10000df0: 3101 adds r1, #1 -10000df2: 9103 str r1, [sp, #12] -10000df4: 4649 mov r1, r9 -10000df6: 9101 str r1, [sp, #4] -10000df8: 4641 mov r1, r8 -10000dfa: 0020 movs r0, r4 -10000dfc: 9702 str r7, [sp, #8] -10000dfe: 9100 str r1, [sp, #0] -10000e00: f7ff feb6 bl 10000b70 -10000e04: e7bc b.n 10000d80 -10000e06: f000 fa5b bl 100012c0 -10000e0a: 002a movs r2, r5 -10000e0c: 0033 movs r3, r6 -10000e0e: 1812 adds r2, r2, r0 -10000e10: 414b adcs r3, r1 -10000e12: 2180 movs r1, #128 @ 0x80 -10000e14: 0609 lsls r1, r1, #24 -10000e16: 428b cmp r3, r1 -10000e18: d3e8 bcc.n 10000dec -10000e1a: 2201 movs r2, #1 -10000e1c: 4b03 ldr r3, [pc, #12] @ (10000e2c ) -10000e1e: 4252 negs r2, r2 -10000e20: e7e4 b.n 10000dec -10000e22: 46c0 nop @ (mov r8, r8) -10000e24: 20001c30 .word 0x20001c30 -10000e28: 0fffffff .word 0x0fffffff -10000e2c: 7fffffff .word 0x7fffffff - -10000e30 : -10000e30: b510 push {r4, lr} -10000e32: 4c14 ldr r4, [pc, #80] @ (10000e84 ) -10000e34: 6863 ldr r3, [r4, #4] -10000e36: 2b00 cmp r3, #0 -10000e38: d004 beq.n 10000e44 -10000e3a: 210a movs r1, #10 -10000e3c: 4812 ldr r0, [pc, #72] @ (10000e88 ) -10000e3e: f7ff fe29 bl 10000a94 -10000e42: bd10 pop {r4, pc} -10000e44: 0023 movs r3, r4 -10000e46: 4a11 ldr r2, [pc, #68] @ (10000e8c ) -10000e48: 2110 movs r1, #16 -10000e4a: 6820 ldr r0, [r4, #0] -10000e4c: f000 fb7e bl 1000154c -10000e50: 2003 movs r0, #3 -10000e52: f000 fa29 bl 100012a8 -10000e56: 2003 movs r0, #3 -10000e58: f000 fb2e bl 100014b8 -10000e5c: 2003 movs r0, #3 -10000e5e: 490c ldr r1, [pc, #48] @ (10000e90 ) -10000e60: f000 fa7c bl 1000135c -10000e64: f7ff fb38 bl 100004d8 -10000e68: 4b0a ldr r3, [pc, #40] @ (10000e94 ) -10000e6a: 469c mov ip, r3 -10000e6c: 2303 movs r3, #3 -10000e6e: 7523 strb r3, [r4, #20] -10000e70: 23d0 movs r3, #208 @ 0xd0 -10000e72: 061b lsls r3, r3, #24 -10000e74: 681b ldr r3, [r3, #0] -10000e76: 4460 add r0, ip -10000e78: 7563 strb r3, [r4, #21] -10000e7a: 4b07 ldr r3, [pc, #28] @ (10000e98 ) -10000e7c: 0080 lsls r0, r0, #2 -10000e7e: 6060 str r0, [r4, #4] -10000e80: 60dc str r4, [r3, #12] -10000e82: e7da b.n 10000e3a -10000e84: 20000e34 .word 0x20000e34 -10000e88: 20001c4c .word 0x20001c4c -10000e8c: 10000b0d .word 0x10000b0d -10000e90: 10000c71 .word 0x10000c71 -10000e94: 34000040 .word 0x34000040 -10000e98: 20001c30 .word 0x20001c30 - -10000e9c : -10000e9c: 4800 ldr r0, [pc, #0] @ (10000ea0 ) -10000e9e: 4770 bx lr -10000ea0: 20000e34 .word 0x20000e34 - -10000ea4 : -10000ea4: b5f0 push {r4, r5, r6, r7, lr} -10000ea6: 4657 mov r7, sl -10000ea8: 464e mov r6, r9 -10000eaa: 4645 mov r5, r8 -10000eac: 46de mov lr, fp -10000eae: b5e0 push {r5, r6, r7, lr} -10000eb0: b085 sub sp, #20 -10000eb2: 9301 str r3, [sp, #4] -10000eb4: ab10 add r3, sp, #64 @ 0x40 -10000eb6: 781b ldrb r3, [r3, #0] -10000eb8: 0006 movs r6, r0 -10000eba: 9303 str r3, [sp, #12] -10000ebc: 2300 movs r3, #0 -10000ebe: 469a mov sl, r3 -10000ec0: 4698 mov r8, r3 -10000ec2: 9200 str r2, [sp, #0] -10000ec4: 6872 ldr r2, [r6, #4] -10000ec6: f3ef 8b10 mrs fp, PRIMASK -10000eca: b672 cpsid i -10000ecc: 6813 ldr r3, [r2, #0] -10000ece: 2b00 cmp r3, #0 -10000ed0: d0fc beq.n 10000ecc -10000ed2: f3bf 8f5f dmb sy -10000ed6: 6835 ldr r5, [r6, #0] -10000ed8: 7bac ldrb r4, [r5, #14] -10000eda: 2c00 cmp r4, #0 -10000edc: d100 bne.n 10000ee0 -10000ede: e06e b.n 10000fbe -10000ee0: 0067 lsls r7, r4, #1 -10000ee2: 682b ldr r3, [r5, #0] -10000ee4: 193f adds r7, r7, r4 -10000ee6: 3f03 subs r7, #3 -10000ee8: 19db adds r3, r3, r7 -10000eea: 785a ldrb r2, [r3, #1] -10000eec: 73aa strb r2, [r5, #14] -10000eee: 2a00 cmp r2, #0 -10000ef0: d100 bne.n 10000ef4 -10000ef2: 73ea strb r2, [r5, #15] -10000ef4: 4a48 ldr r2, [pc, #288] @ (10001018 ) -10000ef6: 18a1 adds r1, r4, r2 -10000ef8: 68b2 ldr r2, [r6, #8] -10000efa: 0109 lsls r1, r1, #4 -10000efc: 1852 adds r2, r2, r1 -10000efe: 9800 ldr r0, [sp, #0] -10000f00: 9901 ldr r1, [sp, #4] -10000f02: 6010 str r0, [r2, #0] -10000f04: 6051 str r1, [r2, #4] -10000f06: 990e ldr r1, [sp, #56] @ 0x38 -10000f08: 6091 str r1, [r2, #8] -10000f0a: 990f ldr r1, [sp, #60] @ 0x3c -10000f0c: 60d1 str r1, [r2, #12] -10000f0e: 4642 mov r2, r8 -10000f10: 709a strb r2, [r3, #2] -10000f12: 705a strb r2, [r3, #1] -10000f14: 701a strb r2, [r3, #0] -10000f16: 7b6b ldrb r3, [r5, #13] -10000f18: 4699 mov r9, r3 -10000f1a: 2b00 cmp r3, #0 -10000f1c: d100 bne.n 10000f20 -10000f1e: e06b b.n 10000ff8 -10000f20: 0022 movs r2, r4 -10000f22: 686b ldr r3, [r5, #4] -10000f24: 4649 mov r1, r9 -10000f26: 68a8 ldr r0, [r5, #8] -10000f28: 4798 blx r3 -10000f2a: 464b mov r3, r9 -10000f2c: 005b lsls r3, r3, #1 -10000f2e: 444b add r3, r9 -10000f30: 682a ldr r2, [r5, #0] -10000f32: 3b03 subs r3, #3 -10000f34: 2800 cmp r0, #0 -10000f36: d056 beq.n 10000fe6 -10000f38: 4648 mov r0, r9 -10000f3a: 19d7 adds r7, r2, r7 -10000f3c: 70b8 strb r0, [r7, #2] -10000f3e: 18d1 adds r1, r2, r3 -10000f40: 5cd3 ldrb r3, [r2, r3] -10000f42: 2b00 cmp r3, #0 -10000f44: d000 beq.n 10000f48 -10000f46: 707b strb r3, [r7, #1] -10000f48: 464b mov r3, r9 -10000f4a: 700c strb r4, [r1, #0] -10000f4c: 736b strb r3, [r5, #13] -10000f4e: 454c cmp r4, r9 -10000f50: d053 beq.n 10000ffa -10000f52: 68f3 ldr r3, [r6, #12] -10000f54: 191b adds r3, r3, r4 -10000f56: 3b01 subs r3, #1 -10000f58: 7818 ldrb r0, [r3, #0] -10000f5a: 6873 ldr r3, [r6, #4] -10000f5c: f3bf 8f5f dmb sy -10000f60: 4642 mov r2, r8 -10000f62: 601a str r2, [r3, #0] -10000f64: f38b 8810 msr PRIMASK, fp -10000f68: 4653 mov r3, sl -10000f6a: 2b00 cmp r3, #0 -10000f6c: d108 bne.n 10000f80 -10000f6e: 0200 lsls r0, r0, #8 -10000f70: 4320 orrs r0, r4 -10000f72: b005 add sp, #20 -10000f74: bcf0 pop {r4, r5, r6, r7} -10000f76: 46bb mov fp, r7 -10000f78: 46b2 mov sl, r6 -10000f7a: 46a9 mov r9, r5 -10000f7c: 46a0 mov r8, r4 -10000f7e: bdf0 pop {r4, r5, r6, r7, pc} -10000f80: 9b03 ldr r3, [sp, #12] -10000f82: 2b00 cmp r3, #0 -10000f84: d046 beq.n 10001014 -10000f86: 9b0e ldr r3, [sp, #56] @ 0x38 -10000f88: 2000 movs r0, #0 -10000f8a: 990f ldr r1, [sp, #60] @ 0x3c -10000f8c: 4798 blx r3 -10000f8e: 0003 movs r3, r0 -10000f90: 430b orrs r3, r1 -10000f92: d03f beq.n 10001014 -10000f94: 0004 movs r4, r0 -10000f96: 1e0d subs r5, r1, #0 -10000f98: da1a bge.n 10000fd0 -10000f9a: 9a00 ldr r2, [sp, #0] -10000f9c: 9b01 ldr r3, [sp, #4] -10000f9e: 1b12 subs r2, r2, r4 -10000fa0: 41ab sbcs r3, r5 -10000fa2: 9200 str r2, [sp, #0] -10000fa4: 9301 str r3, [sp, #4] -10000fa6: 2280 movs r2, #128 @ 0x80 -10000fa8: 0612 lsls r2, r2, #24 -10000faa: 4293 cmp r3, r2 -10000fac: d304 bcc.n 10000fb8 -10000fae: 2301 movs r3, #1 -10000fb0: 4c1a ldr r4, [pc, #104] @ (1000101c ) -10000fb2: 425b negs r3, r3 -10000fb4: 9300 str r3, [sp, #0] -10000fb6: 9401 str r4, [sp, #4] -10000fb8: 9b03 ldr r3, [sp, #12] -10000fba: 469a mov sl, r3 -10000fbc: e782 b.n 10000ec4 -10000fbe: 6873 ldr r3, [r6, #4] -10000fc0: f3bf 8f5f dmb sy -10000fc4: 601c str r4, [r3, #0] -10000fc6: f38b 8810 msr PRIMASK, fp -10000fca: 2001 movs r0, #1 -10000fcc: 4240 negs r0, r0 -10000fce: e7d0 b.n 10000f72 -10000fd0: f000 f976 bl 100012c0 -10000fd4: 2280 movs r2, #128 @ 0x80 -10000fd6: 1900 adds r0, r0, r4 -10000fd8: 4169 adcs r1, r5 -10000fda: 0612 lsls r2, r2, #24 -10000fdc: 9000 str r0, [sp, #0] -10000fde: 9101 str r1, [sp, #4] -10000fe0: 4291 cmp r1, r2 -10000fe2: d3e9 bcc.n 10000fb8 -10000fe4: e7e3 b.n 10000fae -10000fe6: 18d3 adds r3, r2, r3 -10000fe8: 709c strb r4, [r3, #2] -10000fea: 19d1 adds r1, r2, r7 -10000fec: 5dd2 ldrb r2, [r2, r7] -10000fee: 2a00 cmp r2, #0 -10000ff0: d000 beq.n 10000ff4 -10000ff2: 705a strb r2, [r3, #1] -10000ff4: 464b mov r3, r9 -10000ff6: 700b strb r3, [r1, #0] -10000ff8: 736c strb r4, [r5, #13] -10000ffa: 7d30 ldrb r0, [r6, #20] -10000ffc: 9a00 ldr r2, [sp, #0] -10000ffe: 9b01 ldr r3, [sp, #4] -10001000: f000 f9f2 bl 100013e8 -10001004: 4682 mov sl, r0 -10001006: 2800 cmp r0, #0 -10001008: d0a3 beq.n 10000f52 -1000100a: 0021 movs r1, r4 -1000100c: 6830 ldr r0, [r6, #0] -1000100e: f000 fc03 bl 10001818 -10001012: e79e b.n 10000f52 -10001014: 2000 movs r0, #0 -10001016: e7ac b.n 10000f72 -10001018: 0fffffff .word 0x0fffffff -1000101c: 7fffffff .word 0x7fffffff - -10001020 : -10001020: 7d40 ldrb r0, [r0, #21] -10001022: 4770 bx lr - -10001024 : -10001024: b5f0 push {r4, r5, r6, r7, lr} -10001026: 0004 movs r4, r0 -10001028: 000d movs r5, r1 -1000102a: 2606 movs r6, #6 -1000102c: 4276 negs r6, r6 -1000102e: 17f7 asrs r7, r6, #31 -10001030: 46c6 mov lr, r8 -10001032: 1936 adds r6, r6, r4 -10001034: 416f adcs r7, r5 -10001036: b500 push {lr} -10001038: b084 sub sp, #16 -1000103a: 428f cmp r7, r1 -1000103c: d814 bhi.n 10001068 -1000103e: d011 beq.n 10001064 -10001040: f000 f93e bl 100012c0 -10001044: 0032 movs r2, r6 -10001046: 003b movs r3, r7 -10001048: 1a12 subs r2, r2, r0 -1000104a: 418b sbcs r3, r1 -1000104c: 2b00 cmp r3, #0 -1000104e: dc15 bgt.n 1000107c -10001050: 2b00 cmp r3, #0 -10001052: d03e beq.n 100010d2 -10001054: 0020 movs r0, r4 -10001056: 0029 movs r1, r5 -10001058: f000 f970 bl 1000133c -1000105c: b004 add sp, #16 -1000105e: bc80 pop {r7} -10001060: 46b8 mov r8, r7 -10001062: bdf0 pop {r4, r5, r6, r7, pc} -10001064: 4286 cmp r6, r0 -10001066: d9eb bls.n 10001040 -10001068: 2600 movs r6, #0 -1000106a: 2700 movs r7, #0 -1000106c: f000 f928 bl 100012c0 -10001070: 0032 movs r2, r6 -10001072: 003b movs r3, r7 -10001074: 1a12 subs r2, r2, r0 -10001076: 418b sbcs r3, r1 -10001078: 2b00 cmp r3, #0 -1000107a: dde9 ble.n 10001050 -1000107c: 2300 movs r3, #0 -1000107e: 9302 str r3, [sp, #8] -10001080: 9301 str r3, [sp, #4] -10001082: 4b15 ldr r3, [pc, #84] @ (100010d8 ) -10001084: 0032 movs r2, r6 -10001086: 9300 str r3, [sp, #0] -10001088: 4814 ldr r0, [pc, #80] @ (100010dc ) -1000108a: 003b movs r3, r7 -1000108c: f7ff ff0a bl 10000ea4 -10001090: 2800 cmp r0, #0 -10001092: dbdf blt.n 10001054 -10001094: 2300 movs r3, #0 -10001096: 4698 mov r8, r3 -10001098: 46bc mov ip, r7 -1000109a: 4a11 ldr r2, [pc, #68] @ (100010e0 ) -1000109c: 4f11 ldr r7, [pc, #68] @ (100010e4 ) -1000109e: 6a7b ldr r3, [r7, #36] @ 0x24 -100010a0: 459c cmp ip, r3 -100010a2: d804 bhi.n 100010ae -100010a4: 6ab9 ldr r1, [r7, #40] @ 0x28 -100010a6: 428e cmp r6, r1 -100010a8: d9d4 bls.n 10001054 -100010aa: 459c cmp ip, r3 -100010ac: d1d2 bne.n 10001054 -100010ae: 6811 ldr r1, [r2, #0] -100010b0: f3ef 8010 mrs r0, PRIMASK -100010b4: b672 cpsid i -100010b6: 680b ldr r3, [r1, #0] -100010b8: 2b00 cmp r3, #0 -100010ba: d0fc beq.n 100010b6 -100010bc: f3bf 8f5f dmb sy -100010c0: 6813 ldr r3, [r2, #0] -100010c2: f3bf 8f5f dmb sy -100010c6: 4641 mov r1, r8 -100010c8: 6019 str r1, [r3, #0] -100010ca: f380 8810 msr PRIMASK, r0 -100010ce: bf20 wfe -100010d0: e7e5 b.n 1000109e -100010d2: 2a00 cmp r2, #0 -100010d4: d0be beq.n 10001054 -100010d6: e7d1 b.n 1000107c -100010d8: 10000b41 .word 0x10000b41 -100010dc: 20000e34 .word 0x20000e34 -100010e0: 20001c4c .word 0x20001c4c -100010e4: 40054000 .word 0x40054000 - -100010e8 : -100010e8: b570 push {r4, r5, r6, lr} -100010ea: 0006 movs r6, r0 -100010ec: f000 f8e8 bl 100012c0 -100010f0: 22fa movs r2, #250 @ 0xfa -100010f2: 0004 movs r4, r0 -100010f4: 000d movs r5, r1 -100010f6: 2300 movs r3, #0 -100010f8: 0030 movs r0, r6 -100010fa: 2100 movs r1, #0 -100010fc: 0092 lsls r2, r2, #2 -100010fe: f003 f977 bl 100043f0 <__wrap___aeabi_lmul> -10001102: 2380 movs r3, #128 @ 0x80 -10001104: 1900 adds r0, r0, r4 -10001106: 4169 adcs r1, r5 -10001108: 061b lsls r3, r3, #24 -1000110a: 4299 cmp r1, r3 -1000110c: d302 bcc.n 10001114 -1000110e: 2001 movs r0, #1 -10001110: 4902 ldr r1, [pc, #8] @ (1000111c ) -10001112: 4240 negs r0, r0 -10001114: f7ff ff86 bl 10001024 -10001118: bd70 pop {r4, r5, r6, pc} -1000111a: 46c0 nop @ (mov r8, r8) -1000111c: 7fffffff .word 0x7fffffff - -10001120 : -10001120: b5f0 push {r4, r5, r6, r7, lr} -10001122: f3ef 8305 mrs r3, IPSR -10001126: 46ce mov lr, r9 -10001128: 4647 mov r7, r8 -1000112a: b580 push {r7, lr} -1000112c: 0005 movs r5, r0 -1000112e: 000c movs r4, r1 -10001130: b085 sub sp, #20 -10001132: 2b00 cmp r3, #0 -10001134: d012 beq.n 1000115c -10001136: 4a2a ldr r2, [pc, #168] @ (100011e0 ) -10001138: 2000 movs r0, #0 -1000113a: 6a53 ldr r3, [r2, #36] @ 0x24 -1000113c: 42a3 cmp r3, r4 -1000113e: d303 bcc.n 10001148 -10001140: 6a92 ldr r2, [r2, #40] @ 0x28 -10001142: 3001 adds r0, #1 -10001144: 42aa cmp r2, r5 -10001146: d304 bcc.n 10001152 -10001148: b005 add sp, #20 -1000114a: bcc0 pop {r6, r7} -1000114c: 46b9 mov r9, r7 -1000114e: 46b0 mov r8, r6 -10001150: bdf0 pop {r4, r5, r6, r7, pc} -10001152: 1b1b subs r3, r3, r4 -10001154: 1e5a subs r2, r3, #1 -10001156: 4193 sbcs r3, r2 -10001158: b2d8 uxtb r0, r3 -1000115a: e7f5 b.n 10001148 -1000115c: 4e21 ldr r6, [pc, #132] @ (100011e4 ) -1000115e: 9302 str r3, [sp, #8] -10001160: 9301 str r3, [sp, #4] -10001162: 4b21 ldr r3, [pc, #132] @ (100011e8 ) -10001164: 0002 movs r2, r0 -10001166: 9300 str r3, [sp, #0] -10001168: 0030 movs r0, r6 -1000116a: 000b movs r3, r1 -1000116c: f7ff fe9a bl 10000ea4 -10001170: 1e03 subs r3, r0, #0 -10001172: dde0 ble.n 10001136 -10001174: bf20 wfe -10001176: 6871 ldr r1, [r6, #4] -10001178: f3ef 8710 mrs r7, PRIMASK -1000117c: b672 cpsid i -1000117e: 680a ldr r2, [r1, #0] -10001180: 2a00 cmp r2, #0 -10001182: d0fc beq.n 1000117e -10001184: f3bf 8f5f dmb sy -10001188: b2da uxtb r2, r3 -1000118a: 4694 mov ip, r2 -1000118c: 22ff movs r2, #255 @ 0xff -1000118e: 6830 ldr r0, [r6, #0] -10001190: 401a ands r2, r3 -10001192: 7b41 ldrb r1, [r0, #13] -10001194: 4561 cmp r1, ip -10001196: d00f beq.n 100011b8 -10001198: 6801 ldr r1, [r0, #0] -1000119a: 4689 mov r9, r1 -1000119c: 0051 lsls r1, r2, #1 -1000119e: 4688 mov r8, r1 -100011a0: 4649 mov r1, r9 -100011a2: 4490 add r8, r2 -100011a4: 4441 add r1, r8 -100011a6: 3903 subs r1, #3 -100011a8: 7889 ldrb r1, [r1, #2] -100011aa: 2900 cmp r1, #0 -100011ac: d104 bne.n 100011b8 -100011ae: 6932 ldr r2, [r6, #16] -100011b0: 4293 cmp r3, r2 -100011b2: d109 bne.n 100011c8 -100011b4: 6131 str r1, [r6, #16] -100011b6: e007 b.n 100011c8 -100011b8: 68f1 ldr r1, [r6, #12] -100011ba: 0a1b lsrs r3, r3, #8 -100011bc: 188a adds r2, r1, r2 -100011be: 3a01 subs r2, #1 -100011c0: 7812 ldrb r2, [r2, #0] -100011c2: b2db uxtb r3, r3 -100011c4: 429a cmp r2, r3 -100011c6: d007 beq.n 100011d8 -100011c8: 6873 ldr r3, [r6, #4] -100011ca: f3bf 8f5f dmb sy -100011ce: 2200 movs r2, #0 -100011d0: 601a str r2, [r3, #0] -100011d2: f387 8810 msr PRIMASK, r7 -100011d6: e7ae b.n 10001136 -100011d8: 4661 mov r1, ip -100011da: f000 fb1d bl 10001818 -100011de: e7f3 b.n 100011c8 -100011e0: 40054000 .word 0x40054000 -100011e4: 20000e34 .word 0x20000e34 -100011e8: 10000b41 .word 0x10000b41 - -100011ec : -100011ec: b5f0 push {r4, r5, r6, r7, lr} -100011ee: f3ef 8205 mrs r2, IPSR -100011f2: 46d6 mov lr, sl -100011f4: 464f mov r7, r9 -100011f6: 4646 mov r6, r8 -100011f8: 0010 movs r0, r2 -100011fa: b5c0 push {r6, r7, lr} -100011fc: 3810 subs r0, #16 -100011fe: f3ef 8810 mrs r8, PRIMASK -10001202: b672 cpsid i -10001204: 4c21 ldr r4, [pc, #132] @ (1000128c ) -10001206: 6823 ldr r3, [r4, #0] -10001208: 2b00 cmp r3, #0 -1000120a: d0fc beq.n 10001206 -1000120c: f3bf 8f5f dmb sy -10001210: 2301 movs r3, #1 -10001212: 0019 movs r1, r3 -10001214: 4081 lsls r1, r0 -10001216: 4d1e ldr r5, [pc, #120] @ (10001290 ) -10001218: 001f movs r7, r3 -1000121a: 6369 str r1, [r5, #52] @ 0x34 -1000121c: 46aa mov sl, r5 -1000121e: 4d1d ldr r5, [pc, #116] @ (10001294 ) -10001220: 6029 str r1, [r5, #0] -10001222: 4d1d ldr r5, [pc, #116] @ (10001298 ) -10001224: 782e ldrb r6, [r5, #0] -10001226: 46ac mov ip, r5 -10001228: 0035 movs r5, r6 -1000122a: 40c5 lsrs r5, r0 -1000122c: 402f ands r7, r5 -1000122e: 422b tst r3, r5 -10001230: d015 beq.n 1000125e -10001232: 4653 mov r3, sl -10001234: 6a5f ldr r7, [r3, #36] @ 0x24 -10001236: 4b19 ldr r3, [pc, #100] @ (1000129c ) -10001238: 0085 lsls r5, r0, #2 -1000123a: 58eb ldr r3, [r5, r3] -1000123c: 429f cmp r7, r3 -1000123e: d318 bcc.n 10001272 -10001240: 4662 mov r2, ip -10001242: 4b17 ldr r3, [pc, #92] @ (100012a0 ) -10001244: 438e bics r6, r1 -10001246: 58eb ldr r3, [r5, r3] -10001248: 7016 strb r6, [r2, #0] -1000124a: f3bf 8f5f dmb sy -1000124e: 2200 movs r2, #0 -10001250: 6022 str r2, [r4, #0] -10001252: f388 8810 msr PRIMASK, r8 -10001256: 2b00 cmp r3, #0 -10001258: d006 beq.n 10001268 -1000125a: 4798 blx r3 -1000125c: e004 b.n 10001268 -1000125e: f3bf 8f5f dmb sy -10001262: 6027 str r7, [r4, #0] -10001264: f388 8810 msr PRIMASK, r8 -10001268: bce0 pop {r5, r6, r7} -1000126a: 46ba mov sl, r7 -1000126c: 46b1 mov r9, r6 -1000126e: 46a8 mov r8, r5 -10001270: bdf0 pop {r4, r5, r6, r7, pc} -10001272: 4b0c ldr r3, [pc, #48] @ (100012a4 ) -10001274: 0092 lsls r2, r2, #2 -10001276: 469c mov ip, r3 -10001278: 4462 add r2, ip -1000127a: 6813 ldr r3, [r2, #0] -1000127c: 6013 str r3, [r2, #0] -1000127e: f3bf 8f5f dmb sy -10001282: 2300 movs r3, #0 -10001284: 6023 str r3, [r4, #0] -10001286: f388 8810 msr PRIMASK, r8 -1000128a: e7ed b.n 10001268 -1000128c: d0000128 .word 0xd0000128 -10001290: 40054000 .word 0x40054000 -10001294: 4005703c .word 0x4005703c -10001298: 20001c89 .word 0x20001c89 -1000129c: 20001c58 .word 0x20001c58 -100012a0: 2000166c .word 0x2000166c -100012a4: 40053fd0 .word 0x40053fd0 - -100012a8 : -100012a8: b510 push {r4, lr} -100012aa: 4b03 ldr r3, [pc, #12] @ (100012b8 ) -100012ac: 0001 movs r1, r0 -100012ae: 0018 movs r0, r3 -100012b0: 4a02 ldr r2, [pc, #8] @ (100012bc ) -100012b2: f7ff f893 bl 100003dc -100012b6: bd10 pop {r4, pc} -100012b8: 20001c84 .word 0x20001c84 -100012bc: 10006e78 .word 0x10006e78 - -100012c0 : -100012c0: 4b03 ldr r3, [pc, #12] @ (100012d0 ) -100012c2: 6a59 ldr r1, [r3, #36] @ 0x24 -100012c4: 000a movs r2, r1 -100012c6: 6a98 ldr r0, [r3, #40] @ 0x28 -100012c8: 6a59 ldr r1, [r3, #36] @ 0x24 -100012ca: 428a cmp r2, r1 -100012cc: d1fa bne.n 100012c4 -100012ce: 4770 bx lr -100012d0: 40054000 .word 0x40054000 - -100012d4 : -100012d4: b570 push {r4, r5, r6, lr} -100012d6: 0004 movs r4, r0 -100012d8: 000d movs r5, r1 -100012da: 4a17 ldr r2, [pc, #92] @ (10001338 ) -100012dc: 6a53 ldr r3, [r2, #36] @ 0x24 -100012de: 0019 movs r1, r3 -100012e0: 6a96 ldr r6, [r2, #40] @ 0x28 -100012e2: 6a53 ldr r3, [r2, #36] @ 0x24 -100012e4: 428b cmp r3, r1 -100012e6: d1fa bne.n 100012de -100012e8: 0030 movs r0, r6 -100012ea: 0019 movs r1, r3 -100012ec: 1824 adds r4, r4, r0 -100012ee: 414d adcs r5, r1 -100012f0: 42ab cmp r3, r5 -100012f2: d816 bhi.n 10001322 -100012f4: d013 beq.n 1000131e -100012f6: 4b10 ldr r3, [pc, #64] @ (10001338 ) -100012f8: 002a movs r2, r5 -100012fa: 6a5b ldr r3, [r3, #36] @ 0x24 -100012fc: 429d cmp r5, r3 -100012fe: d903 bls.n 10001308 -10001300: 490d ldr r1, [pc, #52] @ (10001338 ) -10001302: 6a4b ldr r3, [r1, #36] @ 0x24 -10001304: 4293 cmp r3, r2 -10001306: d3fc bcc.n 10001302 -10001308: 4293 cmp r3, r2 -1000130a: d107 bne.n 1000131c -1000130c: 4a0a ldr r2, [pc, #40] @ (10001338 ) -1000130e: e002 b.n 10001316 -10001310: 6a51 ldr r1, [r2, #36] @ 0x24 -10001312: 4299 cmp r1, r3 -10001314: d102 bne.n 1000131c -10001316: 6a91 ldr r1, [r2, #40] @ 0x28 -10001318: 42a1 cmp r1, r4 -1000131a: d3f9 bcc.n 10001310 -1000131c: bd70 pop {r4, r5, r6, pc} -1000131e: 42a6 cmp r6, r4 -10001320: d9e9 bls.n 100012f6 -10001322: 4b05 ldr r3, [pc, #20] @ (10001338 ) -10001324: 6a5b ldr r3, [r3, #36] @ 0x24 -10001326: 001c movs r4, r3 -10001328: 1c5a adds r2, r3, #1 -1000132a: d0ef beq.n 1000130c -1000132c: 2201 movs r2, #1 -1000132e: 2401 movs r4, #1 -10001330: 4264 negs r4, r4 -10001332: 17e5 asrs r5, r4, #31 -10001334: 4252 negs r2, r2 -10001336: e7e3 b.n 10001300 -10001338: 40054000 .word 0x40054000 - -1000133c : -1000133c: 4a06 ldr r2, [pc, #24] @ (10001358 ) -1000133e: 6a53 ldr r3, [r2, #36] @ 0x24 -10001340: 4299 cmp r1, r3 -10001342: d8fc bhi.n 1000133e -10001344: d107 bne.n 10001356 -10001346: 4b04 ldr r3, [pc, #16] @ (10001358 ) -10001348: e002 b.n 10001350 -1000134a: 6a5a ldr r2, [r3, #36] @ 0x24 -1000134c: 4291 cmp r1, r2 -1000134e: d102 bne.n 10001356 -10001350: 6a9a ldr r2, [r3, #40] @ 0x28 -10001352: 4282 cmp r2, r0 -10001354: d3f9 bcc.n 1000134a -10001356: 4770 bx lr -10001358: 40054000 .word 0x40054000 - -1000135c : -1000135c: b570 push {r4, r5, r6, lr} -1000135e: 0004 movs r4, r0 -10001360: 000d movs r5, r1 -10001362: f3ef 8610 mrs r6, PRIMASK -10001366: b672 cpsid i -10001368: 4a1a ldr r2, [pc, #104] @ (100013d4 ) -1000136a: 6813 ldr r3, [r2, #0] -1000136c: 2b00 cmp r3, #0 -1000136e: d0fc beq.n 1000136a -10001370: f3bf 8f5f dmb sy -10001374: 2d00 cmp r5, #0 -10001376: d01b beq.n 100013b0 -10001378: 0020 movs r0, r4 -1000137a: f7ff f8fb bl 10000574 -1000137e: 4916 ldr r1, [pc, #88] @ (100013d8 ) -10001380: 4281 cmp r1, r0 -10001382: d00a beq.n 1000139a -10001384: 0020 movs r0, r4 -10001386: f7ff f8fd bl 10000584 -1000138a: 2101 movs r1, #1 -1000138c: 0020 movs r0, r4 -1000138e: f7ff f8c1 bl 10000514 -10001392: 2301 movs r3, #1 -10001394: 40a3 lsls r3, r4 -10001396: 4a11 ldr r2, [pc, #68] @ (100013dc ) -10001398: 6013 str r3, [r2, #0] -1000139a: 4b11 ldr r3, [pc, #68] @ (100013e0 ) -1000139c: 00a4 lsls r4, r4, #2 -1000139e: 50e5 str r5, [r4, r3] -100013a0: f3bf 8f5f dmb sy -100013a4: 2200 movs r2, #0 -100013a6: 4b0b ldr r3, [pc, #44] @ (100013d4 ) -100013a8: 601a str r2, [r3, #0] -100013aa: f386 8810 msr PRIMASK, r6 -100013ae: bd70 pop {r4, r5, r6, pc} -100013b0: 2101 movs r1, #1 -100013b2: 40a1 lsls r1, r4 -100013b4: 4b0a ldr r3, [pc, #40] @ (100013e0 ) -100013b6: 00a2 lsls r2, r4, #2 -100013b8: 50d5 str r5, [r2, r3] -100013ba: 4b0a ldr r3, [pc, #40] @ (100013e4 ) -100013bc: 0020 movs r0, r4 -100013be: 781a ldrb r2, [r3, #0] -100013c0: 438a bics r2, r1 -100013c2: 4905 ldr r1, [pc, #20] @ (100013d8 ) -100013c4: 701a strb r2, [r3, #0] -100013c6: f7ff fa01 bl 100007cc -100013ca: 2100 movs r1, #0 -100013cc: 0020 movs r0, r4 -100013ce: f7ff f8a1 bl 10000514 -100013d2: e7e5 b.n 100013a0 -100013d4: d0000128 .word 0xd0000128 -100013d8: 100011ed .word 0x100011ed -100013dc: 40056038 .word 0x40056038 -100013e0: 2000166c .word 0x2000166c -100013e4: 20001c89 .word 0x20001c89 - -100013e8 : -100013e8: b5f0 push {r4, r5, r6, r7, lr} -100013ea: 464f mov r7, r9 -100013ec: 46d6 mov lr, sl -100013ee: 4646 mov r6, r8 -100013f0: b5c0 push {r6, r7, lr} -100013f2: 0007 movs r7, r0 -100013f4: 4c2b ldr r4, [pc, #172] @ (100014a4 ) -100013f6: 6a61 ldr r1, [r4, #36] @ 0x24 -100013f8: 000d movs r5, r1 -100013fa: 6aa6 ldr r6, [r4, #40] @ 0x28 -100013fc: 6a61 ldr r1, [r4, #36] @ 0x24 -100013fe: 42a9 cmp r1, r5 -10001400: d1fa bne.n 100013f8 -10001402: 428b cmp r3, r1 -10001404: d808 bhi.n 10001418 -10001406: d005 beq.n 10001414 -10001408: 2001 movs r0, #1 -1000140a: bce0 pop {r5, r6, r7} -1000140c: 46ba mov sl, r7 -1000140e: 46b1 mov r9, r6 -10001410: 46a8 mov r8, r5 -10001412: bdf0 pop {r4, r5, r6, r7, pc} -10001414: 42b2 cmp r2, r6 -10001416: d9f7 bls.n 10001408 -10001418: f3ef 8a10 mrs sl, PRIMASK -1000141c: b672 cpsid i -1000141e: 4822 ldr r0, [pc, #136] @ (100014a8 ) -10001420: 6801 ldr r1, [r0, #0] -10001422: 2900 cmp r1, #0 -10001424: d0fc beq.n 10001420 -10001426: f3bf 8f5f dmb sy -1000142a: 2501 movs r5, #1 -1000142c: 40bd lsls r5, r7 -1000142e: 491f ldr r1, [pc, #124] @ (100014ac ) -10001430: 4c1c ldr r4, [pc, #112] @ (100014a4 ) -10001432: 4688 mov r8, r1 -10001434: 7809 ldrb r1, [r1, #0] -10001436: 4689 mov r9, r1 -10001438: 4329 orrs r1, r5 -1000143a: b2c9 uxtb r1, r1 -1000143c: 468c mov ip, r1 -1000143e: 4641 mov r1, r8 -10001440: 4660 mov r0, ip -10001442: 7008 strb r0, [r1, #0] -10001444: 1d39 adds r1, r7, #4 -10001446: 0089 lsls r1, r1, #2 -10001448: 6365 str r5, [r4, #52] @ 0x34 -1000144a: 510a str r2, [r1, r4] -1000144c: 4918 ldr r1, [pc, #96] @ (100014b0 ) -1000144e: 00b8 lsls r0, r7, #2 -10001450: 5043 str r3, [r0, r1] -10001452: 6a21 ldr r1, [r4, #32] -10001454: 2000 movs r0, #0 -10001456: 4229 tst r1, r5 -10001458: d019 beq.n 1000148e -1000145a: 6a61 ldr r1, [r4, #36] @ 0x24 -1000145c: 0008 movs r0, r1 -1000145e: 6aa6 ldr r6, [r4, #40] @ 0x28 -10001460: 6a61 ldr r1, [r4, #36] @ 0x24 -10001462: 4281 cmp r1, r0 -10001464: d1fa bne.n 1000145c -10001466: 428b cmp r3, r1 -10001468: d819 bhi.n 1000149e -1000146a: d101 bne.n 10001470 -1000146c: 42b2 cmp r2, r6 -1000146e: d816 bhi.n 1000149e -10001470: 45cc cmp ip, r9 -10001472: d00b beq.n 1000148c -10001474: 4b0b ldr r3, [pc, #44] @ (100014a4 ) -10001476: 221f movs r2, #31 -10001478: 621d str r5, [r3, #32] -1000147a: 635d str r5, [r3, #52] @ 0x34 -1000147c: 2301 movs r3, #1 -1000147e: 403a ands r2, r7 -10001480: 4093 lsls r3, r2 -10001482: 4a0c ldr r2, [pc, #48] @ (100014b4 ) -10001484: 6013 str r3, [r2, #0] -10001486: 4643 mov r3, r8 -10001488: 464a mov r2, r9 -1000148a: 701a strb r2, [r3, #0] -1000148c: 2001 movs r0, #1 -1000148e: f3bf 8f5f dmb sy -10001492: 2200 movs r2, #0 -10001494: 4b04 ldr r3, [pc, #16] @ (100014a8 ) -10001496: 601a str r2, [r3, #0] -10001498: f38a 8810 msr PRIMASK, sl -1000149c: e7b5 b.n 1000140a -1000149e: 2000 movs r0, #0 -100014a0: e7f5 b.n 1000148e -100014a2: 46c0 nop @ (mov r8, r8) -100014a4: 40054000 .word 0x40054000 -100014a8: d0000128 .word 0xd0000128 -100014ac: 20001c89 .word 0x20001c89 -100014b0: 20001c58 .word 0x20001c58 -100014b4: e000e280 .word 0xe000e280 - -100014b8 : -100014b8: f3ef 8c10 mrs ip, PRIMASK -100014bc: b672 cpsid i -100014be: 490a ldr r1, [pc, #40] @ (100014e8 ) -100014c0: 680b ldr r3, [r1, #0] -100014c2: 2b00 cmp r3, #0 -100014c4: d0fc beq.n 100014c0 -100014c6: f3bf 8f5f dmb sy -100014ca: 2301 movs r3, #1 -100014cc: 4083 lsls r3, r0 -100014ce: 4a07 ldr r2, [pc, #28] @ (100014ec ) -100014d0: 4807 ldr r0, [pc, #28] @ (100014f0 ) -100014d2: 6213 str r3, [r2, #32] -100014d4: 7802 ldrb r2, [r0, #0] -100014d6: 439a bics r2, r3 -100014d8: 7002 strb r2, [r0, #0] -100014da: f3bf 8f5f dmb sy -100014de: 2300 movs r3, #0 -100014e0: 600b str r3, [r1, #0] -100014e2: f38c 8810 msr PRIMASK, ip -100014e6: 4770 bx lr -100014e8: d0000128 .word 0xd0000128 -100014ec: 40054000 .word 0x40054000 -100014f0: 20001c89 .word 0x20001c89 - -100014f4 : -100014f4: b570 push {r4, r5, r6, lr} -100014f6: 0006 movs r6, r0 -100014f8: 000d movs r5, r1 -100014fa: 0014 movs r4, r2 -100014fc: 2900 cmp r1, #0 -100014fe: d01d beq.n 1000153c -10001500: 2a00 cmp r2, #0 -10001502: d012 beq.n 1000152a -10001504: 6873 ldr r3, [r6, #4] -10001506: 6880 ldr r0, [r0, #8] -10001508: 4798 blx r3 -1000150a: 0062 lsls r2, r4, #1 -1000150c: 006b lsls r3, r5, #1 -1000150e: 1912 adds r2, r2, r4 -10001510: 195b adds r3, r3, r5 -10001512: 6831 ldr r1, [r6, #0] -10001514: 3a03 subs r2, #3 -10001516: 3b03 subs r3, #3 -10001518: 2800 cmp r0, #0 -1000151a: d008 beq.n 1000152e -1000151c: 188a adds r2, r1, r2 -1000151e: 7095 strb r5, [r2, #2] -10001520: 18c8 adds r0, r1, r3 -10001522: 5ccb ldrb r3, [r1, r3] -10001524: 2b00 cmp r3, #0 -10001526: d10b bne.n 10001540 -10001528: 7004 strb r4, [r0, #0] -1000152a: 0028 movs r0, r5 -1000152c: bd70 pop {r4, r5, r6, pc} -1000152e: 18cb adds r3, r1, r3 -10001530: 709c strb r4, [r3, #2] -10001532: 1888 adds r0, r1, r2 -10001534: 5c8a ldrb r2, [r1, r2] -10001536: 2a00 cmp r2, #0 -10001538: d105 bne.n 10001546 -1000153a: 7005 strb r5, [r0, #0] -1000153c: 0020 movs r0, r4 -1000153e: e7f5 b.n 1000152c -10001540: 7053 strb r3, [r2, #1] -10001542: 7004 strb r4, [r0, #0] -10001544: e7f1 b.n 1000152a -10001546: 705a strb r2, [r3, #1] -10001548: 7005 strb r5, [r0, #0] -1000154a: e7f7 b.n 1000153c - -1000154c : -1000154c: b510 push {r4, lr} -1000154e: 6083 str r3, [r0, #8] -10001550: 2300 movs r3, #0 -10001552: b2cc uxtb r4, r1 -10001554: 7343 strb r3, [r0, #13] -10001556: 3301 adds r3, #1 -10001558: 6042 str r2, [r0, #4] -1000155a: 7304 strb r4, [r0, #12] -1000155c: 7383 strb r3, [r0, #14] -1000155e: 73c4 strb r4, [r0, #15] -10001560: 6800 ldr r0, [r0, #0] -10001562: 1c42 adds r2, r0, #1 -10001564: 2c01 cmp r4, #1 -10001566: d905 bls.n 10001574 -10001568: 3301 adds r3, #1 -1000156a: b2db uxtb r3, r3 -1000156c: 7013 strb r3, [r2, #0] -1000156e: 3203 adds r2, #3 -10001570: 429c cmp r4, r3 -10001572: d1f9 bne.n 10001568 -10001574: 23ff movs r3, #255 @ 0xff -10001576: 400b ands r3, r1 -10001578: 005a lsls r2, r3, #1 -1000157a: 18d3 adds r3, r2, r3 -1000157c: 18c0 adds r0, r0, r3 -1000157e: 2300 movs r3, #0 -10001580: 3803 subs r0, #3 -10001582: 7043 strb r3, [r0, #1] -10001584: bd10 pop {r4, pc} -10001586: 46c0 nop @ (mov r8, r8) - -10001588 : -10001588: b570 push {r4, r5, r6, lr} -1000158a: 0005 movs r5, r0 -1000158c: 1e0c subs r4, r1, #0 -1000158e: d007 beq.n 100015a0 -10001590: 0063 lsls r3, r4, #1 -10001592: 6801 ldr r1, [r0, #0] -10001594: 191b adds r3, r3, r4 -10001596: 3b03 subs r3, #3 -10001598: 18cb adds r3, r1, r3 -1000159a: 785a ldrb r2, [r3, #1] -1000159c: 2a00 cmp r2, #0 -1000159e: d101 bne.n 100015a4 -100015a0: 0020 movs r0, r4 -100015a2: bd70 pop {r4, r5, r6, pc} -100015a4: 0050 lsls r0, r2, #1 -100015a6: 1880 adds r0, r0, r2 -100015a8: 3803 subs r0, #3 -100015aa: 1809 adds r1, r1, r0 -100015ac: 2000 movs r0, #0 -100015ae: 784e ldrb r6, [r1, #1] -100015b0: 7048 strb r0, [r1, #1] -100015b2: 0021 movs r1, r4 -100015b4: 7058 strb r0, [r3, #1] -100015b6: 0028 movs r0, r5 -100015b8: f7ff ff9c bl 100014f4 -100015bc: 0031 movs r1, r6 -100015be: 0004 movs r4, r0 -100015c0: 0028 movs r0, r5 -100015c2: f7ff ffe1 bl 10001588 -100015c6: 0006 movs r6, r0 -100015c8: 2c00 cmp r4, #0 -100015ca: d020 beq.n 1000160e -100015cc: 2800 cmp r0, #0 -100015ce: d0e7 beq.n 100015a0 -100015d0: 0032 movs r2, r6 -100015d2: 0021 movs r1, r4 -100015d4: 686b ldr r3, [r5, #4] -100015d6: 68a8 ldr r0, [r5, #8] -100015d8: 4798 blx r3 -100015da: 0072 lsls r2, r6, #1 -100015dc: 0063 lsls r3, r4, #1 -100015de: 1992 adds r2, r2, r6 -100015e0: 191b adds r3, r3, r4 -100015e2: 6829 ldr r1, [r5, #0] -100015e4: 3a03 subs r2, #3 -100015e6: 3b03 subs r3, #3 -100015e8: 2800 cmp r0, #0 -100015ea: d008 beq.n 100015fe -100015ec: 188a adds r2, r1, r2 -100015ee: 7094 strb r4, [r2, #2] -100015f0: 18c8 adds r0, r1, r3 -100015f2: 5ccb ldrb r3, [r1, r3] -100015f4: 2b00 cmp r3, #0 -100015f6: d000 beq.n 100015fa -100015f8: 7053 strb r3, [r2, #1] -100015fa: 7006 strb r6, [r0, #0] -100015fc: e7d0 b.n 100015a0 -100015fe: 18cb adds r3, r1, r3 -10001600: 709e strb r6, [r3, #2] -10001602: 1888 adds r0, r1, r2 -10001604: 5c8a ldrb r2, [r1, r2] -10001606: 2a00 cmp r2, #0 -10001608: d000 beq.n 1000160c -1000160a: 705a strb r2, [r3, #1] -1000160c: 7004 strb r4, [r0, #0] -1000160e: 0034 movs r4, r6 -10001610: e7c6 b.n 100015a0 -10001612: 46c0 nop @ (mov r8, r8) - -10001614 : -10001614: b5f0 push {r4, r5, r6, r7, lr} -10001616: 4657 mov r7, sl -10001618: 4645 mov r5, r8 -1000161a: 46de mov lr, fp -1000161c: 464e mov r6, r9 -1000161e: b5e0 push {r5, r6, r7, lr} -10001620: 000d movs r5, r1 -10001622: 006f lsls r7, r5, #1 -10001624: 6801 ldr r1, [r0, #0] -10001626: 197f adds r7, r7, r5 -10001628: 3f03 subs r7, #3 -1000162a: 0004 movs r4, r0 -1000162c: 5dc8 ldrb r0, [r1, r7] -1000162e: b083 sub sp, #12 -10001630: 9201 str r2, [sp, #4] -10001632: 19ca adds r2, r1, r7 -10001634: 2800 cmp r0, #0 -10001636: d050 beq.n 100016da -10001638: 0043 lsls r3, r0, #1 -1000163a: 181b adds r3, r3, r0 -1000163c: 3b03 subs r3, #3 -1000163e: 18cb adds r3, r1, r3 -10001640: 785e ldrb r6, [r3, #1] -10001642: 46b4 mov ip, r6 -10001644: 2e00 cmp r6, #0 -10001646: d11a bne.n 1000167e -10001648: 9e01 ldr r6, [sp, #4] -1000164a: 2e00 cmp r6, #0 -1000164c: d042 beq.n 100016d4 -1000164e: 7be6 ldrb r6, [r4, #15] -10001650: 2e00 cmp r6, #0 -10001652: d004 beq.n 1000165e -10001654: 0073 lsls r3, r6, #1 -10001656: 199b adds r3, r3, r6 -10001658: 18cb adds r3, r1, r3 -1000165a: 3b03 subs r3, #3 -1000165c: 705d strb r5, [r3, #1] -1000165e: 7ba3 ldrb r3, [r4, #14] -10001660: 2b00 cmp r3, #0 -10001662: d100 bne.n 10001666 -10001664: 73a5 strb r5, [r4, #14] -10001666: 73e5 strb r5, [r4, #15] -10001668: 2800 cmp r0, #0 -1000166a: d12f bne.n 100016cc -1000166c: 2300 movs r3, #0 -1000166e: 7053 strb r3, [r2, #1] -10001670: b003 add sp, #12 -10001672: bcf0 pop {r4, r5, r6, r7} -10001674: 46bb mov fp, r7 -10001676: 46b2 mov sl, r6 -10001678: 46a9 mov r9, r5 -1000167a: 46a0 mov r8, r4 -1000167c: bdf0 pop {r4, r5, r6, r7, pc} -1000167e: 0072 lsls r2, r6, #1 -10001680: 4462 add r2, ip -10001682: 3a03 subs r2, #3 -10001684: 188a adds r2, r1, r2 -10001686: 7851 ldrb r1, [r2, #1] -10001688: 4688 mov r8, r1 -1000168a: 2100 movs r1, #0 -1000168c: 7051 strb r1, [r2, #1] -1000168e: 4689 mov r9, r1 -10001690: 7059 strb r1, [r3, #1] -10001692: 0032 movs r2, r6 -10001694: 0001 movs r1, r0 -10001696: 0020 movs r0, r4 -10001698: f7ff ff2c bl 100014f4 -1000169c: 4643 mov r3, r8 -1000169e: 4682 mov sl, r0 -100016a0: 2b00 cmp r3, #0 -100016a2: d007 beq.n 100016b4 -100016a4: 005b lsls r3, r3, #1 -100016a6: 6821 ldr r1, [r4, #0] -100016a8: 4443 add r3, r8 -100016aa: 3b03 subs r3, #3 -100016ac: 18cb adds r3, r1, r3 -100016ae: 785a ldrb r2, [r3, #1] -100016b0: 2a00 cmp r2, #0 -100016b2: d116 bne.n 100016e2 -100016b4: 4642 mov r2, r8 -100016b6: 4651 mov r1, sl -100016b8: 0020 movs r0, r4 -100016ba: f7ff ff1b bl 100014f4 -100016be: 6821 ldr r1, [r4, #0] -100016c0: 9b01 ldr r3, [sp, #4] -100016c2: 19ca adds r2, r1, r7 -100016c4: 2b00 cmp r3, #0 -100016c6: d1c2 bne.n 1000164e -100016c8: 2800 cmp r0, #0 -100016ca: d0cf beq.n 1000166c -100016cc: 0043 lsls r3, r0, #1 -100016ce: 181b adds r3, r3, r0 -100016d0: 3b03 subs r3, #3 -100016d2: 18cb adds r3, r1, r3 -100016d4: 2100 movs r1, #0 -100016d6: 7099 strb r1, [r3, #2] -100016d8: e7c8 b.n 1000166c -100016da: 9b01 ldr r3, [sp, #4] -100016dc: 2b00 cmp r3, #0 -100016de: d1b6 bne.n 1000164e -100016e0: e7c4 b.n 1000166c -100016e2: 0050 lsls r0, r2, #1 -100016e4: 1880 adds r0, r0, r2 -100016e6: 3803 subs r0, #3 -100016e8: 1809 adds r1, r1, r0 -100016ea: 7848 ldrb r0, [r1, #1] -100016ec: 4683 mov fp, r0 -100016ee: 4648 mov r0, r9 -100016f0: 7048 strb r0, [r1, #1] -100016f2: 7058 strb r0, [r3, #1] -100016f4: 4641 mov r1, r8 -100016f6: 0020 movs r0, r4 -100016f8: f7ff fefc bl 100014f4 -100016fc: 4659 mov r1, fp -100016fe: 4680 mov r8, r0 -10001700: 0020 movs r0, r4 -10001702: f7ff ff41 bl 10001588 -10001706: 4641 mov r1, r8 -10001708: 0002 movs r2, r0 -1000170a: 0020 movs r0, r4 -1000170c: f7ff fef2 bl 100014f4 -10001710: 4680 mov r8, r0 -10001712: e7cf b.n 100016b4 - -10001714 : -10001714: b5f0 push {r4, r5, r6, r7, lr} -10001716: 4657 mov r7, sl -10001718: 4645 mov r5, r8 -1000171a: 46de mov lr, fp -1000171c: 464e mov r6, r9 -1000171e: b5e0 push {r5, r6, r7, lr} -10001720: b083 sub sp, #12 -10001722: 9101 str r1, [sp, #4] -10001724: 7b45 ldrb r5, [r0, #13] -10001726: 0004 movs r4, r0 -10001728: 006f lsls r7, r5, #1 -1000172a: 6800 ldr r0, [r0, #0] -1000172c: 197f adds r7, r7, r5 -1000172e: 3f03 subs r7, #3 -10001730: 5dc1 ldrb r1, [r0, r7] -10001732: 19c2 adds r2, r0, r7 -10001734: 2900 cmp r1, #0 -10001736: d052 beq.n 100017de -10001738: 004b lsls r3, r1, #1 -1000173a: 185b adds r3, r3, r1 -1000173c: 3b03 subs r3, #3 -1000173e: 18c3 adds r3, r0, r3 -10001740: 785e ldrb r6, [r3, #1] -10001742: 46b4 mov ip, r6 -10001744: 2e00 cmp r6, #0 -10001746: d11c bne.n 10001782 -10001748: 9e01 ldr r6, [sp, #4] -1000174a: 2e00 cmp r6, #0 -1000174c: d044 beq.n 100017d8 -1000174e: 7be6 ldrb r6, [r4, #15] -10001750: 2e00 cmp r6, #0 -10001752: d004 beq.n 1000175e -10001754: 0073 lsls r3, r6, #1 -10001756: 199b adds r3, r3, r6 -10001758: 18c3 adds r3, r0, r3 -1000175a: 3b03 subs r3, #3 -1000175c: 705d strb r5, [r3, #1] -1000175e: 7ba3 ldrb r3, [r4, #14] -10001760: 2b00 cmp r3, #0 -10001762: d100 bne.n 10001766 -10001764: 73a5 strb r5, [r4, #14] -10001766: 73e5 strb r5, [r4, #15] -10001768: 2900 cmp r1, #0 -1000176a: d131 bne.n 100017d0 -1000176c: 2300 movs r3, #0 -1000176e: 0028 movs r0, r5 -10001770: 7053 strb r3, [r2, #1] -10001772: 7361 strb r1, [r4, #13] -10001774: b003 add sp, #12 -10001776: bcf0 pop {r4, r5, r6, r7} -10001778: 46bb mov fp, r7 -1000177a: 46b2 mov sl, r6 -1000177c: 46a9 mov r9, r5 -1000177e: 46a0 mov r8, r4 -10001780: bdf0 pop {r4, r5, r6, r7, pc} -10001782: 0072 lsls r2, r6, #1 -10001784: 4462 add r2, ip -10001786: 3a03 subs r2, #3 -10001788: 1882 adds r2, r0, r2 -1000178a: 7850 ldrb r0, [r2, #1] -1000178c: 4680 mov r8, r0 -1000178e: 2000 movs r0, #0 -10001790: 7050 strb r0, [r2, #1] -10001792: 4681 mov r9, r0 -10001794: 7058 strb r0, [r3, #1] -10001796: 0032 movs r2, r6 -10001798: 0020 movs r0, r4 -1000179a: f7ff feab bl 100014f4 -1000179e: 4643 mov r3, r8 -100017a0: 4682 mov sl, r0 -100017a2: 2b00 cmp r3, #0 -100017a4: d007 beq.n 100017b6 -100017a6: 005b lsls r3, r3, #1 -100017a8: 6821 ldr r1, [r4, #0] -100017aa: 4443 add r3, r8 -100017ac: 3b03 subs r3, #3 -100017ae: 18cb adds r3, r1, r3 -100017b0: 785a ldrb r2, [r3, #1] -100017b2: 2a00 cmp r2, #0 -100017b4: d117 bne.n 100017e6 -100017b6: 4642 mov r2, r8 -100017b8: 4651 mov r1, sl -100017ba: 0020 movs r0, r4 -100017bc: f7ff fe9a bl 100014f4 -100017c0: 9b01 ldr r3, [sp, #4] -100017c2: 0001 movs r1, r0 -100017c4: 6820 ldr r0, [r4, #0] -100017c6: 19c2 adds r2, r0, r7 -100017c8: 2b00 cmp r3, #0 -100017ca: d1c0 bne.n 1000174e -100017cc: 2900 cmp r1, #0 -100017ce: d0cd beq.n 1000176c -100017d0: 004b lsls r3, r1, #1 -100017d2: 185b adds r3, r3, r1 -100017d4: 3b03 subs r3, #3 -100017d6: 18c3 adds r3, r0, r3 -100017d8: 2000 movs r0, #0 -100017da: 7098 strb r0, [r3, #2] -100017dc: e7c6 b.n 1000176c -100017de: 9b01 ldr r3, [sp, #4] -100017e0: 2b00 cmp r3, #0 -100017e2: d1b4 bne.n 1000174e -100017e4: e7c2 b.n 1000176c -100017e6: 0050 lsls r0, r2, #1 -100017e8: 1880 adds r0, r0, r2 -100017ea: 3803 subs r0, #3 -100017ec: 1809 adds r1, r1, r0 -100017ee: 7848 ldrb r0, [r1, #1] -100017f0: 4683 mov fp, r0 -100017f2: 4648 mov r0, r9 -100017f4: 7048 strb r0, [r1, #1] -100017f6: 7058 strb r0, [r3, #1] -100017f8: 4641 mov r1, r8 -100017fa: 0020 movs r0, r4 -100017fc: f7ff fe7a bl 100014f4 -10001800: 4659 mov r1, fp -10001802: 4680 mov r8, r0 -10001804: 0020 movs r0, r4 -10001806: f7ff febf bl 10001588 -1000180a: 4641 mov r1, r8 -1000180c: 0002 movs r2, r0 -1000180e: 0020 movs r0, r4 -10001810: f7ff fe70 bl 100014f4 -10001814: 4680 mov r8, r0 -10001816: e7ce b.n 100017b6 - -10001818 : -10001818: b570 push {r4, r5, r6, lr} -1000181a: 0005 movs r5, r0 -1000181c: 2900 cmp r1, #0 -1000181e: d02c beq.n 1000187a -10001820: 7b43 ldrb r3, [r0, #13] -10001822: 428b cmp r3, r1 -10001824: d02e beq.n 10001884 -10001826: 004c lsls r4, r1, #1 -10001828: 6800 ldr r0, [r0, #0] -1000182a: 1864 adds r4, r4, r1 -1000182c: 3c03 subs r4, #3 -1000182e: 1904 adds r4, r0, r4 -10001830: 78a2 ldrb r2, [r4, #2] -10001832: 2a00 cmp r2, #0 -10001834: d021 beq.n 1000187a -10001836: 0053 lsls r3, r2, #1 +1000030a: 46d6 mov lr, sl +1000030c: 4646 mov r6, r8 +1000030e: 464f mov r7, r9 +10000310: b5c0 push {r6, r7, lr} +10000312: b086 sub sp, #24 +10000314: f005 f8fa bl 1000550c +10000318: 26d0 movs r6, #208 @ 0xd0 +1000031a: 2000 movs r0, #0 +1000031c: f000 fe76 bl 1000100c +10000320: 2301 movs r3, #1 +10000322: 0636 lsls r6, r6, #24 +10000324: 6273 str r3, [r6, #36] @ 0x24 +10000326: 4b1d ldr r3, [pc, #116] @ (1000039c ) +10000328: 2101 movs r1, #1 +1000032a: 469a mov sl, r3 +1000032c: 2303 movs r3, #3 +1000032e: 4a1c ldr r2, [pc, #112] @ (100003a0 ) +10000330: 425b negs r3, r3 +10000332: 4650 mov r0, sl +10000334: f000 fae8 bl 10000908 <_ZN6SX126x5beginEhma> +10000338: 2300 movs r3, #0 +1000033a: 9303 str r3, [sp, #12] +1000033c: 9302 str r3, [sp, #8] +1000033e: 9301 str r3, [sp, #4] +10000340: 3308 adds r3, #8 +10000342: 9300 str r3, [sp, #0] +10000344: 2204 movs r2, #4 +10000346: 3b07 subs r3, #7 +10000348: 2107 movs r1, #7 +1000034a: 4650 mov r0, sl +1000034c: f000 fdde bl 10000f0c <_ZN6SX126x10LoRaConfigEhhhthbb> +10000350: 4b14 ldr r3, [pc, #80] @ (100003a4 ) +10000352: 2417 movs r4, #23 +10000354: 4699 mov r9, r3 +10000356: 4b14 ldr r3, [pc, #80] @ (100003a8 ) +10000358: 4d14 ldr r5, [pc, #80] @ (100003ac ) +1000035a: 4698 mov r8, r3 +1000035c: 446c add r4, sp +1000035e: 682a ldr r2, [r5, #0] +10000360: 0029 movs r1, r5 +10000362: 4648 mov r0, r9 +10000364: f005 f8c6 bl 100054f4 <__wrap_printf> +10000368: 7821 ldrb r1, [r4, #0] +1000036a: 4640 mov r0, r8 +1000036c: f005 f8c2 bl 100054f4 <__wrap_printf> +10000370: 2201 movs r2, #1 +10000372: 0021 movs r1, r4 +10000374: 2302 movs r3, #2 +10000376: 4650 mov r0, sl +10000378: f000 fbe2 bl 10000b40 <_ZN6SX126x4SendEPhhh> +1000037c: 2701 movs r7, #1 +1000037e: 20fa movs r0, #250 @ 0xfa +10000380: 7823 ldrb r3, [r4, #0] +10000382: 0080 lsls r0, r0, #2 +10000384: 3301 adds r3, #1 +10000386: 7023 strb r3, [r4, #0] +10000388: 6177 str r7, [r6, #20] +1000038a: f001 fcff bl 10001d8c +1000038e: 20fa movs r0, #250 @ 0xfa +10000390: 61b7 str r7, [r6, #24] +10000392: 0080 lsls r0, r0, #2 +10000394: f001 fcfa bl 10001d8c +10000398: 3504 adds r5, #4 +1000039a: e7e0 b.n 1000035e +1000039c: 20001cd4 .word 0x20001cd4 +100003a0: 19cf0e40 .word 0x19cf0e40 +100003a4: 10007c60 .word 0x10007c60 +100003a8: 10007c78 .word 0x10007c78 +100003ac: 10fff000 .word 0x10fff000 + +100003b0 <_GLOBAL__sub_I_lora>: +100003b0: 230a movs r3, #10 +100003b2: b500 push {lr} +100003b4: b083 sub sp, #12 +100003b6: 9300 str r3, [sp, #0] +100003b8: 2217 movs r2, #23 +100003ba: 2119 movs r1, #25 +100003bc: 3301 adds r3, #1 +100003be: 4802 ldr r0, [pc, #8] @ (100003c8 <_GLOBAL__sub_I_lora+0x18>) +100003c0: f000 f85a bl 10000478 <_ZN6SX126xC1Eiiii> +100003c4: b003 add sp, #12 +100003c6: bd00 pop {pc} +100003c8: 20001cd4 .word 0x20001cd4 + +100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1>: +100003cc: b5f0 push {r4, r5, r6, r7, lr} +100003ce: 4646 mov r6, r8 +100003d0: 464f mov r7, r9 +100003d2: 46d6 mov lr, sl +100003d4: b5c0 push {r6, r7, lr} +100003d6: b084 sub sp, #16 +100003d8: 001e movs r6, r3 +100003da: ab0c add r3, sp, #48 @ 0x30 +100003dc: 781b ldrb r3, [r3, #0] +100003de: 0007 movs r7, r0 +100003e0: 4698 mov r8, r3 +100003e2: 466b mov r3, sp +100003e4: 0008 movs r0, r1 +100003e6: 0015 movs r5, r2 +100003e8: 22d0 movs r2, #208 @ 0xd0 +100003ea: 1dd9 adds r1, r3, #7 +100003ec: 2301 movs r3, #1 +100003ee: 7008 strb r0, [r1, #0] +100003f0: 6938 ldr r0, [r7, #16] +100003f2: 0612 lsls r2, r2, #24 +100003f4: 6854 ldr r4, [r2, #4] +100003f6: 40c4 lsrs r4, r0 +100003f8: 4223 tst r3, r4 +100003fa: d1fb bne.n 100003f4 <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0x28> +100003fc: 68b8 ldr r0, [r7, #8] +100003fe: 4083 lsls r3, r0 +10000400: 481c ldr r0, [pc, #112] @ (10000474 <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0xa8>) +10000402: 6193 str r3, [r2, #24] +10000404: 2201 movs r2, #1 +10000406: f007 fbf3 bl 10007bf0 <__spi_write_blocking_veneer> +1000040a: 2e00 cmp r6, #0 +1000040c: d014 beq.n 10000438 <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0x6c> +1000040e: 2300 movs r3, #0 +10000410: 46a9 mov r9, r5 +10000412: 250f movs r5, #15 +10000414: 2400 movs r4, #0 +10000416: 469a mov sl, r3 +10000418: 446d add r5, sp +1000041a: 4653 mov r3, sl +1000041c: 464a mov r2, r9 +1000041e: 702b strb r3, [r5, #0] +10000420: 0029 movs r1, r5 +10000422: 2301 movs r3, #1 +10000424: 4813 ldr r0, [pc, #76] @ (10000474 <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0xa8>) +10000426: f007 fbeb bl 10007c00 <__spi_write_read_blocking_veneer> +1000042a: 2301 movs r3, #1 +1000042c: 469c mov ip, r3 +1000042e: 3401 adds r4, #1 +10000430: b2e4 uxtb r4, r4 +10000432: 44e1 add r9, ip +10000434: 42b4 cmp r4, r6 +10000436: d1f0 bne.n 1000041a <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0x4e> +10000438: 480e ldr r0, [pc, #56] @ (10000474 <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0xa8>) +1000043a: f007 fb53 bl 10007ae4 +1000043e: 2301 movs r3, #1 +10000440: 68ba ldr r2, [r7, #8] +10000442: 24d0 movs r4, #208 @ 0xd0 +10000444: 4093 lsls r3, r2 +10000446: 0624 lsls r4, r4, #24 +10000448: 6163 str r3, [r4, #20] +1000044a: 4643 mov r3, r8 +1000044c: 2b00 cmp r3, #0 +1000044e: d105 bne.n 1000045c <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0x90> +10000450: b004 add sp, #16 +10000452: bce0 pop {r5, r6, r7} +10000454: 46ba mov sl, r7 +10000456: 46b1 mov r9, r6 +10000458: 46a8 mov r8, r5 +1000045a: bdf0 pop {r4, r5, r6, r7, pc} +1000045c: 2100 movs r1, #0 +1000045e: 2001 movs r0, #1 +10000460: f001 fc80 bl 10001d64 +10000464: 2201 movs r2, #1 +10000466: 6939 ldr r1, [r7, #16] +10000468: 6863 ldr r3, [r4, #4] +1000046a: 40cb lsrs r3, r1 +1000046c: 421a tst r2, r3 +1000046e: d1fb bne.n 10000468 <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0x9c> +10000470: e7ee b.n 10000450 <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1+0x84> +10000472: 46c0 nop @ (mov r8, r8) +10000474: 4003c000 .word 0x4003c000 + +10000478 <_ZN6SX126xC1Eiiii>: +10000478: b570 push {r4, r5, r6, lr} +1000047a: 0004 movs r4, r0 +1000047c: 6123 str r3, [r4, #16] +1000047e: 9b04 ldr r3, [sp, #16] +10000480: 2501 movs r5, #1 +10000482: 6163 str r3, [r4, #20] +10000484: 2300 movs r3, #0 +10000486: 0008 movs r0, r1 +10000488: 60a1 str r1, [r4, #8] +1000048a: 60e2 str r2, [r4, #12] +1000048c: 71a3 strb r3, [r4, #6] +1000048e: f000 fdbd bl 1000100c +10000492: 002a movs r2, r5 +10000494: 68a3 ldr r3, [r4, #8] +10000496: 26d0 movs r6, #208 @ 0xd0 +10000498: 409a lsls r2, r3 +1000049a: 0636 lsls r6, r6, #24 +1000049c: 6272 str r2, [r6, #36] @ 0x24 +1000049e: 68e0 ldr r0, [r4, #12] +100004a0: f000 fdb4 bl 1000100c +100004a4: 002a movs r2, r5 +100004a6: 68e3 ldr r3, [r4, #12] +100004a8: 6920 ldr r0, [r4, #16] +100004aa: 409a lsls r2, r3 +100004ac: 6272 str r2, [r6, #36] @ 0x24 +100004ae: f000 fdad bl 1000100c +100004b2: 002a movs r2, r5 +100004b4: 6923 ldr r3, [r4, #16] +100004b6: 6960 ldr r0, [r4, #20] +100004b8: 409a lsls r2, r3 +100004ba: 62b2 str r2, [r6, #40] @ 0x28 +100004bc: f000 fda6 bl 1000100c +100004c0: 6963 ldr r3, [r4, #20] +100004c2: 4904 ldr r1, [pc, #16] @ (100004d4 <_ZN6SX126xC1Eiiii+0x5c>) +100004c4: 409d lsls r5, r3 +100004c6: 4804 ldr r0, [pc, #16] @ (100004d8 <_ZN6SX126xC1Eiiii+0x60>) +100004c8: 62b5 str r5, [r6, #40] @ 0x28 +100004ca: f007 fa65 bl 10007998 +100004ce: 0020 movs r0, r4 +100004d0: bd70 pop {r4, r5, r6, pc} +100004d2: 46c0 nop @ (mov r8, r8) +100004d4: 001e8480 .word 0x001e8480 +100004d8: 4003c000 .word 0x4003c000 + +100004dc <_ZN6SX126x17SetDio3AsTcxoCtrlEhm>: +100004dc: b5f0 push {r4, r5, r6, r7, lr} +100004de: 46c6 mov lr, r8 +100004e0: 2307 movs r3, #7 +100004e2: b500 push {lr} +100004e4: 0006 movs r6, r0 +100004e6: 0c10 lsrs r0, r2, #16 +100004e8: 400b ands r3, r1 +100004ea: b2c0 uxtb r0, r0 +100004ec: 0a11 lsrs r1, r2, #8 +100004ee: 0200 lsls r0, r0, #8 +100004f0: b2c9 uxtb r1, r1 +100004f2: 0409 lsls r1, r1, #16 +100004f4: 4303 orrs r3, r0 +100004f6: 430b orrs r3, r1 +100004f8: 0612 lsls r2, r2, #24 +100004fa: 4313 orrs r3, r2 +100004fc: b082 sub sp, #8 +100004fe: 9301 str r3, [sp, #4] +10000500: 466b mov r3, sp +10000502: 20d0 movs r0, #208 @ 0xd0 +10000504: 1c99 adds r1, r3, #2 +10000506: 2397 movs r3, #151 @ 0x97 +10000508: 2201 movs r2, #1 +1000050a: 6934 ldr r4, [r6, #16] +1000050c: 700b strb r3, [r1, #0] +1000050e: 0600 lsls r0, r0, #24 +10000510: 6843 ldr r3, [r0, #4] +10000512: 40e3 lsrs r3, r4 +10000514: 421a tst r2, r3 +10000516: d1fb bne.n 10000510 <_ZN6SX126x17SetDio3AsTcxoCtrlEhm+0x34> +10000518: 68b3 ldr r3, [r6, #8] +1000051a: 2700 movs r7, #0 +1000051c: 409a lsls r2, r3 +1000051e: 6182 str r2, [r0, #24] +10000520: 2201 movs r2, #1 +10000522: 4814 ldr r0, [pc, #80] @ (10000574 <_ZN6SX126x17SetDio3AsTcxoCtrlEhm+0x98>) +10000524: f007 fb64 bl 10007bf0 <__spi_write_blocking_veneer> +10000528: ab02 add r3, sp, #8 +1000052a: 4698 mov r8, r3 +1000052c: 466b mov r3, sp +1000052e: ac01 add r4, sp, #4 +10000530: 1cdd adds r5, r3, #3 +10000532: 0022 movs r2, r4 +10000534: 2301 movs r3, #1 +10000536: 0029 movs r1, r5 +10000538: 480e ldr r0, [pc, #56] @ (10000574 <_ZN6SX126x17SetDio3AsTcxoCtrlEhm+0x98>) +1000053a: 3401 adds r4, #1 +1000053c: 702f strb r7, [r5, #0] +1000053e: f007 fb5f bl 10007c00 <__spi_write_read_blocking_veneer> +10000542: 45a0 cmp r8, r4 +10000544: d1f5 bne.n 10000532 <_ZN6SX126x17SetDio3AsTcxoCtrlEhm+0x56> +10000546: 480b ldr r0, [pc, #44] @ (10000574 <_ZN6SX126x17SetDio3AsTcxoCtrlEhm+0x98>) +10000548: f007 facc bl 10007ae4 +1000054c: 2301 movs r3, #1 +1000054e: 68b2 ldr r2, [r6, #8] +10000550: 24d0 movs r4, #208 @ 0xd0 +10000552: 4093 lsls r3, r2 +10000554: 0624 lsls r4, r4, #24 +10000556: 2100 movs r1, #0 +10000558: 2001 movs r0, #1 +1000055a: 6163 str r3, [r4, #20] +1000055c: f001 fc02 bl 10001d64 +10000560: 2201 movs r2, #1 +10000562: 6931 ldr r1, [r6, #16] +10000564: 6863 ldr r3, [r4, #4] +10000566: 40cb lsrs r3, r1 +10000568: 421a tst r2, r3 +1000056a: d1fb bne.n 10000564 <_ZN6SX126x17SetDio3AsTcxoCtrlEhm+0x88> +1000056c: b002 add sp, #8 +1000056e: bc80 pop {r7} +10000570: 46b8 mov r8, r7 +10000572: bdf0 pop {r4, r5, r6, r7, pc} +10000574: 4003c000 .word 0x4003c000 + +10000578 <_ZN6SX126x14SetRfFrequencyEm>: +10000578: b5f0 push {r4, r5, r6, r7, lr} +1000057a: 4646 mov r6, r8 +1000057c: 46d6 mov lr, sl +1000057e: 464f mov r7, r9 +10000580: b5c0 push {r6, r7, lr} +10000582: 4b59 ldr r3, [pc, #356] @ (100006e8 <_ZN6SX126x14SetRfFrequencyEm+0x170>) +10000584: 0006 movs r6, r0 +10000586: 4688 mov r8, r1 +10000588: b082 sub sp, #8 +1000058a: 4299 cmp r1, r3 +1000058c: d800 bhi.n 10000590 <_ZN6SX126x14SetRfFrequencyEm+0x18> +1000058e: e086 b.n 1000069e <_ZN6SX126x14SetRfFrequencyEm+0x126> +10000590: ab01 add r3, sp, #4 +10000592: 4699 mov r9, r3 +10000594: 464a mov r2, r9 +10000596: 4b55 ldr r3, [pc, #340] @ (100006ec <_ZN6SX126x14SetRfFrequencyEm+0x174>) +10000598: 8013 strh r3, [r2, #0] +1000059a: 466a mov r2, sp +1000059c: 2398 movs r3, #152 @ 0x98 +1000059e: 24d0 movs r4, #208 @ 0xd0 +100005a0: 2701 movs r7, #1 +100005a2: 7093 strb r3, [r2, #2] +100005a4: 6932 ldr r2, [r6, #16] +100005a6: 0624 lsls r4, r4, #24 +100005a8: 6863 ldr r3, [r4, #4] +100005aa: 0039 movs r1, r7 +100005ac: 40d3 lsrs r3, r2 +100005ae: 4019 ands r1, r3 +100005b0: 468a mov sl, r1 +100005b2: 421f tst r7, r3 +100005b4: d1f8 bne.n 100005a8 <_ZN6SX126x14SetRfFrequencyEm+0x30> +100005b6: 003a movs r2, r7 +100005b8: 68b3 ldr r3, [r6, #8] +100005ba: 484d ldr r0, [pc, #308] @ (100006f0 <_ZN6SX126x14SetRfFrequencyEm+0x178>) +100005bc: 409a lsls r2, r3 +100005be: 466b mov r3, sp +100005c0: 61a2 str r2, [r4, #24] +100005c2: 1c99 adds r1, r3, #2 +100005c4: 2201 movs r2, #1 +100005c6: f007 fb13 bl 10007bf0 <__spi_write_blocking_veneer> +100005ca: 466b mov r3, sp +100005cc: 1cdd adds r5, r3, #3 +100005ce: 4653 mov r3, sl +100005d0: 464a mov r2, r9 +100005d2: 0029 movs r1, r5 +100005d4: 702b strb r3, [r5, #0] +100005d6: 4846 ldr r0, [pc, #280] @ (100006f0 <_ZN6SX126x14SetRfFrequencyEm+0x178>) +100005d8: 2301 movs r3, #1 +100005da: f007 fb11 bl 10007c00 <__spi_write_read_blocking_veneer> +100005de: 4653 mov r3, sl +100005e0: 466a mov r2, sp +100005e2: 0029 movs r1, r5 +100005e4: 3205 adds r2, #5 +100005e6: 702b strb r3, [r5, #0] +100005e8: 4841 ldr r0, [pc, #260] @ (100006f0 <_ZN6SX126x14SetRfFrequencyEm+0x178>) +100005ea: 2301 movs r3, #1 +100005ec: f007 fb08 bl 10007c00 <__spi_write_read_blocking_veneer> +100005f0: 483f ldr r0, [pc, #252] @ (100006f0 <_ZN6SX126x14SetRfFrequencyEm+0x178>) +100005f2: f007 fa77 bl 10007ae4 +100005f6: 68b3 ldr r3, [r6, #8] +100005f8: 2100 movs r1, #0 +100005fa: 409f lsls r7, r3 +100005fc: 2001 movs r0, #1 +100005fe: 6167 str r7, [r4, #20] +10000600: f001 fbb0 bl 10001d64 +10000604: 21d0 movs r1, #208 @ 0xd0 +10000606: 2201 movs r2, #1 +10000608: 6937 ldr r7, [r6, #16] +1000060a: 0609 lsls r1, r1, #24 +1000060c: 684b ldr r3, [r1, #4] +1000060e: 40fb lsrs r3, r7 +10000610: 421a tst r2, r3 +10000612: d1fb bne.n 1000060c <_ZN6SX126x14SetRfFrequencyEm+0x94> +10000614: 4640 mov r0, r8 +10000616: f004 f9f5 bl 10004a04 <__wrap___aeabi_ui2d> +1000061a: 2200 movs r2, #0 +1000061c: 4b35 ldr r3, [pc, #212] @ (100006f4 <_ZN6SX126x14SetRfFrequencyEm+0x17c>) +1000061e: f004 f96e bl 100048fe <__wrap___aeabi_ddiv> +10000622: f004 fa2f bl 10004a84 <__wrap___aeabi_d2uiz> +10000626: 466a mov r2, sp +10000628: 2386 movs r3, #134 @ 0x86 +1000062a: 21d0 movs r1, #208 @ 0xd0 +1000062c: 7093 strb r3, [r2, #2] +1000062e: 2201 movs r2, #1 +10000630: ba00 rev r0, r0 +10000632: 9001 str r0, [sp, #4] +10000634: 0609 lsls r1, r1, #24 +10000636: 684b ldr r3, [r1, #4] +10000638: 40fb lsrs r3, r7 +1000063a: 421a tst r2, r3 +1000063c: d1fb bne.n 10000636 <_ZN6SX126x14SetRfFrequencyEm+0xbe> +1000063e: 68b3 ldr r3, [r6, #8] +10000640: 482b ldr r0, [pc, #172] @ (100006f0 <_ZN6SX126x14SetRfFrequencyEm+0x178>) +10000642: 409a lsls r2, r3 +10000644: 466b mov r3, sp +10000646: 618a str r2, [r1, #24] +10000648: 1c99 adds r1, r3, #2 +1000064a: 2201 movs r2, #1 +1000064c: f007 fad0 bl 10007bf0 <__spi_write_blocking_veneer> +10000650: ab02 add r3, sp, #8 +10000652: 464c mov r4, r9 +10000654: 4698 mov r8, r3 +10000656: 2700 movs r7, #0 +10000658: 0022 movs r2, r4 +1000065a: 2301 movs r3, #1 +1000065c: 0029 movs r1, r5 +1000065e: 4824 ldr r0, [pc, #144] @ (100006f0 <_ZN6SX126x14SetRfFrequencyEm+0x178>) +10000660: 702f strb r7, [r5, #0] +10000662: 3401 adds r4, #1 +10000664: f007 facc bl 10007c00 <__spi_write_read_blocking_veneer> +10000668: 45a0 cmp r8, r4 +1000066a: d1f5 bne.n 10000658 <_ZN6SX126x14SetRfFrequencyEm+0xe0> +1000066c: 4820 ldr r0, [pc, #128] @ (100006f0 <_ZN6SX126x14SetRfFrequencyEm+0x178>) +1000066e: f007 fa39 bl 10007ae4 +10000672: 2301 movs r3, #1 +10000674: 68b2 ldr r2, [r6, #8] +10000676: 24d0 movs r4, #208 @ 0xd0 +10000678: 4093 lsls r3, r2 +1000067a: 0624 lsls r4, r4, #24 +1000067c: 2100 movs r1, #0 +1000067e: 2001 movs r0, #1 +10000680: 6163 str r3, [r4, #20] +10000682: f001 fb6f bl 10001d64 +10000686: 2201 movs r2, #1 +10000688: 6931 ldr r1, [r6, #16] +1000068a: 6863 ldr r3, [r4, #4] +1000068c: 40cb lsrs r3, r1 +1000068e: 421a tst r2, r3 +10000690: d1fb bne.n 1000068a <_ZN6SX126x14SetRfFrequencyEm+0x112> +10000692: b002 add sp, #8 +10000694: bce0 pop {r5, r6, r7} +10000696: 46ba mov sl, r7 +10000698: 46b1 mov r9, r6 +1000069a: 46a8 mov r8, r5 +1000069c: bdf0 pop {r4, r5, r6, r7, pc} +1000069e: 4b16 ldr r3, [pc, #88] @ (100006f8 <_ZN6SX126x14SetRfFrequencyEm+0x180>) +100006a0: 4299 cmp r1, r3 +100006a2: d905 bls.n 100006b0 <_ZN6SX126x14SetRfFrequencyEm+0x138> +100006a4: ab01 add r3, sp, #4 +100006a6: 4699 mov r9, r3 +100006a8: 464a mov r2, r9 +100006aa: 4b14 ldr r3, [pc, #80] @ (100006fc <_ZN6SX126x14SetRfFrequencyEm+0x184>) +100006ac: 8013 strh r3, [r2, #0] +100006ae: e774 b.n 1000059a <_ZN6SX126x14SetRfFrequencyEm+0x22> +100006b0: 4b13 ldr r3, [pc, #76] @ (10000700 <_ZN6SX126x14SetRfFrequencyEm+0x188>) +100006b2: 4299 cmp r1, r3 +100006b4: d808 bhi.n 100006c8 <_ZN6SX126x14SetRfFrequencyEm+0x150> +100006b6: 4b13 ldr r3, [pc, #76] @ (10000704 <_ZN6SX126x14SetRfFrequencyEm+0x18c>) +100006b8: 4299 cmp r1, r3 +100006ba: d90b bls.n 100006d4 <_ZN6SX126x14SetRfFrequencyEm+0x15c> +100006bc: ab01 add r3, sp, #4 +100006be: 4699 mov r9, r3 +100006c0: 464a mov r2, r9 +100006c2: 4b11 ldr r3, [pc, #68] @ (10000708 <_ZN6SX126x14SetRfFrequencyEm+0x190>) +100006c4: 8013 strh r3, [r2, #0] +100006c6: e768 b.n 1000059a <_ZN6SX126x14SetRfFrequencyEm+0x22> +100006c8: ab01 add r3, sp, #4 +100006ca: 4699 mov r9, r3 +100006cc: 464a mov r2, r9 +100006ce: 4b0f ldr r3, [pc, #60] @ (1000070c <_ZN6SX126x14SetRfFrequencyEm+0x194>) +100006d0: 8013 strh r3, [r2, #0] +100006d2: e762 b.n 1000059a <_ZN6SX126x14SetRfFrequencyEm+0x22> +100006d4: 4b0e ldr r3, [pc, #56] @ (10000710 <_ZN6SX126x14SetRfFrequencyEm+0x198>) +100006d6: aa01 add r2, sp, #4 +100006d8: 4691 mov r9, r2 +100006da: 4299 cmp r1, r3 +100006dc: d800 bhi.n 100006e0 <_ZN6SX126x14SetRfFrequencyEm+0x168> +100006de: e75c b.n 1000059a <_ZN6SX126x14SetRfFrequencyEm+0x22> +100006e0: 4b0c ldr r3, [pc, #48] @ (10000714 <_ZN6SX126x14SetRfFrequencyEm+0x19c>) +100006e2: 8013 strh r3, [r2, #0] +100006e4: e759 b.n 1000059a <_ZN6SX126x14SetRfFrequencyEm+0x22> +100006e6: 46c0 nop @ (mov r8, r8) +100006e8: 35a4e900 .word 0x35a4e900 +100006ec: ffffe9e1 .word 0xffffe9e1 +100006f0: 4003c000 .word 0x4003c000 +100006f4: 3fee8480 .word 0x3fee8480 +100006f8: 32a9f880 .word 0x32a9f880 +100006fc: ffffd8d7 .word 0xffffd8d7 +10000700: 2de54480 .word 0x2de54480 +10000704: 1b6b0b00 .word 0x1b6b0b00 +10000708: ffff8175 .word 0xffff8175 +1000070c: ffffc5c1 .word 0xffffc5c1 +10000710: 1954fc40 .word 0x1954fc40 +10000714: 00006f6b .word 0x00006f6b + +10000718 <_ZN6SX126x14SetPowerConfigEah>: +10000718: b5f0 push {r4, r5, r6, r7, lr} +1000071a: 1c0b adds r3, r1, #0 +1000071c: 0007 movs r7, r0 +1000071e: b083 sub sp, #12 +10000720: 3103 adds r1, #3 +10000722: da3f bge.n 100007a4 <_ZN6SX126x14SetPowerConfigEah+0x8c> +10000724: 23fd movs r3, #253 @ 0xfd +10000726: 4669 mov r1, sp +10000728: 25d0 movs r5, #208 @ 0xd0 +1000072a: 710b strb r3, [r1, #4] +1000072c: 238e movs r3, #142 @ 0x8e +1000072e: 2401 movs r4, #1 +10000730: 714a strb r2, [r1, #5] +10000732: 693a ldr r2, [r7, #16] +10000734: 3102 adds r1, #2 +10000736: 062d lsls r5, r5, #24 +10000738: 700b strb r3, [r1, #0] +1000073a: 686b ldr r3, [r5, #4] +1000073c: 0026 movs r6, r4 +1000073e: 40d3 lsrs r3, r2 +10000740: 401e ands r6, r3 +10000742: 421c tst r4, r3 +10000744: d1f9 bne.n 1000073a <_ZN6SX126x14SetPowerConfigEah+0x22> +10000746: 0022 movs r2, r4 +10000748: 68bb ldr r3, [r7, #8] +1000074a: 4819 ldr r0, [pc, #100] @ (100007b0 <_ZN6SX126x14SetPowerConfigEah+0x98>) +1000074c: 409a lsls r2, r3 +1000074e: 61aa str r2, [r5, #24] +10000750: 2201 movs r2, #1 +10000752: f007 fa4d bl 10007bf0 <__spi_write_blocking_veneer> +10000756: 466b mov r3, sp +10000758: 4669 mov r1, sp +1000075a: 70de strb r6, [r3, #3] +1000075c: aa01 add r2, sp, #4 +1000075e: 2301 movs r3, #1 +10000760: 3103 adds r1, #3 +10000762: 4813 ldr r0, [pc, #76] @ (100007b0 <_ZN6SX126x14SetPowerConfigEah+0x98>) +10000764: f007 fa4c bl 10007c00 <__spi_write_read_blocking_veneer> +10000768: 466b mov r3, sp +1000076a: 466a mov r2, sp +1000076c: 4669 mov r1, sp +1000076e: 3205 adds r2, #5 +10000770: 3103 adds r1, #3 +10000772: 70de strb r6, [r3, #3] +10000774: 480e ldr r0, [pc, #56] @ (100007b0 <_ZN6SX126x14SetPowerConfigEah+0x98>) +10000776: 2301 movs r3, #1 +10000778: f007 fa42 bl 10007c00 <__spi_write_read_blocking_veneer> +1000077c: 480c ldr r0, [pc, #48] @ (100007b0 <_ZN6SX126x14SetPowerConfigEah+0x98>) +1000077e: f007 f9b1 bl 10007ae4 +10000782: 68bb ldr r3, [r7, #8] +10000784: 2001 movs r0, #1 +10000786: 409c lsls r4, r3 +10000788: 2100 movs r1, #0 +1000078a: 616c str r4, [r5, #20] +1000078c: f001 faea bl 10001d64 +10000790: 21d0 movs r1, #208 @ 0xd0 +10000792: 2201 movs r2, #1 +10000794: 6938 ldr r0, [r7, #16] +10000796: 0609 lsls r1, r1, #24 +10000798: 684b ldr r3, [r1, #4] +1000079a: 40c3 lsrs r3, r0 +1000079c: 421a tst r2, r3 +1000079e: d1fb bne.n 10000798 <_ZN6SX126x14SetPowerConfigEah+0x80> +100007a0: b003 add sp, #12 +100007a2: bdf0 pop {r4, r5, r6, r7, pc} +100007a4: b259 sxtb r1, r3 +100007a6: 2916 cmp r1, #22 +100007a8: ddbd ble.n 10000726 <_ZN6SX126x14SetPowerConfigEah+0xe> +100007aa: 2316 movs r3, #22 +100007ac: e7bb b.n 10000726 <_ZN6SX126x14SetPowerConfigEah+0xe> +100007ae: 46c0 nop @ (mov r8, r8) +100007b0: 4003c000 .word 0x4003c000 + +100007b4 <_ZN6SX126x24SetOvercurrentProtectionEh>: +100007b4: b5f0 push {r4, r5, r6, r7, lr} +100007b6: 46c6 mov lr, r8 +100007b8: b500 push {lr} +100007ba: 4b20 ldr r3, [pc, #128] @ (1000083c <_ZN6SX126x24SetOvercurrentProtectionEh+0x88>) +100007bc: b082 sub sp, #8 +100007be: ac01 add r4, sp, #4 +100007c0: 8023 strh r3, [r4, #0] +100007c2: 466b mov r3, sp +100007c4: 70a1 strb r1, [r4, #2] +100007c6: 0006 movs r6, r0 +100007c8: 1c99 adds r1, r3, #2 +100007ca: 6905 ldr r5, [r0, #16] +100007cc: 230d movs r3, #13 +100007ce: 20d0 movs r0, #208 @ 0xd0 +100007d0: 2201 movs r2, #1 +100007d2: 700b strb r3, [r1, #0] +100007d4: 0600 lsls r0, r0, #24 +100007d6: 6843 ldr r3, [r0, #4] +100007d8: 40eb lsrs r3, r5 +100007da: 421a tst r2, r3 +100007dc: d1fb bne.n 100007d6 <_ZN6SX126x24SetOvercurrentProtectionEh+0x22> +100007de: 68b3 ldr r3, [r6, #8] +100007e0: 2700 movs r7, #0 +100007e2: 409a lsls r2, r3 +100007e4: 6182 str r2, [r0, #24] +100007e6: 2201 movs r2, #1 +100007e8: 4815 ldr r0, [pc, #84] @ (10000840 <_ZN6SX126x24SetOvercurrentProtectionEh+0x8c>) +100007ea: f007 fa01 bl 10007bf0 <__spi_write_blocking_veneer> +100007ee: 2307 movs r3, #7 +100007f0: 446b add r3, sp +100007f2: 4698 mov r8, r3 +100007f4: 466b mov r3, sp +100007f6: 1cdd adds r5, r3, #3 +100007f8: 0022 movs r2, r4 +100007fa: 2301 movs r3, #1 +100007fc: 0029 movs r1, r5 +100007fe: 4810 ldr r0, [pc, #64] @ (10000840 <_ZN6SX126x24SetOvercurrentProtectionEh+0x8c>) +10000800: 3401 adds r4, #1 +10000802: 702f strb r7, [r5, #0] +10000804: f007 f9fc bl 10007c00 <__spi_write_read_blocking_veneer> +10000808: 4544 cmp r4, r8 +1000080a: d1f5 bne.n 100007f8 <_ZN6SX126x24SetOvercurrentProtectionEh+0x44> +1000080c: 480c ldr r0, [pc, #48] @ (10000840 <_ZN6SX126x24SetOvercurrentProtectionEh+0x8c>) +1000080e: f007 f969 bl 10007ae4 +10000812: 2301 movs r3, #1 +10000814: 68b2 ldr r2, [r6, #8] +10000816: 24d0 movs r4, #208 @ 0xd0 +10000818: 4093 lsls r3, r2 +1000081a: 0624 lsls r4, r4, #24 +1000081c: 2100 movs r1, #0 +1000081e: 2001 movs r0, #1 +10000820: 6163 str r3, [r4, #20] +10000822: f001 fa9f bl 10001d64 +10000826: 2201 movs r2, #1 +10000828: 6931 ldr r1, [r6, #16] +1000082a: 6863 ldr r3, [r4, #4] +1000082c: 40cb lsrs r3, r1 +1000082e: 421a tst r2, r3 +10000830: d1fb bne.n 1000082a <_ZN6SX126x24SetOvercurrentProtectionEh+0x76> +10000832: b002 add sp, #8 +10000834: bc80 pop {r7} +10000836: 46b8 mov r8, r7 +10000838: bdf0 pop {r4, r5, r6, r7, pc} +1000083a: 46c0 nop @ (mov r8, r8) +1000083c: ffffe708 .word 0xffffe708 +10000840: 4003c000 .word 0x4003c000 + +10000844 <_ZN6SX126x15SetDioIrqParamsEtttt>: +10000844: b5f0 push {r4, r5, r6, r7, lr} +10000846: 46c6 mov lr, r8 +10000848: 0014 movs r4, r2 +1000084a: b500 push {lr} +1000084c: b084 sub sp, #16 +1000084e: aa0a add r2, sp, #40 @ 0x28 +10000850: b2ce uxtb r6, r1 +10000852: 0005 movs r5, r0 +10000854: 0236 lsls r6, r6, #8 +10000856: 8810 ldrh r0, [r2, #0] +10000858: 0a0a lsrs r2, r1, #8 +1000085a: 4929 ldr r1, [pc, #164] @ (10000900 <_ZN6SX126x15SetDioIrqParamsEtttt+0xbc>) +1000085c: 4332 orrs r2, r6 +1000085e: 0a26 lsrs r6, r4, #8 +10000860: 400a ands r2, r1 +10000862: 0436 lsls r6, r6, #16 +10000864: 4332 orrs r2, r6 +10000866: 0212 lsls r2, r2, #8 +10000868: 0624 lsls r4, r4, #24 +1000086a: 0a12 lsrs r2, r2, #8 +1000086c: 4322 orrs r2, r4 +1000086e: 9202 str r2, [sp, #8] +10000870: b2da uxtb r2, r3 +10000872: 0212 lsls r2, r2, #8 +10000874: 0a1b lsrs r3, r3, #8 +10000876: 4313 orrs r3, r2 +10000878: 0a02 lsrs r2, r0, #8 +1000087a: 400b ands r3, r1 +1000087c: 0412 lsls r2, r2, #16 +1000087e: 4313 orrs r3, r2 +10000880: 021b lsls r3, r3, #8 +10000882: 0600 lsls r0, r0, #24 +10000884: 0a1b lsrs r3, r3, #8 +10000886: 4303 orrs r3, r0 +10000888: 9303 str r3, [sp, #12] +1000088a: 466b mov r3, sp +1000088c: 20d0 movs r0, #208 @ 0xd0 +1000088e: 1d99 adds r1, r3, #6 +10000890: 2308 movs r3, #8 +10000892: 2201 movs r2, #1 +10000894: 692c ldr r4, [r5, #16] +10000896: 700b strb r3, [r1, #0] +10000898: 0600 lsls r0, r0, #24 +1000089a: 6843 ldr r3, [r0, #4] +1000089c: 40e3 lsrs r3, r4 +1000089e: 421a tst r2, r3 +100008a0: d1fb bne.n 1000089a <_ZN6SX126x15SetDioIrqParamsEtttt+0x56> +100008a2: 68ab ldr r3, [r5, #8] +100008a4: 2700 movs r7, #0 +100008a6: 409a lsls r2, r3 +100008a8: 6182 str r2, [r0, #24] +100008aa: 2201 movs r2, #1 +100008ac: 4815 ldr r0, [pc, #84] @ (10000904 <_ZN6SX126x15SetDioIrqParamsEtttt+0xc0>) +100008ae: f007 f99f bl 10007bf0 <__spi_write_blocking_veneer> +100008b2: ab04 add r3, sp, #16 +100008b4: 4698 mov r8, r3 +100008b6: 466b mov r3, sp +100008b8: ac02 add r4, sp, #8 +100008ba: 1dde adds r6, r3, #7 +100008bc: 0022 movs r2, r4 +100008be: 2301 movs r3, #1 +100008c0: 0031 movs r1, r6 +100008c2: 4810 ldr r0, [pc, #64] @ (10000904 <_ZN6SX126x15SetDioIrqParamsEtttt+0xc0>) +100008c4: 3401 adds r4, #1 +100008c6: 7037 strb r7, [r6, #0] +100008c8: f007 f99a bl 10007c00 <__spi_write_read_blocking_veneer> +100008cc: 45a0 cmp r8, r4 +100008ce: d1f5 bne.n 100008bc <_ZN6SX126x15SetDioIrqParamsEtttt+0x78> +100008d0: 480c ldr r0, [pc, #48] @ (10000904 <_ZN6SX126x15SetDioIrqParamsEtttt+0xc0>) +100008d2: f007 f907 bl 10007ae4 +100008d6: 2301 movs r3, #1 +100008d8: 68aa ldr r2, [r5, #8] +100008da: 24d0 movs r4, #208 @ 0xd0 +100008dc: 4093 lsls r3, r2 +100008de: 0624 lsls r4, r4, #24 +100008e0: 2100 movs r1, #0 +100008e2: 2001 movs r0, #1 +100008e4: 6163 str r3, [r4, #20] +100008e6: f001 fa3d bl 10001d64 +100008ea: 2201 movs r2, #1 +100008ec: 6929 ldr r1, [r5, #16] +100008ee: 6863 ldr r3, [r4, #4] +100008f0: 40cb lsrs r3, r1 +100008f2: 421a tst r2, r3 +100008f4: d1fb bne.n 100008ee <_ZN6SX126x15SetDioIrqParamsEtttt+0xaa> +100008f6: b004 add sp, #16 +100008f8: bc80 pop {r7} +100008fa: 46b8 mov r8, r7 +100008fc: bdf0 pop {r4, r5, r6, r7, pc} +100008fe: 46c0 nop @ (mov r8, r8) +10000900: ff00ffff .word 0xff00ffff +10000904: 4003c000 .word 0x4003c000 + +10000908 <_ZN6SX126x5beginEhma>: +10000908: b5f0 push {r4, r5, r6, r7, lr} +1000090a: 46d6 mov lr, sl +1000090c: 4646 mov r6, r8 +1000090e: 464f mov r7, r9 +10000910: b5c0 push {r6, r7, lr} +10000912: 2601 movs r6, #1 +10000914: 0005 movs r5, r0 +10000916: b084 sub sp, #16 +10000918: 200a movs r0, #10 +1000091a: 4690 mov r8, r2 +1000091c: 4699 mov r9, r3 +1000091e: f001 fa35 bl 10001d8c +10000922: 0032 movs r2, r6 +10000924: 68eb ldr r3, [r5, #12] +10000926: 24d0 movs r4, #208 @ 0xd0 +10000928: 409a lsls r2, r3 +1000092a: 0624 lsls r4, r4, #24 +1000092c: 61a2 str r2, [r4, #24] +1000092e: 2014 movs r0, #20 +10000930: f001 fa2c bl 10001d8c +10000934: 68eb ldr r3, [r5, #12] +10000936: 200a movs r0, #10 +10000938: 409e lsls r6, r3 +1000093a: 6166 str r6, [r4, #20] +1000093c: f001 fa26 bl 10001d8c +10000940: 2201 movs r2, #1 +10000942: 692b ldr r3, [r5, #16] +10000944: 6861 ldr r1, [r4, #4] +10000946: 40d9 lsrs r1, r3 +10000948: 420a tst r2, r1 +1000094a: d1fb bne.n 10000944 <_ZN6SX126x5beginEhma+0x3c> +1000094c: 210b movs r1, #11 +1000094e: 22c0 movs r2, #192 @ 0xc0 +10000950: 26d0 movs r6, #208 @ 0xd0 +10000952: 2701 movs r7, #1 +10000954: 4469 add r1, sp +10000956: 700a strb r2, [r1, #0] +10000958: 0636 lsls r6, r6, #24 +1000095a: 6874 ldr r4, [r6, #4] +1000095c: 003a movs r2, r7 +1000095e: 40dc lsrs r4, r3 +10000960: 4022 ands r2, r4 +10000962: 4692 mov sl, r2 +10000964: 4227 tst r7, r4 +10000966: d1f8 bne.n 1000095a <_ZN6SX126x5beginEhma+0x52> +10000968: 003a movs r2, r7 +1000096a: 68ab ldr r3, [r5, #8] +1000096c: 484c ldr r0, [pc, #304] @ (10000aa0 <_ZN6SX126x5beginEhma+0x198>) +1000096e: 409a lsls r2, r3 +10000970: 61b2 str r2, [r6, #24] +10000972: 2201 movs r2, #1 +10000974: f007 f93c bl 10007bf0 <__spi_write_blocking_veneer> +10000978: 240a movs r4, #10 +1000097a: 466b mov r3, sp +1000097c: 4652 mov r2, sl +1000097e: a903 add r1, sp, #12 +10000980: 731a strb r2, [r3, #12] +10000982: 4847 ldr r0, [pc, #284] @ (10000aa0 <_ZN6SX126x5beginEhma+0x198>) +10000984: 2301 movs r3, #1 +10000986: 2200 movs r2, #0 +10000988: 446c add r4, sp +1000098a: f007 f939 bl 10007c00 <__spi_write_read_blocking_veneer> +1000098e: 2200 movs r2, #0 +10000990: 2301 movs r3, #1 +10000992: 0021 movs r1, r4 +10000994: 4842 ldr r0, [pc, #264] @ (10000aa0 <_ZN6SX126x5beginEhma+0x198>) +10000996: f007 f933 bl 10007c00 <__spi_write_read_blocking_veneer> +1000099a: 4841 ldr r0, [pc, #260] @ (10000aa0 <_ZN6SX126x5beginEhma+0x198>) +1000099c: f007 f8a2 bl 10007ae4 +100009a0: 68ab ldr r3, [r5, #8] +100009a2: 2001 movs r0, #1 +100009a4: 409f lsls r7, r3 +100009a6: 2100 movs r1, #0 +100009a8: 6177 str r7, [r6, #20] +100009aa: f001 f9db bl 10001d64 +100009ae: 23d0 movs r3, #208 @ 0xd0 +100009b0: 2701 movs r7, #1 +100009b2: 692a ldr r2, [r5, #16] +100009b4: 061b lsls r3, r3, #24 +100009b6: 6859 ldr r1, [r3, #4] +100009b8: 003e movs r6, r7 +100009ba: 40d1 lsrs r1, r2 +100009bc: 400e ands r6, r1 +100009be: 420f tst r7, r1 +100009c0: d1f9 bne.n 100009b6 <_ZN6SX126x5beginEhma+0xae> +100009c2: 7823 ldrb r3, [r4, #0] +100009c4: 2b2a cmp r3, #42 @ 0x2a +100009c6: d006 beq.n 100009d6 <_ZN6SX126x5beginEhma+0xce> +100009c8: 2010 movs r0, #16 +100009ca: b004 add sp, #16 +100009cc: bce0 pop {r5, r6, r7} +100009ce: 46ba mov sl, r7 +100009d0: 46b1 mov r9, r6 +100009d2: 46a8 mov r8, r5 +100009d4: bdf0 pop {r4, r5, r6, r7, pc} +100009d6: 466b mov r3, sp +100009d8: 2180 movs r1, #128 @ 0x80 +100009da: 731e strb r6, [r3, #12] +100009dc: 0028 movs r0, r5 +100009de: 2301 movs r3, #1 +100009e0: aa03 add r2, sp, #12 +100009e2: 9700 str r7, [sp, #0] +100009e4: f7ff fcf2 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +100009e8: 22a0 movs r2, #160 @ 0xa0 +100009ea: 2107 movs r1, #7 +100009ec: 0028 movs r0, r5 +100009ee: 0052 lsls r2, r2, #1 +100009f0: f7ff fd74 bl 100004dc <_ZN6SX126x17SetDio3AsTcxoCtrlEhm> +100009f4: 237f movs r3, #127 @ 0x7f +100009f6: 466a mov r2, sp +100009f8: 2189 movs r1, #137 @ 0x89 +100009fa: 7313 strb r3, [r2, #12] +100009fc: 0028 movs r0, r5 +100009fe: 3b7e subs r3, #126 @ 0x7e +10000a00: aa03 add r2, sp, #12 +10000a02: 9700 str r7, [sp, #0] +10000a04: f7ff fce2 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000a08: 466b mov r3, sp +10000a0a: 219d movs r1, #157 @ 0x9d +10000a0c: 731f strb r7, [r3, #12] +10000a0e: 0028 movs r0, r5 +10000a10: 2301 movs r3, #1 +10000a12: aa03 add r2, sp, #12 +10000a14: 9700 str r7, [sp, #0] +10000a16: f7ff fcd9 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000a1a: 466b mov r3, sp +10000a1c: 2180 movs r1, #128 @ 0x80 +10000a1e: 731e strb r6, [r3, #12] +10000a20: 0028 movs r0, r5 +10000a22: 2301 movs r3, #1 +10000a24: aa03 add r2, sp, #12 +10000a26: 9700 str r7, [sp, #0] +10000a28: f7ff fcd0 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000a2c: 466b mov r3, sp +10000a2e: 2196 movs r1, #150 @ 0x96 +10000a30: 731f strb r7, [r3, #12] +10000a32: 0028 movs r0, r5 +10000a34: 2301 movs r3, #1 +10000a36: aa03 add r2, sp, #12 +10000a38: 9700 str r7, [sp, #0] +10000a3a: f7ff fcc7 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000a3e: 466b mov r3, sp +10000a40: 218f movs r1, #143 @ 0x8f +10000a42: 819e strh r6, [r3, #12] +10000a44: 0028 movs r0, r5 +10000a46: 2302 movs r3, #2 +10000a48: aa03 add r2, sp, #12 +10000a4a: 9700 str r7, [sp, #0] +10000a4c: f7ff fcbe bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000a50: 4b14 ldr r3, [pc, #80] @ (10000aa4 <_ZN6SX126x5beginEhma+0x19c>) +10000a52: 2195 movs r1, #149 @ 0x95 +10000a54: 0028 movs r0, r5 +10000a56: 9303 str r3, [sp, #12] +10000a58: aa03 add r2, sp, #12 +10000a5a: 2304 movs r3, #4 +10000a5c: 9700 str r7, [sp, #0] +10000a5e: f7ff fcb5 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000a62: 2138 movs r1, #56 @ 0x38 +10000a64: 0028 movs r0, r5 +10000a66: f7ff fea5 bl 100007b4 <_ZN6SX126x24SetOvercurrentProtectionEh> +10000a6a: 464b mov r3, r9 +10000a6c: 4649 mov r1, r9 +10000a6e: 1cde adds r6, r3, #3 +10000a70: da10 bge.n 10000a94 <_ZN6SX126x5beginEhma+0x18c> +10000a72: 2103 movs r1, #3 +10000a74: 4249 negs r1, r1 +10000a76: 2204 movs r2, #4 +10000a78: 0028 movs r0, r5 +10000a7a: f7ff fe4d bl 10000718 <_ZN6SX126x14SetPowerConfigEah> +10000a7e: 2300 movs r3, #0 +10000a80: 0028 movs r0, r5 +10000a82: 4909 ldr r1, [pc, #36] @ (10000aa8 <_ZN6SX126x5beginEhma+0x1a0>) +10000a84: 4a09 ldr r2, [pc, #36] @ (10000aac <_ZN6SX126x5beginEhma+0x1a4>) +10000a86: 9300 str r3, [sp, #0] +10000a88: f7ff fedc bl 10000844 <_ZN6SX126x15SetDioIrqParamsEtttt> +10000a8c: 4641 mov r1, r8 +10000a8e: 0028 movs r0, r5 +10000a90: f7ff fd72 bl 10000578 <_ZN6SX126x14SetRfFrequencyEm> +10000a94: b249 sxtb r1, r1 +10000a96: 2916 cmp r1, #22 +10000a98: dded ble.n 10000a76 <_ZN6SX126x5beginEhma+0x16e> +10000a9a: 2116 movs r1, #22 +10000a9c: e7eb b.n 10000a76 <_ZN6SX126x5beginEhma+0x16e> +10000a9e: 46c0 nop @ (mov r8, r8) +10000aa0: 4003c000 .word 0x4003c000 +10000aa4: 01000704 .word 0x01000704 +10000aa8: 000003ff .word 0x000003ff +10000aac: 00000203 .word 0x00000203 + +10000ab0 <_ZN6SX126x12GetIrqStatusEv>: +10000ab0: b5f0 push {r4, r5, r6, r7, lr} +10000ab2: b083 sub sp, #12 +10000ab4: 466b mov r3, sp +10000ab6: 25d0 movs r5, #208 @ 0xd0 +10000ab8: 1c99 adds r1, r3, #2 +10000aba: 2312 movs r3, #18 +10000abc: 0007 movs r7, r0 +10000abe: 2401 movs r4, #1 +10000ac0: 6902 ldr r2, [r0, #16] +10000ac2: 700b strb r3, [r1, #0] +10000ac4: 062d lsls r5, r5, #24 +10000ac6: 686b ldr r3, [r5, #4] +10000ac8: 0026 movs r6, r4 +10000aca: 40d3 lsrs r3, r2 +10000acc: 401e ands r6, r3 +10000ace: 421c tst r4, r3 +10000ad0: d1f9 bne.n 10000ac6 <_ZN6SX126x12GetIrqStatusEv+0x16> +10000ad2: 0022 movs r2, r4 +10000ad4: 68bb ldr r3, [r7, #8] +10000ad6: 4819 ldr r0, [pc, #100] @ (10000b3c <_ZN6SX126x12GetIrqStatusEv+0x8c>) +10000ad8: 409a lsls r2, r3 +10000ada: 61aa str r2, [r5, #24] +10000adc: 2201 movs r2, #1 +10000ade: f007 f887 bl 10007bf0 <__spi_write_blocking_veneer> +10000ae2: 466b mov r3, sp +10000ae4: 2200 movs r2, #0 +10000ae6: 1cd9 adds r1, r3, #3 +10000ae8: 700e strb r6, [r1, #0] +10000aea: 2301 movs r3, #1 +10000aec: 4813 ldr r0, [pc, #76] @ (10000b3c <_ZN6SX126x12GetIrqStatusEv+0x8c>) +10000aee: ae01 add r6, sp, #4 +10000af0: f007 f886 bl 10007c00 <__spi_write_read_blocking_veneer> +10000af4: 2301 movs r3, #1 +10000af6: 2200 movs r2, #0 +10000af8: 0031 movs r1, r6 +10000afa: 4810 ldr r0, [pc, #64] @ (10000b3c <_ZN6SX126x12GetIrqStatusEv+0x8c>) +10000afc: f007 f880 bl 10007c00 <__spi_write_read_blocking_veneer> +10000b00: 4669 mov r1, sp +10000b02: 2200 movs r2, #0 +10000b04: 2301 movs r3, #1 +10000b06: 3105 adds r1, #5 +10000b08: 480c ldr r0, [pc, #48] @ (10000b3c <_ZN6SX126x12GetIrqStatusEv+0x8c>) +10000b0a: f007 f879 bl 10007c00 <__spi_write_read_blocking_veneer> +10000b0e: 480b ldr r0, [pc, #44] @ (10000b3c <_ZN6SX126x12GetIrqStatusEv+0x8c>) +10000b10: f006 ffe8 bl 10007ae4 +10000b14: 68bb ldr r3, [r7, #8] +10000b16: 2001 movs r0, #1 +10000b18: 409c lsls r4, r3 +10000b1a: 2100 movs r1, #0 +10000b1c: 616c str r4, [r5, #20] +10000b1e: f001 f921 bl 10001d64 +10000b22: 21d0 movs r1, #208 @ 0xd0 +10000b24: 2201 movs r2, #1 +10000b26: 6938 ldr r0, [r7, #16] +10000b28: 0609 lsls r1, r1, #24 +10000b2a: 684b ldr r3, [r1, #4] +10000b2c: 40c3 lsrs r3, r0 +10000b2e: 421a tst r2, r3 +10000b30: d1fb bne.n 10000b2a <_ZN6SX126x12GetIrqStatusEv+0x7a> +10000b32: 8830 ldrh r0, [r6, #0] +10000b34: ba40 rev16 r0, r0 +10000b36: b280 uxth r0, r0 +10000b38: b003 add sp, #12 +10000b3a: bdf0 pop {r4, r5, r6, r7, pc} +10000b3c: 4003c000 .word 0x4003c000 + +10000b40 <_ZN6SX126x4SendEPhhh>: +10000b40: b5f0 push {r4, r5, r6, r7, lr} +10000b42: 46de mov lr, fp +10000b44: 464e mov r6, r9 +10000b46: 4645 mov r5, r8 +10000b48: 4657 mov r7, sl +10000b4a: b5e0 push {r5, r6, r7, lr} +10000b4c: b085 sub sp, #20 +10000b4e: 9301 str r3, [sp, #4] +10000b50: 7983 ldrb r3, [r0, #6] +10000b52: 0005 movs r5, r0 +10000b54: 468b mov fp, r1 +10000b56: 4691 mov r9, r2 +10000b58: 2000 movs r0, #0 +10000b5a: 2b00 cmp r3, #0 +10000b5c: d006 beq.n 10000b6c <_ZN6SX126x4SendEPhhh+0x2c> +10000b5e: b005 add sp, #20 +10000b60: bcf0 pop {r4, r5, r6, r7} +10000b62: 46bb mov fp, r7 +10000b64: 46b2 mov sl, r6 +10000b66: 46a9 mov r9, r5 +10000b68: 46a0 mov r8, r4 +10000b6a: bdf0 pop {r4, r5, r6, r7, pc} +10000b6c: 70ab strb r3, [r5, #2] +10000b6e: 464b mov r3, r9 +10000b70: 70eb strb r3, [r5, #3] +10000b72: ab02 add r3, sp, #8 +10000b74: 1cde adds r6, r3, #3 +10000b76: 2201 movs r2, #1 +10000b78: 238c movs r3, #140 @ 0x8c +10000b7a: 21d0 movs r1, #208 @ 0xd0 +10000b7c: 6928 ldr r0, [r5, #16] +10000b7e: 71aa strb r2, [r5, #6] +10000b80: 7033 strb r3, [r6, #0] +10000b82: 0609 lsls r1, r1, #24 +10000b84: 684b ldr r3, [r1, #4] +10000b86: 40c3 lsrs r3, r0 +10000b88: 421a tst r2, r3 +10000b8a: d1fb bne.n 10000b84 <_ZN6SX126x4SendEPhhh+0x44> +10000b8c: 68ab ldr r3, [r5, #8] +10000b8e: 48b8 ldr r0, [pc, #736] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000b90: 409a lsls r2, r3 +10000b92: 618a str r2, [r1, #24] +10000b94: 2201 movs r2, #1 +10000b96: 0031 movs r1, r6 +10000b98: f007 f82a bl 10007bf0 <__spi_write_blocking_veneer> +10000b9c: 1dab adds r3, r5, #6 +10000b9e: 469a mov sl, r3 +10000ba0: 002f movs r7, r5 +10000ba2: 2300 movs r3, #0 +10000ba4: 4655 mov r5, sl +10000ba6: 4698 mov r8, r3 +10000ba8: 46ba mov sl, r7 +10000baa: ac03 add r4, sp, #12 +10000bac: 4643 mov r3, r8 +10000bae: 003a movs r2, r7 +10000bb0: 7023 strb r3, [r4, #0] +10000bb2: 0021 movs r1, r4 +10000bb4: 2301 movs r3, #1 +10000bb6: 48ae ldr r0, [pc, #696] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000bb8: 3701 adds r7, #1 +10000bba: f007 f821 bl 10007c00 <__spi_write_read_blocking_veneer> +10000bbe: 42bd cmp r5, r7 +10000bc0: d1f4 bne.n 10000bac <_ZN6SX126x4SendEPhhh+0x6c> +10000bc2: 4655 mov r5, sl +10000bc4: 48aa ldr r0, [pc, #680] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000bc6: f006 ff8d bl 10007ae4 +10000bca: 2301 movs r3, #1 +10000bcc: 68aa ldr r2, [r5, #8] +10000bce: 27d0 movs r7, #208 @ 0xd0 +10000bd0: 4093 lsls r3, r2 +10000bd2: 063f lsls r7, r7, #24 +10000bd4: 2100 movs r1, #0 +10000bd6: 2001 movs r0, #1 +10000bd8: 617b str r3, [r7, #20] +10000bda: f001 f8c3 bl 10001d64 +10000bde: 2101 movs r1, #1 +10000be0: 692a ldr r2, [r5, #16] +10000be2: 687b ldr r3, [r7, #4] +10000be4: 40d3 lsrs r3, r2 +10000be6: 4219 tst r1, r3 +10000be8: d1fb bne.n 10000be2 <_ZN6SX126x4SendEPhhh+0xa2> +10000bea: 2381 movs r3, #129 @ 0x81 +10000bec: 005b lsls r3, r3, #1 +10000bee: 8023 strh r3, [r4, #0] +10000bf0: 3b01 subs r3, #1 +10000bf2: 3bff subs r3, #255 @ 0xff +10000bf4: a902 add r1, sp, #8 +10000bf6: 27d0 movs r7, #208 @ 0xd0 +10000bf8: 708b strb r3, [r1, #2] +10000bfa: 3b01 subs r3, #1 +10000bfc: 4698 mov r8, r3 +10000bfe: 063f lsls r7, r7, #24 +10000c00: 687b ldr r3, [r7, #4] +10000c02: 4641 mov r1, r8 +10000c04: 40d3 lsrs r3, r2 +10000c06: 4640 mov r0, r8 +10000c08: 4019 ands r1, r3 +10000c0a: 4218 tst r0, r3 +10000c0c: d1f8 bne.n 10000c00 <_ZN6SX126x4SendEPhhh+0xc0> +10000c0e: 4642 mov r2, r8 +10000c10: 68ab ldr r3, [r5, #8] +10000c12: 468a mov sl, r1 +10000c14: 409a lsls r2, r3 +10000c16: ab02 add r3, sp, #8 +10000c18: 1c99 adds r1, r3, #2 +10000c1a: 61ba str r2, [r7, #24] +10000c1c: 4894 ldr r0, [pc, #592] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000c1e: 2201 movs r2, #1 +10000c20: f006 ffe6 bl 10007bf0 <__spi_write_blocking_veneer> +10000c24: 4653 mov r3, sl +10000c26: 0022 movs r2, r4 +10000c28: 0031 movs r1, r6 +10000c2a: 7033 strb r3, [r6, #0] +10000c2c: 4890 ldr r0, [pc, #576] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000c2e: 2301 movs r3, #1 +10000c30: f006 ffe6 bl 10007c00 <__spi_write_read_blocking_veneer> +10000c34: 4653 mov r3, sl +10000c36: aa02 add r2, sp, #8 +10000c38: 0031 movs r1, r6 +10000c3a: 3205 adds r2, #5 +10000c3c: 7033 strb r3, [r6, #0] +10000c3e: 488c ldr r0, [pc, #560] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000c40: 2301 movs r3, #1 +10000c42: f006 ffdd bl 10007c00 <__spi_write_read_blocking_veneer> +10000c46: 488a ldr r0, [pc, #552] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000c48: f006 ff4c bl 10007ae4 +10000c4c: 4642 mov r2, r8 +10000c4e: 68ab ldr r3, [r5, #8] +10000c50: 2001 movs r0, #1 +10000c52: 409a lsls r2, r3 +10000c54: 2100 movs r1, #0 +10000c56: 617a str r2, [r7, #20] +10000c58: f001 f884 bl 10001d64 +10000c5c: 21d0 movs r1, #208 @ 0xd0 +10000c5e: 2201 movs r2, #1 +10000c60: 6928 ldr r0, [r5, #16] +10000c62: 0609 lsls r1, r1, #24 +10000c64: 684b ldr r3, [r1, #4] +10000c66: 40c3 lsrs r3, r0 +10000c68: 421a tst r2, r3 +10000c6a: d1fb bne.n 10000c64 <_ZN6SX126x4SendEPhhh+0x124> +10000c6c: 68ab ldr r3, [r5, #8] +10000c6e: 4880 ldr r0, [pc, #512] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000c70: 409a lsls r2, r3 +10000c72: 230e movs r3, #14 +10000c74: 618a str r2, [r1, #24] +10000c76: 7023 strb r3, [r4, #0] +10000c78: 2201 movs r2, #1 +10000c7a: 0021 movs r1, r4 +10000c7c: f006 ffb8 bl 10007bf0 <__spi_write_blocking_veneer> +10000c80: 2201 movs r2, #1 +10000c82: 2100 movs r1, #0 +10000c84: 487a ldr r0, [pc, #488] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000c86: f006 ffb3 bl 10007bf0 <__spi_write_blocking_veneer> +10000c8a: 464b mov r3, r9 +10000c8c: 2700 movs r7, #0 +10000c8e: 2b00 cmp r3, #0 +10000c90: d00b beq.n 10000caa <_ZN6SX126x4SendEPhhh+0x16a> +10000c92: 46a8 mov r8, r5 +10000c94: 465d mov r5, fp +10000c96: 19e9 adds r1, r5, r7 +10000c98: 2202 movs r2, #2 +10000c9a: 4875 ldr r0, [pc, #468] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000c9c: 3701 adds r7, #1 +10000c9e: f006 ffa7 bl 10007bf0 <__spi_write_blocking_veneer> +10000ca2: b2bb uxth r3, r7 +10000ca4: 454b cmp r3, r9 +10000ca6: d3f6 bcc.n 10000c96 <_ZN6SX126x4SendEPhhh+0x156> +10000ca8: 4645 mov r5, r8 +10000caa: 2001 movs r0, #1 +10000cac: 68ab ldr r3, [r5, #8] +10000cae: 2101 movs r1, #1 +10000cb0: 4098 lsls r0, r3 +10000cb2: 4684 mov ip, r0 +10000cb4: 20d0 movs r0, #208 @ 0xd0 +10000cb6: 4663 mov r3, ip +10000cb8: 0600 lsls r0, r0, #24 +10000cba: 692a ldr r2, [r5, #16] +10000cbc: 6143 str r3, [r0, #20] +10000cbe: 6843 ldr r3, [r0, #4] +10000cc0: 000f movs r7, r1 +10000cc2: 40d3 lsrs r3, r2 +10000cc4: 401f ands r7, r3 +10000cc6: 4219 tst r1, r3 +10000cc8: d1f9 bne.n 10000cbe <_ZN6SX126x4SendEPhhh+0x17e> +10000cca: 2307 movs r3, #7 +10000ccc: a902 add r1, sp, #8 +10000cce: 70a3 strb r3, [r4, #2] +10000cd0: 337c adds r3, #124 @ 0x7c +10000cd2: 708b strb r3, [r1, #2] +10000cd4: 21d0 movs r1, #208 @ 0xd0 +10000cd6: 8027 strh r7, [r4, #0] +10000cd8: 2701 movs r7, #1 +10000cda: 0609 lsls r1, r1, #24 +10000cdc: 684b ldr r3, [r1, #4] +10000cde: 40d3 lsrs r3, r2 +10000ce0: 421f tst r7, r3 +10000ce2: d1fb bne.n 10000cdc <_ZN6SX126x4SendEPhhh+0x19c> +10000ce4: 4663 mov r3, ip +10000ce6: 618b str r3, [r1, #24] +10000ce8: ab02 add r3, sp, #8 +10000cea: 2201 movs r2, #1 +10000cec: 1c99 adds r1, r3, #2 +10000cee: 4860 ldr r0, [pc, #384] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000cf0: f006 ff7e bl 10007bf0 <__spi_write_blocking_veneer> +10000cf4: aa02 add r2, sp, #8 +10000cf6: 2307 movs r3, #7 +10000cf8: 4694 mov ip, r2 +10000cfa: 4463 add r3, ip +10000cfc: 469a mov sl, r3 +10000cfe: 2300 movs r3, #0 +10000d00: 0027 movs r7, r4 +10000d02: 4698 mov r8, r3 +10000d04: 4643 mov r3, r8 +10000d06: 003a movs r2, r7 +10000d08: 7033 strb r3, [r6, #0] +10000d0a: 0031 movs r1, r6 +10000d0c: 2301 movs r3, #1 +10000d0e: 4858 ldr r0, [pc, #352] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000d10: 3701 adds r7, #1 +10000d12: f006 ff75 bl 10007c00 <__spi_write_read_blocking_veneer> +10000d16: 45ba cmp sl, r7 +10000d18: d1f4 bne.n 10000d04 <_ZN6SX126x4SendEPhhh+0x1c4> +10000d1a: 4855 ldr r0, [pc, #340] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000d1c: f006 fee2 bl 10007ae4 +10000d20: 2301 movs r3, #1 +10000d22: 68aa ldr r2, [r5, #8] +10000d24: 27d0 movs r7, #208 @ 0xd0 +10000d26: 4093 lsls r3, r2 +10000d28: 063f lsls r7, r7, #24 +10000d2a: 2100 movs r1, #0 +10000d2c: 2001 movs r0, #1 +10000d2e: 617b str r3, [r7, #20] +10000d30: f001 f818 bl 10001d64 +10000d34: 2201 movs r2, #1 +10000d36: 6929 ldr r1, [r5, #16] +10000d38: 687b ldr r3, [r7, #4] +10000d3a: 40cb lsrs r3, r1 +10000d3c: 421a tst r2, r3 +10000d3e: d1fb bne.n 10000d38 <_ZN6SX126x4SendEPhhh+0x1f8> +10000d40: 9b01 ldr r3, [sp, #4] +10000d42: 2001 movs r0, #1 +10000d44: 079b lsls r3, r3, #30 +10000d46: d400 bmi.n 10000d4a <_ZN6SX126x4SendEPhhh+0x20a> +10000d48: e709 b.n 10000b5e <_ZN6SX126x4SendEPhhh+0x1e> +10000d4a: 0028 movs r0, r5 +10000d4c: f7ff feb0 bl 10000ab0 <_ZN6SX126x12GetIrqStatusEv> +10000d50: 4b48 ldr r3, [pc, #288] @ (10000e74 <_ZN6SX126x4SendEPhhh+0x334>) +10000d52: 4683 mov fp, r0 +10000d54: 4218 tst r0, r3 +10000d56: d000 beq.n 10000d5a <_ZN6SX126x4SendEPhhh+0x21a> +10000d58: e087 b.n 10000e6a <_ZN6SX126x4SendEPhhh+0x32a> +10000d5a: 23d0 movs r3, #208 @ 0xd0 +10000d5c: 061b lsls r3, r3, #24 +10000d5e: 4699 mov r9, r3 +10000d60: 2701 movs r7, #1 +10000d62: 692a ldr r2, [r5, #16] +10000d64: 2312 movs r3, #18 +10000d66: a902 add r1, sp, #8 +10000d68: 708b strb r3, [r1, #2] +10000d6a: 464b mov r3, r9 +10000d6c: 685b ldr r3, [r3, #4] +10000d6e: 0039 movs r1, r7 +10000d70: 40d3 lsrs r3, r2 +10000d72: 4019 ands r1, r3 +10000d74: 4688 mov r8, r1 +10000d76: 421f tst r7, r3 +10000d78: d1f7 bne.n 10000d6a <_ZN6SX126x4SendEPhhh+0x22a> +10000d7a: 003a movs r2, r7 +10000d7c: 68ab ldr r3, [r5, #8] +10000d7e: 483c ldr r0, [pc, #240] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000d80: 409a lsls r2, r3 +10000d82: 0013 movs r3, r2 +10000d84: 464a mov r2, r9 +10000d86: 6193 str r3, [r2, #24] +10000d88: ab02 add r3, sp, #8 +10000d8a: 1c99 adds r1, r3, #2 +10000d8c: 2201 movs r2, #1 +10000d8e: f006 ff2f bl 10007bf0 <__spi_write_blocking_veneer> +10000d92: 4643 mov r3, r8 +10000d94: 2200 movs r2, #0 +10000d96: 0031 movs r1, r6 +10000d98: 7033 strb r3, [r6, #0] +10000d9a: 4835 ldr r0, [pc, #212] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000d9c: 2301 movs r3, #1 +10000d9e: f006 ff2f bl 10007c00 <__spi_write_read_blocking_veneer> +10000da2: 2301 movs r3, #1 +10000da4: 2200 movs r2, #0 +10000da6: 0021 movs r1, r4 +10000da8: 4831 ldr r0, [pc, #196] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000daa: f006 ff29 bl 10007c00 <__spi_write_read_blocking_veneer> +10000dae: a902 add r1, sp, #8 +10000db0: 2301 movs r3, #1 +10000db2: 2200 movs r2, #0 +10000db4: 3105 adds r1, #5 +10000db6: 482e ldr r0, [pc, #184] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000db8: f006 ff22 bl 10007c00 <__spi_write_read_blocking_veneer> +10000dbc: 482c ldr r0, [pc, #176] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000dbe: f006 fe91 bl 10007ae4 +10000dc2: 003a movs r2, r7 +10000dc4: 68ab ldr r3, [r5, #8] +10000dc6: 2100 movs r1, #0 +10000dc8: 409a lsls r2, r3 +10000dca: 0013 movs r3, r2 +10000dcc: 464a mov r2, r9 +10000dce: 2001 movs r0, #1 +10000dd0: 6153 str r3, [r2, #20] +10000dd2: f000 ffc7 bl 10001d64 +10000dd6: 692a ldr r2, [r5, #16] +10000dd8: 0011 movs r1, r2 +10000dda: 464b mov r3, r9 +10000ddc: 685b ldr r3, [r3, #4] +10000dde: 40d3 lsrs r3, r2 +10000de0: 421f tst r7, r3 +10000de2: d1fa bne.n 10000dda <_ZN6SX126x4SendEPhhh+0x29a> +10000de4: 8823 ldrh r3, [r4, #0] +10000de6: ba5b rev16 r3, r3 +10000de8: b298 uxth r0, r3 +10000dea: 4683 mov fp, r0 +10000dec: 4821 ldr r0, [pc, #132] @ (10000e74 <_ZN6SX126x4SendEPhhh+0x334>) +10000dee: 4218 tst r0, r3 +10000df0: d0b8 beq.n 10000d64 <_ZN6SX126x4SendEPhhh+0x224> +10000df2: 2300 movs r3, #0 +10000df4: 71ab strb r3, [r5, #6] +10000df6: 3b01 subs r3, #1 +10000df8: aa02 add r2, sp, #8 +10000dfa: 20d0 movs r0, #208 @ 0xd0 +10000dfc: 8023 strh r3, [r4, #0] +10000dfe: 70a3 strb r3, [r4, #2] +10000e00: 3383 adds r3, #131 @ 0x83 +10000e02: 7093 strb r3, [r2, #2] +10000e04: 2201 movs r2, #1 +10000e06: 0600 lsls r0, r0, #24 +10000e08: 6843 ldr r3, [r0, #4] +10000e0a: 40cb lsrs r3, r1 +10000e0c: 421a tst r2, r3 +10000e0e: d1fb bne.n 10000e08 <_ZN6SX126x4SendEPhhh+0x2c8> +10000e10: 68ab ldr r3, [r5, #8] +10000e12: 2700 movs r7, #0 +10000e14: 409a lsls r2, r3 +10000e16: ab02 add r3, sp, #8 +10000e18: 6182 str r2, [r0, #24] +10000e1a: 1c99 adds r1, r3, #2 +10000e1c: 2201 movs r2, #1 +10000e1e: 4814 ldr r0, [pc, #80] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000e20: f006 fee6 bl 10007bf0 <__spi_write_blocking_veneer> +10000e24: 0022 movs r2, r4 +10000e26: 2301 movs r3, #1 +10000e28: 0031 movs r1, r6 +10000e2a: 4811 ldr r0, [pc, #68] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000e2c: 7037 strb r7, [r6, #0] +10000e2e: 3401 adds r4, #1 +10000e30: f006 fee6 bl 10007c00 <__spi_write_read_blocking_veneer> +10000e34: 45a2 cmp sl, r4 +10000e36: d1f5 bne.n 10000e24 <_ZN6SX126x4SendEPhhh+0x2e4> +10000e38: 480d ldr r0, [pc, #52] @ (10000e70 <_ZN6SX126x4SendEPhhh+0x330>) +10000e3a: f006 fe53 bl 10007ae4 +10000e3e: 2301 movs r3, #1 +10000e40: 68aa ldr r2, [r5, #8] +10000e42: 24d0 movs r4, #208 @ 0xd0 +10000e44: 4093 lsls r3, r2 +10000e46: 0624 lsls r4, r4, #24 +10000e48: 2100 movs r1, #0 +10000e4a: 2001 movs r0, #1 +10000e4c: 6163 str r3, [r4, #20] +10000e4e: f000 ff89 bl 10001d64 +10000e52: 2201 movs r2, #1 +10000e54: 6929 ldr r1, [r5, #16] +10000e56: 6863 ldr r3, [r4, #4] +10000e58: 40cb lsrs r3, r1 +10000e5a: 421a tst r2, r3 +10000e5c: d1fb bne.n 10000e56 <_ZN6SX126x4SendEPhhh+0x316> +10000e5e: 4806 ldr r0, [pc, #24] @ (10000e78 <_ZN6SX126x4SendEPhhh+0x338>) +10000e60: 4458 add r0, fp +10000e62: 1e43 subs r3, r0, #1 +10000e64: 4198 sbcs r0, r3 +10000e66: b2c0 uxtb r0, r0 +10000e68: e679 b.n 10000b5e <_ZN6SX126x4SendEPhhh+0x1e> +10000e6a: 6929 ldr r1, [r5, #16] +10000e6c: e7c1 b.n 10000df2 <_ZN6SX126x4SendEPhhh+0x2b2> +10000e6e: 46c0 nop @ (mov r8, r8) +10000e70: 4003c000 .word 0x4003c000 +10000e74: 00000201 .word 0x00000201 +10000e78: fffffe00 .word 0xfffffe00 + +10000e7c <_ZN6SX126x5SetRxEm>: +10000e7c: b5f0 push {r4, r5, r6, r7, lr} +10000e7e: 46c6 mov lr, r8 +10000e80: b500 push {lr} +10000e82: b082 sub sp, #8 +10000e84: 0c0b lsrs r3, r1, #16 +10000e86: ac01 add r4, sp, #4 +10000e88: 7023 strb r3, [r4, #0] +10000e8a: 0a0b lsrs r3, r1, #8 +10000e8c: 7063 strb r3, [r4, #1] +10000e8e: 466b mov r3, sp +10000e90: 70a1 strb r1, [r4, #2] +10000e92: 0006 movs r6, r0 +10000e94: 1c99 adds r1, r3, #2 +10000e96: 6905 ldr r5, [r0, #16] +10000e98: 2382 movs r3, #130 @ 0x82 +10000e9a: 20d0 movs r0, #208 @ 0xd0 +10000e9c: 2201 movs r2, #1 +10000e9e: 700b strb r3, [r1, #0] +10000ea0: 0600 lsls r0, r0, #24 +10000ea2: 6843 ldr r3, [r0, #4] +10000ea4: 40eb lsrs r3, r5 +10000ea6: 421a tst r2, r3 +10000ea8: d1fb bne.n 10000ea2 <_ZN6SX126x5SetRxEm+0x26> +10000eaa: 68b3 ldr r3, [r6, #8] +10000eac: 2700 movs r7, #0 +10000eae: 409a lsls r2, r3 +10000eb0: 6182 str r2, [r0, #24] +10000eb2: 2201 movs r2, #1 +10000eb4: 4814 ldr r0, [pc, #80] @ (10000f08 <_ZN6SX126x5SetRxEm+0x8c>) +10000eb6: f006 fe9b bl 10007bf0 <__spi_write_blocking_veneer> +10000eba: 2307 movs r3, #7 +10000ebc: 446b add r3, sp +10000ebe: 4698 mov r8, r3 +10000ec0: 466b mov r3, sp +10000ec2: 1cdd adds r5, r3, #3 +10000ec4: 0022 movs r2, r4 +10000ec6: 2301 movs r3, #1 +10000ec8: 0029 movs r1, r5 +10000eca: 480f ldr r0, [pc, #60] @ (10000f08 <_ZN6SX126x5SetRxEm+0x8c>) +10000ecc: 3401 adds r4, #1 +10000ece: 702f strb r7, [r5, #0] +10000ed0: f006 fe96 bl 10007c00 <__spi_write_read_blocking_veneer> +10000ed4: 45a0 cmp r8, r4 +10000ed6: d1f5 bne.n 10000ec4 <_ZN6SX126x5SetRxEm+0x48> +10000ed8: 480b ldr r0, [pc, #44] @ (10000f08 <_ZN6SX126x5SetRxEm+0x8c>) +10000eda: f006 fe03 bl 10007ae4 +10000ede: 2301 movs r3, #1 +10000ee0: 68b2 ldr r2, [r6, #8] +10000ee2: 24d0 movs r4, #208 @ 0xd0 +10000ee4: 4093 lsls r3, r2 +10000ee6: 0624 lsls r4, r4, #24 +10000ee8: 2100 movs r1, #0 +10000eea: 2001 movs r0, #1 +10000eec: 6163 str r3, [r4, #20] +10000eee: f000 ff39 bl 10001d64 +10000ef2: 2201 movs r2, #1 +10000ef4: 6931 ldr r1, [r6, #16] +10000ef6: 6863 ldr r3, [r4, #4] +10000ef8: 40cb lsrs r3, r1 +10000efa: 421a tst r2, r3 +10000efc: d1fb bne.n 10000ef6 <_ZN6SX126x5SetRxEm+0x7a> +10000efe: b002 add sp, #8 +10000f00: bc80 pop {r7} +10000f02: 46b8 mov r8, r7 +10000f04: bdf0 pop {r4, r5, r6, r7, pc} +10000f06: 46c0 nop @ (mov r8, r8) +10000f08: 4003c000 .word 0x4003c000 + +10000f0c <_ZN6SX126x10LoRaConfigEhhhthbb>: +10000f0c: b5f0 push {r4, r5, r6, r7, lr} +10000f0e: 46de mov lr, fp +10000f10: 4657 mov r7, sl +10000f12: 464e mov r6, r9 +10000f14: 4645 mov r5, r8 +10000f16: b5e0 push {r5, r6, r7, lr} +10000f18: b085 sub sp, #20 +10000f1a: 0004 movs r4, r0 +10000f1c: a80e add r0, sp, #56 @ 0x38 +10000f1e: 8800 ldrh r0, [r0, #0] +10000f20: 0216 lsls r6, r2, #8 +10000f22: 4681 mov r9, r0 +10000f24: a80f add r0, sp, #60 @ 0x3c +10000f26: 7800 ldrb r0, [r0, #0] +10000f28: 041b lsls r3, r3, #16 +10000f2a: 4680 mov r8, r0 +10000f2c: a810 add r0, sp, #64 @ 0x40 +10000f2e: 7800 ldrb r0, [r0, #0] +10000f30: 430e orrs r6, r1 +10000f32: 4683 mov fp, r0 +10000f34: a811 add r0, sp, #68 @ 0x44 +10000f36: 7807 ldrb r7, [r0, #0] +10000f38: 2000 movs r0, #0 +10000f3a: 2501 movs r5, #1 +10000f3c: 431e orrs r6, r3 +10000f3e: 466b mov r3, sp +10000f40: 4682 mov sl, r0 +10000f42: 7318 strb r0, [r3, #12] +10000f44: 219f movs r1, #159 @ 0x9f +10000f46: 2301 movs r3, #1 +10000f48: 0020 movs r0, r4 +10000f4a: aa03 add r2, sp, #12 +10000f4c: 9500 str r5, [sp, #0] +10000f4e: f7ff fa3d bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000f52: 466b mov r3, sp +10000f54: 4652 mov r2, sl +10000f56: 21a0 movs r1, #160 @ 0xa0 +10000f58: 731a strb r2, [r3, #12] +10000f5a: 0020 movs r0, r4 +10000f5c: 2301 movs r3, #1 +10000f5e: aa03 add r2, sp, #12 +10000f60: 9500 str r5, [sp, #0] +10000f62: f7ff fa33 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000f66: 466b mov r3, sp +10000f68: 218a movs r1, #138 @ 0x8a +10000f6a: 731d strb r5, [r3, #12] +10000f6c: 0020 movs r0, r4 +10000f6e: 2301 movs r3, #1 +10000f70: aa03 add r2, sp, #12 +10000f72: 9500 str r5, [sp, #0] +10000f74: f7ff fa2a bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000f78: 2304 movs r3, #4 +10000f7a: aa03 add r2, sp, #12 +10000f7c: 218b movs r1, #139 @ 0x8b +10000f7e: 0020 movs r0, r4 +10000f80: 9500 str r5, [sp, #0] +10000f82: 9603 str r6, [sp, #12] +10000f84: f7ff fa22 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000f88: 464b mov r3, r9 +10000f8a: 4642 mov r2, r8 +10000f8c: ba5b rev16 r3, r3 +10000f8e: 8023 strh r3, [r4, #0] +10000f90: 23ff movs r3, #255 @ 0xff +10000f92: 2a00 cmp r2, #0 +10000f94: d001 beq.n 10000f9a <_ZN6SX126x10LoRaConfigEhhhthbb+0x8e> +10000f96: 4643 mov r3, r8 +10000f98: 46a8 mov r8, r5 +10000f9a: 70e3 strb r3, [r4, #3] +10000f9c: 4643 mov r3, r8 +10000f9e: 70a3 strb r3, [r4, #2] +10000fa0: 465b mov r3, fp +10000fa2: 7123 strb r3, [r4, #4] +10000fa4: 1e7b subs r3, r7, #1 +10000fa6: 419f sbcs r7, r3 +10000fa8: 2301 movs r3, #1 +10000faa: 0022 movs r2, r4 +10000fac: 218c movs r1, #140 @ 0x8c +10000fae: 0020 movs r0, r4 +10000fb0: 9300 str r3, [sp, #0] +10000fb2: 7167 strb r7, [r4, #5] +10000fb4: 3305 adds r3, #5 +10000fb6: f7ff fa09 bl 100003cc <_ZN6SX126x11SPItransferEhbPhS0_hb.constprop.1> +10000fba: 2300 movs r3, #0 +10000fbc: 2280 movs r2, #128 @ 0x80 +10000fbe: 0020 movs r0, r4 +10000fc0: 4904 ldr r1, [pc, #16] @ (10000fd4 <_ZN6SX126x10LoRaConfigEhhhthbb+0xc8>) +10000fc2: 9300 str r3, [sp, #0] +10000fc4: 0092 lsls r2, r2, #2 +10000fc6: f7ff fc3d bl 10000844 <_ZN6SX126x15SetDioIrqParamsEtttt> +10000fca: 0020 movs r0, r4 +10000fcc: 4902 ldr r1, [pc, #8] @ (10000fd8 <_ZN6SX126x10LoRaConfigEhhhthbb+0xcc>) +10000fce: f7ff ff55 bl 10000e7c <_ZN6SX126x5SetRxEm> +10000fd2: 46c0 nop @ (mov r8, r8) +10000fd4: 000003ff .word 0x000003ff +10000fd8: 00ffffff .word 0x00ffffff + +10000fdc : +10000fdc: 4a09 ldr r2, [pc, #36] @ (10001004 ) +10000fde: b510 push {r4, lr} +10000fe0: 4694 mov ip, r2 +10000fe2: 2440 movs r4, #64 @ 0x40 +10000fe4: 0083 lsls r3, r0, #2 +10000fe6: 4463 add r3, ip +10000fe8: 681a ldr r2, [r3, #0] +10000fea: 00c0 lsls r0, r0, #3 +10000fec: 4062 eors r2, r4 +10000fee: 3480 adds r4, #128 @ 0x80 +10000ff0: 4014 ands r4, r2 +10000ff2: 2280 movs r2, #128 @ 0x80 +10000ff4: 0152 lsls r2, r2, #5 +10000ff6: 4313 orrs r3, r2 +10000ff8: 601c str r4, [r3, #0] +10000ffa: 4b03 ldr r3, [pc, #12] @ (10001008 ) +10000ffc: 469c mov ip, r3 +10000ffe: 4460 add r0, ip +10001000: 6041 str r1, [r0, #4] +10001002: bd10 pop {r4, pc} +10001004: 4001c004 .word 0x4001c004 +10001008: 40014000 .word 0x40014000 + +1000100c : +1000100c: 2301 movs r3, #1 +1000100e: 22d0 movs r2, #208 @ 0xd0 +10001010: 4083 lsls r3, r0 +10001012: 0612 lsls r2, r2, #24 +10001014: 6293 str r3, [r2, #40] @ 0x28 +10001016: 6193 str r3, [r2, #24] +10001018: 4a09 ldr r2, [pc, #36] @ (10001040 ) +1000101a: 2140 movs r1, #64 @ 0x40 +1000101c: 4694 mov ip, r2 +1000101e: 0083 lsls r3, r0, #2 +10001020: 4463 add r3, ip +10001022: 681a ldr r2, [r3, #0] +10001024: 00c0 lsls r0, r0, #3 +10001026: 404a eors r2, r1 +10001028: 3180 adds r1, #128 @ 0x80 +1000102a: 4011 ands r1, r2 +1000102c: 2280 movs r2, #128 @ 0x80 +1000102e: 0152 lsls r2, r2, #5 +10001030: 4313 orrs r3, r2 +10001032: 6019 str r1, [r3, #0] +10001034: 4b03 ldr r3, [pc, #12] @ (10001044 ) +10001036: 469c mov ip, r3 +10001038: 2305 movs r3, #5 +1000103a: 4460 add r0, ip +1000103c: 6043 str r3, [r0, #4] +1000103e: 4770 bx lr +10001040: 4001c004 .word 0x4001c004 +10001044: 40014000 .word 0x40014000 + +10001048 : +10001048: 4b02 ldr r3, [pc, #8] @ (10001054 ) +1000104a: 6818 ldr r0, [r3, #0] +1000104c: 0780 lsls r0, r0, #30 +1000104e: 0fc0 lsrs r0, r0, #31 +10001050: 4770 bx lr +10001052: 46c0 nop @ (mov r8, r8) +10001054: 4006c000 .word 0x4006c000 + +10001058 : +10001058: b570 push {r4, r5, r6, lr} +1000105a: f3ef 8c10 mrs ip, PRIMASK +1000105e: b672 cpsid i +10001060: 4d0d ldr r5, [pc, #52] @ (10001098 ) +10001062: 682b ldr r3, [r5, #0] +10001064: 2b00 cmp r3, #0 +10001066: d0fc beq.n 10001062 +10001068: f3bf 8f5f dmb sy +1000106c: 2407 movs r4, #7 +1000106e: 08cb lsrs r3, r1, #3 +10001070: 18c6 adds r6, r0, r3 +10001072: 5cc0 ldrb r0, [r0, r3] +10001074: 2301 movs r3, #1 +10001076: 400c ands r4, r1 +10001078: 40a3 lsls r3, r4 +1000107a: 001c movs r4, r3 +1000107c: 4004 ands r4, r0 +1000107e: 4203 tst r3, r0 +10001080: d107 bne.n 10001092 +10001082: 4318 orrs r0, r3 +10001084: 7030 strb r0, [r6, #0] +10001086: f3bf 8f5f dmb sy +1000108a: 602c str r4, [r5, #0] +1000108c: f38c 8810 msr PRIMASK, ip +10001090: bd70 pop {r4, r5, r6, pc} +10001092: 0010 movs r0, r2 +10001094: f001 fdb8 bl 10002c08 +10001098: d000012c .word 0xd000012c + +1000109c : +1000109c: b5f8 push {r3, r4, r5, r6, r7, lr} +1000109e: 4647 mov r7, r8 +100010a0: 46ce mov lr, r9 +100010a2: 4688 mov r8, r1 +100010a4: b580 push {r7, lr} +100010a6: f3ef 8c10 mrs ip, PRIMASK +100010aa: b672 cpsid i +100010ac: 4d21 ldr r5, [pc, #132] @ (10001134 ) +100010ae: 682c ldr r4, [r5, #0] +100010b0: 2c00 cmp r4, #0 +100010b2: d0fc beq.n 100010ae +100010b4: f3bf 8f5f dmb sy +100010b8: 429a cmp r2, r3 +100010ba: d82c bhi.n 10001116 +100010bc: 08d4 lsrs r4, r2, #3 +100010be: 2707 movs r7, #7 +100010c0: 5d05 ldrb r5, [r0, r4] +100010c2: 1906 adds r6, r0, r4 +100010c4: 2401 movs r4, #1 +100010c6: 4017 ands r7, r2 +100010c8: 40bc lsls r4, r7 +100010ca: 422c tst r4, r5 +100010cc: d01f beq.n 1000110e +100010ce: 2107 movs r1, #7 +100010d0: 2701 movs r7, #1 +100010d2: 4689 mov r9, r1 +100010d4: e009 b.n 100010ea +100010d6: 08d4 lsrs r4, r2, #3 +100010d8: 5d05 ldrb r5, [r0, r4] +100010da: 1906 adds r6, r0, r4 +100010dc: 464c mov r4, r9 +100010de: 0039 movs r1, r7 +100010e0: 4014 ands r4, r2 +100010e2: 40a1 lsls r1, r4 +100010e4: 000c movs r4, r1 +100010e6: 4229 tst r1, r5 +100010e8: d011 beq.n 1000110e +100010ea: 3201 adds r2, #1 +100010ec: 4293 cmp r3, r2 +100010ee: d2f2 bcs.n 100010d6 +100010f0: 2001 movs r0, #1 +100010f2: 4240 negs r0, r0 +100010f4: f3bf 8f5f dmb sy +100010f8: 2200 movs r2, #0 +100010fa: 4b0e ldr r3, [pc, #56] @ (10001134 ) +100010fc: 601a str r2, [r3, #0] +100010fe: f38c 8810 msr PRIMASK, ip +10001102: 2800 cmp r0, #0 +10001104: db0f blt.n 10001126 +10001106: bcc0 pop {r6, r7} +10001108: 46b9 mov r9, r7 +1000110a: 46b0 mov r8, r6 +1000110c: bdf8 pop {r3, r4, r5, r6, r7, pc} +1000110e: 4325 orrs r5, r4 +10001110: 0010 movs r0, r2 +10001112: 7035 strb r5, [r6, #0] +10001114: e7ee b.n 100010f4 +10001116: f3bf 8f5f dmb sy +1000111a: 2300 movs r3, #0 +1000111c: 602b str r3, [r5, #0] +1000111e: f38c 8810 msr PRIMASK, ip +10001122: 2001 movs r0, #1 +10001124: 4240 negs r0, r0 +10001126: 4643 mov r3, r8 +10001128: 2b00 cmp r3, #0 +1000112a: d0ec beq.n 10001106 +1000112c: 9808 ldr r0, [sp, #32] +1000112e: f001 fd6b bl 10002c08 +10001132: 46c0 nop @ (mov r8, r8) +10001134: d000012c .word 0xd000012c + +10001138 : +10001138: 2100 movs r1, #0 +1000113a: 4b04 ldr r3, [pc, #16] @ (1000114c ) +1000113c: 4a04 ldr r2, [pc, #16] @ (10001150 ) +1000113e: f3bf 8f5f dmb sy +10001142: c302 stmia r3!, {r1} +10001144: 4293 cmp r3, r2 +10001146: d1fa bne.n 1000113e +10001148: 4770 bx lr +1000114a: 46c0 nop @ (mov r8, r8) +1000114c: d0000100 .word 0xd0000100 +10001150: d0000180 .word 0xd0000180 + +10001154 : +10001154: 4a04 ldr r2, [pc, #16] @ (10001168 ) +10001156: 7810 ldrb r0, [r2, #0] +10001158: 1c43 adds r3, r0, #1 +1000115a: b2db uxtb r3, r3 +1000115c: 2b17 cmp r3, #23 +1000115e: d900 bls.n 10001162 +10001160: 2310 movs r3, #16 +10001162: 7013 strb r3, [r2, #0] +10001164: 4770 bx lr +10001166: 46c0 nop @ (mov r8, r8) +10001168: 20000ea8 .word 0x20000ea8 + +1000116c : +1000116c: b510 push {r4, lr} +1000116e: 4b06 ldr r3, [pc, #24] @ (10001188 ) +10001170: 4c06 ldr r4, [pc, #24] @ (1000118c ) +10001172: b082 sub sp, #8 +10001174: 0001 movs r1, r0 +10001176: 9300 str r3, [sp, #0] +10001178: 2218 movs r2, #24 +1000117a: 231f movs r3, #31 +1000117c: 0020 movs r0, r4 +1000117e: f7ff ff8d bl 1000109c +10001182: b002 add sp, #8 +10001184: bd10 pop {r4, pc} +10001186: 46c0 nop @ (mov r8, r8) +10001188: 10007c98 .word 0x10007c98 +1000118c: 20001854 .word 0x20001854 + +10001190 : +10001190: 2301 movs r3, #1 +10001192: 4083 lsls r3, r0 +10001194: 2900 cmp r1, #0 +10001196: d004 beq.n 100011a2 +10001198: 4a03 ldr r2, [pc, #12] @ (100011a8 ) +1000119a: 6013 str r3, [r2, #0] +1000119c: 4a03 ldr r2, [pc, #12] @ (100011ac ) +1000119e: 6013 str r3, [r2, #0] +100011a0: 4770 bx lr +100011a2: 4a03 ldr r2, [pc, #12] @ (100011b0 ) +100011a4: 6013 str r3, [r2, #0] +100011a6: e7fb b.n 100011a0 +100011a8: e000e280 .word 0xe000e280 +100011ac: e000e100 .word 0xe000e100 +100011b0: e000e180 .word 0xe000e180 + +100011b4 : +100011b4: 2301 movs r3, #1 +100011b6: 4083 lsls r3, r0 +100011b8: 4a01 ldr r2, [pc, #4] @ (100011c0 ) +100011ba: 6013 str r3, [r2, #0] +100011bc: 4770 bx lr +100011be: 46c0 nop @ (mov r8, r8) +100011c0: e000e200 .word 0xe000e200 + +100011c4 : +100011c4: 4b08 ldr r3, [pc, #32] @ (100011e8 ) +100011c6: 3010 adds r0, #16 +100011c8: 689b ldr r3, [r3, #8] +100011ca: 0080 lsls r0, r0, #2 +100011cc: 58c3 ldr r3, [r0, r3] +100011ce: 2b00 cmp r3, #0 +100011d0: d007 beq.n 100011e2 +100011d2: 4a06 ldr r2, [pc, #24] @ (100011ec ) +100011d4: 2000 movs r0, #0 +100011d6: 1a9b subs r3, r3, r2 +100011d8: 222f movs r2, #47 @ 0x2f +100011da: 429a cmp r2, r3 +100011dc: 4140 adcs r0, r0 +100011de: b2c0 uxtb r0, r0 +100011e0: 4770 bx lr +100011e2: 2000 movs r0, #0 +100011e4: e7fc b.n 100011e0 +100011e6: 46c0 nop @ (mov r8, r8) +100011e8: e000ed00 .word 0xe000ed00 +100011ec: 20000eac .word 0x20000eac + +100011f0 : +100011f0: 4b02 ldr r3, [pc, #8] @ (100011fc ) +100011f2: 3010 adds r0, #16 +100011f4: 689b ldr r3, [r3, #8] +100011f6: 0080 lsls r0, r0, #2 +100011f8: 58c0 ldr r0, [r0, r3] +100011fa: 4770 bx lr +100011fc: e000ed00 .word 0xe000ed00 + +10001200 : +10001200: b570 push {r4, r5, r6, lr} +10001202: 000d movs r5, r1 +10001204: f3ef 8610 mrs r6, PRIMASK +10001208: b672 cpsid i +1000120a: 4a0f ldr r2, [pc, #60] @ (10001248 ) +1000120c: 6813 ldr r3, [r2, #0] +1000120e: 2b00 cmp r3, #0 +10001210: d0fc beq.n 1000120c +10001212: f3bf 8f5f dmb sy +10001216: 4b0d ldr r3, [pc, #52] @ (1000124c ) +10001218: 3010 adds r0, #16 +1000121a: 689b ldr r3, [r3, #8] +1000121c: 0084 lsls r4, r0, #2 +1000121e: 591b ldr r3, [r3, r4] +10001220: 4a0b ldr r2, [pc, #44] @ (10001250 ) +10001222: 4293 cmp r3, r2 +10001224: d003 beq.n 1000122e +10001226: 429d cmp r5, r3 +10001228: d001 beq.n 1000122e +1000122a: f001 fd05 bl 10002c38 +1000122e: 4b07 ldr r3, [pc, #28] @ (1000124c ) +10001230: 689b ldr r3, [r3, #8] +10001232: 511d str r5, [r3, r4] +10001234: f3bf 8f5f dmb sy +10001238: f3bf 8f5f dmb sy +1000123c: 2200 movs r2, #0 +1000123e: 4b02 ldr r3, [pc, #8] @ (10001248 ) +10001240: 601a str r2, [r3, #0] +10001242: f386 8810 msr PRIMASK, r6 +10001246: bd70 pop {r4, r5, r6, pc} +10001248: d0000124 .word 0xd0000124 +1000124c: e000ed00 .word 0xe000ed00 +10001250: 100001cd .word 0x100001cd + +10001254 : +10001254: b5f0 push {r4, r5, r6, r7, lr} +10001256: 4657 mov r7, sl +10001258: 464e mov r6, r9 +1000125a: 46de mov lr, fp +1000125c: 4645 mov r5, r8 +1000125e: b5e0 push {r5, r6, r7, lr} +10001260: b085 sub sp, #20 +10001262: 0006 movs r6, r0 +10001264: 9100 str r1, [sp, #0] +10001266: 0017 movs r7, r2 +10001268: f3ef 8b10 mrs fp, PRIMASK +1000126c: b672 cpsid i +1000126e: 4a6a ldr r2, [pc, #424] @ (10001418 ) +10001270: 6813 ldr r3, [r2, #0] +10001272: 2b00 cmp r3, #0 +10001274: d0fc beq.n 10001270 +10001276: f3bf 8f5f dmb sy +1000127a: 2500 movs r5, #0 +1000127c: 4b67 ldr r3, [pc, #412] @ (1000141c ) +1000127e: 575d ldrsb r5, [r3, r5] +10001280: 469a mov sl, r3 +10001282: 2d00 cmp r5, #0 +10001284: da00 bge.n 10001288 +10001286: e0a9 b.n 100013dc +10001288: 006b lsls r3, r5, #1 +1000128a: 4c65 ldr r4, [pc, #404] @ (10001420 ) +1000128c: 9301 str r3, [sp, #4] +1000128e: 195b adds r3, r3, r5 +10001290: 009b lsls r3, r3, #2 +10001292: 4698 mov r8, r3 +10001294: 46a1 mov r9, r4 +10001296: 44c1 add r9, r8 +10001298: 464b mov r3, r9 +1000129a: 4652 mov r2, sl +1000129c: 799b ldrb r3, [r3, #6] +1000129e: 3610 adds r6, #16 +100012a0: 7013 strb r3, [r2, #0] +100012a2: 4b60 ldr r3, [pc, #384] @ (10001424 ) +100012a4: 00b6 lsls r6, r6, #2 +100012a6: 689b ldr r3, [r3, #8] +100012a8: 5999 ldr r1, [r3, r6] +100012aa: 1b0b subs r3, r1, r4 +100012ac: 2b2f cmp r3, #47 @ 0x2f +100012ae: d933 bls.n 10001318 +100012b0: 4b5d ldr r3, [pc, #372] @ (10001428 ) +100012b2: 4299 cmp r1, r3 +100012b4: d000 beq.n 100012b8 +100012b6: e0ac b.n 10001412 +100012b8: 9b01 ldr r3, [sp, #4] +100012ba: 4642 mov r2, r8 +100012bc: 469c mov ip, r3 +100012be: 4b5b ldr r3, [pc, #364] @ (1000142c ) +100012c0: 4465 add r5, ip +100012c2: 00ad lsls r5, r5, #2 +100012c4: 5363 strh r3, [r4, r5] +100012c6: 4b5a ldr r3, [pc, #360] @ (10001430 ) +100012c8: 3202 adds r2, #2 +100012ca: 18a2 adds r2, r4, r2 +100012cc: 3b04 subs r3, #4 +100012ce: 1a9b subs r3, r3, r2 +100012d0: 051b lsls r3, r3, #20 +100012d2: 4a58 ldr r2, [pc, #352] @ (10001434 ) +100012d4: 0d5b lsrs r3, r3, #21 +100012d6: 1965 adds r5, r4, r5 +100012d8: 4313 orrs r3, r2 +100012da: 806b strh r3, [r5, #2] +100012dc: 4b56 ldr r3, [pc, #344] @ (10001438 ) +100012de: 2101 movs r1, #1 +100012e0: 80ab strh r3, [r5, #4] +100012e2: 23ff movs r3, #255 @ 0xff +100012e4: 71ab strb r3, [r5, #6] +100012e6: 9b00 ldr r3, [sp, #0] +100012e8: 71ef strb r7, [r5, #7] +100012ea: 60ab str r3, [r5, #8] +100012ec: 464b mov r3, r9 +100012ee: 430b orrs r3, r1 +100012f0: 0019 movs r1, r3 +100012f2: 4b4c ldr r3, [pc, #304] @ (10001424 ) +100012f4: 689b ldr r3, [r3, #8] +100012f6: 5199 str r1, [r3, r6] +100012f8: f3bf 8f5f dmb sy +100012fc: f3bf 8f5f dmb sy +10001300: 2200 movs r2, #0 +10001302: 4b45 ldr r3, [pc, #276] @ (10001418 ) +10001304: 601a str r2, [r3, #0] +10001306: f38b 8810 msr PRIMASK, fp +1000130a: b005 add sp, #20 +1000130c: bcf0 pop {r4, r5, r6, r7} +1000130e: 46bb mov fp, r7 +10001310: 46b2 mov sl, r6 +10001312: 46a9 mov r9, r5 +10001314: 46a0 mov r8, r4 +10001316: bdf0 pop {r4, r5, r6, r7, pc} +10001318: 2001 movs r0, #1 +1000131a: 000a movs r2, r1 +1000131c: 4382 bics r2, r0 +1000131e: 79d3 ldrb r3, [r2, #7] +10001320: 468c mov ip, r1 +10001322: 42bb cmp r3, r7 +10001324: d831 bhi.n 1000138a +10001326: 4645 mov r5, r8 +10001328: 0013 movs r3, r2 +1000132a: 4944 ldr r1, [pc, #272] @ (1000143c ) +1000132c: 1b1b subs r3, r3, r4 +1000132e: 415b adcs r3, r3 +10001330: 4359 muls r1, r3 +10001332: 0d09 lsrs r1, r1, #20 +10001334: 4b3d ldr r3, [pc, #244] @ (1000142c ) +10001336: 5363 strh r3, [r4, r5] +10001338: 4b3d ldr r3, [pc, #244] @ (10001430 ) +1000133a: 3502 adds r5, #2 +1000133c: 1965 adds r5, r4, r5 +1000133e: 3b04 subs r3, #4 +10001340: 1b5b subs r3, r3, r5 +10001342: 051b lsls r3, r3, #20 +10001344: 4d3b ldr r5, [pc, #236] @ (10001434 ) +10001346: 0d5b lsrs r3, r3, #21 +10001348: 432b orrs r3, r5 +1000134a: 46aa mov sl, r5 +1000134c: 464d mov r5, r9 +1000134e: 806b strh r3, [r5, #2] +10001350: 2504 movs r5, #4 +10001352: 46ac mov ip, r5 +10001354: 4655 mov r5, sl +10001356: 44e0 add r8, ip +10001358: 1f13 subs r3, r2, #4 +1000135a: 4444 add r4, r8 +1000135c: 1b1b subs r3, r3, r4 +1000135e: 051b lsls r3, r3, #20 +10001360: 0d5b lsrs r3, r3, #21 +10001362: 431d orrs r5, r3 +10001364: 464b mov r3, r9 +10001366: 7199 strb r1, [r3, #6] +10001368: 9900 ldr r1, [sp, #0] +1000136a: 809d strh r5, [r3, #4] +1000136c: 6099 str r1, [r3, #8] +1000136e: 4649 mov r1, r9 +10001370: 71df strb r7, [r3, #7] +10001372: 4b33 ldr r3, [pc, #204] @ (10001440 ) +10001374: 4301 orrs r1, r0 +10001376: 6013 str r3, [r2, #0] +10001378: e7bb b.n 100012f2 +1000137a: 0058 lsls r0, r3, #1 +1000137c: 18c0 adds r0, r0, r3 +1000137e: 0080 lsls r0, r0, #2 +10001380: 1820 adds r0, r4, r0 +10001382: 79c1 ldrb r1, [r0, #7] +10001384: 42b9 cmp r1, r7 +10001386: d92f bls.n 100013e8 +10001388: 0002 movs r2, r0 +1000138a: 2306 movs r3, #6 +1000138c: 56d3 ldrsb r3, [r2, r3] +1000138e: 2b00 cmp r3, #0 +10001390: daf3 bge.n 1000137a +10001392: 9302 str r3, [sp, #8] +10001394: 4b2b ldr r3, [pc, #172] @ (10001444 ) +10001396: 4661 mov r1, ip +10001398: 9303 str r3, [sp, #12] +1000139a: 1d13 adds r3, r2, #4 +1000139c: 469a mov sl, r3 +1000139e: 2304 movs r3, #4 +100013a0: 425b negs r3, r3 +100013a2: 469c mov ip, r3 +100013a4: 44e1 add r9, ip +100013a6: 4650 mov r0, sl +100013a8: 464b mov r3, r9 +100013aa: 1a1b subs r3, r3, r0 +100013ac: 051b lsls r3, r3, #20 +100013ae: 0d5b lsrs r3, r3, #21 +100013b0: 469c mov ip, r3 +100013b2: 4b20 ldr r3, [pc, #128] @ (10001434 ) +100013b4: 7195 strb r5, [r2, #6] +100013b6: 4698 mov r8, r3 +100013b8: 4663 mov r3, ip +100013ba: 4640 mov r0, r8 +100013bc: 4303 orrs r3, r0 +100013be: 8093 strh r3, [r2, #4] +100013c0: 9b01 ldr r3, [sp, #4] +100013c2: 195a adds r2, r3, r5 +100013c4: 0092 lsls r2, r2, #2 +100013c6: 9b03 ldr r3, [sp, #12] +100013c8: 18a4 adds r4, r4, r2 +100013ca: 80a3 strh r3, [r4, #4] +100013cc: 9b02 ldr r3, [sp, #8] +100013ce: 4a1c ldr r2, [pc, #112] @ (10001440 ) +100013d0: 71a3 strb r3, [r4, #6] +100013d2: 9b00 ldr r3, [sp, #0] +100013d4: 6022 str r2, [r4, #0] +100013d6: 71e7 strb r7, [r4, #7] +100013d8: 60a3 str r3, [r4, #8] +100013da: e78a b.n 100012f2 +100013dc: f001 fc2c bl 10002c38 +100013e0: 2500 movs r5, #0 +100013e2: 4653 mov r3, sl +100013e4: 575d ldrsb r5, [r3, r5] +100013e6: e74f b.n 10001288 +100013e8: 8890 ldrh r0, [r2, #4] +100013ea: 9302 str r3, [sp, #8] +100013ec: 0540 lsls r0, r0, #21 +100013ee: 1d13 adds r3, r2, #4 +100013f0: 469a mov sl, r3 +100013f2: 1503 asrs r3, r0, #20 +100013f4: 4661 mov r1, ip +100013f6: 469c mov ip, r3 +100013f8: 4640 mov r0, r8 +100013fa: 44d4 add ip, sl +100013fc: 4663 mov r3, ip +100013fe: 3004 adds r0, #4 +10001400: 1820 adds r0, r4, r0 +10001402: 1a18 subs r0, r3, r0 +10001404: 23e0 movs r3, #224 @ 0xe0 +10001406: 0500 lsls r0, r0, #20 +10001408: 0d40 lsrs r0, r0, #21 +1000140a: 021b lsls r3, r3, #8 +1000140c: 4318 orrs r0, r3 +1000140e: 9003 str r0, [sp, #12] +10001410: e7c5 b.n 1000139e +10001412: f001 fc11 bl 10002c38 +10001416: e74f b.n 100012b8 +10001418: d0000124 .word 0xd0000124 +1000141c: 20001d65 .word 0x20001d65 +10001420: 20000eac .word 0x20000eac +10001424: e000ed00 .word 0xe000ed00 +10001428: 100001cd .word 0x100001cd +1000142c: ffffa100 .word 0xffffa100 +10001430: 20000edc .word 0x20000edc +10001434: ffffe000 .word 0xffffe000 +10001438: ffffbd01 .word 0xffffbd01 +1000143c: 0000aaaa .word 0x0000aaaa +10001440: 47804801 .word 0x47804801 +10001444: 0000bd01 .word 0x0000bd01 + +10001448 : +10001448: b5f0 push {r4, r5, r6, r7, lr} +1000144a: 46de mov lr, fp +1000144c: 4657 mov r7, sl +1000144e: 464e mov r6, r9 +10001450: 4645 mov r5, r8 +10001452: b5e0 push {r5, r6, r7, lr} +10001454: 000c movs r4, r1 +10001456: b083 sub sp, #12 +10001458: f3ef 8810 mrs r8, PRIMASK +1000145c: b672 cpsid i +1000145e: 4a5d ldr r2, [pc, #372] @ (100015d4 ) +10001460: 6813 ldr r3, [r2, #0] +10001462: 2b00 cmp r3, #0 +10001464: d0fc beq.n 10001460 +10001466: f3bf 8f5f dmb sy +1000146a: 4b5b ldr r3, [pc, #364] @ (100015d8 ) +1000146c: 495b ldr r1, [pc, #364] @ (100015dc ) +1000146e: 689a ldr r2, [r3, #8] +10001470: 0003 movs r3, r0 +10001472: 3310 adds r3, #16 +10001474: 009f lsls r7, r3, #2 +10001476: 59d5 ldr r5, [r2, r7] +10001478: 428d cmp r5, r1 +1000147a: d039 beq.n 100014f0 +1000147c: 42a5 cmp r5, r4 +1000147e: d04a beq.n 10001516 +10001480: 4e57 ldr r6, [pc, #348] @ (100015e0 ) +10001482: 1baa subs r2, r5, r6 +10001484: 2a2f cmp r2, #47 @ 0x2f +10001486: d833 bhi.n 100014f0 +10001488: 2201 movs r2, #1 +1000148a: 4692 mov sl, r2 +1000148c: 4082 lsls r2, r0 +1000148e: 4691 mov r9, r2 +10001490: 4648 mov r0, r9 +10001492: 4a54 ldr r2, [pc, #336] @ (100015e4 ) +10001494: 6812 ldr r2, [r2, #0] +10001496: 4010 ands r0, r2 +10001498: 9001 str r0, [sp, #4] +1000149a: 4648 mov r0, r9 +1000149c: 4a52 ldr r2, [pc, #328] @ (100015e8 ) +1000149e: 6010 str r0, [r2, #0] +100014a0: f3bf 8f5f dmb sy +100014a4: f3ef 8205 mrs r2, IPSR +100014a8: 4693 mov fp, r2 +100014aa: 2a00 cmp r2, #0 +100014ac: d035 beq.n 1000151a +100014ae: 4293 cmp r3, r2 +100014b0: d001 beq.n 100014b6 +100014b2: f001 fbc1 bl 10002c38 +100014b6: 002a movs r2, r5 +100014b8: 4653 mov r3, sl +100014ba: 439a bics r2, r3 +100014bc: 6890 ldr r0, [r2, #8] +100014be: 4284 cmp r4, r0 +100014c0: d108 bne.n 100014d4 +100014c2: e075 b.n 100015b0 +100014c4: 004b lsls r3, r1, #1 +100014c6: 185b adds r3, r3, r1 +100014c8: 009b lsls r3, r3, #2 +100014ca: 18f3 adds r3, r6, r3 +100014cc: 6898 ldr r0, [r3, #8] +100014ce: 42a0 cmp r0, r4 +100014d0: d034 beq.n 1000153c +100014d2: 001a movs r2, r3 +100014d4: 2106 movs r1, #6 +100014d6: 5651 ldrsb r1, [r2, r1] +100014d8: 2900 cmp r1, #0 +100014da: daf3 bge.n 100014c4 +100014dc: 4284 cmp r4, r0 +100014de: d053 beq.n 10001588 +100014e0: 9b01 ldr r3, [sp, #4] +100014e2: 2b00 cmp r3, #0 +100014e4: d026 beq.n 10001534 +100014e6: 464a mov r2, r9 +100014e8: 4b40 ldr r3, [pc, #256] @ (100015ec ) +100014ea: 601a str r2, [r3, #0] +100014ec: 4b3d ldr r3, [pc, #244] @ (100015e4 ) +100014ee: 601a str r2, [r3, #0] +100014f0: 4b39 ldr r3, [pc, #228] @ (100015d8 ) +100014f2: 689b ldr r3, [r3, #8] +100014f4: 51dd str r5, [r3, r7] +100014f6: f3bf 8f5f dmb sy +100014fa: f3bf 8f5f dmb sy +100014fe: 2200 movs r2, #0 +10001500: 4b34 ldr r3, [pc, #208] @ (100015d4 ) +10001502: 601a str r2, [r3, #0] +10001504: f388 8810 msr PRIMASK, r8 +10001508: b003 add sp, #12 +1000150a: bcf0 pop {r4, r5, r6, r7} +1000150c: 46bb mov fp, r7 +1000150e: 46b2 mov sl, r6 +10001510: 46a9 mov r9, r5 +10001512: 46a0 mov r8, r4 +10001514: bdf0 pop {r4, r5, r6, r7, pc} +10001516: 000d movs r5, r1 +10001518: e7ea b.n 100014f0 +1000151a: 002a movs r2, r5 +1000151c: 4653 mov r3, sl +1000151e: 439a bics r2, r3 +10001520: 6890 ldr r0, [r2, #8] +10001522: 4284 cmp r4, r0 +10001524: d1d6 bne.n 100014d4 +10001526: 2006 movs r0, #6 +10001528: 5610 ldrsb r0, [r2, r0] +1000152a: 0013 movs r3, r2 +1000152c: 2800 cmp r0, #0 +1000152e: da09 bge.n 10001544 +10001530: 000d movs r5, r1 +10001532: e031 b.n 10001598 +10001534: 464a mov r2, r9 +10001536: 4b2c ldr r3, [pc, #176] @ (100015e8 ) +10001538: 601a str r2, [r3, #0] +1000153a: e7d9 b.n 100014f0 +1000153c: 2006 movs r0, #6 +1000153e: 5618 ldrsb r0, [r3, r0] +10001540: 2800 cmp r0, #0 +10001542: db22 blt.n 1000158a +10001544: 0042 lsls r2, r0, #1 +10001546: 1811 adds r1, r2, r0 +10001548: 0089 lsls r1, r1, #2 +1000154a: 1874 adds r4, r6, r1 +1000154c: 468a mov sl, r1 +1000154e: 68a1 ldr r1, [r4, #8] +10001550: 6099 str r1, [r3, #8] +10001552: 79e1 ldrb r1, [r4, #7] +10001554: 71d9 strb r1, [r3, #7] +10001556: 2106 movs r1, #6 +10001558: 5661 ldrsb r1, [r4, r1] +1000155a: 7199 strb r1, [r3, #6] +1000155c: 2900 cmp r1, #0 +1000155e: db25 blt.n 100015ac +10001560: 88a4 ldrh r4, [r4, #4] +10001562: 1af1 subs r1, r6, r3 +10001564: 0564 lsls r4, r4, #21 +10001566: 1524 asrs r4, r4, #20 +10001568: 4454 add r4, sl +1000156a: 1909 adds r1, r1, r4 +1000156c: 24e0 movs r4, #224 @ 0xe0 +1000156e: 0509 lsls r1, r1, #20 +10001570: 0d49 lsrs r1, r1, #21 +10001572: 0224 lsls r4, r4, #8 +10001574: 4321 orrs r1, r4 +10001576: 8099 strh r1, [r3, #4] +10001578: 1813 adds r3, r2, r0 +1000157a: 4a1d ldr r2, [pc, #116] @ (100015f0 ) +1000157c: 009b lsls r3, r3, #2 +1000157e: 7811 ldrb r1, [r2, #0] +10001580: 18f3 adds r3, r6, r3 +10001582: 7199 strb r1, [r3, #6] +10001584: 7010 strb r0, [r2, #0] +10001586: e7ab b.n 100014e0 +10001588: 0013 movs r3, r2 +1000158a: 4659 mov r1, fp +1000158c: 2900 cmp r1, #0 +1000158e: d114 bne.n 100015ba +10001590: 31ff adds r1, #255 @ 0xff +10001592: 7191 strb r1, [r2, #6] +10001594: 4917 ldr r1, [pc, #92] @ (100015f4 ) +10001596: 8091 strh r1, [r2, #4] +10001598: 4915 ldr r1, [pc, #84] @ (100015f0 ) +1000159a: 780a ldrb r2, [r1, #0] +1000159c: 719a strb r2, [r3, #6] +1000159e: 4a16 ldr r2, [pc, #88] @ (100015f8 ) +100015a0: 1b9b subs r3, r3, r6 +100015a2: 415b adcs r3, r3 +100015a4: 435a muls r2, r3 +100015a6: 0d12 lsrs r2, r2, #20 +100015a8: 700a strb r2, [r1, #0] +100015aa: e799 b.n 100014e0 +100015ac: 4913 ldr r1, [pc, #76] @ (100015fc ) +100015ae: e7e2 b.n 10001576 +100015b0: 2006 movs r0, #6 +100015b2: 5610 ldrsb r0, [r2, r0] +100015b4: 0013 movs r3, r2 +100015b6: 2800 cmp r0, #0 +100015b8: dac4 bge.n 10001544 +100015ba: 4a11 ldr r2, [pc, #68] @ (10001600 ) +100015bc: 4911 ldr r1, [pc, #68] @ (10001604 ) +100015be: 1ad2 subs r2, r2, r3 +100015c0: 3a08 subs r2, #8 +100015c2: 0250 lsls r0, r2, #9 +100015c4: 0d40 lsrs r0, r0, #21 +100015c6: 4301 orrs r1, r0 +100015c8: 8099 strh r1, [r3, #4] +100015ca: 490f ldr r1, [pc, #60] @ (10001608 ) +100015cc: 0852 lsrs r2, r2, #1 +100015ce: 430a orrs r2, r1 +100015d0: 80da strh r2, [r3, #6] +100015d2: e785 b.n 100014e0 +100015d4: d0000124 .word 0xd0000124 +100015d8: e000ed00 .word 0xe000ed00 +100015dc: 100001cd .word 0x100001cd +100015e0: 20000eac .word 0x20000eac +100015e4: e000e100 .word 0xe000e100 +100015e8: e000e180 .word 0xe000e180 +100015ec: e000e280 .word 0xe000e280 +100015f0: 20001d65 .word 0x20001d65 +100015f4: ffffbd01 .word 0xffffbd01 +100015f8: 0000aaaa .word 0x0000aaaa +100015fc: 0000bd01 .word 0x0000bd01 +10001600: 20000ee6 .word 0x20000ee6 +10001604: fffff000 .word 0xfffff000 +10001608: fffff800 .word 0xfffff800 + +1000160c : +1000160c: b570 push {r4, r5, r6, lr} +1000160e: f3ef 8105 mrs r1, IPSR +10001612: 2401 movs r4, #1 +10001614: 4304 orrs r4, r0 +10001616: f3ef 8c10 mrs ip, PRIMASK +1000161a: b672 cpsid i +1000161c: 4a21 ldr r2, [pc, #132] @ (100016a4 ) +1000161e: 6813 ldr r3, [r2, #0] +10001620: 2b00 cmp r3, #0 +10001622: d0fc beq.n 1000161e +10001624: f3bf 8f5f dmb sy +10001628: 4b1f ldr r3, [pc, #124] @ (100016a8 ) +1000162a: 0005 movs r5, r0 +1000162c: 4a1f ldr r2, [pc, #124] @ (100016ac ) +1000162e: 1aed subs r5, r5, r3 +10001630: 416d adcs r5, r5 +10001632: 436a muls r2, r5 +10001634: 0d12 lsrs r2, r2, #20 +10001636: 4d1e ldr r5, [pc, #120] @ (100016b0 ) +10001638: 0089 lsls r1, r1, #2 +1000163a: 68ae ldr r6, [r5, #8] +1000163c: b252 sxtb r2, r2 +1000163e: 5876 ldr r6, [r6, r1] +10001640: 42a6 cmp r6, r4 +10001642: d01c beq.n 1000167e +10001644: 2106 movs r1, #6 +10001646: 5659 ldrsb r1, [r3, r1] +10001648: 4291 cmp r1, r2 +1000164a: d01c beq.n 10001686 +1000164c: 2112 movs r1, #18 +1000164e: 5659 ldrsb r1, [r3, r1] +10001650: 4291 cmp r1, r2 +10001652: d022 beq.n 1000169a +10001654: 211e movs r1, #30 +10001656: 5659 ldrsb r1, [r3, r1] +10001658: 4291 cmp r1, r2 +1000165a: d020 beq.n 1000169e +1000165c: 212a movs r1, #42 @ 0x2a +1000165e: 5659 ldrsb r1, [r3, r1] +10001660: 2403 movs r4, #3 +10001662: 4291 cmp r1, r2 +10001664: d010 beq.n 10001688 +10001666: 4b13 ldr r3, [pc, #76] @ (100016b4 ) +10001668: 7819 ldrb r1, [r3, #0] +1000166a: 701a strb r2, [r3, #0] +1000166c: 7181 strb r1, [r0, #6] +1000166e: f3bf 8f5f dmb sy +10001672: 2200 movs r2, #0 +10001674: 4b0b ldr r3, [pc, #44] @ (100016a4 ) +10001676: 601a str r2, [r3, #0] +10001678: f38c 8810 msr PRIMASK, ip +1000167c: bd70 pop {r4, r5, r6, pc} +1000167e: 68ab ldr r3, [r5, #8] +10001680: 4c0d ldr r4, [pc, #52] @ (100016b8 ) +10001682: 505c str r4, [r3, r1] +10001684: e7ef b.n 10001666 +10001686: 2400 movs r4, #0 +10001688: 0061 lsls r1, r4, #1 +1000168a: 1909 adds r1, r1, r4 +1000168c: 0089 lsls r1, r1, #2 +1000168e: 185b adds r3, r3, r1 +10001690: 21ff movs r1, #255 @ 0xff +10001692: 7199 strb r1, [r3, #6] +10001694: 4909 ldr r1, [pc, #36] @ (100016bc ) +10001696: 8099 strh r1, [r3, #4] +10001698: e7e5 b.n 10001666 +1000169a: 2401 movs r4, #1 +1000169c: e7f4 b.n 10001688 +1000169e: 2402 movs r4, #2 +100016a0: e7f2 b.n 10001688 +100016a2: 46c0 nop @ (mov r8, r8) +100016a4: d0000124 .word 0xd0000124 +100016a8: 20000eac .word 0x20000eac +100016ac: 0000aaaa .word 0x0000aaaa +100016b0: e000ed00 .word 0xe000ed00 +100016b4: 20001d65 .word 0x20001d65 +100016b8: 100001cd .word 0x100001cd +100016bc: ffffbd01 .word 0xffffbd01 + +100016c0 : +100016c0: 4b05 ldr r3, [pc, #20] @ (100016d8 ) +100016c2: 4a06 ldr r2, [pc, #24] @ (100016dc ) +100016c4: 6013 str r3, [r2, #0] +100016c6: 4a06 ldr r2, [pc, #24] @ (100016e0 ) +100016c8: 6013 str r3, [r2, #0] +100016ca: 6053 str r3, [r2, #4] +100016cc: 6093 str r3, [r2, #8] +100016ce: 60d3 str r3, [r2, #12] +100016d0: 6113 str r3, [r2, #16] +100016d2: 6153 str r3, [r2, #20] +100016d4: 6193 str r3, [r2, #24] +100016d6: 4770 bx lr +100016d8: 80808080 .word 0x80808080 +100016dc: e000e400 .word 0xe000e400 +100016e0: e000e404 .word 0xe000e404 + +100016e4 : +100016e4: b510 push {r4, lr} +100016e6: 4b08 ldr r3, [pc, #32] @ (10001708 ) +100016e8: 4c08 ldr r4, [pc, #32] @ (1000170c ) +100016ea: b082 sub sp, #8 +100016ec: 0001 movs r1, r0 +100016ee: 9300 str r3, [sp, #0] +100016f0: 2200 movs r2, #0 +100016f2: 2305 movs r3, #5 +100016f4: 0020 movs r0, r4 +100016f6: f7ff fcd1 bl 1000109c +100016fa: 2800 cmp r0, #0 +100016fc: db01 blt.n 10001702 +100016fe: 231f movs r3, #31 +10001700: 1a18 subs r0, r3, r0 +10001702: b002 add sp, #8 +10001704: bd10 pop {r4, pc} +10001706: 46c0 nop @ (mov r8, r8) +10001708: 10007cb4 .word 0x10007cb4 +1000170c: 20001d6a .word 0x20001d6a + +10001710 : +10001710: 4b02 ldr r3, [pc, #8] @ (1000171c ) +10001712: 469c mov ip, r3 +10001714: 4461 add r1, ip +10001716: 0089 lsls r1, r1, #2 +10001718: 6001 str r1, [r0, #0] +1000171a: 4770 bx lr +1000171c: 34000040 .word 0x34000040 + +10001720 : +10001720: b510 push {r4, lr} +10001722: 0004 movs r4, r0 +10001724: f7ff fd16 bl 10001154 +10001728: 0001 movs r1, r0 +1000172a: 0020 movs r0, r4 +1000172c: f7ff fff0 bl 10001710 +10001730: 23ff movs r3, #255 @ 0xff +10001732: 7123 strb r3, [r4, #4] +10001734: f3bf 8f5f dmb sy +10001738: bd10 pop {r4, pc} +1000173a: 46c0 nop @ (mov r8, r8) + +1000173c : +1000173c: b510 push {r4, lr} +1000173e: 0004 movs r4, r0 +10001740: f7ff fd08 bl 10001154 +10001744: 0001 movs r1, r0 +10001746: 0020 movs r0, r4 +10001748: f7ff ffe2 bl 10001710 +1000174c: 23ff movs r3, #255 @ 0xff +1000174e: 80a3 strh r3, [r4, #4] +10001750: f3bf 8f5f dmb sy +10001754: bd10 pop {r4, pc} +10001756: 46c0 nop @ (mov r8, r8) + +10001758 : +10001758: b510 push {r4, lr} +1000175a: 0004 movs r4, r0 +1000175c: 2001 movs r0, #1 +1000175e: f7ff fd05 bl 1000116c +10001762: 4b03 ldr r3, [pc, #12] @ (10001770 ) +10001764: 18c3 adds r3, r0, r3 +10001766: 009b lsls r3, r3, #2 +10001768: 6023 str r3, [r4, #0] +1000176a: f3bf 8f5f dmb sy +1000176e: bd10 pop {r4, pc} +10001770: 34000040 .word 0x34000040 + +10001774 : +10001774: 4b03 ldr r3, [pc, #12] @ (10001784 ) +10001776: 469c mov ip, r3 +10001778: 4461 add r1, ip +1000177a: 0089 lsls r1, r1, #2 +1000177c: 6001 str r1, [r0, #0] +1000177e: f3bf 8f5f dmb sy +10001782: 4770 bx lr +10001784: 34000040 .word 0x34000040 + +10001788 : +10001788: 6883 ldr r3, [r0, #8] +1000178a: 480b ldr r0, [pc, #44] @ (100017b8 ) +1000178c: b510 push {r4, lr} +1000178e: 4684 mov ip, r0 +10001790: 4461 add r1, ip +10001792: 4462 add r2, ip +10001794: 0112 lsls r2, r2, #4 +10001796: 0109 lsls r1, r1, #4 +10001798: 1859 adds r1, r3, r1 +1000179a: 189b adds r3, r3, r2 +1000179c: 685c ldr r4, [r3, #4] +1000179e: 684a ldr r2, [r1, #4] +100017a0: 2001 movs r0, #1 +100017a2: 4294 cmp r4, r2 +100017a4: d801 bhi.n 100017aa +100017a6: d002 beq.n 100017ae +100017a8: 2000 movs r0, #0 +100017aa: b2c0 uxtb r0, r0 +100017ac: bd10 pop {r4, pc} +100017ae: 681a ldr r2, [r3, #0] +100017b0: 680b ldr r3, [r1, #0] +100017b2: 429a cmp r2, r3 +100017b4: d8f9 bhi.n 100017aa +100017b6: e7f7 b.n 100017a8 +100017b8: 0fffffff .word 0x0fffffff + +100017bc : +100017bc: 4b0a ldr r3, [pc, #40] @ (100017e8 ) +100017be: 6819 ldr r1, [r3, #0] +100017c0: f3ef 8010 mrs r0, PRIMASK +100017c4: b672 cpsid i +100017c6: 680a ldr r2, [r1, #0] +100017c8: 2a00 cmp r2, #0 +100017ca: d0fc beq.n 100017c6 +100017cc: f3bf 8f5f dmb sy +100017d0: 681b ldr r3, [r3, #0] +100017d2: f3bf 8f5f dmb sy +100017d6: 2200 movs r2, #0 +100017d8: 601a str r2, [r3, #0] +100017da: f380 8810 msr PRIMASK, r0 +100017de: bf40 sev +100017e0: 2000 movs r0, #0 +100017e2: 2100 movs r1, #0 +100017e4: 4770 bx lr +100017e6: 46c0 nop @ (mov r8, r8) +100017e8: 20001d2c .word 0x20001d2c + +100017ec : +100017ec: b5f8 push {r3, r4, r5, r6, r7, lr} +100017ee: 4657 mov r7, sl +100017f0: 4645 mov r5, r8 +100017f2: 464e mov r6, r9 +100017f4: 46de mov lr, fp +100017f6: b5e0 push {r5, r6, r7, lr} +100017f8: 4698 mov r8, r3 +100017fa: ab0c add r3, sp, #48 @ 0x30 +100017fc: 781c ldrb r4, [r3, #0] +100017fe: ab0d add r3, sp, #52 @ 0x34 +10001800: 781b ldrb r3, [r3, #0] +10001802: 0007 movs r7, r0 +10001804: 4691 mov r9, r2 +10001806: 469a mov sl, r3 +10001808: 6805 ldr r5, [r0, #0] +1000180a: 2c00 cmp r4, #0 +1000180c: d159 bne.n 100018c2 +1000180e: 7bac ldrb r4, [r5, #14] +10001810: 2c00 cmp r4, #0 +10001812: d03b beq.n 1000188c +10001814: 0066 lsls r6, r4, #1 +10001816: 6829 ldr r1, [r5, #0] +10001818: 1936 adds r6, r6, r4 +1000181a: 3e03 subs r6, #3 +1000181c: 1989 adds r1, r1, r6 +1000181e: 784b ldrb r3, [r1, #1] +10001820: 73ab strb r3, [r5, #14] +10001822: 2b00 cmp r3, #0 +10001824: d100 bne.n 10001828 +10001826: 73eb strb r3, [r5, #15] +10001828: 2300 movs r3, #0 +1000182a: 708b strb r3, [r1, #2] +1000182c: 704b strb r3, [r1, #1] +1000182e: 700b strb r3, [r1, #0] +10001830: 4b2d ldr r3, [pc, #180] @ (100018e8 ) +10001832: 18e2 adds r2, r4, r3 +10001834: 68bb ldr r3, [r7, #8] +10001836: 0112 lsls r2, r2, #4 10001838: 189b adds r3, r3, r2 -1000183a: 3b03 subs r3, #3 -1000183c: 5cc2 ldrb r2, [r0, r3] -1000183e: 18c6 adds r6, r0, r3 -10001840: 428a cmp r2, r1 -10001842: d102 bne.n 1000184a -10001844: e01b b.n 1000187e -10001846: 2a00 cmp r2, #0 -10001848: d008 beq.n 1000185c -1000184a: 0053 lsls r3, r2, #1 -1000184c: 189b adds r3, r3, r2 -1000184e: 3b03 subs r3, #3 -10001850: 18c3 adds r3, r0, r3 -10001852: 785a ldrb r2, [r3, #1] -10001854: 428a cmp r2, r1 -10001856: d1f6 bne.n 10001846 -10001858: 7862 ldrb r2, [r4, #1] -1000185a: 705a strb r2, [r3, #1] -1000185c: 2300 movs r3, #0 -1000185e: 2201 movs r2, #1 -10001860: 0028 movs r0, r5 -10001862: 70a3 strb r3, [r4, #2] -10001864: 7063 strb r3, [r4, #1] -10001866: f7ff fed5 bl 10001614 -1000186a: 7b69 ldrb r1, [r5, #13] -1000186c: 0002 movs r2, r0 -1000186e: 0028 movs r0, r5 -10001870: f7ff fe40 bl 100014f4 -10001874: 7368 strb r0, [r5, #13] -10001876: 2001 movs r0, #1 -10001878: e000 b.n 1000187c -1000187a: 2000 movs r0, #0 -1000187c: bd70 pop {r4, r5, r6, pc} -1000187e: 7863 ldrb r3, [r4, #1] -10001880: 7033 strb r3, [r6, #0] -10001882: e7eb b.n 1000185c -10001884: 2201 movs r2, #1 -10001886: 0019 movs r1, r3 -10001888: f7ff fec4 bl 10001614 -1000188c: e7f2 b.n 10001874 -1000188e: 46c0 nop @ (mov r8, r8) - -10001890 : -10001890: b5f8 push {r3, r4, r5, r6, r7, lr} -10001892: 46ce mov lr, r9 -10001894: 4647 mov r7, r8 -10001896: 0004 movs r4, r0 -10001898: b580 push {r7, lr} -1000189a: 2006 movs r0, #6 -1000189c: 000d movs r5, r1 -1000189e: f000 fa21 bl 10001ce4 -100018a2: 1e06 subs r6, r0, #0 -100018a4: d053 beq.n 1000194e -100018a6: 4b53 ldr r3, [pc, #332] @ (100019f4 ) -100018a8: 4953 ldr r1, [pc, #332] @ (100019f8 ) -100018aa: 18e3 adds r3, r4, r3 -100018ac: 1e5a subs r2, r3, #1 -100018ae: 4193 sbcs r3, r2 -100018b0: 2280 movs r2, #128 @ 0x80 -100018b2: 0412 lsls r2, r2, #16 -100018b4: 4694 mov ip, r2 -100018b6: 425b negs r3, r3 -100018b8: 0d9b lsrs r3, r3, #22 -100018ba: 4a50 ldr r2, [pc, #320] @ (100019fc ) -100018bc: 059b lsls r3, r3, #22 -100018be: 4463 add r3, ip -100018c0: 6013 str r3, [r2, #0] -100018c2: 4a4f ldr r2, [pc, #316] @ (10001a00 ) -100018c4: 6013 str r3, [r2, #0] -100018c6: 0018 movs r0, r3 -100018c8: 688a ldr r2, [r1, #8] -100018ca: 4390 bics r0, r2 -100018cc: d1fb bne.n 100018c6 -100018ce: 4b49 ldr r3, [pc, #292] @ (100019f4 ) -100018d0: 4a4c ldr r2, [pc, #304] @ (10001a04 ) -100018d2: 18e3 adds r3, r4, r3 -100018d4: 4259 negs r1, r3 -100018d6: 414b adcs r3, r1 -100018d8: 2180 movs r1, #128 @ 0x80 -100018da: 005b lsls r3, r3, #1 -100018dc: 0049 lsls r1, r1, #1 -100018de: 2006 movs r0, #6 -100018e0: 5299 strh r1, [r3, r2] -100018e2: f000 f9ff bl 10001ce4 -100018e6: 0029 movs r1, r5 -100018e8: 00c0 lsls r0, r0, #3 -100018ea: f001 ff69 bl 100037c0 <__wrap___aeabi_uidiv> -100018ee: 09c3 lsrs r3, r0, #7 -100018f0: d132 bne.n 10001958 -100018f2: 2240 movs r2, #64 @ 0x40 -100018f4: 2101 movs r1, #1 -100018f6: 4690 mov r8, r2 -100018f8: 6261 str r1, [r4, #36] @ 0x24 -100018fa: 62a3 str r3, [r4, #40] @ 0x28 -100018fc: 6b26 ldr r6, [r4, #48] @ 0x30 -100018fe: 07f3 lsls r3, r6, #31 -10001900: d436 bmi.n 10001970 -10001902: 0027 movs r7, r4 -10001904: 2580 movs r5, #128 @ 0x80 -10001906: 6ae3 ldr r3, [r4, #44] @ 0x2c -10001908: 2300 movs r3, #0 -1000190a: 372c adds r7, #44 @ 0x2c -1000190c: 016d lsls r5, r5, #5 -1000190e: 433d orrs r5, r7 -10001910: 602b str r3, [r5, #0] -10001912: 2006 movs r0, #6 -10001914: 6326 str r6, [r4, #48] @ 0x30 -10001916: f000 f9e5 bl 10001ce4 -1000191a: 4641 mov r1, r8 -1000191c: 0080 lsls r0, r0, #2 -1000191e: f001 ff4f bl 100037c0 <__wrap___aeabi_uidiv> -10001922: 6b23 ldr r3, [r4, #48] @ 0x30 -10001924: 0006 movs r6, r0 -10001926: 4698 mov r8, r3 -10001928: 07db lsls r3, r3, #31 -1000192a: d43b bmi.n 100019a4 -1000192c: 2360 movs r3, #96 @ 0x60 -1000192e: 6ae2 ldr r2, [r4, #44] @ 0x2c -10001930: 405a eors r2, r3 -10001932: 330e adds r3, #14 -10001934: 4013 ands r3, r2 -10001936: 602b str r3, [r5, #0] -10001938: 4643 mov r3, r8 -1000193a: 6323 str r3, [r4, #48] @ 0x30 -1000193c: 2380 movs r3, #128 @ 0x80 -1000193e: 2210 movs r2, #16 -10001940: 019b lsls r3, r3, #6 -10001942: 433b orrs r3, r7 -10001944: 601a str r2, [r3, #0] -10001946: 4b30 ldr r3, [pc, #192] @ (10001a08 ) -10001948: 6323 str r3, [r4, #48] @ 0x30 -1000194a: 2303 movs r3, #3 -1000194c: 64a3 str r3, [r4, #72] @ 0x48 -1000194e: 0030 movs r0, r6 -10001950: bcc0 pop {r6, r7} -10001952: 46b9 mov r9, r7 -10001954: 46b0 mov r8, r6 -10001956: bdf8 pop {r3, r4, r5, r6, r7, pc} -10001958: 4a2c ldr r2, [pc, #176] @ (10001a0c ) -1000195a: 4293 cmp r3, r2 -1000195c: d93f bls.n 100019de -1000195e: 2300 movs r3, #0 -10001960: 492b ldr r1, [pc, #172] @ (10001a10 ) -10001962: 4a2c ldr r2, [pc, #176] @ (10001a14 ) -10001964: 6261 str r1, [r4, #36] @ 0x24 -10001966: 62a3 str r3, [r4, #40] @ 0x28 -10001968: 6b26 ldr r6, [r4, #48] @ 0x30 -1000196a: 4690 mov r8, r2 -1000196c: 07f3 lsls r3, r6, #31 -1000196e: d5c8 bpl.n 10001902 -10001970: 0022 movs r2, r4 -10001972: 23c0 movs r3, #192 @ 0xc0 -10001974: 3230 adds r2, #48 @ 0x30 -10001976: 019b lsls r3, r3, #6 -10001978: 4313 orrs r3, r2 -1000197a: 4a23 ldr r2, [pc, #140] @ (10001a08 ) -1000197c: 2006 movs r0, #6 -1000197e: 601a str r2, [r3, #0] -10001980: 6a65 ldr r5, [r4, #36] @ 0x24 -10001982: 6aa3 ldr r3, [r4, #40] @ 0x28 -10001984: 01ad lsls r5, r5, #6 -10001986: 18ed adds r5, r5, r3 -10001988: f000 f9ac bl 10001ce4 -1000198c: 4922 ldr r1, [pc, #136] @ (10001a18 ) -1000198e: f001 ff17 bl 100037c0 <__wrap___aeabi_uidiv> -10001992: 02ad lsls r5, r5, #10 -10001994: 0001 movs r1, r0 -10001996: 0028 movs r0, r5 -10001998: f001 ff12 bl 100037c0 <__wrap___aeabi_uidiv> -1000199c: 2100 movs r1, #0 -1000199e: f7ff fc99 bl 100012d4 -100019a2: e7ae b.n 10001902 -100019a4: 0022 movs r2, r4 -100019a6: 23c0 movs r3, #192 @ 0xc0 -100019a8: 3230 adds r2, #48 @ 0x30 -100019aa: 019b lsls r3, r3, #6 -100019ac: 4313 orrs r3, r2 -100019ae: 4a16 ldr r2, [pc, #88] @ (10001a08 ) -100019b0: 2006 movs r0, #6 -100019b2: 601a str r2, [r3, #0] -100019b4: 6a63 ldr r3, [r4, #36] @ 0x24 -100019b6: 6aa2 ldr r2, [r4, #40] @ 0x28 -100019b8: 019b lsls r3, r3, #6 -100019ba: 4699 mov r9, r3 -100019bc: 4491 add r9, r2 -100019be: f000 f991 bl 10001ce4 -100019c2: 464b mov r3, r9 -100019c4: 4914 ldr r1, [pc, #80] @ (10001a18 ) -100019c6: 029b lsls r3, r3, #10 -100019c8: 4699 mov r9, r3 -100019ca: f001 fef9 bl 100037c0 <__wrap___aeabi_uidiv> -100019ce: 0001 movs r1, r0 -100019d0: 4648 mov r0, r9 -100019d2: f001 fef5 bl 100037c0 <__wrap___aeabi_uidiv> -100019d6: 2100 movs r1, #0 -100019d8: f7ff fc7c bl 100012d4 -100019dc: e7a6 b.n 1000192c -100019de: 227f movs r2, #127 @ 0x7f -100019e0: 0199 lsls r1, r3, #6 -100019e2: 4688 mov r8, r1 -100019e4: 4002 ands r2, r0 -100019e6: 3201 adds r2, #1 -100019e8: 0852 lsrs r2, r2, #1 -100019ea: 0019 movs r1, r3 -100019ec: 4490 add r8, r2 -100019ee: 0013 movs r3, r2 -100019f0: e782 b.n 100018f8 -100019f2: 46c0 nop @ (mov r8, r8) -100019f4: bffc8000 .word 0xbffc8000 -100019f8: 4000c000 .word 0x4000c000 -100019fc: 4000e000 .word 0x4000e000 -10001a00: 4000f000 .word 0x4000f000 -10001a04: 20001c68 .word 0x20001c68 -10001a08: 00000301 .word 0x00000301 -10001a0c: 0000fffe .word 0x0000fffe -10001a10: 0000ffff .word 0x0000ffff -10001a14: 003fffc0 .word 0x003fffc0 -10001a18: 00000e4e .word 0x00000e4e - -10001a1c : -10001a1c: b510 push {r4, lr} -10001a1e: 200c movs r0, #12 -10001a20: b082 sub sp, #8 -10001a22: f000 f9b7 bl 10001d94 -10001a26: f7fe fcd1 bl 100003cc -10001a2a: 2800 cmp r0, #0 -10001a2c: d010 beq.n 10001a50 -10001a2e: 4b8b ldr r3, [pc, #556] @ (10001c5c ) -10001a30: 488b ldr r0, [pc, #556] @ (10001c60 ) -10001a32: 498b ldr r1, [pc, #556] @ (10001c60 ) -10001a34: 4a8b ldr r2, [pc, #556] @ (10001c64 ) -10001a36: 6018 str r0, [r3, #0] -10001a38: 6059 str r1, [r3, #4] -10001a3a: 6098 str r0, [r3, #8] -10001a3c: 60d9 str r1, [r3, #12] -10001a3e: 6118 str r0, [r3, #16] -10001a40: 6159 str r1, [r3, #20] -10001a42: 6198 str r0, [r3, #24] -10001a44: 61d9 str r1, [r3, #28] -10001a46: 6218 str r0, [r3, #32] -10001a48: 6259 str r1, [r3, #36] @ 0x24 -10001a4a: 625a str r2, [r3, #36] @ 0x24 -10001a4c: b002 add sp, #8 -10001a4e: bd10 pop {r4, pc} -10001a50: 4c85 ldr r4, [pc, #532] @ (10001c68 ) -10001a52: 67a0 str r0, [r4, #120] @ 0x78 -10001a54: f000 f9f4 bl 10001e40 -10001a58: 2201 movs r2, #1 -10001a5a: 4b84 ldr r3, [pc, #528] @ (10001c6c ) -10001a5c: 601a str r2, [r3, #0] -10001a5e: 6c63 ldr r3, [r4, #68] @ 0x44 -10001a60: 2b01 cmp r3, #1 -10001a62: d1fc bne.n 10001a5e -10001a64: 2203 movs r2, #3 -10001a66: 4b82 ldr r3, [pc, #520] @ (10001c70 ) -10001a68: 601a str r2, [r3, #0] -10001a6a: 4a7f ldr r2, [pc, #508] @ (10001c68 ) -10001a6c: 6b93 ldr r3, [r2, #56] @ 0x38 -10001a6e: 2b01 cmp r3, #1 -10001a70: d1fc bne.n 10001a6c -10001a72: 3301 adds r3, #1 -10001a74: 2101 movs r1, #1 -10001a76: 4a7f ldr r2, [pc, #508] @ (10001c74 ) -10001a78: 487f ldr r0, [pc, #508] @ (10001c78 ) -10001a7a: 9300 str r3, [sp, #0] -10001a7c: 3304 adds r3, #4 -10001a7e: f000 f937 bl 10001cf0 -10001a82: 2305 movs r3, #5 -10001a84: 4a7d ldr r2, [pc, #500] @ (10001c7c ) -10001a86: 9300 str r3, [sp, #0] -10001a88: 2101 movs r1, #1 -10001a8a: 487d ldr r0, [pc, #500] @ (10001c80 ) -10001a8c: f000 f930 bl 10001cf0 -10001a90: 4b7c ldr r3, [pc, #496] @ (10001c84 ) -10001a92: 685a ldr r2, [r3, #4] -10001a94: 2aff cmp r2, #255 @ 0xff -10001a96: d802 bhi.n 10001a9e -10001a98: 2280 movs r2, #128 @ 0x80 -10001a9a: 0052 lsls r2, r2, #1 -10001a9c: 605a str r2, [r3, #4] -10001a9e: 2280 movs r2, #128 @ 0x80 -10001aa0: 4b73 ldr r3, [pc, #460] @ (10001c70 ) -10001aa2: 4c6e ldr r4, [pc, #440] @ (10001c5c ) -10001aa4: 0112 lsls r2, r2, #4 -10001aa6: 601a str r2, [r3, #0] -10001aa8: 6921 ldr r1, [r4, #16] -10001aaa: 2900 cmp r1, #0 -10001aac: d007 beq.n 10001abe -10001aae: 6960 ldr r0, [r4, #20] -10001ab0: f001 fe86 bl 100037c0 <__wrap___aeabi_uidiv> -10001ab4: 3001 adds r0, #1 -10001ab6: 0043 lsls r3, r0, #1 -10001ab8: 181b adds r3, r3, r0 -10001aba: 3b03 subs r3, #3 -10001abc: d2fd bcs.n 10001aba -10001abe: 22e0 movs r2, #224 @ 0xe0 -10001ac0: 4b70 ldr r3, [pc, #448] @ (10001c84 ) -10001ac2: 4871 ldr r0, [pc, #452] @ (10001c88 ) -10001ac4: 6819 ldr r1, [r3, #0] -10001ac6: 400a ands r2, r1 -10001ac8: 6002 str r2, [r0, #0] -10001aca: 2202 movs r2, #2 -10001acc: 6819 ldr r1, [r3, #0] -10001ace: 4051 eors r1, r2 -10001ad0: 3201 adds r2, #1 -10001ad2: 400a ands r2, r1 -10001ad4: 2104 movs r1, #4 -10001ad6: 6002 str r2, [r0, #0] -10001ad8: 689a ldr r2, [r3, #8] -10001ada: 4211 tst r1, r2 -10001adc: d0fc beq.n 10001ad8 -10001ade: 2180 movs r1, #128 @ 0x80 -10001ae0: 4a6a ldr r2, [pc, #424] @ (10001c8c ) -10001ae2: 0109 lsls r1, r1, #4 -10001ae4: 6011 str r1, [r2, #0] -10001ae6: 2280 movs r2, #128 @ 0x80 -10001ae8: 0052 lsls r2, r2, #1 -10001aea: 605a str r2, [r3, #4] -10001aec: 4b68 ldr r3, [pc, #416] @ (10001c90 ) -10001aee: 6123 str r3, [r4, #16] -10001af0: 4b68 ldr r3, [pc, #416] @ (10001c94 ) -10001af2: 6859 ldr r1, [r3, #4] -10001af4: 29ff cmp r1, #255 @ 0xff -10001af6: d800 bhi.n 10001afa -10001af8: 605a str r2, [r3, #4] -10001afa: 2203 movs r2, #3 -10001afc: 2101 movs r1, #1 -10001afe: 4b5b ldr r3, [pc, #364] @ (10001c6c ) -10001b00: 601a str r2, [r3, #0] -10001b02: 4a64 ldr r2, [pc, #400] @ (10001c94 ) -10001b04: 6893 ldr r3, [r2, #8] -10001b06: 4219 tst r1, r3 -10001b08: d0fc beq.n 10001b04 -10001b0a: 23e0 movs r3, #224 @ 0xe0 -10001b0c: 6810 ldr r0, [r2, #0] -10001b0e: 4003 ands r3, r0 -10001b10: 4861 ldr r0, [pc, #388] @ (10001c98 ) -10001b12: 6003 str r3, [r0, #0] -10001b14: 6812 ldr r2, [r2, #0] -10001b16: 2303 movs r3, #3 -10001b18: 404a eors r2, r1 -10001b1a: 2102 movs r1, #2 -10001b1c: 4013 ands r3, r2 -10001b1e: 4a5d ldr r2, [pc, #372] @ (10001c94 ) -10001b20: 6003 str r3, [r0, #0] -10001b22: 6893 ldr r3, [r2, #8] -10001b24: 4219 tst r1, r3 -10001b26: d0fc beq.n 10001b22 -10001b28: 2180 movs r1, #128 @ 0x80 -10001b2a: 4b5c ldr r3, [pc, #368] @ (10001c9c ) -10001b2c: 0109 lsls r1, r1, #4 -10001b2e: 6019 str r1, [r3, #0] -10001b30: 2180 movs r1, #128 @ 0x80 -10001b32: 4b5b ldr r3, [pc, #364] @ (10001ca0 ) -10001b34: 0049 lsls r1, r1, #1 -10001b36: 6051 str r1, [r2, #4] -10001b38: 6163 str r3, [r4, #20] -10001b3a: 4b5a ldr r3, [pc, #360] @ (10001ca4 ) -10001b3c: 685a ldr r2, [r3, #4] -10001b3e: 2aff cmp r2, #255 @ 0xff -10001b40: d800 bhi.n 10001b44 -10001b42: 6059 str r1, [r3, #4] -10001b44: 2280 movs r2, #128 @ 0x80 -10001b46: 4b58 ldr r3, [pc, #352] @ (10001ca8 ) -10001b48: 0112 lsls r2, r2, #4 -10001b4a: 601a str r2, [r3, #0] -10001b4c: 69e1 ldr r1, [r4, #28] -10001b4e: 2900 cmp r1, #0 -10001b50: d007 beq.n 10001b62 -10001b52: 6960 ldr r0, [r4, #20] -10001b54: f001 fe34 bl 100037c0 <__wrap___aeabi_uidiv> -10001b58: 3001 adds r0, #1 -10001b5a: 0043 lsls r3, r0, #1 -10001b5c: 181b adds r3, r3, r0 -10001b5e: 3b03 subs r3, #3 -10001b60: d2fd bcs.n 10001b5e -10001b62: 23e0 movs r3, #224 @ 0xe0 -10001b64: 4a4f ldr r2, [pc, #316] @ (10001ca4 ) -10001b66: 6811 ldr r1, [r2, #0] -10001b68: 400b ands r3, r1 -10001b6a: 4950 ldr r1, [pc, #320] @ (10001cac ) -10001b6c: 600b str r3, [r1, #0] -10001b6e: 2180 movs r1, #128 @ 0x80 -10001b70: 4b4f ldr r3, [pc, #316] @ (10001cb0 ) -10001b72: 0109 lsls r1, r1, #4 -10001b74: 6019 str r1, [r3, #0] -10001b76: 2180 movs r1, #128 @ 0x80 -10001b78: 4b39 ldr r3, [pc, #228] @ (10001c60 ) -10001b7a: 0049 lsls r1, r1, #1 -10001b7c: 6051 str r1, [r2, #4] -10001b7e: 61e3 str r3, [r4, #28] -10001b80: 4b4c ldr r3, [pc, #304] @ (10001cb4 ) -10001b82: 685a ldr r2, [r3, #4] -10001b84: 2aff cmp r2, #255 @ 0xff -10001b86: d800 bhi.n 10001b8a -10001b88: 6059 str r1, [r3, #4] -10001b8a: 2280 movs r2, #128 @ 0x80 -10001b8c: 4b4a ldr r3, [pc, #296] @ (10001cb8 ) -10001b8e: 0112 lsls r2, r2, #4 -10001b90: 601a str r2, [r3, #0] -10001b92: 6a21 ldr r1, [r4, #32] -10001b94: 2900 cmp r1, #0 -10001b96: d007 beq.n 10001ba8 -10001b98: 6960 ldr r0, [r4, #20] -10001b9a: f001 fe11 bl 100037c0 <__wrap___aeabi_uidiv> -10001b9e: 3001 adds r0, #1 -10001ba0: 0043 lsls r3, r0, #1 -10001ba2: 181b adds r3, r3, r0 -10001ba4: 3b03 subs r3, #3 -10001ba6: d2fd bcs.n 10001ba4 -10001ba8: 23e0 movs r3, #224 @ 0xe0 -10001baa: 4a42 ldr r2, [pc, #264] @ (10001cb4 ) -10001bac: 6811 ldr r1, [r2, #0] -10001bae: 400b ands r3, r1 -10001bb0: 4942 ldr r1, [pc, #264] @ (10001cbc ) -10001bb2: 600b str r3, [r1, #0] -10001bb4: 2180 movs r1, #128 @ 0x80 -10001bb6: 4b42 ldr r3, [pc, #264] @ (10001cc0 ) -10001bb8: 0109 lsls r1, r1, #4 -10001bba: 6019 str r1, [r3, #0] -10001bbc: 2380 movs r3, #128 @ 0x80 -10001bbe: 005b lsls r3, r3, #1 -10001bc0: 6053 str r3, [r2, #4] -10001bc2: 2280 movs r2, #128 @ 0x80 -10001bc4: 4b26 ldr r3, [pc, #152] @ (10001c60 ) -10001bc6: 02d2 lsls r2, r2, #11 -10001bc8: 6223 str r3, [r4, #32] -10001bca: 4b3e ldr r3, [pc, #248] @ (10001cc4 ) -10001bcc: 6859 ldr r1, [r3, #4] -10001bce: 4291 cmp r1, r2 -10001bd0: d200 bcs.n 10001bd4 -10001bd2: 605a str r2, [r3, #4] -10001bd4: 2280 movs r2, #128 @ 0x80 -10001bd6: 4b3c ldr r3, [pc, #240] @ (10001cc8 ) -10001bd8: 0112 lsls r2, r2, #4 -10001bda: 601a str r2, [r3, #0] -10001bdc: 6a61 ldr r1, [r4, #36] @ 0x24 -10001bde: 2900 cmp r1, #0 -10001be0: d007 beq.n 10001bf2 -10001be2: 6960 ldr r0, [r4, #20] -10001be4: f001 fdec bl 100037c0 <__wrap___aeabi_uidiv> -10001be8: 3001 adds r0, #1 -10001bea: 0043 lsls r3, r0, #1 -10001bec: 181b adds r3, r3, r0 -10001bee: 3b03 subs r3, #3 -10001bf0: d2fd bcs.n 10001bee -10001bf2: 23e0 movs r3, #224 @ 0xe0 -10001bf4: 4a33 ldr r2, [pc, #204] @ (10001cc4 ) -10001bf6: 6811 ldr r1, [r2, #0] -10001bf8: 400b ands r3, r1 -10001bfa: 4934 ldr r1, [pc, #208] @ (10001ccc ) -10001bfc: 600b str r3, [r1, #0] -10001bfe: 2180 movs r1, #128 @ 0x80 -10001c00: 4b33 ldr r3, [pc, #204] @ (10001cd0 ) -10001c02: 0109 lsls r1, r1, #4 -10001c04: 6019 str r1, [r3, #0] -10001c06: 2380 movs r3, #128 @ 0x80 -10001c08: 02db lsls r3, r3, #11 -10001c0a: 6053 str r3, [r2, #4] -10001c0c: 4b15 ldr r3, [pc, #84] @ (10001c64 ) -10001c0e: 6263 str r3, [r4, #36] @ 0x24 -10001c10: 4b30 ldr r3, [pc, #192] @ (10001cd4 ) -10001c12: 685a ldr r2, [r3, #4] -10001c14: 2aff cmp r2, #255 @ 0xff -10001c16: d802 bhi.n 10001c1e -10001c18: 2280 movs r2, #128 @ 0x80 -10001c1a: 0052 lsls r2, r2, #1 -10001c1c: 605a str r2, [r3, #4] -10001c1e: 2280 movs r2, #128 @ 0x80 -10001c20: 4b2d ldr r3, [pc, #180] @ (10001cd8 ) -10001c22: 0112 lsls r2, r2, #4 -10001c24: 601a str r2, [r3, #0] -10001c26: 69a1 ldr r1, [r4, #24] -10001c28: 2900 cmp r1, #0 -10001c2a: d007 beq.n 10001c3c -10001c2c: 6960 ldr r0, [r4, #20] -10001c2e: f001 fdc7 bl 100037c0 <__wrap___aeabi_uidiv> -10001c32: 3001 adds r0, #1 -10001c34: 0043 lsls r3, r0, #1 -10001c36: 181b adds r3, r3, r0 -10001c38: 3b03 subs r3, #3 -10001c3a: d2fd bcs.n 10001c38 -10001c3c: 23e0 movs r3, #224 @ 0xe0 -10001c3e: 4a25 ldr r2, [pc, #148] @ (10001cd4 ) -10001c40: 6811 ldr r1, [r2, #0] -10001c42: 400b ands r3, r1 -10001c44: 4925 ldr r1, [pc, #148] @ (10001cdc ) -10001c46: 600b str r3, [r1, #0] -10001c48: 2180 movs r1, #128 @ 0x80 -10001c4a: 4b25 ldr r3, [pc, #148] @ (10001ce0 ) -10001c4c: 0109 lsls r1, r1, #4 -10001c4e: 6019 str r1, [r3, #0] -10001c50: 2380 movs r3, #128 @ 0x80 -10001c52: 005b lsls r3, r3, #1 -10001c54: 6053 str r3, [r2, #4] -10001c56: 4b12 ldr r3, [pc, #72] @ (10001ca0 ) -10001c58: 61a3 str r3, [r4, #24] -10001c5a: e6f7 b.n 10001a4c -10001c5c: 20000ef8 .word 0x20000ef8 -10001c60: 02dc6c00 .word 0x02dc6c00 -10001c64: 0000b71b .word 0x0000b71b -10001c68: 40008000 .word 0x40008000 -10001c6c: 4000b03c .word 0x4000b03c -10001c70: 4000b030 .word 0x4000b030 -10001c74: 59682f00 .word 0x59682f00 -10001c78: 40028000 .word 0x40028000 -10001c7c: 47868c00 .word 0x47868c00 -10001c80: 4002c000 .word 0x4002c000 -10001c84: 40008030 .word 0x40008030 -10001c88: 40009030 .word 0x40009030 -10001c8c: 4000a030 .word 0x4000a030 -10001c90: 00b71b00 .word 0x00b71b00 -10001c94: 4000803c .word 0x4000803c -10001c98: 4000903c .word 0x4000903c -10001c9c: 4000a03c .word 0x4000a03c -10001ca0: 07735940 .word 0x07735940 -10001ca4: 40008054 .word 0x40008054 -10001ca8: 4000b054 .word 0x4000b054 -10001cac: 40009054 .word 0x40009054 -10001cb0: 4000a054 .word 0x4000a054 -10001cb4: 40008060 .word 0x40008060 -10001cb8: 4000b060 .word 0x4000b060 -10001cbc: 40009060 .word 0x40009060 -10001cc0: 4000a060 .word 0x4000a060 -10001cc4: 4000806c .word 0x4000806c -10001cc8: 4000b06c .word 0x4000b06c -10001ccc: 4000906c .word 0x4000906c -10001cd0: 4000a06c .word 0x4000a06c -10001cd4: 40008048 .word 0x40008048 -10001cd8: 4000b048 .word 0x4000b048 -10001cdc: 40009048 .word 0x40009048 -10001ce0: 4000a048 .word 0x4000a048 - -10001ce4 : -10001ce4: 4b01 ldr r3, [pc, #4] @ (10001cec ) -10001ce6: 0080 lsls r0, r0, #2 -10001ce8: 58c0 ldr r0, [r0, r3] -10001cea: 4770 bx lr -10001cec: 20000ef8 .word 0x20000ef8 - -10001cf0 : -10001cf0: b5f8 push {r3, r4, r5, r6, r7, lr} -10001cf2: 0004 movs r4, r0 -10001cf4: 4822 ldr r0, [pc, #136] @ (10001d80 ) -10001cf6: 001e movs r6, r3 -10001cf8: 0017 movs r7, r2 -10001cfa: 000d movs r5, r1 -10001cfc: f001 fd60 bl 100037c0 <__wrap___aeabi_uidiv> -10001d00: 0001 movs r1, r0 -10001d02: 0038 movs r0, r7 -10001d04: f001 fd5c bl 100037c0 <__wrap___aeabi_uidiv> -10001d08: 9b06 ldr r3, [sp, #24] -10001d0a: 0436 lsls r6, r6, #16 -10001d0c: 031b lsls r3, r3, #12 -10001d0e: 431e orrs r6, r3 -10001d10: 6823 ldr r3, [r4, #0] -10001d12: 2b00 cmp r3, #0 -10001d14: db22 blt.n 10001d5c -10001d16: 4b1b ldr r3, [pc, #108] @ (10001d84 ) -10001d18: 491b ldr r1, [pc, #108] @ (10001d88 ) -10001d1a: 18e3 adds r3, r4, r3 -10001d1c: 1e5a subs r2, r3, #1 -10001d1e: 4193 sbcs r3, r2 -10001d20: 2280 movs r2, #128 @ 0x80 -10001d22: 0192 lsls r2, r2, #6 -10001d24: 4694 mov ip, r2 -10001d26: 425b negs r3, r3 -10001d28: 0b1b lsrs r3, r3, #12 -10001d2a: 4a18 ldr r2, [pc, #96] @ (10001d8c ) -10001d2c: 031b lsls r3, r3, #12 -10001d2e: 4463 add r3, ip -10001d30: 6013 str r3, [r2, #0] -10001d32: 4a17 ldr r2, [pc, #92] @ (10001d90 ) -10001d34: 6013 str r3, [r2, #0] -10001d36: 001f movs r7, r3 -10001d38: 688a ldr r2, [r1, #8] -10001d3a: 4397 bics r7, r2 -10001d3c: d1fb bne.n 10001d36 -10001d3e: 22c0 movs r2, #192 @ 0xc0 -10001d40: 1d23 adds r3, r4, #4 -10001d42: 0192 lsls r2, r2, #6 -10001d44: 431a orrs r2, r3 -10001d46: 2321 movs r3, #33 @ 0x21 -10001d48: 6025 str r5, [r4, #0] -10001d4a: 60a0 str r0, [r4, #8] -10001d4c: 6013 str r3, [r2, #0] -10001d4e: 6823 ldr r3, [r4, #0] -10001d50: 2b00 cmp r3, #0 -10001d52: dafc bge.n 10001d4e -10001d54: 2308 movs r3, #8 -10001d56: 60e6 str r6, [r4, #12] -10001d58: 6013 str r3, [r2, #0] -10001d5a: bdf8 pop {r3, r4, r5, r6, r7, pc} -10001d5c: 233f movs r3, #63 @ 0x3f -10001d5e: 6822 ldr r2, [r4, #0] -10001d60: 4013 ands r3, r2 -10001d62: 42ab cmp r3, r5 -10001d64: d1d7 bne.n 10001d16 -10001d66: 68a3 ldr r3, [r4, #8] -10001d68: 051b lsls r3, r3, #20 -10001d6a: 0d1b lsrs r3, r3, #20 -10001d6c: 4283 cmp r3, r0 -10001d6e: d1d2 bne.n 10001d16 -10001d70: 22ee movs r2, #238 @ 0xee -10001d72: 68e3 ldr r3, [r4, #12] -10001d74: 02d2 lsls r2, r2, #11 -10001d76: 4013 ands r3, r2 -10001d78: 42b3 cmp r3, r6 -10001d7a: d1cc bne.n 10001d16 -10001d7c: e7ed b.n 10001d5a -10001d7e: 46c0 nop @ (mov r8, r8) -10001d80: 00b71b00 .word 0x00b71b00 -10001d84: bffd4000 .word 0xbffd4000 -10001d88: 4000c000 .word 0x4000c000 -10001d8c: 4000e000 .word 0x4000e000 -10001d90: 4000f000 .word 0x4000f000 - -10001d94 : -10001d94: 2380 movs r3, #128 @ 0x80 -10001d96: 4a02 ldr r2, [pc, #8] @ (10001da0 ) -10001d98: 009b lsls r3, r3, #2 -10001d9a: 4303 orrs r3, r0 -10001d9c: 62d3 str r3, [r2, #44] @ 0x2c -10001d9e: 4770 bx lr -10001da0: 40058000 .word 0x40058000 - -10001da4 : -10001da4: b510 push {r4, lr} -10001da6: 2480 movs r4, #128 @ 0x80 -10001da8: 4b1c ldr r3, [pc, #112] @ (10001e1c ) -10001daa: 05e4 lsls r4, r4, #23 -10001dac: 601c str r4, [r3, #0] -10001dae: 2800 cmp r0, #0 -10001db0: d01a beq.n 10001de8 -10001db2: 2301 movs r3, #1 -10001db4: 4c1a ldr r4, [pc, #104] @ (10001e20 ) -10001db6: 4318 orrs r0, r3 -10001db8: 4b1a ldr r3, [pc, #104] @ (10001e24 ) -10001dba: 61dc str r4, [r3, #28] -10001dbc: 4c1a ldr r4, [pc, #104] @ (10001e28 ) -10001dbe: 4044 eors r4, r0 -10001dc0: 621c str r4, [r3, #32] -10001dc2: 6259 str r1, [r3, #36] @ 0x24 -10001dc4: 6298 str r0, [r3, #40] @ 0x28 -10001dc6: 2180 movs r1, #128 @ 0x80 -10001dc8: 4b14 ldr r3, [pc, #80] @ (10001e1c ) -10001dca: 05c9 lsls r1, r1, #23 -10001dcc: 6019 str r1, [r3, #0] -10001dce: 4817 ldr r0, [pc, #92] @ (10001e2c ) -10001dd0: 4917 ldr r1, [pc, #92] @ (10001e30 ) -10001dd2: 6008 str r0, [r1, #0] -10001dd4: 21e0 movs r1, #224 @ 0xe0 -10001dd6: 04c9 lsls r1, r1, #19 -10001dd8: 6019 str r1, [r3, #0] -10001dda: 2a00 cmp r2, #0 -10001ddc: d107 bne.n 10001dee -10001dde: 2280 movs r2, #128 @ 0x80 -10001de0: 4b14 ldr r3, [pc, #80] @ (10001e34 ) -10001de2: 0612 lsls r2, r2, #24 -10001de4: 601a str r2, [r3, #0] -10001de6: bd10 pop {r4, pc} -10001de8: 4b0e ldr r3, [pc, #56] @ (10001e24 ) -10001dea: 61d8 str r0, [r3, #28] -10001dec: e7eb b.n 10001dc6 -10001dee: 0153 lsls r3, r2, #5 -10001df0: 1a9b subs r3, r3, r2 -10001df2: 009b lsls r3, r3, #2 -10001df4: 189a adds r2, r3, r2 -10001df6: 2380 movs r3, #128 @ 0x80 -10001df8: 0112 lsls r2, r2, #4 -10001dfa: 045b lsls r3, r3, #17 -10001dfc: 429a cmp r2, r3 -10001dfe: d209 bcs.n 10001e14 -10001e00: 0013 movs r3, r2 -10001e02: 490d ldr r1, [pc, #52] @ (10001e38 ) -10001e04: 600b str r3, [r1, #0] -10001e06: 4b07 ldr r3, [pc, #28] @ (10001e24 ) -10001e08: 605a str r2, [r3, #4] -10001e0a: 2280 movs r2, #128 @ 0x80 -10001e0c: 4b09 ldr r3, [pc, #36] @ (10001e34 ) -10001e0e: 05d2 lsls r2, r2, #23 -10001e10: 601a str r2, [r3, #0] -10001e12: e7e8 b.n 10001de6 -10001e14: 4b09 ldr r3, [pc, #36] @ (10001e3c ) -10001e16: 001a movs r2, r3 -10001e18: e7f3 b.n 10001e02 -10001e1a: 46c0 nop @ (mov r8, r8) -10001e1c: 4005b000 .word 0x4005b000 -10001e20: b007c0d3 .word 0xb007c0d3 -10001e24: 40058000 .word 0x40058000 -10001e28: 4ff83f2d .word 0x4ff83f2d -10001e2c: 0001fffc .word 0x0001fffc -10001e30: 40012008 .word 0x40012008 -10001e34: 4005a000 .word 0x4005a000 -10001e38: 20001c08 .word 0x20001c08 -10001e3c: 00ffffff .word 0x00ffffff - -10001e40 : -10001e40: 23aa movs r3, #170 @ 0xaa -10001e42: 4a06 ldr r2, [pc, #24] @ (10001e5c ) -10001e44: 011b lsls r3, r3, #4 -10001e46: 6013 str r3, [r2, #0] -10001e48: 232f movs r3, #47 @ 0x2f -10001e4a: 4905 ldr r1, [pc, #20] @ (10001e60 ) -10001e4c: 60d3 str r3, [r2, #12] -10001e4e: 4b05 ldr r3, [pc, #20] @ (10001e64 ) -10001e50: 6019 str r1, [r3, #0] -10001e52: 6853 ldr r3, [r2, #4] -10001e54: 2b00 cmp r3, #0 -10001e56: dafc bge.n 10001e52 -10001e58: 4770 bx lr -10001e5a: 46c0 nop @ (mov r8, r8) -10001e5c: 40024000 .word 0x40024000 -10001e60: 00fab000 .word 0x00fab000 -10001e64: 40026000 .word 0x40026000 - -10001e68 : -10001e68: 4b2c ldr r3, [pc, #176] @ (10001f1c ) -10001e6a: 4a2d ldr r2, [pc, #180] @ (10001f20 ) -10001e6c: b570 push {r4, r5, r6, lr} -10001e6e: 601a str r2, [r3, #0] -10001e70: 4a2c ldr r2, [pc, #176] @ (10001f24 ) -10001e72: 4b2d ldr r3, [pc, #180] @ (10001f28 ) -10001e74: 492d ldr r1, [pc, #180] @ (10001f2c ) -10001e76: 601a str r2, [r3, #0] -10001e78: 0014 movs r4, r2 -10001e7a: 688b ldr r3, [r1, #8] -10001e7c: 439c bics r4, r3 -10001e7e: d1fb bne.n 10001e78 -10001e80: 4d2b ldr r5, [pc, #172] @ (10001f30 ) -10001e82: 4e2c ldr r6, [pc, #176] @ (10001f34 ) -10001e84: 42b5 cmp r5, r6 -10001e86: d208 bcs.n 10001e9a -10001e88: 3e01 subs r6, #1 -10001e8a: 1b76 subs r6, r6, r5 -10001e8c: 08b6 lsrs r6, r6, #2 -10001e8e: cd08 ldmia r5!, {r3} -10001e90: 4798 blx r3 -10001e92: 0023 movs r3, r4 -10001e94: 3401 adds r4, #1 -10001e96: 42b3 cmp r3, r6 -10001e98: d1f9 bne.n 10001e8e -10001e9a: f7ff fdbf bl 10001a1c -10001e9e: 4a26 ldr r2, [pc, #152] @ (10001f38 ) -10001ea0: 4b21 ldr r3, [pc, #132] @ (10001f28 ) -10001ea2: 601a str r2, [r3, #0] -10001ea4: 4a21 ldr r2, [pc, #132] @ (10001f2c ) -10001ea6: 6893 ldr r3, [r2, #8] -10001ea8: 43db mvns r3, r3 -10001eaa: 01db lsls r3, r3, #7 -10001eac: 09dd lsrs r5, r3, #7 -10001eae: 2b00 cmp r3, #0 -10001eb0: d1f9 bne.n 10001ea6 -10001eb2: 2240 movs r2, #64 @ 0x40 -10001eb4: 4b21 ldr r3, [pc, #132] @ (10001f3c ) -10001eb6: 4c22 ldr r4, [pc, #136] @ (10001f40 ) -10001eb8: 4e22 ldr r6, [pc, #136] @ (10001f44 ) -10001eba: 679a str r2, [r3, #120] @ 0x78 -10001ebc: 675a str r2, [r3, #116] @ 0x74 -10001ebe: 671a str r2, [r3, #112] @ 0x70 -10001ec0: 66da str r2, [r3, #108] @ 0x6c -10001ec2: 42b4 cmp r4, r6 -10001ec4: d208 bcs.n 10001ed8 -10001ec6: 6823 ldr r3, [r4, #0] -10001ec8: 0020 movs r0, r4 -10001eca: 2b00 cmp r3, #0 -10001ecc: d020 beq.n 10001f10 -10001ece: 3408 adds r4, #8 -10001ed0: f7fe fdf6 bl 10000ac0 -10001ed4: 42b4 cmp r4, r6 -10001ed6: d3f6 bcc.n 10001ec6 -10001ed8: 4c1b ldr r4, [pc, #108] @ (10001f48 ) -10001eda: 4e1c ldr r6, [pc, #112] @ (10001f4c ) -10001edc: 22c0 movs r2, #192 @ 0xc0 -10001ede: 68b1 ldr r1, [r6, #8] -10001ee0: 0020 movs r0, r4 -10001ee2: f002 faf5 bl 100044d0 <__wrap___aeabi_memcpy> -10001ee6: 60b4 str r4, [r6, #8] -10001ee8: f7fe fae8 bl 100004bc -10001eec: f7fe fdaa bl 10000a44 -10001ef0: f7fe ff9e bl 10000e30 -10001ef4: 4c16 ldr r4, [pc, #88] @ (10001f50 ) -10001ef6: 4e17 ldr r6, [pc, #92] @ (10001f54 ) -10001ef8: 42b4 cmp r4, r6 -10001efa: d208 bcs.n 10001f0e -10001efc: 3e01 subs r6, #1 -10001efe: 1b36 subs r6, r6, r4 -10001f00: 08b6 lsrs r6, r6, #2 -10001f02: cc08 ldmia r4!, {r3} -10001f04: 4798 blx r3 -10001f06: 002b movs r3, r5 -10001f08: 3501 adds r5, #1 -10001f0a: 429e cmp r6, r3 -10001f0c: d1f9 bne.n 10001f02 -10001f0e: bd70 pop {r4, r5, r6, pc} -10001f10: 3408 adds r4, #8 -10001f12: f7fe fdc7 bl 10000aa4 -10001f16: 42b4 cmp r4, r6 -10001f18: d3d5 bcc.n 10001ec6 -10001f1a: e7dd b.n 10001ed8 -10001f1c: 4000e000 .word 0x4000e000 -10001f20: fefbcdbf .word 0xfefbcdbf -10001f24: 003c7ffe .word 0x003c7ffe -10001f28: 4000f000 .word 0x4000f000 -10001f2c: 4000c000 .word 0x4000c000 -10001f30: 20000ee0 .word 0x20000ee0 -10001f34: 20000ef0 .word 0x20000ef0 -10001f38: 01ffffff .word 0x01ffffff -10001f3c: 4001f000 .word 0x4001f000 -10001f40: 20000ed8 .word 0x20000ed8 -10001f44: 20000ee0 .word 0x20000ee0 -10001f48: 20000000 .word 0x20000000 -10001f4c: e000ed00 .word 0xe000ed00 -10001f50: 20000ef0 .word 0x20000ef0 -10001f54: 20000ef8 .word 0x20000ef8 - -10001f58 <_exit>: -10001f58: be00 bkpt 0x0000 -10001f5a: e7fd b.n 10001f58 <_exit> - -10001f5c : -10001f5c: b510 push {r4, lr} -10001f5e: f7ff fffb bl 10001f58 <_exit> -10001f62: 46c0 nop @ (mov r8, r8) - -10001f64 : -10001f64: b40f push {r0, r1, r2, r3} -10001f66: b500 push {lr} -10001f68: 4808 ldr r0, [pc, #32] @ (10001f8c ) -10001f6a: b083 sub sp, #12 -10001f6c: f002 fb7e bl 1000466c <__wrap_puts> -10001f70: 9b04 ldr r3, [sp, #16] -10001f72: 2b00 cmp r3, #0 -10001f74: d007 beq.n 10001f86 -10001f76: a905 add r1, sp, #20 -10001f78: 0018 movs r0, r3 -10001f7a: 9101 str r1, [sp, #4] -10001f7c: f001 fba6 bl 100036cc -10001f80: 4803 ldr r0, [pc, #12] @ (10001f90 ) -10001f82: f002 fb73 bl 1000466c <__wrap_puts> -10001f86: 2001 movs r0, #1 -10001f88: f7ff ffe6 bl 10001f58 <_exit> -10001f8c: 10006e9c .word 0x10006e9c -10001f90: 10006eac .word 0x10006eac - -10001f94 : -10001f94: b510 push {r4, lr} -10001f96: 4801 ldr r0, [pc, #4] @ (10001f9c ) -10001f98: f7ff ffe4 bl 10001f64 -10001f9c: 10006eb0 .word 0x10006eb0 - -10001fa0 <_out_null>: -10001fa0: 4770 bx lr -10001fa2: 46c0 nop @ (mov r8, r8) - -10001fa4 <_out_rev>: -10001fa4: b5f8 push {r3, r4, r5, r6, r7, lr} -10001fa6: 4657 mov r7, sl -10001fa8: 46de mov lr, fp -10001faa: 464e mov r6, r9 -10001fac: 4645 mov r5, r8 -10001fae: b5e0 push {r5, r6, r7, lr} -10001fb0: 4699 mov r9, r3 -10001fb2: 9b0a ldr r3, [sp, #40] @ 0x28 -10001fb4: 0007 movs r7, r0 -10001fb6: 469a mov sl, r3 -10001fb8: 9b0d ldr r3, [sp, #52] @ 0x34 -10001fba: 4688 mov r8, r1 -10001fbc: 4693 mov fp, r2 -10001fbe: 9c0b ldr r4, [sp, #44] @ 0x2c -10001fc0: 079b lsls r3, r3, #30 -10001fc2: d13b bne.n 1000203c <_out_rev+0x98> -10001fc4: 9b0c ldr r3, [sp, #48] @ 0x30 -10001fc6: 429c cmp r4, r3 -10001fc8: d23d bcs.n 10002046 <_out_rev+0xa2> -10001fca: 1b1e subs r6, r3, r4 -10001fcc: 940b str r4, [sp, #44] @ 0x2c -10001fce: 0015 movs r5, r2 -10001fd0: 000c movs r4, r1 -10001fd2: 445e add r6, fp -10001fd4: 002a movs r2, r5 -10001fd6: 464b mov r3, r9 -10001fd8: 3501 adds r5, #1 -10001fda: 0021 movs r1, r4 -10001fdc: 2020 movs r0, #32 -10001fde: 47b8 blx r7 -10001fe0: 42b5 cmp r5, r6 -10001fe2: d1f7 bne.n 10001fd4 <_out_rev+0x30> -10001fe4: 46a0 mov r8, r4 -10001fe6: 9c0b ldr r4, [sp, #44] @ 0x2c -10001fe8: 2c00 cmp r4, #0 -10001fea: d020 beq.n 1000202e <_out_rev+0x8a> -10001fec: 4645 mov r5, r8 -10001fee: 1936 adds r6, r6, r4 -10001ff0: 4653 mov r3, sl -10001ff2: 1b32 subs r2, r6, r4 -10001ff4: 3c01 subs r4, #1 -10001ff6: 5d18 ldrb r0, [r3, r4] -10001ff8: 0029 movs r1, r5 -10001ffa: 464b mov r3, r9 -10001ffc: 47b8 blx r7 -10001ffe: 2c00 cmp r4, #0 -10002000: d1f6 bne.n 10001ff0 <_out_rev+0x4c> -10002002: 002b movs r3, r5 -10002004: 0035 movs r5, r6 -10002006: 4698 mov r8, r3 -10002008: 9b0d ldr r3, [sp, #52] @ 0x34 -1000200a: 079b lsls r3, r3, #30 -1000200c: d50f bpl.n 1000202e <_out_rev+0x8a> -1000200e: 465b mov r3, fp -10002010: 1aec subs r4, r5, r3 -10002012: 9b0c ldr r3, [sp, #48] @ 0x30 -10002014: 42a3 cmp r3, r4 -10002016: d90a bls.n 1000202e <_out_rev+0x8a> -10002018: 4646 mov r6, r8 -1000201a: 4698 mov r8, r3 -1000201c: 002a movs r2, r5 -1000201e: 464b mov r3, r9 -10002020: 0031 movs r1, r6 -10002022: 2020 movs r0, #32 -10002024: 3401 adds r4, #1 -10002026: 47b8 blx r7 -10002028: 3501 adds r5, #1 -1000202a: 4544 cmp r4, r8 -1000202c: d3f6 bcc.n 1000201c <_out_rev+0x78> -1000202e: 0028 movs r0, r5 -10002030: bcf0 pop {r4, r5, r6, r7} -10002032: 46bb mov fp, r7 -10002034: 46b2 mov sl, r6 -10002036: 46a9 mov r9, r5 -10002038: 46a0 mov r8, r4 -1000203a: bdf8 pop {r3, r4, r5, r6, r7, pc} -1000203c: 0016 movs r6, r2 -1000203e: 0015 movs r5, r2 -10002040: 2c00 cmp r4, #0 -10002042: d1d3 bne.n 10001fec <_out_rev+0x48> -10002044: e7e0 b.n 10002008 <_out_rev+0x64> -10002046: 0016 movs r6, r2 -10002048: 2c00 cmp r4, #0 -1000204a: d1cf bne.n 10001fec <_out_rev+0x48> -1000204c: 0015 movs r5, r2 -1000204e: e7ee b.n 1000202e <_out_rev+0x8a> - -10002050 <_ntoa_format>: -10002050: b5f0 push {r4, r5, r6, r7, lr} -10002052: 464f mov r7, r9 -10002054: 4646 mov r6, r8 -10002056: 46d6 mov lr, sl -10002058: b5c0 push {r6, r7, lr} -1000205a: b084 sub sp, #16 -1000205c: 4698 mov r8, r3 -1000205e: ab0e add r3, sp, #56 @ 0x38 -10002060: 781b ldrb r3, [r3, #0] -10002062: 4694 mov ip, r2 -10002064: 4699 mov r9, r3 -10002066: 9b12 ldr r3, [sp, #72] @ 0x48 -10002068: 9c0d ldr r4, [sp, #52] @ 0x34 -1000206a: 9f10 ldr r7, [sp, #64] @ 0x40 -1000206c: 9e11 ldr r6, [sp, #68] @ 0x44 -1000206e: 079a lsls r2, r3, #30 -10002070: d425 bmi.n 100020be <_ntoa_format+0x6e> -10002072: 2e00 cmp r6, #0 -10002074: d165 bne.n 10002142 <_ntoa_format+0xf2> -10002076: 42bc cmp r4, r7 -10002078: d221 bcs.n 100020be <_ntoa_format+0x6e> -1000207a: 2201 movs r2, #1 -1000207c: 401a ands r2, r3 -1000207e: 4692 mov sl, r2 -10002080: 2c20 cmp r4, #32 -10002082: d100 bne.n 10002086 <_ntoa_format+0x36> -10002084: e0e9 b.n 1000225a <_ntoa_format+0x20a> -10002086: 9a0c ldr r2, [sp, #48] @ 0x30 -10002088: 1e55 subs r5, r2, #1 -1000208a: 2230 movs r2, #48 @ 0x30 -1000208c: e002 b.n 10002094 <_ntoa_format+0x44> -1000208e: 2c20 cmp r4, #32 -10002090: d100 bne.n 10002094 <_ntoa_format+0x44> -10002092: e07b b.n 1000218c <_ntoa_format+0x13c> -10002094: 3401 adds r4, #1 -10002096: 552a strb r2, [r5, r4] -10002098: 42a7 cmp r7, r4 -1000209a: d8f8 bhi.n 1000208e <_ntoa_format+0x3e> -1000209c: 4652 mov r2, sl -1000209e: 2a00 cmp r2, #0 -100020a0: d00d beq.n 100020be <_ntoa_format+0x6e> -100020a2: 42b4 cmp r4, r6 -100020a4: d20b bcs.n 100020be <_ntoa_format+0x6e> -100020a6: 9a0c ldr r2, [sp, #48] @ 0x30 -100020a8: 1e55 subs r5, r2, #1 -100020aa: 2230 movs r2, #48 @ 0x30 -100020ac: 2c20 cmp r4, #32 -100020ae: d102 bne.n 100020b6 <_ntoa_format+0x66> -100020b0: e071 b.n 10002196 <_ntoa_format+0x146> -100020b2: 2c20 cmp r4, #32 -100020b4: d02d beq.n 10002112 <_ntoa_format+0xc2> -100020b6: 3401 adds r4, #1 -100020b8: 552a strb r2, [r5, r4] -100020ba: 42b4 cmp r4, r6 -100020bc: d1f9 bne.n 100020b2 <_ntoa_format+0x62> -100020be: 06da lsls r2, r3, #27 -100020c0: d53c bpl.n 1000213c <_ntoa_format+0xec> -100020c2: 055a lsls r2, r3, #21 -100020c4: d42e bmi.n 10002124 <_ntoa_format+0xd4> -100020c6: 2c00 cmp r4, #0 -100020c8: d128 bne.n 1000211c <_ntoa_format+0xcc> -100020ca: 9a0f ldr r2, [sp, #60] @ 0x3c -100020cc: 2a10 cmp r2, #16 -100020ce: d100 bne.n 100020d2 <_ntoa_format+0x82> -100020d0: e0b6 b.n 10002240 <_ntoa_format+0x1f0> -100020d2: 2a02 cmp r2, #2 -100020d4: d100 bne.n 100020d8 <_ntoa_format+0x88> -100020d6: e0bc b.n 10002252 <_ntoa_format+0x202> -100020d8: 2230 movs r2, #48 @ 0x30 -100020da: 9c0c ldr r4, [sp, #48] @ 0x30 -100020dc: 7022 strb r2, [r4, #0] -100020de: 2401 movs r4, #1 -100020e0: 464a mov r2, r9 -100020e2: 2a00 cmp r2, #0 -100020e4: d165 bne.n 100021b2 <_ntoa_format+0x162> -100020e6: 075a lsls r2, r3, #29 -100020e8: d400 bmi.n 100020ec <_ntoa_format+0x9c> -100020ea: e099 b.n 10002220 <_ntoa_format+0x1d0> -100020ec: 222b movs r2, #43 @ 0x2b -100020ee: 9d0c ldr r5, [sp, #48] @ 0x30 -100020f0: 552a strb r2, [r5, r4] -100020f2: 3401 adds r4, #1 -100020f4: 9303 str r3, [sp, #12] -100020f6: 9b0c ldr r3, [sp, #48] @ 0x30 -100020f8: 4662 mov r2, ip -100020fa: 9300 str r3, [sp, #0] -100020fc: 9602 str r6, [sp, #8] -100020fe: 4643 mov r3, r8 -10002100: 9401 str r4, [sp, #4] -10002102: f7ff ff4f bl 10001fa4 <_out_rev> -10002106: b004 add sp, #16 -10002108: bce0 pop {r5, r6, r7} -1000210a: 46ba mov sl, r7 -1000210c: 46b1 mov r9, r6 -1000210e: 46a8 mov r8, r5 -10002110: bdf0 pop {r4, r5, r6, r7, pc} -10002112: 2420 movs r4, #32 -10002114: 06da lsls r2, r3, #27 -10002116: d5ed bpl.n 100020f4 <_ntoa_format+0xa4> -10002118: 055a lsls r2, r3, #21 -1000211a: d403 bmi.n 10002124 <_ntoa_format+0xd4> -1000211c: 42a7 cmp r7, r4 -1000211e: d066 beq.n 100021ee <_ntoa_format+0x19e> -10002120: 42b4 cmp r4, r6 -10002122: d064 beq.n 100021ee <_ntoa_format+0x19e> -10002124: 9a0f ldr r2, [sp, #60] @ 0x3c -10002126: 2a10 cmp r2, #16 -10002128: d071 beq.n 1000220e <_ntoa_format+0x1be> -1000212a: 2a02 cmp r2, #2 -1000212c: d057 beq.n 100021de <_ntoa_format+0x18e> -1000212e: 2c20 cmp r4, #32 -10002130: d0e0 beq.n 100020f4 <_ntoa_format+0xa4> -10002132: 0022 movs r2, r4 -10002134: 3401 adds r4, #1 -10002136: 2530 movs r5, #48 @ 0x30 -10002138: 9f0c ldr r7, [sp, #48] @ 0x30 -1000213a: 54bd strb r5, [r7, r2] -1000213c: 2c20 cmp r4, #32 -1000213e: d0d9 beq.n 100020f4 <_ntoa_format+0xa4> -10002140: e7ce b.n 100020e0 <_ntoa_format+0x90> -10002142: 2201 movs r2, #1 -10002144: 0015 movs r5, r2 -10002146: 401d ands r5, r3 -10002148: 46aa mov sl, r5 -1000214a: 421a tst r2, r3 -1000214c: d036 beq.n 100021bc <_ntoa_format+0x16c> -1000214e: 464a mov r2, r9 -10002150: 2a00 cmp r2, #0 -10002152: d14a bne.n 100021ea <_ntoa_format+0x19a> -10002154: 320c adds r2, #12 -10002156: 421a tst r2, r3 -10002158: d147 bne.n 100021ea <_ntoa_format+0x19a> -1000215a: 42bc cmp r4, r7 -1000215c: d2a1 bcs.n 100020a2 <_ntoa_format+0x52> -1000215e: 2c20 cmp r4, #32 -10002160: d191 bne.n 10002086 <_ntoa_format+0x36> -10002162: 2e20 cmp r6, #32 -10002164: d817 bhi.n 10002196 <_ntoa_format+0x146> -10002166: 2420 movs r4, #32 -10002168: 06da lsls r2, r3, #27 -1000216a: d5c3 bpl.n 100020f4 <_ntoa_format+0xa4> -1000216c: 055a lsls r2, r3, #21 -1000216e: d41b bmi.n 100021a8 <_ntoa_format+0x158> -10002170: 2f20 cmp r7, #32 -10002172: d001 beq.n 10002178 <_ntoa_format+0x128> -10002174: 2e20 cmp r6, #32 -10002176: d1d5 bne.n 10002124 <_ntoa_format+0xd4> -10002178: 221f movs r2, #31 -1000217a: 9d0f ldr r5, [sp, #60] @ 0x3c -1000217c: 2d10 cmp r5, #16 -1000217e: d06f beq.n 10002260 <_ntoa_format+0x210> -10002180: 2d02 cmp r5, #2 -10002182: d1d8 bne.n 10002136 <_ntoa_format+0xe6> -10002184: 2562 movs r5, #98 @ 0x62 -10002186: 9f0c ldr r7, [sp, #48] @ 0x30 -10002188: 54bd strb r5, [r7, r2] -1000218a: e7d0 b.n 1000212e <_ntoa_format+0xde> -1000218c: 4652 mov r2, sl -1000218e: 2a00 cmp r2, #0 -10002190: d079 beq.n 10002286 <_ntoa_format+0x236> -10002192: 2e20 cmp r6, #32 -10002194: d9bd bls.n 10002112 <_ntoa_format+0xc2> -10002196: 2420 movs r4, #32 -10002198: 06da lsls r2, r3, #27 -1000219a: d5ab bpl.n 100020f4 <_ntoa_format+0xa4> -1000219c: 055a lsls r2, r3, #21 -1000219e: d403 bmi.n 100021a8 <_ntoa_format+0x158> -100021a0: 2f20 cmp r7, #32 -100021a2: d0e9 beq.n 10002178 <_ntoa_format+0x128> -100021a4: 2e20 cmp r6, #32 -100021a6: d0e7 beq.n 10002178 <_ntoa_format+0x128> -100021a8: 9a0f ldr r2, [sp, #60] @ 0x3c -100021aa: 2a10 cmp r2, #16 -100021ac: d1a2 bne.n 100020f4 <_ntoa_format+0xa4> -100021ae: 2420 movs r4, #32 -100021b0: e7a0 b.n 100020f4 <_ntoa_format+0xa4> -100021b2: 222d movs r2, #45 @ 0x2d -100021b4: 9d0c ldr r5, [sp, #48] @ 0x30 -100021b6: 552a strb r2, [r5, r4] -100021b8: 3401 adds r4, #1 -100021ba: e79b b.n 100020f4 <_ntoa_format+0xa4> -100021bc: 42bc cmp r4, r7 -100021be: d300 bcc.n 100021c2 <_ntoa_format+0x172> -100021c0: e77d b.n 100020be <_ntoa_format+0x6e> -100021c2: 2c20 cmp r4, #32 -100021c4: d000 beq.n 100021c8 <_ntoa_format+0x178> -100021c6: e75e b.n 10002086 <_ntoa_format+0x36> -100021c8: 06da lsls r2, r3, #27 -100021ca: d5f0 bpl.n 100021ae <_ntoa_format+0x15e> -100021cc: 055a lsls r2, r3, #21 -100021ce: d4ee bmi.n 100021ae <_ntoa_format+0x15e> -100021d0: 2f20 cmp r7, #32 -100021d2: d062 beq.n 1000229a <_ntoa_format+0x24a> -100021d4: 2e20 cmp r6, #32 -100021d6: d1ea bne.n 100021ae <_ntoa_format+0x15e> -100021d8: 0034 movs r4, r6 -100021da: 221f movs r2, #31 -100021dc: e7cd b.n 1000217a <_ntoa_format+0x12a> -100021de: 2c20 cmp r4, #32 -100021e0: d100 bne.n 100021e4 <_ntoa_format+0x194> -100021e2: e787 b.n 100020f4 <_ntoa_format+0xa4> -100021e4: 0022 movs r2, r4 -100021e6: 3401 adds r4, #1 -100021e8: e7cc b.n 10002184 <_ntoa_format+0x134> -100021ea: 3e01 subs r6, #1 -100021ec: e7b5 b.n 1000215a <_ntoa_format+0x10a> -100021ee: 1e62 subs r2, r4, #1 -100021f0: 2c01 cmp r4, #1 -100021f2: d1c2 bne.n 1000217a <_ntoa_format+0x12a> -100021f4: 9a0f ldr r2, [sp, #60] @ 0x3c -100021f6: 2a10 cmp r2, #16 -100021f8: d000 beq.n 100021fc <_ntoa_format+0x1ac> -100021fa: e76a b.n 100020d2 <_ntoa_format+0x82> -100021fc: 069a lsls r2, r3, #26 -100021fe: d53b bpl.n 10002278 <_ntoa_format+0x228> -10002200: 2258 movs r2, #88 @ 0x58 -10002202: 9c0c ldr r4, [sp, #48] @ 0x30 -10002204: 7022 strb r2, [r4, #0] -10002206: 3a28 subs r2, #40 @ 0x28 -10002208: 7062 strb r2, [r4, #1] -1000220a: 2402 movs r4, #2 -1000220c: e768 b.n 100020e0 <_ntoa_format+0x90> -1000220e: 069a lsls r2, r3, #26 -10002210: d40e bmi.n 10002230 <_ntoa_format+0x1e0> -10002212: 2c20 cmp r4, #32 -10002214: d0cb beq.n 100021ae <_ntoa_format+0x15e> -10002216: 2278 movs r2, #120 @ 0x78 -10002218: 9d0c ldr r5, [sp, #48] @ 0x30 -1000221a: 552a strb r2, [r5, r4] -1000221c: 3401 adds r4, #1 -1000221e: e786 b.n 1000212e <_ntoa_format+0xde> -10002220: 071a lsls r2, r3, #28 -10002222: d400 bmi.n 10002226 <_ntoa_format+0x1d6> -10002224: e766 b.n 100020f4 <_ntoa_format+0xa4> -10002226: 2220 movs r2, #32 -10002228: 9d0c ldr r5, [sp, #48] @ 0x30 -1000222a: 552a strb r2, [r5, r4] -1000222c: 3401 adds r4, #1 -1000222e: e761 b.n 100020f4 <_ntoa_format+0xa4> -10002230: 2c20 cmp r4, #32 -10002232: d0bc beq.n 100021ae <_ntoa_format+0x15e> -10002234: 2558 movs r5, #88 @ 0x58 -10002236: 9a0c ldr r2, [sp, #48] @ 0x30 -10002238: 1912 adds r2, r2, r4 -1000223a: 7015 strb r5, [r2, #0] -1000223c: 3401 adds r4, #1 -1000223e: e776 b.n 1000212e <_ntoa_format+0xde> -10002240: 069a lsls r2, r3, #26 -10002242: d508 bpl.n 10002256 <_ntoa_format+0x206> -10002244: 2258 movs r2, #88 @ 0x58 -10002246: 9c0c ldr r4, [sp, #48] @ 0x30 -10002248: 7022 strb r2, [r4, #0] -1000224a: 2230 movs r2, #48 @ 0x30 -1000224c: 7062 strb r2, [r4, #1] -1000224e: 2402 movs r4, #2 -10002250: e746 b.n 100020e0 <_ntoa_format+0x90> -10002252: 3260 adds r2, #96 @ 0x60 -10002254: e7f7 b.n 10002246 <_ntoa_format+0x1f6> -10002256: 2278 movs r2, #120 @ 0x78 -10002258: e7f5 b.n 10002246 <_ntoa_format+0x1f6> -1000225a: 2a00 cmp r2, #0 -1000225c: d183 bne.n 10002166 <_ntoa_format+0x116> -1000225e: e7b3 b.n 100021c8 <_ntoa_format+0x178> -10002260: 1ea2 subs r2, r4, #2 -10002262: 3c01 subs r4, #1 -10002264: 069d lsls r5, r3, #26 -10002266: d403 bmi.n 10002270 <_ntoa_format+0x220> -10002268: 2578 movs r5, #120 @ 0x78 -1000226a: 9f0c ldr r7, [sp, #48] @ 0x30 -1000226c: 54bd strb r5, [r7, r2] -1000226e: e760 b.n 10002132 <_ntoa_format+0xe2> -10002270: 2558 movs r5, #88 @ 0x58 -10002272: 9f0c ldr r7, [sp, #48] @ 0x30 -10002274: 54bd strb r5, [r7, r2] -10002276: e75c b.n 10002132 <_ntoa_format+0xe2> -10002278: 2278 movs r2, #120 @ 0x78 -1000227a: 9c0c ldr r4, [sp, #48] @ 0x30 -1000227c: 7022 strb r2, [r4, #0] -1000227e: 3a48 subs r2, #72 @ 0x48 -10002280: 7062 strb r2, [r4, #1] -10002282: 2402 movs r4, #2 -10002284: e72c b.n 100020e0 <_ntoa_format+0x90> -10002286: 06da lsls r2, r3, #27 -10002288: d400 bmi.n 1000228c <_ntoa_format+0x23c> -1000228a: e733 b.n 100020f4 <_ntoa_format+0xa4> -1000228c: 055a lsls r2, r3, #21 -1000228e: d48b bmi.n 100021a8 <_ntoa_format+0x158> -10002290: 2f20 cmp r7, #32 -10002292: d000 beq.n 10002296 <_ntoa_format+0x246> -10002294: e744 b.n 10002120 <_ntoa_format+0xd0> -10002296: 221f movs r2, #31 -10002298: e76f b.n 1000217a <_ntoa_format+0x12a> -1000229a: 003c movs r4, r7 -1000229c: 221f movs r2, #31 -1000229e: e76c b.n 1000217a <_ntoa_format+0x12a> - -100022a0 <_out_char>: -100022a0: b510 push {r4, lr} -100022a2: 2800 cmp r0, #0 -100022a4: d100 bne.n 100022a8 <_out_char+0x8> -100022a6: bd10 pop {r4, pc} -100022a8: f002 f994 bl 100045d4 <__wrap_putchar> -100022ac: e7fb b.n 100022a6 <_out_char+0x6> -100022ae: 46c0 nop @ (mov r8, r8) - -100022b0 <_out_fct>: -100022b0: 000b movs r3, r1 -100022b2: b510 push {r4, lr} -100022b4: 2800 cmp r0, #0 -100022b6: d002 beq.n 100022be <_out_fct+0xe> -100022b8: 6849 ldr r1, [r1, #4] -100022ba: 681b ldr r3, [r3, #0] -100022bc: 4798 blx r3 -100022be: bd10 pop {r4, pc} - -100022c0 <_etoa>: -100022c0: b5f0 push {r4, r5, r6, r7, lr} -100022c2: 4657 mov r7, sl -100022c4: 464e mov r6, r9 -100022c6: 4645 mov r5, r8 -100022c8: 46de mov lr, fp -100022ca: b5e0 push {r5, r6, r7, lr} -100022cc: b099 sub sp, #100 @ 0x64 -100022ce: 4682 mov sl, r0 -100022d0: 4689 mov r9, r1 -100022d2: 4690 mov r8, r2 -100022d4: 9308 str r3, [sp, #32] -100022d6: 9a22 ldr r2, [sp, #136] @ 0x88 -100022d8: 9b23 ldr r3, [sp, #140] @ 0x8c -100022da: 0010 movs r0, r2 -100022dc: 0019 movs r1, r3 -100022de: f001 fd30 bl 10003d42 <__wrap___aeabi_dcmpun> -100022e2: 2800 cmp r0, #0 -100022e4: d000 beq.n 100022e8 <_etoa+0x28> -100022e6: e0cd b.n 10002484 <_etoa+0x1c4> -100022e8: 9822 ldr r0, [sp, #136] @ 0x88 -100022ea: 9923 ldr r1, [sp, #140] @ 0x8c -100022ec: 2201 movs r2, #1 -100022ee: 4bd9 ldr r3, [pc, #868] @ (10002654 <_etoa+0x394>) -100022f0: 4252 negs r2, r2 -100022f2: f001 fd21 bl 10003d38 <__wrap___aeabi_dcmpgt> -100022f6: 2800 cmp r0, #0 -100022f8: d000 beq.n 100022fc <_etoa+0x3c> -100022fa: e0c3 b.n 10002484 <_etoa+0x1c4> -100022fc: 9822 ldr r0, [sp, #136] @ 0x88 -100022fe: 9923 ldr r1, [sp, #140] @ 0x8c -10002300: 2201 movs r2, #1 -10002302: 4bd5 ldr r3, [pc, #852] @ (10002658 <_etoa+0x398>) -10002304: 4252 negs r2, r2 -10002306: f001 fd09 bl 10003d1c <__wrap___aeabi_dcmplt> -1000230a: 2800 cmp r0, #0 -1000230c: d000 beq.n 10002310 <_etoa+0x50> -1000230e: e0b9 b.n 10002484 <_etoa+0x1c4> -10002310: 9822 ldr r0, [sp, #136] @ 0x88 -10002312: 9923 ldr r1, [sp, #140] @ 0x8c -10002314: 2200 movs r2, #0 -10002316: 2300 movs r3, #0 -10002318: f001 fd00 bl 10003d1c <__wrap___aeabi_dcmplt> -1000231c: 2800 cmp r0, #0 -1000231e: d000 beq.n 10002322 <_etoa+0x62> -10002320: e1f1 b.n 10002706 <_etoa+0x446> -10002322: 9e22 ldr r6, [sp, #136] @ 0x88 -10002324: 9f23 ldr r7, [sp, #140] @ 0x8c -10002326: 2380 movs r3, #128 @ 0x80 -10002328: 9a26 ldr r2, [sp, #152] @ 0x98 -1000232a: 00db lsls r3, r3, #3 -1000232c: 401a ands r2, r3 -1000232e: 920d str r2, [sp, #52] @ 0x34 -10002330: 9a26 ldr r2, [sp, #152] @ 0x98 -10002332: 421a tst r2, r3 -10002334: d101 bne.n 1000233a <_etoa+0x7a> -10002336: 2306 movs r3, #6 -10002338: 9324 str r3, [sp, #144] @ 0x90 -1000233a: 2380 movs r3, #128 @ 0x80 -1000233c: 9a26 ldr r2, [sp, #152] @ 0x98 -1000233e: 011b lsls r3, r3, #4 -10002340: 401a ands r2, r3 -10002342: 003b movs r3, r7 -10002344: 4693 mov fp, r2 -10002346: 9609 str r6, [sp, #36] @ 0x24 -10002348: 4333 orrs r3, r6 -1000234a: d000 beq.n 1000234e <_etoa+0x8e> -1000234c: e0b3 b.n 100024b6 <_etoa+0x1f6> -1000234e: 2a00 cmp r2, #0 -10002350: d000 beq.n 10002354 <_etoa+0x94> -10002352: e1c2 b.n 100026da <_etoa+0x41a> -10002354: 2300 movs r3, #0 -10002356: 2400 movs r4, #0 -10002358: 930a str r3, [sp, #40] @ 0x28 -1000235a: 940b str r4, [sp, #44] @ 0x2c -1000235c: 2300 movs r3, #0 -1000235e: 2504 movs r5, #4 -10002360: 9309 str r3, [sp, #36] @ 0x24 -10002362: 9b25 ldr r3, [sp, #148] @ 0x94 -10002364: 2400 movs r4, #0 -10002366: 42ab cmp r3, r5 -10002368: d900 bls.n 1000236c <_etoa+0xac> -1000236a: 1b5c subs r4, r3, r5 -1000236c: 2302 movs r3, #2 -1000236e: 9a26 ldr r2, [sp, #152] @ 0x98 -10002370: 401a ands r2, r3 -10002372: 920c str r2, [sp, #48] @ 0x30 -10002374: 9a26 ldr r2, [sp, #152] @ 0x98 -10002376: 4213 tst r3, r2 -10002378: d003 beq.n 10002382 <_etoa+0xc2> -1000237a: 426b negs r3, r5 -1000237c: 416b adcs r3, r5 -1000237e: 425b negs r3, r3 -10002380: 401c ands r4, r3 -10002382: 9b09 ldr r3, [sp, #36] @ 0x24 -10002384: 2b00 cmp r3, #0 -10002386: d007 beq.n 10002398 <_etoa+0xd8> -10002388: 9a0a ldr r2, [sp, #40] @ 0x28 -1000238a: 9b0b ldr r3, [sp, #44] @ 0x2c -1000238c: 0030 movs r0, r6 -1000238e: 0039 movs r1, r7 -10002390: f001 fc63 bl 10003c5a <__wrap___aeabi_ddiv> -10002394: 0006 movs r6, r0 -10002396: 000f movs r7, r1 -10002398: 9822 ldr r0, [sp, #136] @ 0x88 -1000239a: 9923 ldr r1, [sp, #140] @ 0x8c -1000239c: 2200 movs r2, #0 -1000239e: 2300 movs r3, #0 -100023a0: f001 fcbc bl 10003d1c <__wrap___aeabi_dcmplt> -100023a4: 2800 cmp r0, #0 -100023a6: d003 beq.n 100023b0 <_etoa+0xf0> -100023a8: 2180 movs r1, #128 @ 0x80 -100023aa: 0609 lsls r1, r1, #24 -100023ac: 187b adds r3, r7, r1 -100023ae: 001f movs r7, r3 -100023b0: 9a26 ldr r2, [sp, #152] @ 0x98 -100023b2: 4baa ldr r3, [pc, #680] @ (1000265c <_etoa+0x39c>) -100023b4: 9600 str r6, [sp, #0] -100023b6: 9701 str r7, [sp, #4] -100023b8: 4013 ands r3, r2 -100023ba: 9e08 ldr r6, [sp, #32] -100023bc: 9304 str r3, [sp, #16] -100023be: 9b24 ldr r3, [sp, #144] @ 0x90 -100023c0: 9403 str r4, [sp, #12] -100023c2: 9302 str r3, [sp, #8] -100023c4: 4642 mov r2, r8 -100023c6: 0033 movs r3, r6 -100023c8: 4649 mov r1, r9 -100023ca: 4650 mov r0, sl -100023cc: f000 f9aa bl 10002724 <_ftoa> -100023d0: 0004 movs r4, r0 -100023d2: 2d00 cmp r5, #0 -100023d4: d067 beq.n 100024a6 <_etoa+0x1e6> -100023d6: 2020 movs r0, #32 -100023d8: 9a26 ldr r2, [sp, #152] @ 0x98 -100023da: 4649 mov r1, r9 -100023dc: 4002 ands r2, r0 -100023de: 0013 movs r3, r2 -100023e0: 425a negs r2, r3 -100023e2: 4153 adcs r3, r2 -100023e4: 425b negs r3, r3 -100023e6: 1c62 adds r2, r4, #1 -100023e8: 4018 ands r0, r3 -100023ea: 920a str r2, [sp, #40] @ 0x28 -100023ec: 0033 movs r3, r6 -100023ee: 0022 movs r2, r4 -100023f0: 3045 adds r0, #69 @ 0x45 -100023f2: 47d0 blx sl -100023f4: 9a09 ldr r2, [sp, #36] @ 0x24 -100023f6: 1e6f subs r7, r5, #1 -100023f8: 17d3 asrs r3, r2, #31 -100023fa: 18d4 adds r4, r2, r3 -100023fc: 405c eors r4, r3 -100023fe: 0fd3 lsrs r3, r2, #31 -10002400: 469b mov fp, r3 -10002402: 2500 movs r5, #0 -10002404: e001 b.n 1000240a <_etoa+0x14a> -10002406: 2d20 cmp r5, #32 -10002408: d013 beq.n 10002432 <_etoa+0x172> -1000240a: aa08 add r2, sp, #32 -1000240c: 4694 mov ip, r2 -1000240e: 231f movs r3, #31 -10002410: 0020 movs r0, r4 -10002412: 4463 add r3, ip -10002414: 210a movs r1, #10 -10002416: 3501 adds r5, #1 -10002418: 195e adds r6, r3, r5 -1000241a: f001 f9d1 bl 100037c0 <__wrap___aeabi_uidiv> -1000241e: 3130 adds r1, #48 @ 0x30 -10002420: 7031 strb r1, [r6, #0] -10002422: 0020 movs r0, r4 -10002424: 210a movs r1, #10 -10002426: f001 f9cb bl 100037c0 <__wrap___aeabi_uidiv> -1000242a: 0026 movs r6, r4 -1000242c: 0004 movs r4, r0 -1000242e: 2e09 cmp r6, #9 -10002430: d8e9 bhi.n 10002406 <_etoa+0x146> -10002432: 2305 movs r3, #5 -10002434: 9306 str r3, [sp, #24] -10002436: 2300 movs r3, #0 -10002438: 9304 str r3, [sp, #16] -1000243a: 330a adds r3, #10 -1000243c: 9303 str r3, [sp, #12] -1000243e: 465b mov r3, fp -10002440: 9e08 ldr r6, [sp, #32] -10002442: 9302 str r3, [sp, #8] -10002444: ab10 add r3, sp, #64 @ 0x40 -10002446: 9a0a ldr r2, [sp, #40] @ 0x28 -10002448: 9300 str r3, [sp, #0] -1000244a: 4649 mov r1, r9 -1000244c: 0033 movs r3, r6 -1000244e: 4650 mov r0, sl -10002450: 9705 str r7, [sp, #20] -10002452: 9501 str r5, [sp, #4] -10002454: f7ff fdfc bl 10002050 <_ntoa_format> -10002458: 9a0c ldr r2, [sp, #48] @ 0x30 -1000245a: 0004 movs r4, r0 -1000245c: 2a00 cmp r2, #0 -1000245e: d022 beq.n 100024a6 <_etoa+0x1e6> -10002460: 4642 mov r2, r8 -10002462: 1a85 subs r5, r0, r2 -10002464: 9a25 ldr r2, [sp, #148] @ 0x94 -10002466: 42aa cmp r2, r5 -10002468: d91d bls.n 100024a6 <_etoa+0x1e6> -1000246a: 46b0 mov r8, r6 -1000246c: 4657 mov r7, sl -1000246e: 0016 movs r6, r2 -10002470: 0022 movs r2, r4 -10002472: 4643 mov r3, r8 -10002474: 4649 mov r1, r9 -10002476: 2020 movs r0, #32 -10002478: 3501 adds r5, #1 -1000247a: 47b8 blx r7 -1000247c: 3401 adds r4, #1 -1000247e: 42ae cmp r6, r5 -10002480: d8f6 bhi.n 10002470 <_etoa+0x1b0> -10002482: e010 b.n 100024a6 <_etoa+0x1e6> -10002484: 9b26 ldr r3, [sp, #152] @ 0x98 -10002486: 4642 mov r2, r8 -10002488: 9304 str r3, [sp, #16] -1000248a: 9b25 ldr r3, [sp, #148] @ 0x94 -1000248c: 4649 mov r1, r9 -1000248e: 9303 str r3, [sp, #12] -10002490: 9b24 ldr r3, [sp, #144] @ 0x90 -10002492: 4650 mov r0, sl -10002494: 9302 str r3, [sp, #8] -10002496: 9b22 ldr r3, [sp, #136] @ 0x88 -10002498: 9c23 ldr r4, [sp, #140] @ 0x8c -1000249a: 9300 str r3, [sp, #0] -1000249c: 9401 str r4, [sp, #4] -1000249e: 9b08 ldr r3, [sp, #32] -100024a0: f000 f940 bl 10002724 <_ftoa> -100024a4: 0004 movs r4, r0 -100024a6: 0020 movs r0, r4 -100024a8: b019 add sp, #100 @ 0x64 -100024aa: bcf0 pop {r4, r5, r6, r7} -100024ac: 46bb mov fp, r7 -100024ae: 46b2 mov sl, r6 -100024b0: 46a9 mov r9, r5 -100024b2: 46a0 mov r8, r4 -100024b4: bdf0 pop {r4, r5, r6, r7, pc} -100024b6: 4b6a ldr r3, [pc, #424] @ (10002660 <_etoa+0x3a0>) -100024b8: 0078 lsls r0, r7, #1 -100024ba: 469c mov ip, r3 -100024bc: 0d40 lsrs r0, r0, #21 -100024be: 4460 add r0, ip -100024c0: f001 fc52 bl 10003d68 <__wrap___aeabi_i2d> -100024c4: 4a67 ldr r2, [pc, #412] @ (10002664 <_etoa+0x3a4>) -100024c6: 4b68 ldr r3, [pc, #416] @ (10002668 <_etoa+0x3a8>) -100024c8: f001 fbe5 bl 10003c96 <__wrap___aeabi_dmul> -100024cc: 4a67 ldr r2, [pc, #412] @ (1000266c <_etoa+0x3ac>) -100024ce: 4b68 ldr r3, [pc, #416] @ (10002670 <_etoa+0x3b0>) -100024d0: f001 fbba bl 10003c48 <__wrap___aeabi_dadd> -100024d4: 4a67 ldr r2, [pc, #412] @ (10002674 <_etoa+0x3b4>) -100024d6: 033b lsls r3, r7, #12 -100024d8: 0b1b lsrs r3, r3, #12 -100024da: 431a orrs r2, r3 -100024dc: 0004 movs r4, r0 -100024de: 000d movs r5, r1 -100024e0: 9809 ldr r0, [sp, #36] @ 0x24 -100024e2: 0011 movs r1, r2 -100024e4: 4b64 ldr r3, [pc, #400] @ (10002678 <_etoa+0x3b8>) -100024e6: 2200 movs r2, #0 -100024e8: f001 fba5 bl 10003c36 <__wrap___aeabi_dsub> -100024ec: 4a63 ldr r2, [pc, #396] @ (1000267c <_etoa+0x3bc>) -100024ee: 4b64 ldr r3, [pc, #400] @ (10002680 <_etoa+0x3c0>) -100024f0: f001 fbd1 bl 10003c96 <__wrap___aeabi_dmul> -100024f4: 0002 movs r2, r0 -100024f6: 000b movs r3, r1 -100024f8: 0020 movs r0, r4 -100024fa: 0029 movs r1, r5 -100024fc: f001 fba4 bl 10003c48 <__wrap___aeabi_dadd> -10002500: f001 fc4a bl 10003d98 <__wrap___aeabi_d2iz> -10002504: 9009 str r0, [sp, #36] @ 0x24 -10002506: f001 fc2f bl 10003d68 <__wrap___aeabi_i2d> -1000250a: 4a5e ldr r2, [pc, #376] @ (10002684 <_etoa+0x3c4>) -1000250c: 4b5e ldr r3, [pc, #376] @ (10002688 <_etoa+0x3c8>) -1000250e: 0004 movs r4, r0 -10002510: 000d movs r5, r1 -10002512: f001 fbc0 bl 10003c96 <__wrap___aeabi_dmul> -10002516: 2200 movs r2, #0 -10002518: 4b5c ldr r3, [pc, #368] @ (1000268c <_etoa+0x3cc>) -1000251a: f001 fb95 bl 10003c48 <__wrap___aeabi_dadd> -1000251e: f001 fc3b bl 10003d98 <__wrap___aeabi_d2iz> -10002522: 4a5b ldr r2, [pc, #364] @ (10002690 <_etoa+0x3d0>) -10002524: 4b5b ldr r3, [pc, #364] @ (10002694 <_etoa+0x3d4>) -10002526: 0029 movs r1, r5 -10002528: 900c str r0, [sp, #48] @ 0x30 -1000252a: 0020 movs r0, r4 -1000252c: f001 fbb3 bl 10003c96 <__wrap___aeabi_dmul> -10002530: 0004 movs r4, r0 -10002532: 980c ldr r0, [sp, #48] @ 0x30 -10002534: 000d movs r5, r1 -10002536: f001 fc17 bl 10003d68 <__wrap___aeabi_i2d> -1000253a: 4a57 ldr r2, [pc, #348] @ (10002698 <_etoa+0x3d8>) -1000253c: 4b57 ldr r3, [pc, #348] @ (1000269c <_etoa+0x3dc>) -1000253e: f001 fbaa bl 10003c96 <__wrap___aeabi_dmul> -10002542: 0002 movs r2, r0 -10002544: 000b movs r3, r1 -10002546: 0020 movs r0, r4 -10002548: 0029 movs r1, r5 -1000254a: f001 fb74 bl 10003c36 <__wrap___aeabi_dsub> -1000254e: 0004 movs r4, r0 -10002550: 000d movs r5, r1 -10002552: 0002 movs r2, r0 -10002554: 000b movs r3, r1 -10002556: 940a str r4, [sp, #40] @ 0x28 -10002558: 950b str r5, [sp, #44] @ 0x2c -1000255a: f001 fb9c bl 10003c96 <__wrap___aeabi_dmul> -1000255e: 0004 movs r4, r0 -10002560: 000d movs r5, r1 -10002562: 980a ldr r0, [sp, #40] @ 0x28 -10002564: 990b ldr r1, [sp, #44] @ 0x2c -10002566: 0002 movs r2, r0 -10002568: 000b movs r3, r1 -1000256a: f001 fb6d bl 10003c48 <__wrap___aeabi_dadd> -1000256e: 2200 movs r2, #0 -10002570: 900e str r0, [sp, #56] @ 0x38 -10002572: 910f str r1, [sp, #60] @ 0x3c -10002574: 4b4a ldr r3, [pc, #296] @ (100026a0 <_etoa+0x3e0>) -10002576: 0020 movs r0, r4 -10002578: 0029 movs r1, r5 -1000257a: f001 fb6e bl 10003c5a <__wrap___aeabi_ddiv> -1000257e: 2200 movs r2, #0 -10002580: 4b48 ldr r3, [pc, #288] @ (100026a4 <_etoa+0x3e4>) -10002582: f001 fb61 bl 10003c48 <__wrap___aeabi_dadd> -10002586: 0002 movs r2, r0 -10002588: 000b movs r3, r1 -1000258a: 0020 movs r0, r4 -1000258c: 0029 movs r1, r5 -1000258e: f001 fb64 bl 10003c5a <__wrap___aeabi_ddiv> -10002592: 2200 movs r2, #0 -10002594: 4b44 ldr r3, [pc, #272] @ (100026a8 <_etoa+0x3e8>) -10002596: f001 fb57 bl 10003c48 <__wrap___aeabi_dadd> -1000259a: 0002 movs r2, r0 -1000259c: 000b movs r3, r1 -1000259e: 0020 movs r0, r4 -100025a0: 0029 movs r1, r5 -100025a2: f001 fb5a bl 10003c5a <__wrap___aeabi_ddiv> -100025a6: 9a0a ldr r2, [sp, #40] @ 0x28 -100025a8: 9b0b ldr r3, [sp, #44] @ 0x2c -100025aa: 000d movs r5, r1 -100025ac: 2180 movs r1, #128 @ 0x80 -100025ae: 0004 movs r4, r0 -100025b0: 05c9 lsls r1, r1, #23 -100025b2: 2000 movs r0, #0 -100025b4: f001 fb3f bl 10003c36 <__wrap___aeabi_dsub> -100025b8: 0002 movs r2, r0 -100025ba: 000b movs r3, r1 -100025bc: 0020 movs r0, r4 -100025be: 0029 movs r1, r5 -100025c0: f001 fb42 bl 10003c48 <__wrap___aeabi_dadd> -100025c4: 0002 movs r2, r0 -100025c6: 000b movs r3, r1 -100025c8: 980e ldr r0, [sp, #56] @ 0x38 -100025ca: 990f ldr r1, [sp, #60] @ 0x3c -100025cc: f001 fb45 bl 10003c5a <__wrap___aeabi_ddiv> -100025d0: 2200 movs r2, #0 -100025d2: 4b28 ldr r3, [pc, #160] @ (10002674 <_etoa+0x3b4>) -100025d4: f001 fb38 bl 10003c48 <__wrap___aeabi_dadd> -100025d8: 4b34 ldr r3, [pc, #208] @ (100026ac <_etoa+0x3ec>) -100025da: 9c0c ldr r4, [sp, #48] @ 0x30 -100025dc: 469c mov ip, r3 -100025de: 4464 add r4, ip -100025e0: 0523 lsls r3, r4, #20 -100025e2: 2200 movs r2, #0 -100025e4: f001 fb57 bl 10003c96 <__wrap___aeabi_dmul> -100025e8: 0004 movs r4, r0 -100025ea: 000d movs r5, r1 -100025ec: 0002 movs r2, r0 -100025ee: 000b movs r3, r1 -100025f0: 0030 movs r0, r6 -100025f2: 0039 movs r1, r7 -100025f4: 940a str r4, [sp, #40] @ 0x28 -100025f6: 950b str r5, [sp, #44] @ 0x2c -100025f8: f001 fb90 bl 10003d1c <__wrap___aeabi_dcmplt> -100025fc: 2800 cmp r0, #0 -100025fe: d15d bne.n 100026bc <_etoa+0x3fc> -10002600: 0023 movs r3, r4 -10002602: 002a movs r2, r5 -10002604: 25c6 movs r5, #198 @ 0xc6 -10002606: 9909 ldr r1, [sp, #36] @ 0x24 -10002608: 3163 adds r1, #99 @ 0x63 -1000260a: 428d cmp r5, r1 -1000260c: 41ad sbcs r5, r5 -1000260e: 4659 mov r1, fp -10002610: 426d negs r5, r5 -10002612: 3504 adds r5, #4 -10002614: 2900 cmp r1, #0 -10002616: d100 bne.n 1000261a <_etoa+0x35a> -10002618: e6a3 b.n 10002362 <_etoa+0xa2> -1000261a: 4313 orrs r3, r2 -1000261c: d063 beq.n 100026e6 <_etoa+0x426> -1000261e: 0030 movs r0, r6 -10002620: 0039 movs r1, r7 -10002622: 4a23 ldr r2, [pc, #140] @ (100026b0 <_etoa+0x3f0>) -10002624: 4b23 ldr r3, [pc, #140] @ (100026b4 <_etoa+0x3f4>) -10002626: f001 fb7f bl 10003d28 <__wrap___aeabi_dcmpge> -1000262a: 2800 cmp r0, #0 -1000262c: d007 beq.n 1000263e <_etoa+0x37e> -1000262e: 2200 movs r2, #0 -10002630: 0030 movs r0, r6 -10002632: 0039 movs r1, r7 -10002634: 4b20 ldr r3, [pc, #128] @ (100026b8 <_etoa+0x3f8>) -10002636: f001 fb71 bl 10003d1c <__wrap___aeabi_dcmplt> -1000263a: 2800 cmp r0, #0 -1000263c: d153 bne.n 100026e6 <_etoa+0x426> -1000263e: 9b24 ldr r3, [sp, #144] @ 0x90 -10002640: 2b00 cmp r3, #0 -10002642: d100 bne.n 10002646 <_etoa+0x386> -10002644: e68d b.n 10002362 <_etoa+0xa2> -10002646: 9b0d ldr r3, [sp, #52] @ 0x34 -10002648: 1e5a subs r2, r3, #1 -1000264a: 4193 sbcs r3, r2 -1000264c: 9a24 ldr r2, [sp, #144] @ 0x90 -1000264e: 1ad3 subs r3, r2, r3 -10002650: 9324 str r3, [sp, #144] @ 0x90 -10002652: e686 b.n 10002362 <_etoa+0xa2> -10002654: 7fefffff .word 0x7fefffff -10002658: ffefffff .word 0xffefffff -1000265c: fffff7ff .word 0xfffff7ff -10002660: fffffc01 .word 0xfffffc01 -10002664: 509f79fb .word 0x509f79fb -10002668: 3fd34413 .word 0x3fd34413 -1000266c: 8b60c8b3 .word 0x8b60c8b3 -10002670: 3fc68a28 .word 0x3fc68a28 -10002674: 3ff00000 .word 0x3ff00000 -10002678: 3ff80000 .word 0x3ff80000 -1000267c: 636f4361 .word 0x636f4361 -10002680: 3fd287a7 .word 0x3fd287a7 -10002684: 0979a371 .word 0x0979a371 -10002688: 400a934f .word 0x400a934f -1000268c: 3fe00000 .word 0x3fe00000 -10002690: bbb55516 .word 0xbbb55516 -10002694: 40026bb1 .word 0x40026bb1 -10002698: fefa39ef .word 0xfefa39ef -1000269c: 3fe62e42 .word 0x3fe62e42 -100026a0: 402c0000 .word 0x402c0000 -100026a4: 40240000 .word 0x40240000 -100026a8: 40180000 .word 0x40180000 -100026ac: 000003ff .word 0x000003ff -100026b0: eb1c432d .word 0xeb1c432d -100026b4: 3f1a36e2 .word 0x3f1a36e2 -100026b8: 412e8480 .word 0x412e8480 -100026bc: 9b09 ldr r3, [sp, #36] @ 0x24 -100026be: 2200 movs r2, #0 -100026c0: 3b01 subs r3, #1 -100026c2: 9309 str r3, [sp, #36] @ 0x24 -100026c4: 0020 movs r0, r4 -100026c6: 4b16 ldr r3, [pc, #88] @ (10002720 <_etoa+0x460>) -100026c8: 0029 movs r1, r5 -100026ca: f001 fac6 bl 10003c5a <__wrap___aeabi_ddiv> -100026ce: 000a movs r2, r1 -100026d0: 0001 movs r1, r0 -100026d2: 0003 movs r3, r0 -100026d4: 910a str r1, [sp, #40] @ 0x28 -100026d6: 920b str r2, [sp, #44] @ 0x2c -100026d8: e794 b.n 10002604 <_etoa+0x344> -100026da: 2300 movs r3, #0 -100026dc: 2400 movs r4, #0 -100026de: 930a str r3, [sp, #40] @ 0x28 -100026e0: 940b str r4, [sp, #44] @ 0x2c -100026e2: 2300 movs r3, #0 -100026e4: 9309 str r3, [sp, #36] @ 0x24 -100026e6: 9a24 ldr r2, [sp, #144] @ 0x90 -100026e8: 9b09 ldr r3, [sp, #36] @ 0x24 -100026ea: 429a cmp r2, r3 -100026ec: dd14 ble.n 10002718 <_etoa+0x458> -100026ee: 1ad3 subs r3, r2, r3 -100026f0: 3b01 subs r3, #1 -100026f2: 9324 str r3, [sp, #144] @ 0x90 -100026f4: 2380 movs r3, #128 @ 0x80 -100026f6: 9a26 ldr r2, [sp, #152] @ 0x98 -100026f8: 00db lsls r3, r3, #3 -100026fa: 431a orrs r2, r3 -100026fc: 2300 movs r3, #0 -100026fe: 2500 movs r5, #0 -10002700: 9226 str r2, [sp, #152] @ 0x98 -10002702: 9309 str r3, [sp, #36] @ 0x24 -10002704: e62d b.n 10002362 <_etoa+0xa2> -10002706: 2280 movs r2, #128 @ 0x80 -10002708: 0612 lsls r2, r2, #24 -1000270a: 4694 mov ip, r2 -1000270c: 9b22 ldr r3, [sp, #136] @ 0x88 -1000270e: 001e movs r6, r3 -10002710: 9b23 ldr r3, [sp, #140] @ 0x8c -10002712: 4463 add r3, ip -10002714: 001f movs r7, r3 -10002716: e606 b.n 10002326 <_etoa+0x66> -10002718: 2300 movs r3, #0 -1000271a: 9324 str r3, [sp, #144] @ 0x90 -1000271c: e7ea b.n 100026f4 <_etoa+0x434> -1000271e: 46c0 nop @ (mov r8, r8) -10002720: 40240000 .word 0x40240000 - -10002724 <_ftoa>: -10002724: b5f0 push {r4, r5, r6, r7, lr} -10002726: 4645 mov r5, r8 -10002728: 46de mov lr, fp -1000272a: 464e mov r6, r9 -1000272c: 4657 mov r7, sl -1000272e: b5e0 push {r5, r6, r7, lr} -10002730: b095 sub sp, #84 @ 0x54 -10002732: 468b mov fp, r1 -10002734: 4690 mov r8, r2 -10002736: 4699 mov r9, r3 -10002738: 9a1e ldr r2, [sp, #120] @ 0x78 -1000273a: 9b1f ldr r3, [sp, #124] @ 0x7c -1000273c: 900a str r0, [sp, #40] @ 0x28 -1000273e: 0019 movs r1, r3 -10002740: 0010 movs r0, r2 -10002742: 9d20 ldr r5, [sp, #128] @ 0x80 -10002744: f001 fafd bl 10003d42 <__wrap___aeabi_dcmpun> -10002748: 2800 cmp r0, #0 -1000274a: d000 beq.n 1000274e <_ftoa+0x2a> -1000274c: e1b0 b.n 10002ab0 <_ftoa+0x38c> -1000274e: 981e ldr r0, [sp, #120] @ 0x78 -10002750: 991f ldr r1, [sp, #124] @ 0x7c -10002752: 2201 movs r2, #1 -10002754: 4bc7 ldr r3, [pc, #796] @ (10002a74 <_ftoa+0x350>) -10002756: 4252 negs r2, r2 -10002758: f001 fae0 bl 10003d1c <__wrap___aeabi_dcmplt> -1000275c: 2800 cmp r0, #0 -1000275e: d000 beq.n 10002762 <_ftoa+0x3e> -10002760: e137 b.n 100029d2 <_ftoa+0x2ae> -10002762: 981e ldr r0, [sp, #120] @ 0x78 -10002764: 991f ldr r1, [sp, #124] @ 0x7c -10002766: 2201 movs r2, #1 -10002768: 4bc3 ldr r3, [pc, #780] @ (10002a78 <_ftoa+0x354>) -1000276a: 4252 negs r2, r2 -1000276c: f001 fae4 bl 10003d38 <__wrap___aeabi_dcmpgt> -10002770: 2800 cmp r0, #0 -10002772: d000 beq.n 10002776 <_ftoa+0x52> -10002774: e0a7 b.n 100028c6 <_ftoa+0x1a2> -10002776: 981e ldr r0, [sp, #120] @ 0x78 -10002778: 991f ldr r1, [sp, #124] @ 0x7c -1000277a: 2200 movs r2, #0 -1000277c: 4bbf ldr r3, [pc, #764] @ (10002a7c <_ftoa+0x358>) -1000277e: f001 fadb bl 10003d38 <__wrap___aeabi_dcmpgt> -10002782: 2800 cmp r0, #0 -10002784: d000 beq.n 10002788 <_ftoa+0x64> -10002786: e088 b.n 1000289a <_ftoa+0x176> -10002788: 981e ldr r0, [sp, #120] @ 0x78 -1000278a: 991f ldr r1, [sp, #124] @ 0x7c -1000278c: 2200 movs r2, #0 -1000278e: 4bbc ldr r3, [pc, #752] @ (10002a80 <_ftoa+0x35c>) -10002790: f001 fac4 bl 10003d1c <__wrap___aeabi_dcmplt> -10002794: 2800 cmp r0, #0 -10002796: d000 beq.n 1000279a <_ftoa+0x76> -10002798: e07f b.n 1000289a <_ftoa+0x176> -1000279a: 981e ldr r0, [sp, #120] @ 0x78 -1000279c: 991f ldr r1, [sp, #124] @ 0x7c -1000279e: 2200 movs r2, #0 -100027a0: 2300 movs r3, #0 -100027a2: f001 fabb bl 10003d1c <__wrap___aeabi_dcmplt> -100027a6: 2800 cmp r0, #0 -100027a8: d000 beq.n 100027ac <_ftoa+0x88> -100027aa: e0fa b.n 100029a2 <_ftoa+0x27e> -100027ac: 2300 movs r3, #0 -100027ae: 930b str r3, [sp, #44] @ 0x2c -100027b0: 2380 movs r3, #128 @ 0x80 -100027b2: 9c22 ldr r4, [sp, #136] @ 0x88 -100027b4: 9a22 ldr r2, [sp, #136] @ 0x88 -100027b6: 00db lsls r3, r3, #3 -100027b8: 401c ands r4, r3 -100027ba: 421a tst r2, r3 -100027bc: d100 bne.n 100027c0 <_ftoa+0x9c> -100027be: e102 b.n 100029c6 <_ftoa+0x2a2> -100027c0: 2d09 cmp r5, #9 -100027c2: d800 bhi.n 100027c6 <_ftoa+0xa2> -100027c4: e17c b.n 10002ac0 <_ftoa+0x39c> -100027c6: a906 add r1, sp, #24 -100027c8: 468c mov ip, r1 -100027ca: 002c movs r4, r5 -100027cc: 2217 movs r2, #23 -100027ce: 2300 movs r3, #0 -100027d0: 2130 movs r1, #48 @ 0x30 -100027d2: 3c09 subs r4, #9 -100027d4: 4462 add r2, ip -100027d6: 3301 adds r3, #1 -100027d8: 54d1 strb r1, [r2, r3] -100027da: 1aef subs r7, r5, r3 -100027dc: 2b20 cmp r3, #32 -100027de: d100 bne.n 100027e2 <_ftoa+0xbe> -100027e0: e132 b.n 10002a48 <_ftoa+0x324> -100027e2: 42a3 cmp r3, r4 -100027e4: d1f7 bne.n 100027d6 <_ftoa+0xb2> -100027e6: 2200 movs r2, #0 -100027e8: 4ba4 ldr r3, [pc, #656] @ (10002a7c <_ftoa+0x358>) -100027ea: 9206 str r2, [sp, #24] -100027ec: 9307 str r3, [sp, #28] -100027ee: 981e ldr r0, [sp, #120] @ 0x78 -100027f0: 991f ldr r1, [sp, #124] @ 0x7c -100027f2: f001 fad1 bl 10003d98 <__wrap___aeabi_d2iz> -100027f6: 0005 movs r5, r0 -100027f8: f001 fab6 bl 10003d68 <__wrap___aeabi_i2d> -100027fc: 0002 movs r2, r0 -100027fe: 000b movs r3, r1 -10002800: 981e ldr r0, [sp, #120] @ 0x78 -10002802: 991f ldr r1, [sp, #124] @ 0x7c -10002804: f001 fa17 bl 10003c36 <__wrap___aeabi_dsub> -10002808: 9a06 ldr r2, [sp, #24] -1000280a: 9b07 ldr r3, [sp, #28] -1000280c: f001 fa43 bl 10003c96 <__wrap___aeabi_dmul> -10002810: 9008 str r0, [sp, #32] -10002812: 9109 str r1, [sp, #36] @ 0x24 -10002814: f001 fae4 bl 10003de0 <__wrap___aeabi_d2uiz> -10002818: 0006 movs r6, r0 -1000281a: f001 faa1 bl 10003d60 <__wrap___aeabi_ui2d> -1000281e: 0002 movs r2, r0 -10002820: 000b movs r3, r1 -10002822: 9808 ldr r0, [sp, #32] -10002824: 9909 ldr r1, [sp, #36] @ 0x24 -10002826: f001 fa06 bl 10003c36 <__wrap___aeabi_dsub> -1000282a: 2200 movs r2, #0 -1000282c: 4b95 ldr r3, [pc, #596] @ (10002a84 <_ftoa+0x360>) -1000282e: 9008 str r0, [sp, #32] -10002830: 9109 str r1, [sp, #36] @ 0x24 -10002832: f001 fa81 bl 10003d38 <__wrap___aeabi_dcmpgt> -10002836: 2800 cmp r0, #0 -10002838: d100 bne.n 1000283c <_ftoa+0x118> -1000283a: e0d2 b.n 100029e2 <_ftoa+0x2be> -1000283c: 3601 adds r6, #1 -1000283e: 0030 movs r0, r6 -10002840: f001 fa8e bl 10003d60 <__wrap___aeabi_ui2d> -10002844: 9a06 ldr r2, [sp, #24] -10002846: 9b07 ldr r3, [sp, #28] -10002848: f001 fa6e bl 10003d28 <__wrap___aeabi_dcmpge> -1000284c: 2800 cmp r0, #0 -1000284e: d001 beq.n 10002854 <_ftoa+0x130> -10002850: 2600 movs r6, #0 -10002852: 3501 adds r5, #1 -10002854: 46aa mov sl, r5 -10002856: 2f00 cmp r7, #0 -10002858: d000 beq.n 1000285c <_ftoa+0x138> -1000285a: e098 b.n 1000298e <_ftoa+0x26a> -1000285c: 0028 movs r0, r5 -1000285e: f001 fa83 bl 10003d68 <__wrap___aeabi_i2d> -10002862: 0002 movs r2, r0 -10002864: 000b movs r3, r1 -10002866: 981e ldr r0, [sp, #120] @ 0x78 -10002868: 991f ldr r1, [sp, #124] @ 0x7c -1000286a: f001 f9e4 bl 10003c36 <__wrap___aeabi_dsub> -1000286e: 4b85 ldr r3, [pc, #532] @ (10002a84 <_ftoa+0x360>) -10002870: 2200 movs r2, #0 -10002872: 0006 movs r6, r0 -10002874: 000f movs r7, r1 -10002876: f001 fa51 bl 10003d1c <__wrap___aeabi_dcmplt> -1000287a: ab0c add r3, sp, #48 @ 0x30 -1000287c: 469a mov sl, r3 -1000287e: 2800 cmp r0, #0 -10002880: d145 bne.n 1000290e <_ftoa+0x1ea> -10002882: 2200 movs r2, #0 -10002884: 0030 movs r0, r6 -10002886: 0039 movs r1, r7 -10002888: 4b7e ldr r3, [pc, #504] @ (10002a84 <_ftoa+0x360>) -1000288a: f001 fa55 bl 10003d38 <__wrap___aeabi_dcmpgt> -1000288e: 2800 cmp r0, #0 -10002890: d13d bne.n 1000290e <_ftoa+0x1ea> -10002892: 07eb lsls r3, r5, #31 -10002894: d53b bpl.n 1000290e <_ftoa+0x1ea> -10002896: 3501 adds r5, #1 -10002898: e039 b.n 1000290e <_ftoa+0x1ea> -1000289a: 9b22 ldr r3, [sp, #136] @ 0x88 -1000289c: 4642 mov r2, r8 -1000289e: 9304 str r3, [sp, #16] -100028a0: 9b21 ldr r3, [sp, #132] @ 0x84 -100028a2: 4659 mov r1, fp -100028a4: 9303 str r3, [sp, #12] -100028a6: 980a ldr r0, [sp, #40] @ 0x28 -100028a8: 9b1e ldr r3, [sp, #120] @ 0x78 -100028aa: 9c1f ldr r4, [sp, #124] @ 0x7c -100028ac: 9502 str r5, [sp, #8] -100028ae: 9300 str r3, [sp, #0] -100028b0: 9401 str r4, [sp, #4] -100028b2: 464b mov r3, r9 -100028b4: f7ff fd04 bl 100022c0 <_etoa> -100028b8: b015 add sp, #84 @ 0x54 -100028ba: bcf0 pop {r4, r5, r6, r7} -100028bc: 46bb mov fp, r7 -100028be: 46b2 mov sl, r6 -100028c0: 46a9 mov r9, r5 -100028c2: 46a0 mov r8, r4 -100028c4: bdf0 pop {r4, r5, r6, r7, pc} -100028c6: 9b22 ldr r3, [sp, #136] @ 0x88 -100028c8: 075b lsls r3, r3, #29 -100028ca: d467 bmi.n 1000299c <_ftoa+0x278> -100028cc: 2203 movs r2, #3 -100028ce: 4b6e ldr r3, [pc, #440] @ (10002a88 <_ftoa+0x364>) -100028d0: 9922 ldr r1, [sp, #136] @ 0x88 -100028d2: 9201 str r2, [sp, #4] -100028d4: 9103 str r1, [sp, #12] -100028d6: 9921 ldr r1, [sp, #132] @ 0x84 -100028d8: 9102 str r1, [sp, #8] -100028da: 9300 str r3, [sp, #0] -100028dc: 4642 mov r2, r8 -100028de: 464b mov r3, r9 -100028e0: 4659 mov r1, fp -100028e2: 980a ldr r0, [sp, #40] @ 0x28 -100028e4: f7ff fb5e bl 10001fa4 <_out_rev> -100028e8: e7e6 b.n 100028b8 <_ftoa+0x194> -100028ea: aa06 add r2, sp, #24 -100028ec: 4694 mov ip, r2 -100028ee: 2317 movs r3, #23 -100028f0: 0028 movs r0, r5 -100028f2: 4463 add r3, ip -100028f4: 210a movs r1, #10 -100028f6: 3401 adds r4, #1 -100028f8: 191e adds r6, r3, r4 -100028fa: f000 ff39 bl 10003770 <__wrap___aeabi_idiv> -100028fe: 3130 adds r1, #48 @ 0x30 -10002900: 0028 movs r0, r5 -10002902: 7031 strb r1, [r6, #0] -10002904: 210a movs r1, #10 -10002906: f000 ff33 bl 10003770 <__wrap___aeabi_idiv> -1000290a: 1e05 subs r5, r0, #0 -1000290c: d076 beq.n 100029fc <_ftoa+0x2d8> -1000290e: 2c20 cmp r4, #32 -10002910: d1eb bne.n 100028ea <_ftoa+0x1c6> -10002912: 2303 movs r3, #3 -10002914: 9a22 ldr r2, [sp, #136] @ 0x88 -10002916: 4013 ands r3, r2 -10002918: 2b01 cmp r3, #1 -1000291a: d11d bne.n 10002958 <_ftoa+0x234> -1000291c: 9b21 ldr r3, [sp, #132] @ 0x84 -1000291e: 2b00 cmp r3, #0 -10002920: d01a beq.n 10002958 <_ftoa+0x234> -10002922: 9b0b ldr r3, [sp, #44] @ 0x2c -10002924: 2b00 cmp r3, #0 -10002926: d000 beq.n 1000292a <_ftoa+0x206> -10002928: e0bb b.n 10002aa2 <_ftoa+0x37e> -1000292a: 9a22 ldr r2, [sp, #136] @ 0x88 -1000292c: 330c adds r3, #12 -1000292e: 4213 tst r3, r2 -10002930: d000 beq.n 10002934 <_ftoa+0x210> -10002932: e0b6 b.n 10002aa2 <_ftoa+0x37e> -10002934: 9b21 ldr r3, [sp, #132] @ 0x84 -10002936: 42a3 cmp r3, r4 -10002938: d800 bhi.n 1000293c <_ftoa+0x218> -1000293a: e087 b.n 10002a4c <_ftoa+0x328> -1000293c: ab06 add r3, sp, #24 -1000293e: 469c mov ip, r3 -10002940: 2217 movs r2, #23 -10002942: 2330 movs r3, #48 @ 0x30 -10002944: 4462 add r2, ip -10002946: e004 b.n 10002952 <_ftoa+0x22e> -10002948: 9921 ldr r1, [sp, #132] @ 0x84 -1000294a: 3401 adds r4, #1 -1000294c: 5513 strb r3, [r2, r4] -1000294e: 428c cmp r4, r1 -10002950: d059 beq.n 10002a06 <_ftoa+0x2e2> -10002952: 2c20 cmp r4, #32 -10002954: d1f8 bne.n 10002948 <_ftoa+0x224> -10002956: 2420 movs r4, #32 -10002958: 9b22 ldr r3, [sp, #136] @ 0x88 -1000295a: 9401 str r4, [sp, #4] -1000295c: 9303 str r3, [sp, #12] -1000295e: 9b21 ldr r3, [sp, #132] @ 0x84 -10002960: 9302 str r3, [sp, #8] -10002962: 4653 mov r3, sl -10002964: e7b9 b.n 100028da <_ftoa+0x1b6> -10002966: aa06 add r2, sp, #24 -10002968: 4694 mov ip, r2 -1000296a: 2317 movs r3, #23 -1000296c: 210a movs r1, #10 -1000296e: 4463 add r3, ip -10002970: 0030 movs r0, r6 -10002972: 3401 adds r4, #1 -10002974: 191d adds r5, r3, r4 -10002976: f000 ff23 bl 100037c0 <__wrap___aeabi_uidiv> -1000297a: 3130 adds r1, #48 @ 0x30 -1000297c: 7029 strb r1, [r5, #0] -1000297e: 0030 movs r0, r6 -10002980: 210a movs r1, #10 -10002982: 3f01 subs r7, #1 -10002984: f000 ff1c bl 100037c0 <__wrap___aeabi_uidiv> -10002988: 2e09 cmp r6, #9 -1000298a: d946 bls.n 10002a1a <_ftoa+0x2f6> -1000298c: 0006 movs r6, r0 -1000298e: 2c20 cmp r4, #32 -10002990: d1e9 bne.n 10002966 <_ftoa+0x242> -10002992: 4655 mov r5, sl -10002994: ab0c add r3, sp, #48 @ 0x30 -10002996: 2420 movs r4, #32 -10002998: 469a mov sl, r3 -1000299a: e7b8 b.n 1000290e <_ftoa+0x1ea> -1000299c: 2204 movs r2, #4 -1000299e: 4b3b ldr r3, [pc, #236] @ (10002a8c <_ftoa+0x368>) -100029a0: e796 b.n 100028d0 <_ftoa+0x1ac> -100029a2: 9a1e ldr r2, [sp, #120] @ 0x78 -100029a4: 9b1f ldr r3, [sp, #124] @ 0x7c -100029a6: 2000 movs r0, #0 -100029a8: 2100 movs r1, #0 -100029aa: f001 f944 bl 10003c36 <__wrap___aeabi_dsub> -100029ae: 2301 movs r3, #1 -100029b0: 930b str r3, [sp, #44] @ 0x2c -100029b2: 2380 movs r3, #128 @ 0x80 -100029b4: 9c22 ldr r4, [sp, #136] @ 0x88 -100029b6: 9a22 ldr r2, [sp, #136] @ 0x88 -100029b8: 00db lsls r3, r3, #3 -100029ba: 901e str r0, [sp, #120] @ 0x78 -100029bc: 911f str r1, [sp, #124] @ 0x7c -100029be: 401c ands r4, r3 -100029c0: 421a tst r2, r3 -100029c2: d000 beq.n 100029c6 <_ftoa+0x2a2> -100029c4: e6fc b.n 100027c0 <_ftoa+0x9c> -100029c6: 2200 movs r2, #0 -100029c8: 4b31 ldr r3, [pc, #196] @ (10002a90 <_ftoa+0x36c>) -100029ca: 2706 movs r7, #6 -100029cc: 9206 str r2, [sp, #24] -100029ce: 9307 str r3, [sp, #28] -100029d0: e70d b.n 100027ee <_ftoa+0xca> -100029d2: 9b22 ldr r3, [sp, #136] @ 0x88 -100029d4: 9303 str r3, [sp, #12] -100029d6: 9b21 ldr r3, [sp, #132] @ 0x84 -100029d8: 9302 str r3, [sp, #8] -100029da: 2304 movs r3, #4 -100029dc: 9301 str r3, [sp, #4] -100029de: 4b2d ldr r3, [pc, #180] @ (10002a94 <_ftoa+0x370>) -100029e0: e77b b.n 100028da <_ftoa+0x1b6> -100029e2: 2200 movs r2, #0 -100029e4: 9808 ldr r0, [sp, #32] -100029e6: 9909 ldr r1, [sp, #36] @ 0x24 -100029e8: 4b26 ldr r3, [pc, #152] @ (10002a84 <_ftoa+0x360>) -100029ea: f001 f997 bl 10003d1c <__wrap___aeabi_dcmplt> -100029ee: 2800 cmp r0, #0 -100029f0: d000 beq.n 100029f4 <_ftoa+0x2d0> -100029f2: e72f b.n 10002854 <_ftoa+0x130> -100029f4: 2e00 cmp r6, #0 -100029f6: d14f bne.n 10002a98 <_ftoa+0x374> -100029f8: 3601 adds r6, #1 -100029fa: e72b b.n 10002854 <_ftoa+0x130> -100029fc: 2303 movs r3, #3 -100029fe: 9a22 ldr r2, [sp, #136] @ 0x88 -10002a00: 4013 ands r3, r2 -10002a02: 2b01 cmp r3, #1 -10002a04: d066 beq.n 10002ad4 <_ftoa+0x3b0> -10002a06: 2c20 cmp r4, #32 -10002a08: d0a6 beq.n 10002958 <_ftoa+0x234> -10002a0a: 9b0b ldr r3, [sp, #44] @ 0x2c -10002a0c: 2b00 cmp r3, #0 -10002a0e: d01f beq.n 10002a50 <_ftoa+0x32c> -10002a10: 232d movs r3, #45 @ 0x2d -10002a12: 4652 mov r2, sl -10002a14: 5513 strb r3, [r2, r4] -10002a16: 3401 adds r4, #1 -10002a18: e79e b.n 10002958 <_ftoa+0x234> -10002a1a: 4655 mov r5, sl -10002a1c: 2c20 cmp r4, #32 -10002a1e: d0b9 beq.n 10002994 <_ftoa+0x270> -10002a20: 2330 movs r3, #48 @ 0x30 -10002a22: 193a adds r2, r7, r4 -10002a24: 2f00 cmp r7, #0 -10002a26: d008 beq.n 10002a3a <_ftoa+0x316> -10002a28: 2017 movs r0, #23 -10002a2a: a906 add r1, sp, #24 -10002a2c: 3401 adds r4, #1 -10002a2e: 1809 adds r1, r1, r0 -10002a30: 550b strb r3, [r1, r4] -10002a32: 2c20 cmp r4, #32 -10002a34: d0ae beq.n 10002994 <_ftoa+0x270> -10002a36: 4294 cmp r4, r2 -10002a38: d1f6 bne.n 10002a28 <_ftoa+0x304> -10002a3a: ab0c add r3, sp, #48 @ 0x30 -10002a3c: 469a mov sl, r3 -10002a3e: 232e movs r3, #46 @ 0x2e -10002a40: 4652 mov r2, sl -10002a42: 5513 strb r3, [r2, r4] -10002a44: 3401 adds r4, #1 -10002a46: e762 b.n 1000290e <_ftoa+0x1ea> -10002a48: 2420 movs r4, #32 -10002a4a: e6cc b.n 100027e6 <_ftoa+0xc2> -10002a4c: 2c20 cmp r4, #32 -10002a4e: d083 beq.n 10002958 <_ftoa+0x234> -10002a50: 9b22 ldr r3, [sp, #136] @ 0x88 -10002a52: 075b lsls r3, r3, #29 -10002a54: d408 bmi.n 10002a68 <_ftoa+0x344> -10002a56: 9b22 ldr r3, [sp, #136] @ 0x88 -10002a58: 071b lsls r3, r3, #28 -10002a5a: d400 bmi.n 10002a5e <_ftoa+0x33a> -10002a5c: e77c b.n 10002958 <_ftoa+0x234> -10002a5e: 2320 movs r3, #32 -10002a60: 4652 mov r2, sl -10002a62: 5513 strb r3, [r2, r4] -10002a64: 3401 adds r4, #1 -10002a66: e777 b.n 10002958 <_ftoa+0x234> -10002a68: 232b movs r3, #43 @ 0x2b -10002a6a: 4652 mov r2, sl -10002a6c: 5513 strb r3, [r2, r4] -10002a6e: 3401 adds r4, #1 -10002a70: e772 b.n 10002958 <_ftoa+0x234> -10002a72: 46c0 nop @ (mov r8, r8) -10002a74: ffefffff .word 0xffefffff -10002a78: 7fefffff .word 0x7fefffff -10002a7c: 41cdcd65 .word 0x41cdcd65 -10002a80: c1cdcd65 .word 0xc1cdcd65 -10002a84: 3fe00000 .word 0x3fe00000 -10002a88: 10006ec4 .word 0x10006ec4 -10002a8c: 10006ebc .word 0x10006ebc -10002a90: 412e8480 .word 0x412e8480 -10002a94: 10006ecc .word 0x10006ecc -10002a98: 07f3 lsls r3, r6, #31 -10002a9a: d400 bmi.n 10002a9e <_ftoa+0x37a> -10002a9c: e6da b.n 10002854 <_ftoa+0x130> -10002a9e: 3601 adds r6, #1 -10002aa0: e6d8 b.n 10002854 <_ftoa+0x130> -10002aa2: 9b21 ldr r3, [sp, #132] @ 0x84 -10002aa4: 3b01 subs r3, #1 -10002aa6: 9321 str r3, [sp, #132] @ 0x84 -10002aa8: 42a3 cmp r3, r4 -10002aaa: d900 bls.n 10002aae <_ftoa+0x38a> -10002aac: e746 b.n 1000293c <_ftoa+0x218> -10002aae: e7aa b.n 10002a06 <_ftoa+0x2e2> -10002ab0: 9b22 ldr r3, [sp, #136] @ 0x88 -10002ab2: 9303 str r3, [sp, #12] -10002ab4: 9b21 ldr r3, [sp, #132] @ 0x84 -10002ab6: 9302 str r3, [sp, #8] -10002ab8: 2303 movs r3, #3 -10002aba: 9301 str r3, [sp, #4] -10002abc: 4b07 ldr r3, [pc, #28] @ (10002adc <_ftoa+0x3b8>) -10002abe: e70c b.n 100028da <_ftoa+0x1b6> -10002ac0: 4b07 ldr r3, [pc, #28] @ (10002ae0 <_ftoa+0x3bc>) -10002ac2: 00ea lsls r2, r5, #3 -10002ac4: 189b adds r3, r3, r2 -10002ac6: 685c ldr r4, [r3, #4] -10002ac8: 681b ldr r3, [r3, #0] -10002aca: 002f movs r7, r5 -10002acc: 9306 str r3, [sp, #24] -10002ace: 9407 str r4, [sp, #28] -10002ad0: 2400 movs r4, #0 -10002ad2: e68c b.n 100027ee <_ftoa+0xca> -10002ad4: 9b21 ldr r3, [sp, #132] @ 0x84 -10002ad6: 2b00 cmp r3, #0 -10002ad8: d095 beq.n 10002a06 <_ftoa+0x2e2> -10002ada: e722 b.n 10002922 <_ftoa+0x1fe> -10002adc: 10006ec8 .word 0x10006ec8 -10002ae0: 10007180 .word 0x10007180 - -10002ae4 <_vsnprintf>: -10002ae4: b5f0 push {r4, r5, r6, r7, lr} -10002ae6: 4657 mov r7, sl -10002ae8: 46de mov lr, fp -10002aea: 464e mov r6, r9 -10002aec: 4645 mov r5, r8 -10002aee: b5e0 push {r5, r6, r7, lr} -10002af0: b0a5 sub sp, #148 @ 0x94 -10002af2: 001f movs r7, r3 -10002af4: 9b2e ldr r3, [sp, #184] @ 0xb8 -10002af6: 4691 mov r9, r2 -10002af8: 930d str r3, [sp, #52] @ 0x34 -10002afa: 4aca ldr r2, [pc, #808] @ (10002e24 <_vsnprintf+0x340>) -10002afc: 4bca ldr r3, [pc, #808] @ (10002e28 <_vsnprintf+0x344>) -10002afe: 4682 mov sl, r0 -10002b00: 468b mov fp, r1 -10002b02: 601a str r2, [r3, #0] -10002b04: 2900 cmp r1, #0 -10002b06: d100 bne.n 10002b0a <_vsnprintf+0x26> -10002b08: e229 b.n 10002f5e <_vsnprintf+0x47a> -10002b0a: 2300 movs r3, #0 -10002b0c: 7838 ldrb r0, [r7, #0] -10002b0e: 4698 mov r8, r3 -10002b10: 2800 cmp r0, #0 -10002b12: d100 bne.n 10002b16 <_vsnprintf+0x32> -10002b14: e22b b.n 10002f6e <_vsnprintf+0x48a> -10002b16: 4bc5 ldr r3, [pc, #788] @ (10002e2c <_vsnprintf+0x348>) -10002b18: 4644 mov r4, r8 -10002b1a: 930c str r3, [sp, #48] @ 0x30 -10002b1c: 4bc4 ldr r3, [pc, #784] @ (10002e30 <_vsnprintf+0x34c>) -10002b1e: 4655 mov r5, sl -10002b20: 464e mov r6, r9 -10002b22: 930e str r3, [sp, #56] @ 0x38 -10002b24: e00a b.n 10002b3c <_vsnprintf+0x58> -10002b26: 1c63 adds r3, r4, #1 -10002b28: 4698 mov r8, r3 -10002b2a: 0022 movs r2, r4 -10002b2c: 0033 movs r3, r6 -10002b2e: 4659 mov r1, fp -10002b30: 47a8 blx r5 -10002b32: 4644 mov r4, r8 -10002b34: 7838 ldrb r0, [r7, #0] -10002b36: 2800 cmp r0, #0 -10002b38: d100 bne.n 10002b3c <_vsnprintf+0x58> -10002b3a: e087 b.n 10002c4c <_vsnprintf+0x168> -10002b3c: 3701 adds r7, #1 -10002b3e: 2825 cmp r0, #37 @ 0x25 -10002b40: d1f1 bne.n 10002b26 <_vsnprintf+0x42> -10002b42: 2308 movs r3, #8 -10002b44: 469a mov sl, r3 -10002b46: 3b04 subs r3, #4 -10002b48: 4699 mov r9, r3 -10002b4a: 3b02 subs r3, #2 -10002b4c: 4698 mov r8, r3 -10002b4e: 3b01 subs r3, #1 -10002b50: 2200 movs r2, #0 -10002b52: 469c mov ip, r3 -10002b54: 940b str r4, [sp, #44] @ 0x2c -10002b56: 7838 ldrb r0, [r7, #0] -10002b58: 1c79 adds r1, r7, #1 -10002b5a: 0003 movs r3, r0 -10002b5c: 3b20 subs r3, #32 -10002b5e: b2db uxtb r3, r3 -10002b60: 2b10 cmp r3, #16 -10002b62: d803 bhi.n 10002b6c <_vsnprintf+0x88> -10002b64: 9c0c ldr r4, [sp, #48] @ 0x30 -10002b66: 009b lsls r3, r3, #2 -10002b68: 58e3 ldr r3, [r4, r3] -10002b6a: 469f mov pc, r3 -10002b6c: 0003 movs r3, r0 -10002b6e: 3b30 subs r3, #48 @ 0x30 -10002b70: 9c0b ldr r4, [sp, #44] @ 0x2c -10002b72: 920b str r2, [sp, #44] @ 0x2c -10002b74: 2b09 cmp r3, #9 -10002b76: d93a bls.n 10002bee <_vsnprintf+0x10a> -10002b78: 2300 movs r3, #0 -10002b7a: 4698 mov r8, r3 -10002b7c: 282a cmp r0, #42 @ 0x2a -10002b7e: d100 bne.n 10002b82 <_vsnprintf+0x9e> -10002b80: e0dd b.n 10002d3e <_vsnprintf+0x25a> -10002b82: 2300 movs r3, #0 -10002b84: 469a mov sl, r3 -10002b86: 282e cmp r0, #46 @ 0x2e -10002b88: d04b beq.n 10002c22 <_vsnprintf+0x13e> -10002b8a: 0003 movs r3, r0 -10002b8c: 3b68 subs r3, #104 @ 0x68 -10002b8e: b2db uxtb r3, r3 -10002b90: 2b12 cmp r3, #18 -10002b92: d81e bhi.n 10002bd2 <_vsnprintf+0xee> -10002b94: 9a0e ldr r2, [sp, #56] @ 0x38 -10002b96: 009b lsls r3, r3, #2 -10002b98: 58d3 ldr r3, [r2, r3] -10002b9a: 469f mov pc, r3 -10002b9c: 4663 mov r3, ip -10002b9e: 000f movs r7, r1 -10002ba0: 431a orrs r2, r3 -10002ba2: e7d8 b.n 10002b56 <_vsnprintf+0x72> -10002ba4: 4643 mov r3, r8 -10002ba6: 000f movs r7, r1 -10002ba8: 431a orrs r2, r3 -10002baa: e7d4 b.n 10002b56 <_vsnprintf+0x72> -10002bac: 464b mov r3, r9 -10002bae: 000f movs r7, r1 -10002bb0: 431a orrs r2, r3 -10002bb2: e7d0 b.n 10002b56 <_vsnprintf+0x72> -10002bb4: 2310 movs r3, #16 -10002bb6: 000f movs r7, r1 -10002bb8: 431a orrs r2, r3 -10002bba: e7cc b.n 10002b56 <_vsnprintf+0x72> -10002bbc: 4653 mov r3, sl -10002bbe: 000f movs r7, r1 -10002bc0: 431a orrs r2, r3 -10002bc2: e7c8 b.n 10002b56 <_vsnprintf+0x72> -10002bc4: 2380 movs r3, #128 @ 0x80 -10002bc6: 005b lsls r3, r3, #1 -10002bc8: 9a0b ldr r2, [sp, #44] @ 0x2c -10002bca: 7878 ldrb r0, [r7, #1] -10002bcc: 431a orrs r2, r3 -10002bce: 920b str r2, [sp, #44] @ 0x2c -10002bd0: 3101 adds r1, #1 -10002bd2: 000f movs r7, r1 -10002bd4: 2867 cmp r0, #103 @ 0x67 -10002bd6: d84f bhi.n 10002c78 <_vsnprintf+0x194> -10002bd8: 2824 cmp r0, #36 @ 0x24 -10002bda: d9a4 bls.n 10002b26 <_vsnprintf+0x42> -10002bdc: 0003 movs r3, r0 -10002bde: 3b25 subs r3, #37 @ 0x25 -10002be0: b2db uxtb r3, r3 -10002be2: 2b42 cmp r3, #66 @ 0x42 -10002be4: d89f bhi.n 10002b26 <_vsnprintf+0x42> -10002be6: 4993 ldr r1, [pc, #588] @ (10002e34 <_vsnprintf+0x350>) -10002be8: 009b lsls r3, r3, #2 -10002bea: 58cb ldr r3, [r1, r3] -10002bec: 469f mov pc, r3 -10002bee: 2300 movs r3, #0 -10002bf0: 4698 mov r8, r3 -10002bf2: 9b0b ldr r3, [sp, #44] @ 0x2c -10002bf4: 4647 mov r7, r8 -10002bf6: 469c mov ip, r3 -10002bf8: e000 b.n 10002bfc <_vsnprintf+0x118> -10002bfa: 3101 adds r1, #1 -10002bfc: 00bb lsls r3, r7, #2 -10002bfe: 19db adds r3, r3, r7 -10002c00: 005b lsls r3, r3, #1 -10002c02: 181f adds r7, r3, r0 -10002c04: 7808 ldrb r0, [r1, #0] -10002c06: 3f30 subs r7, #48 @ 0x30 -10002c08: 0003 movs r3, r0 -10002c0a: 3b30 subs r3, #48 @ 0x30 -10002c0c: 2b09 cmp r3, #9 -10002c0e: d9f4 bls.n 10002bfa <_vsnprintf+0x116> -10002c10: 4663 mov r3, ip -10002c12: 930b str r3, [sp, #44] @ 0x2c -10002c14: 2300 movs r3, #0 -10002c16: 46b8 mov r8, r7 -10002c18: 469a mov sl, r3 -10002c1a: 000f movs r7, r1 -10002c1c: 3101 adds r1, #1 -10002c1e: 282e cmp r0, #46 @ 0x2e -10002c20: d1b3 bne.n 10002b8a <_vsnprintf+0xa6> -10002c22: 2080 movs r0, #128 @ 0x80 -10002c24: 9a0b ldr r2, [sp, #44] @ 0x2c -10002c26: 00c0 lsls r0, r0, #3 -10002c28: 4302 orrs r2, r0 -10002c2a: 920b str r2, [sp, #44] @ 0x2c -10002c2c: 2230 movs r2, #48 @ 0x30 -10002c2e: 4252 negs r2, r2 -10002c30: 4694 mov ip, r2 -10002c32: 7878 ldrb r0, [r7, #1] -10002c34: 000b movs r3, r1 -10002c36: 4484 add ip, r0 -10002c38: 4662 mov r2, ip -10002c3a: 2a09 cmp r2, #9 -10002c3c: d800 bhi.n 10002c40 <_vsnprintf+0x15c> -10002c3e: e1aa b.n 10002f96 <_vsnprintf+0x4b2> -10002c40: 282a cmp r0, #42 @ 0x2a -10002c42: d100 bne.n 10002c46 <_vsnprintf+0x162> -10002c44: e1b9 b.n 10002fba <_vsnprintf+0x4d6> -10002c46: 000f movs r7, r1 -10002c48: 3101 adds r1, #1 -10002c4a: e79e b.n 10002b8a <_vsnprintf+0xa6> -10002c4c: 46a0 mov r8, r4 -10002c4e: 46aa mov sl, r5 -10002c50: 46b1 mov r9, r6 -10002c52: 45c8 cmp r8, r9 -10002c54: d303 bcc.n 10002c5e <_vsnprintf+0x17a> -10002c56: 2301 movs r3, #1 -10002c58: 425b negs r3, r3 -10002c5a: 444b add r3, r9 -10002c5c: 4698 mov r8, r3 -10002c5e: 464b mov r3, r9 -10002c60: 4642 mov r2, r8 -10002c62: 4659 mov r1, fp -10002c64: 2000 movs r0, #0 -10002c66: 47d0 blx sl -10002c68: 0020 movs r0, r4 -10002c6a: b025 add sp, #148 @ 0x94 -10002c6c: bcf0 pop {r4, r5, r6, r7} -10002c6e: 46bb mov fp, r7 -10002c70: 46b2 mov sl, r6 -10002c72: 46a9 mov r9, r5 -10002c74: 46a0 mov r8, r4 -10002c76: bdf0 pop {r4, r5, r6, r7, pc} -10002c78: 0001 movs r1, r0 -10002c7a: 3969 subs r1, #105 @ 0x69 -10002c7c: b2c9 uxtb r1, r1 -10002c7e: 290f cmp r1, #15 -10002c80: d900 bls.n 10002c84 <_vsnprintf+0x1a0> -10002c82: e750 b.n 10002b26 <_vsnprintf+0x42> -10002c84: 2301 movs r3, #1 -10002c86: 408b lsls r3, r1 -10002c88: 469c mov ip, r3 -10002c8a: 4b6b ldr r3, [pc, #428] @ (10002e38 <_vsnprintf+0x354>) -10002c8c: 4699 mov r9, r3 -10002c8e: 4663 mov r3, ip -10002c90: 464a mov r2, r9 -10002c92: 4013 ands r3, r2 -10002c94: 930f str r3, [sp, #60] @ 0x3c -10002c96: 4662 mov r2, ip -10002c98: 464b mov r3, r9 -10002c9a: 421a tst r2, r3 -10002c9c: d000 beq.n 10002ca0 <_vsnprintf+0x1bc> -10002c9e: e168 b.n 10002f72 <_vsnprintf+0x48e> -10002ca0: 290a cmp r1, #10 -10002ca2: d056 beq.n 10002d52 <_vsnprintf+0x26e> -10002ca4: 2907 cmp r1, #7 -10002ca6: d000 beq.n 10002caa <_vsnprintf+0x1c6> -10002ca8: e73d b.n 10002b26 <_vsnprintf+0x42> -10002caa: 9b0d ldr r3, [sp, #52] @ 0x34 -10002cac: cb02 ldmia r3!, {r1} -10002cae: 4698 mov r8, r3 -10002cb0: 2900 cmp r1, #0 -10002cb2: d000 beq.n 10002cb6 <_vsnprintf+0x1d2> -10002cb4: e192 b.n 10002fdc <_vsnprintf+0x4f8> -10002cb6: 9b0b ldr r3, [sp, #44] @ 0x2c -10002cb8: 2110 movs r1, #16 -10002cba: 001a movs r2, r3 -10002cbc: 438a bics r2, r1 -10002cbe: 0010 movs r0, r2 -10002cc0: 3111 adds r1, #17 -10002cc2: 4308 orrs r0, r1 -10002cc4: 4681 mov r9, r0 -10002cc6: 2080 movs r0, #128 @ 0x80 -10002cc8: 001a movs r2, r3 -10002cca: 00c0 lsls r0, r0, #3 -10002ccc: 4002 ands r2, r0 -10002cce: 0011 movs r1, r2 -10002cd0: 4203 tst r3, r0 -10002cd2: d11c bne.n 10002d0e <_vsnprintf+0x22a> -10002cd4: ab14 add r3, sp, #80 @ 0x50 -10002cd6: 469c mov ip, r3 -10002cd8: 221f movs r2, #31 -10002cda: 230f movs r3, #15 -10002cdc: 4462 add r2, ip -10002cde: 950d str r5, [sp, #52] @ 0x34 -10002ce0: 469c mov ip, r3 +1000183a: 464a mov r2, r9 +1000183c: 601a str r2, [r3, #0] +1000183e: 4642 mov r2, r8 +10001840: 605a str r2, [r3, #4] +10001842: 9a0a ldr r2, [sp, #40] @ 0x28 +10001844: 609a str r2, [r3, #8] +10001846: 9a0b ldr r2, [sp, #44] @ 0x2c +10001848: 60da str r2, [r3, #12] +1000184a: 2300 movs r3, #0 +1000184c: 708b strb r3, [r1, #2] +1000184e: 704b strb r3, [r1, #1] +10001850: 700b strb r3, [r1, #0] +10001852: 7b6b ldrb r3, [r5, #13] +10001854: 469b mov fp, r3 +10001856: 2b00 cmp r3, #0 +10001858: d026 beq.n 100018a8 +1000185a: 0022 movs r2, r4 +1000185c: 686b ldr r3, [r5, #4] +1000185e: 4659 mov r1, fp +10001860: 68a8 ldr r0, [r5, #8] +10001862: 4798 blx r3 +10001864: 465b mov r3, fp +10001866: 005b lsls r3, r3, #1 +10001868: 445b add r3, fp +1000186a: 682a ldr r2, [r5, #0] +1000186c: 3b03 subs r3, #3 +1000186e: 2800 cmp r0, #0 +10001870: d012 beq.n 10001898 +10001872: 4658 mov r0, fp +10001874: 1996 adds r6, r2, r6 +10001876: 70b0 strb r0, [r6, #2] +10001878: 18d1 adds r1, r2, r3 +1000187a: 5cd3 ldrb r3, [r2, r3] +1000187c: 2b00 cmp r3, #0 +1000187e: d000 beq.n 10001882 +10001880: 7073 strb r3, [r6, #1] +10001882: 465b mov r3, fp +10001884: 700c strb r4, [r1, #0] +10001886: 736b strb r3, [r5, #13] +10001888: 455c cmp r4, fp +1000188a: d00e beq.n 100018aa +1000188c: bcf0 pop {r4, r5, r6, r7} +1000188e: 46bb mov fp, r7 +10001890: 46b2 mov sl, r6 +10001892: 46a9 mov r9, r5 +10001894: 46a0 mov r8, r4 +10001896: bdf8 pop {r3, r4, r5, r6, r7, pc} +10001898: 18d3 adds r3, r2, r3 +1000189a: 709c strb r4, [r3, #2] +1000189c: 1991 adds r1, r2, r6 +1000189e: 5d92 ldrb r2, [r2, r6] +100018a0: 2a00 cmp r2, #0 +100018a2: d11c bne.n 100018de +100018a4: 465b mov r3, fp +100018a6: 700b strb r3, [r1, #0] +100018a8: 736c strb r4, [r5, #13] +100018aa: 464a mov r2, r9 +100018ac: 4643 mov r3, r8 +100018ae: 7d38 ldrb r0, [r7, #20] +100018b0: f000 fbec bl 1000208c +100018b4: 1e05 subs r5, r0, #0 +100018b6: d10a bne.n 100018ce +100018b8: 9b0e ldr r3, [sp, #56] @ 0x38 +100018ba: 2b00 cmp r3, #0 +100018bc: d0e6 beq.n 1000188c +100018be: 701d strb r5, [r3, #0] +100018c0: e7e4 b.n 1000188c +100018c2: 0066 lsls r6, r4, #1 +100018c4: 6829 ldr r1, [r5, #0] +100018c6: 1936 adds r6, r6, r4 +100018c8: 3e03 subs r6, #3 +100018ca: 1989 adds r1, r1, r6 +100018cc: e7b0 b.n 10001830 +100018ce: 4653 mov r3, sl +100018d0: 2b00 cmp r3, #0 +100018d2: d1f1 bne.n 100018b8 +100018d4: 0021 movs r1, r4 +100018d6: 6838 ldr r0, [r7, #0] +100018d8: f000 fdf0 bl 100024bc +100018dc: e7ec b.n 100018b8 +100018de: 705a strb r2, [r3, #1] +100018e0: 465b mov r3, fp +100018e2: 700b strb r3, [r1, #0] +100018e4: 736c strb r4, [r5, #13] +100018e6: e7e0 b.n 100018aa +100018e8: 0fffffff .word 0x0fffffff + +100018ec : +100018ec: b5f0 push {r4, r5, r6, r7, lr} +100018ee: 46de mov lr, fp +100018f0: 4657 mov r7, sl +100018f2: 464e mov r6, r9 +100018f4: 4645 mov r5, r8 +100018f6: 2300 movs r3, #0 +100018f8: b5e0 push {r5, r6, r7, lr} +100018fa: b08b sub sp, #44 @ 0x2c +100018fc: 9308 str r3, [sp, #32] +100018fe: 4b68 ldr r3, [pc, #416] @ (10001aa0 ) +10001900: 0082 lsls r2, r0, #2 +10001902: 58d4 ldr r4, [r2, r3] +10001904: 2300 movs r3, #0 +10001906: 469b mov fp, r3 +10001908: 9009 str r0, [sp, #36] @ 0x24 +1000190a: f000 fb2b bl 10001f64 +1000190e: 0002 movs r2, r0 +10001910: 000b movs r3, r1 +10001912: 6860 ldr r0, [r4, #4] +10001914: f3ef 8a10 mrs sl, PRIMASK +10001918: b672 cpsid i +1000191a: 4656 mov r6, sl +1000191c: 6801 ldr r1, [r0, #0] +1000191e: 2900 cmp r1, #0 +10001920: d0fc beq.n 1000191c +10001922: 46b2 mov sl, r6 +10001924: f3bf 8f5f dmb sy +10001928: 6821 ldr r1, [r4, #0] +1000192a: 7b4f ldrb r7, [r1, #13] +1000192c: 468c mov ip, r1 +1000192e: 2f00 cmp r7, #0 +10001930: d02e beq.n 10001990 +10001932: 68a5 ldr r5, [r4, #8] +10001934: 495b ldr r1, [pc, #364] @ (10001aa4 ) +10001936: 46a9 mov r9, r5 +10001938: 1879 adds r1, r7, r1 +1000193a: 0109 lsls r1, r1, #4 +1000193c: 4489 add r9, r1 +1000193e: 4649 mov r1, r9 +10001940: 6808 ldr r0, [r1, #0] +10001942: 6849 ldr r1, [r1, #4] +10001944: 0005 movs r5, r0 +10001946: 000e movs r6, r1 +10001948: 1aad subs r5, r5, r2 +1000194a: 419e sbcs r6, r3 +1000194c: 2e00 cmp r6, #0 +1000194e: dd5f ble.n 10001a10 +10001950: 0002 movs r2, r0 +10001952: 000b movs r3, r1 +10001954: 9809 ldr r0, [sp, #36] @ 0x24 +10001956: f000 fb99 bl 1000208c +1000195a: 2300 movs r3, #0 +1000195c: 2200 movs r2, #0 +1000195e: 4699 mov r9, r3 +10001960: 2300 movs r3, #0 +10001962: 9206 str r2, [sp, #24] +10001964: 9307 str r3, [sp, #28] +10001966: 2300 movs r3, #0 +10001968: 4698 mov r8, r3 +1000196a: 6863 ldr r3, [r4, #4] +1000196c: f3bf 8f5f dmb sy +10001970: 465a mov r2, fp +10001972: 601a str r2, [r3, #0] +10001974: f38a 8810 msr PRIMASK, sl +10001978: 4643 mov r3, r8 +1000197a: 2b00 cmp r3, #0 +1000197c: d112 bne.n 100019a4 +1000197e: 2800 cmp r0, #0 +10001980: d1c3 bne.n 1000190a +10001982: b00b add sp, #44 @ 0x2c +10001984: bcf0 pop {r4, r5, r6, r7} +10001986: 46bb mov fp, r7 +10001988: 46b2 mov sl, r6 +1000198a: 46a9 mov r9, r5 +1000198c: 46a0 mov r8, r4 +1000198e: bdf0 pop {r4, r5, r6, r7, pc} +10001990: 2300 movs r3, #0 +10001992: 2200 movs r2, #0 +10001994: 4699 mov r9, r3 +10001996: 2300 movs r3, #0 +10001998: 9206 str r2, [sp, #24] +1000199a: 9307 str r3, [sp, #28] +1000199c: 2300 movs r3, #0 +1000199e: 2000 movs r0, #0 +100019a0: 4698 mov r8, r3 +100019a2: e7e2 b.n 1000196a +100019a4: 9b08 ldr r3, [sp, #32] +100019a6: 4649 mov r1, r9 +100019a8: 0218 lsls r0, r3, #8 +100019aa: 4338 orrs r0, r7 +100019ac: 47c0 blx r8 +100019ae: 6862 ldr r2, [r4, #4] +100019b0: 0005 movs r5, r0 +100019b2: 000e movs r6, r1 +100019b4: f3ef 8a10 mrs sl, PRIMASK +100019b8: b672 cpsid i +100019ba: 6813 ldr r3, [r2, #0] +100019bc: 2b00 cmp r3, #0 +100019be: d0fc beq.n 100019ba +100019c0: f3bf 8f5f dmb sy +100019c4: 2e00 cmp r6, #0 +100019c6: db41 blt.n 10001a4c +100019c8: 002b movs r3, r5 +100019ca: 4333 orrs r3, r6 +100019cc: d002 beq.n 100019d4 +100019ce: 6923 ldr r3, [r4, #16] +100019d0: 2b00 cmp r3, #0 +100019d2: d156 bne.n 10001a82 +100019d4: 6823 ldr r3, [r4, #0] +100019d6: 7bd9 ldrb r1, [r3, #15] +100019d8: 2900 cmp r1, #0 +100019da: d005 beq.n 100019e8 +100019dc: 681a ldr r2, [r3, #0] +100019de: 0048 lsls r0, r1, #1 +100019e0: 1841 adds r1, r0, r1 +100019e2: 1852 adds r2, r2, r1 +100019e4: 3a03 subs r2, #3 +100019e6: 7057 strb r7, [r2, #1] +100019e8: 7b9a ldrb r2, [r3, #14] +100019ea: 2a00 cmp r2, #0 +100019ec: d100 bne.n 100019f0 +100019ee: 739f strb r7, [r3, #14] +100019f0: 73df strb r7, [r3, #15] +100019f2: 68e2 ldr r2, [r4, #12] +100019f4: 3f01 subs r7, #1 +100019f6: 5dd3 ldrb r3, [r2, r7] +100019f8: 3301 adds r3, #1 +100019fa: 55d3 strb r3, [r2, r7] +100019fc: 465b mov r3, fp +100019fe: 6123 str r3, [r4, #16] +10001a00: 6863 ldr r3, [r4, #4] +10001a02: f3bf 8f5f dmb sy +10001a06: 465a mov r2, fp +10001a08: 601a str r2, [r3, #0] +10001a0a: f38a 8810 msr PRIMASK, sl +10001a0e: e77c b.n 1000190a +10001a10: 2e00 cmp r6, #0 +10001a12: d102 bne.n 10001a1a +10001a14: 2d00 cmp r5, #0 +10001a16: d000 beq.n 10001a1a +10001a18: e79a b.n 10001950 +10001a1a: 2100 movs r1, #0 +10001a1c: 4660 mov r0, ip +10001a1e: f000 fccb bl 100023b8 +10001a22: 464b mov r3, r9 +10001a24: 681a ldr r2, [r3, #0] +10001a26: 685b ldr r3, [r3, #4] +10001a28: 9206 str r2, [sp, #24] +10001a2a: 9307 str r3, [sp, #28] +10001a2c: 464b mov r3, r9 +10001a2e: 689b ldr r3, [r3, #8] +10001a30: 4698 mov r8, r3 +10001a32: 464b mov r3, r9 +10001a34: 68db ldr r3, [r3, #12] +10001a36: 4699 mov r9, r3 +10001a38: 68e3 ldr r3, [r4, #12] +10001a3a: 19db adds r3, r3, r7 +10001a3c: 3b01 subs r3, #1 +10001a3e: 781b ldrb r3, [r3, #0] +10001a40: 9308 str r3, [sp, #32] +10001a42: 021b lsls r3, r3, #8 +10001a44: 4303 orrs r3, r0 +10001a46: 6123 str r3, [r4, #16] +10001a48: 2000 movs r0, #0 +10001a4a: e78e b.n 1000196a +10001a4c: 6923 ldr r3, [r4, #16] +10001a4e: 2b00 cmp r3, #0 +10001a50: d0c0 beq.n 100019d4 +10001a52: 9a06 ldr r2, [sp, #24] +10001a54: 9b07 ldr r3, [sp, #28] +10001a56: 2180 movs r1, #128 @ 0x80 +10001a58: 1b52 subs r2, r2, r5 +10001a5a: 41b3 sbcs r3, r6 +10001a5c: 0609 lsls r1, r1, #24 +10001a5e: 428b cmp r3, r1 +10001a60: d302 bcc.n 10001a68 +10001a62: 2201 movs r2, #1 +10001a64: 4b10 ldr r3, [pc, #64] @ (10001aa8 ) +10001a66: 4252 negs r2, r2 +10001a68: 2100 movs r1, #0 +10001a6a: 9104 str r1, [sp, #16] +10001a6c: 3101 adds r1, #1 +10001a6e: 9103 str r1, [sp, #12] +10001a70: 4649 mov r1, r9 +10001a72: 9101 str r1, [sp, #4] +10001a74: 4641 mov r1, r8 +10001a76: 0020 movs r0, r4 +10001a78: 9702 str r7, [sp, #8] +10001a7a: 9100 str r1, [sp, #0] +10001a7c: f7ff feb6 bl 100017ec +10001a80: e7bc b.n 100019fc +10001a82: f000 fa6f bl 10001f64 +10001a86: 002a movs r2, r5 +10001a88: 0033 movs r3, r6 +10001a8a: 1812 adds r2, r2, r0 +10001a8c: 414b adcs r3, r1 +10001a8e: 2180 movs r1, #128 @ 0x80 +10001a90: 0609 lsls r1, r1, #24 +10001a92: 428b cmp r3, r1 +10001a94: d3e8 bcc.n 10001a68 +10001a96: 2201 movs r2, #1 +10001a98: 4b03 ldr r3, [pc, #12] @ (10001aa8 ) +10001a9a: 4252 negs r2, r2 +10001a9c: e7e4 b.n 10001a68 +10001a9e: 46c0 nop @ (mov r8, r8) +10001aa0: 20001d10 .word 0x20001d10 +10001aa4: 0fffffff .word 0x0fffffff +10001aa8: 7fffffff .word 0x7fffffff + +10001aac : +10001aac: b510 push {r4, lr} +10001aae: 4c14 ldr r4, [pc, #80] @ (10001b00 ) +10001ab0: 6863 ldr r3, [r4, #4] +10001ab2: 2b00 cmp r3, #0 +10001ab4: d004 beq.n 10001ac0 +10001ab6: 210a movs r1, #10 +10001ab8: 4812 ldr r0, [pc, #72] @ (10001b04 ) +10001aba: f7ff fe29 bl 10001710 +10001abe: bd10 pop {r4, pc} +10001ac0: 0023 movs r3, r4 +10001ac2: 4a11 ldr r2, [pc, #68] @ (10001b08 ) +10001ac4: 2110 movs r1, #16 +10001ac6: 6820 ldr r0, [r4, #0] +10001ac8: f000 fb92 bl 100021f0 +10001acc: 2003 movs r0, #3 +10001ace: f000 fa3d bl 10001f4c +10001ad2: 2003 movs r0, #3 +10001ad4: f000 fb42 bl 1000215c +10001ad8: 2003 movs r0, #3 +10001ada: 490c ldr r1, [pc, #48] @ (10001b0c ) +10001adc: f000 fa90 bl 10002000 +10001ae0: f7ff fb38 bl 10001154 +10001ae4: 4b0a ldr r3, [pc, #40] @ (10001b10 ) +10001ae6: 469c mov ip, r3 +10001ae8: 2303 movs r3, #3 +10001aea: 7523 strb r3, [r4, #20] +10001aec: 23d0 movs r3, #208 @ 0xd0 +10001aee: 061b lsls r3, r3, #24 +10001af0: 681b ldr r3, [r3, #0] +10001af2: 4460 add r0, ip +10001af4: 7563 strb r3, [r4, #21] +10001af6: 4b07 ldr r3, [pc, #28] @ (10001b14 ) +10001af8: 0080 lsls r0, r0, #2 +10001afa: 6060 str r0, [r4, #4] +10001afc: 60dc str r4, [r3, #12] +10001afe: e7da b.n 10001ab6 +10001b00: 20000ef4 .word 0x20000ef4 +10001b04: 20001d2c .word 0x20001d2c +10001b08: 10001789 .word 0x10001789 +10001b0c: 100018ed .word 0x100018ed +10001b10: 34000040 .word 0x34000040 +10001b14: 20001d10 .word 0x20001d10 + +10001b18 : +10001b18: 4800 ldr r0, [pc, #0] @ (10001b1c ) +10001b1a: 4770 bx lr +10001b1c: 20000ef4 .word 0x20000ef4 + +10001b20 : +10001b20: b5f0 push {r4, r5, r6, r7, lr} +10001b22: 4657 mov r7, sl +10001b24: 464e mov r6, r9 +10001b26: 4645 mov r5, r8 +10001b28: 46de mov lr, fp +10001b2a: b5e0 push {r5, r6, r7, lr} +10001b2c: b085 sub sp, #20 +10001b2e: 9301 str r3, [sp, #4] +10001b30: ab10 add r3, sp, #64 @ 0x40 +10001b32: 781b ldrb r3, [r3, #0] +10001b34: 0006 movs r6, r0 +10001b36: 9303 str r3, [sp, #12] +10001b38: 2300 movs r3, #0 +10001b3a: 469a mov sl, r3 +10001b3c: 4698 mov r8, r3 +10001b3e: 9200 str r2, [sp, #0] +10001b40: 6872 ldr r2, [r6, #4] +10001b42: f3ef 8b10 mrs fp, PRIMASK +10001b46: b672 cpsid i +10001b48: 6813 ldr r3, [r2, #0] +10001b4a: 2b00 cmp r3, #0 +10001b4c: d0fc beq.n 10001b48 +10001b4e: f3bf 8f5f dmb sy +10001b52: 6835 ldr r5, [r6, #0] +10001b54: 7bac ldrb r4, [r5, #14] +10001b56: 2c00 cmp r4, #0 +10001b58: d100 bne.n 10001b5c +10001b5a: e06e b.n 10001c3a +10001b5c: 0067 lsls r7, r4, #1 +10001b5e: 682b ldr r3, [r5, #0] +10001b60: 193f adds r7, r7, r4 +10001b62: 3f03 subs r7, #3 +10001b64: 19db adds r3, r3, r7 +10001b66: 785a ldrb r2, [r3, #1] +10001b68: 73aa strb r2, [r5, #14] +10001b6a: 2a00 cmp r2, #0 +10001b6c: d100 bne.n 10001b70 +10001b6e: 73ea strb r2, [r5, #15] +10001b70: 4a48 ldr r2, [pc, #288] @ (10001c94 ) +10001b72: 18a1 adds r1, r4, r2 +10001b74: 68b2 ldr r2, [r6, #8] +10001b76: 0109 lsls r1, r1, #4 +10001b78: 1852 adds r2, r2, r1 +10001b7a: 9800 ldr r0, [sp, #0] +10001b7c: 9901 ldr r1, [sp, #4] +10001b7e: 6010 str r0, [r2, #0] +10001b80: 6051 str r1, [r2, #4] +10001b82: 990e ldr r1, [sp, #56] @ 0x38 +10001b84: 6091 str r1, [r2, #8] +10001b86: 990f ldr r1, [sp, #60] @ 0x3c +10001b88: 60d1 str r1, [r2, #12] +10001b8a: 4642 mov r2, r8 +10001b8c: 709a strb r2, [r3, #2] +10001b8e: 705a strb r2, [r3, #1] +10001b90: 701a strb r2, [r3, #0] +10001b92: 7b6b ldrb r3, [r5, #13] +10001b94: 4699 mov r9, r3 +10001b96: 2b00 cmp r3, #0 +10001b98: d100 bne.n 10001b9c +10001b9a: e06b b.n 10001c74 +10001b9c: 0022 movs r2, r4 +10001b9e: 686b ldr r3, [r5, #4] +10001ba0: 4649 mov r1, r9 +10001ba2: 68a8 ldr r0, [r5, #8] +10001ba4: 4798 blx r3 +10001ba6: 464b mov r3, r9 +10001ba8: 005b lsls r3, r3, #1 +10001baa: 444b add r3, r9 +10001bac: 682a ldr r2, [r5, #0] +10001bae: 3b03 subs r3, #3 +10001bb0: 2800 cmp r0, #0 +10001bb2: d056 beq.n 10001c62 +10001bb4: 4648 mov r0, r9 +10001bb6: 19d7 adds r7, r2, r7 +10001bb8: 70b8 strb r0, [r7, #2] +10001bba: 18d1 adds r1, r2, r3 +10001bbc: 5cd3 ldrb r3, [r2, r3] +10001bbe: 2b00 cmp r3, #0 +10001bc0: d000 beq.n 10001bc4 +10001bc2: 707b strb r3, [r7, #1] +10001bc4: 464b mov r3, r9 +10001bc6: 700c strb r4, [r1, #0] +10001bc8: 736b strb r3, [r5, #13] +10001bca: 454c cmp r4, r9 +10001bcc: d053 beq.n 10001c76 +10001bce: 68f3 ldr r3, [r6, #12] +10001bd0: 191b adds r3, r3, r4 +10001bd2: 3b01 subs r3, #1 +10001bd4: 7818 ldrb r0, [r3, #0] +10001bd6: 6873 ldr r3, [r6, #4] +10001bd8: f3bf 8f5f dmb sy +10001bdc: 4642 mov r2, r8 +10001bde: 601a str r2, [r3, #0] +10001be0: f38b 8810 msr PRIMASK, fp +10001be4: 4653 mov r3, sl +10001be6: 2b00 cmp r3, #0 +10001be8: d108 bne.n 10001bfc +10001bea: 0200 lsls r0, r0, #8 +10001bec: 4320 orrs r0, r4 +10001bee: b005 add sp, #20 +10001bf0: bcf0 pop {r4, r5, r6, r7} +10001bf2: 46bb mov fp, r7 +10001bf4: 46b2 mov sl, r6 +10001bf6: 46a9 mov r9, r5 +10001bf8: 46a0 mov r8, r4 +10001bfa: bdf0 pop {r4, r5, r6, r7, pc} +10001bfc: 9b03 ldr r3, [sp, #12] +10001bfe: 2b00 cmp r3, #0 +10001c00: d046 beq.n 10001c90 +10001c02: 9b0e ldr r3, [sp, #56] @ 0x38 +10001c04: 2000 movs r0, #0 +10001c06: 990f ldr r1, [sp, #60] @ 0x3c +10001c08: 4798 blx r3 +10001c0a: 0003 movs r3, r0 +10001c0c: 430b orrs r3, r1 +10001c0e: d03f beq.n 10001c90 +10001c10: 0004 movs r4, r0 +10001c12: 1e0d subs r5, r1, #0 +10001c14: da1a bge.n 10001c4c +10001c16: 9a00 ldr r2, [sp, #0] +10001c18: 9b01 ldr r3, [sp, #4] +10001c1a: 1b12 subs r2, r2, r4 +10001c1c: 41ab sbcs r3, r5 +10001c1e: 9200 str r2, [sp, #0] +10001c20: 9301 str r3, [sp, #4] +10001c22: 2280 movs r2, #128 @ 0x80 +10001c24: 0612 lsls r2, r2, #24 +10001c26: 4293 cmp r3, r2 +10001c28: d304 bcc.n 10001c34 +10001c2a: 2301 movs r3, #1 +10001c2c: 4c1a ldr r4, [pc, #104] @ (10001c98 ) +10001c2e: 425b negs r3, r3 +10001c30: 9300 str r3, [sp, #0] +10001c32: 9401 str r4, [sp, #4] +10001c34: 9b03 ldr r3, [sp, #12] +10001c36: 469a mov sl, r3 +10001c38: e782 b.n 10001b40 +10001c3a: 6873 ldr r3, [r6, #4] +10001c3c: f3bf 8f5f dmb sy +10001c40: 601c str r4, [r3, #0] +10001c42: f38b 8810 msr PRIMASK, fp +10001c46: 2001 movs r0, #1 +10001c48: 4240 negs r0, r0 +10001c4a: e7d0 b.n 10001bee +10001c4c: f000 f98a bl 10001f64 +10001c50: 2280 movs r2, #128 @ 0x80 +10001c52: 1900 adds r0, r0, r4 +10001c54: 4169 adcs r1, r5 +10001c56: 0612 lsls r2, r2, #24 +10001c58: 9000 str r0, [sp, #0] +10001c5a: 9101 str r1, [sp, #4] +10001c5c: 4291 cmp r1, r2 +10001c5e: d3e9 bcc.n 10001c34 +10001c60: e7e3 b.n 10001c2a +10001c62: 18d3 adds r3, r2, r3 +10001c64: 709c strb r4, [r3, #2] +10001c66: 19d1 adds r1, r2, r7 +10001c68: 5dd2 ldrb r2, [r2, r7] +10001c6a: 2a00 cmp r2, #0 +10001c6c: d000 beq.n 10001c70 +10001c6e: 705a strb r2, [r3, #1] +10001c70: 464b mov r3, r9 +10001c72: 700b strb r3, [r1, #0] +10001c74: 736c strb r4, [r5, #13] +10001c76: 7d30 ldrb r0, [r6, #20] +10001c78: 9a00 ldr r2, [sp, #0] +10001c7a: 9b01 ldr r3, [sp, #4] +10001c7c: f000 fa06 bl 1000208c +10001c80: 4682 mov sl, r0 +10001c82: 2800 cmp r0, #0 +10001c84: d0a3 beq.n 10001bce +10001c86: 0021 movs r1, r4 +10001c88: 6830 ldr r0, [r6, #0] +10001c8a: f000 fc17 bl 100024bc +10001c8e: e79e b.n 10001bce +10001c90: 2000 movs r0, #0 +10001c92: e7ac b.n 10001bee +10001c94: 0fffffff .word 0x0fffffff +10001c98: 7fffffff .word 0x7fffffff + +10001c9c : +10001c9c: 7d40 ldrb r0, [r0, #21] +10001c9e: 4770 bx lr + +10001ca0 : +10001ca0: b5f0 push {r4, r5, r6, r7, lr} +10001ca2: 0004 movs r4, r0 +10001ca4: 000d movs r5, r1 +10001ca6: 2606 movs r6, #6 +10001ca8: 4276 negs r6, r6 +10001caa: 17f7 asrs r7, r6, #31 +10001cac: 46c6 mov lr, r8 +10001cae: 1936 adds r6, r6, r4 +10001cb0: 416f adcs r7, r5 +10001cb2: b500 push {lr} +10001cb4: b084 sub sp, #16 +10001cb6: 428f cmp r7, r1 +10001cb8: d814 bhi.n 10001ce4 +10001cba: d011 beq.n 10001ce0 +10001cbc: f000 f952 bl 10001f64 +10001cc0: 0032 movs r2, r6 +10001cc2: 003b movs r3, r7 +10001cc4: 1a12 subs r2, r2, r0 +10001cc6: 418b sbcs r3, r1 +10001cc8: 2b00 cmp r3, #0 +10001cca: dc15 bgt.n 10001cf8 +10001ccc: 2b00 cmp r3, #0 +10001cce: d03e beq.n 10001d4e +10001cd0: 0020 movs r0, r4 +10001cd2: 0029 movs r1, r5 +10001cd4: f000 f984 bl 10001fe0 +10001cd8: b004 add sp, #16 +10001cda: bc80 pop {r7} +10001cdc: 46b8 mov r8, r7 +10001cde: bdf0 pop {r4, r5, r6, r7, pc} +10001ce0: 4286 cmp r6, r0 +10001ce2: d9eb bls.n 10001cbc +10001ce4: 2600 movs r6, #0 +10001ce6: 2700 movs r7, #0 +10001ce8: f000 f93c bl 10001f64 +10001cec: 0032 movs r2, r6 +10001cee: 003b movs r3, r7 +10001cf0: 1a12 subs r2, r2, r0 +10001cf2: 418b sbcs r3, r1 +10001cf4: 2b00 cmp r3, #0 +10001cf6: dde9 ble.n 10001ccc +10001cf8: 2300 movs r3, #0 +10001cfa: 9302 str r3, [sp, #8] +10001cfc: 9301 str r3, [sp, #4] +10001cfe: 4b15 ldr r3, [pc, #84] @ (10001d54 ) +10001d00: 0032 movs r2, r6 +10001d02: 9300 str r3, [sp, #0] +10001d04: 4814 ldr r0, [pc, #80] @ (10001d58 ) +10001d06: 003b movs r3, r7 +10001d08: f7ff ff0a bl 10001b20 +10001d0c: 2800 cmp r0, #0 +10001d0e: dbdf blt.n 10001cd0 +10001d10: 2300 movs r3, #0 +10001d12: 4698 mov r8, r3 +10001d14: 46bc mov ip, r7 +10001d16: 4a11 ldr r2, [pc, #68] @ (10001d5c ) +10001d18: 4f11 ldr r7, [pc, #68] @ (10001d60 ) +10001d1a: 6a7b ldr r3, [r7, #36] @ 0x24 +10001d1c: 459c cmp ip, r3 +10001d1e: d804 bhi.n 10001d2a +10001d20: 6ab9 ldr r1, [r7, #40] @ 0x28 +10001d22: 428e cmp r6, r1 +10001d24: d9d4 bls.n 10001cd0 +10001d26: 459c cmp ip, r3 +10001d28: d1d2 bne.n 10001cd0 +10001d2a: 6811 ldr r1, [r2, #0] +10001d2c: f3ef 8010 mrs r0, PRIMASK +10001d30: b672 cpsid i +10001d32: 680b ldr r3, [r1, #0] +10001d34: 2b00 cmp r3, #0 +10001d36: d0fc beq.n 10001d32 +10001d38: f3bf 8f5f dmb sy +10001d3c: 6813 ldr r3, [r2, #0] +10001d3e: f3bf 8f5f dmb sy +10001d42: 4641 mov r1, r8 +10001d44: 6019 str r1, [r3, #0] +10001d46: f380 8810 msr PRIMASK, r0 +10001d4a: bf20 wfe +10001d4c: e7e5 b.n 10001d1a +10001d4e: 2a00 cmp r2, #0 +10001d50: d0be beq.n 10001cd0 +10001d52: e7d1 b.n 10001cf8 +10001d54: 100017bd .word 0x100017bd +10001d58: 20000ef4 .word 0x20000ef4 +10001d5c: 20001d2c .word 0x20001d2c +10001d60: 40054000 .word 0x40054000 + +10001d64 : +10001d64: b570 push {r4, r5, r6, lr} +10001d66: 0004 movs r4, r0 +10001d68: 000d movs r5, r1 +10001d6a: f000 f8fb bl 10001f64 +10001d6e: 2380 movs r3, #128 @ 0x80 +10001d70: 1900 adds r0, r0, r4 +10001d72: 4169 adcs r1, r5 +10001d74: 061b lsls r3, r3, #24 +10001d76: 4299 cmp r1, r3 +10001d78: d302 bcc.n 10001d80 +10001d7a: 2001 movs r0, #1 +10001d7c: 4902 ldr r1, [pc, #8] @ (10001d88 ) +10001d7e: 4240 negs r0, r0 +10001d80: f7ff ff8e bl 10001ca0 +10001d84: bd70 pop {r4, r5, r6, pc} +10001d86: 46c0 nop @ (mov r8, r8) +10001d88: 7fffffff .word 0x7fffffff + +10001d8c : +10001d8c: b570 push {r4, r5, r6, lr} +10001d8e: 0006 movs r6, r0 +10001d90: f000 f8e8 bl 10001f64 +10001d94: 22fa movs r2, #250 @ 0xfa +10001d96: 0004 movs r4, r0 +10001d98: 000d movs r5, r1 +10001d9a: 2300 movs r3, #0 +10001d9c: 0030 movs r0, r6 +10001d9e: 2100 movs r1, #0 +10001da0: 0092 lsls r2, r2, #2 +10001da2: f003 f977 bl 10005094 <__wrap___aeabi_lmul> +10001da6: 2380 movs r3, #128 @ 0x80 +10001da8: 1900 adds r0, r0, r4 +10001daa: 4169 adcs r1, r5 +10001dac: 061b lsls r3, r3, #24 +10001dae: 4299 cmp r1, r3 +10001db0: d302 bcc.n 10001db8 +10001db2: 2001 movs r0, #1 +10001db4: 4902 ldr r1, [pc, #8] @ (10001dc0 ) +10001db6: 4240 negs r0, r0 +10001db8: f7ff ff72 bl 10001ca0 +10001dbc: bd70 pop {r4, r5, r6, pc} +10001dbe: 46c0 nop @ (mov r8, r8) +10001dc0: 7fffffff .word 0x7fffffff + +10001dc4 : +10001dc4: b5f0 push {r4, r5, r6, r7, lr} +10001dc6: f3ef 8305 mrs r3, IPSR +10001dca: 46ce mov lr, r9 +10001dcc: 4647 mov r7, r8 +10001dce: b580 push {r7, lr} +10001dd0: 0005 movs r5, r0 +10001dd2: 000c movs r4, r1 +10001dd4: b085 sub sp, #20 +10001dd6: 2b00 cmp r3, #0 +10001dd8: d012 beq.n 10001e00 +10001dda: 4a2a ldr r2, [pc, #168] @ (10001e84 ) +10001ddc: 2000 movs r0, #0 +10001dde: 6a53 ldr r3, [r2, #36] @ 0x24 +10001de0: 42a3 cmp r3, r4 +10001de2: d303 bcc.n 10001dec +10001de4: 6a92 ldr r2, [r2, #40] @ 0x28 +10001de6: 3001 adds r0, #1 +10001de8: 42aa cmp r2, r5 +10001dea: d304 bcc.n 10001df6 +10001dec: b005 add sp, #20 +10001dee: bcc0 pop {r6, r7} +10001df0: 46b9 mov r9, r7 +10001df2: 46b0 mov r8, r6 +10001df4: bdf0 pop {r4, r5, r6, r7, pc} +10001df6: 1b1b subs r3, r3, r4 +10001df8: 1e5a subs r2, r3, #1 +10001dfa: 4193 sbcs r3, r2 +10001dfc: b2d8 uxtb r0, r3 +10001dfe: e7f5 b.n 10001dec +10001e00: 4e21 ldr r6, [pc, #132] @ (10001e88 ) +10001e02: 9302 str r3, [sp, #8] +10001e04: 9301 str r3, [sp, #4] +10001e06: 4b21 ldr r3, [pc, #132] @ (10001e8c ) +10001e08: 0002 movs r2, r0 +10001e0a: 9300 str r3, [sp, #0] +10001e0c: 0030 movs r0, r6 +10001e0e: 000b movs r3, r1 +10001e10: f7ff fe86 bl 10001b20 +10001e14: 1e03 subs r3, r0, #0 +10001e16: dde0 ble.n 10001dda +10001e18: bf20 wfe +10001e1a: 6871 ldr r1, [r6, #4] +10001e1c: f3ef 8710 mrs r7, PRIMASK +10001e20: b672 cpsid i +10001e22: 680a ldr r2, [r1, #0] +10001e24: 2a00 cmp r2, #0 +10001e26: d0fc beq.n 10001e22 +10001e28: f3bf 8f5f dmb sy +10001e2c: b2da uxtb r2, r3 +10001e2e: 4694 mov ip, r2 +10001e30: 22ff movs r2, #255 @ 0xff +10001e32: 6830 ldr r0, [r6, #0] +10001e34: 401a ands r2, r3 +10001e36: 7b41 ldrb r1, [r0, #13] +10001e38: 4561 cmp r1, ip +10001e3a: d00f beq.n 10001e5c +10001e3c: 6801 ldr r1, [r0, #0] +10001e3e: 4689 mov r9, r1 +10001e40: 0051 lsls r1, r2, #1 +10001e42: 4688 mov r8, r1 +10001e44: 4649 mov r1, r9 +10001e46: 4490 add r8, r2 +10001e48: 4441 add r1, r8 +10001e4a: 3903 subs r1, #3 +10001e4c: 7889 ldrb r1, [r1, #2] +10001e4e: 2900 cmp r1, #0 +10001e50: d104 bne.n 10001e5c +10001e52: 6932 ldr r2, [r6, #16] +10001e54: 4293 cmp r3, r2 +10001e56: d109 bne.n 10001e6c +10001e58: 6131 str r1, [r6, #16] +10001e5a: e007 b.n 10001e6c +10001e5c: 68f1 ldr r1, [r6, #12] +10001e5e: 0a1b lsrs r3, r3, #8 +10001e60: 188a adds r2, r1, r2 +10001e62: 3a01 subs r2, #1 +10001e64: 7812 ldrb r2, [r2, #0] +10001e66: b2db uxtb r3, r3 +10001e68: 429a cmp r2, r3 +10001e6a: d007 beq.n 10001e7c +10001e6c: 6873 ldr r3, [r6, #4] +10001e6e: f3bf 8f5f dmb sy +10001e72: 2200 movs r2, #0 +10001e74: 601a str r2, [r3, #0] +10001e76: f387 8810 msr PRIMASK, r7 +10001e7a: e7ae b.n 10001dda +10001e7c: 4661 mov r1, ip +10001e7e: f000 fb1d bl 100024bc +10001e82: e7f3 b.n 10001e6c +10001e84: 40054000 .word 0x40054000 +10001e88: 20000ef4 .word 0x20000ef4 +10001e8c: 100017bd .word 0x100017bd + +10001e90 : +10001e90: b5f0 push {r4, r5, r6, r7, lr} +10001e92: f3ef 8205 mrs r2, IPSR +10001e96: 46d6 mov lr, sl +10001e98: 464f mov r7, r9 +10001e9a: 4646 mov r6, r8 +10001e9c: 0010 movs r0, r2 +10001e9e: b5c0 push {r6, r7, lr} +10001ea0: 3810 subs r0, #16 +10001ea2: f3ef 8810 mrs r8, PRIMASK +10001ea6: b672 cpsid i +10001ea8: 4c21 ldr r4, [pc, #132] @ (10001f30 ) +10001eaa: 6823 ldr r3, [r4, #0] +10001eac: 2b00 cmp r3, #0 +10001eae: d0fc beq.n 10001eaa +10001eb0: f3bf 8f5f dmb sy +10001eb4: 2301 movs r3, #1 +10001eb6: 0019 movs r1, r3 +10001eb8: 4081 lsls r1, r0 +10001eba: 4d1e ldr r5, [pc, #120] @ (10001f34 ) +10001ebc: 001f movs r7, r3 +10001ebe: 6369 str r1, [r5, #52] @ 0x34 +10001ec0: 46aa mov sl, r5 +10001ec2: 4d1d ldr r5, [pc, #116] @ (10001f38 ) +10001ec4: 6029 str r1, [r5, #0] +10001ec6: 4d1d ldr r5, [pc, #116] @ (10001f3c ) +10001ec8: 782e ldrb r6, [r5, #0] +10001eca: 46ac mov ip, r5 +10001ecc: 0035 movs r5, r6 +10001ece: 40c5 lsrs r5, r0 +10001ed0: 402f ands r7, r5 +10001ed2: 422b tst r3, r5 +10001ed4: d015 beq.n 10001f02 +10001ed6: 4653 mov r3, sl +10001ed8: 6a5f ldr r7, [r3, #36] @ 0x24 +10001eda: 4b19 ldr r3, [pc, #100] @ (10001f40 ) +10001edc: 0085 lsls r5, r0, #2 +10001ede: 58eb ldr r3, [r5, r3] +10001ee0: 429f cmp r7, r3 +10001ee2: d318 bcc.n 10001f16 +10001ee4: 4662 mov r2, ip +10001ee6: 4b17 ldr r3, [pc, #92] @ (10001f44 ) +10001ee8: 438e bics r6, r1 +10001eea: 58eb ldr r3, [r5, r3] +10001eec: 7016 strb r6, [r2, #0] +10001eee: f3bf 8f5f dmb sy +10001ef2: 2200 movs r2, #0 +10001ef4: 6022 str r2, [r4, #0] +10001ef6: f388 8810 msr PRIMASK, r8 +10001efa: 2b00 cmp r3, #0 +10001efc: d006 beq.n 10001f0c +10001efe: 4798 blx r3 +10001f00: e004 b.n 10001f0c +10001f02: f3bf 8f5f dmb sy +10001f06: 6027 str r7, [r4, #0] +10001f08: f388 8810 msr PRIMASK, r8 +10001f0c: bce0 pop {r5, r6, r7} +10001f0e: 46ba mov sl, r7 +10001f10: 46b1 mov r9, r6 +10001f12: 46a8 mov r8, r5 +10001f14: bdf0 pop {r4, r5, r6, r7, pc} +10001f16: 4b0c ldr r3, [pc, #48] @ (10001f48 ) +10001f18: 0092 lsls r2, r2, #2 +10001f1a: 469c mov ip, r3 +10001f1c: 4462 add r2, ip +10001f1e: 6813 ldr r3, [r2, #0] +10001f20: 6013 str r3, [r2, #0] +10001f22: f3bf 8f5f dmb sy +10001f26: 2300 movs r3, #0 +10001f28: 6023 str r3, [r4, #0] +10001f2a: f388 8810 msr PRIMASK, r8 +10001f2e: e7ed b.n 10001f0c +10001f30: d0000128 .word 0xd0000128 +10001f34: 40054000 .word 0x40054000 +10001f38: 4005703c .word 0x4005703c +10001f3c: 20001d69 .word 0x20001d69 +10001f40: 20001d38 .word 0x20001d38 +10001f44: 20001734 .word 0x20001734 +10001f48: 40053fd0 .word 0x40053fd0 + +10001f4c : +10001f4c: b510 push {r4, lr} +10001f4e: 4b03 ldr r3, [pc, #12] @ (10001f5c ) +10001f50: 0001 movs r1, r0 +10001f52: 0018 movs r0, r3 +10001f54: 4a02 ldr r2, [pc, #8] @ (10001f60 ) +10001f56: f7ff f87f bl 10001058 +10001f5a: bd10 pop {r4, pc} +10001f5c: 20001d64 .word 0x20001d64 +10001f60: 10007cd0 .word 0x10007cd0 + +10001f64 : +10001f64: 4b03 ldr r3, [pc, #12] @ (10001f74 ) +10001f66: 6a59 ldr r1, [r3, #36] @ 0x24 +10001f68: 000a movs r2, r1 +10001f6a: 6a98 ldr r0, [r3, #40] @ 0x28 +10001f6c: 6a59 ldr r1, [r3, #36] @ 0x24 +10001f6e: 428a cmp r2, r1 +10001f70: d1fa bne.n 10001f68 +10001f72: 4770 bx lr +10001f74: 40054000 .word 0x40054000 + +10001f78 : +10001f78: b570 push {r4, r5, r6, lr} +10001f7a: 0004 movs r4, r0 +10001f7c: 000d movs r5, r1 +10001f7e: 4a17 ldr r2, [pc, #92] @ (10001fdc ) +10001f80: 6a53 ldr r3, [r2, #36] @ 0x24 +10001f82: 0019 movs r1, r3 +10001f84: 6a96 ldr r6, [r2, #40] @ 0x28 +10001f86: 6a53 ldr r3, [r2, #36] @ 0x24 +10001f88: 428b cmp r3, r1 +10001f8a: d1fa bne.n 10001f82 +10001f8c: 0030 movs r0, r6 +10001f8e: 0019 movs r1, r3 +10001f90: 1824 adds r4, r4, r0 +10001f92: 414d adcs r5, r1 +10001f94: 42ab cmp r3, r5 +10001f96: d816 bhi.n 10001fc6 +10001f98: d013 beq.n 10001fc2 +10001f9a: 4b10 ldr r3, [pc, #64] @ (10001fdc ) +10001f9c: 002a movs r2, r5 +10001f9e: 6a5b ldr r3, [r3, #36] @ 0x24 +10001fa0: 429d cmp r5, r3 +10001fa2: d903 bls.n 10001fac +10001fa4: 490d ldr r1, [pc, #52] @ (10001fdc ) +10001fa6: 6a4b ldr r3, [r1, #36] @ 0x24 +10001fa8: 4293 cmp r3, r2 +10001faa: d3fc bcc.n 10001fa6 +10001fac: 4293 cmp r3, r2 +10001fae: d107 bne.n 10001fc0 +10001fb0: 4a0a ldr r2, [pc, #40] @ (10001fdc ) +10001fb2: e002 b.n 10001fba +10001fb4: 6a51 ldr r1, [r2, #36] @ 0x24 +10001fb6: 4299 cmp r1, r3 +10001fb8: d102 bne.n 10001fc0 +10001fba: 6a91 ldr r1, [r2, #40] @ 0x28 +10001fbc: 42a1 cmp r1, r4 +10001fbe: d3f9 bcc.n 10001fb4 +10001fc0: bd70 pop {r4, r5, r6, pc} +10001fc2: 42a6 cmp r6, r4 +10001fc4: d9e9 bls.n 10001f9a +10001fc6: 4b05 ldr r3, [pc, #20] @ (10001fdc ) +10001fc8: 6a5b ldr r3, [r3, #36] @ 0x24 +10001fca: 001c movs r4, r3 +10001fcc: 1c5a adds r2, r3, #1 +10001fce: d0ef beq.n 10001fb0 +10001fd0: 2201 movs r2, #1 +10001fd2: 2401 movs r4, #1 +10001fd4: 4264 negs r4, r4 +10001fd6: 17e5 asrs r5, r4, #31 +10001fd8: 4252 negs r2, r2 +10001fda: e7e3 b.n 10001fa4 +10001fdc: 40054000 .word 0x40054000 + +10001fe0 : +10001fe0: 4a06 ldr r2, [pc, #24] @ (10001ffc ) +10001fe2: 6a53 ldr r3, [r2, #36] @ 0x24 +10001fe4: 4299 cmp r1, r3 +10001fe6: d8fc bhi.n 10001fe2 +10001fe8: d107 bne.n 10001ffa +10001fea: 4b04 ldr r3, [pc, #16] @ (10001ffc ) +10001fec: e002 b.n 10001ff4 +10001fee: 6a5a ldr r2, [r3, #36] @ 0x24 +10001ff0: 4291 cmp r1, r2 +10001ff2: d102 bne.n 10001ffa +10001ff4: 6a9a ldr r2, [r3, #40] @ 0x28 +10001ff6: 4282 cmp r2, r0 +10001ff8: d3f9 bcc.n 10001fee +10001ffa: 4770 bx lr +10001ffc: 40054000 .word 0x40054000 + +10002000 : +10002000: b570 push {r4, r5, r6, lr} +10002002: 0004 movs r4, r0 +10002004: 000d movs r5, r1 +10002006: f3ef 8610 mrs r6, PRIMASK +1000200a: b672 cpsid i +1000200c: 4a1a ldr r2, [pc, #104] @ (10002078 ) +1000200e: 6813 ldr r3, [r2, #0] +10002010: 2b00 cmp r3, #0 +10002012: d0fc beq.n 1000200e +10002014: f3bf 8f5f dmb sy +10002018: 2d00 cmp r5, #0 +1000201a: d01b beq.n 10002054 +1000201c: 0020 movs r0, r4 +1000201e: f7ff f8e7 bl 100011f0 +10002022: 4916 ldr r1, [pc, #88] @ (1000207c ) +10002024: 4281 cmp r1, r0 +10002026: d00a beq.n 1000203e +10002028: 0020 movs r0, r4 +1000202a: f7ff f8e9 bl 10001200 +1000202e: 2101 movs r1, #1 +10002030: 0020 movs r0, r4 +10002032: f7ff f8ad bl 10001190 +10002036: 2301 movs r3, #1 +10002038: 40a3 lsls r3, r4 +1000203a: 4a11 ldr r2, [pc, #68] @ (10002080 ) +1000203c: 6013 str r3, [r2, #0] +1000203e: 4b11 ldr r3, [pc, #68] @ (10002084 ) +10002040: 00a4 lsls r4, r4, #2 +10002042: 50e5 str r5, [r4, r3] +10002044: f3bf 8f5f dmb sy +10002048: 2200 movs r2, #0 +1000204a: 4b0b ldr r3, [pc, #44] @ (10002078 ) +1000204c: 601a str r2, [r3, #0] +1000204e: f386 8810 msr PRIMASK, r6 +10002052: bd70 pop {r4, r5, r6, pc} +10002054: 2101 movs r1, #1 +10002056: 40a1 lsls r1, r4 +10002058: 4b0a ldr r3, [pc, #40] @ (10002084 ) +1000205a: 00a2 lsls r2, r4, #2 +1000205c: 50d5 str r5, [r2, r3] +1000205e: 4b0a ldr r3, [pc, #40] @ (10002088 ) +10002060: 0020 movs r0, r4 +10002062: 781a ldrb r2, [r3, #0] +10002064: 438a bics r2, r1 +10002066: 4905 ldr r1, [pc, #20] @ (1000207c ) +10002068: 701a strb r2, [r3, #0] +1000206a: f7ff f9ed bl 10001448 +1000206e: 2100 movs r1, #0 +10002070: 0020 movs r0, r4 +10002072: f7ff f88d bl 10001190 +10002076: e7e5 b.n 10002044 +10002078: d0000128 .word 0xd0000128 +1000207c: 10001e91 .word 0x10001e91 +10002080: 40056038 .word 0x40056038 +10002084: 20001734 .word 0x20001734 +10002088: 20001d69 .word 0x20001d69 + +1000208c : +1000208c: b5f0 push {r4, r5, r6, r7, lr} +1000208e: 464f mov r7, r9 +10002090: 46d6 mov lr, sl +10002092: 4646 mov r6, r8 +10002094: b5c0 push {r6, r7, lr} +10002096: 0007 movs r7, r0 +10002098: 4c2b ldr r4, [pc, #172] @ (10002148 ) +1000209a: 6a61 ldr r1, [r4, #36] @ 0x24 +1000209c: 000d movs r5, r1 +1000209e: 6aa6 ldr r6, [r4, #40] @ 0x28 +100020a0: 6a61 ldr r1, [r4, #36] @ 0x24 +100020a2: 42a9 cmp r1, r5 +100020a4: d1fa bne.n 1000209c +100020a6: 428b cmp r3, r1 +100020a8: d808 bhi.n 100020bc +100020aa: d005 beq.n 100020b8 +100020ac: 2001 movs r0, #1 +100020ae: bce0 pop {r5, r6, r7} +100020b0: 46ba mov sl, r7 +100020b2: 46b1 mov r9, r6 +100020b4: 46a8 mov r8, r5 +100020b6: bdf0 pop {r4, r5, r6, r7, pc} +100020b8: 42b2 cmp r2, r6 +100020ba: d9f7 bls.n 100020ac +100020bc: f3ef 8a10 mrs sl, PRIMASK +100020c0: b672 cpsid i +100020c2: 4822 ldr r0, [pc, #136] @ (1000214c ) +100020c4: 6801 ldr r1, [r0, #0] +100020c6: 2900 cmp r1, #0 +100020c8: d0fc beq.n 100020c4 +100020ca: f3bf 8f5f dmb sy +100020ce: 2501 movs r5, #1 +100020d0: 40bd lsls r5, r7 +100020d2: 491f ldr r1, [pc, #124] @ (10002150 ) +100020d4: 4c1c ldr r4, [pc, #112] @ (10002148 ) +100020d6: 4688 mov r8, r1 +100020d8: 7809 ldrb r1, [r1, #0] +100020da: 4689 mov r9, r1 +100020dc: 4329 orrs r1, r5 +100020de: b2c9 uxtb r1, r1 +100020e0: 468c mov ip, r1 +100020e2: 4641 mov r1, r8 +100020e4: 4660 mov r0, ip +100020e6: 7008 strb r0, [r1, #0] +100020e8: 1d39 adds r1, r7, #4 +100020ea: 0089 lsls r1, r1, #2 +100020ec: 6365 str r5, [r4, #52] @ 0x34 +100020ee: 510a str r2, [r1, r4] +100020f0: 4918 ldr r1, [pc, #96] @ (10002154 ) +100020f2: 00b8 lsls r0, r7, #2 +100020f4: 5043 str r3, [r0, r1] +100020f6: 6a21 ldr r1, [r4, #32] +100020f8: 2000 movs r0, #0 +100020fa: 4229 tst r1, r5 +100020fc: d019 beq.n 10002132 +100020fe: 6a61 ldr r1, [r4, #36] @ 0x24 +10002100: 0008 movs r0, r1 +10002102: 6aa6 ldr r6, [r4, #40] @ 0x28 +10002104: 6a61 ldr r1, [r4, #36] @ 0x24 +10002106: 4281 cmp r1, r0 +10002108: d1fa bne.n 10002100 +1000210a: 428b cmp r3, r1 +1000210c: d819 bhi.n 10002142 +1000210e: d101 bne.n 10002114 +10002110: 42b2 cmp r2, r6 +10002112: d816 bhi.n 10002142 +10002114: 45cc cmp ip, r9 +10002116: d00b beq.n 10002130 +10002118: 4b0b ldr r3, [pc, #44] @ (10002148 ) +1000211a: 221f movs r2, #31 +1000211c: 621d str r5, [r3, #32] +1000211e: 635d str r5, [r3, #52] @ 0x34 +10002120: 2301 movs r3, #1 +10002122: 403a ands r2, r7 +10002124: 4093 lsls r3, r2 +10002126: 4a0c ldr r2, [pc, #48] @ (10002158 ) +10002128: 6013 str r3, [r2, #0] +1000212a: 4643 mov r3, r8 +1000212c: 464a mov r2, r9 +1000212e: 701a strb r2, [r3, #0] +10002130: 2001 movs r0, #1 +10002132: f3bf 8f5f dmb sy +10002136: 2200 movs r2, #0 +10002138: 4b04 ldr r3, [pc, #16] @ (1000214c ) +1000213a: 601a str r2, [r3, #0] +1000213c: f38a 8810 msr PRIMASK, sl +10002140: e7b5 b.n 100020ae +10002142: 2000 movs r0, #0 +10002144: e7f5 b.n 10002132 +10002146: 46c0 nop @ (mov r8, r8) +10002148: 40054000 .word 0x40054000 +1000214c: d0000128 .word 0xd0000128 +10002150: 20001d69 .word 0x20001d69 +10002154: 20001d38 .word 0x20001d38 +10002158: e000e280 .word 0xe000e280 + +1000215c : +1000215c: f3ef 8c10 mrs ip, PRIMASK +10002160: b672 cpsid i +10002162: 490a ldr r1, [pc, #40] @ (1000218c ) +10002164: 680b ldr r3, [r1, #0] +10002166: 2b00 cmp r3, #0 +10002168: d0fc beq.n 10002164 +1000216a: f3bf 8f5f dmb sy +1000216e: 2301 movs r3, #1 +10002170: 4083 lsls r3, r0 +10002172: 4a07 ldr r2, [pc, #28] @ (10002190 ) +10002174: 4807 ldr r0, [pc, #28] @ (10002194 ) +10002176: 6213 str r3, [r2, #32] +10002178: 7802 ldrb r2, [r0, #0] +1000217a: 439a bics r2, r3 +1000217c: 7002 strb r2, [r0, #0] +1000217e: f3bf 8f5f dmb sy +10002182: 2300 movs r3, #0 +10002184: 600b str r3, [r1, #0] +10002186: f38c 8810 msr PRIMASK, ip +1000218a: 4770 bx lr +1000218c: d0000128 .word 0xd0000128 +10002190: 40054000 .word 0x40054000 +10002194: 20001d69 .word 0x20001d69 + +10002198 : +10002198: b570 push {r4, r5, r6, lr} +1000219a: 0006 movs r6, r0 +1000219c: 000d movs r5, r1 +1000219e: 0014 movs r4, r2 +100021a0: 2900 cmp r1, #0 +100021a2: d01d beq.n 100021e0 +100021a4: 2a00 cmp r2, #0 +100021a6: d012 beq.n 100021ce +100021a8: 6873 ldr r3, [r6, #4] +100021aa: 6880 ldr r0, [r0, #8] +100021ac: 4798 blx r3 +100021ae: 0062 lsls r2, r4, #1 +100021b0: 006b lsls r3, r5, #1 +100021b2: 1912 adds r2, r2, r4 +100021b4: 195b adds r3, r3, r5 +100021b6: 6831 ldr r1, [r6, #0] +100021b8: 3a03 subs r2, #3 +100021ba: 3b03 subs r3, #3 +100021bc: 2800 cmp r0, #0 +100021be: d008 beq.n 100021d2 +100021c0: 188a adds r2, r1, r2 +100021c2: 7095 strb r5, [r2, #2] +100021c4: 18c8 adds r0, r1, r3 +100021c6: 5ccb ldrb r3, [r1, r3] +100021c8: 2b00 cmp r3, #0 +100021ca: d10b bne.n 100021e4 +100021cc: 7004 strb r4, [r0, #0] +100021ce: 0028 movs r0, r5 +100021d0: bd70 pop {r4, r5, r6, pc} +100021d2: 18cb adds r3, r1, r3 +100021d4: 709c strb r4, [r3, #2] +100021d6: 1888 adds r0, r1, r2 +100021d8: 5c8a ldrb r2, [r1, r2] +100021da: 2a00 cmp r2, #0 +100021dc: d105 bne.n 100021ea +100021de: 7005 strb r5, [r0, #0] +100021e0: 0020 movs r0, r4 +100021e2: e7f5 b.n 100021d0 +100021e4: 7053 strb r3, [r2, #1] +100021e6: 7004 strb r4, [r0, #0] +100021e8: e7f1 b.n 100021ce +100021ea: 705a strb r2, [r3, #1] +100021ec: 7005 strb r5, [r0, #0] +100021ee: e7f7 b.n 100021e0 + +100021f0 : +100021f0: b510 push {r4, lr} +100021f2: 6083 str r3, [r0, #8] +100021f4: 2300 movs r3, #0 +100021f6: b2cc uxtb r4, r1 +100021f8: 7343 strb r3, [r0, #13] +100021fa: 3301 adds r3, #1 +100021fc: 6042 str r2, [r0, #4] +100021fe: 7304 strb r4, [r0, #12] +10002200: 7383 strb r3, [r0, #14] +10002202: 73c4 strb r4, [r0, #15] +10002204: 6800 ldr r0, [r0, #0] +10002206: 1c42 adds r2, r0, #1 +10002208: 2c01 cmp r4, #1 +1000220a: d905 bls.n 10002218 +1000220c: 3301 adds r3, #1 +1000220e: b2db uxtb r3, r3 +10002210: 7013 strb r3, [r2, #0] +10002212: 3203 adds r2, #3 +10002214: 429c cmp r4, r3 +10002216: d1f9 bne.n 1000220c +10002218: 23ff movs r3, #255 @ 0xff +1000221a: 400b ands r3, r1 +1000221c: 005a lsls r2, r3, #1 +1000221e: 18d3 adds r3, r2, r3 +10002220: 18c0 adds r0, r0, r3 +10002222: 2300 movs r3, #0 +10002224: 3803 subs r0, #3 +10002226: 7043 strb r3, [r0, #1] +10002228: bd10 pop {r4, pc} +1000222a: 46c0 nop @ (mov r8, r8) + +1000222c : +1000222c: b570 push {r4, r5, r6, lr} +1000222e: 0005 movs r5, r0 +10002230: 1e0c subs r4, r1, #0 +10002232: d007 beq.n 10002244 +10002234: 0063 lsls r3, r4, #1 +10002236: 6801 ldr r1, [r0, #0] +10002238: 191b adds r3, r3, r4 +1000223a: 3b03 subs r3, #3 +1000223c: 18cb adds r3, r1, r3 +1000223e: 785a ldrb r2, [r3, #1] +10002240: 2a00 cmp r2, #0 +10002242: d101 bne.n 10002248 +10002244: 0020 movs r0, r4 +10002246: bd70 pop {r4, r5, r6, pc} +10002248: 0050 lsls r0, r2, #1 +1000224a: 1880 adds r0, r0, r2 +1000224c: 3803 subs r0, #3 +1000224e: 1809 adds r1, r1, r0 +10002250: 2000 movs r0, #0 +10002252: 784e ldrb r6, [r1, #1] +10002254: 7048 strb r0, [r1, #1] +10002256: 0021 movs r1, r4 +10002258: 7058 strb r0, [r3, #1] +1000225a: 0028 movs r0, r5 +1000225c: f7ff ff9c bl 10002198 +10002260: 0031 movs r1, r6 +10002262: 0004 movs r4, r0 +10002264: 0028 movs r0, r5 +10002266: f7ff ffe1 bl 1000222c +1000226a: 0006 movs r6, r0 +1000226c: 2c00 cmp r4, #0 +1000226e: d020 beq.n 100022b2 +10002270: 2800 cmp r0, #0 +10002272: d0e7 beq.n 10002244 +10002274: 0032 movs r2, r6 +10002276: 0021 movs r1, r4 +10002278: 686b ldr r3, [r5, #4] +1000227a: 68a8 ldr r0, [r5, #8] +1000227c: 4798 blx r3 +1000227e: 0072 lsls r2, r6, #1 +10002280: 0063 lsls r3, r4, #1 +10002282: 1992 adds r2, r2, r6 +10002284: 191b adds r3, r3, r4 +10002286: 6829 ldr r1, [r5, #0] +10002288: 3a03 subs r2, #3 +1000228a: 3b03 subs r3, #3 +1000228c: 2800 cmp r0, #0 +1000228e: d008 beq.n 100022a2 +10002290: 188a adds r2, r1, r2 +10002292: 7094 strb r4, [r2, #2] +10002294: 18c8 adds r0, r1, r3 +10002296: 5ccb ldrb r3, [r1, r3] +10002298: 2b00 cmp r3, #0 +1000229a: d000 beq.n 1000229e +1000229c: 7053 strb r3, [r2, #1] +1000229e: 7006 strb r6, [r0, #0] +100022a0: e7d0 b.n 10002244 +100022a2: 18cb adds r3, r1, r3 +100022a4: 709e strb r6, [r3, #2] +100022a6: 1888 adds r0, r1, r2 +100022a8: 5c8a ldrb r2, [r1, r2] +100022aa: 2a00 cmp r2, #0 +100022ac: d000 beq.n 100022b0 +100022ae: 705a strb r2, [r3, #1] +100022b0: 7004 strb r4, [r0, #0] +100022b2: 0034 movs r4, r6 +100022b4: e7c6 b.n 10002244 +100022b6: 46c0 nop @ (mov r8, r8) + +100022b8 : +100022b8: b5f0 push {r4, r5, r6, r7, lr} +100022ba: 4657 mov r7, sl +100022bc: 4645 mov r5, r8 +100022be: 46de mov lr, fp +100022c0: 464e mov r6, r9 +100022c2: b5e0 push {r5, r6, r7, lr} +100022c4: 000d movs r5, r1 +100022c6: 006f lsls r7, r5, #1 +100022c8: 6801 ldr r1, [r0, #0] +100022ca: 197f adds r7, r7, r5 +100022cc: 3f03 subs r7, #3 +100022ce: 0004 movs r4, r0 +100022d0: 5dc8 ldrb r0, [r1, r7] +100022d2: b083 sub sp, #12 +100022d4: 9201 str r2, [sp, #4] +100022d6: 19ca adds r2, r1, r7 +100022d8: 2800 cmp r0, #0 +100022da: d050 beq.n 1000237e +100022dc: 0043 lsls r3, r0, #1 +100022de: 181b adds r3, r3, r0 +100022e0: 3b03 subs r3, #3 +100022e2: 18cb adds r3, r1, r3 +100022e4: 785e ldrb r6, [r3, #1] +100022e6: 46b4 mov ip, r6 +100022e8: 2e00 cmp r6, #0 +100022ea: d11a bne.n 10002322 +100022ec: 9e01 ldr r6, [sp, #4] +100022ee: 2e00 cmp r6, #0 +100022f0: d042 beq.n 10002378 +100022f2: 7be6 ldrb r6, [r4, #15] +100022f4: 2e00 cmp r6, #0 +100022f6: d004 beq.n 10002302 +100022f8: 0073 lsls r3, r6, #1 +100022fa: 199b adds r3, r3, r6 +100022fc: 18cb adds r3, r1, r3 +100022fe: 3b03 subs r3, #3 +10002300: 705d strb r5, [r3, #1] +10002302: 7ba3 ldrb r3, [r4, #14] +10002304: 2b00 cmp r3, #0 +10002306: d100 bne.n 1000230a +10002308: 73a5 strb r5, [r4, #14] +1000230a: 73e5 strb r5, [r4, #15] +1000230c: 2800 cmp r0, #0 +1000230e: d12f bne.n 10002370 +10002310: 2300 movs r3, #0 +10002312: 7053 strb r3, [r2, #1] +10002314: b003 add sp, #12 +10002316: bcf0 pop {r4, r5, r6, r7} +10002318: 46bb mov fp, r7 +1000231a: 46b2 mov sl, r6 +1000231c: 46a9 mov r9, r5 +1000231e: 46a0 mov r8, r4 +10002320: bdf0 pop {r4, r5, r6, r7, pc} +10002322: 0072 lsls r2, r6, #1 +10002324: 4462 add r2, ip +10002326: 3a03 subs r2, #3 +10002328: 188a adds r2, r1, r2 +1000232a: 7851 ldrb r1, [r2, #1] +1000232c: 4688 mov r8, r1 +1000232e: 2100 movs r1, #0 +10002330: 7051 strb r1, [r2, #1] +10002332: 4689 mov r9, r1 +10002334: 7059 strb r1, [r3, #1] +10002336: 0032 movs r2, r6 +10002338: 0001 movs r1, r0 +1000233a: 0020 movs r0, r4 +1000233c: f7ff ff2c bl 10002198 +10002340: 4643 mov r3, r8 +10002342: 4682 mov sl, r0 +10002344: 2b00 cmp r3, #0 +10002346: d007 beq.n 10002358 +10002348: 005b lsls r3, r3, #1 +1000234a: 6821 ldr r1, [r4, #0] +1000234c: 4443 add r3, r8 +1000234e: 3b03 subs r3, #3 +10002350: 18cb adds r3, r1, r3 +10002352: 785a ldrb r2, [r3, #1] +10002354: 2a00 cmp r2, #0 +10002356: d116 bne.n 10002386 +10002358: 4642 mov r2, r8 +1000235a: 4651 mov r1, sl +1000235c: 0020 movs r0, r4 +1000235e: f7ff ff1b bl 10002198 +10002362: 6821 ldr r1, [r4, #0] +10002364: 9b01 ldr r3, [sp, #4] +10002366: 19ca adds r2, r1, r7 +10002368: 2b00 cmp r3, #0 +1000236a: d1c2 bne.n 100022f2 +1000236c: 2800 cmp r0, #0 +1000236e: d0cf beq.n 10002310 +10002370: 0043 lsls r3, r0, #1 +10002372: 181b adds r3, r3, r0 +10002374: 3b03 subs r3, #3 +10002376: 18cb adds r3, r1, r3 +10002378: 2100 movs r1, #0 +1000237a: 7099 strb r1, [r3, #2] +1000237c: e7c8 b.n 10002310 +1000237e: 9b01 ldr r3, [sp, #4] +10002380: 2b00 cmp r3, #0 +10002382: d1b6 bne.n 100022f2 +10002384: e7c4 b.n 10002310 +10002386: 0050 lsls r0, r2, #1 +10002388: 1880 adds r0, r0, r2 +1000238a: 3803 subs r0, #3 +1000238c: 1809 adds r1, r1, r0 +1000238e: 7848 ldrb r0, [r1, #1] +10002390: 4683 mov fp, r0 +10002392: 4648 mov r0, r9 +10002394: 7048 strb r0, [r1, #1] +10002396: 7058 strb r0, [r3, #1] +10002398: 4641 mov r1, r8 +1000239a: 0020 movs r0, r4 +1000239c: f7ff fefc bl 10002198 +100023a0: 4659 mov r1, fp +100023a2: 4680 mov r8, r0 +100023a4: 0020 movs r0, r4 +100023a6: f7ff ff41 bl 1000222c +100023aa: 4641 mov r1, r8 +100023ac: 0002 movs r2, r0 +100023ae: 0020 movs r0, r4 +100023b0: f7ff fef2 bl 10002198 +100023b4: 4680 mov r8, r0 +100023b6: e7cf b.n 10002358 + +100023b8 : +100023b8: b5f0 push {r4, r5, r6, r7, lr} +100023ba: 4657 mov r7, sl +100023bc: 4645 mov r5, r8 +100023be: 46de mov lr, fp +100023c0: 464e mov r6, r9 +100023c2: b5e0 push {r5, r6, r7, lr} +100023c4: b083 sub sp, #12 +100023c6: 9101 str r1, [sp, #4] +100023c8: 7b45 ldrb r5, [r0, #13] +100023ca: 0004 movs r4, r0 +100023cc: 006f lsls r7, r5, #1 +100023ce: 6800 ldr r0, [r0, #0] +100023d0: 197f adds r7, r7, r5 +100023d2: 3f03 subs r7, #3 +100023d4: 5dc1 ldrb r1, [r0, r7] +100023d6: 19c2 adds r2, r0, r7 +100023d8: 2900 cmp r1, #0 +100023da: d052 beq.n 10002482 +100023dc: 004b lsls r3, r1, #1 +100023de: 185b adds r3, r3, r1 +100023e0: 3b03 subs r3, #3 +100023e2: 18c3 adds r3, r0, r3 +100023e4: 785e ldrb r6, [r3, #1] +100023e6: 46b4 mov ip, r6 +100023e8: 2e00 cmp r6, #0 +100023ea: d11c bne.n 10002426 +100023ec: 9e01 ldr r6, [sp, #4] +100023ee: 2e00 cmp r6, #0 +100023f0: d044 beq.n 1000247c +100023f2: 7be6 ldrb r6, [r4, #15] +100023f4: 2e00 cmp r6, #0 +100023f6: d004 beq.n 10002402 +100023f8: 0073 lsls r3, r6, #1 +100023fa: 199b adds r3, r3, r6 +100023fc: 18c3 adds r3, r0, r3 +100023fe: 3b03 subs r3, #3 +10002400: 705d strb r5, [r3, #1] +10002402: 7ba3 ldrb r3, [r4, #14] +10002404: 2b00 cmp r3, #0 +10002406: d100 bne.n 1000240a +10002408: 73a5 strb r5, [r4, #14] +1000240a: 73e5 strb r5, [r4, #15] +1000240c: 2900 cmp r1, #0 +1000240e: d131 bne.n 10002474 +10002410: 2300 movs r3, #0 +10002412: 0028 movs r0, r5 +10002414: 7053 strb r3, [r2, #1] +10002416: 7361 strb r1, [r4, #13] +10002418: b003 add sp, #12 +1000241a: bcf0 pop {r4, r5, r6, r7} +1000241c: 46bb mov fp, r7 +1000241e: 46b2 mov sl, r6 +10002420: 46a9 mov r9, r5 +10002422: 46a0 mov r8, r4 +10002424: bdf0 pop {r4, r5, r6, r7, pc} +10002426: 0072 lsls r2, r6, #1 +10002428: 4462 add r2, ip +1000242a: 3a03 subs r2, #3 +1000242c: 1882 adds r2, r0, r2 +1000242e: 7850 ldrb r0, [r2, #1] +10002430: 4680 mov r8, r0 +10002432: 2000 movs r0, #0 +10002434: 7050 strb r0, [r2, #1] +10002436: 4681 mov r9, r0 +10002438: 7058 strb r0, [r3, #1] +1000243a: 0032 movs r2, r6 +1000243c: 0020 movs r0, r4 +1000243e: f7ff feab bl 10002198 +10002442: 4643 mov r3, r8 +10002444: 4682 mov sl, r0 +10002446: 2b00 cmp r3, #0 +10002448: d007 beq.n 1000245a +1000244a: 005b lsls r3, r3, #1 +1000244c: 6821 ldr r1, [r4, #0] +1000244e: 4443 add r3, r8 +10002450: 3b03 subs r3, #3 +10002452: 18cb adds r3, r1, r3 +10002454: 785a ldrb r2, [r3, #1] +10002456: 2a00 cmp r2, #0 +10002458: d117 bne.n 1000248a +1000245a: 4642 mov r2, r8 +1000245c: 4651 mov r1, sl +1000245e: 0020 movs r0, r4 +10002460: f7ff fe9a bl 10002198 +10002464: 9b01 ldr r3, [sp, #4] +10002466: 0001 movs r1, r0 +10002468: 6820 ldr r0, [r4, #0] +1000246a: 19c2 adds r2, r0, r7 +1000246c: 2b00 cmp r3, #0 +1000246e: d1c0 bne.n 100023f2 +10002470: 2900 cmp r1, #0 +10002472: d0cd beq.n 10002410 +10002474: 004b lsls r3, r1, #1 +10002476: 185b adds r3, r3, r1 +10002478: 3b03 subs r3, #3 +1000247a: 18c3 adds r3, r0, r3 +1000247c: 2000 movs r0, #0 +1000247e: 7098 strb r0, [r3, #2] +10002480: e7c6 b.n 10002410 +10002482: 9b01 ldr r3, [sp, #4] +10002484: 2b00 cmp r3, #0 +10002486: d1b4 bne.n 100023f2 +10002488: e7c2 b.n 10002410 +1000248a: 0050 lsls r0, r2, #1 +1000248c: 1880 adds r0, r0, r2 +1000248e: 3803 subs r0, #3 +10002490: 1809 adds r1, r1, r0 +10002492: 7848 ldrb r0, [r1, #1] +10002494: 4683 mov fp, r0 +10002496: 4648 mov r0, r9 +10002498: 7048 strb r0, [r1, #1] +1000249a: 7058 strb r0, [r3, #1] +1000249c: 4641 mov r1, r8 +1000249e: 0020 movs r0, r4 +100024a0: f7ff fe7a bl 10002198 +100024a4: 4659 mov r1, fp +100024a6: 4680 mov r8, r0 +100024a8: 0020 movs r0, r4 +100024aa: f7ff febf bl 1000222c +100024ae: 4641 mov r1, r8 +100024b0: 0002 movs r2, r0 +100024b2: 0020 movs r0, r4 +100024b4: f7ff fe70 bl 10002198 +100024b8: 4680 mov r8, r0 +100024ba: e7ce b.n 1000245a + +100024bc : +100024bc: b570 push {r4, r5, r6, lr} +100024be: 0005 movs r5, r0 +100024c0: 2900 cmp r1, #0 +100024c2: d02c beq.n 1000251e +100024c4: 7b43 ldrb r3, [r0, #13] +100024c6: 428b cmp r3, r1 +100024c8: d02e beq.n 10002528 +100024ca: 004c lsls r4, r1, #1 +100024cc: 6800 ldr r0, [r0, #0] +100024ce: 1864 adds r4, r4, r1 +100024d0: 3c03 subs r4, #3 +100024d2: 1904 adds r4, r0, r4 +100024d4: 78a2 ldrb r2, [r4, #2] +100024d6: 2a00 cmp r2, #0 +100024d8: d021 beq.n 1000251e +100024da: 0053 lsls r3, r2, #1 +100024dc: 189b adds r3, r3, r2 +100024de: 3b03 subs r3, #3 +100024e0: 5cc2 ldrb r2, [r0, r3] +100024e2: 18c6 adds r6, r0, r3 +100024e4: 428a cmp r2, r1 +100024e6: d102 bne.n 100024ee +100024e8: e01b b.n 10002522 +100024ea: 2a00 cmp r2, #0 +100024ec: d008 beq.n 10002500 +100024ee: 0053 lsls r3, r2, #1 +100024f0: 189b adds r3, r3, r2 +100024f2: 3b03 subs r3, #3 +100024f4: 18c3 adds r3, r0, r3 +100024f6: 785a ldrb r2, [r3, #1] +100024f8: 428a cmp r2, r1 +100024fa: d1f6 bne.n 100024ea +100024fc: 7862 ldrb r2, [r4, #1] +100024fe: 705a strb r2, [r3, #1] +10002500: 2300 movs r3, #0 +10002502: 2201 movs r2, #1 +10002504: 0028 movs r0, r5 +10002506: 70a3 strb r3, [r4, #2] +10002508: 7063 strb r3, [r4, #1] +1000250a: f7ff fed5 bl 100022b8 +1000250e: 7b69 ldrb r1, [r5, #13] +10002510: 0002 movs r2, r0 +10002512: 0028 movs r0, r5 +10002514: f7ff fe40 bl 10002198 +10002518: 7368 strb r0, [r5, #13] +1000251a: 2001 movs r0, #1 +1000251c: e000 b.n 10002520 +1000251e: 2000 movs r0, #0 +10002520: bd70 pop {r4, r5, r6, pc} +10002522: 7863 ldrb r3, [r4, #1] +10002524: 7033 strb r3, [r6, #0] +10002526: e7eb b.n 10002500 +10002528: 2201 movs r2, #1 +1000252a: 0019 movs r1, r3 +1000252c: f7ff fec4 bl 100022b8 +10002530: e7f2 b.n 10002518 +10002532: 46c0 nop @ (mov r8, r8) + +10002534 : +10002534: b5f8 push {r3, r4, r5, r6, r7, lr} +10002536: 46ce mov lr, r9 +10002538: 4647 mov r7, r8 +1000253a: 0004 movs r4, r0 +1000253c: b580 push {r7, lr} +1000253e: 2006 movs r0, #6 +10002540: 000d movs r5, r1 +10002542: f000 fa21 bl 10002988 +10002546: 1e06 subs r6, r0, #0 +10002548: d053 beq.n 100025f2 +1000254a: 4b53 ldr r3, [pc, #332] @ (10002698 ) +1000254c: 4953 ldr r1, [pc, #332] @ (1000269c ) +1000254e: 18e3 adds r3, r4, r3 +10002550: 1e5a subs r2, r3, #1 +10002552: 4193 sbcs r3, r2 +10002554: 2280 movs r2, #128 @ 0x80 +10002556: 0412 lsls r2, r2, #16 +10002558: 4694 mov ip, r2 +1000255a: 425b negs r3, r3 +1000255c: 0d9b lsrs r3, r3, #22 +1000255e: 4a50 ldr r2, [pc, #320] @ (100026a0 ) +10002560: 059b lsls r3, r3, #22 +10002562: 4463 add r3, ip +10002564: 6013 str r3, [r2, #0] +10002566: 4a4f ldr r2, [pc, #316] @ (100026a4 ) +10002568: 6013 str r3, [r2, #0] +1000256a: 0018 movs r0, r3 +1000256c: 688a ldr r2, [r1, #8] +1000256e: 4390 bics r0, r2 +10002570: d1fb bne.n 1000256a +10002572: 4b49 ldr r3, [pc, #292] @ (10002698 ) +10002574: 4a4c ldr r2, [pc, #304] @ (100026a8 ) +10002576: 18e3 adds r3, r4, r3 +10002578: 4259 negs r1, r3 +1000257a: 414b adcs r3, r1 +1000257c: 2180 movs r1, #128 @ 0x80 +1000257e: 005b lsls r3, r3, #1 +10002580: 0049 lsls r1, r1, #1 +10002582: 2006 movs r0, #6 +10002584: 5299 strh r1, [r3, r2] +10002586: f000 f9ff bl 10002988 +1000258a: 0029 movs r1, r5 +1000258c: 00c0 lsls r0, r0, #3 +1000258e: f001 ff69 bl 10004464 <__wrap___aeabi_uidiv> +10002592: 09c3 lsrs r3, r0, #7 +10002594: d132 bne.n 100025fc +10002596: 2240 movs r2, #64 @ 0x40 +10002598: 2101 movs r1, #1 +1000259a: 4690 mov r8, r2 +1000259c: 6261 str r1, [r4, #36] @ 0x24 +1000259e: 62a3 str r3, [r4, #40] @ 0x28 +100025a0: 6b26 ldr r6, [r4, #48] @ 0x30 +100025a2: 07f3 lsls r3, r6, #31 +100025a4: d436 bmi.n 10002614 +100025a6: 0027 movs r7, r4 +100025a8: 2580 movs r5, #128 @ 0x80 +100025aa: 6ae3 ldr r3, [r4, #44] @ 0x2c +100025ac: 2300 movs r3, #0 +100025ae: 372c adds r7, #44 @ 0x2c +100025b0: 016d lsls r5, r5, #5 +100025b2: 433d orrs r5, r7 +100025b4: 602b str r3, [r5, #0] +100025b6: 2006 movs r0, #6 +100025b8: 6326 str r6, [r4, #48] @ 0x30 +100025ba: f000 f9e5 bl 10002988 +100025be: 4641 mov r1, r8 +100025c0: 0080 lsls r0, r0, #2 +100025c2: f001 ff4f bl 10004464 <__wrap___aeabi_uidiv> +100025c6: 6b23 ldr r3, [r4, #48] @ 0x30 +100025c8: 0006 movs r6, r0 +100025ca: 4698 mov r8, r3 +100025cc: 07db lsls r3, r3, #31 +100025ce: d43b bmi.n 10002648 +100025d0: 2360 movs r3, #96 @ 0x60 +100025d2: 6ae2 ldr r2, [r4, #44] @ 0x2c +100025d4: 405a eors r2, r3 +100025d6: 330e adds r3, #14 +100025d8: 4013 ands r3, r2 +100025da: 602b str r3, [r5, #0] +100025dc: 4643 mov r3, r8 +100025de: 6323 str r3, [r4, #48] @ 0x30 +100025e0: 2380 movs r3, #128 @ 0x80 +100025e2: 2210 movs r2, #16 +100025e4: 019b lsls r3, r3, #6 +100025e6: 433b orrs r3, r7 +100025e8: 601a str r2, [r3, #0] +100025ea: 4b30 ldr r3, [pc, #192] @ (100026ac ) +100025ec: 6323 str r3, [r4, #48] @ 0x30 +100025ee: 2303 movs r3, #3 +100025f0: 64a3 str r3, [r4, #72] @ 0x48 +100025f2: 0030 movs r0, r6 +100025f4: bcc0 pop {r6, r7} +100025f6: 46b9 mov r9, r7 +100025f8: 46b0 mov r8, r6 +100025fa: bdf8 pop {r3, r4, r5, r6, r7, pc} +100025fc: 4a2c ldr r2, [pc, #176] @ (100026b0 ) +100025fe: 4293 cmp r3, r2 +10002600: d93f bls.n 10002682 +10002602: 2300 movs r3, #0 +10002604: 492b ldr r1, [pc, #172] @ (100026b4 ) +10002606: 4a2c ldr r2, [pc, #176] @ (100026b8 ) +10002608: 6261 str r1, [r4, #36] @ 0x24 +1000260a: 62a3 str r3, [r4, #40] @ 0x28 +1000260c: 6b26 ldr r6, [r4, #48] @ 0x30 +1000260e: 4690 mov r8, r2 +10002610: 07f3 lsls r3, r6, #31 +10002612: d5c8 bpl.n 100025a6 +10002614: 0022 movs r2, r4 +10002616: 23c0 movs r3, #192 @ 0xc0 +10002618: 3230 adds r2, #48 @ 0x30 +1000261a: 019b lsls r3, r3, #6 +1000261c: 4313 orrs r3, r2 +1000261e: 4a23 ldr r2, [pc, #140] @ (100026ac ) +10002620: 2006 movs r0, #6 +10002622: 601a str r2, [r3, #0] +10002624: 6a65 ldr r5, [r4, #36] @ 0x24 +10002626: 6aa3 ldr r3, [r4, #40] @ 0x28 +10002628: 01ad lsls r5, r5, #6 +1000262a: 18ed adds r5, r5, r3 +1000262c: f000 f9ac bl 10002988 +10002630: 4922 ldr r1, [pc, #136] @ (100026bc ) +10002632: f001 ff17 bl 10004464 <__wrap___aeabi_uidiv> +10002636: 02ad lsls r5, r5, #10 +10002638: 0001 movs r1, r0 +1000263a: 0028 movs r0, r5 +1000263c: f001 ff12 bl 10004464 <__wrap___aeabi_uidiv> +10002640: 2100 movs r1, #0 +10002642: f7ff fc99 bl 10001f78 +10002646: e7ae b.n 100025a6 +10002648: 0022 movs r2, r4 +1000264a: 23c0 movs r3, #192 @ 0xc0 +1000264c: 3230 adds r2, #48 @ 0x30 +1000264e: 019b lsls r3, r3, #6 +10002650: 4313 orrs r3, r2 +10002652: 4a16 ldr r2, [pc, #88] @ (100026ac ) +10002654: 2006 movs r0, #6 +10002656: 601a str r2, [r3, #0] +10002658: 6a63 ldr r3, [r4, #36] @ 0x24 +1000265a: 6aa2 ldr r2, [r4, #40] @ 0x28 +1000265c: 019b lsls r3, r3, #6 +1000265e: 4699 mov r9, r3 +10002660: 4491 add r9, r2 +10002662: f000 f991 bl 10002988 +10002666: 464b mov r3, r9 +10002668: 4914 ldr r1, [pc, #80] @ (100026bc ) +1000266a: 029b lsls r3, r3, #10 +1000266c: 4699 mov r9, r3 +1000266e: f001 fef9 bl 10004464 <__wrap___aeabi_uidiv> +10002672: 0001 movs r1, r0 +10002674: 4648 mov r0, r9 +10002676: f001 fef5 bl 10004464 <__wrap___aeabi_uidiv> +1000267a: 2100 movs r1, #0 +1000267c: f7ff fc7c bl 10001f78 +10002680: e7a6 b.n 100025d0 +10002682: 227f movs r2, #127 @ 0x7f +10002684: 0199 lsls r1, r3, #6 +10002686: 4688 mov r8, r1 +10002688: 4002 ands r2, r0 +1000268a: 3201 adds r2, #1 +1000268c: 0852 lsrs r2, r2, #1 +1000268e: 0019 movs r1, r3 +10002690: 4490 add r8, r2 +10002692: 0013 movs r3, r2 +10002694: e782 b.n 1000259c +10002696: 46c0 nop @ (mov r8, r8) +10002698: bffc8000 .word 0xbffc8000 +1000269c: 4000c000 .word 0x4000c000 +100026a0: 4000e000 .word 0x4000e000 +100026a4: 4000f000 .word 0x4000f000 +100026a8: 20001d48 .word 0x20001d48 +100026ac: 00000301 .word 0x00000301 +100026b0: 0000fffe .word 0x0000fffe +100026b4: 0000ffff .word 0x0000ffff +100026b8: 003fffc0 .word 0x003fffc0 +100026bc: 00000e4e .word 0x00000e4e + +100026c0 : +100026c0: b510 push {r4, lr} +100026c2: 200c movs r0, #12 +100026c4: b082 sub sp, #8 +100026c6: f000 f9b7 bl 10002a38 +100026ca: f7fe fcbd bl 10001048 +100026ce: 2800 cmp r0, #0 +100026d0: d010 beq.n 100026f4 +100026d2: 4b8b ldr r3, [pc, #556] @ (10002900 ) +100026d4: 488b ldr r0, [pc, #556] @ (10002904 ) +100026d6: 498b ldr r1, [pc, #556] @ (10002904 ) +100026d8: 4a8b ldr r2, [pc, #556] @ (10002908 ) +100026da: 6018 str r0, [r3, #0] +100026dc: 6059 str r1, [r3, #4] +100026de: 6098 str r0, [r3, #8] +100026e0: 60d9 str r1, [r3, #12] +100026e2: 6118 str r0, [r3, #16] +100026e4: 6159 str r1, [r3, #20] +100026e6: 6198 str r0, [r3, #24] +100026e8: 61d9 str r1, [r3, #28] +100026ea: 6218 str r0, [r3, #32] +100026ec: 6259 str r1, [r3, #36] @ 0x24 +100026ee: 625a str r2, [r3, #36] @ 0x24 +100026f0: b002 add sp, #8 +100026f2: bd10 pop {r4, pc} +100026f4: 4c85 ldr r4, [pc, #532] @ (1000290c ) +100026f6: 67a0 str r0, [r4, #120] @ 0x78 +100026f8: f000 f9f4 bl 10002ae4 +100026fc: 2201 movs r2, #1 +100026fe: 4b84 ldr r3, [pc, #528] @ (10002910 ) +10002700: 601a str r2, [r3, #0] +10002702: 6c63 ldr r3, [r4, #68] @ 0x44 +10002704: 2b01 cmp r3, #1 +10002706: d1fc bne.n 10002702 +10002708: 2203 movs r2, #3 +1000270a: 4b82 ldr r3, [pc, #520] @ (10002914 ) +1000270c: 601a str r2, [r3, #0] +1000270e: 4a7f ldr r2, [pc, #508] @ (1000290c ) +10002710: 6b93 ldr r3, [r2, #56] @ 0x38 +10002712: 2b01 cmp r3, #1 +10002714: d1fc bne.n 10002710 +10002716: 3301 adds r3, #1 +10002718: 2101 movs r1, #1 +1000271a: 4a7f ldr r2, [pc, #508] @ (10002918 ) +1000271c: 487f ldr r0, [pc, #508] @ (1000291c ) +1000271e: 9300 str r3, [sp, #0] +10002720: 3304 adds r3, #4 +10002722: f000 f937 bl 10002994 +10002726: 2305 movs r3, #5 +10002728: 4a7d ldr r2, [pc, #500] @ (10002920 ) +1000272a: 9300 str r3, [sp, #0] +1000272c: 2101 movs r1, #1 +1000272e: 487d ldr r0, [pc, #500] @ (10002924 ) +10002730: f000 f930 bl 10002994 +10002734: 4b7c ldr r3, [pc, #496] @ (10002928 ) +10002736: 685a ldr r2, [r3, #4] +10002738: 2aff cmp r2, #255 @ 0xff +1000273a: d802 bhi.n 10002742 +1000273c: 2280 movs r2, #128 @ 0x80 +1000273e: 0052 lsls r2, r2, #1 +10002740: 605a str r2, [r3, #4] +10002742: 2280 movs r2, #128 @ 0x80 +10002744: 4b73 ldr r3, [pc, #460] @ (10002914 ) +10002746: 4c6e ldr r4, [pc, #440] @ (10002900 ) +10002748: 0112 lsls r2, r2, #4 +1000274a: 601a str r2, [r3, #0] +1000274c: 6921 ldr r1, [r4, #16] +1000274e: 2900 cmp r1, #0 +10002750: d007 beq.n 10002762 +10002752: 6960 ldr r0, [r4, #20] +10002754: f001 fe86 bl 10004464 <__wrap___aeabi_uidiv> +10002758: 3001 adds r0, #1 +1000275a: 0043 lsls r3, r0, #1 +1000275c: 181b adds r3, r3, r0 +1000275e: 3b03 subs r3, #3 +10002760: d2fd bcs.n 1000275e +10002762: 22e0 movs r2, #224 @ 0xe0 +10002764: 4b70 ldr r3, [pc, #448] @ (10002928 ) +10002766: 4871 ldr r0, [pc, #452] @ (1000292c ) +10002768: 6819 ldr r1, [r3, #0] +1000276a: 400a ands r2, r1 +1000276c: 6002 str r2, [r0, #0] +1000276e: 2202 movs r2, #2 +10002770: 6819 ldr r1, [r3, #0] +10002772: 4051 eors r1, r2 +10002774: 3201 adds r2, #1 +10002776: 400a ands r2, r1 +10002778: 2104 movs r1, #4 +1000277a: 6002 str r2, [r0, #0] +1000277c: 689a ldr r2, [r3, #8] +1000277e: 4211 tst r1, r2 +10002780: d0fc beq.n 1000277c +10002782: 2180 movs r1, #128 @ 0x80 +10002784: 4a6a ldr r2, [pc, #424] @ (10002930 ) +10002786: 0109 lsls r1, r1, #4 +10002788: 6011 str r1, [r2, #0] +1000278a: 2280 movs r2, #128 @ 0x80 +1000278c: 0052 lsls r2, r2, #1 +1000278e: 605a str r2, [r3, #4] +10002790: 4b68 ldr r3, [pc, #416] @ (10002934 ) +10002792: 6123 str r3, [r4, #16] +10002794: 4b68 ldr r3, [pc, #416] @ (10002938 ) +10002796: 6859 ldr r1, [r3, #4] +10002798: 29ff cmp r1, #255 @ 0xff +1000279a: d800 bhi.n 1000279e +1000279c: 605a str r2, [r3, #4] +1000279e: 2203 movs r2, #3 +100027a0: 2101 movs r1, #1 +100027a2: 4b5b ldr r3, [pc, #364] @ (10002910 ) +100027a4: 601a str r2, [r3, #0] +100027a6: 4a64 ldr r2, [pc, #400] @ (10002938 ) +100027a8: 6893 ldr r3, [r2, #8] +100027aa: 4219 tst r1, r3 +100027ac: d0fc beq.n 100027a8 +100027ae: 23e0 movs r3, #224 @ 0xe0 +100027b0: 6810 ldr r0, [r2, #0] +100027b2: 4003 ands r3, r0 +100027b4: 4861 ldr r0, [pc, #388] @ (1000293c ) +100027b6: 6003 str r3, [r0, #0] +100027b8: 6812 ldr r2, [r2, #0] +100027ba: 2303 movs r3, #3 +100027bc: 404a eors r2, r1 +100027be: 2102 movs r1, #2 +100027c0: 4013 ands r3, r2 +100027c2: 4a5d ldr r2, [pc, #372] @ (10002938 ) +100027c4: 6003 str r3, [r0, #0] +100027c6: 6893 ldr r3, [r2, #8] +100027c8: 4219 tst r1, r3 +100027ca: d0fc beq.n 100027c6 +100027cc: 2180 movs r1, #128 @ 0x80 +100027ce: 4b5c ldr r3, [pc, #368] @ (10002940 ) +100027d0: 0109 lsls r1, r1, #4 +100027d2: 6019 str r1, [r3, #0] +100027d4: 2180 movs r1, #128 @ 0x80 +100027d6: 4b5b ldr r3, [pc, #364] @ (10002944 ) +100027d8: 0049 lsls r1, r1, #1 +100027da: 6051 str r1, [r2, #4] +100027dc: 6163 str r3, [r4, #20] +100027de: 4b5a ldr r3, [pc, #360] @ (10002948 ) +100027e0: 685a ldr r2, [r3, #4] +100027e2: 2aff cmp r2, #255 @ 0xff +100027e4: d800 bhi.n 100027e8 +100027e6: 6059 str r1, [r3, #4] +100027e8: 2280 movs r2, #128 @ 0x80 +100027ea: 4b58 ldr r3, [pc, #352] @ (1000294c ) +100027ec: 0112 lsls r2, r2, #4 +100027ee: 601a str r2, [r3, #0] +100027f0: 69e1 ldr r1, [r4, #28] +100027f2: 2900 cmp r1, #0 +100027f4: d007 beq.n 10002806 +100027f6: 6960 ldr r0, [r4, #20] +100027f8: f001 fe34 bl 10004464 <__wrap___aeabi_uidiv> +100027fc: 3001 adds r0, #1 +100027fe: 0043 lsls r3, r0, #1 +10002800: 181b adds r3, r3, r0 +10002802: 3b03 subs r3, #3 +10002804: d2fd bcs.n 10002802 +10002806: 23e0 movs r3, #224 @ 0xe0 +10002808: 4a4f ldr r2, [pc, #316] @ (10002948 ) +1000280a: 6811 ldr r1, [r2, #0] +1000280c: 400b ands r3, r1 +1000280e: 4950 ldr r1, [pc, #320] @ (10002950 ) +10002810: 600b str r3, [r1, #0] +10002812: 2180 movs r1, #128 @ 0x80 +10002814: 4b4f ldr r3, [pc, #316] @ (10002954 ) +10002816: 0109 lsls r1, r1, #4 +10002818: 6019 str r1, [r3, #0] +1000281a: 2180 movs r1, #128 @ 0x80 +1000281c: 4b39 ldr r3, [pc, #228] @ (10002904 ) +1000281e: 0049 lsls r1, r1, #1 +10002820: 6051 str r1, [r2, #4] +10002822: 61e3 str r3, [r4, #28] +10002824: 4b4c ldr r3, [pc, #304] @ (10002958 ) +10002826: 685a ldr r2, [r3, #4] +10002828: 2aff cmp r2, #255 @ 0xff +1000282a: d800 bhi.n 1000282e +1000282c: 6059 str r1, [r3, #4] +1000282e: 2280 movs r2, #128 @ 0x80 +10002830: 4b4a ldr r3, [pc, #296] @ (1000295c ) +10002832: 0112 lsls r2, r2, #4 +10002834: 601a str r2, [r3, #0] +10002836: 6a21 ldr r1, [r4, #32] +10002838: 2900 cmp r1, #0 +1000283a: d007 beq.n 1000284c +1000283c: 6960 ldr r0, [r4, #20] +1000283e: f001 fe11 bl 10004464 <__wrap___aeabi_uidiv> +10002842: 3001 adds r0, #1 +10002844: 0043 lsls r3, r0, #1 +10002846: 181b adds r3, r3, r0 +10002848: 3b03 subs r3, #3 +1000284a: d2fd bcs.n 10002848 +1000284c: 23e0 movs r3, #224 @ 0xe0 +1000284e: 4a42 ldr r2, [pc, #264] @ (10002958 ) +10002850: 6811 ldr r1, [r2, #0] +10002852: 400b ands r3, r1 +10002854: 4942 ldr r1, [pc, #264] @ (10002960 ) +10002856: 600b str r3, [r1, #0] +10002858: 2180 movs r1, #128 @ 0x80 +1000285a: 4b42 ldr r3, [pc, #264] @ (10002964 ) +1000285c: 0109 lsls r1, r1, #4 +1000285e: 6019 str r1, [r3, #0] +10002860: 2380 movs r3, #128 @ 0x80 +10002862: 005b lsls r3, r3, #1 +10002864: 6053 str r3, [r2, #4] +10002866: 2280 movs r2, #128 @ 0x80 +10002868: 4b26 ldr r3, [pc, #152] @ (10002904 ) +1000286a: 02d2 lsls r2, r2, #11 +1000286c: 6223 str r3, [r4, #32] +1000286e: 4b3e ldr r3, [pc, #248] @ (10002968 ) +10002870: 6859 ldr r1, [r3, #4] +10002872: 4291 cmp r1, r2 +10002874: d200 bcs.n 10002878 +10002876: 605a str r2, [r3, #4] +10002878: 2280 movs r2, #128 @ 0x80 +1000287a: 4b3c ldr r3, [pc, #240] @ (1000296c ) +1000287c: 0112 lsls r2, r2, #4 +1000287e: 601a str r2, [r3, #0] +10002880: 6a61 ldr r1, [r4, #36] @ 0x24 +10002882: 2900 cmp r1, #0 +10002884: d007 beq.n 10002896 +10002886: 6960 ldr r0, [r4, #20] +10002888: f001 fdec bl 10004464 <__wrap___aeabi_uidiv> +1000288c: 3001 adds r0, #1 +1000288e: 0043 lsls r3, r0, #1 +10002890: 181b adds r3, r3, r0 +10002892: 3b03 subs r3, #3 +10002894: d2fd bcs.n 10002892 +10002896: 23e0 movs r3, #224 @ 0xe0 +10002898: 4a33 ldr r2, [pc, #204] @ (10002968 ) +1000289a: 6811 ldr r1, [r2, #0] +1000289c: 400b ands r3, r1 +1000289e: 4934 ldr r1, [pc, #208] @ (10002970 ) +100028a0: 600b str r3, [r1, #0] +100028a2: 2180 movs r1, #128 @ 0x80 +100028a4: 4b33 ldr r3, [pc, #204] @ (10002974 ) +100028a6: 0109 lsls r1, r1, #4 +100028a8: 6019 str r1, [r3, #0] +100028aa: 2380 movs r3, #128 @ 0x80 +100028ac: 02db lsls r3, r3, #11 +100028ae: 6053 str r3, [r2, #4] +100028b0: 4b15 ldr r3, [pc, #84] @ (10002908 ) +100028b2: 6263 str r3, [r4, #36] @ 0x24 +100028b4: 4b30 ldr r3, [pc, #192] @ (10002978 ) +100028b6: 685a ldr r2, [r3, #4] +100028b8: 2aff cmp r2, #255 @ 0xff +100028ba: d802 bhi.n 100028c2 +100028bc: 2280 movs r2, #128 @ 0x80 +100028be: 0052 lsls r2, r2, #1 +100028c0: 605a str r2, [r3, #4] +100028c2: 2280 movs r2, #128 @ 0x80 +100028c4: 4b2d ldr r3, [pc, #180] @ (1000297c ) +100028c6: 0112 lsls r2, r2, #4 +100028c8: 601a str r2, [r3, #0] +100028ca: 69a1 ldr r1, [r4, #24] +100028cc: 2900 cmp r1, #0 +100028ce: d007 beq.n 100028e0 +100028d0: 6960 ldr r0, [r4, #20] +100028d2: f001 fdc7 bl 10004464 <__wrap___aeabi_uidiv> +100028d6: 3001 adds r0, #1 +100028d8: 0043 lsls r3, r0, #1 +100028da: 181b adds r3, r3, r0 +100028dc: 3b03 subs r3, #3 +100028de: d2fd bcs.n 100028dc +100028e0: 23e0 movs r3, #224 @ 0xe0 +100028e2: 4a25 ldr r2, [pc, #148] @ (10002978 ) +100028e4: 6811 ldr r1, [r2, #0] +100028e6: 400b ands r3, r1 +100028e8: 4925 ldr r1, [pc, #148] @ (10002980 ) +100028ea: 600b str r3, [r1, #0] +100028ec: 2180 movs r1, #128 @ 0x80 +100028ee: 4b25 ldr r3, [pc, #148] @ (10002984 ) +100028f0: 0109 lsls r1, r1, #4 +100028f2: 6019 str r1, [r3, #0] +100028f4: 2380 movs r3, #128 @ 0x80 +100028f6: 005b lsls r3, r3, #1 +100028f8: 6053 str r3, [r2, #4] +100028fa: 4b12 ldr r3, [pc, #72] @ (10002944 ) +100028fc: 61a3 str r3, [r4, #24] +100028fe: e6f7 b.n 100026f0 +10002900: 20000fc0 .word 0x20000fc0 +10002904: 02dc6c00 .word 0x02dc6c00 +10002908: 0000b71b .word 0x0000b71b +1000290c: 40008000 .word 0x40008000 +10002910: 4000b03c .word 0x4000b03c +10002914: 4000b030 .word 0x4000b030 +10002918: 59682f00 .word 0x59682f00 +1000291c: 40028000 .word 0x40028000 +10002920: 47868c00 .word 0x47868c00 +10002924: 4002c000 .word 0x4002c000 +10002928: 40008030 .word 0x40008030 +1000292c: 40009030 .word 0x40009030 +10002930: 4000a030 .word 0x4000a030 +10002934: 00b71b00 .word 0x00b71b00 +10002938: 4000803c .word 0x4000803c +1000293c: 4000903c .word 0x4000903c +10002940: 4000a03c .word 0x4000a03c +10002944: 07735940 .word 0x07735940 +10002948: 40008054 .word 0x40008054 +1000294c: 4000b054 .word 0x4000b054 +10002950: 40009054 .word 0x40009054 +10002954: 4000a054 .word 0x4000a054 +10002958: 40008060 .word 0x40008060 +1000295c: 4000b060 .word 0x4000b060 +10002960: 40009060 .word 0x40009060 +10002964: 4000a060 .word 0x4000a060 +10002968: 4000806c .word 0x4000806c +1000296c: 4000b06c .word 0x4000b06c +10002970: 4000906c .word 0x4000906c +10002974: 4000a06c .word 0x4000a06c +10002978: 40008048 .word 0x40008048 +1000297c: 4000b048 .word 0x4000b048 +10002980: 40009048 .word 0x40009048 +10002984: 4000a048 .word 0x4000a048 + +10002988 : +10002988: 4b01 ldr r3, [pc, #4] @ (10002990 ) +1000298a: 0080 lsls r0, r0, #2 +1000298c: 58c0 ldr r0, [r0, r3] +1000298e: 4770 bx lr +10002990: 20000fc0 .word 0x20000fc0 + +10002994 : +10002994: b5f8 push {r3, r4, r5, r6, r7, lr} +10002996: 0004 movs r4, r0 +10002998: 4822 ldr r0, [pc, #136] @ (10002a24 ) +1000299a: 001e movs r6, r3 +1000299c: 0017 movs r7, r2 +1000299e: 000d movs r5, r1 +100029a0: f001 fd60 bl 10004464 <__wrap___aeabi_uidiv> +100029a4: 0001 movs r1, r0 +100029a6: 0038 movs r0, r7 +100029a8: f001 fd5c bl 10004464 <__wrap___aeabi_uidiv> +100029ac: 9b06 ldr r3, [sp, #24] +100029ae: 0436 lsls r6, r6, #16 +100029b0: 031b lsls r3, r3, #12 +100029b2: 431e orrs r6, r3 +100029b4: 6823 ldr r3, [r4, #0] +100029b6: 2b00 cmp r3, #0 +100029b8: db22 blt.n 10002a00 +100029ba: 4b1b ldr r3, [pc, #108] @ (10002a28 ) +100029bc: 491b ldr r1, [pc, #108] @ (10002a2c ) +100029be: 18e3 adds r3, r4, r3 +100029c0: 1e5a subs r2, r3, #1 +100029c2: 4193 sbcs r3, r2 +100029c4: 2280 movs r2, #128 @ 0x80 +100029c6: 0192 lsls r2, r2, #6 +100029c8: 4694 mov ip, r2 +100029ca: 425b negs r3, r3 +100029cc: 0b1b lsrs r3, r3, #12 +100029ce: 4a18 ldr r2, [pc, #96] @ (10002a30 ) +100029d0: 031b lsls r3, r3, #12 +100029d2: 4463 add r3, ip +100029d4: 6013 str r3, [r2, #0] +100029d6: 4a17 ldr r2, [pc, #92] @ (10002a34 ) +100029d8: 6013 str r3, [r2, #0] +100029da: 001f movs r7, r3 +100029dc: 688a ldr r2, [r1, #8] +100029de: 4397 bics r7, r2 +100029e0: d1fb bne.n 100029da +100029e2: 22c0 movs r2, #192 @ 0xc0 +100029e4: 1d23 adds r3, r4, #4 +100029e6: 0192 lsls r2, r2, #6 +100029e8: 431a orrs r2, r3 +100029ea: 2321 movs r3, #33 @ 0x21 +100029ec: 6025 str r5, [r4, #0] +100029ee: 60a0 str r0, [r4, #8] +100029f0: 6013 str r3, [r2, #0] +100029f2: 6823 ldr r3, [r4, #0] +100029f4: 2b00 cmp r3, #0 +100029f6: dafc bge.n 100029f2 +100029f8: 2308 movs r3, #8 +100029fa: 60e6 str r6, [r4, #12] +100029fc: 6013 str r3, [r2, #0] +100029fe: bdf8 pop {r3, r4, r5, r6, r7, pc} +10002a00: 233f movs r3, #63 @ 0x3f +10002a02: 6822 ldr r2, [r4, #0] +10002a04: 4013 ands r3, r2 +10002a06: 42ab cmp r3, r5 +10002a08: d1d7 bne.n 100029ba +10002a0a: 68a3 ldr r3, [r4, #8] +10002a0c: 051b lsls r3, r3, #20 +10002a0e: 0d1b lsrs r3, r3, #20 +10002a10: 4283 cmp r3, r0 +10002a12: d1d2 bne.n 100029ba +10002a14: 22ee movs r2, #238 @ 0xee +10002a16: 68e3 ldr r3, [r4, #12] +10002a18: 02d2 lsls r2, r2, #11 +10002a1a: 4013 ands r3, r2 +10002a1c: 42b3 cmp r3, r6 +10002a1e: d1cc bne.n 100029ba +10002a20: e7ed b.n 100029fe +10002a22: 46c0 nop @ (mov r8, r8) +10002a24: 00b71b00 .word 0x00b71b00 +10002a28: bffd4000 .word 0xbffd4000 +10002a2c: 4000c000 .word 0x4000c000 +10002a30: 4000e000 .word 0x4000e000 +10002a34: 4000f000 .word 0x4000f000 + +10002a38 : +10002a38: 2380 movs r3, #128 @ 0x80 +10002a3a: 4a02 ldr r2, [pc, #8] @ (10002a44 ) +10002a3c: 009b lsls r3, r3, #2 +10002a3e: 4303 orrs r3, r0 +10002a40: 62d3 str r3, [r2, #44] @ 0x2c +10002a42: 4770 bx lr +10002a44: 40058000 .word 0x40058000 + +10002a48 : +10002a48: b510 push {r4, lr} +10002a4a: 2480 movs r4, #128 @ 0x80 +10002a4c: 4b1c ldr r3, [pc, #112] @ (10002ac0 ) +10002a4e: 05e4 lsls r4, r4, #23 +10002a50: 601c str r4, [r3, #0] +10002a52: 2800 cmp r0, #0 +10002a54: d01a beq.n 10002a8c +10002a56: 2301 movs r3, #1 +10002a58: 4c1a ldr r4, [pc, #104] @ (10002ac4 ) +10002a5a: 4318 orrs r0, r3 +10002a5c: 4b1a ldr r3, [pc, #104] @ (10002ac8 ) +10002a5e: 61dc str r4, [r3, #28] +10002a60: 4c1a ldr r4, [pc, #104] @ (10002acc ) +10002a62: 4044 eors r4, r0 +10002a64: 621c str r4, [r3, #32] +10002a66: 6259 str r1, [r3, #36] @ 0x24 +10002a68: 6298 str r0, [r3, #40] @ 0x28 +10002a6a: 2180 movs r1, #128 @ 0x80 +10002a6c: 4b14 ldr r3, [pc, #80] @ (10002ac0 ) +10002a6e: 05c9 lsls r1, r1, #23 +10002a70: 6019 str r1, [r3, #0] +10002a72: 4817 ldr r0, [pc, #92] @ (10002ad0 ) +10002a74: 4917 ldr r1, [pc, #92] @ (10002ad4 ) +10002a76: 6008 str r0, [r1, #0] +10002a78: 21e0 movs r1, #224 @ 0xe0 +10002a7a: 04c9 lsls r1, r1, #19 +10002a7c: 6019 str r1, [r3, #0] +10002a7e: 2a00 cmp r2, #0 +10002a80: d107 bne.n 10002a92 +10002a82: 2280 movs r2, #128 @ 0x80 +10002a84: 4b14 ldr r3, [pc, #80] @ (10002ad8 ) +10002a86: 0612 lsls r2, r2, #24 +10002a88: 601a str r2, [r3, #0] +10002a8a: bd10 pop {r4, pc} +10002a8c: 4b0e ldr r3, [pc, #56] @ (10002ac8 ) +10002a8e: 61d8 str r0, [r3, #28] +10002a90: e7eb b.n 10002a6a +10002a92: 0153 lsls r3, r2, #5 +10002a94: 1a9b subs r3, r3, r2 +10002a96: 009b lsls r3, r3, #2 +10002a98: 189a adds r2, r3, r2 +10002a9a: 2380 movs r3, #128 @ 0x80 +10002a9c: 0112 lsls r2, r2, #4 +10002a9e: 045b lsls r3, r3, #17 +10002aa0: 429a cmp r2, r3 +10002aa2: d209 bcs.n 10002ab8 +10002aa4: 0013 movs r3, r2 +10002aa6: 490d ldr r1, [pc, #52] @ (10002adc ) +10002aa8: 600b str r3, [r1, #0] +10002aaa: 4b07 ldr r3, [pc, #28] @ (10002ac8 ) +10002aac: 605a str r2, [r3, #4] +10002aae: 2280 movs r2, #128 @ 0x80 +10002ab0: 4b09 ldr r3, [pc, #36] @ (10002ad8 ) +10002ab2: 05d2 lsls r2, r2, #23 +10002ab4: 601a str r2, [r3, #0] +10002ab6: e7e8 b.n 10002a8a +10002ab8: 4b09 ldr r3, [pc, #36] @ (10002ae0 ) +10002aba: 001a movs r2, r3 +10002abc: e7f3 b.n 10002aa6 +10002abe: 46c0 nop @ (mov r8, r8) +10002ac0: 4005b000 .word 0x4005b000 +10002ac4: b007c0d3 .word 0xb007c0d3 +10002ac8: 40058000 .word 0x40058000 +10002acc: 4ff83f2d .word 0x4ff83f2d +10002ad0: 0001fffc .word 0x0001fffc +10002ad4: 40012008 .word 0x40012008 +10002ad8: 4005a000 .word 0x4005a000 +10002adc: 20001cd0 .word 0x20001cd0 +10002ae0: 00ffffff .word 0x00ffffff + +10002ae4 : +10002ae4: 23aa movs r3, #170 @ 0xaa +10002ae6: 4a06 ldr r2, [pc, #24] @ (10002b00 ) +10002ae8: 011b lsls r3, r3, #4 +10002aea: 6013 str r3, [r2, #0] +10002aec: 232f movs r3, #47 @ 0x2f +10002aee: 4905 ldr r1, [pc, #20] @ (10002b04 ) +10002af0: 60d3 str r3, [r2, #12] +10002af2: 4b05 ldr r3, [pc, #20] @ (10002b08 ) +10002af4: 6019 str r1, [r3, #0] +10002af6: 6853 ldr r3, [r2, #4] +10002af8: 2b00 cmp r3, #0 +10002afa: dafc bge.n 10002af6 +10002afc: 4770 bx lr +10002afe: 46c0 nop @ (mov r8, r8) +10002b00: 40024000 .word 0x40024000 +10002b04: 00fab000 .word 0x00fab000 +10002b08: 40026000 .word 0x40026000 + +10002b0c : +10002b0c: 4b2c ldr r3, [pc, #176] @ (10002bc0 ) +10002b0e: 4a2d ldr r2, [pc, #180] @ (10002bc4 ) +10002b10: b570 push {r4, r5, r6, lr} +10002b12: 601a str r2, [r3, #0] +10002b14: 4a2c ldr r2, [pc, #176] @ (10002bc8 ) +10002b16: 4b2d ldr r3, [pc, #180] @ (10002bcc ) +10002b18: 492d ldr r1, [pc, #180] @ (10002bd0 ) +10002b1a: 601a str r2, [r3, #0] +10002b1c: 0014 movs r4, r2 +10002b1e: 688b ldr r3, [r1, #8] +10002b20: 439c bics r4, r3 +10002b22: d1fb bne.n 10002b1c +10002b24: 4d2b ldr r5, [pc, #172] @ (10002bd4 ) +10002b26: 4e2c ldr r6, [pc, #176] @ (10002bd8 ) +10002b28: 42b5 cmp r5, r6 +10002b2a: d208 bcs.n 10002b3e +10002b2c: 3e01 subs r6, #1 +10002b2e: 1b76 subs r6, r6, r5 +10002b30: 08b6 lsrs r6, r6, #2 +10002b32: cd08 ldmia r5!, {r3} +10002b34: 4798 blx r3 +10002b36: 0023 movs r3, r4 +10002b38: 3401 adds r4, #1 +10002b3a: 42b3 cmp r3, r6 +10002b3c: d1f9 bne.n 10002b32 +10002b3e: f7ff fdbf bl 100026c0 +10002b42: 4a26 ldr r2, [pc, #152] @ (10002bdc ) +10002b44: 4b21 ldr r3, [pc, #132] @ (10002bcc ) +10002b46: 601a str r2, [r3, #0] +10002b48: 4a21 ldr r2, [pc, #132] @ (10002bd0 ) +10002b4a: 6893 ldr r3, [r2, #8] +10002b4c: 43db mvns r3, r3 +10002b4e: 01db lsls r3, r3, #7 +10002b50: 09dd lsrs r5, r3, #7 +10002b52: 2b00 cmp r3, #0 +10002b54: d1f9 bne.n 10002b4a +10002b56: 2240 movs r2, #64 @ 0x40 +10002b58: 4b21 ldr r3, [pc, #132] @ (10002be0 ) +10002b5a: 4c22 ldr r4, [pc, #136] @ (10002be4 ) +10002b5c: 4e22 ldr r6, [pc, #136] @ (10002be8 ) +10002b5e: 679a str r2, [r3, #120] @ 0x78 +10002b60: 675a str r2, [r3, #116] @ 0x74 +10002b62: 671a str r2, [r3, #112] @ 0x70 +10002b64: 66da str r2, [r3, #108] @ 0x6c +10002b66: 42b4 cmp r4, r6 +10002b68: d208 bcs.n 10002b7c +10002b6a: 6823 ldr r3, [r4, #0] +10002b6c: 0020 movs r0, r4 +10002b6e: 2b00 cmp r3, #0 +10002b70: d020 beq.n 10002bb4 +10002b72: 3408 adds r4, #8 +10002b74: f7fe fde2 bl 1000173c +10002b78: 42b4 cmp r4, r6 +10002b7a: d3f6 bcc.n 10002b6a +10002b7c: 4c1b ldr r4, [pc, #108] @ (10002bec ) +10002b7e: 4e1c ldr r6, [pc, #112] @ (10002bf0 ) +10002b80: 22c0 movs r2, #192 @ 0xc0 +10002b82: 68b1 ldr r1, [r6, #8] +10002b84: 0020 movs r0, r4 +10002b86: f002 faf5 bl 10005174 <__wrap___aeabi_memcpy> +10002b8a: 60b4 str r4, [r6, #8] +10002b8c: f7fe fad4 bl 10001138 +10002b90: f7fe fd96 bl 100016c0 +10002b94: f7fe ff8a bl 10001aac +10002b98: 4c16 ldr r4, [pc, #88] @ (10002bf4 ) +10002b9a: 4e17 ldr r6, [pc, #92] @ (10002bf8 ) +10002b9c: 42b4 cmp r4, r6 +10002b9e: d208 bcs.n 10002bb2 +10002ba0: 3e01 subs r6, #1 +10002ba2: 1b36 subs r6, r6, r4 +10002ba4: 08b6 lsrs r6, r6, #2 +10002ba6: cc08 ldmia r4!, {r3} +10002ba8: 4798 blx r3 +10002baa: 002b movs r3, r5 +10002bac: 3501 adds r5, #1 +10002bae: 429e cmp r6, r3 +10002bb0: d1f9 bne.n 10002ba6 +10002bb2: bd70 pop {r4, r5, r6, pc} +10002bb4: 3408 adds r4, #8 +10002bb6: f7fe fdb3 bl 10001720 +10002bba: 42b4 cmp r4, r6 +10002bbc: d3d5 bcc.n 10002b6a +10002bbe: e7dd b.n 10002b7c +10002bc0: 4000e000 .word 0x4000e000 +10002bc4: fefbcdbf .word 0xfefbcdbf +10002bc8: 003c7ffe .word 0x003c7ffe +10002bcc: 4000f000 .word 0x4000f000 +10002bd0: 4000c000 .word 0x4000c000 +10002bd4: 20000fa0 .word 0x20000fa0 +10002bd8: 20000fb0 .word 0x20000fb0 +10002bdc: 01ffffff .word 0x01ffffff +10002be0: 4001f000 .word 0x4001f000 +10002be4: 20000f98 .word 0x20000f98 +10002be8: 20000fa0 .word 0x20000fa0 +10002bec: 20000000 .word 0x20000000 +10002bf0: e000ed00 .word 0xe000ed00 +10002bf4: 20000fb0 .word 0x20000fb0 +10002bf8: 20000fbc .word 0x20000fbc + +10002bfc <_exit>: +10002bfc: be00 bkpt 0x0000 +10002bfe: e7fd b.n 10002bfc <_exit> + +10002c00 : +10002c00: b510 push {r4, lr} +10002c02: f7ff fffb bl 10002bfc <_exit> +10002c06: 46c0 nop @ (mov r8, r8) + +10002c08 : +10002c08: b40f push {r0, r1, r2, r3} +10002c0a: b500 push {lr} +10002c0c: 4808 ldr r0, [pc, #32] @ (10002c30 ) +10002c0e: b083 sub sp, #12 +10002c10: f002 fb7e bl 10005310 <__wrap_puts> +10002c14: 9b04 ldr r3, [sp, #16] +10002c16: 2b00 cmp r3, #0 +10002c18: d007 beq.n 10002c2a +10002c1a: a905 add r1, sp, #20 +10002c1c: 0018 movs r0, r3 +10002c1e: 9101 str r1, [sp, #4] +10002c20: f001 fba6 bl 10004370 +10002c24: 4803 ldr r0, [pc, #12] @ (10002c34 ) +10002c26: f002 fb73 bl 10005310 <__wrap_puts> +10002c2a: 2001 movs r0, #1 +10002c2c: f7ff ffe6 bl 10002bfc <_exit> +10002c30: 10007cf4 .word 0x10007cf4 +10002c34: 10007d04 .word 0x10007d04 + +10002c38 : +10002c38: b510 push {r4, lr} +10002c3a: 4801 ldr r0, [pc, #4] @ (10002c40 ) +10002c3c: f7ff ffe4 bl 10002c08 +10002c40: 10007d08 .word 0x10007d08 + +10002c44 <_out_null>: +10002c44: 4770 bx lr +10002c46: 46c0 nop @ (mov r8, r8) + +10002c48 <_out_rev>: +10002c48: b5f8 push {r3, r4, r5, r6, r7, lr} +10002c4a: 4657 mov r7, sl +10002c4c: 46de mov lr, fp +10002c4e: 464e mov r6, r9 +10002c50: 4645 mov r5, r8 +10002c52: b5e0 push {r5, r6, r7, lr} +10002c54: 4699 mov r9, r3 +10002c56: 9b0a ldr r3, [sp, #40] @ 0x28 +10002c58: 0007 movs r7, r0 +10002c5a: 469a mov sl, r3 +10002c5c: 9b0d ldr r3, [sp, #52] @ 0x34 +10002c5e: 4688 mov r8, r1 +10002c60: 4693 mov fp, r2 +10002c62: 9c0b ldr r4, [sp, #44] @ 0x2c +10002c64: 079b lsls r3, r3, #30 +10002c66: d13b bne.n 10002ce0 <_out_rev+0x98> +10002c68: 9b0c ldr r3, [sp, #48] @ 0x30 +10002c6a: 429c cmp r4, r3 +10002c6c: d23d bcs.n 10002cea <_out_rev+0xa2> +10002c6e: 1b1e subs r6, r3, r4 +10002c70: 940b str r4, [sp, #44] @ 0x2c +10002c72: 0015 movs r5, r2 +10002c74: 000c movs r4, r1 +10002c76: 445e add r6, fp +10002c78: 002a movs r2, r5 +10002c7a: 464b mov r3, r9 +10002c7c: 3501 adds r5, #1 +10002c7e: 0021 movs r1, r4 +10002c80: 2020 movs r0, #32 +10002c82: 47b8 blx r7 +10002c84: 42b5 cmp r5, r6 +10002c86: d1f7 bne.n 10002c78 <_out_rev+0x30> +10002c88: 46a0 mov r8, r4 +10002c8a: 9c0b ldr r4, [sp, #44] @ 0x2c +10002c8c: 2c00 cmp r4, #0 +10002c8e: d020 beq.n 10002cd2 <_out_rev+0x8a> +10002c90: 4645 mov r5, r8 +10002c92: 1936 adds r6, r6, r4 +10002c94: 4653 mov r3, sl +10002c96: 1b32 subs r2, r6, r4 +10002c98: 3c01 subs r4, #1 +10002c9a: 5d18 ldrb r0, [r3, r4] +10002c9c: 0029 movs r1, r5 +10002c9e: 464b mov r3, r9 +10002ca0: 47b8 blx r7 +10002ca2: 2c00 cmp r4, #0 +10002ca4: d1f6 bne.n 10002c94 <_out_rev+0x4c> +10002ca6: 002b movs r3, r5 +10002ca8: 0035 movs r5, r6 +10002caa: 4698 mov r8, r3 +10002cac: 9b0d ldr r3, [sp, #52] @ 0x34 +10002cae: 079b lsls r3, r3, #30 +10002cb0: d50f bpl.n 10002cd2 <_out_rev+0x8a> +10002cb2: 465b mov r3, fp +10002cb4: 1aec subs r4, r5, r3 +10002cb6: 9b0c ldr r3, [sp, #48] @ 0x30 +10002cb8: 42a3 cmp r3, r4 +10002cba: d90a bls.n 10002cd2 <_out_rev+0x8a> +10002cbc: 4646 mov r6, r8 +10002cbe: 4698 mov r8, r3 +10002cc0: 002a movs r2, r5 +10002cc2: 464b mov r3, r9 +10002cc4: 0031 movs r1, r6 +10002cc6: 2020 movs r0, #32 +10002cc8: 3401 adds r4, #1 +10002cca: 47b8 blx r7 +10002ccc: 3501 adds r5, #1 +10002cce: 4544 cmp r4, r8 +10002cd0: d3f6 bcc.n 10002cc0 <_out_rev+0x78> +10002cd2: 0028 movs r0, r5 +10002cd4: bcf0 pop {r4, r5, r6, r7} +10002cd6: 46bb mov fp, r7 +10002cd8: 46b2 mov sl, r6 +10002cda: 46a9 mov r9, r5 +10002cdc: 46a0 mov r8, r4 +10002cde: bdf8 pop {r3, r4, r5, r6, r7, pc} +10002ce0: 0016 movs r6, r2 10002ce2: 0015 movs r5, r2 -10002ce4: 9b0f ldr r3, [sp, #60] @ 0x3c -10002ce6: 940b str r4, [sp, #44] @ 0x2c -10002ce8: e002 b.n 10002cf0 <_vsnprintf+0x20c> -10002cea: 2b20 cmp r3, #32 -10002cec: d00c beq.n 10002d08 <_vsnprintf+0x224> -10002cee: 0011 movs r1, r2 -10002cf0: 4664 mov r4, ip -10002cf2: 400c ands r4, r1 -10002cf4: 0020 movs r0, r4 -10002cf6: 3037 adds r0, #55 @ 0x37 -10002cf8: 2c09 cmp r4, #9 -10002cfa: d800 bhi.n 10002cfe <_vsnprintf+0x21a> -10002cfc: 3807 subs r0, #7 -10002cfe: 3301 adds r3, #1 -10002d00: 54e8 strb r0, [r5, r3] -10002d02: 090a lsrs r2, r1, #4 -10002d04: 290f cmp r1, #15 -10002d06: d8f0 bhi.n 10002cea <_vsnprintf+0x206> -10002d08: 9c0b ldr r4, [sp, #44] @ 0x2c -10002d0a: 9d0d ldr r5, [sp, #52] @ 0x34 -10002d0c: 930f str r3, [sp, #60] @ 0x3c -10002d0e: 464b mov r3, r9 -10002d10: 2208 movs r2, #8 -10002d12: 9306 str r3, [sp, #24] -10002d14: 4653 mov r3, sl -10002d16: 9205 str r2, [sp, #20] -10002d18: 3208 adds r2, #8 -10002d1a: 9203 str r2, [sp, #12] -10002d1c: 2200 movs r2, #0 -10002d1e: 9304 str r3, [sp, #16] -10002d20: 9b0f ldr r3, [sp, #60] @ 0x3c -10002d22: 9202 str r2, [sp, #8] -10002d24: 9301 str r3, [sp, #4] -10002d26: ab1c add r3, sp, #112 @ 0x70 -10002d28: 0022 movs r2, r4 -10002d2a: 9300 str r3, [sp, #0] -10002d2c: 4659 mov r1, fp -10002d2e: 0033 movs r3, r6 -10002d30: 0028 movs r0, r5 -10002d32: f7ff f98d bl 10002050 <_ntoa_format> -10002d36: 4643 mov r3, r8 -10002d38: 0004 movs r4, r0 -10002d3a: 930d str r3, [sp, #52] @ 0x34 -10002d3c: e6fa b.n 10002b34 <_vsnprintf+0x50> -10002d3e: 9b0d ldr r3, [sp, #52] @ 0x34 -10002d40: cb04 ldmia r3!, {r2} -10002d42: 4690 mov r8, r2 -10002d44: 2a00 cmp r2, #0 -10002d46: db79 blt.n 10002e3c <_vsnprintf+0x358> -10002d48: 7878 ldrb r0, [r7, #1] -10002d4a: 930d str r3, [sp, #52] @ 0x34 -10002d4c: 000f movs r7, r1 -10002d4e: 3101 adds r1, #1 -10002d50: e717 b.n 10002b82 <_vsnprintf+0x9e> -10002d52: 9b0d ldr r3, [sp, #52] @ 0x34 -10002d54: cb02 ldmia r3!, {r1} -10002d56: 9314 str r3, [sp, #80] @ 0x50 -10002d58: 780b ldrb r3, [r1, #0] -10002d5a: 469c mov ip, r3 -10002d5c: 0018 movs r0, r3 -10002d5e: 4653 mov r3, sl -10002d60: 2b00 cmp r3, #0 -10002d62: d100 bne.n 10002d66 <_vsnprintf+0x282> -10002d64: e134 b.n 10002fd0 <_vsnprintf+0x4ec> -10002d66: 2800 cmp r0, #0 -10002d68: d015 beq.n 10002d96 <_vsnprintf+0x2b2> -10002d6a: 4653 mov r3, sl -10002d6c: 3b01 subs r3, #1 -10002d6e: 3301 adds r3, #1 -10002d70: 4699 mov r9, r3 -10002d72: 940d str r4, [sp, #52] @ 0x34 -10002d74: 9c0b ldr r4, [sp, #44] @ 0x2c -10002d76: 4489 add r9, r1 -10002d78: 464a mov r2, r9 -10002d7a: 000b movs r3, r1 -10002d7c: 46a1 mov r9, r4 -10002d7e: e001 b.n 10002d84 <_vsnprintf+0x2a0> -10002d80: 4293 cmp r3, r2 -10002d82: d003 beq.n 10002d8c <_vsnprintf+0x2a8> -10002d84: 785c ldrb r4, [r3, #1] -10002d86: 3301 adds r3, #1 -10002d88: 2c00 cmp r4, #0 -10002d8a: d1f9 bne.n 10002d80 <_vsnprintf+0x29c> -10002d8c: 464a mov r2, r9 -10002d8e: 1a5b subs r3, r3, r1 -10002d90: 9c0d ldr r4, [sp, #52] @ 0x34 -10002d92: 920b str r2, [sp, #44] @ 0x2c -10002d94: 930f str r3, [sp, #60] @ 0x3c -10002d96: 2380 movs r3, #128 @ 0x80 -10002d98: 00db lsls r3, r3, #3 -10002d9a: 4699 mov r9, r3 -10002d9c: 9a0b ldr r2, [sp, #44] @ 0x2c -10002d9e: 4013 ands r3, r2 -10002da0: 930d str r3, [sp, #52] @ 0x34 -10002da2: 464b mov r3, r9 -10002da4: 421a tst r2, r3 -10002da6: d004 beq.n 10002db2 <_vsnprintf+0x2ce> -10002da8: 9b0f ldr r3, [sp, #60] @ 0x3c -10002daa: 4553 cmp r3, sl -10002dac: d901 bls.n 10002db2 <_vsnprintf+0x2ce> -10002dae: 4653 mov r3, sl -10002db0: 930f str r3, [sp, #60] @ 0x3c -10002db2: 2302 movs r3, #2 -10002db4: 4699 mov r9, r3 -10002db6: 9a0b ldr r2, [sp, #44] @ 0x2c -10002db8: 4013 ands r3, r2 -10002dba: 930b str r3, [sp, #44] @ 0x2c -10002dbc: 464b mov r3, r9 -10002dbe: 4213 tst r3, r2 -10002dc0: d100 bne.n 10002dc4 <_vsnprintf+0x2e0> -10002dc2: e1f5 b.n 100031b0 <_vsnprintf+0x6cc> -10002dc4: 4663 mov r3, ip -10002dc6: 2b00 cmp r3, #0 -10002dc8: d100 bne.n 10002dcc <_vsnprintf+0x2e8> -10002dca: e1d6 b.n 1000317a <_vsnprintf+0x696> -10002dcc: 9b0d ldr r3, [sp, #52] @ 0x34 -10002dce: 2b00 cmp r3, #0 -10002dd0: d100 bne.n 10002dd4 <_vsnprintf+0x2f0> -10002dd2: e182 b.n 100030da <_vsnprintf+0x5f6> -10002dd4: 1b0b subs r3, r1, r4 -10002dd6: 46d1 mov r9, sl -10002dd8: 0031 movs r1, r6 -10002dda: 469a mov sl, r3 -10002ddc: 003b movs r3, r7 -10002dde: 44a1 add r9, r4 -10002de0: 002e movs r6, r5 -10002de2: 465f mov r7, fp -10002de4: 464d mov r5, r9 -10002de6: 0022 movs r2, r4 -10002de8: 469b mov fp, r3 -10002dea: 4689 mov r9, r1 -10002dec: e009 b.n 10002e02 <_vsnprintf+0x31e> -10002dee: 464b mov r3, r9 -10002df0: 0039 movs r1, r7 -10002df2: 1c54 adds r4, r2, #1 -10002df4: 47b0 blx r6 -10002df6: 4653 mov r3, sl -10002df8: 5d18 ldrb r0, [r3, r4] -10002dfa: 2800 cmp r0, #0 -10002dfc: d100 bne.n 10002e00 <_vsnprintf+0x31c> -10002dfe: e192 b.n 10003126 <_vsnprintf+0x642> -10002e00: 0022 movs r2, r4 -10002e02: 4295 cmp r5, r2 -10002e04: d1f3 bne.n 10002dee <_vsnprintf+0x30a> -10002e06: 464b mov r3, r9 -10002e08: 465a mov r2, fp -10002e0a: 46a9 mov r9, r5 -10002e0c: 46bb mov fp, r7 -10002e0e: 0035 movs r5, r6 -10002e10: 0017 movs r7, r2 -10002e12: 001e movs r6, r3 -10002e14: 464c mov r4, r9 -10002e16: 9b0b ldr r3, [sp, #44] @ 0x2c -10002e18: 2b00 cmp r3, #0 -10002e1a: d000 beq.n 10002e1e <_vsnprintf+0x33a> -10002e1c: e1ad b.n 1000317a <_vsnprintf+0x696> -10002e1e: 9b14 ldr r3, [sp, #80] @ 0x50 -10002e20: 930d str r3, [sp, #52] @ 0x34 -10002e22: e687 b.n 10002b34 <_vsnprintf+0x50> -10002e24: 10002ae5 .word 0x10002ae5 -10002e28: 20001c04 .word 0x20001c04 -10002e2c: 10006fe0 .word 0x10006fe0 -10002e30: 10007024 .word 0x10007024 -10002e34: 10007070 .word 0x10007070 -10002e38: 00009041 .word 0x00009041 -10002e3c: 9a0b ldr r2, [sp, #44] @ 0x2c -10002e3e: 3828 subs r0, #40 @ 0x28 -10002e40: 4302 orrs r2, r0 -10002e42: 920b str r2, [sp, #44] @ 0x2c -10002e44: 4642 mov r2, r8 -10002e46: 4252 negs r2, r2 -10002e48: 7878 ldrb r0, [r7, #1] -10002e4a: 4690 mov r8, r2 -10002e4c: 000f movs r7, r1 -10002e4e: 930d str r3, [sp, #52] @ 0x34 -10002e50: 3101 adds r1, #1 -10002e52: e696 b.n 10002b82 <_vsnprintf+0x9e> -10002e54: 7878 ldrb r0, [r7, #1] -10002e56: 286c cmp r0, #108 @ 0x6c -10002e58: d100 bne.n 10002e5c <_vsnprintf+0x378> -10002e5a: e15d b.n 10003118 <_vsnprintf+0x634> -10002e5c: 2380 movs r3, #128 @ 0x80 -10002e5e: 9a0b ldr r2, [sp, #44] @ 0x2c -10002e60: 005b lsls r3, r3, #1 -10002e62: 431a orrs r2, r3 -10002e64: 920b str r2, [sp, #44] @ 0x2c -10002e66: 3101 adds r1, #1 -10002e68: e6b3 b.n 10002bd2 <_vsnprintf+0xee> -10002e6a: 2380 movs r3, #128 @ 0x80 -10002e6c: 009b lsls r3, r3, #2 -10002e6e: e6ab b.n 10002bc8 <_vsnprintf+0xe4> -10002e70: 7878 ldrb r0, [r7, #1] -10002e72: 2868 cmp r0, #104 @ 0x68 -10002e74: d100 bne.n 10002e78 <_vsnprintf+0x394> -10002e76: e148 b.n 1000310a <_vsnprintf+0x626> -10002e78: 2380 movs r3, #128 @ 0x80 -10002e7a: 9a0b ldr r2, [sp, #44] @ 0x2c -10002e7c: 3101 adds r1, #1 -10002e7e: 431a orrs r2, r3 -10002e80: 920b str r2, [sp, #44] @ 0x2c -10002e82: e6a6 b.n 10002bd2 <_vsnprintf+0xee> -10002e84: 2867 cmp r0, #103 @ 0x67 -10002e86: d100 bne.n 10002e8a <_vsnprintf+0x3a6> -10002e88: e0b2 b.n 10002ff0 <_vsnprintf+0x50c> -10002e8a: 2847 cmp r0, #71 @ 0x47 -10002e8c: d100 bne.n 10002e90 <_vsnprintf+0x3ac> -10002e8e: e11a b.n 100030c6 <_vsnprintf+0x5e2> -10002e90: 2845 cmp r0, #69 @ 0x45 -10002e92: d100 bne.n 10002e96 <_vsnprintf+0x3b2> -10002e94: e11c b.n 100030d0 <_vsnprintf+0x5ec> -10002e96: 9a0b ldr r2, [sp, #44] @ 0x2c -10002e98: 2107 movs r1, #7 -10002e9a: 9204 str r2, [sp, #16] -10002e9c: 4642 mov r2, r8 -10002e9e: 9b0d ldr r3, [sp, #52] @ 0x34 -10002ea0: 9203 str r2, [sp, #12] -10002ea2: 3307 adds r3, #7 -10002ea4: 4652 mov r2, sl -10002ea6: 438b bics r3, r1 -10002ea8: 0019 movs r1, r3 -10002eaa: 9202 str r2, [sp, #8] -10002eac: c90c ldmia r1!, {r2, r3} -10002eae: 0028 movs r0, r5 -10002eb0: 9200 str r2, [sp, #0] -10002eb2: 9301 str r3, [sp, #4] -10002eb4: 910d str r1, [sp, #52] @ 0x34 -10002eb6: 0022 movs r2, r4 -10002eb8: 0033 movs r3, r6 -10002eba: 4659 mov r1, fp -10002ebc: f7ff fa00 bl 100022c0 <_etoa> -10002ec0: 0004 movs r4, r0 -10002ec2: e637 b.n 10002b34 <_vsnprintf+0x50> -10002ec4: 2846 cmp r0, #70 @ 0x46 -10002ec6: d100 bne.n 10002eca <_vsnprintf+0x3e6> -10002ec8: e08d b.n 10002fe6 <_vsnprintf+0x502> -10002eca: 9a0b ldr r2, [sp, #44] @ 0x2c -10002ecc: 2107 movs r1, #7 -10002ece: 9204 str r2, [sp, #16] -10002ed0: 4642 mov r2, r8 -10002ed2: 9b0d ldr r3, [sp, #52] @ 0x34 -10002ed4: 9203 str r2, [sp, #12] -10002ed6: 3307 adds r3, #7 -10002ed8: 4652 mov r2, sl -10002eda: 438b bics r3, r1 -10002edc: 0019 movs r1, r3 -10002ede: 9202 str r2, [sp, #8] -10002ee0: c90c ldmia r1!, {r2, r3} -10002ee2: 0028 movs r0, r5 -10002ee4: 9200 str r2, [sp, #0] -10002ee6: 9301 str r3, [sp, #4] -10002ee8: 910d str r1, [sp, #52] @ 0x34 -10002eea: 0022 movs r2, r4 -10002eec: 0033 movs r3, r6 -10002eee: 4659 mov r1, fp -10002ef0: f7ff fc18 bl 10002724 <_ftoa> -10002ef4: 0004 movs r4, r0 -10002ef6: e61d b.n 10002b34 <_vsnprintf+0x50> -10002ef8: 1c63 adds r3, r4, #1 -10002efa: 4698 mov r8, r3 -10002efc: 0022 movs r2, r4 -10002efe: 0033 movs r3, r6 -10002f00: 4659 mov r1, fp -10002f02: 2025 movs r0, #37 @ 0x25 -10002f04: 47a8 blx r5 -10002f06: 4644 mov r4, r8 -10002f08: e614 b.n 10002b34 <_vsnprintf+0x50> -10002f0a: 9b0d ldr r3, [sp, #52] @ 0x34 -10002f0c: 3304 adds r3, #4 -10002f0e: 930f str r3, [sp, #60] @ 0x3c -10002f10: 1c63 adds r3, r4, #1 -10002f12: 4699 mov r9, r3 -10002f14: 9b0b ldr r3, [sp, #44] @ 0x2c -10002f16: 079a lsls r2, r3, #30 -10002f18: d400 bmi.n 10002f1c <_vsnprintf+0x438> -10002f1a: e10a b.n 10003132 <_vsnprintf+0x64e> -10002f1c: 9b0d ldr r3, [sp, #52] @ 0x34 -10002f1e: 0022 movs r2, r4 -10002f20: 7818 ldrb r0, [r3, #0] -10002f22: 4659 mov r1, fp -10002f24: 0033 movs r3, r6 -10002f26: 47a8 blx r5 -10002f28: 4643 mov r3, r8 -10002f2a: 4444 add r4, r8 -10002f2c: 2b01 cmp r3, #1 -10002f2e: d800 bhi.n 10002f32 <_vsnprintf+0x44e> -10002f30: e16f b.n 10003212 <_vsnprintf+0x72e> -10002f32: 46b0 mov r8, r6 -10002f34: 002e movs r6, r5 -10002f36: 0025 movs r5, r4 -10002f38: 464c mov r4, r9 -10002f3a: 46b9 mov r9, r7 -10002f3c: 465f mov r7, fp -10002f3e: 0022 movs r2, r4 -10002f40: 4643 mov r3, r8 -10002f42: 3401 adds r4, #1 -10002f44: 0039 movs r1, r7 -10002f46: 2020 movs r0, #32 -10002f48: 47b0 blx r6 -10002f4a: 42ac cmp r4, r5 -10002f4c: d1f7 bne.n 10002f3e <_vsnprintf+0x45a> -10002f4e: 002c movs r4, r5 -10002f50: 46bb mov fp, r7 -10002f52: 0035 movs r5, r6 -10002f54: 464f mov r7, r9 -10002f56: 4646 mov r6, r8 -10002f58: 9b0f ldr r3, [sp, #60] @ 0x3c -10002f5a: 930d str r3, [sp, #52] @ 0x34 -10002f5c: e5ea b.n 10002b34 <_vsnprintf+0x50> -10002f5e: 4bd6 ldr r3, [pc, #856] @ (100032b8 <_vsnprintf+0x7d4>) -10002f60: 7838 ldrb r0, [r7, #0] -10002f62: 469a mov sl, r3 -10002f64: 2300 movs r3, #0 -10002f66: 4698 mov r8, r3 -10002f68: 2800 cmp r0, #0 -10002f6a: d000 beq.n 10002f6e <_vsnprintf+0x48a> -10002f6c: e5d3 b.n 10002b16 <_vsnprintf+0x32> -10002f6e: 2400 movs r4, #0 -10002f70: e66f b.n 10002c52 <_vsnprintf+0x16e> -10002f72: 286f cmp r0, #111 @ 0x6f -10002f74: d042 beq.n 10002ffc <_vsnprintf+0x518> -10002f76: d800 bhi.n 10002f7a <_vsnprintf+0x496> -10002f78: e1fd b.n 10003376 <_vsnprintf+0x892> -10002f7a: 2310 movs r3, #16 -10002f7c: 2878 cmp r0, #120 @ 0x78 -10002f7e: d100 bne.n 10002f82 <_vsnprintf+0x49e> -10002f80: e09b b.n 100030ba <_vsnprintf+0x5d6> -10002f82: 9a0b ldr r2, [sp, #44] @ 0x2c -10002f84: 439a bics r2, r3 -10002f86: 920b str r2, [sp, #44] @ 0x2c -10002f88: 230a movs r3, #10 -10002f8a: 469c mov ip, r3 -10002f8c: 2300 movs r3, #0 -10002f8e: 9314 str r3, [sp, #80] @ 0x50 -10002f90: 330a adds r3, #10 -10002f92: 930f str r3, [sp, #60] @ 0x3c -10002f94: e038 b.n 10003008 <_vsnprintf+0x524> -10002f96: 4657 mov r7, sl -10002f98: 9a0b ldr r2, [sp, #44] @ 0x2c -10002f9a: 00b9 lsls r1, r7, #2 -10002f9c: 19c9 adds r1, r1, r7 -10002f9e: 0049 lsls r1, r1, #1 -10002fa0: 3301 adds r3, #1 -10002fa2: 180f adds r7, r1, r0 -10002fa4: 7818 ldrb r0, [r3, #0] -10002fa6: 3f30 subs r7, #48 @ 0x30 -10002fa8: 0001 movs r1, r0 -10002faa: 3930 subs r1, #48 @ 0x30 -10002fac: 2909 cmp r1, #9 -10002fae: d9f4 bls.n 10002f9a <_vsnprintf+0x4b6> -10002fb0: 46ba mov sl, r7 -10002fb2: 920b str r2, [sp, #44] @ 0x2c -10002fb4: 001f movs r7, r3 -10002fb6: 1c59 adds r1, r3, #1 -10002fb8: e5e7 b.n 10002b8a <_vsnprintf+0xa6> -10002fba: 9b0d ldr r3, [sp, #52] @ 0x34 -10002fbc: 78b8 ldrb r0, [r7, #2] -10002fbe: cb04 ldmia r3!, {r2} -10002fc0: 3702 adds r7, #2 -10002fc2: 43d1 mvns r1, r2 -10002fc4: 17c9 asrs r1, r1, #31 -10002fc6: 400a ands r2, r1 -10002fc8: 4692 mov sl, r2 -10002fca: 930d str r3, [sp, #52] @ 0x34 -10002fcc: 1c79 adds r1, r7, #1 -10002fce: e5dc b.n 10002b8a <_vsnprintf+0xa6> -10002fd0: 2800 cmp r0, #0 -10002fd2: d100 bne.n 10002fd6 <_vsnprintf+0x4f2> -10002fd4: e6df b.n 10002d96 <_vsnprintf+0x2b2> -10002fd6: 2302 movs r3, #2 -10002fd8: 425b negs r3, r3 -10002fda: e6c8 b.n 10002d6e <_vsnprintf+0x28a> -10002fdc: 2021 movs r0, #33 @ 0x21 -10002fde: 9a0b ldr r2, [sp, #44] @ 0x2c -10002fe0: 4302 orrs r2, r0 -10002fe2: 4691 mov r9, r2 -10002fe4: e676 b.n 10002cd4 <_vsnprintf+0x1f0> -10002fe6: 2320 movs r3, #32 -10002fe8: 9a0b ldr r2, [sp, #44] @ 0x2c -10002fea: 431a orrs r2, r3 -10002fec: 920b str r2, [sp, #44] @ 0x2c -10002fee: e76c b.n 10002eca <_vsnprintf+0x3e6> -10002ff0: 2380 movs r3, #128 @ 0x80 -10002ff2: 9a0b ldr r2, [sp, #44] @ 0x2c -10002ff4: 011b lsls r3, r3, #4 -10002ff6: 431a orrs r2, r3 -10002ff8: 920b str r2, [sp, #44] @ 0x2c -10002ffa: e74c b.n 10002e96 <_vsnprintf+0x3b2> -10002ffc: 2308 movs r3, #8 -10002ffe: 469c mov ip, r3 +10002ce4: 2c00 cmp r4, #0 +10002ce6: d1d3 bne.n 10002c90 <_out_rev+0x48> +10002ce8: e7e0 b.n 10002cac <_out_rev+0x64> +10002cea: 0016 movs r6, r2 +10002cec: 2c00 cmp r4, #0 +10002cee: d1cf bne.n 10002c90 <_out_rev+0x48> +10002cf0: 0015 movs r5, r2 +10002cf2: e7ee b.n 10002cd2 <_out_rev+0x8a> + +10002cf4 <_ntoa_format>: +10002cf4: b5f0 push {r4, r5, r6, r7, lr} +10002cf6: 464f mov r7, r9 +10002cf8: 4646 mov r6, r8 +10002cfa: 46d6 mov lr, sl +10002cfc: b5c0 push {r6, r7, lr} +10002cfe: b084 sub sp, #16 +10002d00: 4698 mov r8, r3 +10002d02: ab0e add r3, sp, #56 @ 0x38 +10002d04: 781b ldrb r3, [r3, #0] +10002d06: 4694 mov ip, r2 +10002d08: 4699 mov r9, r3 +10002d0a: 9b12 ldr r3, [sp, #72] @ 0x48 +10002d0c: 9c0d ldr r4, [sp, #52] @ 0x34 +10002d0e: 9f10 ldr r7, [sp, #64] @ 0x40 +10002d10: 9e11 ldr r6, [sp, #68] @ 0x44 +10002d12: 079a lsls r2, r3, #30 +10002d14: d425 bmi.n 10002d62 <_ntoa_format+0x6e> +10002d16: 2e00 cmp r6, #0 +10002d18: d165 bne.n 10002de6 <_ntoa_format+0xf2> +10002d1a: 42bc cmp r4, r7 +10002d1c: d221 bcs.n 10002d62 <_ntoa_format+0x6e> +10002d1e: 2201 movs r2, #1 +10002d20: 401a ands r2, r3 +10002d22: 4692 mov sl, r2 +10002d24: 2c20 cmp r4, #32 +10002d26: d100 bne.n 10002d2a <_ntoa_format+0x36> +10002d28: e0e9 b.n 10002efe <_ntoa_format+0x20a> +10002d2a: 9a0c ldr r2, [sp, #48] @ 0x30 +10002d2c: 1e55 subs r5, r2, #1 +10002d2e: 2230 movs r2, #48 @ 0x30 +10002d30: e002 b.n 10002d38 <_ntoa_format+0x44> +10002d32: 2c20 cmp r4, #32 +10002d34: d100 bne.n 10002d38 <_ntoa_format+0x44> +10002d36: e07b b.n 10002e30 <_ntoa_format+0x13c> +10002d38: 3401 adds r4, #1 +10002d3a: 552a strb r2, [r5, r4] +10002d3c: 42a7 cmp r7, r4 +10002d3e: d8f8 bhi.n 10002d32 <_ntoa_format+0x3e> +10002d40: 4652 mov r2, sl +10002d42: 2a00 cmp r2, #0 +10002d44: d00d beq.n 10002d62 <_ntoa_format+0x6e> +10002d46: 42b4 cmp r4, r6 +10002d48: d20b bcs.n 10002d62 <_ntoa_format+0x6e> +10002d4a: 9a0c ldr r2, [sp, #48] @ 0x30 +10002d4c: 1e55 subs r5, r2, #1 +10002d4e: 2230 movs r2, #48 @ 0x30 +10002d50: 2c20 cmp r4, #32 +10002d52: d102 bne.n 10002d5a <_ntoa_format+0x66> +10002d54: e071 b.n 10002e3a <_ntoa_format+0x146> +10002d56: 2c20 cmp r4, #32 +10002d58: d02d beq.n 10002db6 <_ntoa_format+0xc2> +10002d5a: 3401 adds r4, #1 +10002d5c: 552a strb r2, [r5, r4] +10002d5e: 42b4 cmp r4, r6 +10002d60: d1f9 bne.n 10002d56 <_ntoa_format+0x62> +10002d62: 06da lsls r2, r3, #27 +10002d64: d53c bpl.n 10002de0 <_ntoa_format+0xec> +10002d66: 055a lsls r2, r3, #21 +10002d68: d42e bmi.n 10002dc8 <_ntoa_format+0xd4> +10002d6a: 2c00 cmp r4, #0 +10002d6c: d128 bne.n 10002dc0 <_ntoa_format+0xcc> +10002d6e: 9a0f ldr r2, [sp, #60] @ 0x3c +10002d70: 2a10 cmp r2, #16 +10002d72: d100 bne.n 10002d76 <_ntoa_format+0x82> +10002d74: e0b6 b.n 10002ee4 <_ntoa_format+0x1f0> +10002d76: 2a02 cmp r2, #2 +10002d78: d100 bne.n 10002d7c <_ntoa_format+0x88> +10002d7a: e0bc b.n 10002ef6 <_ntoa_format+0x202> +10002d7c: 2230 movs r2, #48 @ 0x30 +10002d7e: 9c0c ldr r4, [sp, #48] @ 0x30 +10002d80: 7022 strb r2, [r4, #0] +10002d82: 2401 movs r4, #1 +10002d84: 464a mov r2, r9 +10002d86: 2a00 cmp r2, #0 +10002d88: d165 bne.n 10002e56 <_ntoa_format+0x162> +10002d8a: 075a lsls r2, r3, #29 +10002d8c: d400 bmi.n 10002d90 <_ntoa_format+0x9c> +10002d8e: e099 b.n 10002ec4 <_ntoa_format+0x1d0> +10002d90: 222b movs r2, #43 @ 0x2b +10002d92: 9d0c ldr r5, [sp, #48] @ 0x30 +10002d94: 552a strb r2, [r5, r4] +10002d96: 3401 adds r4, #1 +10002d98: 9303 str r3, [sp, #12] +10002d9a: 9b0c ldr r3, [sp, #48] @ 0x30 +10002d9c: 4662 mov r2, ip +10002d9e: 9300 str r3, [sp, #0] +10002da0: 9602 str r6, [sp, #8] +10002da2: 4643 mov r3, r8 +10002da4: 9401 str r4, [sp, #4] +10002da6: f7ff ff4f bl 10002c48 <_out_rev> +10002daa: b004 add sp, #16 +10002dac: bce0 pop {r5, r6, r7} +10002dae: 46ba mov sl, r7 +10002db0: 46b1 mov r9, r6 +10002db2: 46a8 mov r8, r5 +10002db4: bdf0 pop {r4, r5, r6, r7, pc} +10002db6: 2420 movs r4, #32 +10002db8: 06da lsls r2, r3, #27 +10002dba: d5ed bpl.n 10002d98 <_ntoa_format+0xa4> +10002dbc: 055a lsls r2, r3, #21 +10002dbe: d403 bmi.n 10002dc8 <_ntoa_format+0xd4> +10002dc0: 42a7 cmp r7, r4 +10002dc2: d066 beq.n 10002e92 <_ntoa_format+0x19e> +10002dc4: 42b4 cmp r4, r6 +10002dc6: d064 beq.n 10002e92 <_ntoa_format+0x19e> +10002dc8: 9a0f ldr r2, [sp, #60] @ 0x3c +10002dca: 2a10 cmp r2, #16 +10002dcc: d071 beq.n 10002eb2 <_ntoa_format+0x1be> +10002dce: 2a02 cmp r2, #2 +10002dd0: d057 beq.n 10002e82 <_ntoa_format+0x18e> +10002dd2: 2c20 cmp r4, #32 +10002dd4: d0e0 beq.n 10002d98 <_ntoa_format+0xa4> +10002dd6: 0022 movs r2, r4 +10002dd8: 3401 adds r4, #1 +10002dda: 2530 movs r5, #48 @ 0x30 +10002ddc: 9f0c ldr r7, [sp, #48] @ 0x30 +10002dde: 54bd strb r5, [r7, r2] +10002de0: 2c20 cmp r4, #32 +10002de2: d0d9 beq.n 10002d98 <_ntoa_format+0xa4> +10002de4: e7ce b.n 10002d84 <_ntoa_format+0x90> +10002de6: 2201 movs r2, #1 +10002de8: 0015 movs r5, r2 +10002dea: 401d ands r5, r3 +10002dec: 46aa mov sl, r5 +10002dee: 421a tst r2, r3 +10002df0: d036 beq.n 10002e60 <_ntoa_format+0x16c> +10002df2: 464a mov r2, r9 +10002df4: 2a00 cmp r2, #0 +10002df6: d14a bne.n 10002e8e <_ntoa_format+0x19a> +10002df8: 320c adds r2, #12 +10002dfa: 421a tst r2, r3 +10002dfc: d147 bne.n 10002e8e <_ntoa_format+0x19a> +10002dfe: 42bc cmp r4, r7 +10002e00: d2a1 bcs.n 10002d46 <_ntoa_format+0x52> +10002e02: 2c20 cmp r4, #32 +10002e04: d191 bne.n 10002d2a <_ntoa_format+0x36> +10002e06: 2e20 cmp r6, #32 +10002e08: d817 bhi.n 10002e3a <_ntoa_format+0x146> +10002e0a: 2420 movs r4, #32 +10002e0c: 06da lsls r2, r3, #27 +10002e0e: d5c3 bpl.n 10002d98 <_ntoa_format+0xa4> +10002e10: 055a lsls r2, r3, #21 +10002e12: d41b bmi.n 10002e4c <_ntoa_format+0x158> +10002e14: 2f20 cmp r7, #32 +10002e16: d001 beq.n 10002e1c <_ntoa_format+0x128> +10002e18: 2e20 cmp r6, #32 +10002e1a: d1d5 bne.n 10002dc8 <_ntoa_format+0xd4> +10002e1c: 221f movs r2, #31 +10002e1e: 9d0f ldr r5, [sp, #60] @ 0x3c +10002e20: 2d10 cmp r5, #16 +10002e22: d06f beq.n 10002f04 <_ntoa_format+0x210> +10002e24: 2d02 cmp r5, #2 +10002e26: d1d8 bne.n 10002dda <_ntoa_format+0xe6> +10002e28: 2562 movs r5, #98 @ 0x62 +10002e2a: 9f0c ldr r7, [sp, #48] @ 0x30 +10002e2c: 54bd strb r5, [r7, r2] +10002e2e: e7d0 b.n 10002dd2 <_ntoa_format+0xde> +10002e30: 4652 mov r2, sl +10002e32: 2a00 cmp r2, #0 +10002e34: d079 beq.n 10002f2a <_ntoa_format+0x236> +10002e36: 2e20 cmp r6, #32 +10002e38: d9bd bls.n 10002db6 <_ntoa_format+0xc2> +10002e3a: 2420 movs r4, #32 +10002e3c: 06da lsls r2, r3, #27 +10002e3e: d5ab bpl.n 10002d98 <_ntoa_format+0xa4> +10002e40: 055a lsls r2, r3, #21 +10002e42: d403 bmi.n 10002e4c <_ntoa_format+0x158> +10002e44: 2f20 cmp r7, #32 +10002e46: d0e9 beq.n 10002e1c <_ntoa_format+0x128> +10002e48: 2e20 cmp r6, #32 +10002e4a: d0e7 beq.n 10002e1c <_ntoa_format+0x128> +10002e4c: 9a0f ldr r2, [sp, #60] @ 0x3c +10002e4e: 2a10 cmp r2, #16 +10002e50: d1a2 bne.n 10002d98 <_ntoa_format+0xa4> +10002e52: 2420 movs r4, #32 +10002e54: e7a0 b.n 10002d98 <_ntoa_format+0xa4> +10002e56: 222d movs r2, #45 @ 0x2d +10002e58: 9d0c ldr r5, [sp, #48] @ 0x30 +10002e5a: 552a strb r2, [r5, r4] +10002e5c: 3401 adds r4, #1 +10002e5e: e79b b.n 10002d98 <_ntoa_format+0xa4> +10002e60: 42bc cmp r4, r7 +10002e62: d300 bcc.n 10002e66 <_ntoa_format+0x172> +10002e64: e77d b.n 10002d62 <_ntoa_format+0x6e> +10002e66: 2c20 cmp r4, #32 +10002e68: d000 beq.n 10002e6c <_ntoa_format+0x178> +10002e6a: e75e b.n 10002d2a <_ntoa_format+0x36> +10002e6c: 06da lsls r2, r3, #27 +10002e6e: d5f0 bpl.n 10002e52 <_ntoa_format+0x15e> +10002e70: 055a lsls r2, r3, #21 +10002e72: d4ee bmi.n 10002e52 <_ntoa_format+0x15e> +10002e74: 2f20 cmp r7, #32 +10002e76: d062 beq.n 10002f3e <_ntoa_format+0x24a> +10002e78: 2e20 cmp r6, #32 +10002e7a: d1ea bne.n 10002e52 <_ntoa_format+0x15e> +10002e7c: 0034 movs r4, r6 +10002e7e: 221f movs r2, #31 +10002e80: e7cd b.n 10002e1e <_ntoa_format+0x12a> +10002e82: 2c20 cmp r4, #32 +10002e84: d100 bne.n 10002e88 <_ntoa_format+0x194> +10002e86: e787 b.n 10002d98 <_ntoa_format+0xa4> +10002e88: 0022 movs r2, r4 +10002e8a: 3401 adds r4, #1 +10002e8c: e7cc b.n 10002e28 <_ntoa_format+0x134> +10002e8e: 3e01 subs r6, #1 +10002e90: e7b5 b.n 10002dfe <_ntoa_format+0x10a> +10002e92: 1e62 subs r2, r4, #1 +10002e94: 2c01 cmp r4, #1 +10002e96: d1c2 bne.n 10002e1e <_ntoa_format+0x12a> +10002e98: 9a0f ldr r2, [sp, #60] @ 0x3c +10002e9a: 2a10 cmp r2, #16 +10002e9c: d000 beq.n 10002ea0 <_ntoa_format+0x1ac> +10002e9e: e76a b.n 10002d76 <_ntoa_format+0x82> +10002ea0: 069a lsls r2, r3, #26 +10002ea2: d53b bpl.n 10002f1c <_ntoa_format+0x228> +10002ea4: 2258 movs r2, #88 @ 0x58 +10002ea6: 9c0c ldr r4, [sp, #48] @ 0x30 +10002ea8: 7022 strb r2, [r4, #0] +10002eaa: 3a28 subs r2, #40 @ 0x28 +10002eac: 7062 strb r2, [r4, #1] +10002eae: 2402 movs r4, #2 +10002eb0: e768 b.n 10002d84 <_ntoa_format+0x90> +10002eb2: 069a lsls r2, r3, #26 +10002eb4: d40e bmi.n 10002ed4 <_ntoa_format+0x1e0> +10002eb6: 2c20 cmp r4, #32 +10002eb8: d0cb beq.n 10002e52 <_ntoa_format+0x15e> +10002eba: 2278 movs r2, #120 @ 0x78 +10002ebc: 9d0c ldr r5, [sp, #48] @ 0x30 +10002ebe: 552a strb r2, [r5, r4] +10002ec0: 3401 adds r4, #1 +10002ec2: e786 b.n 10002dd2 <_ntoa_format+0xde> +10002ec4: 071a lsls r2, r3, #28 +10002ec6: d400 bmi.n 10002eca <_ntoa_format+0x1d6> +10002ec8: e766 b.n 10002d98 <_ntoa_format+0xa4> +10002eca: 2220 movs r2, #32 +10002ecc: 9d0c ldr r5, [sp, #48] @ 0x30 +10002ece: 552a strb r2, [r5, r4] +10002ed0: 3401 adds r4, #1 +10002ed2: e761 b.n 10002d98 <_ntoa_format+0xa4> +10002ed4: 2c20 cmp r4, #32 +10002ed6: d0bc beq.n 10002e52 <_ntoa_format+0x15e> +10002ed8: 2558 movs r5, #88 @ 0x58 +10002eda: 9a0c ldr r2, [sp, #48] @ 0x30 +10002edc: 1912 adds r2, r2, r4 +10002ede: 7015 strb r5, [r2, #0] +10002ee0: 3401 adds r4, #1 +10002ee2: e776 b.n 10002dd2 <_ntoa_format+0xde> +10002ee4: 069a lsls r2, r3, #26 +10002ee6: d508 bpl.n 10002efa <_ntoa_format+0x206> +10002ee8: 2258 movs r2, #88 @ 0x58 +10002eea: 9c0c ldr r4, [sp, #48] @ 0x30 +10002eec: 7022 strb r2, [r4, #0] +10002eee: 2230 movs r2, #48 @ 0x30 +10002ef0: 7062 strb r2, [r4, #1] +10002ef2: 2402 movs r4, #2 +10002ef4: e746 b.n 10002d84 <_ntoa_format+0x90> +10002ef6: 3260 adds r2, #96 @ 0x60 +10002ef8: e7f7 b.n 10002eea <_ntoa_format+0x1f6> +10002efa: 2278 movs r2, #120 @ 0x78 +10002efc: e7f5 b.n 10002eea <_ntoa_format+0x1f6> +10002efe: 2a00 cmp r2, #0 +10002f00: d183 bne.n 10002e0a <_ntoa_format+0x116> +10002f02: e7b3 b.n 10002e6c <_ntoa_format+0x178> +10002f04: 1ea2 subs r2, r4, #2 +10002f06: 3c01 subs r4, #1 +10002f08: 069d lsls r5, r3, #26 +10002f0a: d403 bmi.n 10002f14 <_ntoa_format+0x220> +10002f0c: 2578 movs r5, #120 @ 0x78 +10002f0e: 9f0c ldr r7, [sp, #48] @ 0x30 +10002f10: 54bd strb r5, [r7, r2] +10002f12: e760 b.n 10002dd6 <_ntoa_format+0xe2> +10002f14: 2558 movs r5, #88 @ 0x58 +10002f16: 9f0c ldr r7, [sp, #48] @ 0x30 +10002f18: 54bd strb r5, [r7, r2] +10002f1a: e75c b.n 10002dd6 <_ntoa_format+0xe2> +10002f1c: 2278 movs r2, #120 @ 0x78 +10002f1e: 9c0c ldr r4, [sp, #48] @ 0x30 +10002f20: 7022 strb r2, [r4, #0] +10002f22: 3a48 subs r2, #72 @ 0x48 +10002f24: 7062 strb r2, [r4, #1] +10002f26: 2402 movs r4, #2 +10002f28: e72c b.n 10002d84 <_ntoa_format+0x90> +10002f2a: 06da lsls r2, r3, #27 +10002f2c: d400 bmi.n 10002f30 <_ntoa_format+0x23c> +10002f2e: e733 b.n 10002d98 <_ntoa_format+0xa4> +10002f30: 055a lsls r2, r3, #21 +10002f32: d48b bmi.n 10002e4c <_ntoa_format+0x158> +10002f34: 2f20 cmp r7, #32 +10002f36: d000 beq.n 10002f3a <_ntoa_format+0x246> +10002f38: e744 b.n 10002dc4 <_ntoa_format+0xd0> +10002f3a: 221f movs r2, #31 +10002f3c: e76f b.n 10002e1e <_ntoa_format+0x12a> +10002f3e: 003c movs r4, r7 +10002f40: 221f movs r2, #31 +10002f42: e76c b.n 10002e1e <_ntoa_format+0x12a> + +10002f44 <_out_char>: +10002f44: b510 push {r4, lr} +10002f46: 2800 cmp r0, #0 +10002f48: d100 bne.n 10002f4c <_out_char+0x8> +10002f4a: bd10 pop {r4, pc} +10002f4c: f002 f994 bl 10005278 <__wrap_putchar> +10002f50: e7fb b.n 10002f4a <_out_char+0x6> +10002f52: 46c0 nop @ (mov r8, r8) + +10002f54 <_out_fct>: +10002f54: 000b movs r3, r1 +10002f56: b510 push {r4, lr} +10002f58: 2800 cmp r0, #0 +10002f5a: d002 beq.n 10002f62 <_out_fct+0xe> +10002f5c: 6849 ldr r1, [r1, #4] +10002f5e: 681b ldr r3, [r3, #0] +10002f60: 4798 blx r3 +10002f62: bd10 pop {r4, pc} + +10002f64 <_etoa>: +10002f64: b5f0 push {r4, r5, r6, r7, lr} +10002f66: 4657 mov r7, sl +10002f68: 464e mov r6, r9 +10002f6a: 4645 mov r5, r8 +10002f6c: 46de mov lr, fp +10002f6e: b5e0 push {r5, r6, r7, lr} +10002f70: b099 sub sp, #100 @ 0x64 +10002f72: 4682 mov sl, r0 +10002f74: 4689 mov r9, r1 +10002f76: 4690 mov r8, r2 +10002f78: 9308 str r3, [sp, #32] +10002f7a: 9a22 ldr r2, [sp, #136] @ 0x88 +10002f7c: 9b23 ldr r3, [sp, #140] @ 0x8c +10002f7e: 0010 movs r0, r2 +10002f80: 0019 movs r1, r3 +10002f82: f001 fd30 bl 100049e6 <__wrap___aeabi_dcmpun> +10002f86: 2800 cmp r0, #0 +10002f88: d000 beq.n 10002f8c <_etoa+0x28> +10002f8a: e0cd b.n 10003128 <_etoa+0x1c4> +10002f8c: 9822 ldr r0, [sp, #136] @ 0x88 +10002f8e: 9923 ldr r1, [sp, #140] @ 0x8c +10002f90: 2201 movs r2, #1 +10002f92: 4bd9 ldr r3, [pc, #868] @ (100032f8 <_etoa+0x394>) +10002f94: 4252 negs r2, r2 +10002f96: f001 fd21 bl 100049dc <__wrap___aeabi_dcmpgt> +10002f9a: 2800 cmp r0, #0 +10002f9c: d000 beq.n 10002fa0 <_etoa+0x3c> +10002f9e: e0c3 b.n 10003128 <_etoa+0x1c4> +10002fa0: 9822 ldr r0, [sp, #136] @ 0x88 +10002fa2: 9923 ldr r1, [sp, #140] @ 0x8c +10002fa4: 2201 movs r2, #1 +10002fa6: 4bd5 ldr r3, [pc, #852] @ (100032fc <_etoa+0x398>) +10002fa8: 4252 negs r2, r2 +10002faa: f001 fd09 bl 100049c0 <__wrap___aeabi_dcmplt> +10002fae: 2800 cmp r0, #0 +10002fb0: d000 beq.n 10002fb4 <_etoa+0x50> +10002fb2: e0b9 b.n 10003128 <_etoa+0x1c4> +10002fb4: 9822 ldr r0, [sp, #136] @ 0x88 +10002fb6: 9923 ldr r1, [sp, #140] @ 0x8c +10002fb8: 2200 movs r2, #0 +10002fba: 2300 movs r3, #0 +10002fbc: f001 fd00 bl 100049c0 <__wrap___aeabi_dcmplt> +10002fc0: 2800 cmp r0, #0 +10002fc2: d000 beq.n 10002fc6 <_etoa+0x62> +10002fc4: e1f1 b.n 100033aa <_etoa+0x446> +10002fc6: 9e22 ldr r6, [sp, #136] @ 0x88 +10002fc8: 9f23 ldr r7, [sp, #140] @ 0x8c +10002fca: 2380 movs r3, #128 @ 0x80 +10002fcc: 9a26 ldr r2, [sp, #152] @ 0x98 +10002fce: 00db lsls r3, r3, #3 +10002fd0: 401a ands r2, r3 +10002fd2: 920d str r2, [sp, #52] @ 0x34 +10002fd4: 9a26 ldr r2, [sp, #152] @ 0x98 +10002fd6: 421a tst r2, r3 +10002fd8: d101 bne.n 10002fde <_etoa+0x7a> +10002fda: 2306 movs r3, #6 +10002fdc: 9324 str r3, [sp, #144] @ 0x90 +10002fde: 2380 movs r3, #128 @ 0x80 +10002fe0: 9a26 ldr r2, [sp, #152] @ 0x98 +10002fe2: 011b lsls r3, r3, #4 +10002fe4: 401a ands r2, r3 +10002fe6: 003b movs r3, r7 +10002fe8: 4693 mov fp, r2 +10002fea: 9609 str r6, [sp, #36] @ 0x24 +10002fec: 4333 orrs r3, r6 +10002fee: d000 beq.n 10002ff2 <_etoa+0x8e> +10002ff0: e0b3 b.n 1000315a <_etoa+0x1f6> +10002ff2: 2a00 cmp r2, #0 +10002ff4: d000 beq.n 10002ff8 <_etoa+0x94> +10002ff6: e1c2 b.n 1000337e <_etoa+0x41a> +10002ff8: 2300 movs r3, #0 +10002ffa: 2400 movs r4, #0 +10002ffc: 930a str r3, [sp, #40] @ 0x28 +10002ffe: 940b str r4, [sp, #44] @ 0x2c 10003000: 2300 movs r3, #0 -10003002: 9314 str r3, [sp, #80] @ 0x50 -10003004: 3308 adds r3, #8 -10003006: 930f str r3, [sp, #60] @ 0x3c -10003008: 980b ldr r0, [sp, #44] @ 0x2c -1000300a: 2380 movs r3, #128 @ 0x80 -1000300c: 0002 movs r2, r0 -1000300e: 00db lsls r3, r3, #3 -10003010: 401a ands r2, r3 -10003012: 0011 movs r1, r2 -10003014: 0002 movs r2, r0 -10003016: 4218 tst r0, r3 -10003018: d000 beq.n 1000301c <_vsnprintf+0x538> -1000301a: e080 b.n 1000311e <_vsnprintf+0x63a> -1000301c: 230c movs r3, #12 -1000301e: 439a bics r2, r3 -10003020: 0010 movs r0, r2 -10003022: 2380 movs r3, #128 @ 0x80 -10003024: 0002 movs r2, r0 -10003026: 009b lsls r3, r3, #2 -10003028: 401a ands r2, r3 -1000302a: 920b str r2, [sp, #44] @ 0x2c -1000302c: 4218 tst r0, r3 -1000302e: d000 beq.n 10003032 <_vsnprintf+0x54e> -10003030: e0f1 b.n 10003216 <_vsnprintf+0x732> -10003032: 2380 movs r3, #128 @ 0x80 -10003034: 0002 movs r2, r0 -10003036: 005b lsls r3, r3, #1 -10003038: 401a ands r2, r3 -1000303a: 4691 mov r9, r2 -1000303c: 9a0d ldr r2, [sp, #52] @ 0x34 -1000303e: 3204 adds r2, #4 -10003040: 9214 str r2, [sp, #80] @ 0x50 -10003042: 4218 tst r0, r3 -10003044: d000 beq.n 10003048 <_vsnprintf+0x564> -10003046: e2c3 b.n 100035d0 <_vsnprintf+0xaec> -10003048: 0643 lsls r3, r0, #25 -1000304a: d500 bpl.n 1000304e <_vsnprintf+0x56a> -1000304c: e0d7 b.n 100031fe <_vsnprintf+0x71a> -1000304e: 0603 lsls r3, r0, #24 -10003050: d400 bmi.n 10003054 <_vsnprintf+0x570> -10003052: e321 b.n 10003698 <_vsnprintf+0xbb4> -10003054: 9b0d ldr r3, [sp, #52] @ 0x34 -10003056: 881b ldrh r3, [r3, #0] -10003058: 9309 str r3, [sp, #36] @ 0x24 -1000305a: 2b00 cmp r3, #0 -1000305c: d000 beq.n 10003060 <_vsnprintf+0x57c> -1000305e: e12d b.n 100032bc <_vsnprintf+0x7d8> -10003060: 3310 adds r3, #16 -10003062: 4398 bics r0, r3 -10003064: 2900 cmp r1, #0 -10003066: d100 bne.n 1000306a <_vsnprintf+0x586> -10003068: e128 b.n 100032bc <_vsnprintf+0x7d8> -1000306a: 2300 movs r3, #0 -1000306c: 4699 mov r9, r3 -1000306e: 4643 mov r3, r8 -10003070: 9305 str r3, [sp, #20] -10003072: 4653 mov r3, sl -10003074: 9304 str r3, [sp, #16] -10003076: 9b0f ldr r3, [sp, #60] @ 0x3c -10003078: 9006 str r0, [sp, #24] -1000307a: 9303 str r3, [sp, #12] -1000307c: 2300 movs r3, #0 -1000307e: 9302 str r3, [sp, #8] -10003080: 464b mov r3, r9 -10003082: 9301 str r3, [sp, #4] -10003084: ab1c add r3, sp, #112 @ 0x70 -10003086: 0022 movs r2, r4 -10003088: 9300 str r3, [sp, #0] -1000308a: 4659 mov r1, fp -1000308c: 0033 movs r3, r6 -1000308e: 0028 movs r0, r5 -10003090: f7fe ffde bl 10002050 <_ntoa_format> -10003094: 0004 movs r4, r0 -10003096: e6c2 b.n 10002e1e <_vsnprintf+0x33a> -10003098: 2858 cmp r0, #88 @ 0x58 -1000309a: d009 beq.n 100030b0 <_vsnprintf+0x5cc> -1000309c: 2862 cmp r0, #98 @ 0x62 -1000309e: d000 beq.n 100030a2 <_vsnprintf+0x5be> -100030a0: e2e3 b.n 1000366a <_vsnprintf+0xb86> -100030a2: 2302 movs r3, #2 -100030a4: 469c mov ip, r3 -100030a6: 2300 movs r3, #0 -100030a8: 9314 str r3, [sp, #80] @ 0x50 -100030aa: 3302 adds r3, #2 -100030ac: 930f str r3, [sp, #60] @ 0x3c -100030ae: e7ab b.n 10003008 <_vsnprintf+0x524> -100030b0: 2320 movs r3, #32 -100030b2: 9a0b ldr r2, [sp, #44] @ 0x2c -100030b4: 431a orrs r2, r3 -100030b6: 920b str r2, [sp, #44] @ 0x2c -100030b8: 3b10 subs r3, #16 -100030ba: 469c mov ip, r3 -100030bc: 2300 movs r3, #0 -100030be: 9314 str r3, [sp, #80] @ 0x50 -100030c0: 3310 adds r3, #16 -100030c2: 930f str r3, [sp, #60] @ 0x3c -100030c4: e7a0 b.n 10003008 <_vsnprintf+0x524> -100030c6: 2380 movs r3, #128 @ 0x80 -100030c8: 9a0b ldr r2, [sp, #44] @ 0x2c -100030ca: 011b lsls r3, r3, #4 -100030cc: 431a orrs r2, r3 -100030ce: 920b str r2, [sp, #44] @ 0x2c -100030d0: 2320 movs r3, #32 -100030d2: 9a0b ldr r2, [sp, #44] @ 0x2c -100030d4: 431a orrs r2, r3 -100030d6: 920b str r2, [sp, #44] @ 0x2c -100030d8: e6dd b.n 10002e96 <_vsnprintf+0x3b2> -100030da: 1b0b subs r3, r1, r4 -100030dc: 469a mov sl, r3 -100030de: 9b0f ldr r3, [sp, #60] @ 0x3c -100030e0: 4699 mov r9, r3 -100030e2: 003b movs r3, r7 -100030e4: 0037 movs r7, r6 -100030e6: 465e mov r6, fp -100030e8: 469b mov fp, r3 -100030ea: 0022 movs r2, r4 -100030ec: 003b movs r3, r7 -100030ee: 0031 movs r1, r6 -100030f0: 47a8 blx r5 -100030f2: 4653 mov r3, sl -100030f4: 3401 adds r4, #1 -100030f6: 5d18 ldrb r0, [r3, r4] -100030f8: 2800 cmp r0, #0 -100030fa: d1f6 bne.n 100030ea <_vsnprintf+0x606> -100030fc: 464b mov r3, r9 -100030fe: 930f str r3, [sp, #60] @ 0x3c -10003100: 465b mov r3, fp -10003102: 46b3 mov fp, r6 -10003104: 003e movs r6, r7 -10003106: 001f movs r7, r3 -10003108: e685 b.n 10002e16 <_vsnprintf+0x332> -1000310a: 23c0 movs r3, #192 @ 0xc0 -1000310c: 9a0b ldr r2, [sp, #44] @ 0x2c -1000310e: 78b8 ldrb r0, [r7, #2] -10003110: 431a orrs r2, r3 -10003112: 920b str r2, [sp, #44] @ 0x2c -10003114: 1cf9 adds r1, r7, #3 -10003116: e55c b.n 10002bd2 <_vsnprintf+0xee> -10003118: 23c0 movs r3, #192 @ 0xc0 -1000311a: 009b lsls r3, r3, #2 -1000311c: e7f6 b.n 1000310c <_vsnprintf+0x628> -1000311e: 230d movs r3, #13 -10003120: 439a bics r2, r3 -10003122: 0010 movs r0, r2 -10003124: e77d b.n 10003022 <_vsnprintf+0x53e> -10003126: 465b mov r3, fp -10003128: 0035 movs r5, r6 -1000312a: 46bb mov fp, r7 -1000312c: 464e mov r6, r9 -1000312e: 001f movs r7, r3 -10003130: e671 b.n 10002e16 <_vsnprintf+0x332> -10003132: 4643 mov r3, r8 -10003134: 2b01 cmp r3, #1 -10003136: d966 bls.n 10003206 <_vsnprintf+0x722> -10003138: 1e63 subs r3, r4, #1 -1000313a: 4443 add r3, r8 -1000313c: 0032 movs r2, r6 -1000313e: 002e movs r6, r5 -10003140: 001d movs r5, r3 -10003142: 003b movs r3, r7 -10003144: 46a2 mov sl, r4 -10003146: 465f mov r7, fp -10003148: 4691 mov r9, r2 -1000314a: 469b mov fp, r3 -1000314c: 0022 movs r2, r4 -1000314e: 464b mov r3, r9 -10003150: 3401 adds r4, #1 -10003152: 0039 movs r1, r7 -10003154: 2020 movs r0, #32 -10003156: 47b0 blx r6 -10003158: 42ac cmp r4, r5 -1000315a: d1f7 bne.n 1000314c <_vsnprintf+0x668> -1000315c: 465b mov r3, fp -1000315e: 0035 movs r5, r6 -10003160: 46bb mov fp, r7 -10003162: 464e mov r6, r9 -10003164: 46a1 mov r9, r4 -10003166: 4654 mov r4, sl -10003168: 001f movs r7, r3 -1000316a: 9b0d ldr r3, [sp, #52] @ 0x34 -1000316c: 464a mov r2, r9 -1000316e: 7818 ldrb r0, [r3, #0] -10003170: 4659 mov r1, fp -10003172: 0033 movs r3, r6 -10003174: 4444 add r4, r8 -10003176: 47a8 blx r5 -10003178: e6ee b.n 10002f58 <_vsnprintf+0x474> -1000317a: 9b0f ldr r3, [sp, #60] @ 0x3c -1000317c: 46a1 mov r9, r4 -1000317e: 4598 cmp r8, r3 -10003180: d800 bhi.n 10003184 <_vsnprintf+0x6a0> -10003182: e64c b.n 10002e1e <_vsnprintf+0x33a> -10003184: 4444 add r4, r8 -10003186: 1ae4 subs r4, r4, r3 -10003188: 46b0 mov r8, r6 -1000318a: 002e movs r6, r5 -1000318c: 0025 movs r5, r4 -1000318e: 464c mov r4, r9 -10003190: 46b9 mov r9, r7 -10003192: 465f mov r7, fp -10003194: 0022 movs r2, r4 -10003196: 4643 mov r3, r8 -10003198: 3401 adds r4, #1 -1000319a: 0039 movs r1, r7 -1000319c: 2020 movs r0, #32 -1000319e: 47b0 blx r6 -100031a0: 42ac cmp r4, r5 -100031a2: d1f7 bne.n 10003194 <_vsnprintf+0x6b0> -100031a4: 002c movs r4, r5 -100031a6: 46bb mov fp, r7 -100031a8: 0035 movs r5, r6 -100031aa: 464f mov r7, r9 -100031ac: 4646 mov r6, r8 -100031ae: e636 b.n 10002e1e <_vsnprintf+0x33a> -100031b0: 980f ldr r0, [sp, #60] @ 0x3c -100031b2: 4580 cmp r8, r0 -100031b4: d800 bhi.n 100031b8 <_vsnprintf+0x6d4> -100031b6: e273 b.n 100036a0 <_vsnprintf+0xbbc> -100031b8: 4643 mov r3, r8 -100031ba: 18e2 adds r2, r4, r3 -100031bc: 1a13 subs r3, r2, r0 -100031be: 0032 movs r2, r6 -100031c0: 002e movs r6, r5 -100031c2: 001d movs r5, r3 -100031c4: 003b movs r3, r7 -100031c6: 4691 mov r9, r2 -100031c8: 465f mov r7, fp -100031ca: 469b mov fp, r3 -100031cc: 910f str r1, [sp, #60] @ 0x3c -100031ce: 0022 movs r2, r4 -100031d0: 464b mov r3, r9 -100031d2: 3401 adds r4, #1 -100031d4: 0039 movs r1, r7 -100031d6: 2020 movs r0, #32 -100031d8: 47b0 blx r6 -100031da: 42ac cmp r4, r5 -100031dc: d1f7 bne.n 100031ce <_vsnprintf+0x6ea> -100031de: 465b mov r3, fp -100031e0: 46bb mov fp, r7 -100031e2: 001f movs r7, r3 -100031e4: 4643 mov r3, r8 -100031e6: 990f ldr r1, [sp, #60] @ 0x3c -100031e8: 3301 adds r3, #1 -100031ea: 930f str r3, [sp, #60] @ 0x3c -100031ec: 780b ldrb r3, [r1, #0] -100031ee: 0035 movs r5, r6 -100031f0: 469c mov ip, r3 -100031f2: 464e mov r6, r9 -100031f4: 4660 mov r0, ip -100031f6: 2800 cmp r0, #0 -100031f8: d000 beq.n 100031fc <_vsnprintf+0x718> -100031fa: e5e7 b.n 10002dcc <_vsnprintf+0x2e8> -100031fc: e60f b.n 10002e1e <_vsnprintf+0x33a> -100031fe: 9b0d ldr r3, [sp, #52] @ 0x34 -10003200: 781b ldrb r3, [r3, #0] -10003202: 9309 str r3, [sp, #36] @ 0x24 -10003204: e729 b.n 1000305a <_vsnprintf+0x576> -10003206: 9b0d ldr r3, [sp, #52] @ 0x34 -10003208: 0022 movs r2, r4 -1000320a: 7818 ldrb r0, [r3, #0] -1000320c: 4659 mov r1, fp -1000320e: 0033 movs r3, r6 -10003210: 47a8 blx r5 -10003212: 464c mov r4, r9 -10003214: e6a0 b.n 10002f58 <_vsnprintf+0x474> -10003216: 9a0d ldr r2, [sp, #52] @ 0x34 -10003218: 3bfa subs r3, #250 @ 0xfa -1000321a: 3bff subs r3, #255 @ 0xff -1000321c: 3207 adds r2, #7 -1000321e: 439a bics r2, r3 -10003220: 3301 adds r3, #1 -10003222: 4699 mov r9, r3 -10003224: 4491 add r9, r2 -10003226: 464b mov r3, r9 -10003228: 930d str r3, [sp, #52] @ 0x34 -1000322a: 6813 ldr r3, [r2, #0] -1000322c: 6852 ldr r2, [r2, #4] -1000322e: 9215 str r2, [sp, #84] @ 0x54 -10003230: 431a orrs r2, r3 -10003232: d106 bne.n 10003242 <_vsnprintf+0x75e> -10003234: 3210 adds r2, #16 -10003236: 4390 bics r0, r2 -10003238: 2200 movs r2, #0 -1000323a: 9209 str r2, [sp, #36] @ 0x24 -1000323c: 2900 cmp r1, #0 -1000323e: d000 beq.n 10003242 <_vsnprintf+0x75e> -10003240: e083 b.n 1000334a <_vsnprintf+0x866> -10003242: 2261 movs r2, #97 @ 0x61 -10003244: 0681 lsls r1, r0, #26 -10003246: d500 bpl.n 1000324a <_vsnprintf+0x766> -10003248: 2241 movs r2, #65 @ 0x41 -1000324a: b2d2 uxtb r2, r2 -1000324c: 920a str r2, [sp, #40] @ 0x28 -1000324e: aa14 add r2, sp, #80 @ 0x50 -10003250: 4691 mov r9, r2 -10003252: 9a0a ldr r2, [sp, #40] @ 0x28 -10003254: 2100 movs r1, #0 -10003256: 3a0a subs r2, #10 -10003258: 920b str r2, [sp, #44] @ 0x2c -1000325a: 4642 mov r2, r8 -1000325c: 9217 str r2, [sp, #92] @ 0x5c -1000325e: 4652 mov r2, sl -10003260: 9218 str r2, [sp, #96] @ 0x60 -10003262: 465a mov r2, fp -10003264: 46b2 mov sl, r6 -10003266: 9109 str r1, [sp, #36] @ 0x24 -10003268: 001e movs r6, r3 -1000326a: 311f adds r1, #31 -1000326c: 9b14 ldr r3, [sp, #80] @ 0x50 -1000326e: 4449 add r1, r9 -10003270: 46bb mov fp, r7 -10003272: 9416 str r4, [sp, #88] @ 0x58 -10003274: 951a str r5, [sp, #104] @ 0x68 -10003276: 2400 movs r4, #0 -10003278: 4667 mov r7, ip -1000327a: 4698 mov r8, r3 -1000327c: 4689 mov r9, r1 -1000327e: 9d15 ldr r5, [sp, #84] @ 0x54 -10003280: 9019 str r0, [sp, #100] @ 0x64 -10003282: 921b str r2, [sp, #108] @ 0x6c -10003284: e00a b.n 1000329c <_vsnprintf+0x7b8> -10003286: 3230 adds r2, #48 @ 0x30 -10003288: b2d2 uxtb r2, r2 -1000328a: 464b mov r3, r9 -1000328c: 3401 adds r4, #1 -1000328e: 551a strb r2, [r3, r4] -10003290: 45a8 cmp r8, r5 -10003292: d04c beq.n 1000332e <_vsnprintf+0x84a> -10003294: 2c20 cmp r4, #32 -10003296: d04c beq.n 10003332 <_vsnprintf+0x84e> -10003298: 0006 movs r6, r0 -1000329a: 000d movs r5, r1 -1000329c: 003a movs r2, r7 -1000329e: 2300 movs r3, #0 -100032a0: 0030 movs r0, r6 -100032a2: 0029 movs r1, r5 -100032a4: f000 faca bl 1000383c <__wrap___aeabi_uldivmod> -100032a8: b2d2 uxtb r2, r2 -100032aa: 2a09 cmp r2, #9 -100032ac: d9eb bls.n 10003286 <_vsnprintf+0x7a2> -100032ae: 9b0b ldr r3, [sp, #44] @ 0x2c -100032b0: 469c mov ip, r3 -100032b2: 4462 add r2, ip -100032b4: b2d2 uxtb r2, r2 -100032b6: e7e8 b.n 1000328a <_vsnprintf+0x7a6> -100032b8: 10001fa1 .word 0x10001fa1 -100032bc: 2361 movs r3, #97 @ 0x61 -100032be: 0682 lsls r2, r0, #26 -100032c0: d500 bpl.n 100032c4 <_vsnprintf+0x7e0> -100032c2: 2341 movs r3, #65 @ 0x41 -100032c4: b2db uxtb r3, r3 -100032c6: 3b0a subs r3, #10 -100032c8: 930b str r3, [sp, #44] @ 0x2c -100032ca: 4643 mov r3, r8 -100032cc: a914 add r1, sp, #80 @ 0x50 -100032ce: 221f movs r2, #31 -100032d0: 468c mov ip, r1 -100032d2: 9315 str r3, [sp, #84] @ 0x54 -100032d4: 4653 mov r3, sl -100032d6: 4462 add r2, ip -100032d8: 46b2 mov sl, r6 -100032da: 940d str r4, [sp, #52] @ 0x34 -100032dc: 9717 str r7, [sp, #92] @ 0x5c -100032de: 464c mov r4, r9 -100032e0: 4680 mov r8, r0 -100032e2: 46a9 mov r9, r5 -100032e4: 0017 movs r7, r2 -100032e6: 9d09 ldr r5, [sp, #36] @ 0x24 -100032e8: 9e0f ldr r6, [sp, #60] @ 0x3c -100032ea: 9316 str r3, [sp, #88] @ 0x58 -100032ec: e008 b.n 10003300 <_vsnprintf+0x81c> -100032ee: 3330 adds r3, #48 @ 0x30 -100032f0: b2db uxtb r3, r3 -100032f2: 3401 adds r4, #1 -100032f4: 553b strb r3, [r7, r4] -100032f6: 42b5 cmp r5, r6 -100032f8: d30e bcc.n 10003318 <_vsnprintf+0x834> -100032fa: 2c20 cmp r4, #32 -100032fc: d00c beq.n 10003318 <_vsnprintf+0x834> -100032fe: 0005 movs r5, r0 -10003300: 0031 movs r1, r6 -10003302: 0028 movs r0, r5 -10003304: f000 fa5c bl 100037c0 <__wrap___aeabi_uidiv> -10003308: b2cb uxtb r3, r1 -1000330a: 2909 cmp r1, #9 -1000330c: d9ef bls.n 100032ee <_vsnprintf+0x80a> -1000330e: 9a0b ldr r2, [sp, #44] @ 0x2c -10003310: 4694 mov ip, r2 -10003312: 4463 add r3, ip -10003314: b2db uxtb r3, r3 -10003316: e7ec b.n 100032f2 <_vsnprintf+0x80e> -10003318: 9b15 ldr r3, [sp, #84] @ 0x54 -1000331a: 4640 mov r0, r8 -1000331c: 4698 mov r8, r3 -1000331e: 9b16 ldr r3, [sp, #88] @ 0x58 -10003320: 464d mov r5, r9 -10003322: 4656 mov r6, sl -10003324: 46a1 mov r9, r4 -10003326: 469a mov sl, r3 -10003328: 9c0d ldr r4, [sp, #52] @ 0x34 -1000332a: 9f17 ldr r7, [sp, #92] @ 0x5c -1000332c: e69f b.n 1000306e <_vsnprintf+0x58a> -1000332e: 42b7 cmp r7, r6 -10003330: d9b0 bls.n 10003294 <_vsnprintf+0x7b0> -10003332: 9b17 ldr r3, [sp, #92] @ 0x5c -10003334: 4656 mov r6, sl -10003336: 4698 mov r8, r3 -10003338: 9b18 ldr r3, [sp, #96] @ 0x60 -1000333a: 465f mov r7, fp -1000333c: 469a mov sl, r3 -1000333e: 9b1b ldr r3, [sp, #108] @ 0x6c -10003340: 9409 str r4, [sp, #36] @ 0x24 -10003342: 469b mov fp, r3 -10003344: 9c16 ldr r4, [sp, #88] @ 0x58 -10003346: 9819 ldr r0, [sp, #100] @ 0x64 -10003348: 9d1a ldr r5, [sp, #104] @ 0x68 -1000334a: 4643 mov r3, r8 -1000334c: 9305 str r3, [sp, #20] -1000334e: 4653 mov r3, sl -10003350: 9304 str r3, [sp, #16] -10003352: 9b0f ldr r3, [sp, #60] @ 0x3c -10003354: 9006 str r0, [sp, #24] -10003356: 9303 str r3, [sp, #12] -10003358: 2300 movs r3, #0 -1000335a: 9302 str r3, [sp, #8] -1000335c: 9b09 ldr r3, [sp, #36] @ 0x24 -1000335e: 9301 str r3, [sp, #4] -10003360: ab1c add r3, sp, #112 @ 0x70 -10003362: 0022 movs r2, r4 -10003364: 9300 str r3, [sp, #0] -10003366: 4659 mov r1, fp -10003368: 0033 movs r3, r6 -1000336a: 0028 movs r0, r5 -1000336c: f7fe fe70 bl 10002050 <_ntoa_format> -10003370: 0004 movs r4, r0 -10003372: f7ff fbdf bl 10002b34 <_vsnprintf+0x50> -10003376: 2310 movs r3, #16 -10003378: 9a0b ldr r2, [sp, #44] @ 0x2c -1000337a: 439a bics r2, r3 -1000337c: 920f str r2, [sp, #60] @ 0x3c -1000337e: 2869 cmp r0, #105 @ 0x69 -10003380: d000 beq.n 10003384 <_vsnprintf+0x8a0> -10003382: e191 b.n 100036a8 <_vsnprintf+0xbc4> -10003384: 990b ldr r1, [sp, #44] @ 0x2c -10003386: 2380 movs r3, #128 @ 0x80 -10003388: 000a movs r2, r1 -1000338a: 00db lsls r3, r3, #3 -1000338c: 401a ands r2, r3 -1000338e: 0010 movs r0, r2 -10003390: 000a movs r2, r1 -10003392: 4219 tst r1, r3 -10003394: d003 beq.n 1000339e <_vsnprintf+0x8ba> -10003396: 2111 movs r1, #17 -10003398: 0018 movs r0, r3 -1000339a: 438a bics r2, r1 -1000339c: 920f str r2, [sp, #60] @ 0x3c -1000339e: 9a0f ldr r2, [sp, #60] @ 0x3c -100033a0: 2380 movs r3, #128 @ 0x80 -100033a2: 0011 movs r1, r2 -100033a4: 009b lsls r3, r3, #2 -100033a6: 4019 ands r1, r3 -100033a8: 468c mov ip, r1 -100033aa: 421a tst r2, r3 -100033ac: d15b bne.n 10003466 <_vsnprintf+0x982> -100033ae: 2380 movs r3, #128 @ 0x80 -100033b0: 0011 movs r1, r2 -100033b2: 005b lsls r3, r3, #1 -100033b4: 4019 ands r1, r3 -100033b6: 4689 mov r9, r1 -100033b8: 990d ldr r1, [sp, #52] @ 0x34 -100033ba: 3104 adds r1, #4 -100033bc: 910b str r1, [sp, #44] @ 0x2c -100033be: 421a tst r2, r3 -100033c0: d000 beq.n 100033c4 <_vsnprintf+0x8e0> -100033c2: e0b2 b.n 1000352a <_vsnprintf+0xa46> -100033c4: 0013 movs r3, r2 -100033c6: 065b lsls r3, r3, #25 -100033c8: d400 bmi.n 100033cc <_vsnprintf+0x8e8> -100033ca: e0ed b.n 100035a8 <_vsnprintf+0xac4> -100033cc: 9b0d ldr r3, [sp, #52] @ 0x34 -100033ce: 781b ldrb r3, [r3, #0] -100033d0: 001a movs r2, r3 -100033d2: 0fd9 lsrs r1, r3, #31 -100033d4: 910d str r1, [sp, #52] @ 0x34 -100033d6: 2b00 cmp r3, #0 -100033d8: d100 bne.n 100033dc <_vsnprintf+0x8f8> -100033da: e0a3 b.n 10003524 <_vsnprintf+0xa40> -100033dc: 0010 movs r0, r2 -100033de: aa14 add r2, sp, #80 @ 0x50 -100033e0: 4694 mov ip, r2 -100033e2: 4642 mov r2, r8 -100033e4: 231f movs r3, #31 -100033e6: 9215 str r2, [sp, #84] @ 0x54 -100033e8: 4652 mov r2, sl -100033ea: 4463 add r3, ip -100033ec: 46a8 mov r8, r5 -100033ee: 46ba mov sl, r7 -100033f0: 464d mov r5, r9 -100033f2: 9414 str r4, [sp, #80] @ 0x50 -100033f4: 46b1 mov r9, r6 -100033f6: 0004 movs r4, r0 -100033f8: 001f movs r7, r3 -100033fa: 9216 str r2, [sp, #88] @ 0x58 -100033fc: e001 b.n 10003402 <_vsnprintf+0x91e> -100033fe: 2d20 cmp r5, #32 -10003400: d00f beq.n 10003422 <_vsnprintf+0x93e> -10003402: 0020 movs r0, r4 -10003404: 210a movs r1, #10 -10003406: f000 f9db bl 100037c0 <__wrap___aeabi_uidiv> -1000340a: 3501 adds r5, #1 -1000340c: 197e adds r6, r7, r5 -1000340e: 3130 adds r1, #48 @ 0x30 -10003410: 7031 strb r1, [r6, #0] -10003412: 0020 movs r0, r4 -10003414: 210a movs r1, #10 -10003416: f000 f9d3 bl 100037c0 <__wrap___aeabi_uidiv> -1000341a: 0026 movs r6, r4 -1000341c: 0004 movs r4, r0 -1000341e: 2e09 cmp r6, #9 -10003420: d8ed bhi.n 100033fe <_vsnprintf+0x91a> -10003422: 9b15 ldr r3, [sp, #84] @ 0x54 -10003424: 464e mov r6, r9 -10003426: 46a9 mov r9, r5 -10003428: 4645 mov r5, r8 -1000342a: 4698 mov r8, r3 -1000342c: 9b16 ldr r3, [sp, #88] @ 0x58 -1000342e: 4657 mov r7, sl -10003430: 469a mov sl, r3 -10003432: 9c14 ldr r4, [sp, #80] @ 0x50 -10003434: 9b0f ldr r3, [sp, #60] @ 0x3c -10003436: 9306 str r3, [sp, #24] -10003438: 4643 mov r3, r8 -1000343a: 9305 str r3, [sp, #20] -1000343c: 4653 mov r3, sl -1000343e: 9304 str r3, [sp, #16] -10003440: 230a movs r3, #10 -10003442: 9303 str r3, [sp, #12] -10003444: 9b0d ldr r3, [sp, #52] @ 0x34 -10003446: 9302 str r3, [sp, #8] -10003448: 464b mov r3, r9 -1000344a: 9301 str r3, [sp, #4] -1000344c: ab1c add r3, sp, #112 @ 0x70 -1000344e: 0022 movs r2, r4 -10003450: 9300 str r3, [sp, #0] -10003452: 4659 mov r1, fp -10003454: 0033 movs r3, r6 -10003456: 0028 movs r0, r5 -10003458: f7fe fdfa bl 10002050 <_ntoa_format> -1000345c: 9b0b ldr r3, [sp, #44] @ 0x2c -1000345e: 0004 movs r4, r0 -10003460: 930d str r3, [sp, #52] @ 0x34 -10003462: f7ff fb67 bl 10002b34 <_vsnprintf+0x50> -10003466: 2207 movs r2, #7 -10003468: 9b0d ldr r3, [sp, #52] @ 0x34 -1000346a: 3307 adds r3, #7 -1000346c: 4393 bics r3, r2 -1000346e: 3201 adds r2, #1 -10003470: 4694 mov ip, r2 -10003472: 449c add ip, r3 -10003474: 4662 mov r2, ip -10003476: 920d str r2, [sp, #52] @ 0x34 -10003478: cb0c ldmia r3, {r2, r3} -1000347a: 0fd9 lsrs r1, r3, #31 -1000347c: 910b str r1, [sp, #44] @ 0x2c -1000347e: 0011 movs r1, r2 -10003480: 4319 orrs r1, r3 -10003482: d100 bne.n 10003486 <_vsnprintf+0x9a2> -10003484: e09b b.n 100035be <_vsnprintf+0xada> -10003486: 17d9 asrs r1, r3, #31 -10003488: 9113 str r1, [sp, #76] @ 0x4c -1000348a: 9112 str r1, [sp, #72] @ 0x48 -1000348c: 4051 eors r1, r2 -1000348e: 9110 str r1, [sp, #64] @ 0x40 -10003490: 9913 ldr r1, [sp, #76] @ 0x4c -10003492: 4059 eors r1, r3 -10003494: 9111 str r1, [sp, #68] @ 0x44 -10003496: 9810 ldr r0, [sp, #64] @ 0x40 -10003498: 9911 ldr r1, [sp, #68] @ 0x44 -1000349a: 9a12 ldr r2, [sp, #72] @ 0x48 -1000349c: 9b13 ldr r3, [sp, #76] @ 0x4c -1000349e: 1a80 subs r0, r0, r2 -100034a0: 4199 sbcs r1, r3 -100034a2: 9010 str r0, [sp, #64] @ 0x40 -100034a4: 9111 str r1, [sp, #68] @ 0x44 -100034a6: aa14 add r2, sp, #80 @ 0x50 -100034a8: 4694 mov ip, r2 -100034aa: 4642 mov r2, r8 -100034ac: 2300 movs r3, #0 -100034ae: 9215 str r2, [sp, #84] @ 0x54 -100034b0: 4652 mov r2, sl -100034b2: 4699 mov r9, r3 -100034b4: 9216 str r2, [sp, #88] @ 0x58 -100034b6: 0032 movs r2, r6 -100034b8: 331f adds r3, #31 -100034ba: 4463 add r3, ip -100034bc: 46a8 mov r8, r5 -100034be: 464e mov r6, r9 -100034c0: 46ba mov sl, r7 -100034c2: 9414 str r4, [sp, #80] @ 0x50 -100034c4: 001f movs r7, r3 -100034c6: 9c10 ldr r4, [sp, #64] @ 0x40 -100034c8: 9d11 ldr r5, [sp, #68] @ 0x44 -100034ca: 4691 mov r9, r2 -100034cc: e001 b.n 100034d2 <_vsnprintf+0x9ee> -100034ce: 2e20 cmp r6, #32 -100034d0: d010 beq.n 100034f4 <_vsnprintf+0xa10> -100034d2: 0020 movs r0, r4 -100034d4: 0029 movs r1, r5 -100034d6: 220a movs r2, #10 -100034d8: 2300 movs r3, #0 -100034da: f000 f9af bl 1000383c <__wrap___aeabi_uldivmod> -100034de: 3601 adds r6, #1 -100034e0: 3230 adds r2, #48 @ 0x30 -100034e2: 002b movs r3, r5 -100034e4: 55ba strb r2, [r7, r6] -100034e6: 000d movs r5, r1 -100034e8: 0022 movs r2, r4 -100034ea: 0004 movs r4, r0 -100034ec: 2b00 cmp r3, #0 -100034ee: d1ee bne.n 100034ce <_vsnprintf+0x9ea> -100034f0: 2a09 cmp r2, #9 -100034f2: d8ec bhi.n 100034ce <_vsnprintf+0x9ea> -100034f4: 9b15 ldr r3, [sp, #84] @ 0x54 -100034f6: 9410 str r4, [sp, #64] @ 0x40 -100034f8: 9511 str r5, [sp, #68] @ 0x44 -100034fa: 4645 mov r5, r8 -100034fc: 4698 mov r8, r3 -100034fe: 464b mov r3, r9 -10003500: 9a16 ldr r2, [sp, #88] @ 0x58 -10003502: 46b1 mov r9, r6 -10003504: 4657 mov r7, sl -10003506: 001e movs r6, r3 -10003508: 4692 mov sl, r2 -1000350a: 9c14 ldr r4, [sp, #80] @ 0x50 -1000350c: 9b0f ldr r3, [sp, #60] @ 0x3c -1000350e: 9306 str r3, [sp, #24] -10003510: 4643 mov r3, r8 -10003512: 9305 str r3, [sp, #20] -10003514: 4653 mov r3, sl -10003516: 9304 str r3, [sp, #16] -10003518: 230a movs r3, #10 -1000351a: 9303 str r3, [sp, #12] -1000351c: 9b0b ldr r3, [sp, #44] @ 0x2c -1000351e: 9302 str r3, [sp, #8] -10003520: 464b mov r3, r9 -10003522: e71c b.n 1000335e <_vsnprintf+0x87a> -10003524: 2800 cmp r0, #0 -10003526: d185 bne.n 10003434 <_vsnprintf+0x950> -10003528: e759 b.n 100033de <_vsnprintf+0x8fa> -1000352a: 9b0d ldr r3, [sp, #52] @ 0x34 -1000352c: 681b ldr r3, [r3, #0] -1000352e: 0fda lsrs r2, r3, #31 -10003530: 0011 movs r1, r2 -10003532: 2b00 cmp r3, #0 -10003534: d100 bne.n 10003538 <_vsnprintf+0xa54> -10003536: e0a6 b.n 10003686 <_vsnprintf+0xba2> -10003538: 17da asrs r2, r3, #31 -1000353a: 1898 adds r0, r3, r2 -1000353c: 4050 eors r0, r2 -1000353e: aa14 add r2, sp, #80 @ 0x50 -10003540: 4691 mov r9, r2 -10003542: 231f movs r3, #31 -10003544: 4642 mov r2, r8 -10003546: 444b add r3, r9 -10003548: 46a8 mov r8, r5 -1000354a: 940d str r4, [sp, #52] @ 0x34 -1000354c: 9716 str r7, [sp, #88] @ 0x58 -1000354e: 0004 movs r4, r0 -10003550: 4665 mov r5, ip -10003552: 46b1 mov r9, r6 -10003554: 001f movs r7, r3 -10003556: 9114 str r1, [sp, #80] @ 0x50 -10003558: 9215 str r2, [sp, #84] @ 0x54 -1000355a: e001 b.n 10003560 <_vsnprintf+0xa7c> -1000355c: 2d20 cmp r5, #32 -1000355e: d00f beq.n 10003580 <_vsnprintf+0xa9c> -10003560: 0020 movs r0, r4 -10003562: 210a movs r1, #10 -10003564: f000 f92c bl 100037c0 <__wrap___aeabi_uidiv> -10003568: 3501 adds r5, #1 -1000356a: 197e adds r6, r7, r5 -1000356c: 3130 adds r1, #48 @ 0x30 -1000356e: 7031 strb r1, [r6, #0] -10003570: 0020 movs r0, r4 -10003572: 210a movs r1, #10 -10003574: f000 f924 bl 100037c0 <__wrap___aeabi_uidiv> -10003578: 0026 movs r6, r4 -1000357a: 0004 movs r4, r0 -1000357c: 2e09 cmp r6, #9 -1000357e: d8ed bhi.n 1000355c <_vsnprintf+0xa78> -10003580: 9b15 ldr r3, [sp, #84] @ 0x54 -10003582: 46ac mov ip, r5 -10003584: 4645 mov r5, r8 -10003586: 4698 mov r8, r3 -10003588: 9b14 ldr r3, [sp, #80] @ 0x50 -1000358a: 464e mov r6, r9 -1000358c: 0019 movs r1, r3 -1000358e: 9c0d ldr r4, [sp, #52] @ 0x34 -10003590: 9f16 ldr r7, [sp, #88] @ 0x58 -10003592: 9b0f ldr r3, [sp, #60] @ 0x3c -10003594: 9102 str r1, [sp, #8] -10003596: 9306 str r3, [sp, #24] -10003598: 4643 mov r3, r8 -1000359a: 9305 str r3, [sp, #20] -1000359c: 4653 mov r3, sl -1000359e: 9304 str r3, [sp, #16] -100035a0: 230a movs r3, #10 -100035a2: 9303 str r3, [sp, #12] -100035a4: 4663 mov r3, ip -100035a6: e750 b.n 1000344a <_vsnprintf+0x966> -100035a8: 0013 movs r3, r2 -100035aa: 061b lsls r3, r3, #24 -100035ac: d56e bpl.n 1000368c <_vsnprintf+0xba8> -100035ae: 9b0d ldr r3, [sp, #52] @ 0x34 -100035b0: 2200 movs r2, #0 -100035b2: 5e9b ldrsh r3, [r3, r2] -100035b4: 17d9 asrs r1, r3, #31 -100035b6: 185a adds r2, r3, r1 -100035b8: 404a eors r2, r1 -100035ba: b292 uxth r2, r2 -100035bc: e709 b.n 100033d2 <_vsnprintf+0x8ee> -100035be: 2300 movs r3, #0 -100035c0: 4699 mov r9, r3 -100035c2: 2800 cmp r0, #0 -100035c4: d1a2 bne.n 1000350c <_vsnprintf+0xa28> -100035c6: 2200 movs r2, #0 -100035c8: 2300 movs r3, #0 -100035ca: 9210 str r2, [sp, #64] @ 0x40 -100035cc: 9311 str r3, [sp, #68] @ 0x44 -100035ce: e76a b.n 100034a6 <_vsnprintf+0x9c2> -100035d0: 9b0d ldr r3, [sp, #52] @ 0x34 -100035d2: 681b ldr r3, [r3, #0] -100035d4: 4699 mov r9, r3 -100035d6: 2b00 cmp r3, #0 -100035d8: d103 bne.n 100035e2 <_vsnprintf+0xafe> -100035da: 3310 adds r3, #16 -100035dc: 4398 bics r0, r3 -100035de: 2900 cmp r1, #0 -100035e0: d138 bne.n 10003654 <_vsnprintf+0xb70> -100035e2: 2361 movs r3, #97 @ 0x61 -100035e4: 0682 lsls r2, r0, #26 -100035e6: d500 bpl.n 100035ea <_vsnprintf+0xb06> -100035e8: 2341 movs r3, #65 @ 0x41 -100035ea: b2db uxtb r3, r3 -100035ec: 3b0a subs r3, #10 -100035ee: 930d str r3, [sp, #52] @ 0x34 -100035f0: 4643 mov r3, r8 -100035f2: 9316 str r3, [sp, #88] @ 0x58 -100035f4: 4653 mov r3, sl -100035f6: a914 add r1, sp, #80 @ 0x50 -100035f8: 221f movs r2, #31 -100035fa: 468c mov ip, r1 -100035fc: 9317 str r3, [sp, #92] @ 0x5c -100035fe: 002b movs r3, r5 -10003600: 4462 add r2, ip -10003602: 464d mov r5, r9 -10003604: 46b2 mov sl, r6 -10003606: 9415 str r4, [sp, #84] @ 0x54 -10003608: 9718 str r7, [sp, #96] @ 0x60 -1000360a: 4680 mov r8, r0 -1000360c: 0017 movs r7, r2 -1000360e: 4699 mov r9, r3 -10003610: 9c0b ldr r4, [sp, #44] @ 0x2c -10003612: 9e0f ldr r6, [sp, #60] @ 0x3c -10003614: e008 b.n 10003628 <_vsnprintf+0xb44> -10003616: 3330 adds r3, #48 @ 0x30 -10003618: b2db uxtb r3, r3 -1000361a: 3401 adds r4, #1 -1000361c: 553b strb r3, [r7, r4] -1000361e: 42b5 cmp r5, r6 -10003620: d30e bcc.n 10003640 <_vsnprintf+0xb5c> -10003622: 2c20 cmp r4, #32 -10003624: d00c beq.n 10003640 <_vsnprintf+0xb5c> -10003626: 0005 movs r5, r0 -10003628: 0031 movs r1, r6 -1000362a: 0028 movs r0, r5 -1000362c: f000 f8c8 bl 100037c0 <__wrap___aeabi_uidiv> -10003630: b2cb uxtb r3, r1 -10003632: 2909 cmp r1, #9 -10003634: d9ef bls.n 10003616 <_vsnprintf+0xb32> -10003636: 9a0d ldr r2, [sp, #52] @ 0x34 -10003638: 4694 mov ip, r2 -1000363a: 4463 add r3, ip -1000363c: b2db uxtb r3, r3 -1000363e: e7ec b.n 1000361a <_vsnprintf+0xb36> -10003640: 9b16 ldr r3, [sp, #88] @ 0x58 -10003642: 4640 mov r0, r8 -10003644: 4698 mov r8, r3 -10003646: 9b17 ldr r3, [sp, #92] @ 0x5c -10003648: 4656 mov r6, sl -1000364a: 464d mov r5, r9 -1000364c: 469a mov sl, r3 -1000364e: 940b str r4, [sp, #44] @ 0x2c -10003650: 9f18 ldr r7, [sp, #96] @ 0x60 -10003652: 9c15 ldr r4, [sp, #84] @ 0x54 -10003654: 4643 mov r3, r8 -10003656: 9305 str r3, [sp, #20] -10003658: 4653 mov r3, sl -1000365a: 9304 str r3, [sp, #16] -1000365c: 9b0f ldr r3, [sp, #60] @ 0x3c -1000365e: 9006 str r0, [sp, #24] -10003660: 9303 str r3, [sp, #12] -10003662: 2300 movs r3, #0 -10003664: 9302 str r3, [sp, #8] -10003666: 9b0b ldr r3, [sp, #44] @ 0x2c -10003668: e50b b.n 10003082 <_vsnprintf+0x59e> -1000366a: 990b ldr r1, [sp, #44] @ 0x2c -1000366c: 2380 movs r3, #128 @ 0x80 -1000366e: 000a movs r2, r1 -10003670: 00db lsls r3, r3, #3 -10003672: 401a ands r2, r3 -10003674: 0010 movs r0, r2 -10003676: 000a movs r2, r1 -10003678: 4219 tst r1, r3 -1000367a: d000 beq.n 1000367e <_vsnprintf+0xb9a> -1000367c: e68b b.n 10003396 <_vsnprintf+0x8b2> -1000367e: 2310 movs r3, #16 -10003680: 439a bics r2, r3 -10003682: 920f str r2, [sp, #60] @ 0x3c -10003684: e68b b.n 1000339e <_vsnprintf+0x8ba> -10003686: 2800 cmp r0, #0 -10003688: d183 bne.n 10003592 <_vsnprintf+0xaae> -1000368a: e758 b.n 1000353e <_vsnprintf+0xa5a> -1000368c: 9b0d ldr r3, [sp, #52] @ 0x34 -1000368e: 681b ldr r3, [r3, #0] -10003690: 17d9 asrs r1, r3, #31 -10003692: 185a adds r2, r3, r1 -10003694: 404a eors r2, r1 -10003696: e69c b.n 100033d2 <_vsnprintf+0x8ee> -10003698: 9b0d ldr r3, [sp, #52] @ 0x34 -1000369a: 681b ldr r3, [r3, #0] -1000369c: 9309 str r3, [sp, #36] @ 0x24 -1000369e: e4dc b.n 1000305a <_vsnprintf+0x576> -100036a0: 0003 movs r3, r0 -100036a2: 3301 adds r3, #1 -100036a4: 930f str r3, [sp, #60] @ 0x3c -100036a6: e5a5 b.n 100031f4 <_vsnprintf+0x710> -100036a8: 920b str r2, [sp, #44] @ 0x2c -100036aa: e46d b.n 10002f88 <_vsnprintf+0x4a4> - -100036ac : -100036ac: b500 push {lr} -100036ae: b085 sub sp, #20 -100036b0: 9103 str r1, [sp, #12] -100036b2: 2101 movs r1, #1 -100036b4: 9002 str r0, [sp, #8] -100036b6: 9300 str r3, [sp, #0] -100036b8: 4803 ldr r0, [pc, #12] @ (100036c8 ) -100036ba: 0013 movs r3, r2 -100036bc: 424a negs r2, r1 -100036be: a902 add r1, sp, #8 -100036c0: f7ff fa10 bl 10002ae4 <_vsnprintf> -100036c4: b005 add sp, #20 -100036c6: bd00 pop {pc} -100036c8: 100022b1 .word 0x100022b1 - -100036cc : -100036cc: b510 push {r4, lr} -100036ce: 4a09 ldr r2, [pc, #36] @ (100036f4 ) -100036d0: 0003 movs r3, r0 -100036d2: 6814 ldr r4, [r2, #0] -100036d4: b084 sub sp, #16 -100036d6: 2c00 cmp r4, #0 -100036d8: d008 beq.n 100036ec -100036da: 2201 movs r2, #1 -100036dc: 9100 str r1, [sp, #0] -100036de: 4806 ldr r0, [pc, #24] @ (100036f8 ) -100036e0: 4252 negs r2, r2 -100036e2: a903 add r1, sp, #12 -100036e4: 47a0 blx r4 -100036e6: 2001 movs r0, #1 -100036e8: b004 add sp, #16 -100036ea: bd10 pop {r4, pc} -100036ec: f000 ffbe bl 1000466c <__wrap_puts> -100036f0: 2000 movs r0, #0 -100036f2: e7f9 b.n 100036e8 -100036f4: 20001c04 .word 0x20001c04 -100036f8: 100022a1 .word 0x100022a1 - -100036fc <__aeabi_bits_init>: -100036fc: 4801 ldr r0, [pc, #4] @ (10003704 <__aeabi_bits_init+0x8>) -100036fe: 2104 movs r1, #4 -10003700: 4b01 ldr r3, [pc, #4] @ (10003708 <__aeabi_bits_init+0xc>) -10003702: 4718 bx r3 -10003704: 20000e60 .word 0x20000e60 -10003708: 1000372d .word 0x1000372d - -1000370c : -1000370c: 2314 movs r3, #20 -1000370e: b510 push {r4, lr} -10003710: 0001 movs r1, r0 -10003712: 8818 ldrh r0, [r3, #0] -10003714: 3304 adds r3, #4 -10003716: 881b ldrh r3, [r3, #0] -10003718: 4798 blx r3 -1000371a: bd10 pop {r4, pc} - -1000371c : -1000371c: 2316 movs r3, #22 -1000371e: b510 push {r4, lr} -10003720: 0001 movs r1, r0 -10003722: 8818 ldrh r0, [r3, #0] -10003724: 3302 adds r3, #2 -10003726: 881b ldrh r3, [r3, #0] -10003728: 4798 blx r3 -1000372a: bd10 pop {r4, pc} - -1000372c : -1000372c: b5f8 push {r3, r4, r5, r6, r7, lr} -1000372e: 4647 mov r7, r8 -10003730: 46ce mov lr, r9 -10003732: b580 push {r7, lr} -10003734: 1e0f subs r7, r1, #0 -10003736: d019 beq.n 1000376c -10003738: 2314 movs r3, #20 -1000373a: 4699 mov r9, r3 -1000373c: 3304 adds r3, #4 -1000373e: 0004 movs r4, r0 -10003740: 2500 movs r5, #0 -10003742: 2601 movs r6, #1 -10003744: 4698 mov r8, r3 -10003746: 464b mov r3, r9 -10003748: 8818 ldrh r0, [r3, #0] -1000374a: 4643 mov r3, r8 -1000374c: 6821 ldr r1, [r4, #0] -1000374e: 881b ldrh r3, [r3, #0] -10003750: 4798 blx r3 -10003752: c401 stmia r4!, {r0} -10003754: 1e43 subs r3, r0, #1 -10003756: 4198 sbcs r0, r3 -10003758: 3501 adds r5, #1 -1000375a: 4240 negs r0, r0 -1000375c: 4006 ands r6, r0 -1000375e: 42af cmp r7, r5 -10003760: d1f1 bne.n 10003746 -10003762: 0030 movs r0, r6 -10003764: bcc0 pop {r6, r7} -10003766: 46b9 mov r9, r7 -10003768: 46b0 mov r8, r6 -1000376a: bdf8 pop {r3, r4, r5, r6, r7, pc} -1000376c: 2601 movs r6, #1 -1000376e: e7f8 b.n 10003762 - -10003770 <__wrap___aeabi_idiv>: -10003770: 4a12 ldr r2, [pc, #72] @ (100037bc ) -10003772: 6f93 ldr r3, [r2, #120] @ 0x78 -10003774: 089b lsrs r3, r3, #2 -10003776: d215 bcs.n 100037a4 - -10003778 : -10003778: 6690 str r0, [r2, #104] @ 0x68 -1000377a: 66d1 str r1, [r2, #108] @ 0x6c -1000377c: 2900 cmp r1, #0 -1000377e: d005 beq.n 1000378c -10003780: e7ff b.n 10003782 -10003782: e7ff b.n 10003784 -10003784: e7ff b.n 10003786 -10003786: 6f51 ldr r1, [r2, #116] @ 0x74 -10003788: 6f10 ldr r0, [r2, #112] @ 0x70 -1000378a: 4770 bx lr -1000378c: b504 push {r2, lr} -1000378e: 2180 movs r1, #128 @ 0x80 -10003790: 0609 lsls r1, r1, #24 -10003792: 17c2 asrs r2, r0, #31 -10003794: 4051 eors r1, r2 -10003796: 2800 cmp r0, #0 -10003798: d000 beq.n 1000379c -1000379a: 43c8 mvns r0, r1 -1000379c: f003 fafc bl 10006d98 <____aeabi_idiv0_veneer> -100037a0: 2100 movs r1, #0 -100037a2: bd04 pop {r2, pc} - -100037a4 : -100037a4: b5f0 push {r4, r5, r6, r7, lr} -100037a6: 6e14 ldr r4, [r2, #96] @ 0x60 -100037a8: 6e55 ldr r5, [r2, #100] @ 0x64 -100037aa: 6f57 ldr r7, [r2, #116] @ 0x74 -100037ac: 6f16 ldr r6, [r2, #112] @ 0x70 -100037ae: f7ff ffe3 bl 10003778 -100037b2: 6614 str r4, [r2, #96] @ 0x60 -100037b4: 6655 str r5, [r2, #100] @ 0x64 -100037b6: 6757 str r7, [r2, #116] @ 0x74 -100037b8: 6716 str r6, [r2, #112] @ 0x70 -100037ba: bdf0 pop {r4, r5, r6, r7, pc} -100037bc: d0000000 .word 0xd0000000 - -100037c0 <__wrap___aeabi_uidiv>: -100037c0: 4a11 ldr r2, [pc, #68] @ (10003808 ) -100037c2: 6f93 ldr r3, [r2, #120] @ 0x78 -100037c4: 089b lsrs r3, r3, #2 -100037c6: d213 bcs.n 100037f0 - -100037c8 : -100037c8: 6610 str r0, [r2, #96] @ 0x60 -100037ca: 6651 str r1, [r2, #100] @ 0x64 -100037cc: 2900 cmp r1, #0 -100037ce: d005 beq.n 100037dc -100037d0: e7ff b.n 100037d2 -100037d2: e7ff b.n 100037d4 -100037d4: e7ff b.n 100037d6 -100037d6: 6f51 ldr r1, [r2, #116] @ 0x74 -100037d8: 6f10 ldr r0, [r2, #112] @ 0x70 -100037da: 4770 bx lr -100037dc: b504 push {r2, lr} -100037de: 2800 cmp r0, #0 -100037e0: d001 beq.n 100037e6 -100037e2: 2000 movs r0, #0 -100037e4: 43c0 mvns r0, r0 -100037e6: f003 fad7 bl 10006d98 <____aeabi_idiv0_veneer> -100037ea: 2100 movs r1, #0 -100037ec: bd04 pop {r2, pc} -100037ee: 46c0 nop @ (mov r8, r8) - -100037f0 : -100037f0: b5f0 push {r4, r5, r6, r7, lr} -100037f2: 6e14 ldr r4, [r2, #96] @ 0x60 -100037f4: 6e55 ldr r5, [r2, #100] @ 0x64 -100037f6: 6f57 ldr r7, [r2, #116] @ 0x74 -100037f8: 6f16 ldr r6, [r2, #112] @ 0x70 -100037fa: f7ff ffe5 bl 100037c8 -100037fe: 6614 str r4, [r2, #96] @ 0x60 -10003800: 6655 str r5, [r2, #100] @ 0x64 -10003802: 6757 str r7, [r2, #116] @ 0x74 -10003804: 6716 str r6, [r2, #112] @ 0x70 -10003806: bdf0 pop {r4, r5, r6, r7, pc} -10003808: d0000000 .word 0xd0000000 - -1000380c <__wrap___aeabi_ldivmod>: -1000380c: 4694 mov ip, r2 -1000380e: 4a4a ldr r2, [pc, #296] @ (10003938 ) -10003810: 6f92 ldr r2, [r2, #120] @ 0x78 -10003812: 0892 lsrs r2, r2, #2 -10003814: 4662 mov r2, ip -10003816: d201 bcs.n 1000381c -10003818: e028 b.n 1000386c -1000381a: 46c0 nop @ (mov r8, r8) - -1000381c : -1000381c: b5f0 push {r4, r5, r6, r7, lr} -1000381e: 4e46 ldr r6, [pc, #280] @ (10003938 ) -10003820: 6e34 ldr r4, [r6, #96] @ 0x60 -10003822: 6e75 ldr r5, [r6, #100] @ 0x64 -10003824: 6f77 ldr r7, [r6, #116] @ 0x74 -10003826: 6f36 ldr r6, [r6, #112] @ 0x70 -10003828: f000 f820 bl 1000386c -1000382c: 4694 mov ip, r2 -1000382e: 4a42 ldr r2, [pc, #264] @ (10003938 ) -10003830: 6614 str r4, [r2, #96] @ 0x60 -10003832: 6655 str r5, [r2, #100] @ 0x64 -10003834: 6757 str r7, [r2, #116] @ 0x74 -10003836: 6716 str r6, [r2, #112] @ 0x70 -10003838: 4662 mov r2, ip -1000383a: bdf0 pop {r4, r5, r6, r7, pc} - -1000383c <__wrap___aeabi_uldivmod>: -1000383c: 4694 mov ip, r2 -1000383e: 4a3e ldr r2, [pc, #248] @ (10003938 ) -10003840: 6f92 ldr r2, [r2, #120] @ 0x78 -10003842: 0892 lsrs r2, r2, #2 -10003844: 4662 mov r2, ip -10003846: d201 bcs.n 1000384c -10003848: e054 b.n 100038f4 -1000384a: 46c0 nop @ (mov r8, r8) - -1000384c : -1000384c: b5f0 push {r4, r5, r6, r7, lr} -1000384e: 4e3a ldr r6, [pc, #232] @ (10003938 ) -10003850: 6e34 ldr r4, [r6, #96] @ 0x60 -10003852: 6e75 ldr r5, [r6, #100] @ 0x64 -10003854: 6f77 ldr r7, [r6, #116] @ 0x74 -10003856: 6f36 ldr r6, [r6, #112] @ 0x70 -10003858: f000 f84c bl 100038f4 -1000385c: 4694 mov ip, r2 -1000385e: 4a36 ldr r2, [pc, #216] @ (10003938 ) -10003860: 6614 str r4, [r2, #96] @ 0x60 -10003862: 6655 str r5, [r2, #100] @ 0x64 -10003864: 6757 str r7, [r2, #116] @ 0x74 -10003866: 6716 str r6, [r2, #112] @ 0x70 -10003868: 4662 mov r2, ip -1000386a: bdf0 pop {r4, r5, r6, r7, pc} - -1000386c : -1000386c: 2b00 cmp r3, #0 -1000386e: db24 blt.n 100038ba -10003870: d011 beq.n 10003896 -10003872: 2900 cmp r1, #0 -10003874: da3e bge.n 100038f4 -10003876: b500 push {lr} -10003878: 43c9 mvns r1, r1 -1000387a: 4240 negs r0, r0 -1000387c: d100 bne.n 10003880 -1000387e: 3101 adds r1, #1 - -10003880 : -10003880: f000 f838 bl 100038f4 -10003884: 43c9 mvns r1, r1 -10003886: 4240 negs r0, r0 -10003888: d100 bne.n 1000388c -1000388a: 3101 adds r1, #1 - -1000388c : -1000388c: 43db mvns r3, r3 -1000388e: 4252 negs r2, r2 -10003890: d100 bne.n 10003894 -10003892: 3301 adds r3, #1 - -10003894 : -10003894: bd00 pop {pc} -10003896: 2a00 cmp r2, #0 -10003898: d1eb bne.n 10003872 -1000389a: 2800 cmp r0, #0 -1000389c: d101 bne.n 100038a2 -1000389e: 2900 cmp r1, #0 -100038a0: d005 beq.n 100038ae -100038a2: 2000 movs r0, #0 -100038a4: 0fc9 lsrs r1, r1, #31 -100038a6: 07c9 lsls r1, r1, #31 -100038a8: d101 bne.n 100038ae -100038aa: 43c0 mvns r0, r0 -100038ac: 0841 lsrs r1, r0, #1 -100038ae: b500 push {lr} -100038b0: f003 fa62 bl 10006d78 <____aeabi_ldiv0_veneer> -100038b4: 2200 movs r2, #0 -100038b6: 2300 movs r3, #0 -100038b8: bd00 pop {pc} -100038ba: b500 push {lr} -100038bc: 2900 cmp r1, #0 -100038be: db0a blt.n 100038d6 -100038c0: 43db mvns r3, r3 -100038c2: 4252 negs r2, r2 -100038c4: d100 bne.n 100038c8 -100038c6: 3301 adds r3, #1 - -100038c8 : -100038c8: f000 f814 bl 100038f4 -100038cc: 43c9 mvns r1, r1 -100038ce: 4240 negs r0, r0 -100038d0: d100 bne.n 100038d4 -100038d2: 3101 adds r1, #1 - -100038d4 : -100038d4: bd00 pop {pc} -100038d6: 43c9 mvns r1, r1 -100038d8: 4240 negs r0, r0 -100038da: d100 bne.n 100038de -100038dc: 3101 adds r1, #1 - -100038de : -100038de: 43db mvns r3, r3 -100038e0: 4252 negs r2, r2 -100038e2: d100 bne.n 100038e6 -100038e4: 3301 adds r3, #1 - -100038e6 : -100038e6: f000 f805 bl 100038f4 -100038ea: 43db mvns r3, r3 -100038ec: 4252 negs r2, r2 -100038ee: d100 bne.n 100038f2 -100038f0: 3301 adds r3, #1 - -100038f2 : -100038f2: bd00 pop {pc} - -100038f4 : -100038f4: 2900 cmp r1, #0 -100038f6: d123 bne.n 10003940 -100038f8: 2b00 cmp r3, #0 -100038fa: d118 bne.n 1000392e -100038fc: 2a00 cmp r2, #0 -100038fe: d00c beq.n 1000391a -10003900: 46bc mov ip, r7 -10003902: 4f0d ldr r7, [pc, #52] @ (10003938 ) -10003904: 6638 str r0, [r7, #96] @ 0x60 -10003906: 667a str r2, [r7, #100] @ 0x64 -10003908: 2100 movs r1, #0 -1000390a: 2300 movs r3, #0 -1000390c: e7ff b.n 1000390e -1000390e: e7ff b.n 10003910 -10003910: e7ff b.n 10003912 -10003912: 6f7a ldr r2, [r7, #116] @ 0x74 -10003914: 6f38 ldr r0, [r7, #112] @ 0x70 -10003916: 4667 mov r7, ip -10003918: 4770 bx lr -1000391a: 2800 cmp r0, #0 -1000391c: d001 beq.n 10003922 - -1000391e : -1000391e: 4807 ldr r0, [pc, #28] @ (1000393c ) -10003920: 0001 movs r1, r0 -10003922: b500 push {lr} -10003924: f003 fa28 bl 10006d78 <____aeabi_ldiv0_veneer> -10003928: 2200 movs r2, #0 -1000392a: 2300 movs r3, #0 -1000392c: bd00 pop {pc} -1000392e: 0002 movs r2, r0 -10003930: 000b movs r3, r1 -10003932: 2000 movs r0, #0 -10003934: 2100 movs r1, #0 -10003936: 4770 bx lr -10003938: d0000000 .word 0xd0000000 -1000393c: ffffffff .word 0xffffffff - -10003940 : -10003940: 2b00 cmp r3, #0 -10003942: d000 beq.n 10003946 -10003944: e0bf b.n 10003ac6 -10003946: 0c13 lsrs r3, r2, #16 -10003948: d128 bne.n 1000399c -1000394a: 2a00 cmp r2, #0 -1000394c: d0e7 beq.n 1000391e -1000394e: b480 push {r7} -10003950: 4f11 ldr r7, [pc, #68] @ (10003998 ) -10003952: 6639 str r1, [r7, #96] @ 0x60 -10003954: 667a str r2, [r7, #100] @ 0x64 -10003956: e7ff b.n 10003958 -10003958: e7ff b.n 1000395a -1000395a: b430 push {r4, r5} -1000395c: 0c04 lsrs r4, r0, #16 -1000395e: 6f7b ldr r3, [r7, #116] @ 0x74 -10003960: 6f39 ldr r1, [r7, #112] @ 0x70 -10003962: 041b lsls r3, r3, #16 -10003964: 4323 orrs r3, r4 -10003966: 663b str r3, [r7, #96] @ 0x60 -10003968: 667a str r2, [r7, #100] @ 0x64 -1000396a: e7ff b.n 1000396c -1000396c: e7ff b.n 1000396e -1000396e: e7ff b.n 10003970 -10003970: 46c0 nop @ (mov r8, r8) -10003972: b284 uxth r4, r0 -10003974: 6f7b ldr r3, [r7, #116] @ 0x74 -10003976: 6f3d ldr r5, [r7, #112] @ 0x70 -10003978: 041b lsls r3, r3, #16 -1000397a: 4323 orrs r3, r4 -1000397c: 663b str r3, [r7, #96] @ 0x60 -1000397e: 667a str r2, [r7, #100] @ 0x64 -10003980: e7ff b.n 10003982 -10003982: e7ff b.n 10003984 -10003984: 46c0 nop @ (mov r8, r8) -10003986: 2300 movs r3, #0 -10003988: 042c lsls r4, r5, #16 -1000398a: 0c2d lsrs r5, r5, #16 -1000398c: 6f7a ldr r2, [r7, #116] @ 0x74 -1000398e: 6f38 ldr r0, [r7, #112] @ 0x70 -10003990: 1900 adds r0, r0, r4 -10003992: 4169 adcs r1, r5 -10003994: bcb0 pop {r4, r5, r7} -10003996: 4770 bx lr -10003998: d0000000 .word 0xd0000000 - -1000399c : -1000399c: b5f0 push {r4, r5, r6, r7, lr} -1000399e: 4694 mov ip, r2 -100039a0: 2500 movs r5, #0 -100039a2: 0e14 lsrs r4, r2, #24 -100039a4: d101 bne.n 100039aa -100039a6: 0212 lsls r2, r2, #8 -100039a8: 3508 adds r5, #8 -100039aa: 0f14 lsrs r4, r2, #28 -100039ac: d101 bne.n 100039b2 -100039ae: 0112 lsls r2, r2, #4 -100039b0: 3504 adds r5, #4 -100039b2: 0f94 lsrs r4, r2, #30 -100039b4: d101 bne.n 100039ba -100039b6: 0092 lsls r2, r2, #2 -100039b8: 3502 adds r5, #2 -100039ba: 0fd4 lsrs r4, r2, #31 -100039bc: d101 bne.n 100039c2 -100039be: 0052 lsls r2, r2, #1 -100039c0: 3501 adds r5, #1 -100039c2: 0bd4 lsrs r4, r2, #15 -100039c4: 3401 adds r4, #1 -100039c6: 4f25 ldr r7, [pc, #148] @ (10003a5c ) -100039c8: 667c str r4, [r7, #100] @ 0x64 -100039ca: 4c25 ldr r4, [pc, #148] @ (10003a60 ) -100039cc: 663c str r4, [r7, #96] @ 0x60 -100039ce: 0c0e lsrs r6, r1, #16 -100039d0: b293 uxth r3, r2 -100039d2: e7ff b.n 100039d4 -100039d4: e7ff b.n 100039d6 -100039d6: e7ff b.n 100039d8 -100039d8: 6f3c ldr r4, [r7, #112] @ 0x70 -100039da: 4366 muls r6, r4 -100039dc: 0c36 lsrs r6, r6, #16 -100039de: 0377 lsls r7, r6, #13 -100039e0: 46be mov lr, r7 -100039e2: 4373 muls r3, r6 -100039e4: 0bdf lsrs r7, r3, #15 -100039e6: 045b lsls r3, r3, #17 -100039e8: 1ac0 subs r0, r0, r3 -100039ea: 41b9 sbcs r1, r7 -100039ec: 0c13 lsrs r3, r2, #16 -100039ee: 4373 muls r3, r6 -100039f0: 18db adds r3, r3, r3 -100039f2: 1ac9 subs r1, r1, r3 -100039f4: 08ce lsrs r6, r1, #3 -100039f6: 4366 muls r6, r4 -100039f8: 0c36 lsrs r6, r6, #16 -100039fa: 44b6 add lr, r6 -100039fc: b293 uxth r3, r2 -100039fe: 4373 muls r3, r6 -10003a00: 0f1f lsrs r7, r3, #28 -10003a02: 011b lsls r3, r3, #4 -10003a04: 1ac0 subs r0, r0, r3 -10003a06: 41b9 sbcs r1, r7 -10003a08: 0c13 lsrs r3, r2, #16 -10003a0a: 4373 muls r3, r6 -10003a0c: 0b1f lsrs r7, r3, #12 -10003a0e: 051b lsls r3, r3, #20 -10003a10: 1ac0 subs r0, r0, r3 -10003a12: 41b9 sbcs r1, r7 -10003a14: 0d86 lsrs r6, r0, #22 -10003a16: 028f lsls r7, r1, #10 -10003a18: 433e orrs r6, r7 -10003a1a: 4366 muls r6, r4 -10003a1c: 0c36 lsrs r6, r6, #16 -10003a1e: 2d09 cmp r5, #9 -10003a20: db24 blt.n 10003a6c -10003a22: 0a52 lsrs r2, r2, #9 -10003a24: 4372 muls r2, r6 -10003a26: 1a80 subs r0, r0, r2 -10003a28: 0377 lsls r7, r6, #13 -10003a2a: 0a46 lsrs r6, r0, #9 -10003a2c: 4366 muls r6, r4 -10003a2e: 0c36 lsrs r6, r6, #16 -10003a30: 2316 movs r3, #22 -10003a32: 1b5b subs r3, r3, r5 -10003a34: 40de lsrs r6, r3 -10003a36: 40df lsrs r7, r3 -10003a38: 19bf adds r7, r7, r6 -10003a3a: 4664 mov r4, ip -10003a3c: 4366 muls r6, r4 -10003a3e: 1b82 subs r2, r0, r6 -10003a40: 4670 mov r0, lr -10003a42: 3504 adds r5, #4 -10003a44: 3306 adds r3, #6 -10003a46: 0001 movs r1, r0 -10003a48: 40d9 lsrs r1, r3 -10003a4a: 40a8 lsls r0, r5 -10003a4c: 19c0 adds r0, r0, r7 -10003a4e: d300 bcc.n 10003a52 -10003a50: 3101 adds r1, #1 -10003a52: 42a2 cmp r2, r4 -10003a54: d206 bcs.n 10003a64 -10003a56: 2300 movs r3, #0 -10003a58: bdf0 pop {r4, r5, r6, r7, pc} -10003a5a: 0000 .short 0x0000 -10003a5c: d0000000 .word 0xd0000000 -10003a60: ffffffff .word 0xffffffff -10003a64: 1b12 subs r2, r2, r4 -10003a66: 3001 adds r0, #1 -10003a68: d3f3 bcc.n 10003a52 -10003a6a: e7f1 b.n 10003a50 - -10003a6c : -10003a6c: 2709 movs r7, #9 -10003a6e: 1b7f subs r7, r7, r5 -10003a70: 40fe lsrs r6, r7 -10003a72: 4664 mov r4, ip -10003a74: b2a2 uxth r2, r4 -10003a76: 4372 muls r2, r6 -10003a78: 1a80 subs r0, r0, r2 -10003a7a: d200 bcs.n 10003a7e -10003a7c: 3901 subs r1, #1 -10003a7e: 0c22 lsrs r2, r4, #16 -10003a80: 4372 muls r2, r6 -10003a82: 0c13 lsrs r3, r2, #16 -10003a84: 0412 lsls r2, r2, #16 -10003a86: 1a82 subs r2, r0, r2 -10003a88: 4199 sbcs r1, r3 -10003a8a: 000b movs r3, r1 -10003a8c: 4670 mov r0, lr -10003a8e: 3504 adds r5, #4 -10003a90: 3713 adds r7, #19 -10003a92: 0001 movs r1, r0 -10003a94: 40f9 lsrs r1, r7 -10003a96: 40a8 lsls r0, r5 -10003a98: 1980 adds r0, r0, r6 -10003a9a: d300 bcc.n 10003a9e -10003a9c: 3101 adds r1, #1 -10003a9e: 2b00 cmp r3, #0 -10003aa0: d102 bne.n 10003aa8 -10003aa2: 42a2 cmp r2, r4 -10003aa4: d20a bcs.n 10003abc -10003aa6: bdf0 pop {r4, r5, r6, r7, pc} -10003aa8: 3001 adds r0, #1 -10003aaa: d300 bcc.n 10003aae -10003aac: 3101 adds r1, #1 -10003aae: 1b12 subs r2, r2, r4 -10003ab0: d2fa bcs.n 10003aa8 -10003ab2: 3b01 subs r3, #1 -10003ab4: d1f8 bne.n 10003aa8 -10003ab6: 42a2 cmp r2, r4 -10003ab8: d200 bcs.n 10003abc -10003aba: bdf0 pop {r4, r5, r6, r7, pc} -10003abc: 3001 adds r0, #1 -10003abe: d300 bcc.n 10003ac2 -10003ac0: 3101 adds r1, #1 -10003ac2: 1b12 subs r2, r2, r4 -10003ac4: e7f7 b.n 10003ab6 - -10003ac6 : -10003ac6: b5f0 push {r4, r5, r6, r7, lr} -10003ac8: 0c1c lsrs r4, r3, #16 -10003aca: d000 beq.n 10003ace -10003acc: e080 b.n 10003bd0 -10003ace: b40c push {r2, r3} -10003ad0: 2500 movs r5, #0 -10003ad2: 0a1c lsrs r4, r3, #8 -10003ad4: d104 bne.n 10003ae0 -10003ad6: 021b lsls r3, r3, #8 -10003ad8: 0e16 lsrs r6, r2, #24 -10003ada: 4333 orrs r3, r6 -10003adc: 0212 lsls r2, r2, #8 -10003ade: 3508 adds r5, #8 -10003ae0: 0b1c lsrs r4, r3, #12 -10003ae2: d104 bne.n 10003aee -10003ae4: 011b lsls r3, r3, #4 -10003ae6: 0f16 lsrs r6, r2, #28 -10003ae8: 4333 orrs r3, r6 -10003aea: 0112 lsls r2, r2, #4 -10003aec: 3504 adds r5, #4 -10003aee: 0b9c lsrs r4, r3, #14 -10003af0: d104 bne.n 10003afc -10003af2: 009b lsls r3, r3, #2 -10003af4: 0f96 lsrs r6, r2, #30 -10003af6: 4333 orrs r3, r6 -10003af8: 0092 lsls r2, r2, #2 -10003afa: 3502 adds r5, #2 -10003afc: 0bdc lsrs r4, r3, #15 -10003afe: d102 bne.n 10003b06 -10003b00: 1892 adds r2, r2, r2 -10003b02: 415b adcs r3, r3 -10003b04: 3501 adds r5, #1 -10003b06: 001c movs r4, r3 -10003b08: 1897 adds r7, r2, r2 -10003b0a: 4164 adcs r4, r4 -10003b0c: 3401 adds r4, #1 -10003b0e: 4f46 ldr r7, [pc, #280] @ (10003c28 ) -10003b10: 667c str r4, [r7, #100] @ 0x64 -10003b12: 4c46 ldr r4, [pc, #280] @ (10003c2c ) -10003b14: 663c str r4, [r7, #96] @ 0x60 -10003b16: 0c0e lsrs r6, r1, #16 -10003b18: e7ff b.n 10003b1a -10003b1a: e7ff b.n 10003b1c -10003b1c: e7ff b.n 10003b1e -10003b1e: 46c0 nop @ (mov r8, r8) -10003b20: 6f3c ldr r4, [r7, #112] @ 0x70 -10003b22: 4366 muls r6, r4 -10003b24: 0c36 lsrs r6, r6, #16 -10003b26: 0377 lsls r7, r6, #13 -10003b28: 46be mov lr, r7 -10003b2a: b297 uxth r7, r2 -10003b2c: 4377 muls r7, r6 -10003b2e: 1bc0 subs r0, r0, r7 -10003b30: d200 bcs.n 10003b34 -10003b32: 3901 subs r1, #1 -10003b34: 1bc0 subs r0, r0, r7 -10003b36: d200 bcs.n 10003b3a -10003b38: 3901 subs r1, #1 -10003b3a: b29f uxth r7, r3 -10003b3c: 4377 muls r7, r6 -10003b3e: 1bc9 subs r1, r1, r7 -10003b40: 1bc9 subs r1, r1, r7 -10003b42: 0c17 lsrs r7, r2, #16 -10003b44: 4377 muls r7, r6 -10003b46: 047e lsls r6, r7, #17 -10003b48: 0bff lsrs r7, r7, #15 -10003b4a: 1b80 subs r0, r0, r6 -10003b4c: 41b9 sbcs r1, r7 -10003b4e: 08ce lsrs r6, r1, #3 -10003b50: 4366 muls r6, r4 -10003b52: 0c36 lsrs r6, r6, #16 -10003b54: 2d0c cmp r5, #12 -10003b56: db33 blt.n 10003bc0 -10003b58: 44b6 add lr, r6 -10003b5a: 0b12 lsrs r2, r2, #12 -10003b5c: 051f lsls r7, r3, #20 -10003b5e: 433a orrs r2, r7 -10003b60: 0b1b lsrs r3, r3, #12 -10003b62: b297 uxth r7, r2 -10003b64: 4377 muls r7, r6 -10003b66: 1bc0 subs r0, r0, r7 -10003b68: d200 bcs.n 10003b6c -10003b6a: 3901 subs r1, #1 -10003b6c: b29f uxth r7, r3 -10003b6e: 4377 muls r7, r6 -10003b70: 1bc9 subs r1, r1, r7 -10003b72: 0c17 lsrs r7, r2, #16 -10003b74: 4377 muls r7, r6 -10003b76: 043e lsls r6, r7, #16 -10003b78: 0c3f lsrs r7, r7, #16 -10003b7a: 1b80 subs r0, r0, r6 -10003b7c: 41b9 sbcs r1, r7 -10003b7e: 0d86 lsrs r6, r0, #22 -10003b80: 028f lsls r7, r1, #10 -10003b82: 433e orrs r6, r7 -10003b84: 4366 muls r6, r4 -10003b86: 2729 movs r7, #41 @ 0x29 -10003b88: 1b7f subs r7, r7, r5 -10003b8a: 40fe lsrs r6, r7 -10003b8c: 3d0c subs r5, #12 -10003b8e: 4677 mov r7, lr -10003b90: 40af lsls r7, r5 -10003b92: 19bf adds r7, r7, r6 -10003b94: bc30 pop {r4, r5} -10003b96: b2a2 uxth r2, r4 -10003b98: b2ab uxth r3, r5 -10003b9a: 4372 muls r2, r6 -10003b9c: 4373 muls r3, r6 -10003b9e: 1a80 subs r0, r0, r2 -10003ba0: 4199 sbcs r1, r3 -10003ba2: 0c22 lsrs r2, r4, #16 -10003ba4: 4372 muls r2, r6 -10003ba6: 0c13 lsrs r3, r2, #16 -10003ba8: 0412 lsls r2, r2, #16 -10003baa: 1a80 subs r0, r0, r2 -10003bac: 4199 sbcs r1, r3 -10003bae: 0002 movs r2, r0 -10003bb0: 000b movs r3, r1 -10003bb2: 3701 adds r7, #1 -10003bb4: 1b00 subs r0, r0, r4 -10003bb6: 41a9 sbcs r1, r5 -10003bb8: d2f9 bcs.n 10003bae -10003bba: 1e78 subs r0, r7, #1 -10003bbc: 2100 movs r1, #0 -10003bbe: bdf0 pop {r4, r5, r6, r7, pc} - -10003bc0 : -10003bc0: 270c movs r7, #12 -10003bc2: 1b7f subs r7, r7, r5 -10003bc4: 40fe lsrs r6, r7 -10003bc6: 4677 mov r7, lr -10003bc8: 0b7f lsrs r7, r7, #13 -10003bca: 40af lsls r7, r5 -10003bcc: 19ff adds r7, r7, r7 -10003bce: e7e0 b.n 10003b92 - -10003bd0 : -10003bd0: 2400 movs r4, #0 -10003bd2: 1c5d adds r5, r3, #1 -10003bd4: d007 beq.n 10003be6 -10003bd6: 4f14 ldr r7, [pc, #80] @ (10003c28 ) -10003bd8: 667d str r5, [r7, #100] @ 0x64 -10003bda: 6639 str r1, [r7, #96] @ 0x60 -10003bdc: e7ff b.n 10003bde -10003bde: e7ff b.n 10003be0 -10003be0: e7ff b.n 10003be2 -10003be2: e7ff b.n 10003be4 -10003be4: 6f3c ldr r4, [r7, #112] @ 0x70 -10003be6: b295 uxth r5, r2 -10003be8: b29e uxth r6, r3 -10003bea: 4365 muls r5, r4 -10003bec: 4366 muls r6, r4 -10003bee: 1b40 subs r0, r0, r5 -10003bf0: 41b1 sbcs r1, r6 -10003bf2: 0c15 lsrs r5, r2, #16 -10003bf4: 0c1e lsrs r6, r3, #16 -10003bf6: 4365 muls r5, r4 -10003bf8: 4366 muls r6, r4 -10003bfa: 0436 lsls r6, r6, #16 -10003bfc: 0c2f lsrs r7, r5, #16 -10003bfe: 433e orrs r6, r7 -10003c00: 042d lsls r5, r5, #16 -10003c02: 1b40 subs r0, r0, r5 -10003c04: 41b1 sbcs r1, r6 -10003c06: 4299 cmp r1, r3 -10003c08: d204 bcs.n 10003c14 -10003c0a: 0002 movs r2, r0 -10003c0c: 000b movs r3, r1 -10003c0e: 0020 movs r0, r4 -10003c10: 2100 movs r1, #0 -10003c12: bdf0 pop {r4, r5, r6, r7, pc} -10003c14: d101 bne.n 10003c1a -10003c16: 4290 cmp r0, r2 -10003c18: d3f7 bcc.n 10003c0a -10003c1a: 1a80 subs r0, r0, r2 -10003c1c: 4199 sbcs r1, r3 -10003c1e: 3401 adds r4, #1 -10003c20: 4299 cmp r1, r3 -10003c22: d3f2 bcc.n 10003c0a -10003c24: e7f6 b.n 10003c14 -10003c26: 0000 .short 0x0000 -10003c28: d0000000 .word 0xd0000000 -10003c2c: ffffffff .word 0xffffffff - -10003c30 <__wrap___aeabi_drsub>: -10003c30: 4048 eors r0, r1 -10003c32: 4041 eors r1, r0 -10003c34: 4048 eors r0, r1 - -10003c36 <__wrap___aeabi_dsub>: -10003c36: b418 push {r3, r4} -10003c38: 4b1b ldr r3, [pc, #108] @ (10003ca8 <__wrap___aeabi_dmul+0x12>) -10003c3a: 685b ldr r3, [r3, #4] -10003c3c: 46fc mov ip, pc -10003c3e: 9301 str r3, [sp, #4] -10003c40: bd08 pop {r3, pc} -10003c42: df04 .short 0xdf04 -10003c44: 10003ec3 .word 0x10003ec3 - -10003c48 <__wrap___aeabi_dadd>: -10003c48: b418 push {r3, r4} -10003c4a: 4b17 ldr r3, [pc, #92] @ (10003ca8 <__wrap___aeabi_dmul+0x12>) -10003c4c: 681b ldr r3, [r3, #0] -10003c4e: 46fc mov ip, pc -10003c50: 9301 str r3, [sp, #4] -10003c52: bd08 pop {r3, pc} -10003c54: 3ecddf00 .word 0x3ecddf00 -10003c58: 1000 .short 0x1000 - -10003c5a <__wrap___aeabi_ddiv>: -10003c5a: 4694 mov ip, r2 -10003c5c: 4a13 ldr r2, [pc, #76] @ (10003cac <__wrap___aeabi_dmul+0x16>) -10003c5e: 6f92 ldr r2, [r2, #120] @ 0x78 -10003c60: 0892 lsrs r2, r2, #2 -10003c62: d209 bcs.n 10003c78 -10003c64: 4662 mov r2, ip - -10003c66 : -10003c66: b418 push {r3, r4} -10003c68: 4b0f ldr r3, [pc, #60] @ (10003ca8 <__wrap___aeabi_dmul+0x12>) -10003c6a: 68db ldr r3, [r3, #12] -10003c6c: 46fc mov ip, pc -10003c6e: 9301 str r3, [sp, #4] -10003c70: bd08 pop {r3, pc} -10003c72: df0c .short 0xdf0c -10003c74: 10004185 .word 0x10004185 - -10003c78 : -10003c78: 4a0c ldr r2, [pc, #48] @ (10003cac <__wrap___aeabi_dmul+0x16>) -10003c7a: b5f0 push {r4, r5, r6, r7, lr} -10003c7c: 6e14 ldr r4, [r2, #96] @ 0x60 -10003c7e: 6e55 ldr r5, [r2, #100] @ 0x64 -10003c80: 6f57 ldr r7, [r2, #116] @ 0x74 -10003c82: 6f16 ldr r6, [r2, #112] @ 0x70 -10003c84: 4662 mov r2, ip -10003c86: f7ff ffee bl 10003c66 -10003c8a: 4a08 ldr r2, [pc, #32] @ (10003cac <__wrap___aeabi_dmul+0x16>) -10003c8c: 6614 str r4, [r2, #96] @ 0x60 -10003c8e: 6655 str r5, [r2, #100] @ 0x64 -10003c90: 6757 str r7, [r2, #116] @ 0x74 -10003c92: 6716 str r6, [r2, #112] @ 0x70 -10003c94: bdf0 pop {r4, r5, r6, r7, pc} - -10003c96 <__wrap___aeabi_dmul>: -10003c96: b418 push {r3, r4} -10003c98: 4b03 ldr r3, [pc, #12] @ (10003ca8 <__wrap___aeabi_dmul+0x12>) -10003c9a: 689b ldr r3, [r3, #8] -10003c9c: 46fc mov ip, pc -10003c9e: 9301 str r3, [sp, #4] -10003ca0: bd08 pop {r3, pc} -10003ca2: df08 .short 0xdf08 -10003ca4: 10004029 .word 0x10004029 -10003ca8: 20001028 .word 0x20001028 -10003cac: d0000000 .word 0xd0000000 - -10003cb0 <__wrap___aeabi_cdrcmple>: -10003cb0: b5ff push {r0, r1, r2, r3, r4, r5, r6, r7, lr} -10003cb2: 4050 eors r0, r2 -10003cb4: 4042 eors r2, r0 -10003cb6: 4050 eors r0, r2 -10003cb8: 4059 eors r1, r3 -10003cba: 404b eors r3, r1 -10003cbc: 4059 eors r1, r3 -10003cbe: e000 b.n 10003cc2 <__aeabi_dfcmple_guts> - -10003cc0 <__wrap___aeabi_cdcmpeq>: -10003cc0: b5ff push {r0, r1, r2, r3, r4, r5, r6, r7, lr} - -10003cc2 <__aeabi_dfcmple_guts>: -10003cc2: 4f15 ldr r7, [pc, #84] @ (10003d18 <__aeabi_dfcmple_guts+0x56>) -10003cc4: 004c lsls r4, r1, #1 -10003cc6: 0d64 lsrs r4, r4, #21 -10003cc8: d003 beq.n 10003cd2 <__aeabi_dfcmple_guts+0x10> -10003cca: 42bc cmp r4, r7 -10003ccc: d104 bne.n 10003cd8 <__aeabi_dfcmple_guts+0x16> -10003cce: 030c lsls r4, r1, #12 -10003cd0: d814 bhi.n 10003cfc <__aeabi_dfcmple_guts+0x3a> -10003cd2: 2000 movs r0, #0 -10003cd4: 0d09 lsrs r1, r1, #20 -10003cd6: 0509 lsls r1, r1, #20 -10003cd8: 005c lsls r4, r3, #1 -10003cda: 0d64 lsrs r4, r4, #21 -10003cdc: d003 beq.n 10003ce6 <__aeabi_dfcmple_guts+0x24> -10003cde: 42bc cmp r4, r7 -10003ce0: d104 bne.n 10003cec <__aeabi_dfcmple_guts+0x2a> -10003ce2: 031c lsls r4, r3, #12 -10003ce4: d80a bhi.n 10003cfc <__aeabi_dfcmple_guts+0x3a> -10003ce6: 2200 movs r2, #0 -10003ce8: 0d1b lsrs r3, r3, #20 -10003cea: 051b lsls r3, r3, #20 -10003cec: 2601 movs r6, #1 -10003cee: 404b eors r3, r1 -10003cf0: d409 bmi.n 10003d06 <__aeabi_dfcmple_guts+0x44> -10003cf2: 404b eors r3, r1 -10003cf4: d503 bpl.n 10003cfe <__aeabi_dfcmple_guts+0x3c> -10003cf6: 428b cmp r3, r1 -10003cf8: d100 bne.n 10003cfc <__aeabi_dfcmple_guts+0x3a> -10003cfa: 4282 cmp r2, r0 -10003cfc: bdff pop {r0, r1, r2, r3, r4, r5, r6, r7, pc} -10003cfe: 4299 cmp r1, r3 -10003d00: d1fc bne.n 10003cfc <__aeabi_dfcmple_guts+0x3a> -10003d02: 4290 cmp r0, r2 -10003d04: bdff pop {r0, r1, r2, r3, r4, r5, r6, r7, pc} -10003d06: 430b orrs r3, r1 -10003d08: 18db adds r3, r3, r3 -10003d0a: 4303 orrs r3, r0 -10003d0c: 4313 orrs r3, r2 -10003d0e: d0f5 beq.n 10003cfc <__aeabi_dfcmple_guts+0x3a> -10003d10: 43c9 mvns r1, r1 -10003d12: 1849 adds r1, r1, r1 -10003d14: bdff pop {r0, r1, r2, r3, r4, r5, r6, r7, pc} -10003d16: 0000 .short 0x0000 -10003d18: 000007ff .word 0x000007ff - -10003d1c <__wrap___aeabi_dcmplt>: -10003d1c: b500 push {lr} -10003d1e: f7ff ffcf bl 10003cc0 <__wrap___aeabi_cdcmpeq> -10003d22: 4180 sbcs r0, r0 -10003d24: bd00 pop {pc} -10003d26: 46c0 nop @ (mov r8, r8) - -10003d28 <__wrap___aeabi_dcmpge>: -10003d28: b500 push {lr} -10003d2a: f7ff ffc1 bl 10003cb0 <__wrap___aeabi_cdrcmple> -10003d2e: d901 bls.n 10003d34 <__wrap___aeabi_dcmpge+0xc> -10003d30: 2000 movs r0, #0 -10003d32: bd00 pop {pc} -10003d34: 2001 movs r0, #1 -10003d36: bd00 pop {pc} - -10003d38 <__wrap___aeabi_dcmpgt>: -10003d38: b500 push {lr} -10003d3a: f7ff ffb9 bl 10003cb0 <__wrap___aeabi_cdrcmple> -10003d3e: 4180 sbcs r0, r0 -10003d40: bd00 pop {pc} - -10003d42 <__wrap___aeabi_dcmpun>: -10003d42: 2001 movs r0, #1 -10003d44: 0540 lsls r0, r0, #21 -10003d46: 004a lsls r2, r1, #1 -10003d48: 1812 adds r2, r2, r0 -10003d4a: d804 bhi.n 10003d56 <__wrap___aeabi_dcmpun+0x14> -10003d4c: 005a lsls r2, r3, #1 -10003d4e: 1812 adds r2, r2, r0 -10003d50: d801 bhi.n 10003d56 <__wrap___aeabi_dcmpun+0x14> -10003d52: 2000 movs r0, #0 -10003d54: 4770 bx lr -10003d56: 2001 movs r0, #1 -10003d58: 4770 bx lr -10003d5a: 2000 movs r0, #0 -10003d5c: 4770 bx lr +10003002: 2504 movs r5, #4 +10003004: 9309 str r3, [sp, #36] @ 0x24 +10003006: 9b25 ldr r3, [sp, #148] @ 0x94 +10003008: 2400 movs r4, #0 +1000300a: 42ab cmp r3, r5 +1000300c: d900 bls.n 10003010 <_etoa+0xac> +1000300e: 1b5c subs r4, r3, r5 +10003010: 2302 movs r3, #2 +10003012: 9a26 ldr r2, [sp, #152] @ 0x98 +10003014: 401a ands r2, r3 +10003016: 920c str r2, [sp, #48] @ 0x30 +10003018: 9a26 ldr r2, [sp, #152] @ 0x98 +1000301a: 4213 tst r3, r2 +1000301c: d003 beq.n 10003026 <_etoa+0xc2> +1000301e: 426b negs r3, r5 +10003020: 416b adcs r3, r5 +10003022: 425b negs r3, r3 +10003024: 401c ands r4, r3 +10003026: 9b09 ldr r3, [sp, #36] @ 0x24 +10003028: 2b00 cmp r3, #0 +1000302a: d007 beq.n 1000303c <_etoa+0xd8> +1000302c: 9a0a ldr r2, [sp, #40] @ 0x28 +1000302e: 9b0b ldr r3, [sp, #44] @ 0x2c +10003030: 0030 movs r0, r6 +10003032: 0039 movs r1, r7 +10003034: f001 fc63 bl 100048fe <__wrap___aeabi_ddiv> +10003038: 0006 movs r6, r0 +1000303a: 000f movs r7, r1 +1000303c: 9822 ldr r0, [sp, #136] @ 0x88 +1000303e: 9923 ldr r1, [sp, #140] @ 0x8c +10003040: 2200 movs r2, #0 +10003042: 2300 movs r3, #0 +10003044: f001 fcbc bl 100049c0 <__wrap___aeabi_dcmplt> +10003048: 2800 cmp r0, #0 +1000304a: d003 beq.n 10003054 <_etoa+0xf0> +1000304c: 2180 movs r1, #128 @ 0x80 +1000304e: 0609 lsls r1, r1, #24 +10003050: 187b adds r3, r7, r1 +10003052: 001f movs r7, r3 +10003054: 9a26 ldr r2, [sp, #152] @ 0x98 +10003056: 4baa ldr r3, [pc, #680] @ (10003300 <_etoa+0x39c>) +10003058: 9600 str r6, [sp, #0] +1000305a: 9701 str r7, [sp, #4] +1000305c: 4013 ands r3, r2 +1000305e: 9e08 ldr r6, [sp, #32] +10003060: 9304 str r3, [sp, #16] +10003062: 9b24 ldr r3, [sp, #144] @ 0x90 +10003064: 9403 str r4, [sp, #12] +10003066: 9302 str r3, [sp, #8] +10003068: 4642 mov r2, r8 +1000306a: 0033 movs r3, r6 +1000306c: 4649 mov r1, r9 +1000306e: 4650 mov r0, sl +10003070: f000 f9aa bl 100033c8 <_ftoa> +10003074: 0004 movs r4, r0 +10003076: 2d00 cmp r5, #0 +10003078: d067 beq.n 1000314a <_etoa+0x1e6> +1000307a: 2020 movs r0, #32 +1000307c: 9a26 ldr r2, [sp, #152] @ 0x98 +1000307e: 4649 mov r1, r9 +10003080: 4002 ands r2, r0 +10003082: 0013 movs r3, r2 +10003084: 425a negs r2, r3 +10003086: 4153 adcs r3, r2 +10003088: 425b negs r3, r3 +1000308a: 1c62 adds r2, r4, #1 +1000308c: 4018 ands r0, r3 +1000308e: 920a str r2, [sp, #40] @ 0x28 +10003090: 0033 movs r3, r6 +10003092: 0022 movs r2, r4 +10003094: 3045 adds r0, #69 @ 0x45 +10003096: 47d0 blx sl +10003098: 9a09 ldr r2, [sp, #36] @ 0x24 +1000309a: 1e6f subs r7, r5, #1 +1000309c: 17d3 asrs r3, r2, #31 +1000309e: 18d4 adds r4, r2, r3 +100030a0: 405c eors r4, r3 +100030a2: 0fd3 lsrs r3, r2, #31 +100030a4: 469b mov fp, r3 +100030a6: 2500 movs r5, #0 +100030a8: e001 b.n 100030ae <_etoa+0x14a> +100030aa: 2d20 cmp r5, #32 +100030ac: d013 beq.n 100030d6 <_etoa+0x172> +100030ae: aa08 add r2, sp, #32 +100030b0: 4694 mov ip, r2 +100030b2: 231f movs r3, #31 +100030b4: 0020 movs r0, r4 +100030b6: 4463 add r3, ip +100030b8: 210a movs r1, #10 +100030ba: 3501 adds r5, #1 +100030bc: 195e adds r6, r3, r5 +100030be: f001 f9d1 bl 10004464 <__wrap___aeabi_uidiv> +100030c2: 3130 adds r1, #48 @ 0x30 +100030c4: 7031 strb r1, [r6, #0] +100030c6: 0020 movs r0, r4 +100030c8: 210a movs r1, #10 +100030ca: f001 f9cb bl 10004464 <__wrap___aeabi_uidiv> +100030ce: 0026 movs r6, r4 +100030d0: 0004 movs r4, r0 +100030d2: 2e09 cmp r6, #9 +100030d4: d8e9 bhi.n 100030aa <_etoa+0x146> +100030d6: 2305 movs r3, #5 +100030d8: 9306 str r3, [sp, #24] +100030da: 2300 movs r3, #0 +100030dc: 9304 str r3, [sp, #16] +100030de: 330a adds r3, #10 +100030e0: 9303 str r3, [sp, #12] +100030e2: 465b mov r3, fp +100030e4: 9e08 ldr r6, [sp, #32] +100030e6: 9302 str r3, [sp, #8] +100030e8: ab10 add r3, sp, #64 @ 0x40 +100030ea: 9a0a ldr r2, [sp, #40] @ 0x28 +100030ec: 9300 str r3, [sp, #0] +100030ee: 4649 mov r1, r9 +100030f0: 0033 movs r3, r6 +100030f2: 4650 mov r0, sl +100030f4: 9705 str r7, [sp, #20] +100030f6: 9501 str r5, [sp, #4] +100030f8: f7ff fdfc bl 10002cf4 <_ntoa_format> +100030fc: 9a0c ldr r2, [sp, #48] @ 0x30 +100030fe: 0004 movs r4, r0 +10003100: 2a00 cmp r2, #0 +10003102: d022 beq.n 1000314a <_etoa+0x1e6> +10003104: 4642 mov r2, r8 +10003106: 1a85 subs r5, r0, r2 +10003108: 9a25 ldr r2, [sp, #148] @ 0x94 +1000310a: 42aa cmp r2, r5 +1000310c: d91d bls.n 1000314a <_etoa+0x1e6> +1000310e: 46b0 mov r8, r6 +10003110: 4657 mov r7, sl +10003112: 0016 movs r6, r2 +10003114: 0022 movs r2, r4 +10003116: 4643 mov r3, r8 +10003118: 4649 mov r1, r9 +1000311a: 2020 movs r0, #32 +1000311c: 3501 adds r5, #1 +1000311e: 47b8 blx r7 +10003120: 3401 adds r4, #1 +10003122: 42ae cmp r6, r5 +10003124: d8f6 bhi.n 10003114 <_etoa+0x1b0> +10003126: e010 b.n 1000314a <_etoa+0x1e6> +10003128: 9b26 ldr r3, [sp, #152] @ 0x98 +1000312a: 4642 mov r2, r8 +1000312c: 9304 str r3, [sp, #16] +1000312e: 9b25 ldr r3, [sp, #148] @ 0x94 +10003130: 4649 mov r1, r9 +10003132: 9303 str r3, [sp, #12] +10003134: 9b24 ldr r3, [sp, #144] @ 0x90 +10003136: 4650 mov r0, sl +10003138: 9302 str r3, [sp, #8] +1000313a: 9b22 ldr r3, [sp, #136] @ 0x88 +1000313c: 9c23 ldr r4, [sp, #140] @ 0x8c +1000313e: 9300 str r3, [sp, #0] +10003140: 9401 str r4, [sp, #4] +10003142: 9b08 ldr r3, [sp, #32] +10003144: f000 f940 bl 100033c8 <_ftoa> +10003148: 0004 movs r4, r0 +1000314a: 0020 movs r0, r4 +1000314c: b019 add sp, #100 @ 0x64 +1000314e: bcf0 pop {r4, r5, r6, r7} +10003150: 46bb mov fp, r7 +10003152: 46b2 mov sl, r6 +10003154: 46a9 mov r9, r5 +10003156: 46a0 mov r8, r4 +10003158: bdf0 pop {r4, r5, r6, r7, pc} +1000315a: 4b6a ldr r3, [pc, #424] @ (10003304 <_etoa+0x3a0>) +1000315c: 0078 lsls r0, r7, #1 +1000315e: 469c mov ip, r3 +10003160: 0d40 lsrs r0, r0, #21 +10003162: 4460 add r0, ip +10003164: f001 fc52 bl 10004a0c <__wrap___aeabi_i2d> +10003168: 4a67 ldr r2, [pc, #412] @ (10003308 <_etoa+0x3a4>) +1000316a: 4b68 ldr r3, [pc, #416] @ (1000330c <_etoa+0x3a8>) +1000316c: f001 fbe5 bl 1000493a <__wrap___aeabi_dmul> +10003170: 4a67 ldr r2, [pc, #412] @ (10003310 <_etoa+0x3ac>) +10003172: 4b68 ldr r3, [pc, #416] @ (10003314 <_etoa+0x3b0>) +10003174: f001 fbba bl 100048ec <__wrap___aeabi_dadd> +10003178: 4a67 ldr r2, [pc, #412] @ (10003318 <_etoa+0x3b4>) +1000317a: 033b lsls r3, r7, #12 +1000317c: 0b1b lsrs r3, r3, #12 +1000317e: 431a orrs r2, r3 +10003180: 0004 movs r4, r0 +10003182: 000d movs r5, r1 +10003184: 9809 ldr r0, [sp, #36] @ 0x24 +10003186: 0011 movs r1, r2 +10003188: 4b64 ldr r3, [pc, #400] @ (1000331c <_etoa+0x3b8>) +1000318a: 2200 movs r2, #0 +1000318c: f001 fba5 bl 100048da <__wrap___aeabi_dsub> +10003190: 4a63 ldr r2, [pc, #396] @ (10003320 <_etoa+0x3bc>) +10003192: 4b64 ldr r3, [pc, #400] @ (10003324 <_etoa+0x3c0>) +10003194: f001 fbd1 bl 1000493a <__wrap___aeabi_dmul> +10003198: 0002 movs r2, r0 +1000319a: 000b movs r3, r1 +1000319c: 0020 movs r0, r4 +1000319e: 0029 movs r1, r5 +100031a0: f001 fba4 bl 100048ec <__wrap___aeabi_dadd> +100031a4: f001 fc4a bl 10004a3c <__wrap___aeabi_d2iz> +100031a8: 9009 str r0, [sp, #36] @ 0x24 +100031aa: f001 fc2f bl 10004a0c <__wrap___aeabi_i2d> +100031ae: 4a5e ldr r2, [pc, #376] @ (10003328 <_etoa+0x3c4>) +100031b0: 4b5e ldr r3, [pc, #376] @ (1000332c <_etoa+0x3c8>) +100031b2: 0004 movs r4, r0 +100031b4: 000d movs r5, r1 +100031b6: f001 fbc0 bl 1000493a <__wrap___aeabi_dmul> +100031ba: 2200 movs r2, #0 +100031bc: 4b5c ldr r3, [pc, #368] @ (10003330 <_etoa+0x3cc>) +100031be: f001 fb95 bl 100048ec <__wrap___aeabi_dadd> +100031c2: f001 fc3b bl 10004a3c <__wrap___aeabi_d2iz> +100031c6: 4a5b ldr r2, [pc, #364] @ (10003334 <_etoa+0x3d0>) +100031c8: 4b5b ldr r3, [pc, #364] @ (10003338 <_etoa+0x3d4>) +100031ca: 0029 movs r1, r5 +100031cc: 900c str r0, [sp, #48] @ 0x30 +100031ce: 0020 movs r0, r4 +100031d0: f001 fbb3 bl 1000493a <__wrap___aeabi_dmul> +100031d4: 0004 movs r4, r0 +100031d6: 980c ldr r0, [sp, #48] @ 0x30 +100031d8: 000d movs r5, r1 +100031da: f001 fc17 bl 10004a0c <__wrap___aeabi_i2d> +100031de: 4a57 ldr r2, [pc, #348] @ (1000333c <_etoa+0x3d8>) +100031e0: 4b57 ldr r3, [pc, #348] @ (10003340 <_etoa+0x3dc>) +100031e2: f001 fbaa bl 1000493a <__wrap___aeabi_dmul> +100031e6: 0002 movs r2, r0 +100031e8: 000b movs r3, r1 +100031ea: 0020 movs r0, r4 +100031ec: 0029 movs r1, r5 +100031ee: f001 fb74 bl 100048da <__wrap___aeabi_dsub> +100031f2: 0004 movs r4, r0 +100031f4: 000d movs r5, r1 +100031f6: 0002 movs r2, r0 +100031f8: 000b movs r3, r1 +100031fa: 940a str r4, [sp, #40] @ 0x28 +100031fc: 950b str r5, [sp, #44] @ 0x2c +100031fe: f001 fb9c bl 1000493a <__wrap___aeabi_dmul> +10003202: 0004 movs r4, r0 +10003204: 000d movs r5, r1 +10003206: 980a ldr r0, [sp, #40] @ 0x28 +10003208: 990b ldr r1, [sp, #44] @ 0x2c +1000320a: 0002 movs r2, r0 +1000320c: 000b movs r3, r1 +1000320e: f001 fb6d bl 100048ec <__wrap___aeabi_dadd> +10003212: 2200 movs r2, #0 +10003214: 900e str r0, [sp, #56] @ 0x38 +10003216: 910f str r1, [sp, #60] @ 0x3c +10003218: 4b4a ldr r3, [pc, #296] @ (10003344 <_etoa+0x3e0>) +1000321a: 0020 movs r0, r4 +1000321c: 0029 movs r1, r5 +1000321e: f001 fb6e bl 100048fe <__wrap___aeabi_ddiv> +10003222: 2200 movs r2, #0 +10003224: 4b48 ldr r3, [pc, #288] @ (10003348 <_etoa+0x3e4>) +10003226: f001 fb61 bl 100048ec <__wrap___aeabi_dadd> +1000322a: 0002 movs r2, r0 +1000322c: 000b movs r3, r1 +1000322e: 0020 movs r0, r4 +10003230: 0029 movs r1, r5 +10003232: f001 fb64 bl 100048fe <__wrap___aeabi_ddiv> +10003236: 2200 movs r2, #0 +10003238: 4b44 ldr r3, [pc, #272] @ (1000334c <_etoa+0x3e8>) +1000323a: f001 fb57 bl 100048ec <__wrap___aeabi_dadd> +1000323e: 0002 movs r2, r0 +10003240: 000b movs r3, r1 +10003242: 0020 movs r0, r4 +10003244: 0029 movs r1, r5 +10003246: f001 fb5a bl 100048fe <__wrap___aeabi_ddiv> +1000324a: 9a0a ldr r2, [sp, #40] @ 0x28 +1000324c: 9b0b ldr r3, [sp, #44] @ 0x2c +1000324e: 000d movs r5, r1 +10003250: 2180 movs r1, #128 @ 0x80 +10003252: 0004 movs r4, r0 +10003254: 05c9 lsls r1, r1, #23 +10003256: 2000 movs r0, #0 +10003258: f001 fb3f bl 100048da <__wrap___aeabi_dsub> +1000325c: 0002 movs r2, r0 +1000325e: 000b movs r3, r1 +10003260: 0020 movs r0, r4 +10003262: 0029 movs r1, r5 +10003264: f001 fb42 bl 100048ec <__wrap___aeabi_dadd> +10003268: 0002 movs r2, r0 +1000326a: 000b movs r3, r1 +1000326c: 980e ldr r0, [sp, #56] @ 0x38 +1000326e: 990f ldr r1, [sp, #60] @ 0x3c +10003270: f001 fb45 bl 100048fe <__wrap___aeabi_ddiv> +10003274: 2200 movs r2, #0 +10003276: 4b28 ldr r3, [pc, #160] @ (10003318 <_etoa+0x3b4>) +10003278: f001 fb38 bl 100048ec <__wrap___aeabi_dadd> +1000327c: 4b34 ldr r3, [pc, #208] @ (10003350 <_etoa+0x3ec>) +1000327e: 9c0c ldr r4, [sp, #48] @ 0x30 +10003280: 469c mov ip, r3 +10003282: 4464 add r4, ip +10003284: 0523 lsls r3, r4, #20 +10003286: 2200 movs r2, #0 +10003288: f001 fb57 bl 1000493a <__wrap___aeabi_dmul> +1000328c: 0004 movs r4, r0 +1000328e: 000d movs r5, r1 +10003290: 0002 movs r2, r0 +10003292: 000b movs r3, r1 +10003294: 0030 movs r0, r6 +10003296: 0039 movs r1, r7 +10003298: 940a str r4, [sp, #40] @ 0x28 +1000329a: 950b str r5, [sp, #44] @ 0x2c +1000329c: f001 fb90 bl 100049c0 <__wrap___aeabi_dcmplt> +100032a0: 2800 cmp r0, #0 +100032a2: d15d bne.n 10003360 <_etoa+0x3fc> +100032a4: 0023 movs r3, r4 +100032a6: 002a movs r2, r5 +100032a8: 25c6 movs r5, #198 @ 0xc6 +100032aa: 9909 ldr r1, [sp, #36] @ 0x24 +100032ac: 3163 adds r1, #99 @ 0x63 +100032ae: 428d cmp r5, r1 +100032b0: 41ad sbcs r5, r5 +100032b2: 4659 mov r1, fp +100032b4: 426d negs r5, r5 +100032b6: 3504 adds r5, #4 +100032b8: 2900 cmp r1, #0 +100032ba: d100 bne.n 100032be <_etoa+0x35a> +100032bc: e6a3 b.n 10003006 <_etoa+0xa2> +100032be: 4313 orrs r3, r2 +100032c0: d063 beq.n 1000338a <_etoa+0x426> +100032c2: 0030 movs r0, r6 +100032c4: 0039 movs r1, r7 +100032c6: 4a23 ldr r2, [pc, #140] @ (10003354 <_etoa+0x3f0>) +100032c8: 4b23 ldr r3, [pc, #140] @ (10003358 <_etoa+0x3f4>) +100032ca: f001 fb7f bl 100049cc <__wrap___aeabi_dcmpge> +100032ce: 2800 cmp r0, #0 +100032d0: d007 beq.n 100032e2 <_etoa+0x37e> +100032d2: 2200 movs r2, #0 +100032d4: 0030 movs r0, r6 +100032d6: 0039 movs r1, r7 +100032d8: 4b20 ldr r3, [pc, #128] @ (1000335c <_etoa+0x3f8>) +100032da: f001 fb71 bl 100049c0 <__wrap___aeabi_dcmplt> +100032de: 2800 cmp r0, #0 +100032e0: d153 bne.n 1000338a <_etoa+0x426> +100032e2: 9b24 ldr r3, [sp, #144] @ 0x90 +100032e4: 2b00 cmp r3, #0 +100032e6: d100 bne.n 100032ea <_etoa+0x386> +100032e8: e68d b.n 10003006 <_etoa+0xa2> +100032ea: 9b0d ldr r3, [sp, #52] @ 0x34 +100032ec: 1e5a subs r2, r3, #1 +100032ee: 4193 sbcs r3, r2 +100032f0: 9a24 ldr r2, [sp, #144] @ 0x90 +100032f2: 1ad3 subs r3, r2, r3 +100032f4: 9324 str r3, [sp, #144] @ 0x90 +100032f6: e686 b.n 10003006 <_etoa+0xa2> +100032f8: 7fefffff .word 0x7fefffff +100032fc: ffefffff .word 0xffefffff +10003300: fffff7ff .word 0xfffff7ff +10003304: fffffc01 .word 0xfffffc01 +10003308: 509f79fb .word 0x509f79fb +1000330c: 3fd34413 .word 0x3fd34413 +10003310: 8b60c8b3 .word 0x8b60c8b3 +10003314: 3fc68a28 .word 0x3fc68a28 +10003318: 3ff00000 .word 0x3ff00000 +1000331c: 3ff80000 .word 0x3ff80000 +10003320: 636f4361 .word 0x636f4361 +10003324: 3fd287a7 .word 0x3fd287a7 +10003328: 0979a371 .word 0x0979a371 +1000332c: 400a934f .word 0x400a934f +10003330: 3fe00000 .word 0x3fe00000 +10003334: bbb55516 .word 0xbbb55516 +10003338: 40026bb1 .word 0x40026bb1 +1000333c: fefa39ef .word 0xfefa39ef +10003340: 3fe62e42 .word 0x3fe62e42 +10003344: 402c0000 .word 0x402c0000 +10003348: 40240000 .word 0x40240000 +1000334c: 40180000 .word 0x40180000 +10003350: 000003ff .word 0x000003ff +10003354: eb1c432d .word 0xeb1c432d +10003358: 3f1a36e2 .word 0x3f1a36e2 +1000335c: 412e8480 .word 0x412e8480 +10003360: 9b09 ldr r3, [sp, #36] @ 0x24 +10003362: 2200 movs r2, #0 +10003364: 3b01 subs r3, #1 +10003366: 9309 str r3, [sp, #36] @ 0x24 +10003368: 0020 movs r0, r4 +1000336a: 4b16 ldr r3, [pc, #88] @ (100033c4 <_etoa+0x460>) +1000336c: 0029 movs r1, r5 +1000336e: f001 fac6 bl 100048fe <__wrap___aeabi_ddiv> +10003372: 000a movs r2, r1 +10003374: 0001 movs r1, r0 +10003376: 0003 movs r3, r0 +10003378: 910a str r1, [sp, #40] @ 0x28 +1000337a: 920b str r2, [sp, #44] @ 0x2c +1000337c: e794 b.n 100032a8 <_etoa+0x344> +1000337e: 2300 movs r3, #0 +10003380: 2400 movs r4, #0 +10003382: 930a str r3, [sp, #40] @ 0x28 +10003384: 940b str r4, [sp, #44] @ 0x2c +10003386: 2300 movs r3, #0 +10003388: 9309 str r3, [sp, #36] @ 0x24 +1000338a: 9a24 ldr r2, [sp, #144] @ 0x90 +1000338c: 9b09 ldr r3, [sp, #36] @ 0x24 +1000338e: 429a cmp r2, r3 +10003390: dd14 ble.n 100033bc <_etoa+0x458> +10003392: 1ad3 subs r3, r2, r3 +10003394: 3b01 subs r3, #1 +10003396: 9324 str r3, [sp, #144] @ 0x90 +10003398: 2380 movs r3, #128 @ 0x80 +1000339a: 9a26 ldr r2, [sp, #152] @ 0x98 +1000339c: 00db lsls r3, r3, #3 +1000339e: 431a orrs r2, r3 +100033a0: 2300 movs r3, #0 +100033a2: 2500 movs r5, #0 +100033a4: 9226 str r2, [sp, #152] @ 0x98 +100033a6: 9309 str r3, [sp, #36] @ 0x24 +100033a8: e62d b.n 10003006 <_etoa+0xa2> +100033aa: 2280 movs r2, #128 @ 0x80 +100033ac: 0612 lsls r2, r2, #24 +100033ae: 4694 mov ip, r2 +100033b0: 9b22 ldr r3, [sp, #136] @ 0x88 +100033b2: 001e movs r6, r3 +100033b4: 9b23 ldr r3, [sp, #140] @ 0x8c +100033b6: 4463 add r3, ip +100033b8: 001f movs r7, r3 +100033ba: e606 b.n 10002fca <_etoa+0x66> +100033bc: 2300 movs r3, #0 +100033be: 9324 str r3, [sp, #144] @ 0x90 +100033c0: e7ea b.n 10003398 <_etoa+0x434> +100033c2: 46c0 nop @ (mov r8, r8) +100033c4: 40240000 .word 0x40240000 + +100033c8 <_ftoa>: +100033c8: b5f0 push {r4, r5, r6, r7, lr} +100033ca: 4645 mov r5, r8 +100033cc: 46de mov lr, fp +100033ce: 464e mov r6, r9 +100033d0: 4657 mov r7, sl +100033d2: b5e0 push {r5, r6, r7, lr} +100033d4: b095 sub sp, #84 @ 0x54 +100033d6: 468b mov fp, r1 +100033d8: 4690 mov r8, r2 +100033da: 4699 mov r9, r3 +100033dc: 9a1e ldr r2, [sp, #120] @ 0x78 +100033de: 9b1f ldr r3, [sp, #124] @ 0x7c +100033e0: 900a str r0, [sp, #40] @ 0x28 +100033e2: 0019 movs r1, r3 +100033e4: 0010 movs r0, r2 +100033e6: 9d20 ldr r5, [sp, #128] @ 0x80 +100033e8: f001 fafd bl 100049e6 <__wrap___aeabi_dcmpun> +100033ec: 2800 cmp r0, #0 +100033ee: d000 beq.n 100033f2 <_ftoa+0x2a> +100033f0: e1b0 b.n 10003754 <_ftoa+0x38c> +100033f2: 981e ldr r0, [sp, #120] @ 0x78 +100033f4: 991f ldr r1, [sp, #124] @ 0x7c +100033f6: 2201 movs r2, #1 +100033f8: 4bc7 ldr r3, [pc, #796] @ (10003718 <_ftoa+0x350>) +100033fa: 4252 negs r2, r2 +100033fc: f001 fae0 bl 100049c0 <__wrap___aeabi_dcmplt> +10003400: 2800 cmp r0, #0 +10003402: d000 beq.n 10003406 <_ftoa+0x3e> +10003404: e137 b.n 10003676 <_ftoa+0x2ae> +10003406: 981e ldr r0, [sp, #120] @ 0x78 +10003408: 991f ldr r1, [sp, #124] @ 0x7c +1000340a: 2201 movs r2, #1 +1000340c: 4bc3 ldr r3, [pc, #780] @ (1000371c <_ftoa+0x354>) +1000340e: 4252 negs r2, r2 +10003410: f001 fae4 bl 100049dc <__wrap___aeabi_dcmpgt> +10003414: 2800 cmp r0, #0 +10003416: d000 beq.n 1000341a <_ftoa+0x52> +10003418: e0a7 b.n 1000356a <_ftoa+0x1a2> +1000341a: 981e ldr r0, [sp, #120] @ 0x78 +1000341c: 991f ldr r1, [sp, #124] @ 0x7c +1000341e: 2200 movs r2, #0 +10003420: 4bbf ldr r3, [pc, #764] @ (10003720 <_ftoa+0x358>) +10003422: f001 fadb bl 100049dc <__wrap___aeabi_dcmpgt> +10003426: 2800 cmp r0, #0 +10003428: d000 beq.n 1000342c <_ftoa+0x64> +1000342a: e088 b.n 1000353e <_ftoa+0x176> +1000342c: 981e ldr r0, [sp, #120] @ 0x78 +1000342e: 991f ldr r1, [sp, #124] @ 0x7c +10003430: 2200 movs r2, #0 +10003432: 4bbc ldr r3, [pc, #752] @ (10003724 <_ftoa+0x35c>) +10003434: f001 fac4 bl 100049c0 <__wrap___aeabi_dcmplt> +10003438: 2800 cmp r0, #0 +1000343a: d000 beq.n 1000343e <_ftoa+0x76> +1000343c: e07f b.n 1000353e <_ftoa+0x176> +1000343e: 981e ldr r0, [sp, #120] @ 0x78 +10003440: 991f ldr r1, [sp, #124] @ 0x7c +10003442: 2200 movs r2, #0 +10003444: 2300 movs r3, #0 +10003446: f001 fabb bl 100049c0 <__wrap___aeabi_dcmplt> +1000344a: 2800 cmp r0, #0 +1000344c: d000 beq.n 10003450 <_ftoa+0x88> +1000344e: e0fa b.n 10003646 <_ftoa+0x27e> +10003450: 2300 movs r3, #0 +10003452: 930b str r3, [sp, #44] @ 0x2c +10003454: 2380 movs r3, #128 @ 0x80 +10003456: 9c22 ldr r4, [sp, #136] @ 0x88 +10003458: 9a22 ldr r2, [sp, #136] @ 0x88 +1000345a: 00db lsls r3, r3, #3 +1000345c: 401c ands r4, r3 +1000345e: 421a tst r2, r3 +10003460: d100 bne.n 10003464 <_ftoa+0x9c> +10003462: e102 b.n 1000366a <_ftoa+0x2a2> +10003464: 2d09 cmp r5, #9 +10003466: d800 bhi.n 1000346a <_ftoa+0xa2> +10003468: e17c b.n 10003764 <_ftoa+0x39c> +1000346a: a906 add r1, sp, #24 +1000346c: 468c mov ip, r1 +1000346e: 002c movs r4, r5 +10003470: 2217 movs r2, #23 +10003472: 2300 movs r3, #0 +10003474: 2130 movs r1, #48 @ 0x30 +10003476: 3c09 subs r4, #9 +10003478: 4462 add r2, ip +1000347a: 3301 adds r3, #1 +1000347c: 54d1 strb r1, [r2, r3] +1000347e: 1aef subs r7, r5, r3 +10003480: 2b20 cmp r3, #32 +10003482: d100 bne.n 10003486 <_ftoa+0xbe> +10003484: e132 b.n 100036ec <_ftoa+0x324> +10003486: 42a3 cmp r3, r4 +10003488: d1f7 bne.n 1000347a <_ftoa+0xb2> +1000348a: 2200 movs r2, #0 +1000348c: 4ba4 ldr r3, [pc, #656] @ (10003720 <_ftoa+0x358>) +1000348e: 9206 str r2, [sp, #24] +10003490: 9307 str r3, [sp, #28] +10003492: 981e ldr r0, [sp, #120] @ 0x78 +10003494: 991f ldr r1, [sp, #124] @ 0x7c +10003496: f001 fad1 bl 10004a3c <__wrap___aeabi_d2iz> +1000349a: 0005 movs r5, r0 +1000349c: f001 fab6 bl 10004a0c <__wrap___aeabi_i2d> +100034a0: 0002 movs r2, r0 +100034a2: 000b movs r3, r1 +100034a4: 981e ldr r0, [sp, #120] @ 0x78 +100034a6: 991f ldr r1, [sp, #124] @ 0x7c +100034a8: f001 fa17 bl 100048da <__wrap___aeabi_dsub> +100034ac: 9a06 ldr r2, [sp, #24] +100034ae: 9b07 ldr r3, [sp, #28] +100034b0: f001 fa43 bl 1000493a <__wrap___aeabi_dmul> +100034b4: 9008 str r0, [sp, #32] +100034b6: 9109 str r1, [sp, #36] @ 0x24 +100034b8: f001 fae4 bl 10004a84 <__wrap___aeabi_d2uiz> +100034bc: 0006 movs r6, r0 +100034be: f001 faa1 bl 10004a04 <__wrap___aeabi_ui2d> +100034c2: 0002 movs r2, r0 +100034c4: 000b movs r3, r1 +100034c6: 9808 ldr r0, [sp, #32] +100034c8: 9909 ldr r1, [sp, #36] @ 0x24 +100034ca: f001 fa06 bl 100048da <__wrap___aeabi_dsub> +100034ce: 2200 movs r2, #0 +100034d0: 4b95 ldr r3, [pc, #596] @ (10003728 <_ftoa+0x360>) +100034d2: 9008 str r0, [sp, #32] +100034d4: 9109 str r1, [sp, #36] @ 0x24 +100034d6: f001 fa81 bl 100049dc <__wrap___aeabi_dcmpgt> +100034da: 2800 cmp r0, #0 +100034dc: d100 bne.n 100034e0 <_ftoa+0x118> +100034de: e0d2 b.n 10003686 <_ftoa+0x2be> +100034e0: 3601 adds r6, #1 +100034e2: 0030 movs r0, r6 +100034e4: f001 fa8e bl 10004a04 <__wrap___aeabi_ui2d> +100034e8: 9a06 ldr r2, [sp, #24] +100034ea: 9b07 ldr r3, [sp, #28] +100034ec: f001 fa6e bl 100049cc <__wrap___aeabi_dcmpge> +100034f0: 2800 cmp r0, #0 +100034f2: d001 beq.n 100034f8 <_ftoa+0x130> +100034f4: 2600 movs r6, #0 +100034f6: 3501 adds r5, #1 +100034f8: 46aa mov sl, r5 +100034fa: 2f00 cmp r7, #0 +100034fc: d000 beq.n 10003500 <_ftoa+0x138> +100034fe: e098 b.n 10003632 <_ftoa+0x26a> +10003500: 0028 movs r0, r5 +10003502: f001 fa83 bl 10004a0c <__wrap___aeabi_i2d> +10003506: 0002 movs r2, r0 +10003508: 000b movs r3, r1 +1000350a: 981e ldr r0, [sp, #120] @ 0x78 +1000350c: 991f ldr r1, [sp, #124] @ 0x7c +1000350e: f001 f9e4 bl 100048da <__wrap___aeabi_dsub> +10003512: 4b85 ldr r3, [pc, #532] @ (10003728 <_ftoa+0x360>) +10003514: 2200 movs r2, #0 +10003516: 0006 movs r6, r0 +10003518: 000f movs r7, r1 +1000351a: f001 fa51 bl 100049c0 <__wrap___aeabi_dcmplt> +1000351e: ab0c add r3, sp, #48 @ 0x30 +10003520: 469a mov sl, r3 +10003522: 2800 cmp r0, #0 +10003524: d145 bne.n 100035b2 <_ftoa+0x1ea> +10003526: 2200 movs r2, #0 +10003528: 0030 movs r0, r6 +1000352a: 0039 movs r1, r7 +1000352c: 4b7e ldr r3, [pc, #504] @ (10003728 <_ftoa+0x360>) +1000352e: f001 fa55 bl 100049dc <__wrap___aeabi_dcmpgt> +10003532: 2800 cmp r0, #0 +10003534: d13d bne.n 100035b2 <_ftoa+0x1ea> +10003536: 07eb lsls r3, r5, #31 +10003538: d53b bpl.n 100035b2 <_ftoa+0x1ea> +1000353a: 3501 adds r5, #1 +1000353c: e039 b.n 100035b2 <_ftoa+0x1ea> +1000353e: 9b22 ldr r3, [sp, #136] @ 0x88 +10003540: 4642 mov r2, r8 +10003542: 9304 str r3, [sp, #16] +10003544: 9b21 ldr r3, [sp, #132] @ 0x84 +10003546: 4659 mov r1, fp +10003548: 9303 str r3, [sp, #12] +1000354a: 980a ldr r0, [sp, #40] @ 0x28 +1000354c: 9b1e ldr r3, [sp, #120] @ 0x78 +1000354e: 9c1f ldr r4, [sp, #124] @ 0x7c +10003550: 9502 str r5, [sp, #8] +10003552: 9300 str r3, [sp, #0] +10003554: 9401 str r4, [sp, #4] +10003556: 464b mov r3, r9 +10003558: f7ff fd04 bl 10002f64 <_etoa> +1000355c: b015 add sp, #84 @ 0x54 +1000355e: bcf0 pop {r4, r5, r6, r7} +10003560: 46bb mov fp, r7 +10003562: 46b2 mov sl, r6 +10003564: 46a9 mov r9, r5 +10003566: 46a0 mov r8, r4 +10003568: bdf0 pop {r4, r5, r6, r7, pc} +1000356a: 9b22 ldr r3, [sp, #136] @ 0x88 +1000356c: 075b lsls r3, r3, #29 +1000356e: d467 bmi.n 10003640 <_ftoa+0x278> +10003570: 2203 movs r2, #3 +10003572: 4b6e ldr r3, [pc, #440] @ (1000372c <_ftoa+0x364>) +10003574: 9922 ldr r1, [sp, #136] @ 0x88 +10003576: 9201 str r2, [sp, #4] +10003578: 9103 str r1, [sp, #12] +1000357a: 9921 ldr r1, [sp, #132] @ 0x84 +1000357c: 9102 str r1, [sp, #8] +1000357e: 9300 str r3, [sp, #0] +10003580: 4642 mov r2, r8 +10003582: 464b mov r3, r9 +10003584: 4659 mov r1, fp +10003586: 980a ldr r0, [sp, #40] @ 0x28 +10003588: f7ff fb5e bl 10002c48 <_out_rev> +1000358c: e7e6 b.n 1000355c <_ftoa+0x194> +1000358e: aa06 add r2, sp, #24 +10003590: 4694 mov ip, r2 +10003592: 2317 movs r3, #23 +10003594: 0028 movs r0, r5 +10003596: 4463 add r3, ip +10003598: 210a movs r1, #10 +1000359a: 3401 adds r4, #1 +1000359c: 191e adds r6, r3, r4 +1000359e: f000 ff39 bl 10004414 <__wrap___aeabi_idiv> +100035a2: 3130 adds r1, #48 @ 0x30 +100035a4: 0028 movs r0, r5 +100035a6: 7031 strb r1, [r6, #0] +100035a8: 210a movs r1, #10 +100035aa: f000 ff33 bl 10004414 <__wrap___aeabi_idiv> +100035ae: 1e05 subs r5, r0, #0 +100035b0: d076 beq.n 100036a0 <_ftoa+0x2d8> +100035b2: 2c20 cmp r4, #32 +100035b4: d1eb bne.n 1000358e <_ftoa+0x1c6> +100035b6: 2303 movs r3, #3 +100035b8: 9a22 ldr r2, [sp, #136] @ 0x88 +100035ba: 4013 ands r3, r2 +100035bc: 2b01 cmp r3, #1 +100035be: d11d bne.n 100035fc <_ftoa+0x234> +100035c0: 9b21 ldr r3, [sp, #132] @ 0x84 +100035c2: 2b00 cmp r3, #0 +100035c4: d01a beq.n 100035fc <_ftoa+0x234> +100035c6: 9b0b ldr r3, [sp, #44] @ 0x2c +100035c8: 2b00 cmp r3, #0 +100035ca: d000 beq.n 100035ce <_ftoa+0x206> +100035cc: e0bb b.n 10003746 <_ftoa+0x37e> +100035ce: 9a22 ldr r2, [sp, #136] @ 0x88 +100035d0: 330c adds r3, #12 +100035d2: 4213 tst r3, r2 +100035d4: d000 beq.n 100035d8 <_ftoa+0x210> +100035d6: e0b6 b.n 10003746 <_ftoa+0x37e> +100035d8: 9b21 ldr r3, [sp, #132] @ 0x84 +100035da: 42a3 cmp r3, r4 +100035dc: d800 bhi.n 100035e0 <_ftoa+0x218> +100035de: e087 b.n 100036f0 <_ftoa+0x328> +100035e0: ab06 add r3, sp, #24 +100035e2: 469c mov ip, r3 +100035e4: 2217 movs r2, #23 +100035e6: 2330 movs r3, #48 @ 0x30 +100035e8: 4462 add r2, ip +100035ea: e004 b.n 100035f6 <_ftoa+0x22e> +100035ec: 9921 ldr r1, [sp, #132] @ 0x84 +100035ee: 3401 adds r4, #1 +100035f0: 5513 strb r3, [r2, r4] +100035f2: 428c cmp r4, r1 +100035f4: d059 beq.n 100036aa <_ftoa+0x2e2> +100035f6: 2c20 cmp r4, #32 +100035f8: d1f8 bne.n 100035ec <_ftoa+0x224> +100035fa: 2420 movs r4, #32 +100035fc: 9b22 ldr r3, [sp, #136] @ 0x88 +100035fe: 9401 str r4, [sp, #4] +10003600: 9303 str r3, [sp, #12] +10003602: 9b21 ldr r3, [sp, #132] @ 0x84 +10003604: 9302 str r3, [sp, #8] +10003606: 4653 mov r3, sl +10003608: e7b9 b.n 1000357e <_ftoa+0x1b6> +1000360a: aa06 add r2, sp, #24 +1000360c: 4694 mov ip, r2 +1000360e: 2317 movs r3, #23 +10003610: 210a movs r1, #10 +10003612: 4463 add r3, ip +10003614: 0030 movs r0, r6 +10003616: 3401 adds r4, #1 +10003618: 191d adds r5, r3, r4 +1000361a: f000 ff23 bl 10004464 <__wrap___aeabi_uidiv> +1000361e: 3130 adds r1, #48 @ 0x30 +10003620: 7029 strb r1, [r5, #0] +10003622: 0030 movs r0, r6 +10003624: 210a movs r1, #10 +10003626: 3f01 subs r7, #1 +10003628: f000 ff1c bl 10004464 <__wrap___aeabi_uidiv> +1000362c: 2e09 cmp r6, #9 +1000362e: d946 bls.n 100036be <_ftoa+0x2f6> +10003630: 0006 movs r6, r0 +10003632: 2c20 cmp r4, #32 +10003634: d1e9 bne.n 1000360a <_ftoa+0x242> +10003636: 4655 mov r5, sl +10003638: ab0c add r3, sp, #48 @ 0x30 +1000363a: 2420 movs r4, #32 +1000363c: 469a mov sl, r3 +1000363e: e7b8 b.n 100035b2 <_ftoa+0x1ea> +10003640: 2204 movs r2, #4 +10003642: 4b3b ldr r3, [pc, #236] @ (10003730 <_ftoa+0x368>) +10003644: e796 b.n 10003574 <_ftoa+0x1ac> +10003646: 9a1e ldr r2, [sp, #120] @ 0x78 +10003648: 9b1f ldr r3, [sp, #124] @ 0x7c +1000364a: 2000 movs r0, #0 +1000364c: 2100 movs r1, #0 +1000364e: f001 f944 bl 100048da <__wrap___aeabi_dsub> +10003652: 2301 movs r3, #1 +10003654: 930b str r3, [sp, #44] @ 0x2c +10003656: 2380 movs r3, #128 @ 0x80 +10003658: 9c22 ldr r4, [sp, #136] @ 0x88 +1000365a: 9a22 ldr r2, [sp, #136] @ 0x88 +1000365c: 00db lsls r3, r3, #3 +1000365e: 901e str r0, [sp, #120] @ 0x78 +10003660: 911f str r1, [sp, #124] @ 0x7c +10003662: 401c ands r4, r3 +10003664: 421a tst r2, r3 +10003666: d000 beq.n 1000366a <_ftoa+0x2a2> +10003668: e6fc b.n 10003464 <_ftoa+0x9c> +1000366a: 2200 movs r2, #0 +1000366c: 4b31 ldr r3, [pc, #196] @ (10003734 <_ftoa+0x36c>) +1000366e: 2706 movs r7, #6 +10003670: 9206 str r2, [sp, #24] +10003672: 9307 str r3, [sp, #28] +10003674: e70d b.n 10003492 <_ftoa+0xca> +10003676: 9b22 ldr r3, [sp, #136] @ 0x88 +10003678: 9303 str r3, [sp, #12] +1000367a: 9b21 ldr r3, [sp, #132] @ 0x84 +1000367c: 9302 str r3, [sp, #8] +1000367e: 2304 movs r3, #4 +10003680: 9301 str r3, [sp, #4] +10003682: 4b2d ldr r3, [pc, #180] @ (10003738 <_ftoa+0x370>) +10003684: e77b b.n 1000357e <_ftoa+0x1b6> +10003686: 2200 movs r2, #0 +10003688: 9808 ldr r0, [sp, #32] +1000368a: 9909 ldr r1, [sp, #36] @ 0x24 +1000368c: 4b26 ldr r3, [pc, #152] @ (10003728 <_ftoa+0x360>) +1000368e: f001 f997 bl 100049c0 <__wrap___aeabi_dcmplt> +10003692: 2800 cmp r0, #0 +10003694: d000 beq.n 10003698 <_ftoa+0x2d0> +10003696: e72f b.n 100034f8 <_ftoa+0x130> +10003698: 2e00 cmp r6, #0 +1000369a: d14f bne.n 1000373c <_ftoa+0x374> +1000369c: 3601 adds r6, #1 +1000369e: e72b b.n 100034f8 <_ftoa+0x130> +100036a0: 2303 movs r3, #3 +100036a2: 9a22 ldr r2, [sp, #136] @ 0x88 +100036a4: 4013 ands r3, r2 +100036a6: 2b01 cmp r3, #1 +100036a8: d066 beq.n 10003778 <_ftoa+0x3b0> +100036aa: 2c20 cmp r4, #32 +100036ac: d0a6 beq.n 100035fc <_ftoa+0x234> +100036ae: 9b0b ldr r3, [sp, #44] @ 0x2c +100036b0: 2b00 cmp r3, #0 +100036b2: d01f beq.n 100036f4 <_ftoa+0x32c> +100036b4: 232d movs r3, #45 @ 0x2d +100036b6: 4652 mov r2, sl +100036b8: 5513 strb r3, [r2, r4] +100036ba: 3401 adds r4, #1 +100036bc: e79e b.n 100035fc <_ftoa+0x234> +100036be: 4655 mov r5, sl +100036c0: 2c20 cmp r4, #32 +100036c2: d0b9 beq.n 10003638 <_ftoa+0x270> +100036c4: 2330 movs r3, #48 @ 0x30 +100036c6: 193a adds r2, r7, r4 +100036c8: 2f00 cmp r7, #0 +100036ca: d008 beq.n 100036de <_ftoa+0x316> +100036cc: 2017 movs r0, #23 +100036ce: a906 add r1, sp, #24 +100036d0: 3401 adds r4, #1 +100036d2: 1809 adds r1, r1, r0 +100036d4: 550b strb r3, [r1, r4] +100036d6: 2c20 cmp r4, #32 +100036d8: d0ae beq.n 10003638 <_ftoa+0x270> +100036da: 4294 cmp r4, r2 +100036dc: d1f6 bne.n 100036cc <_ftoa+0x304> +100036de: ab0c add r3, sp, #48 @ 0x30 +100036e0: 469a mov sl, r3 +100036e2: 232e movs r3, #46 @ 0x2e +100036e4: 4652 mov r2, sl +100036e6: 5513 strb r3, [r2, r4] +100036e8: 3401 adds r4, #1 +100036ea: e762 b.n 100035b2 <_ftoa+0x1ea> +100036ec: 2420 movs r4, #32 +100036ee: e6cc b.n 1000348a <_ftoa+0xc2> +100036f0: 2c20 cmp r4, #32 +100036f2: d083 beq.n 100035fc <_ftoa+0x234> +100036f4: 9b22 ldr r3, [sp, #136] @ 0x88 +100036f6: 075b lsls r3, r3, #29 +100036f8: d408 bmi.n 1000370c <_ftoa+0x344> +100036fa: 9b22 ldr r3, [sp, #136] @ 0x88 +100036fc: 071b lsls r3, r3, #28 +100036fe: d400 bmi.n 10003702 <_ftoa+0x33a> +10003700: e77c b.n 100035fc <_ftoa+0x234> +10003702: 2320 movs r3, #32 +10003704: 4652 mov r2, sl +10003706: 5513 strb r3, [r2, r4] +10003708: 3401 adds r4, #1 +1000370a: e777 b.n 100035fc <_ftoa+0x234> +1000370c: 232b movs r3, #43 @ 0x2b +1000370e: 4652 mov r2, sl +10003710: 5513 strb r3, [r2, r4] +10003712: 3401 adds r4, #1 +10003714: e772 b.n 100035fc <_ftoa+0x234> +10003716: 46c0 nop @ (mov r8, r8) +10003718: ffefffff .word 0xffefffff +1000371c: 7fefffff .word 0x7fefffff +10003720: 41cdcd65 .word 0x41cdcd65 +10003724: c1cdcd65 .word 0xc1cdcd65 +10003728: 3fe00000 .word 0x3fe00000 +1000372c: 10007d1c .word 0x10007d1c +10003730: 10007d14 .word 0x10007d14 +10003734: 412e8480 .word 0x412e8480 +10003738: 10007d24 .word 0x10007d24 +1000373c: 07f3 lsls r3, r6, #31 +1000373e: d400 bmi.n 10003742 <_ftoa+0x37a> +10003740: e6da b.n 100034f8 <_ftoa+0x130> +10003742: 3601 adds r6, #1 +10003744: e6d8 b.n 100034f8 <_ftoa+0x130> +10003746: 9b21 ldr r3, [sp, #132] @ 0x84 +10003748: 3b01 subs r3, #1 +1000374a: 9321 str r3, [sp, #132] @ 0x84 +1000374c: 42a3 cmp r3, r4 +1000374e: d900 bls.n 10003752 <_ftoa+0x38a> +10003750: e746 b.n 100035e0 <_ftoa+0x218> +10003752: e7aa b.n 100036aa <_ftoa+0x2e2> +10003754: 9b22 ldr r3, [sp, #136] @ 0x88 +10003756: 9303 str r3, [sp, #12] +10003758: 9b21 ldr r3, [sp, #132] @ 0x84 +1000375a: 9302 str r3, [sp, #8] +1000375c: 2303 movs r3, #3 +1000375e: 9301 str r3, [sp, #4] +10003760: 4b07 ldr r3, [pc, #28] @ (10003780 <_ftoa+0x3b8>) +10003762: e70c b.n 1000357e <_ftoa+0x1b6> +10003764: 4b07 ldr r3, [pc, #28] @ (10003784 <_ftoa+0x3bc>) +10003766: 00ea lsls r2, r5, #3 +10003768: 189b adds r3, r3, r2 +1000376a: 685c ldr r4, [r3, #4] +1000376c: 681b ldr r3, [r3, #0] +1000376e: 002f movs r7, r5 +10003770: 9306 str r3, [sp, #24] +10003772: 9407 str r4, [sp, #28] +10003774: 2400 movs r4, #0 +10003776: e68c b.n 10003492 <_ftoa+0xca> +10003778: 9b21 ldr r3, [sp, #132] @ 0x84 +1000377a: 2b00 cmp r3, #0 +1000377c: d095 beq.n 100036aa <_ftoa+0x2e2> +1000377e: e722 b.n 100035c6 <_ftoa+0x1fe> +10003780: 10007d20 .word 0x10007d20 +10003784: 10007fd8 .word 0x10007fd8 + +10003788 <_vsnprintf>: +10003788: b5f0 push {r4, r5, r6, r7, lr} +1000378a: 4657 mov r7, sl +1000378c: 46de mov lr, fp +1000378e: 464e mov r6, r9 +10003790: 4645 mov r5, r8 +10003792: b5e0 push {r5, r6, r7, lr} +10003794: b0a5 sub sp, #148 @ 0x94 +10003796: 001f movs r7, r3 +10003798: 9b2e ldr r3, [sp, #184] @ 0xb8 +1000379a: 4691 mov r9, r2 +1000379c: 930d str r3, [sp, #52] @ 0x34 +1000379e: 4aca ldr r2, [pc, #808] @ (10003ac8 <_vsnprintf+0x340>) +100037a0: 4bca ldr r3, [pc, #808] @ (10003acc <_vsnprintf+0x344>) +100037a2: 4682 mov sl, r0 +100037a4: 468b mov fp, r1 +100037a6: 601a str r2, [r3, #0] +100037a8: 2900 cmp r1, #0 +100037aa: d100 bne.n 100037ae <_vsnprintf+0x26> +100037ac: e229 b.n 10003c02 <_vsnprintf+0x47a> +100037ae: 2300 movs r3, #0 +100037b0: 7838 ldrb r0, [r7, #0] +100037b2: 4698 mov r8, r3 +100037b4: 2800 cmp r0, #0 +100037b6: d100 bne.n 100037ba <_vsnprintf+0x32> +100037b8: e22b b.n 10003c12 <_vsnprintf+0x48a> +100037ba: 4bc5 ldr r3, [pc, #788] @ (10003ad0 <_vsnprintf+0x348>) +100037bc: 4644 mov r4, r8 +100037be: 930c str r3, [sp, #48] @ 0x30 +100037c0: 4bc4 ldr r3, [pc, #784] @ (10003ad4 <_vsnprintf+0x34c>) +100037c2: 4655 mov r5, sl +100037c4: 464e mov r6, r9 +100037c6: 930e str r3, [sp, #56] @ 0x38 +100037c8: e00a b.n 100037e0 <_vsnprintf+0x58> +100037ca: 1c63 adds r3, r4, #1 +100037cc: 4698 mov r8, r3 +100037ce: 0022 movs r2, r4 +100037d0: 0033 movs r3, r6 +100037d2: 4659 mov r1, fp +100037d4: 47a8 blx r5 +100037d6: 4644 mov r4, r8 +100037d8: 7838 ldrb r0, [r7, #0] +100037da: 2800 cmp r0, #0 +100037dc: d100 bne.n 100037e0 <_vsnprintf+0x58> +100037de: e087 b.n 100038f0 <_vsnprintf+0x168> +100037e0: 3701 adds r7, #1 +100037e2: 2825 cmp r0, #37 @ 0x25 +100037e4: d1f1 bne.n 100037ca <_vsnprintf+0x42> +100037e6: 2308 movs r3, #8 +100037e8: 469a mov sl, r3 +100037ea: 3b04 subs r3, #4 +100037ec: 4699 mov r9, r3 +100037ee: 3b02 subs r3, #2 +100037f0: 4698 mov r8, r3 +100037f2: 3b01 subs r3, #1 +100037f4: 2200 movs r2, #0 +100037f6: 469c mov ip, r3 +100037f8: 940b str r4, [sp, #44] @ 0x2c +100037fa: 7838 ldrb r0, [r7, #0] +100037fc: 1c79 adds r1, r7, #1 +100037fe: 0003 movs r3, r0 +10003800: 3b20 subs r3, #32 +10003802: b2db uxtb r3, r3 +10003804: 2b10 cmp r3, #16 +10003806: d803 bhi.n 10003810 <_vsnprintf+0x88> +10003808: 9c0c ldr r4, [sp, #48] @ 0x30 +1000380a: 009b lsls r3, r3, #2 +1000380c: 58e3 ldr r3, [r4, r3] +1000380e: 469f mov pc, r3 +10003810: 0003 movs r3, r0 +10003812: 3b30 subs r3, #48 @ 0x30 +10003814: 9c0b ldr r4, [sp, #44] @ 0x2c +10003816: 920b str r2, [sp, #44] @ 0x2c +10003818: 2b09 cmp r3, #9 +1000381a: d93a bls.n 10003892 <_vsnprintf+0x10a> +1000381c: 2300 movs r3, #0 +1000381e: 4698 mov r8, r3 +10003820: 282a cmp r0, #42 @ 0x2a +10003822: d100 bne.n 10003826 <_vsnprintf+0x9e> +10003824: e0dd b.n 100039e2 <_vsnprintf+0x25a> +10003826: 2300 movs r3, #0 +10003828: 469a mov sl, r3 +1000382a: 282e cmp r0, #46 @ 0x2e +1000382c: d04b beq.n 100038c6 <_vsnprintf+0x13e> +1000382e: 0003 movs r3, r0 +10003830: 3b68 subs r3, #104 @ 0x68 +10003832: b2db uxtb r3, r3 +10003834: 2b12 cmp r3, #18 +10003836: d81e bhi.n 10003876 <_vsnprintf+0xee> +10003838: 9a0e ldr r2, [sp, #56] @ 0x38 +1000383a: 009b lsls r3, r3, #2 +1000383c: 58d3 ldr r3, [r2, r3] +1000383e: 469f mov pc, r3 +10003840: 4663 mov r3, ip +10003842: 000f movs r7, r1 +10003844: 431a orrs r2, r3 +10003846: e7d8 b.n 100037fa <_vsnprintf+0x72> +10003848: 4643 mov r3, r8 +1000384a: 000f movs r7, r1 +1000384c: 431a orrs r2, r3 +1000384e: e7d4 b.n 100037fa <_vsnprintf+0x72> +10003850: 464b mov r3, r9 +10003852: 000f movs r7, r1 +10003854: 431a orrs r2, r3 +10003856: e7d0 b.n 100037fa <_vsnprintf+0x72> +10003858: 2310 movs r3, #16 +1000385a: 000f movs r7, r1 +1000385c: 431a orrs r2, r3 +1000385e: e7cc b.n 100037fa <_vsnprintf+0x72> +10003860: 4653 mov r3, sl +10003862: 000f movs r7, r1 +10003864: 431a orrs r2, r3 +10003866: e7c8 b.n 100037fa <_vsnprintf+0x72> +10003868: 2380 movs r3, #128 @ 0x80 +1000386a: 005b lsls r3, r3, #1 +1000386c: 9a0b ldr r2, [sp, #44] @ 0x2c +1000386e: 7878 ldrb r0, [r7, #1] +10003870: 431a orrs r2, r3 +10003872: 920b str r2, [sp, #44] @ 0x2c +10003874: 3101 adds r1, #1 +10003876: 000f movs r7, r1 +10003878: 2867 cmp r0, #103 @ 0x67 +1000387a: d84f bhi.n 1000391c <_vsnprintf+0x194> +1000387c: 2824 cmp r0, #36 @ 0x24 +1000387e: d9a4 bls.n 100037ca <_vsnprintf+0x42> +10003880: 0003 movs r3, r0 +10003882: 3b25 subs r3, #37 @ 0x25 +10003884: b2db uxtb r3, r3 +10003886: 2b42 cmp r3, #66 @ 0x42 +10003888: d89f bhi.n 100037ca <_vsnprintf+0x42> +1000388a: 4993 ldr r1, [pc, #588] @ (10003ad8 <_vsnprintf+0x350>) +1000388c: 009b lsls r3, r3, #2 +1000388e: 58cb ldr r3, [r1, r3] +10003890: 469f mov pc, r3 +10003892: 2300 movs r3, #0 +10003894: 4698 mov r8, r3 +10003896: 9b0b ldr r3, [sp, #44] @ 0x2c +10003898: 4647 mov r7, r8 +1000389a: 469c mov ip, r3 +1000389c: e000 b.n 100038a0 <_vsnprintf+0x118> +1000389e: 3101 adds r1, #1 +100038a0: 00bb lsls r3, r7, #2 +100038a2: 19db adds r3, r3, r7 +100038a4: 005b lsls r3, r3, #1 +100038a6: 181f adds r7, r3, r0 +100038a8: 7808 ldrb r0, [r1, #0] +100038aa: 3f30 subs r7, #48 @ 0x30 +100038ac: 0003 movs r3, r0 +100038ae: 3b30 subs r3, #48 @ 0x30 +100038b0: 2b09 cmp r3, #9 +100038b2: d9f4 bls.n 1000389e <_vsnprintf+0x116> +100038b4: 4663 mov r3, ip +100038b6: 930b str r3, [sp, #44] @ 0x2c +100038b8: 2300 movs r3, #0 +100038ba: 46b8 mov r8, r7 +100038bc: 469a mov sl, r3 +100038be: 000f movs r7, r1 +100038c0: 3101 adds r1, #1 +100038c2: 282e cmp r0, #46 @ 0x2e +100038c4: d1b3 bne.n 1000382e <_vsnprintf+0xa6> +100038c6: 2080 movs r0, #128 @ 0x80 +100038c8: 9a0b ldr r2, [sp, #44] @ 0x2c +100038ca: 00c0 lsls r0, r0, #3 +100038cc: 4302 orrs r2, r0 +100038ce: 920b str r2, [sp, #44] @ 0x2c +100038d0: 2230 movs r2, #48 @ 0x30 +100038d2: 4252 negs r2, r2 +100038d4: 4694 mov ip, r2 +100038d6: 7878 ldrb r0, [r7, #1] +100038d8: 000b movs r3, r1 +100038da: 4484 add ip, r0 +100038dc: 4662 mov r2, ip +100038de: 2a09 cmp r2, #9 +100038e0: d800 bhi.n 100038e4 <_vsnprintf+0x15c> +100038e2: e1aa b.n 10003c3a <_vsnprintf+0x4b2> +100038e4: 282a cmp r0, #42 @ 0x2a +100038e6: d100 bne.n 100038ea <_vsnprintf+0x162> +100038e8: e1b9 b.n 10003c5e <_vsnprintf+0x4d6> +100038ea: 000f movs r7, r1 +100038ec: 3101 adds r1, #1 +100038ee: e79e b.n 1000382e <_vsnprintf+0xa6> +100038f0: 46a0 mov r8, r4 +100038f2: 46aa mov sl, r5 +100038f4: 46b1 mov r9, r6 +100038f6: 45c8 cmp r8, r9 +100038f8: d303 bcc.n 10003902 <_vsnprintf+0x17a> +100038fa: 2301 movs r3, #1 +100038fc: 425b negs r3, r3 +100038fe: 444b add r3, r9 +10003900: 4698 mov r8, r3 +10003902: 464b mov r3, r9 +10003904: 4642 mov r2, r8 +10003906: 4659 mov r1, fp +10003908: 2000 movs r0, #0 +1000390a: 47d0 blx sl +1000390c: 0020 movs r0, r4 +1000390e: b025 add sp, #148 @ 0x94 +10003910: bcf0 pop {r4, r5, r6, r7} +10003912: 46bb mov fp, r7 +10003914: 46b2 mov sl, r6 +10003916: 46a9 mov r9, r5 +10003918: 46a0 mov r8, r4 +1000391a: bdf0 pop {r4, r5, r6, r7, pc} +1000391c: 0001 movs r1, r0 +1000391e: 3969 subs r1, #105 @ 0x69 +10003920: b2c9 uxtb r1, r1 +10003922: 290f cmp r1, #15 +10003924: d900 bls.n 10003928 <_vsnprintf+0x1a0> +10003926: e750 b.n 100037ca <_vsnprintf+0x42> +10003928: 2301 movs r3, #1 +1000392a: 408b lsls r3, r1 +1000392c: 469c mov ip, r3 +1000392e: 4b6b ldr r3, [pc, #428] @ (10003adc <_vsnprintf+0x354>) +10003930: 4699 mov r9, r3 +10003932: 4663 mov r3, ip +10003934: 464a mov r2, r9 +10003936: 4013 ands r3, r2 +10003938: 930f str r3, [sp, #60] @ 0x3c +1000393a: 4662 mov r2, ip +1000393c: 464b mov r3, r9 +1000393e: 421a tst r2, r3 +10003940: d000 beq.n 10003944 <_vsnprintf+0x1bc> +10003942: e168 b.n 10003c16 <_vsnprintf+0x48e> +10003944: 290a cmp r1, #10 +10003946: d056 beq.n 100039f6 <_vsnprintf+0x26e> +10003948: 2907 cmp r1, #7 +1000394a: d000 beq.n 1000394e <_vsnprintf+0x1c6> +1000394c: e73d b.n 100037ca <_vsnprintf+0x42> +1000394e: 9b0d ldr r3, [sp, #52] @ 0x34 +10003950: cb02 ldmia r3!, {r1} +10003952: 4698 mov r8, r3 +10003954: 2900 cmp r1, #0 +10003956: d000 beq.n 1000395a <_vsnprintf+0x1d2> +10003958: e192 b.n 10003c80 <_vsnprintf+0x4f8> +1000395a: 9b0b ldr r3, [sp, #44] @ 0x2c +1000395c: 2110 movs r1, #16 +1000395e: 001a movs r2, r3 +10003960: 438a bics r2, r1 +10003962: 0010 movs r0, r2 +10003964: 3111 adds r1, #17 +10003966: 4308 orrs r0, r1 +10003968: 4681 mov r9, r0 +1000396a: 2080 movs r0, #128 @ 0x80 +1000396c: 001a movs r2, r3 +1000396e: 00c0 lsls r0, r0, #3 +10003970: 4002 ands r2, r0 +10003972: 0011 movs r1, r2 +10003974: 4203 tst r3, r0 +10003976: d11c bne.n 100039b2 <_vsnprintf+0x22a> +10003978: ab14 add r3, sp, #80 @ 0x50 +1000397a: 469c mov ip, r3 +1000397c: 221f movs r2, #31 +1000397e: 230f movs r3, #15 +10003980: 4462 add r2, ip +10003982: 950d str r5, [sp, #52] @ 0x34 +10003984: 469c mov ip, r3 +10003986: 0015 movs r5, r2 +10003988: 9b0f ldr r3, [sp, #60] @ 0x3c +1000398a: 940b str r4, [sp, #44] @ 0x2c +1000398c: e002 b.n 10003994 <_vsnprintf+0x20c> +1000398e: 2b20 cmp r3, #32 +10003990: d00c beq.n 100039ac <_vsnprintf+0x224> +10003992: 0011 movs r1, r2 +10003994: 4664 mov r4, ip +10003996: 400c ands r4, r1 +10003998: 0020 movs r0, r4 +1000399a: 3037 adds r0, #55 @ 0x37 +1000399c: 2c09 cmp r4, #9 +1000399e: d800 bhi.n 100039a2 <_vsnprintf+0x21a> +100039a0: 3807 subs r0, #7 +100039a2: 3301 adds r3, #1 +100039a4: 54e8 strb r0, [r5, r3] +100039a6: 090a lsrs r2, r1, #4 +100039a8: 290f cmp r1, #15 +100039aa: d8f0 bhi.n 1000398e <_vsnprintf+0x206> +100039ac: 9c0b ldr r4, [sp, #44] @ 0x2c +100039ae: 9d0d ldr r5, [sp, #52] @ 0x34 +100039b0: 930f str r3, [sp, #60] @ 0x3c +100039b2: 464b mov r3, r9 +100039b4: 2208 movs r2, #8 +100039b6: 9306 str r3, [sp, #24] +100039b8: 4653 mov r3, sl +100039ba: 9205 str r2, [sp, #20] +100039bc: 3208 adds r2, #8 +100039be: 9203 str r2, [sp, #12] +100039c0: 2200 movs r2, #0 +100039c2: 9304 str r3, [sp, #16] +100039c4: 9b0f ldr r3, [sp, #60] @ 0x3c +100039c6: 9202 str r2, [sp, #8] +100039c8: 9301 str r3, [sp, #4] +100039ca: ab1c add r3, sp, #112 @ 0x70 +100039cc: 0022 movs r2, r4 +100039ce: 9300 str r3, [sp, #0] +100039d0: 4659 mov r1, fp +100039d2: 0033 movs r3, r6 +100039d4: 0028 movs r0, r5 +100039d6: f7ff f98d bl 10002cf4 <_ntoa_format> +100039da: 4643 mov r3, r8 +100039dc: 0004 movs r4, r0 +100039de: 930d str r3, [sp, #52] @ 0x34 +100039e0: e6fa b.n 100037d8 <_vsnprintf+0x50> +100039e2: 9b0d ldr r3, [sp, #52] @ 0x34 +100039e4: cb04 ldmia r3!, {r2} +100039e6: 4690 mov r8, r2 +100039e8: 2a00 cmp r2, #0 +100039ea: db79 blt.n 10003ae0 <_vsnprintf+0x358> +100039ec: 7878 ldrb r0, [r7, #1] +100039ee: 930d str r3, [sp, #52] @ 0x34 +100039f0: 000f movs r7, r1 +100039f2: 3101 adds r1, #1 +100039f4: e717 b.n 10003826 <_vsnprintf+0x9e> +100039f6: 9b0d ldr r3, [sp, #52] @ 0x34 +100039f8: cb02 ldmia r3!, {r1} +100039fa: 9314 str r3, [sp, #80] @ 0x50 +100039fc: 780b ldrb r3, [r1, #0] +100039fe: 469c mov ip, r3 +10003a00: 0018 movs r0, r3 +10003a02: 4653 mov r3, sl +10003a04: 2b00 cmp r3, #0 +10003a06: d100 bne.n 10003a0a <_vsnprintf+0x282> +10003a08: e134 b.n 10003c74 <_vsnprintf+0x4ec> +10003a0a: 2800 cmp r0, #0 +10003a0c: d015 beq.n 10003a3a <_vsnprintf+0x2b2> +10003a0e: 4653 mov r3, sl +10003a10: 3b01 subs r3, #1 +10003a12: 3301 adds r3, #1 +10003a14: 4699 mov r9, r3 +10003a16: 940d str r4, [sp, #52] @ 0x34 +10003a18: 9c0b ldr r4, [sp, #44] @ 0x2c +10003a1a: 4489 add r9, r1 +10003a1c: 464a mov r2, r9 +10003a1e: 000b movs r3, r1 +10003a20: 46a1 mov r9, r4 +10003a22: e001 b.n 10003a28 <_vsnprintf+0x2a0> +10003a24: 4293 cmp r3, r2 +10003a26: d003 beq.n 10003a30 <_vsnprintf+0x2a8> +10003a28: 785c ldrb r4, [r3, #1] +10003a2a: 3301 adds r3, #1 +10003a2c: 2c00 cmp r4, #0 +10003a2e: d1f9 bne.n 10003a24 <_vsnprintf+0x29c> +10003a30: 464a mov r2, r9 +10003a32: 1a5b subs r3, r3, r1 +10003a34: 9c0d ldr r4, [sp, #52] @ 0x34 +10003a36: 920b str r2, [sp, #44] @ 0x2c +10003a38: 930f str r3, [sp, #60] @ 0x3c +10003a3a: 2380 movs r3, #128 @ 0x80 +10003a3c: 00db lsls r3, r3, #3 +10003a3e: 4699 mov r9, r3 +10003a40: 9a0b ldr r2, [sp, #44] @ 0x2c +10003a42: 4013 ands r3, r2 +10003a44: 930d str r3, [sp, #52] @ 0x34 +10003a46: 464b mov r3, r9 +10003a48: 421a tst r2, r3 +10003a4a: d004 beq.n 10003a56 <_vsnprintf+0x2ce> +10003a4c: 9b0f ldr r3, [sp, #60] @ 0x3c +10003a4e: 4553 cmp r3, sl +10003a50: d901 bls.n 10003a56 <_vsnprintf+0x2ce> +10003a52: 4653 mov r3, sl +10003a54: 930f str r3, [sp, #60] @ 0x3c +10003a56: 2302 movs r3, #2 +10003a58: 4699 mov r9, r3 +10003a5a: 9a0b ldr r2, [sp, #44] @ 0x2c +10003a5c: 4013 ands r3, r2 +10003a5e: 930b str r3, [sp, #44] @ 0x2c +10003a60: 464b mov r3, r9 +10003a62: 4213 tst r3, r2 +10003a64: d100 bne.n 10003a68 <_vsnprintf+0x2e0> +10003a66: e1f5 b.n 10003e54 <_vsnprintf+0x6cc> +10003a68: 4663 mov r3, ip +10003a6a: 2b00 cmp r3, #0 +10003a6c: d100 bne.n 10003a70 <_vsnprintf+0x2e8> +10003a6e: e1d6 b.n 10003e1e <_vsnprintf+0x696> +10003a70: 9b0d ldr r3, [sp, #52] @ 0x34 +10003a72: 2b00 cmp r3, #0 +10003a74: d100 bne.n 10003a78 <_vsnprintf+0x2f0> +10003a76: e182 b.n 10003d7e <_vsnprintf+0x5f6> +10003a78: 1b0b subs r3, r1, r4 +10003a7a: 46d1 mov r9, sl +10003a7c: 0031 movs r1, r6 +10003a7e: 469a mov sl, r3 +10003a80: 003b movs r3, r7 +10003a82: 44a1 add r9, r4 +10003a84: 002e movs r6, r5 +10003a86: 465f mov r7, fp +10003a88: 464d mov r5, r9 +10003a8a: 0022 movs r2, r4 +10003a8c: 469b mov fp, r3 +10003a8e: 4689 mov r9, r1 +10003a90: e009 b.n 10003aa6 <_vsnprintf+0x31e> +10003a92: 464b mov r3, r9 +10003a94: 0039 movs r1, r7 +10003a96: 1c54 adds r4, r2, #1 +10003a98: 47b0 blx r6 +10003a9a: 4653 mov r3, sl +10003a9c: 5d18 ldrb r0, [r3, r4] +10003a9e: 2800 cmp r0, #0 +10003aa0: d100 bne.n 10003aa4 <_vsnprintf+0x31c> +10003aa2: e192 b.n 10003dca <_vsnprintf+0x642> +10003aa4: 0022 movs r2, r4 +10003aa6: 4295 cmp r5, r2 +10003aa8: d1f3 bne.n 10003a92 <_vsnprintf+0x30a> +10003aaa: 464b mov r3, r9 +10003aac: 465a mov r2, fp +10003aae: 46a9 mov r9, r5 +10003ab0: 46bb mov fp, r7 +10003ab2: 0035 movs r5, r6 +10003ab4: 0017 movs r7, r2 +10003ab6: 001e movs r6, r3 +10003ab8: 464c mov r4, r9 +10003aba: 9b0b ldr r3, [sp, #44] @ 0x2c +10003abc: 2b00 cmp r3, #0 +10003abe: d000 beq.n 10003ac2 <_vsnprintf+0x33a> +10003ac0: e1ad b.n 10003e1e <_vsnprintf+0x696> +10003ac2: 9b14 ldr r3, [sp, #80] @ 0x50 +10003ac4: 930d str r3, [sp, #52] @ 0x34 +10003ac6: e687 b.n 100037d8 <_vsnprintf+0x50> +10003ac8: 10003789 .word 0x10003789 +10003acc: 20001ccc .word 0x20001ccc +10003ad0: 10007e38 .word 0x10007e38 +10003ad4: 10007e7c .word 0x10007e7c +10003ad8: 10007ec8 .word 0x10007ec8 +10003adc: 00009041 .word 0x00009041 +10003ae0: 9a0b ldr r2, [sp, #44] @ 0x2c +10003ae2: 3828 subs r0, #40 @ 0x28 +10003ae4: 4302 orrs r2, r0 +10003ae6: 920b str r2, [sp, #44] @ 0x2c +10003ae8: 4642 mov r2, r8 +10003aea: 4252 negs r2, r2 +10003aec: 7878 ldrb r0, [r7, #1] +10003aee: 4690 mov r8, r2 +10003af0: 000f movs r7, r1 +10003af2: 930d str r3, [sp, #52] @ 0x34 +10003af4: 3101 adds r1, #1 +10003af6: e696 b.n 10003826 <_vsnprintf+0x9e> +10003af8: 7878 ldrb r0, [r7, #1] +10003afa: 286c cmp r0, #108 @ 0x6c +10003afc: d100 bne.n 10003b00 <_vsnprintf+0x378> +10003afe: e15d b.n 10003dbc <_vsnprintf+0x634> +10003b00: 2380 movs r3, #128 @ 0x80 +10003b02: 9a0b ldr r2, [sp, #44] @ 0x2c +10003b04: 005b lsls r3, r3, #1 +10003b06: 431a orrs r2, r3 +10003b08: 920b str r2, [sp, #44] @ 0x2c +10003b0a: 3101 adds r1, #1 +10003b0c: e6b3 b.n 10003876 <_vsnprintf+0xee> +10003b0e: 2380 movs r3, #128 @ 0x80 +10003b10: 009b lsls r3, r3, #2 +10003b12: e6ab b.n 1000386c <_vsnprintf+0xe4> +10003b14: 7878 ldrb r0, [r7, #1] +10003b16: 2868 cmp r0, #104 @ 0x68 +10003b18: d100 bne.n 10003b1c <_vsnprintf+0x394> +10003b1a: e148 b.n 10003dae <_vsnprintf+0x626> +10003b1c: 2380 movs r3, #128 @ 0x80 +10003b1e: 9a0b ldr r2, [sp, #44] @ 0x2c +10003b20: 3101 adds r1, #1 +10003b22: 431a orrs r2, r3 +10003b24: 920b str r2, [sp, #44] @ 0x2c +10003b26: e6a6 b.n 10003876 <_vsnprintf+0xee> +10003b28: 2867 cmp r0, #103 @ 0x67 +10003b2a: d100 bne.n 10003b2e <_vsnprintf+0x3a6> +10003b2c: e0b2 b.n 10003c94 <_vsnprintf+0x50c> +10003b2e: 2847 cmp r0, #71 @ 0x47 +10003b30: d100 bne.n 10003b34 <_vsnprintf+0x3ac> +10003b32: e11a b.n 10003d6a <_vsnprintf+0x5e2> +10003b34: 2845 cmp r0, #69 @ 0x45 +10003b36: d100 bne.n 10003b3a <_vsnprintf+0x3b2> +10003b38: e11c b.n 10003d74 <_vsnprintf+0x5ec> +10003b3a: 9a0b ldr r2, [sp, #44] @ 0x2c +10003b3c: 2107 movs r1, #7 +10003b3e: 9204 str r2, [sp, #16] +10003b40: 4642 mov r2, r8 +10003b42: 9b0d ldr r3, [sp, #52] @ 0x34 +10003b44: 9203 str r2, [sp, #12] +10003b46: 3307 adds r3, #7 +10003b48: 4652 mov r2, sl +10003b4a: 438b bics r3, r1 +10003b4c: 0019 movs r1, r3 +10003b4e: 9202 str r2, [sp, #8] +10003b50: c90c ldmia r1!, {r2, r3} +10003b52: 0028 movs r0, r5 +10003b54: 9200 str r2, [sp, #0] +10003b56: 9301 str r3, [sp, #4] +10003b58: 910d str r1, [sp, #52] @ 0x34 +10003b5a: 0022 movs r2, r4 +10003b5c: 0033 movs r3, r6 +10003b5e: 4659 mov r1, fp +10003b60: f7ff fa00 bl 10002f64 <_etoa> +10003b64: 0004 movs r4, r0 +10003b66: e637 b.n 100037d8 <_vsnprintf+0x50> +10003b68: 2846 cmp r0, #70 @ 0x46 +10003b6a: d100 bne.n 10003b6e <_vsnprintf+0x3e6> +10003b6c: e08d b.n 10003c8a <_vsnprintf+0x502> +10003b6e: 9a0b ldr r2, [sp, #44] @ 0x2c +10003b70: 2107 movs r1, #7 +10003b72: 9204 str r2, [sp, #16] +10003b74: 4642 mov r2, r8 +10003b76: 9b0d ldr r3, [sp, #52] @ 0x34 +10003b78: 9203 str r2, [sp, #12] +10003b7a: 3307 adds r3, #7 +10003b7c: 4652 mov r2, sl +10003b7e: 438b bics r3, r1 +10003b80: 0019 movs r1, r3 +10003b82: 9202 str r2, [sp, #8] +10003b84: c90c ldmia r1!, {r2, r3} +10003b86: 0028 movs r0, r5 +10003b88: 9200 str r2, [sp, #0] +10003b8a: 9301 str r3, [sp, #4] +10003b8c: 910d str r1, [sp, #52] @ 0x34 +10003b8e: 0022 movs r2, r4 +10003b90: 0033 movs r3, r6 +10003b92: 4659 mov r1, fp +10003b94: f7ff fc18 bl 100033c8 <_ftoa> +10003b98: 0004 movs r4, r0 +10003b9a: e61d b.n 100037d8 <_vsnprintf+0x50> +10003b9c: 1c63 adds r3, r4, #1 +10003b9e: 4698 mov r8, r3 +10003ba0: 0022 movs r2, r4 +10003ba2: 0033 movs r3, r6 +10003ba4: 4659 mov r1, fp +10003ba6: 2025 movs r0, #37 @ 0x25 +10003ba8: 47a8 blx r5 +10003baa: 4644 mov r4, r8 +10003bac: e614 b.n 100037d8 <_vsnprintf+0x50> +10003bae: 9b0d ldr r3, [sp, #52] @ 0x34 +10003bb0: 3304 adds r3, #4 +10003bb2: 930f str r3, [sp, #60] @ 0x3c +10003bb4: 1c63 adds r3, r4, #1 +10003bb6: 4699 mov r9, r3 +10003bb8: 9b0b ldr r3, [sp, #44] @ 0x2c +10003bba: 079a lsls r2, r3, #30 +10003bbc: d400 bmi.n 10003bc0 <_vsnprintf+0x438> +10003bbe: e10a b.n 10003dd6 <_vsnprintf+0x64e> +10003bc0: 9b0d ldr r3, [sp, #52] @ 0x34 +10003bc2: 0022 movs r2, r4 +10003bc4: 7818 ldrb r0, [r3, #0] +10003bc6: 4659 mov r1, fp +10003bc8: 0033 movs r3, r6 +10003bca: 47a8 blx r5 +10003bcc: 4643 mov r3, r8 +10003bce: 4444 add r4, r8 +10003bd0: 2b01 cmp r3, #1 +10003bd2: d800 bhi.n 10003bd6 <_vsnprintf+0x44e> +10003bd4: e16f b.n 10003eb6 <_vsnprintf+0x72e> +10003bd6: 46b0 mov r8, r6 +10003bd8: 002e movs r6, r5 +10003bda: 0025 movs r5, r4 +10003bdc: 464c mov r4, r9 +10003bde: 46b9 mov r9, r7 +10003be0: 465f mov r7, fp +10003be2: 0022 movs r2, r4 +10003be4: 4643 mov r3, r8 +10003be6: 3401 adds r4, #1 +10003be8: 0039 movs r1, r7 +10003bea: 2020 movs r0, #32 +10003bec: 47b0 blx r6 +10003bee: 42ac cmp r4, r5 +10003bf0: d1f7 bne.n 10003be2 <_vsnprintf+0x45a> +10003bf2: 002c movs r4, r5 +10003bf4: 46bb mov fp, r7 +10003bf6: 0035 movs r5, r6 +10003bf8: 464f mov r7, r9 +10003bfa: 4646 mov r6, r8 +10003bfc: 9b0f ldr r3, [sp, #60] @ 0x3c +10003bfe: 930d str r3, [sp, #52] @ 0x34 +10003c00: e5ea b.n 100037d8 <_vsnprintf+0x50> +10003c02: 4bd6 ldr r3, [pc, #856] @ (10003f5c <_vsnprintf+0x7d4>) +10003c04: 7838 ldrb r0, [r7, #0] +10003c06: 469a mov sl, r3 +10003c08: 2300 movs r3, #0 +10003c0a: 4698 mov r8, r3 +10003c0c: 2800 cmp r0, #0 +10003c0e: d000 beq.n 10003c12 <_vsnprintf+0x48a> +10003c10: e5d3 b.n 100037ba <_vsnprintf+0x32> +10003c12: 2400 movs r4, #0 +10003c14: e66f b.n 100038f6 <_vsnprintf+0x16e> +10003c16: 286f cmp r0, #111 @ 0x6f +10003c18: d042 beq.n 10003ca0 <_vsnprintf+0x518> +10003c1a: d800 bhi.n 10003c1e <_vsnprintf+0x496> +10003c1c: e1fd b.n 1000401a <_vsnprintf+0x892> +10003c1e: 2310 movs r3, #16 +10003c20: 2878 cmp r0, #120 @ 0x78 +10003c22: d100 bne.n 10003c26 <_vsnprintf+0x49e> +10003c24: e09b b.n 10003d5e <_vsnprintf+0x5d6> +10003c26: 9a0b ldr r2, [sp, #44] @ 0x2c +10003c28: 439a bics r2, r3 +10003c2a: 920b str r2, [sp, #44] @ 0x2c +10003c2c: 230a movs r3, #10 +10003c2e: 469c mov ip, r3 +10003c30: 2300 movs r3, #0 +10003c32: 9314 str r3, [sp, #80] @ 0x50 +10003c34: 330a adds r3, #10 +10003c36: 930f str r3, [sp, #60] @ 0x3c +10003c38: e038 b.n 10003cac <_vsnprintf+0x524> +10003c3a: 4657 mov r7, sl +10003c3c: 9a0b ldr r2, [sp, #44] @ 0x2c +10003c3e: 00b9 lsls r1, r7, #2 +10003c40: 19c9 adds r1, r1, r7 +10003c42: 0049 lsls r1, r1, #1 +10003c44: 3301 adds r3, #1 +10003c46: 180f adds r7, r1, r0 +10003c48: 7818 ldrb r0, [r3, #0] +10003c4a: 3f30 subs r7, #48 @ 0x30 +10003c4c: 0001 movs r1, r0 +10003c4e: 3930 subs r1, #48 @ 0x30 +10003c50: 2909 cmp r1, #9 +10003c52: d9f4 bls.n 10003c3e <_vsnprintf+0x4b6> +10003c54: 46ba mov sl, r7 +10003c56: 920b str r2, [sp, #44] @ 0x2c +10003c58: 001f movs r7, r3 +10003c5a: 1c59 adds r1, r3, #1 +10003c5c: e5e7 b.n 1000382e <_vsnprintf+0xa6> +10003c5e: 9b0d ldr r3, [sp, #52] @ 0x34 +10003c60: 78b8 ldrb r0, [r7, #2] +10003c62: cb04 ldmia r3!, {r2} +10003c64: 3702 adds r7, #2 +10003c66: 43d1 mvns r1, r2 +10003c68: 17c9 asrs r1, r1, #31 +10003c6a: 400a ands r2, r1 +10003c6c: 4692 mov sl, r2 +10003c6e: 930d str r3, [sp, #52] @ 0x34 +10003c70: 1c79 adds r1, r7, #1 +10003c72: e5dc b.n 1000382e <_vsnprintf+0xa6> +10003c74: 2800 cmp r0, #0 +10003c76: d100 bne.n 10003c7a <_vsnprintf+0x4f2> +10003c78: e6df b.n 10003a3a <_vsnprintf+0x2b2> +10003c7a: 2302 movs r3, #2 +10003c7c: 425b negs r3, r3 +10003c7e: e6c8 b.n 10003a12 <_vsnprintf+0x28a> +10003c80: 2021 movs r0, #33 @ 0x21 +10003c82: 9a0b ldr r2, [sp, #44] @ 0x2c +10003c84: 4302 orrs r2, r0 +10003c86: 4691 mov r9, r2 +10003c88: e676 b.n 10003978 <_vsnprintf+0x1f0> +10003c8a: 2320 movs r3, #32 +10003c8c: 9a0b ldr r2, [sp, #44] @ 0x2c +10003c8e: 431a orrs r2, r3 +10003c90: 920b str r2, [sp, #44] @ 0x2c +10003c92: e76c b.n 10003b6e <_vsnprintf+0x3e6> +10003c94: 2380 movs r3, #128 @ 0x80 +10003c96: 9a0b ldr r2, [sp, #44] @ 0x2c +10003c98: 011b lsls r3, r3, #4 +10003c9a: 431a orrs r2, r3 +10003c9c: 920b str r2, [sp, #44] @ 0x2c +10003c9e: e74c b.n 10003b3a <_vsnprintf+0x3b2> +10003ca0: 2308 movs r3, #8 +10003ca2: 469c mov ip, r3 +10003ca4: 2300 movs r3, #0 +10003ca6: 9314 str r3, [sp, #80] @ 0x50 +10003ca8: 3308 adds r3, #8 +10003caa: 930f str r3, [sp, #60] @ 0x3c +10003cac: 980b ldr r0, [sp, #44] @ 0x2c +10003cae: 2380 movs r3, #128 @ 0x80 +10003cb0: 0002 movs r2, r0 +10003cb2: 00db lsls r3, r3, #3 +10003cb4: 401a ands r2, r3 +10003cb6: 0011 movs r1, r2 +10003cb8: 0002 movs r2, r0 +10003cba: 4218 tst r0, r3 +10003cbc: d000 beq.n 10003cc0 <_vsnprintf+0x538> +10003cbe: e080 b.n 10003dc2 <_vsnprintf+0x63a> +10003cc0: 230c movs r3, #12 +10003cc2: 439a bics r2, r3 +10003cc4: 0010 movs r0, r2 +10003cc6: 2380 movs r3, #128 @ 0x80 +10003cc8: 0002 movs r2, r0 +10003cca: 009b lsls r3, r3, #2 +10003ccc: 401a ands r2, r3 +10003cce: 920b str r2, [sp, #44] @ 0x2c +10003cd0: 4218 tst r0, r3 +10003cd2: d000 beq.n 10003cd6 <_vsnprintf+0x54e> +10003cd4: e0f1 b.n 10003eba <_vsnprintf+0x732> +10003cd6: 2380 movs r3, #128 @ 0x80 +10003cd8: 0002 movs r2, r0 +10003cda: 005b lsls r3, r3, #1 +10003cdc: 401a ands r2, r3 +10003cde: 4691 mov r9, r2 +10003ce0: 9a0d ldr r2, [sp, #52] @ 0x34 +10003ce2: 3204 adds r2, #4 +10003ce4: 9214 str r2, [sp, #80] @ 0x50 +10003ce6: 4218 tst r0, r3 +10003ce8: d000 beq.n 10003cec <_vsnprintf+0x564> +10003cea: e2c3 b.n 10004274 <_vsnprintf+0xaec> +10003cec: 0643 lsls r3, r0, #25 +10003cee: d500 bpl.n 10003cf2 <_vsnprintf+0x56a> +10003cf0: e0d7 b.n 10003ea2 <_vsnprintf+0x71a> +10003cf2: 0603 lsls r3, r0, #24 +10003cf4: d400 bmi.n 10003cf8 <_vsnprintf+0x570> +10003cf6: e321 b.n 1000433c <_vsnprintf+0xbb4> +10003cf8: 9b0d ldr r3, [sp, #52] @ 0x34 +10003cfa: 881b ldrh r3, [r3, #0] +10003cfc: 9309 str r3, [sp, #36] @ 0x24 +10003cfe: 2b00 cmp r3, #0 +10003d00: d000 beq.n 10003d04 <_vsnprintf+0x57c> +10003d02: e12d b.n 10003f60 <_vsnprintf+0x7d8> +10003d04: 3310 adds r3, #16 +10003d06: 4398 bics r0, r3 +10003d08: 2900 cmp r1, #0 +10003d0a: d100 bne.n 10003d0e <_vsnprintf+0x586> +10003d0c: e128 b.n 10003f60 <_vsnprintf+0x7d8> +10003d0e: 2300 movs r3, #0 +10003d10: 4699 mov r9, r3 +10003d12: 4643 mov r3, r8 +10003d14: 9305 str r3, [sp, #20] +10003d16: 4653 mov r3, sl +10003d18: 9304 str r3, [sp, #16] +10003d1a: 9b0f ldr r3, [sp, #60] @ 0x3c +10003d1c: 9006 str r0, [sp, #24] +10003d1e: 9303 str r3, [sp, #12] +10003d20: 2300 movs r3, #0 +10003d22: 9302 str r3, [sp, #8] +10003d24: 464b mov r3, r9 +10003d26: 9301 str r3, [sp, #4] +10003d28: ab1c add r3, sp, #112 @ 0x70 +10003d2a: 0022 movs r2, r4 +10003d2c: 9300 str r3, [sp, #0] +10003d2e: 4659 mov r1, fp +10003d30: 0033 movs r3, r6 +10003d32: 0028 movs r0, r5 +10003d34: f7fe ffde bl 10002cf4 <_ntoa_format> +10003d38: 0004 movs r4, r0 +10003d3a: e6c2 b.n 10003ac2 <_vsnprintf+0x33a> +10003d3c: 2858 cmp r0, #88 @ 0x58 +10003d3e: d009 beq.n 10003d54 <_vsnprintf+0x5cc> +10003d40: 2862 cmp r0, #98 @ 0x62 +10003d42: d000 beq.n 10003d46 <_vsnprintf+0x5be> +10003d44: e2e3 b.n 1000430e <_vsnprintf+0xb86> +10003d46: 2302 movs r3, #2 +10003d48: 469c mov ip, r3 +10003d4a: 2300 movs r3, #0 +10003d4c: 9314 str r3, [sp, #80] @ 0x50 +10003d4e: 3302 adds r3, #2 +10003d50: 930f str r3, [sp, #60] @ 0x3c +10003d52: e7ab b.n 10003cac <_vsnprintf+0x524> +10003d54: 2320 movs r3, #32 +10003d56: 9a0b ldr r2, [sp, #44] @ 0x2c +10003d58: 431a orrs r2, r3 +10003d5a: 920b str r2, [sp, #44] @ 0x2c +10003d5c: 3b10 subs r3, #16 +10003d5e: 469c mov ip, r3 +10003d60: 2300 movs r3, #0 +10003d62: 9314 str r3, [sp, #80] @ 0x50 +10003d64: 3310 adds r3, #16 +10003d66: 930f str r3, [sp, #60] @ 0x3c +10003d68: e7a0 b.n 10003cac <_vsnprintf+0x524> +10003d6a: 2380 movs r3, #128 @ 0x80 +10003d6c: 9a0b ldr r2, [sp, #44] @ 0x2c +10003d6e: 011b lsls r3, r3, #4 +10003d70: 431a orrs r2, r3 +10003d72: 920b str r2, [sp, #44] @ 0x2c +10003d74: 2320 movs r3, #32 +10003d76: 9a0b ldr r2, [sp, #44] @ 0x2c +10003d78: 431a orrs r2, r3 +10003d7a: 920b str r2, [sp, #44] @ 0x2c +10003d7c: e6dd b.n 10003b3a <_vsnprintf+0x3b2> +10003d7e: 1b0b subs r3, r1, r4 +10003d80: 469a mov sl, r3 +10003d82: 9b0f ldr r3, [sp, #60] @ 0x3c +10003d84: 4699 mov r9, r3 +10003d86: 003b movs r3, r7 +10003d88: 0037 movs r7, r6 +10003d8a: 465e mov r6, fp +10003d8c: 469b mov fp, r3 +10003d8e: 0022 movs r2, r4 +10003d90: 003b movs r3, r7 +10003d92: 0031 movs r1, r6 +10003d94: 47a8 blx r5 +10003d96: 4653 mov r3, sl +10003d98: 3401 adds r4, #1 +10003d9a: 5d18 ldrb r0, [r3, r4] +10003d9c: 2800 cmp r0, #0 +10003d9e: d1f6 bne.n 10003d8e <_vsnprintf+0x606> +10003da0: 464b mov r3, r9 +10003da2: 930f str r3, [sp, #60] @ 0x3c +10003da4: 465b mov r3, fp +10003da6: 46b3 mov fp, r6 +10003da8: 003e movs r6, r7 +10003daa: 001f movs r7, r3 +10003dac: e685 b.n 10003aba <_vsnprintf+0x332> +10003dae: 23c0 movs r3, #192 @ 0xc0 +10003db0: 9a0b ldr r2, [sp, #44] @ 0x2c +10003db2: 78b8 ldrb r0, [r7, #2] +10003db4: 431a orrs r2, r3 +10003db6: 920b str r2, [sp, #44] @ 0x2c +10003db8: 1cf9 adds r1, r7, #3 +10003dba: e55c b.n 10003876 <_vsnprintf+0xee> +10003dbc: 23c0 movs r3, #192 @ 0xc0 +10003dbe: 009b lsls r3, r3, #2 +10003dc0: e7f6 b.n 10003db0 <_vsnprintf+0x628> +10003dc2: 230d movs r3, #13 +10003dc4: 439a bics r2, r3 +10003dc6: 0010 movs r0, r2 +10003dc8: e77d b.n 10003cc6 <_vsnprintf+0x53e> +10003dca: 465b mov r3, fp +10003dcc: 0035 movs r5, r6 +10003dce: 46bb mov fp, r7 +10003dd0: 464e mov r6, r9 +10003dd2: 001f movs r7, r3 +10003dd4: e671 b.n 10003aba <_vsnprintf+0x332> +10003dd6: 4643 mov r3, r8 +10003dd8: 2b01 cmp r3, #1 +10003dda: d966 bls.n 10003eaa <_vsnprintf+0x722> +10003ddc: 1e63 subs r3, r4, #1 +10003dde: 4443 add r3, r8 +10003de0: 0032 movs r2, r6 +10003de2: 002e movs r6, r5 +10003de4: 001d movs r5, r3 +10003de6: 003b movs r3, r7 +10003de8: 46a2 mov sl, r4 +10003dea: 465f mov r7, fp +10003dec: 4691 mov r9, r2 +10003dee: 469b mov fp, r3 +10003df0: 0022 movs r2, r4 +10003df2: 464b mov r3, r9 +10003df4: 3401 adds r4, #1 +10003df6: 0039 movs r1, r7 +10003df8: 2020 movs r0, #32 +10003dfa: 47b0 blx r6 +10003dfc: 42ac cmp r4, r5 +10003dfe: d1f7 bne.n 10003df0 <_vsnprintf+0x668> +10003e00: 465b mov r3, fp +10003e02: 0035 movs r5, r6 +10003e04: 46bb mov fp, r7 +10003e06: 464e mov r6, r9 +10003e08: 46a1 mov r9, r4 +10003e0a: 4654 mov r4, sl +10003e0c: 001f movs r7, r3 +10003e0e: 9b0d ldr r3, [sp, #52] @ 0x34 +10003e10: 464a mov r2, r9 +10003e12: 7818 ldrb r0, [r3, #0] +10003e14: 4659 mov r1, fp +10003e16: 0033 movs r3, r6 +10003e18: 4444 add r4, r8 +10003e1a: 47a8 blx r5 +10003e1c: e6ee b.n 10003bfc <_vsnprintf+0x474> +10003e1e: 9b0f ldr r3, [sp, #60] @ 0x3c +10003e20: 46a1 mov r9, r4 +10003e22: 4598 cmp r8, r3 +10003e24: d800 bhi.n 10003e28 <_vsnprintf+0x6a0> +10003e26: e64c b.n 10003ac2 <_vsnprintf+0x33a> +10003e28: 4444 add r4, r8 +10003e2a: 1ae4 subs r4, r4, r3 +10003e2c: 46b0 mov r8, r6 +10003e2e: 002e movs r6, r5 +10003e30: 0025 movs r5, r4 +10003e32: 464c mov r4, r9 +10003e34: 46b9 mov r9, r7 +10003e36: 465f mov r7, fp +10003e38: 0022 movs r2, r4 +10003e3a: 4643 mov r3, r8 +10003e3c: 3401 adds r4, #1 +10003e3e: 0039 movs r1, r7 +10003e40: 2020 movs r0, #32 +10003e42: 47b0 blx r6 +10003e44: 42ac cmp r4, r5 +10003e46: d1f7 bne.n 10003e38 <_vsnprintf+0x6b0> +10003e48: 002c movs r4, r5 +10003e4a: 46bb mov fp, r7 +10003e4c: 0035 movs r5, r6 +10003e4e: 464f mov r7, r9 +10003e50: 4646 mov r6, r8 +10003e52: e636 b.n 10003ac2 <_vsnprintf+0x33a> +10003e54: 980f ldr r0, [sp, #60] @ 0x3c +10003e56: 4580 cmp r8, r0 +10003e58: d800 bhi.n 10003e5c <_vsnprintf+0x6d4> +10003e5a: e273 b.n 10004344 <_vsnprintf+0xbbc> +10003e5c: 4643 mov r3, r8 +10003e5e: 18e2 adds r2, r4, r3 +10003e60: 1a13 subs r3, r2, r0 +10003e62: 0032 movs r2, r6 +10003e64: 002e movs r6, r5 +10003e66: 001d movs r5, r3 +10003e68: 003b movs r3, r7 +10003e6a: 4691 mov r9, r2 +10003e6c: 465f mov r7, fp +10003e6e: 469b mov fp, r3 +10003e70: 910f str r1, [sp, #60] @ 0x3c +10003e72: 0022 movs r2, r4 +10003e74: 464b mov r3, r9 +10003e76: 3401 adds r4, #1 +10003e78: 0039 movs r1, r7 +10003e7a: 2020 movs r0, #32 +10003e7c: 47b0 blx r6 +10003e7e: 42ac cmp r4, r5 +10003e80: d1f7 bne.n 10003e72 <_vsnprintf+0x6ea> +10003e82: 465b mov r3, fp +10003e84: 46bb mov fp, r7 +10003e86: 001f movs r7, r3 +10003e88: 4643 mov r3, r8 +10003e8a: 990f ldr r1, [sp, #60] @ 0x3c +10003e8c: 3301 adds r3, #1 +10003e8e: 930f str r3, [sp, #60] @ 0x3c +10003e90: 780b ldrb r3, [r1, #0] +10003e92: 0035 movs r5, r6 +10003e94: 469c mov ip, r3 +10003e96: 464e mov r6, r9 +10003e98: 4660 mov r0, ip +10003e9a: 2800 cmp r0, #0 +10003e9c: d000 beq.n 10003ea0 <_vsnprintf+0x718> +10003e9e: e5e7 b.n 10003a70 <_vsnprintf+0x2e8> +10003ea0: e60f b.n 10003ac2 <_vsnprintf+0x33a> +10003ea2: 9b0d ldr r3, [sp, #52] @ 0x34 +10003ea4: 781b ldrb r3, [r3, #0] +10003ea6: 9309 str r3, [sp, #36] @ 0x24 +10003ea8: e729 b.n 10003cfe <_vsnprintf+0x576> +10003eaa: 9b0d ldr r3, [sp, #52] @ 0x34 +10003eac: 0022 movs r2, r4 +10003eae: 7818 ldrb r0, [r3, #0] +10003eb0: 4659 mov r1, fp +10003eb2: 0033 movs r3, r6 +10003eb4: 47a8 blx r5 +10003eb6: 464c mov r4, r9 +10003eb8: e6a0 b.n 10003bfc <_vsnprintf+0x474> +10003eba: 9a0d ldr r2, [sp, #52] @ 0x34 +10003ebc: 3bfa subs r3, #250 @ 0xfa +10003ebe: 3bff subs r3, #255 @ 0xff +10003ec0: 3207 adds r2, #7 +10003ec2: 439a bics r2, r3 +10003ec4: 3301 adds r3, #1 +10003ec6: 4699 mov r9, r3 +10003ec8: 4491 add r9, r2 +10003eca: 464b mov r3, r9 +10003ecc: 930d str r3, [sp, #52] @ 0x34 +10003ece: 6813 ldr r3, [r2, #0] +10003ed0: 6852 ldr r2, [r2, #4] +10003ed2: 9215 str r2, [sp, #84] @ 0x54 +10003ed4: 431a orrs r2, r3 +10003ed6: d106 bne.n 10003ee6 <_vsnprintf+0x75e> +10003ed8: 3210 adds r2, #16 +10003eda: 4390 bics r0, r2 +10003edc: 2200 movs r2, #0 +10003ede: 9209 str r2, [sp, #36] @ 0x24 +10003ee0: 2900 cmp r1, #0 +10003ee2: d000 beq.n 10003ee6 <_vsnprintf+0x75e> +10003ee4: e083 b.n 10003fee <_vsnprintf+0x866> +10003ee6: 2261 movs r2, #97 @ 0x61 +10003ee8: 0681 lsls r1, r0, #26 +10003eea: d500 bpl.n 10003eee <_vsnprintf+0x766> +10003eec: 2241 movs r2, #65 @ 0x41 +10003eee: b2d2 uxtb r2, r2 +10003ef0: 920a str r2, [sp, #40] @ 0x28 +10003ef2: aa14 add r2, sp, #80 @ 0x50 +10003ef4: 4691 mov r9, r2 +10003ef6: 9a0a ldr r2, [sp, #40] @ 0x28 +10003ef8: 2100 movs r1, #0 +10003efa: 3a0a subs r2, #10 +10003efc: 920b str r2, [sp, #44] @ 0x2c +10003efe: 4642 mov r2, r8 +10003f00: 9217 str r2, [sp, #92] @ 0x5c +10003f02: 4652 mov r2, sl +10003f04: 9218 str r2, [sp, #96] @ 0x60 +10003f06: 465a mov r2, fp +10003f08: 46b2 mov sl, r6 +10003f0a: 9109 str r1, [sp, #36] @ 0x24 +10003f0c: 001e movs r6, r3 +10003f0e: 311f adds r1, #31 +10003f10: 9b14 ldr r3, [sp, #80] @ 0x50 +10003f12: 4449 add r1, r9 +10003f14: 46bb mov fp, r7 +10003f16: 9416 str r4, [sp, #88] @ 0x58 +10003f18: 951a str r5, [sp, #104] @ 0x68 +10003f1a: 2400 movs r4, #0 +10003f1c: 4667 mov r7, ip +10003f1e: 4698 mov r8, r3 +10003f20: 4689 mov r9, r1 +10003f22: 9d15 ldr r5, [sp, #84] @ 0x54 +10003f24: 9019 str r0, [sp, #100] @ 0x64 +10003f26: 921b str r2, [sp, #108] @ 0x6c +10003f28: e00a b.n 10003f40 <_vsnprintf+0x7b8> +10003f2a: 3230 adds r2, #48 @ 0x30 +10003f2c: b2d2 uxtb r2, r2 +10003f2e: 464b mov r3, r9 +10003f30: 3401 adds r4, #1 +10003f32: 551a strb r2, [r3, r4] +10003f34: 45a8 cmp r8, r5 +10003f36: d04c beq.n 10003fd2 <_vsnprintf+0x84a> +10003f38: 2c20 cmp r4, #32 +10003f3a: d04c beq.n 10003fd6 <_vsnprintf+0x84e> +10003f3c: 0006 movs r6, r0 +10003f3e: 000d movs r5, r1 +10003f40: 003a movs r2, r7 +10003f42: 2300 movs r3, #0 +10003f44: 0030 movs r0, r6 +10003f46: 0029 movs r1, r5 +10003f48: f000 faca bl 100044e0 <__wrap___aeabi_uldivmod> +10003f4c: b2d2 uxtb r2, r2 +10003f4e: 2a09 cmp r2, #9 +10003f50: d9eb bls.n 10003f2a <_vsnprintf+0x7a2> +10003f52: 9b0b ldr r3, [sp, #44] @ 0x2c +10003f54: 469c mov ip, r3 +10003f56: 4462 add r2, ip +10003f58: b2d2 uxtb r2, r2 +10003f5a: e7e8 b.n 10003f2e <_vsnprintf+0x7a6> +10003f5c: 10002c45 .word 0x10002c45 +10003f60: 2361 movs r3, #97 @ 0x61 +10003f62: 0682 lsls r2, r0, #26 +10003f64: d500 bpl.n 10003f68 <_vsnprintf+0x7e0> +10003f66: 2341 movs r3, #65 @ 0x41 +10003f68: b2db uxtb r3, r3 +10003f6a: 3b0a subs r3, #10 +10003f6c: 930b str r3, [sp, #44] @ 0x2c +10003f6e: 4643 mov r3, r8 +10003f70: a914 add r1, sp, #80 @ 0x50 +10003f72: 221f movs r2, #31 +10003f74: 468c mov ip, r1 +10003f76: 9315 str r3, [sp, #84] @ 0x54 +10003f78: 4653 mov r3, sl +10003f7a: 4462 add r2, ip +10003f7c: 46b2 mov sl, r6 +10003f7e: 940d str r4, [sp, #52] @ 0x34 +10003f80: 9717 str r7, [sp, #92] @ 0x5c +10003f82: 464c mov r4, r9 +10003f84: 4680 mov r8, r0 +10003f86: 46a9 mov r9, r5 +10003f88: 0017 movs r7, r2 +10003f8a: 9d09 ldr r5, [sp, #36] @ 0x24 +10003f8c: 9e0f ldr r6, [sp, #60] @ 0x3c +10003f8e: 9316 str r3, [sp, #88] @ 0x58 +10003f90: e008 b.n 10003fa4 <_vsnprintf+0x81c> +10003f92: 3330 adds r3, #48 @ 0x30 +10003f94: b2db uxtb r3, r3 +10003f96: 3401 adds r4, #1 +10003f98: 553b strb r3, [r7, r4] +10003f9a: 42b5 cmp r5, r6 +10003f9c: d30e bcc.n 10003fbc <_vsnprintf+0x834> +10003f9e: 2c20 cmp r4, #32 +10003fa0: d00c beq.n 10003fbc <_vsnprintf+0x834> +10003fa2: 0005 movs r5, r0 +10003fa4: 0031 movs r1, r6 +10003fa6: 0028 movs r0, r5 +10003fa8: f000 fa5c bl 10004464 <__wrap___aeabi_uidiv> +10003fac: b2cb uxtb r3, r1 +10003fae: 2909 cmp r1, #9 +10003fb0: d9ef bls.n 10003f92 <_vsnprintf+0x80a> +10003fb2: 9a0b ldr r2, [sp, #44] @ 0x2c +10003fb4: 4694 mov ip, r2 +10003fb6: 4463 add r3, ip +10003fb8: b2db uxtb r3, r3 +10003fba: e7ec b.n 10003f96 <_vsnprintf+0x80e> +10003fbc: 9b15 ldr r3, [sp, #84] @ 0x54 +10003fbe: 4640 mov r0, r8 +10003fc0: 4698 mov r8, r3 +10003fc2: 9b16 ldr r3, [sp, #88] @ 0x58 +10003fc4: 464d mov r5, r9 +10003fc6: 4656 mov r6, sl +10003fc8: 46a1 mov r9, r4 +10003fca: 469a mov sl, r3 +10003fcc: 9c0d ldr r4, [sp, #52] @ 0x34 +10003fce: 9f17 ldr r7, [sp, #92] @ 0x5c +10003fd0: e69f b.n 10003d12 <_vsnprintf+0x58a> +10003fd2: 42b7 cmp r7, r6 +10003fd4: d9b0 bls.n 10003f38 <_vsnprintf+0x7b0> +10003fd6: 9b17 ldr r3, [sp, #92] @ 0x5c +10003fd8: 4656 mov r6, sl +10003fda: 4698 mov r8, r3 +10003fdc: 9b18 ldr r3, [sp, #96] @ 0x60 +10003fde: 465f mov r7, fp +10003fe0: 469a mov sl, r3 +10003fe2: 9b1b ldr r3, [sp, #108] @ 0x6c +10003fe4: 9409 str r4, [sp, #36] @ 0x24 +10003fe6: 469b mov fp, r3 +10003fe8: 9c16 ldr r4, [sp, #88] @ 0x58 +10003fea: 9819 ldr r0, [sp, #100] @ 0x64 +10003fec: 9d1a ldr r5, [sp, #104] @ 0x68 +10003fee: 4643 mov r3, r8 +10003ff0: 9305 str r3, [sp, #20] +10003ff2: 4653 mov r3, sl +10003ff4: 9304 str r3, [sp, #16] +10003ff6: 9b0f ldr r3, [sp, #60] @ 0x3c +10003ff8: 9006 str r0, [sp, #24] +10003ffa: 9303 str r3, [sp, #12] +10003ffc: 2300 movs r3, #0 +10003ffe: 9302 str r3, [sp, #8] +10004000: 9b09 ldr r3, [sp, #36] @ 0x24 +10004002: 9301 str r3, [sp, #4] +10004004: ab1c add r3, sp, #112 @ 0x70 +10004006: 0022 movs r2, r4 +10004008: 9300 str r3, [sp, #0] +1000400a: 4659 mov r1, fp +1000400c: 0033 movs r3, r6 +1000400e: 0028 movs r0, r5 +10004010: f7fe fe70 bl 10002cf4 <_ntoa_format> +10004014: 0004 movs r4, r0 +10004016: f7ff fbdf bl 100037d8 <_vsnprintf+0x50> +1000401a: 2310 movs r3, #16 +1000401c: 9a0b ldr r2, [sp, #44] @ 0x2c +1000401e: 439a bics r2, r3 +10004020: 920f str r2, [sp, #60] @ 0x3c +10004022: 2869 cmp r0, #105 @ 0x69 +10004024: d000 beq.n 10004028 <_vsnprintf+0x8a0> +10004026: e191 b.n 1000434c <_vsnprintf+0xbc4> +10004028: 990b ldr r1, [sp, #44] @ 0x2c +1000402a: 2380 movs r3, #128 @ 0x80 +1000402c: 000a movs r2, r1 +1000402e: 00db lsls r3, r3, #3 +10004030: 401a ands r2, r3 +10004032: 0010 movs r0, r2 +10004034: 000a movs r2, r1 +10004036: 4219 tst r1, r3 +10004038: d003 beq.n 10004042 <_vsnprintf+0x8ba> +1000403a: 2111 movs r1, #17 +1000403c: 0018 movs r0, r3 +1000403e: 438a bics r2, r1 +10004040: 920f str r2, [sp, #60] @ 0x3c +10004042: 9a0f ldr r2, [sp, #60] @ 0x3c +10004044: 2380 movs r3, #128 @ 0x80 +10004046: 0011 movs r1, r2 +10004048: 009b lsls r3, r3, #2 +1000404a: 4019 ands r1, r3 +1000404c: 468c mov ip, r1 +1000404e: 421a tst r2, r3 +10004050: d15b bne.n 1000410a <_vsnprintf+0x982> +10004052: 2380 movs r3, #128 @ 0x80 +10004054: 0011 movs r1, r2 +10004056: 005b lsls r3, r3, #1 +10004058: 4019 ands r1, r3 +1000405a: 4689 mov r9, r1 +1000405c: 990d ldr r1, [sp, #52] @ 0x34 +1000405e: 3104 adds r1, #4 +10004060: 910b str r1, [sp, #44] @ 0x2c +10004062: 421a tst r2, r3 +10004064: d000 beq.n 10004068 <_vsnprintf+0x8e0> +10004066: e0b2 b.n 100041ce <_vsnprintf+0xa46> +10004068: 0013 movs r3, r2 +1000406a: 065b lsls r3, r3, #25 +1000406c: d400 bmi.n 10004070 <_vsnprintf+0x8e8> +1000406e: e0ed b.n 1000424c <_vsnprintf+0xac4> +10004070: 9b0d ldr r3, [sp, #52] @ 0x34 +10004072: 781b ldrb r3, [r3, #0] +10004074: 001a movs r2, r3 +10004076: 0fd9 lsrs r1, r3, #31 +10004078: 910d str r1, [sp, #52] @ 0x34 +1000407a: 2b00 cmp r3, #0 +1000407c: d100 bne.n 10004080 <_vsnprintf+0x8f8> +1000407e: e0a3 b.n 100041c8 <_vsnprintf+0xa40> +10004080: 0010 movs r0, r2 +10004082: aa14 add r2, sp, #80 @ 0x50 +10004084: 4694 mov ip, r2 +10004086: 4642 mov r2, r8 +10004088: 231f movs r3, #31 +1000408a: 9215 str r2, [sp, #84] @ 0x54 +1000408c: 4652 mov r2, sl +1000408e: 4463 add r3, ip +10004090: 46a8 mov r8, r5 +10004092: 46ba mov sl, r7 +10004094: 464d mov r5, r9 +10004096: 9414 str r4, [sp, #80] @ 0x50 +10004098: 46b1 mov r9, r6 +1000409a: 0004 movs r4, r0 +1000409c: 001f movs r7, r3 +1000409e: 9216 str r2, [sp, #88] @ 0x58 +100040a0: e001 b.n 100040a6 <_vsnprintf+0x91e> +100040a2: 2d20 cmp r5, #32 +100040a4: d00f beq.n 100040c6 <_vsnprintf+0x93e> +100040a6: 0020 movs r0, r4 +100040a8: 210a movs r1, #10 +100040aa: f000 f9db bl 10004464 <__wrap___aeabi_uidiv> +100040ae: 3501 adds r5, #1 +100040b0: 197e adds r6, r7, r5 +100040b2: 3130 adds r1, #48 @ 0x30 +100040b4: 7031 strb r1, [r6, #0] +100040b6: 0020 movs r0, r4 +100040b8: 210a movs r1, #10 +100040ba: f000 f9d3 bl 10004464 <__wrap___aeabi_uidiv> +100040be: 0026 movs r6, r4 +100040c0: 0004 movs r4, r0 +100040c2: 2e09 cmp r6, #9 +100040c4: d8ed bhi.n 100040a2 <_vsnprintf+0x91a> +100040c6: 9b15 ldr r3, [sp, #84] @ 0x54 +100040c8: 464e mov r6, r9 +100040ca: 46a9 mov r9, r5 +100040cc: 4645 mov r5, r8 +100040ce: 4698 mov r8, r3 +100040d0: 9b16 ldr r3, [sp, #88] @ 0x58 +100040d2: 4657 mov r7, sl +100040d4: 469a mov sl, r3 +100040d6: 9c14 ldr r4, [sp, #80] @ 0x50 +100040d8: 9b0f ldr r3, [sp, #60] @ 0x3c +100040da: 9306 str r3, [sp, #24] +100040dc: 4643 mov r3, r8 +100040de: 9305 str r3, [sp, #20] +100040e0: 4653 mov r3, sl +100040e2: 9304 str r3, [sp, #16] +100040e4: 230a movs r3, #10 +100040e6: 9303 str r3, [sp, #12] +100040e8: 9b0d ldr r3, [sp, #52] @ 0x34 +100040ea: 9302 str r3, [sp, #8] +100040ec: 464b mov r3, r9 +100040ee: 9301 str r3, [sp, #4] +100040f0: ab1c add r3, sp, #112 @ 0x70 +100040f2: 0022 movs r2, r4 +100040f4: 9300 str r3, [sp, #0] +100040f6: 4659 mov r1, fp +100040f8: 0033 movs r3, r6 +100040fa: 0028 movs r0, r5 +100040fc: f7fe fdfa bl 10002cf4 <_ntoa_format> +10004100: 9b0b ldr r3, [sp, #44] @ 0x2c +10004102: 0004 movs r4, r0 +10004104: 930d str r3, [sp, #52] @ 0x34 +10004106: f7ff fb67 bl 100037d8 <_vsnprintf+0x50> +1000410a: 2207 movs r2, #7 +1000410c: 9b0d ldr r3, [sp, #52] @ 0x34 +1000410e: 3307 adds r3, #7 +10004110: 4393 bics r3, r2 +10004112: 3201 adds r2, #1 +10004114: 4694 mov ip, r2 +10004116: 449c add ip, r3 +10004118: 4662 mov r2, ip +1000411a: 920d str r2, [sp, #52] @ 0x34 +1000411c: cb0c ldmia r3, {r2, r3} +1000411e: 0fd9 lsrs r1, r3, #31 +10004120: 910b str r1, [sp, #44] @ 0x2c +10004122: 0011 movs r1, r2 +10004124: 4319 orrs r1, r3 +10004126: d100 bne.n 1000412a <_vsnprintf+0x9a2> +10004128: e09b b.n 10004262 <_vsnprintf+0xada> +1000412a: 17d9 asrs r1, r3, #31 +1000412c: 9113 str r1, [sp, #76] @ 0x4c +1000412e: 9112 str r1, [sp, #72] @ 0x48 +10004130: 4051 eors r1, r2 +10004132: 9110 str r1, [sp, #64] @ 0x40 +10004134: 9913 ldr r1, [sp, #76] @ 0x4c +10004136: 4059 eors r1, r3 +10004138: 9111 str r1, [sp, #68] @ 0x44 +1000413a: 9810 ldr r0, [sp, #64] @ 0x40 +1000413c: 9911 ldr r1, [sp, #68] @ 0x44 +1000413e: 9a12 ldr r2, [sp, #72] @ 0x48 +10004140: 9b13 ldr r3, [sp, #76] @ 0x4c +10004142: 1a80 subs r0, r0, r2 +10004144: 4199 sbcs r1, r3 +10004146: 9010 str r0, [sp, #64] @ 0x40 +10004148: 9111 str r1, [sp, #68] @ 0x44 +1000414a: aa14 add r2, sp, #80 @ 0x50 +1000414c: 4694 mov ip, r2 +1000414e: 4642 mov r2, r8 +10004150: 2300 movs r3, #0 +10004152: 9215 str r2, [sp, #84] @ 0x54 +10004154: 4652 mov r2, sl +10004156: 4699 mov r9, r3 +10004158: 9216 str r2, [sp, #88] @ 0x58 +1000415a: 0032 movs r2, r6 +1000415c: 331f adds r3, #31 +1000415e: 4463 add r3, ip +10004160: 46a8 mov r8, r5 +10004162: 464e mov r6, r9 +10004164: 46ba mov sl, r7 +10004166: 9414 str r4, [sp, #80] @ 0x50 +10004168: 001f movs r7, r3 +1000416a: 9c10 ldr r4, [sp, #64] @ 0x40 +1000416c: 9d11 ldr r5, [sp, #68] @ 0x44 +1000416e: 4691 mov r9, r2 +10004170: e001 b.n 10004176 <_vsnprintf+0x9ee> +10004172: 2e20 cmp r6, #32 +10004174: d010 beq.n 10004198 <_vsnprintf+0xa10> +10004176: 0020 movs r0, r4 +10004178: 0029 movs r1, r5 +1000417a: 220a movs r2, #10 +1000417c: 2300 movs r3, #0 +1000417e: f000 f9af bl 100044e0 <__wrap___aeabi_uldivmod> +10004182: 3601 adds r6, #1 +10004184: 3230 adds r2, #48 @ 0x30 +10004186: 002b movs r3, r5 +10004188: 55ba strb r2, [r7, r6] +1000418a: 000d movs r5, r1 +1000418c: 0022 movs r2, r4 +1000418e: 0004 movs r4, r0 +10004190: 2b00 cmp r3, #0 +10004192: d1ee bne.n 10004172 <_vsnprintf+0x9ea> +10004194: 2a09 cmp r2, #9 +10004196: d8ec bhi.n 10004172 <_vsnprintf+0x9ea> +10004198: 9b15 ldr r3, [sp, #84] @ 0x54 +1000419a: 9410 str r4, [sp, #64] @ 0x40 +1000419c: 9511 str r5, [sp, #68] @ 0x44 +1000419e: 4645 mov r5, r8 +100041a0: 4698 mov r8, r3 +100041a2: 464b mov r3, r9 +100041a4: 9a16 ldr r2, [sp, #88] @ 0x58 +100041a6: 46b1 mov r9, r6 +100041a8: 4657 mov r7, sl +100041aa: 001e movs r6, r3 +100041ac: 4692 mov sl, r2 +100041ae: 9c14 ldr r4, [sp, #80] @ 0x50 +100041b0: 9b0f ldr r3, [sp, #60] @ 0x3c +100041b2: 9306 str r3, [sp, #24] +100041b4: 4643 mov r3, r8 +100041b6: 9305 str r3, [sp, #20] +100041b8: 4653 mov r3, sl +100041ba: 9304 str r3, [sp, #16] +100041bc: 230a movs r3, #10 +100041be: 9303 str r3, [sp, #12] +100041c0: 9b0b ldr r3, [sp, #44] @ 0x2c +100041c2: 9302 str r3, [sp, #8] +100041c4: 464b mov r3, r9 +100041c6: e71c b.n 10004002 <_vsnprintf+0x87a> +100041c8: 2800 cmp r0, #0 +100041ca: d185 bne.n 100040d8 <_vsnprintf+0x950> +100041cc: e759 b.n 10004082 <_vsnprintf+0x8fa> +100041ce: 9b0d ldr r3, [sp, #52] @ 0x34 +100041d0: 681b ldr r3, [r3, #0] +100041d2: 0fda lsrs r2, r3, #31 +100041d4: 0011 movs r1, r2 +100041d6: 2b00 cmp r3, #0 +100041d8: d100 bne.n 100041dc <_vsnprintf+0xa54> +100041da: e0a6 b.n 1000432a <_vsnprintf+0xba2> +100041dc: 17da asrs r2, r3, #31 +100041de: 1898 adds r0, r3, r2 +100041e0: 4050 eors r0, r2 +100041e2: aa14 add r2, sp, #80 @ 0x50 +100041e4: 4691 mov r9, r2 +100041e6: 231f movs r3, #31 +100041e8: 4642 mov r2, r8 +100041ea: 444b add r3, r9 +100041ec: 46a8 mov r8, r5 +100041ee: 940d str r4, [sp, #52] @ 0x34 +100041f0: 9716 str r7, [sp, #88] @ 0x58 +100041f2: 0004 movs r4, r0 +100041f4: 4665 mov r5, ip +100041f6: 46b1 mov r9, r6 +100041f8: 001f movs r7, r3 +100041fa: 9114 str r1, [sp, #80] @ 0x50 +100041fc: 9215 str r2, [sp, #84] @ 0x54 +100041fe: e001 b.n 10004204 <_vsnprintf+0xa7c> +10004200: 2d20 cmp r5, #32 +10004202: d00f beq.n 10004224 <_vsnprintf+0xa9c> +10004204: 0020 movs r0, r4 +10004206: 210a movs r1, #10 +10004208: f000 f92c bl 10004464 <__wrap___aeabi_uidiv> +1000420c: 3501 adds r5, #1 +1000420e: 197e adds r6, r7, r5 +10004210: 3130 adds r1, #48 @ 0x30 +10004212: 7031 strb r1, [r6, #0] +10004214: 0020 movs r0, r4 +10004216: 210a movs r1, #10 +10004218: f000 f924 bl 10004464 <__wrap___aeabi_uidiv> +1000421c: 0026 movs r6, r4 +1000421e: 0004 movs r4, r0 +10004220: 2e09 cmp r6, #9 +10004222: d8ed bhi.n 10004200 <_vsnprintf+0xa78> +10004224: 9b15 ldr r3, [sp, #84] @ 0x54 +10004226: 46ac mov ip, r5 +10004228: 4645 mov r5, r8 +1000422a: 4698 mov r8, r3 +1000422c: 9b14 ldr r3, [sp, #80] @ 0x50 +1000422e: 464e mov r6, r9 +10004230: 0019 movs r1, r3 +10004232: 9c0d ldr r4, [sp, #52] @ 0x34 +10004234: 9f16 ldr r7, [sp, #88] @ 0x58 +10004236: 9b0f ldr r3, [sp, #60] @ 0x3c +10004238: 9102 str r1, [sp, #8] +1000423a: 9306 str r3, [sp, #24] +1000423c: 4643 mov r3, r8 +1000423e: 9305 str r3, [sp, #20] +10004240: 4653 mov r3, sl +10004242: 9304 str r3, [sp, #16] +10004244: 230a movs r3, #10 +10004246: 9303 str r3, [sp, #12] +10004248: 4663 mov r3, ip +1000424a: e750 b.n 100040ee <_vsnprintf+0x966> +1000424c: 0013 movs r3, r2 +1000424e: 061b lsls r3, r3, #24 +10004250: d56e bpl.n 10004330 <_vsnprintf+0xba8> +10004252: 9b0d ldr r3, [sp, #52] @ 0x34 +10004254: 2200 movs r2, #0 +10004256: 5e9b ldrsh r3, [r3, r2] +10004258: 17d9 asrs r1, r3, #31 +1000425a: 185a adds r2, r3, r1 +1000425c: 404a eors r2, r1 +1000425e: b292 uxth r2, r2 +10004260: e709 b.n 10004076 <_vsnprintf+0x8ee> +10004262: 2300 movs r3, #0 +10004264: 4699 mov r9, r3 +10004266: 2800 cmp r0, #0 +10004268: d1a2 bne.n 100041b0 <_vsnprintf+0xa28> +1000426a: 2200 movs r2, #0 +1000426c: 2300 movs r3, #0 +1000426e: 9210 str r2, [sp, #64] @ 0x40 +10004270: 9311 str r3, [sp, #68] @ 0x44 +10004272: e76a b.n 1000414a <_vsnprintf+0x9c2> +10004274: 9b0d ldr r3, [sp, #52] @ 0x34 +10004276: 681b ldr r3, [r3, #0] +10004278: 4699 mov r9, r3 +1000427a: 2b00 cmp r3, #0 +1000427c: d103 bne.n 10004286 <_vsnprintf+0xafe> +1000427e: 3310 adds r3, #16 +10004280: 4398 bics r0, r3 +10004282: 2900 cmp r1, #0 +10004284: d138 bne.n 100042f8 <_vsnprintf+0xb70> +10004286: 2361 movs r3, #97 @ 0x61 +10004288: 0682 lsls r2, r0, #26 +1000428a: d500 bpl.n 1000428e <_vsnprintf+0xb06> +1000428c: 2341 movs r3, #65 @ 0x41 +1000428e: b2db uxtb r3, r3 +10004290: 3b0a subs r3, #10 +10004292: 930d str r3, [sp, #52] @ 0x34 +10004294: 4643 mov r3, r8 +10004296: 9316 str r3, [sp, #88] @ 0x58 +10004298: 4653 mov r3, sl +1000429a: a914 add r1, sp, #80 @ 0x50 +1000429c: 221f movs r2, #31 +1000429e: 468c mov ip, r1 +100042a0: 9317 str r3, [sp, #92] @ 0x5c +100042a2: 002b movs r3, r5 +100042a4: 4462 add r2, ip +100042a6: 464d mov r5, r9 +100042a8: 46b2 mov sl, r6 +100042aa: 9415 str r4, [sp, #84] @ 0x54 +100042ac: 9718 str r7, [sp, #96] @ 0x60 +100042ae: 4680 mov r8, r0 +100042b0: 0017 movs r7, r2 +100042b2: 4699 mov r9, r3 +100042b4: 9c0b ldr r4, [sp, #44] @ 0x2c +100042b6: 9e0f ldr r6, [sp, #60] @ 0x3c +100042b8: e008 b.n 100042cc <_vsnprintf+0xb44> +100042ba: 3330 adds r3, #48 @ 0x30 +100042bc: b2db uxtb r3, r3 +100042be: 3401 adds r4, #1 +100042c0: 553b strb r3, [r7, r4] +100042c2: 42b5 cmp r5, r6 +100042c4: d30e bcc.n 100042e4 <_vsnprintf+0xb5c> +100042c6: 2c20 cmp r4, #32 +100042c8: d00c beq.n 100042e4 <_vsnprintf+0xb5c> +100042ca: 0005 movs r5, r0 +100042cc: 0031 movs r1, r6 +100042ce: 0028 movs r0, r5 +100042d0: f000 f8c8 bl 10004464 <__wrap___aeabi_uidiv> +100042d4: b2cb uxtb r3, r1 +100042d6: 2909 cmp r1, #9 +100042d8: d9ef bls.n 100042ba <_vsnprintf+0xb32> +100042da: 9a0d ldr r2, [sp, #52] @ 0x34 +100042dc: 4694 mov ip, r2 +100042de: 4463 add r3, ip +100042e0: b2db uxtb r3, r3 +100042e2: e7ec b.n 100042be <_vsnprintf+0xb36> +100042e4: 9b16 ldr r3, [sp, #88] @ 0x58 +100042e6: 4640 mov r0, r8 +100042e8: 4698 mov r8, r3 +100042ea: 9b17 ldr r3, [sp, #92] @ 0x5c +100042ec: 4656 mov r6, sl +100042ee: 464d mov r5, r9 +100042f0: 469a mov sl, r3 +100042f2: 940b str r4, [sp, #44] @ 0x2c +100042f4: 9f18 ldr r7, [sp, #96] @ 0x60 +100042f6: 9c15 ldr r4, [sp, #84] @ 0x54 +100042f8: 4643 mov r3, r8 +100042fa: 9305 str r3, [sp, #20] +100042fc: 4653 mov r3, sl +100042fe: 9304 str r3, [sp, #16] +10004300: 9b0f ldr r3, [sp, #60] @ 0x3c +10004302: 9006 str r0, [sp, #24] +10004304: 9303 str r3, [sp, #12] +10004306: 2300 movs r3, #0 +10004308: 9302 str r3, [sp, #8] +1000430a: 9b0b ldr r3, [sp, #44] @ 0x2c +1000430c: e50b b.n 10003d26 <_vsnprintf+0x59e> +1000430e: 990b ldr r1, [sp, #44] @ 0x2c +10004310: 2380 movs r3, #128 @ 0x80 +10004312: 000a movs r2, r1 +10004314: 00db lsls r3, r3, #3 +10004316: 401a ands r2, r3 +10004318: 0010 movs r0, r2 +1000431a: 000a movs r2, r1 +1000431c: 4219 tst r1, r3 +1000431e: d000 beq.n 10004322 <_vsnprintf+0xb9a> +10004320: e68b b.n 1000403a <_vsnprintf+0x8b2> +10004322: 2310 movs r3, #16 +10004324: 439a bics r2, r3 +10004326: 920f str r2, [sp, #60] @ 0x3c +10004328: e68b b.n 10004042 <_vsnprintf+0x8ba> +1000432a: 2800 cmp r0, #0 +1000432c: d183 bne.n 10004236 <_vsnprintf+0xaae> +1000432e: e758 b.n 100041e2 <_vsnprintf+0xa5a> +10004330: 9b0d ldr r3, [sp, #52] @ 0x34 +10004332: 681b ldr r3, [r3, #0] +10004334: 17d9 asrs r1, r3, #31 +10004336: 185a adds r2, r3, r1 +10004338: 404a eors r2, r1 +1000433a: e69c b.n 10004076 <_vsnprintf+0x8ee> +1000433c: 9b0d ldr r3, [sp, #52] @ 0x34 +1000433e: 681b ldr r3, [r3, #0] +10004340: 9309 str r3, [sp, #36] @ 0x24 +10004342: e4dc b.n 10003cfe <_vsnprintf+0x576> +10004344: 0003 movs r3, r0 +10004346: 3301 adds r3, #1 +10004348: 930f str r3, [sp, #60] @ 0x3c +1000434a: e5a5 b.n 10003e98 <_vsnprintf+0x710> +1000434c: 920b str r2, [sp, #44] @ 0x2c +1000434e: e46d b.n 10003c2c <_vsnprintf+0x4a4> + +10004350 : +10004350: b500 push {lr} +10004352: b085 sub sp, #20 +10004354: 9103 str r1, [sp, #12] +10004356: 2101 movs r1, #1 +10004358: 9002 str r0, [sp, #8] +1000435a: 9300 str r3, [sp, #0] +1000435c: 4803 ldr r0, [pc, #12] @ (1000436c ) +1000435e: 0013 movs r3, r2 +10004360: 424a negs r2, r1 +10004362: a902 add r1, sp, #8 +10004364: f7ff fa10 bl 10003788 <_vsnprintf> +10004368: b005 add sp, #20 +1000436a: bd00 pop {pc} +1000436c: 10002f55 .word 0x10002f55 + +10004370 : +10004370: b510 push {r4, lr} +10004372: 4a09 ldr r2, [pc, #36] @ (10004398 ) +10004374: 0003 movs r3, r0 +10004376: 6814 ldr r4, [r2, #0] +10004378: b084 sub sp, #16 +1000437a: 2c00 cmp r4, #0 +1000437c: d008 beq.n 10004390 +1000437e: 2201 movs r2, #1 +10004380: 9100 str r1, [sp, #0] +10004382: 4806 ldr r0, [pc, #24] @ (1000439c ) +10004384: 4252 negs r2, r2 +10004386: a903 add r1, sp, #12 +10004388: 47a0 blx r4 +1000438a: 2001 movs r0, #1 +1000438c: b004 add sp, #16 +1000438e: bd10 pop {r4, pc} +10004390: f000 ffbe bl 10005310 <__wrap_puts> +10004394: 2000 movs r0, #0 +10004396: e7f9 b.n 1000438c +10004398: 20001ccc .word 0x20001ccc +1000439c: 10002f45 .word 0x10002f45 + +100043a0 <__aeabi_bits_init>: +100043a0: 4801 ldr r0, [pc, #4] @ (100043a8 <__aeabi_bits_init+0x8>) +100043a2: 2104 movs r1, #4 +100043a4: 4b01 ldr r3, [pc, #4] @ (100043ac <__aeabi_bits_init+0xc>) +100043a6: 4718 bx r3 +100043a8: 20000f20 .word 0x20000f20 +100043ac: 100043d1 .word 0x100043d1 + +100043b0 : +100043b0: 2314 movs r3, #20 +100043b2: b510 push {r4, lr} +100043b4: 0001 movs r1, r0 +100043b6: 8818 ldrh r0, [r3, #0] +100043b8: 3304 adds r3, #4 +100043ba: 881b ldrh r3, [r3, #0] +100043bc: 4798 blx r3 +100043be: bd10 pop {r4, pc} + +100043c0 : +100043c0: 2316 movs r3, #22 +100043c2: b510 push {r4, lr} +100043c4: 0001 movs r1, r0 +100043c6: 8818 ldrh r0, [r3, #0] +100043c8: 3302 adds r3, #2 +100043ca: 881b ldrh r3, [r3, #0] +100043cc: 4798 blx r3 +100043ce: bd10 pop {r4, pc} + +100043d0 : +100043d0: b5f8 push {r3, r4, r5, r6, r7, lr} +100043d2: 4647 mov r7, r8 +100043d4: 46ce mov lr, r9 +100043d6: b580 push {r7, lr} +100043d8: 1e0f subs r7, r1, #0 +100043da: d019 beq.n 10004410 +100043dc: 2314 movs r3, #20 +100043de: 4699 mov r9, r3 +100043e0: 3304 adds r3, #4 +100043e2: 0004 movs r4, r0 +100043e4: 2500 movs r5, #0 +100043e6: 2601 movs r6, #1 +100043e8: 4698 mov r8, r3 +100043ea: 464b mov r3, r9 +100043ec: 8818 ldrh r0, [r3, #0] +100043ee: 4643 mov r3, r8 +100043f0: 6821 ldr r1, [r4, #0] +100043f2: 881b ldrh r3, [r3, #0] +100043f4: 4798 blx r3 +100043f6: c401 stmia r4!, {r0} +100043f8: 1e43 subs r3, r0, #1 +100043fa: 4198 sbcs r0, r3 +100043fc: 3501 adds r5, #1 +100043fe: 4240 negs r0, r0 +10004400: 4006 ands r6, r0 +10004402: 42af cmp r7, r5 +10004404: d1f1 bne.n 100043ea +10004406: 0030 movs r0, r6 +10004408: bcc0 pop {r6, r7} +1000440a: 46b9 mov r9, r7 +1000440c: 46b0 mov r8, r6 +1000440e: bdf8 pop {r3, r4, r5, r6, r7, pc} +10004410: 2601 movs r6, #1 +10004412: e7f8 b.n 10004406 + +10004414 <__wrap___aeabi_idiv>: +10004414: 4a12 ldr r2, [pc, #72] @ (10004460 ) +10004416: 6f93 ldr r3, [r2, #120] @ 0x78 +10004418: 089b lsrs r3, r3, #2 +1000441a: d215 bcs.n 10004448 + +1000441c : +1000441c: 6690 str r0, [r2, #104] @ 0x68 +1000441e: 66d1 str r1, [r2, #108] @ 0x6c +10004420: 2900 cmp r1, #0 +10004422: d005 beq.n 10004430 +10004424: e7ff b.n 10004426 +10004426: e7ff b.n 10004428 +10004428: e7ff b.n 1000442a +1000442a: 6f51 ldr r1, [r2, #116] @ 0x74 +1000442c: 6f10 ldr r0, [r2, #112] @ 0x70 +1000442e: 4770 bx lr +10004430: b504 push {r2, lr} +10004432: 2180 movs r1, #128 @ 0x80 +10004434: 0609 lsls r1, r1, #24 +10004436: 17c2 asrs r2, r0, #31 +10004438: 4051 eors r1, r2 +1000443a: 2800 cmp r0, #0 +1000443c: d000 beq.n 10004440 +1000443e: 43c8 mvns r0, r1 +10004440: f003 fbb6 bl 10007bb0 <____aeabi_idiv0_veneer> +10004444: 2100 movs r1, #0 +10004446: bd04 pop {r2, pc} + +10004448 : +10004448: b5f0 push {r4, r5, r6, r7, lr} +1000444a: 6e14 ldr r4, [r2, #96] @ 0x60 +1000444c: 6e55 ldr r5, [r2, #100] @ 0x64 +1000444e: 6f57 ldr r7, [r2, #116] @ 0x74 +10004450: 6f16 ldr r6, [r2, #112] @ 0x70 +10004452: f7ff ffe3 bl 1000441c +10004456: 6614 str r4, [r2, #96] @ 0x60 +10004458: 6655 str r5, [r2, #100] @ 0x64 +1000445a: 6757 str r7, [r2, #116] @ 0x74 +1000445c: 6716 str r6, [r2, #112] @ 0x70 +1000445e: bdf0 pop {r4, r5, r6, r7, pc} +10004460: d0000000 .word 0xd0000000 + +10004464 <__wrap___aeabi_uidiv>: +10004464: 4a11 ldr r2, [pc, #68] @ (100044ac ) +10004466: 6f93 ldr r3, [r2, #120] @ 0x78 +10004468: 089b lsrs r3, r3, #2 +1000446a: d213 bcs.n 10004494 + +1000446c : +1000446c: 6610 str r0, [r2, #96] @ 0x60 +1000446e: 6651 str r1, [r2, #100] @ 0x64 +10004470: 2900 cmp r1, #0 +10004472: d005 beq.n 10004480 +10004474: e7ff b.n 10004476 +10004476: e7ff b.n 10004478 +10004478: e7ff b.n 1000447a +1000447a: 6f51 ldr r1, [r2, #116] @ 0x74 +1000447c: 6f10 ldr r0, [r2, #112] @ 0x70 +1000447e: 4770 bx lr +10004480: b504 push {r2, lr} +10004482: 2800 cmp r0, #0 +10004484: d001 beq.n 1000448a +10004486: 2000 movs r0, #0 +10004488: 43c0 mvns r0, r0 +1000448a: f003 fb91 bl 10007bb0 <____aeabi_idiv0_veneer> +1000448e: 2100 movs r1, #0 +10004490: bd04 pop {r2, pc} +10004492: 46c0 nop @ (mov r8, r8) + +10004494 : +10004494: b5f0 push {r4, r5, r6, r7, lr} +10004496: 6e14 ldr r4, [r2, #96] @ 0x60 +10004498: 6e55 ldr r5, [r2, #100] @ 0x64 +1000449a: 6f57 ldr r7, [r2, #116] @ 0x74 +1000449c: 6f16 ldr r6, [r2, #112] @ 0x70 +1000449e: f7ff ffe5 bl 1000446c +100044a2: 6614 str r4, [r2, #96] @ 0x60 +100044a4: 6655 str r5, [r2, #100] @ 0x64 +100044a6: 6757 str r7, [r2, #116] @ 0x74 +100044a8: 6716 str r6, [r2, #112] @ 0x70 +100044aa: bdf0 pop {r4, r5, r6, r7, pc} +100044ac: d0000000 .word 0xd0000000 + +100044b0 <__wrap___aeabi_ldivmod>: +100044b0: 4694 mov ip, r2 +100044b2: 4a4a ldr r2, [pc, #296] @ (100045dc ) +100044b4: 6f92 ldr r2, [r2, #120] @ 0x78 +100044b6: 0892 lsrs r2, r2, #2 +100044b8: 4662 mov r2, ip +100044ba: d201 bcs.n 100044c0 +100044bc: e028 b.n 10004510 +100044be: 46c0 nop @ (mov r8, r8) + +100044c0 : +100044c0: b5f0 push {r4, r5, r6, r7, lr} +100044c2: 4e46 ldr r6, [pc, #280] @ (100045dc ) +100044c4: 6e34 ldr r4, [r6, #96] @ 0x60 +100044c6: 6e75 ldr r5, [r6, #100] @ 0x64 +100044c8: 6f77 ldr r7, [r6, #116] @ 0x74 +100044ca: 6f36 ldr r6, [r6, #112] @ 0x70 +100044cc: f000 f820 bl 10004510 +100044d0: 4694 mov ip, r2 +100044d2: 4a42 ldr r2, [pc, #264] @ (100045dc ) +100044d4: 6614 str r4, [r2, #96] @ 0x60 +100044d6: 6655 str r5, [r2, #100] @ 0x64 +100044d8: 6757 str r7, [r2, #116] @ 0x74 +100044da: 6716 str r6, [r2, #112] @ 0x70 +100044dc: 4662 mov r2, ip +100044de: bdf0 pop {r4, r5, r6, r7, pc} + +100044e0 <__wrap___aeabi_uldivmod>: +100044e0: 4694 mov ip, r2 +100044e2: 4a3e ldr r2, [pc, #248] @ (100045dc ) +100044e4: 6f92 ldr r2, [r2, #120] @ 0x78 +100044e6: 0892 lsrs r2, r2, #2 +100044e8: 4662 mov r2, ip +100044ea: d201 bcs.n 100044f0 +100044ec: e054 b.n 10004598 +100044ee: 46c0 nop @ (mov r8, r8) + +100044f0 : +100044f0: b5f0 push {r4, r5, r6, r7, lr} +100044f2: 4e3a ldr r6, [pc, #232] @ (100045dc ) +100044f4: 6e34 ldr r4, [r6, #96] @ 0x60 +100044f6: 6e75 ldr r5, [r6, #100] @ 0x64 +100044f8: 6f77 ldr r7, [r6, #116] @ 0x74 +100044fa: 6f36 ldr r6, [r6, #112] @ 0x70 +100044fc: f000 f84c bl 10004598 +10004500: 4694 mov ip, r2 +10004502: 4a36 ldr r2, [pc, #216] @ (100045dc ) +10004504: 6614 str r4, [r2, #96] @ 0x60 +10004506: 6655 str r5, [r2, #100] @ 0x64 +10004508: 6757 str r7, [r2, #116] @ 0x74 +1000450a: 6716 str r6, [r2, #112] @ 0x70 +1000450c: 4662 mov r2, ip +1000450e: bdf0 pop {r4, r5, r6, r7, pc} + +10004510 : +10004510: 2b00 cmp r3, #0 +10004512: db24 blt.n 1000455e +10004514: d011 beq.n 1000453a +10004516: 2900 cmp r1, #0 +10004518: da3e bge.n 10004598 +1000451a: b500 push {lr} +1000451c: 43c9 mvns r1, r1 +1000451e: 4240 negs r0, r0 +10004520: d100 bne.n 10004524 +10004522: 3101 adds r1, #1 + +10004524 : +10004524: f000 f838 bl 10004598 +10004528: 43c9 mvns r1, r1 +1000452a: 4240 negs r0, r0 +1000452c: d100 bne.n 10004530 +1000452e: 3101 adds r1, #1 + +10004530 : +10004530: 43db mvns r3, r3 +10004532: 4252 negs r2, r2 +10004534: d100 bne.n 10004538 +10004536: 3301 adds r3, #1 + +10004538 : +10004538: bd00 pop {pc} +1000453a: 2a00 cmp r2, #0 +1000453c: d1eb bne.n 10004516 +1000453e: 2800 cmp r0, #0 +10004540: d101 bne.n 10004546 +10004542: 2900 cmp r1, #0 +10004544: d005 beq.n 10004552 +10004546: 2000 movs r0, #0 +10004548: 0fc9 lsrs r1, r1, #31 +1000454a: 07c9 lsls r1, r1, #31 +1000454c: d101 bne.n 10004552 +1000454e: 43c0 mvns r0, r0 +10004550: 0841 lsrs r1, r0, #1 +10004552: b500 push {lr} +10004554: f003 fb24 bl 10007ba0 <____aeabi_ldiv0_veneer> +10004558: 2200 movs r2, #0 +1000455a: 2300 movs r3, #0 +1000455c: bd00 pop {pc} +1000455e: b500 push {lr} +10004560: 2900 cmp r1, #0 +10004562: db0a blt.n 1000457a +10004564: 43db mvns r3, r3 +10004566: 4252 negs r2, r2 +10004568: d100 bne.n 1000456c +1000456a: 3301 adds r3, #1 + +1000456c : +1000456c: f000 f814 bl 10004598 +10004570: 43c9 mvns r1, r1 +10004572: 4240 negs r0, r0 +10004574: d100 bne.n 10004578 +10004576: 3101 adds r1, #1 + +10004578 : +10004578: bd00 pop {pc} +1000457a: 43c9 mvns r1, r1 +1000457c: 4240 negs r0, r0 +1000457e: d100 bne.n 10004582 +10004580: 3101 adds r1, #1 + +10004582 : +10004582: 43db mvns r3, r3 +10004584: 4252 negs r2, r2 +10004586: d100 bne.n 1000458a +10004588: 3301 adds r3, #1 + +1000458a : +1000458a: f000 f805 bl 10004598 +1000458e: 43db mvns r3, r3 +10004590: 4252 negs r2, r2 +10004592: d100 bne.n 10004596 +10004594: 3301 adds r3, #1 + +10004596 : +10004596: bd00 pop {pc} + +10004598 : +10004598: 2900 cmp r1, #0 +1000459a: d123 bne.n 100045e4 +1000459c: 2b00 cmp r3, #0 +1000459e: d118 bne.n 100045d2 +100045a0: 2a00 cmp r2, #0 +100045a2: d00c beq.n 100045be +100045a4: 46bc mov ip, r7 +100045a6: 4f0d ldr r7, [pc, #52] @ (100045dc ) +100045a8: 6638 str r0, [r7, #96] @ 0x60 +100045aa: 667a str r2, [r7, #100] @ 0x64 +100045ac: 2100 movs r1, #0 +100045ae: 2300 movs r3, #0 +100045b0: e7ff b.n 100045b2 +100045b2: e7ff b.n 100045b4 +100045b4: e7ff b.n 100045b6 +100045b6: 6f7a ldr r2, [r7, #116] @ 0x74 +100045b8: 6f38 ldr r0, [r7, #112] @ 0x70 +100045ba: 4667 mov r7, ip +100045bc: 4770 bx lr +100045be: 2800 cmp r0, #0 +100045c0: d001 beq.n 100045c6 + +100045c2 : +100045c2: 4807 ldr r0, [pc, #28] @ (100045e0 ) +100045c4: 0001 movs r1, r0 +100045c6: b500 push {lr} +100045c8: f003 faea bl 10007ba0 <____aeabi_ldiv0_veneer> +100045cc: 2200 movs r2, #0 +100045ce: 2300 movs r3, #0 +100045d0: bd00 pop {pc} +100045d2: 0002 movs r2, r0 +100045d4: 000b movs r3, r1 +100045d6: 2000 movs r0, #0 +100045d8: 2100 movs r1, #0 +100045da: 4770 bx lr +100045dc: d0000000 .word 0xd0000000 +100045e0: ffffffff .word 0xffffffff + +100045e4 : +100045e4: 2b00 cmp r3, #0 +100045e6: d000 beq.n 100045ea +100045e8: e0bf b.n 1000476a +100045ea: 0c13 lsrs r3, r2, #16 +100045ec: d128 bne.n 10004640 +100045ee: 2a00 cmp r2, #0 +100045f0: d0e7 beq.n 100045c2 +100045f2: b480 push {r7} +100045f4: 4f11 ldr r7, [pc, #68] @ (1000463c ) +100045f6: 6639 str r1, [r7, #96] @ 0x60 +100045f8: 667a str r2, [r7, #100] @ 0x64 +100045fa: e7ff b.n 100045fc +100045fc: e7ff b.n 100045fe +100045fe: b430 push {r4, r5} +10004600: 0c04 lsrs r4, r0, #16 +10004602: 6f7b ldr r3, [r7, #116] @ 0x74 +10004604: 6f39 ldr r1, [r7, #112] @ 0x70 +10004606: 041b lsls r3, r3, #16 +10004608: 4323 orrs r3, r4 +1000460a: 663b str r3, [r7, #96] @ 0x60 +1000460c: 667a str r2, [r7, #100] @ 0x64 +1000460e: e7ff b.n 10004610 +10004610: e7ff b.n 10004612 +10004612: e7ff b.n 10004614 +10004614: 46c0 nop @ (mov r8, r8) +10004616: b284 uxth r4, r0 +10004618: 6f7b ldr r3, [r7, #116] @ 0x74 +1000461a: 6f3d ldr r5, [r7, #112] @ 0x70 +1000461c: 041b lsls r3, r3, #16 +1000461e: 4323 orrs r3, r4 +10004620: 663b str r3, [r7, #96] @ 0x60 +10004622: 667a str r2, [r7, #100] @ 0x64 +10004624: e7ff b.n 10004626 +10004626: e7ff b.n 10004628 +10004628: 46c0 nop @ (mov r8, r8) +1000462a: 2300 movs r3, #0 +1000462c: 042c lsls r4, r5, #16 +1000462e: 0c2d lsrs r5, r5, #16 +10004630: 6f7a ldr r2, [r7, #116] @ 0x74 +10004632: 6f38 ldr r0, [r7, #112] @ 0x70 +10004634: 1900 adds r0, r0, r4 +10004636: 4169 adcs r1, r5 +10004638: bcb0 pop {r4, r5, r7} +1000463a: 4770 bx lr +1000463c: d0000000 .word 0xd0000000 + +10004640 : +10004640: b5f0 push {r4, r5, r6, r7, lr} +10004642: 4694 mov ip, r2 +10004644: 2500 movs r5, #0 +10004646: 0e14 lsrs r4, r2, #24 +10004648: d101 bne.n 1000464e +1000464a: 0212 lsls r2, r2, #8 +1000464c: 3508 adds r5, #8 +1000464e: 0f14 lsrs r4, r2, #28 +10004650: d101 bne.n 10004656 +10004652: 0112 lsls r2, r2, #4 +10004654: 3504 adds r5, #4 +10004656: 0f94 lsrs r4, r2, #30 +10004658: d101 bne.n 1000465e +1000465a: 0092 lsls r2, r2, #2 +1000465c: 3502 adds r5, #2 +1000465e: 0fd4 lsrs r4, r2, #31 +10004660: d101 bne.n 10004666 +10004662: 0052 lsls r2, r2, #1 +10004664: 3501 adds r5, #1 +10004666: 0bd4 lsrs r4, r2, #15 +10004668: 3401 adds r4, #1 +1000466a: 4f25 ldr r7, [pc, #148] @ (10004700 ) +1000466c: 667c str r4, [r7, #100] @ 0x64 +1000466e: 4c25 ldr r4, [pc, #148] @ (10004704 ) +10004670: 663c str r4, [r7, #96] @ 0x60 +10004672: 0c0e lsrs r6, r1, #16 +10004674: b293 uxth r3, r2 +10004676: e7ff b.n 10004678 +10004678: e7ff b.n 1000467a +1000467a: e7ff b.n 1000467c +1000467c: 6f3c ldr r4, [r7, #112] @ 0x70 +1000467e: 4366 muls r6, r4 +10004680: 0c36 lsrs r6, r6, #16 +10004682: 0377 lsls r7, r6, #13 +10004684: 46be mov lr, r7 +10004686: 4373 muls r3, r6 +10004688: 0bdf lsrs r7, r3, #15 +1000468a: 045b lsls r3, r3, #17 +1000468c: 1ac0 subs r0, r0, r3 +1000468e: 41b9 sbcs r1, r7 +10004690: 0c13 lsrs r3, r2, #16 +10004692: 4373 muls r3, r6 +10004694: 18db adds r3, r3, r3 +10004696: 1ac9 subs r1, r1, r3 +10004698: 08ce lsrs r6, r1, #3 +1000469a: 4366 muls r6, r4 +1000469c: 0c36 lsrs r6, r6, #16 +1000469e: 44b6 add lr, r6 +100046a0: b293 uxth r3, r2 +100046a2: 4373 muls r3, r6 +100046a4: 0f1f lsrs r7, r3, #28 +100046a6: 011b lsls r3, r3, #4 +100046a8: 1ac0 subs r0, r0, r3 +100046aa: 41b9 sbcs r1, r7 +100046ac: 0c13 lsrs r3, r2, #16 +100046ae: 4373 muls r3, r6 +100046b0: 0b1f lsrs r7, r3, #12 +100046b2: 051b lsls r3, r3, #20 +100046b4: 1ac0 subs r0, r0, r3 +100046b6: 41b9 sbcs r1, r7 +100046b8: 0d86 lsrs r6, r0, #22 +100046ba: 028f lsls r7, r1, #10 +100046bc: 433e orrs r6, r7 +100046be: 4366 muls r6, r4 +100046c0: 0c36 lsrs r6, r6, #16 +100046c2: 2d09 cmp r5, #9 +100046c4: db24 blt.n 10004710 +100046c6: 0a52 lsrs r2, r2, #9 +100046c8: 4372 muls r2, r6 +100046ca: 1a80 subs r0, r0, r2 +100046cc: 0377 lsls r7, r6, #13 +100046ce: 0a46 lsrs r6, r0, #9 +100046d0: 4366 muls r6, r4 +100046d2: 0c36 lsrs r6, r6, #16 +100046d4: 2316 movs r3, #22 +100046d6: 1b5b subs r3, r3, r5 +100046d8: 40de lsrs r6, r3 +100046da: 40df lsrs r7, r3 +100046dc: 19bf adds r7, r7, r6 +100046de: 4664 mov r4, ip +100046e0: 4366 muls r6, r4 +100046e2: 1b82 subs r2, r0, r6 +100046e4: 4670 mov r0, lr +100046e6: 3504 adds r5, #4 +100046e8: 3306 adds r3, #6 +100046ea: 0001 movs r1, r0 +100046ec: 40d9 lsrs r1, r3 +100046ee: 40a8 lsls r0, r5 +100046f0: 19c0 adds r0, r0, r7 +100046f2: d300 bcc.n 100046f6 +100046f4: 3101 adds r1, #1 +100046f6: 42a2 cmp r2, r4 +100046f8: d206 bcs.n 10004708 +100046fa: 2300 movs r3, #0 +100046fc: bdf0 pop {r4, r5, r6, r7, pc} +100046fe: 0000 .short 0x0000 +10004700: d0000000 .word 0xd0000000 +10004704: ffffffff .word 0xffffffff +10004708: 1b12 subs r2, r2, r4 +1000470a: 3001 adds r0, #1 +1000470c: d3f3 bcc.n 100046f6 +1000470e: e7f1 b.n 100046f4 + +10004710 : +10004710: 2709 movs r7, #9 +10004712: 1b7f subs r7, r7, r5 +10004714: 40fe lsrs r6, r7 +10004716: 4664 mov r4, ip +10004718: b2a2 uxth r2, r4 +1000471a: 4372 muls r2, r6 +1000471c: 1a80 subs r0, r0, r2 +1000471e: d200 bcs.n 10004722 +10004720: 3901 subs r1, #1 +10004722: 0c22 lsrs r2, r4, #16 +10004724: 4372 muls r2, r6 +10004726: 0c13 lsrs r3, r2, #16 +10004728: 0412 lsls r2, r2, #16 +1000472a: 1a82 subs r2, r0, r2 +1000472c: 4199 sbcs r1, r3 +1000472e: 000b movs r3, r1 +10004730: 4670 mov r0, lr +10004732: 3504 adds r5, #4 +10004734: 3713 adds r7, #19 +10004736: 0001 movs r1, r0 +10004738: 40f9 lsrs r1, r7 +1000473a: 40a8 lsls r0, r5 +1000473c: 1980 adds r0, r0, r6 +1000473e: d300 bcc.n 10004742 +10004740: 3101 adds r1, #1 +10004742: 2b00 cmp r3, #0 +10004744: d102 bne.n 1000474c +10004746: 42a2 cmp r2, r4 +10004748: d20a bcs.n 10004760 +1000474a: bdf0 pop {r4, r5, r6, r7, pc} +1000474c: 3001 adds r0, #1 +1000474e: d300 bcc.n 10004752 +10004750: 3101 adds r1, #1 +10004752: 1b12 subs r2, r2, r4 +10004754: d2fa bcs.n 1000474c +10004756: 3b01 subs r3, #1 +10004758: d1f8 bne.n 1000474c +1000475a: 42a2 cmp r2, r4 +1000475c: d200 bcs.n 10004760 +1000475e: bdf0 pop {r4, r5, r6, r7, pc} +10004760: 3001 adds r0, #1 +10004762: d300 bcc.n 10004766 +10004764: 3101 adds r1, #1 +10004766: 1b12 subs r2, r2, r4 +10004768: e7f7 b.n 1000475a + +1000476a : +1000476a: b5f0 push {r4, r5, r6, r7, lr} +1000476c: 0c1c lsrs r4, r3, #16 +1000476e: d000 beq.n 10004772 +10004770: e080 b.n 10004874 +10004772: b40c push {r2, r3} +10004774: 2500 movs r5, #0 +10004776: 0a1c lsrs r4, r3, #8 +10004778: d104 bne.n 10004784 +1000477a: 021b lsls r3, r3, #8 +1000477c: 0e16 lsrs r6, r2, #24 +1000477e: 4333 orrs r3, r6 +10004780: 0212 lsls r2, r2, #8 +10004782: 3508 adds r5, #8 +10004784: 0b1c lsrs r4, r3, #12 +10004786: d104 bne.n 10004792 +10004788: 011b lsls r3, r3, #4 +1000478a: 0f16 lsrs r6, r2, #28 +1000478c: 4333 orrs r3, r6 +1000478e: 0112 lsls r2, r2, #4 +10004790: 3504 adds r5, #4 +10004792: 0b9c lsrs r4, r3, #14 +10004794: d104 bne.n 100047a0 +10004796: 009b lsls r3, r3, #2 +10004798: 0f96 lsrs r6, r2, #30 +1000479a: 4333 orrs r3, r6 +1000479c: 0092 lsls r2, r2, #2 +1000479e: 3502 adds r5, #2 +100047a0: 0bdc lsrs r4, r3, #15 +100047a2: d102 bne.n 100047aa +100047a4: 1892 adds r2, r2, r2 +100047a6: 415b adcs r3, r3 +100047a8: 3501 adds r5, #1 +100047aa: 001c movs r4, r3 +100047ac: 1897 adds r7, r2, r2 +100047ae: 4164 adcs r4, r4 +100047b0: 3401 adds r4, #1 +100047b2: 4f46 ldr r7, [pc, #280] @ (100048cc ) +100047b4: 667c str r4, [r7, #100] @ 0x64 +100047b6: 4c46 ldr r4, [pc, #280] @ (100048d0 ) +100047b8: 663c str r4, [r7, #96] @ 0x60 +100047ba: 0c0e lsrs r6, r1, #16 +100047bc: e7ff b.n 100047be +100047be: e7ff b.n 100047c0 +100047c0: e7ff b.n 100047c2 +100047c2: 46c0 nop @ (mov r8, r8) +100047c4: 6f3c ldr r4, [r7, #112] @ 0x70 +100047c6: 4366 muls r6, r4 +100047c8: 0c36 lsrs r6, r6, #16 +100047ca: 0377 lsls r7, r6, #13 +100047cc: 46be mov lr, r7 +100047ce: b297 uxth r7, r2 +100047d0: 4377 muls r7, r6 +100047d2: 1bc0 subs r0, r0, r7 +100047d4: d200 bcs.n 100047d8 +100047d6: 3901 subs r1, #1 +100047d8: 1bc0 subs r0, r0, r7 +100047da: d200 bcs.n 100047de +100047dc: 3901 subs r1, #1 +100047de: b29f uxth r7, r3 +100047e0: 4377 muls r7, r6 +100047e2: 1bc9 subs r1, r1, r7 +100047e4: 1bc9 subs r1, r1, r7 +100047e6: 0c17 lsrs r7, r2, #16 +100047e8: 4377 muls r7, r6 +100047ea: 047e lsls r6, r7, #17 +100047ec: 0bff lsrs r7, r7, #15 +100047ee: 1b80 subs r0, r0, r6 +100047f0: 41b9 sbcs r1, r7 +100047f2: 08ce lsrs r6, r1, #3 +100047f4: 4366 muls r6, r4 +100047f6: 0c36 lsrs r6, r6, #16 +100047f8: 2d0c cmp r5, #12 +100047fa: db33 blt.n 10004864 +100047fc: 44b6 add lr, r6 +100047fe: 0b12 lsrs r2, r2, #12 +10004800: 051f lsls r7, r3, #20 +10004802: 433a orrs r2, r7 +10004804: 0b1b lsrs r3, r3, #12 +10004806: b297 uxth r7, r2 +10004808: 4377 muls r7, r6 +1000480a: 1bc0 subs r0, r0, r7 +1000480c: d200 bcs.n 10004810 +1000480e: 3901 subs r1, #1 +10004810: b29f uxth r7, r3 +10004812: 4377 muls r7, r6 +10004814: 1bc9 subs r1, r1, r7 +10004816: 0c17 lsrs r7, r2, #16 +10004818: 4377 muls r7, r6 +1000481a: 043e lsls r6, r7, #16 +1000481c: 0c3f lsrs r7, r7, #16 +1000481e: 1b80 subs r0, r0, r6 +10004820: 41b9 sbcs r1, r7 +10004822: 0d86 lsrs r6, r0, #22 +10004824: 028f lsls r7, r1, #10 +10004826: 433e orrs r6, r7 +10004828: 4366 muls r6, r4 +1000482a: 2729 movs r7, #41 @ 0x29 +1000482c: 1b7f subs r7, r7, r5 +1000482e: 40fe lsrs r6, r7 +10004830: 3d0c subs r5, #12 +10004832: 4677 mov r7, lr +10004834: 40af lsls r7, r5 +10004836: 19bf adds r7, r7, r6 +10004838: bc30 pop {r4, r5} +1000483a: b2a2 uxth r2, r4 +1000483c: b2ab uxth r3, r5 +1000483e: 4372 muls r2, r6 +10004840: 4373 muls r3, r6 +10004842: 1a80 subs r0, r0, r2 +10004844: 4199 sbcs r1, r3 +10004846: 0c22 lsrs r2, r4, #16 +10004848: 4372 muls r2, r6 +1000484a: 0c13 lsrs r3, r2, #16 +1000484c: 0412 lsls r2, r2, #16 +1000484e: 1a80 subs r0, r0, r2 +10004850: 4199 sbcs r1, r3 +10004852: 0002 movs r2, r0 +10004854: 000b movs r3, r1 +10004856: 3701 adds r7, #1 +10004858: 1b00 subs r0, r0, r4 +1000485a: 41a9 sbcs r1, r5 +1000485c: d2f9 bcs.n 10004852 +1000485e: 1e78 subs r0, r7, #1 +10004860: 2100 movs r1, #0 +10004862: bdf0 pop {r4, r5, r6, r7, pc} + +10004864 : +10004864: 270c movs r7, #12 +10004866: 1b7f subs r7, r7, r5 +10004868: 40fe lsrs r6, r7 +1000486a: 4677 mov r7, lr +1000486c: 0b7f lsrs r7, r7, #13 +1000486e: 40af lsls r7, r5 +10004870: 19ff adds r7, r7, r7 +10004872: e7e0 b.n 10004836 + +10004874 : +10004874: 2400 movs r4, #0 +10004876: 1c5d adds r5, r3, #1 +10004878: d007 beq.n 1000488a +1000487a: 4f14 ldr r7, [pc, #80] @ (100048cc ) +1000487c: 667d str r5, [r7, #100] @ 0x64 +1000487e: 6639 str r1, [r7, #96] @ 0x60 +10004880: e7ff b.n 10004882 +10004882: e7ff b.n 10004884 +10004884: e7ff b.n 10004886 +10004886: e7ff b.n 10004888 +10004888: 6f3c ldr r4, [r7, #112] @ 0x70 +1000488a: b295 uxth r5, r2 +1000488c: b29e uxth r6, r3 +1000488e: 4365 muls r5, r4 +10004890: 4366 muls r6, r4 +10004892: 1b40 subs r0, r0, r5 +10004894: 41b1 sbcs r1, r6 +10004896: 0c15 lsrs r5, r2, #16 +10004898: 0c1e lsrs r6, r3, #16 +1000489a: 4365 muls r5, r4 +1000489c: 4366 muls r6, r4 +1000489e: 0436 lsls r6, r6, #16 +100048a0: 0c2f lsrs r7, r5, #16 +100048a2: 433e orrs r6, r7 +100048a4: 042d lsls r5, r5, #16 +100048a6: 1b40 subs r0, r0, r5 +100048a8: 41b1 sbcs r1, r6 +100048aa: 4299 cmp r1, r3 +100048ac: d204 bcs.n 100048b8 +100048ae: 0002 movs r2, r0 +100048b0: 000b movs r3, r1 +100048b2: 0020 movs r0, r4 +100048b4: 2100 movs r1, #0 +100048b6: bdf0 pop {r4, r5, r6, r7, pc} +100048b8: d101 bne.n 100048be +100048ba: 4290 cmp r0, r2 +100048bc: d3f7 bcc.n 100048ae +100048be: 1a80 subs r0, r0, r2 +100048c0: 4199 sbcs r1, r3 +100048c2: 3401 adds r4, #1 +100048c4: 4299 cmp r1, r3 +100048c6: d3f2 bcc.n 100048ae +100048c8: e7f6 b.n 100048b8 +100048ca: 0000 .short 0x0000 +100048cc: d0000000 .word 0xd0000000 +100048d0: ffffffff .word 0xffffffff + +100048d4 <__wrap___aeabi_drsub>: +100048d4: 4048 eors r0, r1 +100048d6: 4041 eors r1, r0 +100048d8: 4048 eors r0, r1 + +100048da <__wrap___aeabi_dsub>: +100048da: b418 push {r3, r4} +100048dc: 4b1b ldr r3, [pc, #108] @ (1000494c <__wrap___aeabi_dmul+0x12>) +100048de: 685b ldr r3, [r3, #4] +100048e0: 46fc mov ip, pc +100048e2: 9301 str r3, [sp, #4] +100048e4: bd08 pop {r3, pc} +100048e6: df04 .short 0xdf04 +100048e8: 10004b67 .word 0x10004b67 + +100048ec <__wrap___aeabi_dadd>: +100048ec: b418 push {r3, r4} +100048ee: 4b17 ldr r3, [pc, #92] @ (1000494c <__wrap___aeabi_dmul+0x12>) +100048f0: 681b ldr r3, [r3, #0] +100048f2: 46fc mov ip, pc +100048f4: 9301 str r3, [sp, #4] +100048f6: bd08 pop {r3, pc} +100048f8: 4b71df00 .word 0x4b71df00 +100048fc: 1000 .short 0x1000 + +100048fe <__wrap___aeabi_ddiv>: +100048fe: 4694 mov ip, r2 +10004900: 4a13 ldr r2, [pc, #76] @ (10004950 <__wrap___aeabi_dmul+0x16>) +10004902: 6f92 ldr r2, [r2, #120] @ 0x78 +10004904: 0892 lsrs r2, r2, #2 +10004906: d209 bcs.n 1000491c +10004908: 4662 mov r2, ip + +1000490a : +1000490a: b418 push {r3, r4} +1000490c: 4b0f ldr r3, [pc, #60] @ (1000494c <__wrap___aeabi_dmul+0x12>) +1000490e: 68db ldr r3, [r3, #12] +10004910: 46fc mov ip, pc +10004912: 9301 str r3, [sp, #4] +10004914: bd08 pop {r3, pc} +10004916: df0c .short 0xdf0c +10004918: 10004e29 .word 0x10004e29 + +1000491c : +1000491c: 4a0c ldr r2, [pc, #48] @ (10004950 <__wrap___aeabi_dmul+0x16>) +1000491e: b5f0 push {r4, r5, r6, r7, lr} +10004920: 6e14 ldr r4, [r2, #96] @ 0x60 +10004922: 6e55 ldr r5, [r2, #100] @ 0x64 +10004924: 6f57 ldr r7, [r2, #116] @ 0x74 +10004926: 6f16 ldr r6, [r2, #112] @ 0x70 +10004928: 4662 mov r2, ip +1000492a: f7ff ffee bl 1000490a +1000492e: 4a08 ldr r2, [pc, #32] @ (10004950 <__wrap___aeabi_dmul+0x16>) +10004930: 6614 str r4, [r2, #96] @ 0x60 +10004932: 6655 str r5, [r2, #100] @ 0x64 +10004934: 6757 str r7, [r2, #116] @ 0x74 +10004936: 6716 str r6, [r2, #112] @ 0x70 +10004938: bdf0 pop {r4, r5, r6, r7, pc} + +1000493a <__wrap___aeabi_dmul>: +1000493a: b418 push {r3, r4} +1000493c: 4b03 ldr r3, [pc, #12] @ (1000494c <__wrap___aeabi_dmul+0x12>) +1000493e: 689b ldr r3, [r3, #8] +10004940: 46fc mov ip, pc +10004942: 9301 str r3, [sp, #4] +10004944: bd08 pop {r3, pc} +10004946: df08 .short 0xdf08 +10004948: 10004ccd .word 0x10004ccd +1000494c: 200010f0 .word 0x200010f0 +10004950: d0000000 .word 0xd0000000 + +10004954 <__wrap___aeabi_cdrcmple>: +10004954: b5ff push {r0, r1, r2, r3, r4, r5, r6, r7, lr} +10004956: 4050 eors r0, r2 +10004958: 4042 eors r2, r0 +1000495a: 4050 eors r0, r2 +1000495c: 4059 eors r1, r3 +1000495e: 404b eors r3, r1 +10004960: 4059 eors r1, r3 +10004962: e000 b.n 10004966 <__aeabi_dfcmple_guts> + +10004964 <__wrap___aeabi_cdcmpeq>: +10004964: b5ff push {r0, r1, r2, r3, r4, r5, r6, r7, lr} + +10004966 <__aeabi_dfcmple_guts>: +10004966: 4f15 ldr r7, [pc, #84] @ (100049bc <__aeabi_dfcmple_guts+0x56>) +10004968: 004c lsls r4, r1, #1 +1000496a: 0d64 lsrs r4, r4, #21 +1000496c: d003 beq.n 10004976 <__aeabi_dfcmple_guts+0x10> +1000496e: 42bc cmp r4, r7 +10004970: d104 bne.n 1000497c <__aeabi_dfcmple_guts+0x16> +10004972: 030c lsls r4, r1, #12 +10004974: d814 bhi.n 100049a0 <__aeabi_dfcmple_guts+0x3a> +10004976: 2000 movs r0, #0 +10004978: 0d09 lsrs r1, r1, #20 +1000497a: 0509 lsls r1, r1, #20 +1000497c: 005c lsls r4, r3, #1 +1000497e: 0d64 lsrs r4, r4, #21 +10004980: d003 beq.n 1000498a <__aeabi_dfcmple_guts+0x24> +10004982: 42bc cmp r4, r7 +10004984: d104 bne.n 10004990 <__aeabi_dfcmple_guts+0x2a> +10004986: 031c lsls r4, r3, #12 +10004988: d80a bhi.n 100049a0 <__aeabi_dfcmple_guts+0x3a> +1000498a: 2200 movs r2, #0 +1000498c: 0d1b lsrs r3, r3, #20 +1000498e: 051b lsls r3, r3, #20 +10004990: 2601 movs r6, #1 +10004992: 404b eors r3, r1 +10004994: d409 bmi.n 100049aa <__aeabi_dfcmple_guts+0x44> +10004996: 404b eors r3, r1 +10004998: d503 bpl.n 100049a2 <__aeabi_dfcmple_guts+0x3c> +1000499a: 428b cmp r3, r1 +1000499c: d100 bne.n 100049a0 <__aeabi_dfcmple_guts+0x3a> +1000499e: 4282 cmp r2, r0 +100049a0: bdff pop {r0, r1, r2, r3, r4, r5, r6, r7, pc} +100049a2: 4299 cmp r1, r3 +100049a4: d1fc bne.n 100049a0 <__aeabi_dfcmple_guts+0x3a> +100049a6: 4290 cmp r0, r2 +100049a8: bdff pop {r0, r1, r2, r3, r4, r5, r6, r7, pc} +100049aa: 430b orrs r3, r1 +100049ac: 18db adds r3, r3, r3 +100049ae: 4303 orrs r3, r0 +100049b0: 4313 orrs r3, r2 +100049b2: d0f5 beq.n 100049a0 <__aeabi_dfcmple_guts+0x3a> +100049b4: 43c9 mvns r1, r1 +100049b6: 1849 adds r1, r1, r1 +100049b8: bdff pop {r0, r1, r2, r3, r4, r5, r6, r7, pc} +100049ba: 0000 .short 0x0000 +100049bc: 000007ff .word 0x000007ff + +100049c0 <__wrap___aeabi_dcmplt>: +100049c0: b500 push {lr} +100049c2: f7ff ffcf bl 10004964 <__wrap___aeabi_cdcmpeq> +100049c6: 4180 sbcs r0, r0 +100049c8: bd00 pop {pc} +100049ca: 46c0 nop @ (mov r8, r8) + +100049cc <__wrap___aeabi_dcmpge>: +100049cc: b500 push {lr} +100049ce: f7ff ffc1 bl 10004954 <__wrap___aeabi_cdrcmple> +100049d2: d901 bls.n 100049d8 <__wrap___aeabi_dcmpge+0xc> +100049d4: 2000 movs r0, #0 +100049d6: bd00 pop {pc} +100049d8: 2001 movs r0, #1 +100049da: bd00 pop {pc} + +100049dc <__wrap___aeabi_dcmpgt>: +100049dc: b500 push {lr} +100049de: f7ff ffb9 bl 10004954 <__wrap___aeabi_cdrcmple> +100049e2: 4180 sbcs r0, r0 +100049e4: bd00 pop {pc} + +100049e6 <__wrap___aeabi_dcmpun>: +100049e6: 2001 movs r0, #1 +100049e8: 0540 lsls r0, r0, #21 +100049ea: 004a lsls r2, r1, #1 +100049ec: 1812 adds r2, r2, r0 +100049ee: d804 bhi.n 100049fa <__wrap___aeabi_dcmpun+0x14> +100049f0: 005a lsls r2, r3, #1 +100049f2: 1812 adds r2, r2, r0 +100049f4: d801 bhi.n 100049fa <__wrap___aeabi_dcmpun+0x14> +100049f6: 2000 movs r0, #0 +100049f8: 4770 bx lr +100049fa: 2001 movs r0, #1 +100049fc: 4770 bx lr +100049fe: 2000 movs r0, #0 +10004a00: 4770 bx lr ... -10003d60 <__wrap___aeabi_ui2d>: -10003d60: 2100 movs r1, #0 -10003d62: 2800 cmp r0, #0 -10003d64: d105 bne.n 10003d72 <__wrap___aeabi_i2d+0xa> -10003d66: 4770 bx lr - -10003d68 <__wrap___aeabi_i2d>: -10003d68: 17c1 asrs r1, r0, #31 -10003d6a: 4048 eors r0, r1 -10003d6c: 1a40 subs r0, r0, r1 -10003d6e: d0fa beq.n 10003d66 <__wrap___aeabi_ui2d+0x6> -10003d70: 07c9 lsls r1, r1, #31 -10003d72: b513 push {r0, r1, r4, lr} -10003d74: 4b06 ldr r3, [pc, #24] @ (10003d90 <__wrap___aeabi_i2d+0x28>) -10003d76: 681b ldr r3, [r3, #0] -10003d78: 4798 blx r3 -10003d7a: bc0c pop {r2, r3} -10003d7c: 1c44 adds r4, r0, #1 -10003d7e: 40a2 lsls r2, r4 -10003d80: 0510 lsls r0, r2, #20 -10003d82: 0b12 lsrs r2, r2, #12 -10003d84: 4903 ldr r1, [pc, #12] @ (10003d94 <__wrap___aeabi_i2d+0x2c>) -10003d86: 1b09 subs r1, r1, r4 -10003d88: 0509 lsls r1, r1, #20 -10003d8a: 4319 orrs r1, r3 -10003d8c: 4311 orrs r1, r2 -10003d8e: bd10 pop {r4, pc} -10003d90: 20001c48 .word 0x20001c48 -10003d94: 0000041f .word 0x0000041f - -10003d98 <__wrap___aeabi_d2iz>: -10003d98: b510 push {r4, lr} -10003d9a: 004c lsls r4, r1, #1 -10003d9c: 0d62 lsrs r2, r4, #21 -10003d9e: 2380 movs r3, #128 @ 0x80 -10003da0: 18d2 adds r2, r2, r3 -10003da2: 00db lsls r3, r3, #3 -10003da4: 1ad2 subs r2, r2, r3 -10003da6: 055b lsls r3, r3, #21 -10003da8: 2a7e cmp r2, #126 @ 0x7e -10003daa: dd10 ble.n 10003dce <__wrap___aeabi_d2iz+0x36> -10003dac: 3a9e subs r2, #158 @ 0x9e -10003dae: da13 bge.n 10003dd8 <__wrap___aeabi_d2iz+0x40> -10003db0: 17cc asrs r4, r1, #31 -10003db2: 0309 lsls r1, r1, #12 -10003db4: 0849 lsrs r1, r1, #1 -10003db6: 4319 orrs r1, r3 -10003db8: 4252 negs r2, r2 -10003dba: 40d1 lsrs r1, r2 -10003dbc: 0064 lsls r4, r4, #1 -10003dbe: 3401 adds r4, #1 -10003dc0: 3215 adds r2, #21 -10003dc2: 2a20 cmp r2, #32 -10003dc4: da05 bge.n 10003dd2 <__wrap___aeabi_d2iz+0x3a> -10003dc6: 40d0 lsrs r0, r2 -10003dc8: 4308 orrs r0, r1 -10003dca: 4360 muls r0, r4 -10003dcc: bd10 pop {r4, pc} -10003dce: 2000 movs r0, #0 -10003dd0: bd10 pop {r4, pc} -10003dd2: 4608 mov r0, r1 -10003dd4: 4360 muls r0, r4 -10003dd6: bd10 pop {r4, pc} -10003dd8: 0fc8 lsrs r0, r1, #31 -10003dda: 18c0 adds r0, r0, r3 -10003ddc: 3801 subs r0, #1 -10003dde: bd10 pop {r4, pc} - -10003de0 <__wrap___aeabi_d2uiz>: -10003de0: b418 push {r3, r4} -10003de2: 4b04 ldr r3, [pc, #16] @ (10003df4 <__wrap___aeabi_d2uiz+0x14>) -10003de4: 6a5b ldr r3, [r3, #36] @ 0x24 -10003de6: 46fc mov ip, pc -10003de8: 9301 str r3, [sp, #4] -10003dea: bd08 pop {r3, pc} -10003dec: 4335df24 .word 0x4335df24 -10003df0: 00001000 .word 0x00001000 -10003df4: 20001028 .word 0x20001028 - -10003df8 <__aeabi_double_init>: -10003df8: 2313 movs r3, #19 -10003dfa: b570 push {r4, r5, r6, lr} -10003dfc: 781d ldrb r5, [r3, #0] -10003dfe: 2d01 cmp r5, #1 -10003e00: d015 beq.n 10003e2e <__aeabi_double_init+0x36> -10003e02: dd10 ble.n 10003e26 <__aeabi_double_init+0x2e> -10003e04: 481d ldr r0, [pc, #116] @ (10003e7c <__aeabi_double_init+0x84>) -10003e06: f7ff fc89 bl 1000371c -10003e0a: 4c1d ldr r4, [pc, #116] @ (10003e80 <__aeabi_double_init+0x88>) -10003e0c: 0001 movs r1, r0 -10003e0e: 2280 movs r2, #128 @ 0x80 -10003e10: 0020 movs r0, r4 -10003e12: f000 fb5d bl 100044d0 <__wrap___aeabi_memcpy> -10003e16: 2d02 cmp r5, #2 -10003e18: d02d beq.n 10003e76 <__aeabi_double_init+0x7e> -10003e1a: 481a ldr r0, [pc, #104] @ (10003e84 <__aeabi_double_init+0x8c>) -10003e1c: f7ff fc76 bl 1000370c -10003e20: 4b19 ldr r3, [pc, #100] @ (10003e88 <__aeabi_double_init+0x90>) -10003e22: 6018 str r0, [r3, #0] -10003e24: bd70 pop {r4, r5, r6, pc} -10003e26: 4b19 ldr r3, [pc, #100] @ (10003e8c <__aeabi_double_init+0x94>) -10003e28: 4c15 ldr r4, [pc, #84] @ (10003e80 <__aeabi_double_init+0x88>) -10003e2a: 64a3 str r3, [r4, #72] @ 0x48 -10003e2c: e7f5 b.n 10003e1a <__aeabi_double_init+0x22> -10003e2e: 4b17 ldr r3, [pc, #92] @ (10003e8c <__aeabi_double_init+0x94>) -10003e30: 4c13 ldr r4, [pc, #76] @ (10003e80 <__aeabi_double_init+0x88>) -10003e32: 6023 str r3, [r4, #0] -10003e34: 6063 str r3, [r4, #4] -10003e36: 60a3 str r3, [r4, #8] -10003e38: 60e3 str r3, [r4, #12] -10003e3a: 6123 str r3, [r4, #16] -10003e3c: 6163 str r3, [r4, #20] -10003e3e: 61a3 str r3, [r4, #24] -10003e40: 61e3 str r3, [r4, #28] -10003e42: 6223 str r3, [r4, #32] -10003e44: 6263 str r3, [r4, #36] @ 0x24 -10003e46: 62a3 str r3, [r4, #40] @ 0x28 -10003e48: 62e3 str r3, [r4, #44] @ 0x2c -10003e4a: 6323 str r3, [r4, #48] @ 0x30 -10003e4c: 6363 str r3, [r4, #52] @ 0x34 -10003e4e: 63a3 str r3, [r4, #56] @ 0x38 -10003e50: 63e3 str r3, [r4, #60] @ 0x3c -10003e52: 6423 str r3, [r4, #64] @ 0x40 -10003e54: 6463 str r3, [r4, #68] @ 0x44 -10003e56: 64a3 str r3, [r4, #72] @ 0x48 -10003e58: 64e3 str r3, [r4, #76] @ 0x4c -10003e5a: 6523 str r3, [r4, #80] @ 0x50 -10003e5c: 6563 str r3, [r4, #84] @ 0x54 -10003e5e: 65a3 str r3, [r4, #88] @ 0x58 -10003e60: 65e3 str r3, [r4, #92] @ 0x5c -10003e62: 6623 str r3, [r4, #96] @ 0x60 -10003e64: 6663 str r3, [r4, #100] @ 0x64 -10003e66: 66a3 str r3, [r4, #104] @ 0x68 -10003e68: 66e3 str r3, [r4, #108] @ 0x6c -10003e6a: 6723 str r3, [r4, #112] @ 0x70 -10003e6c: 6763 str r3, [r4, #116] @ 0x74 -10003e6e: 67a3 str r3, [r4, #120] @ 0x78 -10003e70: 67e3 str r3, [r4, #124] @ 0x7c -10003e72: 64a3 str r3, [r4, #72] @ 0x48 -10003e74: e7d1 b.n 10003e1a <__aeabi_double_init+0x22> -10003e76: 4b05 ldr r3, [pc, #20] @ (10003e8c <__aeabi_double_init+0x94>) -10003e78: 64a3 str r3, [r4, #72] @ 0x48 -10003e7a: e7ce b.n 10003e1a <__aeabi_double_init+0x22> -10003e7c: 00004453 .word 0x00004453 -10003e80: 20001028 .word 0x20001028 -10003e84: 0000334c .word 0x0000334c -10003e88: 20001c48 .word 0x20001c48 -10003e8c: 10003e91 .word 0x10003e91 - -10003e90 : -10003e90: b507 push {r0, r1, r2, lr} -10003e92: 4660 mov r0, ip -10003e94: 8801 ldrh r1, [r0, #0] -10003e96: 0a0a lsrs r2, r1, #8 -10003e98: 3002 adds r0, #2 -10003e9a: 2adf cmp r2, #223 @ 0xdf -10003e9c: d1fa bne.n 10003e94 -10003e9e: b2c9 uxtb r1, r1 -10003ea0: 0882 lsrs r2, r0, #2 -10003ea2: d304 bcc.n 10003eae -10003ea4: 8802 ldrh r2, [r0, #0] -10003ea6: 8840 ldrh r0, [r0, #2] -10003ea8: 0400 lsls r0, r0, #16 -10003eaa: 4310 orrs r0, r2 -10003eac: e000 b.n 10003eb0 -10003eae: 6800 ldr r0, [r0, #0] -10003eb0: 4a01 ldr r2, [pc, #4] @ (10003eb8 ) -10003eb2: 5050 str r0, [r2, r1] -10003eb4: 9003 str r0, [sp, #12] -10003eb6: bd07 pop {r0, r1, r2, pc} -10003eb8: 20001028 .word 0x20001028 - -10003ebc : -10003ebc: b40f push {r0, r1, r2, r3} -10003ebe: bc03 pop {r0, r1} -10003ec0: bc0c pop {r2, r3} - -10003ec2 : -10003ec2: b5f0 push {r4, r5, r6, r7, lr} -10003ec4: 2401 movs r4, #1 -10003ec6: 07e4 lsls r4, r4, #31 -10003ec8: 4063 eors r3, r4 -10003eca: e000 b.n 10003ece - -10003ecc : -10003ecc: b5f0 push {r4, r5, r6, r7, lr} - -10003ece : -10003ece: 0d0c lsrs r4, r1, #20 -10003ed0: 0fcf lsrs r7, r1, #31 -10003ed2: 1e66 subs r6, r4, #1 -10003ed4: 0536 lsls r6, r6, #20 -10003ed6: 1b89 subs r1, r1, r6 -10003ed8: 0564 lsls r4, r4, #21 -10003eda: d303 bcc.n 10003ee4 -10003edc: 43c9 mvns r1, r1 -10003ede: 4240 negs r0, r0 -10003ee0: d300 bcc.n 10003ee4 -10003ee2: 3101 adds r1, #1 - -10003ee4 : -10003ee4: 0d64 lsrs r4, r4, #21 -10003ee6: d003 beq.n 10003ef0 -10003ee8: 1c66 adds r6, r4, #1 -10003eea: 0af6 lsrs r6, r6, #11 -10003eec: d007 beq.n 10003efe -10003eee: 1be4 subs r4, r4, r7 - -10003ef0 : -10003ef0: 2000 movs r0, #0 -10003ef2: 007f lsls r7, r7, #1 -10003ef4: 1c79 adds r1, r7, #1 -10003ef6: 0789 lsls r1, r1, #30 -10003ef8: 1289 asrs r1, r1, #10 -10003efa: 3c80 subs r4, #128 @ 0x80 -10003efc: 0324 lsls r4, r4, #12 - -10003efe : -10003efe: 0d1d lsrs r5, r3, #20 -10003f00: 0fdf lsrs r7, r3, #31 -10003f02: 1e6e subs r6, r5, #1 -10003f04: 0536 lsls r6, r6, #20 -10003f06: 1b9b subs r3, r3, r6 -10003f08: 056d lsls r5, r5, #21 -10003f0a: d303 bcc.n 10003f14 -10003f0c: 43db mvns r3, r3 -10003f0e: 4252 negs r2, r2 -10003f10: d300 bcc.n 10003f14 -10003f12: 3301 adds r3, #1 - -10003f14 : -10003f14: 0d6d lsrs r5, r5, #21 -10003f16: d003 beq.n 10003f20 -10003f18: 1c6e adds r6, r5, #1 -10003f1a: 0af6 lsrs r6, r6, #11 -10003f1c: d007 beq.n 10003f2e -10003f1e: 1bed subs r5, r5, r7 - -10003f20 : -10003f20: 2200 movs r2, #0 -10003f22: 007f lsls r7, r7, #1 -10003f24: 1c7b adds r3, r7, #1 -10003f26: 079b lsls r3, r3, #30 -10003f28: 129b asrs r3, r3, #10 -10003f2a: 3d80 subs r5, #128 @ 0x80 -10003f2c: 032d lsls r5, r5, #12 - -10003f2e : -10003f2e: 1b2f subs r7, r5, r4 -10003f30: 1b66 subs r6, r4, r5 -10003f32: d458 bmi.n 10003fe6 -10003f34: 46a4 mov ip, r4 -10003f36: 2e20 cmp r6, #32 -10003f38: da46 bge.n 10003fc8 -10003f3a: 3720 adds r7, #32 -10003f3c: 0014 movs r4, r2 -10003f3e: 40bc lsls r4, r7 - -10003f40 : -10003f40: 001d movs r5, r3 -10003f42: 40bd lsls r5, r7 -10003f44: 40f2 lsrs r2, r6 -10003f46: 4133 asrs r3, r6 -10003f48: 432a orrs r2, r5 - -10003f4a : -10003f4a: 1880 adds r0, r0, r2 -10003f4c: 4159 adcs r1, r3 - -10003f4e : -10003f4e: 0fcb lsrs r3, r1, #31 -10003f50: d005 beq.n 10003f5e -10003f52: 43c9 mvns r1, r1 -10003f54: 43c0 mvns r0, r0 -10003f56: 2200 movs r2, #0 -10003f58: 4264 negs r4, r4 -10003f5a: 4150 adcs r0, r2 -10003f5c: 4151 adcs r1, r2 -10003f5e: 4662 mov r2, ip -10003f60: 0d4d lsrs r5, r1, #21 -10003f62: d128 bne.n 10003fb6 -10003f64: 0d0d lsrs r5, r1, #20 -10003f66: d107 bne.n 10003f78 -10003f68: 2800 cmp r0, #0 -10003f6a: d01f beq.n 10003fac - -10003f6c : -10003f6c: 1924 adds r4, r4, r4 -10003f6e: 4140 adcs r0, r0 -10003f70: 4149 adcs r1, r1 -10003f72: 3a01 subs r2, #1 -10003f74: 0d0d lsrs r5, r1, #20 -10003f76: d0f9 beq.n 10003f6c - -10003f78 : -10003f78: 0064 lsls r4, r4, #1 -10003f7a: d306 bcc.n 10003f8a - -10003f7c : -10003f7c: 3001 adds r0, #1 -10003f7e: d300 bcc.n 10003f82 -10003f80: 3101 adds r1, #1 -10003f82: 2c00 cmp r4, #0 -10003f84: d101 bne.n 10003f8a -10003f86: 0840 lsrs r0, r0, #1 -10003f88: 0040 lsls r0, r0, #1 - -10003f8a : -10003f8a: 3a01 subs r2, #1 -10003f8c: d40b bmi.n 10003fa6 -10003f8e: 1c94 adds r4, r2, #2 -10003f90: 0ae4 lsrs r4, r4, #11 -10003f92: d104 bne.n 10003f9e -10003f94: 0512 lsls r2, r2, #20 -10003f96: 4411 add r1, r2 -10003f98: 07db lsls r3, r3, #31 -10003f9a: 4419 add r1, r3 -10003f9c: bdf0 pop {r4, r5, r6, r7, pc} - -10003f9e : -10003f9e: 07d9 lsls r1, r3, #31 -10003fa0: 4b20 ldr r3, [pc, #128] @ (10004024 ) -10003fa2: 4319 orrs r1, r3 -10003fa4: e000 b.n 10003fa8 - -10003fa6 : -10003fa6: 07d9 lsls r1, r3, #31 -10003fa8: 2000 movs r0, #0 -10003faa: bdf0 pop {r4, r5, r6, r7, pc} - -10003fac : -10003fac: 2900 cmp r1, #0 -10003fae: d1dd bne.n 10003f6c -10003fb0: 2c00 cmp r4, #0 -10003fb2: d1db bne.n 10003f6c -10003fb4: bdf0 pop {r4, r5, r6, r7, pc} - -10003fb6 : -10003fb6: 3201 adds r2, #1 -10003fb8: 07c6 lsls r6, r0, #31 -10003fba: 0840 lsrs r0, r0, #1 -10003fbc: 07cd lsls r5, r1, #31 -10003fbe: 4328 orrs r0, r5 -10003fc0: 0849 lsrs r1, r1, #1 -10003fc2: 2e00 cmp r6, #0 -10003fc4: d0e1 beq.n 10003f8a -10003fc6: e7d9 b.n 10003f7c - -10003fc8 : -10003fc8: 2e3c cmp r6, #60 @ 0x3c -10003fca: da29 bge.n 10004020 -10003fcc: 3e20 subs r6, #32 -10003fce: 3740 adds r7, #64 @ 0x40 -10003fd0: 0014 movs r4, r2 -10003fd2: 40bc lsls r4, r7 -10003fd4: d000 beq.n 10003fd8 -10003fd6: 2401 movs r4, #1 -10003fd8: 40f2 lsrs r2, r6 -10003fda: 4314 orrs r4, r2 -10003fdc: 001a movs r2, r3 -10003fde: 40bb lsls r3, r7 -10003fe0: 431c orrs r4, r3 -10003fe2: 17d3 asrs r3, r2, #31 -10003fe4: e7ac b.n 10003f40 - -10003fe6 : -10003fe6: 46ac mov ip, r5 -10003fe8: 2f20 cmp r7, #32 -10003fea: da08 bge.n 10003ffe -10003fec: 3620 adds r6, #32 -10003fee: 0004 movs r4, r0 -10003ff0: 40b4 lsls r4, r6 - -10003ff2 : -10003ff2: 000d movs r5, r1 -10003ff4: 40b5 lsls r5, r6 -10003ff6: 40f8 lsrs r0, r7 -10003ff8: 4139 asrs r1, r7 -10003ffa: 4328 orrs r0, r5 -10003ffc: e7a5 b.n 10003f4a - -10003ffe : -10003ffe: 2f3c cmp r7, #60 @ 0x3c -10004000: da0c bge.n 1000401c -10004002: 3f20 subs r7, #32 -10004004: 3640 adds r6, #64 @ 0x40 -10004006: 0004 movs r4, r0 -10004008: 40b4 lsls r4, r6 -1000400a: d000 beq.n 1000400e -1000400c: 2401 movs r4, #1 -1000400e: 40f8 lsrs r0, r7 -10004010: 4304 orrs r4, r0 -10004012: 0008 movs r0, r1 -10004014: 40b1 lsls r1, r6 -10004016: 430c orrs r4, r1 -10004018: 17c1 asrs r1, r0, #31 -1000401a: e7ea b.n 10003ff2 - -1000401c : -1000401c: 0010 movs r0, r2 -1000401e: 0019 movs r1, r3 - -10004020 : -10004020: 2400 movs r4, #0 -10004022: e794 b.n 10003f4e -10004024: 7ff00000 .word 0x7ff00000 - -10004028 : -10004028: b5f0 push {r4, r5, r6, r7, lr} -1000402a: 0d0c lsrs r4, r1, #20 -1000402c: 1e66 subs r6, r4, #1 -1000402e: 0536 lsls r6, r6, #20 -10004030: 1b89 subs r1, r1, r6 -10004032: 0ae6 lsrs r6, r4, #11 -10004034: 0564 lsls r4, r4, #21 -10004036: 0d64 lsrs r4, r4, #21 -10004038: d002 beq.n 10004040 -1000403a: 1c65 adds r5, r4, #1 -1000403c: 0aed lsrs r5, r5, #11 -1000403e: d004 beq.n 1000404a - -10004040 : -10004040: 2000 movs r0, #0 -10004042: 2101 movs r1, #1 -10004044: 0509 lsls r1, r1, #20 -10004046: 3c80 subs r4, #128 @ 0x80 -10004048: 0324 lsls r4, r4, #12 - -1000404a : -1000404a: 46a4 mov ip, r4 -1000404c: 0d1c lsrs r4, r3, #20 -1000404e: 1e67 subs r7, r4, #1 -10004050: 053f lsls r7, r7, #20 -10004052: 1bdb subs r3, r3, r7 -10004054: 0ae7 lsrs r7, r4, #11 -10004056: 0564 lsls r4, r4, #21 -10004058: 0d64 lsrs r4, r4, #21 -1000405a: d002 beq.n 10004062 -1000405c: 1c65 adds r5, r4, #1 -1000405e: 0aed lsrs r5, r5, #11 -10004060: d004 beq.n 1000406c - -10004062 : -10004062: 2200 movs r2, #0 -10004064: 2301 movs r3, #1 -10004066: 051b lsls r3, r3, #20 -10004068: 3c80 subs r4, #128 @ 0x80 -1000406a: 0324 lsls r4, r4, #12 - -1000406c : -1000406c: 4077 eors r7, r6 -1000406e: 4464 add r4, ip -10004070: b497 push {r0, r1, r2, r4, r7} -10004072: b284 uxth r4, r0 -10004074: b296 uxth r6, r2 -10004076: 4374 muls r4, r6 -10004078: 0c07 lsrs r7, r0, #16 -1000407a: 437e muls r6, r7 -1000407c: 0c15 lsrs r5, r2, #16 -1000407e: 436f muls r7, r5 -10004080: b280 uxth r0, r0 -10004082: 4368 muls r0, r5 -10004084: 1836 adds r6, r6, r0 -10004086: d302 bcc.n 1000408e -10004088: 2001 movs r0, #1 -1000408a: 0400 lsls r0, r0, #16 -1000408c: 183f adds r7, r7, r0 - -1000408e : -1000408e: 0430 lsls r0, r6, #16 -10004090: 0c35 lsrs r5, r6, #16 -10004092: 1900 adds r0, r0, r4 -10004094: 417d adcs r5, r7 -10004096: 4684 mov ip, r0 -10004098: b288 uxth r0, r1 -1000409a: b29a uxth r2, r3 -1000409c: 4350 muls r0, r2 -1000409e: 0c0c lsrs r4, r1, #16 -100040a0: 4362 muls r2, r4 -100040a2: 0c1f lsrs r7, r3, #16 -100040a4: 437c muls r4, r7 -100040a6: b28e uxth r6, r1 -100040a8: 437e muls r6, r7 -100040aa: 1992 adds r2, r2, r6 -100040ac: d302 bcc.n 100040b4 -100040ae: 2601 movs r6, #1 -100040b0: 0436 lsls r6, r6, #16 -100040b2: 19a4 adds r4, r4, r6 - -100040b4 : -100040b4: 0416 lsls r6, r2, #16 -100040b6: 0c17 lsrs r7, r2, #16 -100040b8: 1836 adds r6, r6, r0 -100040ba: 4167 adcs r7, r4 -100040bc: bc01 pop {r0} -100040be: b281 uxth r1, r0 -100040c0: b29a uxth r2, r3 -100040c2: 4351 muls r1, r2 -100040c4: 0c04 lsrs r4, r0, #16 -100040c6: 4362 muls r2, r4 -100040c8: 0c1b lsrs r3, r3, #16 -100040ca: 435c muls r4, r3 -100040cc: b280 uxth r0, r0 -100040ce: 4358 muls r0, r3 -100040d0: 1812 adds r2, r2, r0 -100040d2: d302 bcc.n 100040da -100040d4: 2001 movs r0, #1 -100040d6: 0400 lsls r0, r0, #16 -100040d8: 1824 adds r4, r4, r0 - -100040da : -100040da: 0410 lsls r0, r2, #16 -100040dc: 0c13 lsrs r3, r2, #16 -100040de: 1840 adds r0, r0, r1 -100040e0: 4163 adcs r3, r4 -100040e2: 182d adds r5, r5, r0 -100040e4: 415e adcs r6, r3 -100040e6: 2000 movs r0, #0 -100040e8: 4147 adcs r7, r0 -100040ea: bc06 pop {r1, r2} -100040ec: b288 uxth r0, r1 -100040ee: b293 uxth r3, r2 -100040f0: 4358 muls r0, r3 -100040f2: 0c0c lsrs r4, r1, #16 -100040f4: 4363 muls r3, r4 -100040f6: 0c12 lsrs r2, r2, #16 -100040f8: 4354 muls r4, r2 -100040fa: b289 uxth r1, r1 -100040fc: 4351 muls r1, r2 -100040fe: 185b adds r3, r3, r1 -10004100: d302 bcc.n 10004108 -10004102: 2101 movs r1, #1 -10004104: 0409 lsls r1, r1, #16 -10004106: 1864 adds r4, r4, r1 - -10004108 : -10004108: 0419 lsls r1, r3, #16 -1000410a: 0c1a lsrs r2, r3, #16 -1000410c: 1809 adds r1, r1, r0 -1000410e: 4162 adcs r2, r4 -10004110: 186d adds r5, r5, r1 -10004112: 4156 adcs r6, r2 -10004114: 2000 movs r0, #0 -10004116: 4147 adcs r7, r0 -10004118: bc18 pop {r3, r4} -1000411a: 02f9 lsls r1, r7, #11 -1000411c: 0d72 lsrs r2, r6, #21 -1000411e: 4311 orrs r1, r2 -10004120: 02f0 lsls r0, r6, #11 -10004122: 0d6a lsrs r2, r5, #21 -10004124: 4310 orrs r0, r2 -10004126: 02ed lsls r5, r5, #11 -10004128: 0d0a lsrs r2, r1, #20 -1000412a: d103 bne.n 10004134 -1000412c: 196d adds r5, r5, r5 -1000412e: 4140 adcs r0, r0 -10004130: 4149 adcs r1, r1 -10004132: 3b01 subs r3, #1 -10004134: 4e12 ldr r6, [pc, #72] @ (10004180 ) -10004136: 1b9b subs r3, r3, r6 -10004138: 0076 lsls r6, r6, #1 -1000413a: 42b3 cmp r3, r6 -1000413c: d20e bcs.n 1000415c -1000413e: 006d lsls r5, r5, #1 -10004140: d307 bcc.n 10004152 -10004142: 3001 adds r0, #1 -10004144: 2600 movs r6, #0 -10004146: 4171 adcs r1, r6 -10004148: 4666 mov r6, ip -1000414a: 4335 orrs r5, r6 -1000414c: d101 bne.n 10004152 -1000414e: 0840 lsrs r0, r0, #1 -10004150: 0040 lsls r0, r0, #1 -10004152: 051b lsls r3, r3, #20 -10004154: 18c9 adds r1, r1, r3 - -10004156 : -10004156: 07e4 lsls r4, r4, #31 -10004158: 4421 add r1, r4 -1000415a: bdf0 pop {r4, r5, r6, r7, pc} - -1000415c : -1000415c: da0b bge.n 10004176 -1000415e: 3301 adds r3, #1 -10004160: d106 bne.n 10004170 -10004162: 3001 adds r0, #1 -10004164: d104 bne.n 10004170 -10004166: 3101 adds r1, #1 -10004168: 0d4f lsrs r7, r1, #21 -1000416a: d001 beq.n 10004170 -1000416c: 0849 lsrs r1, r1, #1 -1000416e: e7f2 b.n 10004156 -10004170: 07e1 lsls r1, r4, #31 -10004172: 2000 movs r0, #0 -10004174: bdf0 pop {r4, r5, r6, r7, pc} - -10004176 : -10004176: 3601 adds r6, #1 -10004178: 0531 lsls r1, r6, #20 -1000417a: 2000 movs r0, #0 -1000417c: e7eb b.n 10004156 -1000417e: 0000 .short 0x0000 -10004180: 000003ff .word 0x000003ff - -10004184 : -10004184: b5f0 push {r4, r5, r6, r7, lr} - -10004186 : -10004186: 0d1c lsrs r4, r3, #20 -10004188: 1e67 subs r7, r4, #1 -1000418a: 053f lsls r7, r7, #20 -1000418c: 1bdb subs r3, r3, r7 -1000418e: 0ae7 lsrs r7, r4, #11 -10004190: 0564 lsls r4, r4, #21 -10004192: 0d64 lsrs r4, r4, #21 -10004194: d002 beq.n 1000419c -10004196: 1c66 adds r6, r4, #1 -10004198: 0af6 lsrs r6, r6, #11 -1000419a: d004 beq.n 100041a6 - -1000419c : -1000419c: 2200 movs r2, #0 -1000419e: 2301 movs r3, #1 -100041a0: 051b lsls r3, r3, #20 -100041a2: 3c80 subs r4, #128 @ 0x80 -100041a4: 0324 lsls r4, r4, #12 - -100041a6 : -100041a6: 25d0 movs r5, #208 @ 0xd0 -100041a8: 062d lsls r5, r5, #24 -100041aa: 2600 movs r6, #0 -100041ac: 43f6 mvns r6, r6 -100041ae: 662e str r6, [r5, #96] @ 0x60 -100041b0: 091e lsrs r6, r3, #4 -100041b2: 666e str r6, [r5, #100] @ 0x64 -100041b4: 0fce lsrs r6, r1, #31 -100041b6: 19f6 adds r6, r6, r7 -100041b8: 46b4 mov ip, r6 -100041ba: 0049 lsls r1, r1, #1 -100041bc: 0d4f lsrs r7, r1, #21 -100041be: d002 beq.n 100041c6 -100041c0: 1c7e adds r6, r7, #1 -100041c2: 0af6 lsrs r6, r6, #11 -100041c4: d003 beq.n 100041ce -100041c6: 2000 movs r0, #0 -100041c8: 2100 movs r1, #0 -100041ca: 3f40 subs r7, #64 @ 0x40 -100041cc: 033f lsls r7, r7, #12 -100041ce: 1b3e subs r6, r7, r4 -100041d0: 00b6 lsls r6, r6, #2 -100041d2: 44b4 add ip, r6 -100041d4: 3f01 subs r7, #1 -100041d6: 057f lsls r7, r7, #21 -100041d8: 1bc9 subs r1, r1, r7 -100041da: 0849 lsrs r1, r1, #1 -100041dc: 6f2e ldr r6, [r5, #112] @ 0x70 -100041de: 3601 adds r6, #1 -100041e0: 0876 lsrs r6, r6, #1 -100041e2: 029c lsls r4, r3, #10 -100041e4: 0d95 lsrs r5, r2, #22 -100041e6: 4325 orrs r5, r4 -100041e8: 4375 muls r5, r6 -100041ea: 13ed asrs r5, r5, #15 -100041ec: 4375 muls r5, r6 -100041ee: 13ad asrs r5, r5, #14 -100041f0: 3501 adds r5, #1 -100041f2: 106d asrs r5, r5, #1 -100041f4: 03f6 lsls r6, r6, #15 -100041f6: 1b76 subs r6, r6, r5 -100041f8: b40c push {r2, r3} -100041fa: 02cc lsls r4, r1, #11 -100041fc: 0d45 lsrs r5, r0, #21 -100041fe: 432c orrs r4, r5 -10004200: b2a2 uxth r2, r4 -10004202: b2b3 uxth r3, r6 -10004204: 435a muls r2, r3 -10004206: 0c27 lsrs r7, r4, #16 -10004208: 437b muls r3, r7 -1000420a: 0c35 lsrs r5, r6, #16 -1000420c: 436f muls r7, r5 -1000420e: b2a4 uxth r4, r4 -10004210: 436c muls r4, r5 -10004212: 191b adds r3, r3, r4 -10004214: d302 bcc.n 1000421c -10004216: 2401 movs r4, #1 -10004218: 0424 lsls r4, r4, #16 -1000421a: 193f adds r7, r7, r4 - -1000421c : -1000421c: 041c lsls r4, r3, #16 -1000421e: 0c1d lsrs r5, r3, #16 -10004220: 18a4 adds r4, r4, r2 -10004222: 417d adcs r5, r7 -10004224: 1924 adds r4, r4, r4 -10004226: 416d adcs r5, r5 -10004228: 9a00 ldr r2, [sp, #0] -1000422a: b291 uxth r1, r2 -1000422c: b2ac uxth r4, r5 -1000422e: 4361 muls r1, r4 -10004230: 0c17 lsrs r7, r2, #16 -10004232: 437c muls r4, r7 -10004234: 0c2b lsrs r3, r5, #16 -10004236: 435f muls r7, r3 -10004238: b292 uxth r2, r2 -1000423a: 435a muls r2, r3 -1000423c: 18a4 adds r4, r4, r2 -1000423e: d302 bcc.n 10004246 -10004240: 2201 movs r2, #1 -10004242: 0412 lsls r2, r2, #16 -10004244: 18bf adds r7, r7, r2 - -10004246 : -10004246: 0422 lsls r2, r4, #16 -10004248: 0c23 lsrs r3, r4, #16 -1000424a: 1852 adds r2, r2, r1 -1000424c: 417b adcs r3, r7 -1000424e: 9c01 ldr r4, [sp, #4] -10004250: 436c muls r4, r5 -10004252: 191b adds r3, r3, r4 -10004254: 0e52 lsrs r2, r2, #25 -10004256: 01d9 lsls r1, r3, #7 -10004258: 430a orrs r2, r1 -1000425a: 0144 lsls r4, r0, #5 -1000425c: 1aa0 subs r0, r4, r2 -1000425e: b281 uxth r1, r0 -10004260: b2b2 uxth r2, r6 -10004262: 4351 muls r1, r2 -10004264: 1403 asrs r3, r0, #16 -10004266: 435a muls r2, r3 -10004268: 0c36 lsrs r6, r6, #16 -1000426a: 4373 muls r3, r6 -1000426c: b287 uxth r7, r0 -1000426e: 4377 muls r7, r6 -10004270: 17d6 asrs r6, r2, #31 -10004272: 19d2 adds r2, r2, r7 -10004274: 2700 movs r7, #0 -10004276: 417e adcs r6, r7 -10004278: 0436 lsls r6, r6, #16 -1000427a: 199b adds r3, r3, r6 -1000427c: 0417 lsls r7, r2, #16 -1000427e: 0c16 lsrs r6, r2, #16 -10004280: 187f adds r7, r7, r1 -10004282: 415e adcs r6, r3 -10004284: 1673 asrs r3, r6, #25 -10004286: 18ed adds r5, r5, r3 -10004288: 01f3 lsls r3, r6, #7 -1000428a: 2600 movs r6, #0 -1000428c: 3380 adds r3, #128 @ 0x80 -1000428e: 4175 adcs r5, r6 -10004290: 0fa9 lsrs r1, r5, #30 -10004292: d106 bne.n 100042a2 -10004294: 0064 lsls r4, r4, #1 -10004296: 0a69 lsrs r1, r5, #9 -10004298: 05e8 lsls r0, r5, #23 -1000429a: 0a5b lsrs r3, r3, #9 -1000429c: 4318 orrs r0, r3 -1000429e: d209 bcs.n 100042b4 -100042a0: e02f b.n 10004302 - -100042a2 : -100042a2: 2204 movs r2, #4 -100042a4: 4494 add ip, r2 -100042a6: 3380 adds r3, #128 @ 0x80 -100042a8: 4175 adcs r5, r6 -100042aa: 0aa9 lsrs r1, r5, #10 -100042ac: 05a8 lsls r0, r5, #22 -100042ae: 0a9b lsrs r3, r3, #10 -100042b0: 4318 orrs r0, r3 -100042b2: d326 bcc.n 10004302 - -100042b4 : -100042b4: 4140 adcs r0, r0 -100042b6: 4149 adcs r1, r1 -100042b8: 0424 lsls r4, r4, #16 -100042ba: 9a00 ldr r2, [sp, #0] -100042bc: 9b01 ldr r3, [sp, #4] -100042be: 000d movs r5, r1 -100042c0: 4355 muls r5, r2 -100042c2: 1b64 subs r4, r4, r5 -100042c4: 4343 muls r3, r0 -100042c6: 1ae4 subs r4, r4, r3 -100042c8: b295 uxth r5, r2 -100042ca: b286 uxth r6, r0 -100042cc: 4375 muls r5, r6 -100042ce: 0c17 lsrs r7, r2, #16 -100042d0: 437e muls r6, r7 -100042d2: 0c03 lsrs r3, r0, #16 -100042d4: 435f muls r7, r3 -100042d6: b292 uxth r2, r2 -100042d8: 435a muls r2, r3 -100042da: 18b6 adds r6, r6, r2 -100042dc: d302 bcc.n 100042e4 -100042de: 2201 movs r2, #1 -100042e0: 0412 lsls r2, r2, #16 -100042e2: 18bf adds r7, r7, r2 - -100042e4 : -100042e4: 0432 lsls r2, r6, #16 -100042e6: 0c33 lsrs r3, r6, #16 -100042e8: 1952 adds r2, r2, r5 -100042ea: 417b adcs r3, r7 -100042ec: 4252 negs r2, r2 -100042ee: 419c sbcs r4, r3 -100042f0: 2c00 cmp r4, #0 -100042f2: d402 bmi.n 100042fa -100042f4: 2200 movs r2, #0 -100042f6: 3001 adds r0, #1 -100042f8: 4151 adcs r1, r2 -100042fa: 0840 lsrs r0, r0, #1 -100042fc: 07ca lsls r2, r1, #31 -100042fe: 4310 orrs r0, r2 -10004300: 0849 lsrs r1, r1, #1 - -10004302 : -10004302: b002 add sp, #8 -10004304: 4662 mov r2, ip -10004306: 07d7 lsls r7, r2, #31 -10004308: 1092 asrs r2, r2, #2 -1000430a: 4b08 ldr r3, [pc, #32] @ (1000432c ) -1000430c: 18d2 adds r2, r2, r3 -1000430e: 4b08 ldr r3, [pc, #32] @ (10004330 ) -10004310: 429a cmp r2, r3 -10004312: d203 bcs.n 1000431c -10004314: 0512 lsls r2, r2, #20 -10004316: 1889 adds r1, r1, r2 - -10004318 : -10004318: 19c9 adds r1, r1, r7 -1000431a: bdf0 pop {r4, r5, r6, r7, pc} - -1000431c : -1000431c: 2000 movs r0, #0 -1000431e: 2a00 cmp r2, #0 -10004320: dc01 bgt.n 10004326 -10004322: 0039 movs r1, r7 -10004324: bdf0 pop {r4, r5, r6, r7, pc} - -10004326 : -10004326: 3301 adds r3, #1 -10004328: 0519 lsls r1, r3, #20 -1000432a: e7f5 b.n 10004318 -1000432c: 000003fd .word 0x000003fd -10004330: 000007fe .word 0x000007fe - -10004334 : -10004334: 2200 movs r2, #0 - -10004336 : -10004336: b500 push {lr} -10004338: 3220 adds r2, #32 -1000433a: f000 f804 bl 10004346 -1000433e: 0008 movs r0, r1 -10004340: bd00 pop {pc} +10004a04 <__wrap___aeabi_ui2d>: +10004a04: 2100 movs r1, #0 +10004a06: 2800 cmp r0, #0 +10004a08: d105 bne.n 10004a16 <__wrap___aeabi_i2d+0xa> +10004a0a: 4770 bx lr + +10004a0c <__wrap___aeabi_i2d>: +10004a0c: 17c1 asrs r1, r0, #31 +10004a0e: 4048 eors r0, r1 +10004a10: 1a40 subs r0, r0, r1 +10004a12: d0fa beq.n 10004a0a <__wrap___aeabi_ui2d+0x6> +10004a14: 07c9 lsls r1, r1, #31 +10004a16: b513 push {r0, r1, r4, lr} +10004a18: 4b06 ldr r3, [pc, #24] @ (10004a34 <__wrap___aeabi_i2d+0x28>) +10004a1a: 681b ldr r3, [r3, #0] +10004a1c: 4798 blx r3 +10004a1e: bc0c pop {r2, r3} +10004a20: 1c44 adds r4, r0, #1 +10004a22: 40a2 lsls r2, r4 +10004a24: 0510 lsls r0, r2, #20 +10004a26: 0b12 lsrs r2, r2, #12 +10004a28: 4903 ldr r1, [pc, #12] @ (10004a38 <__wrap___aeabi_i2d+0x2c>) +10004a2a: 1b09 subs r1, r1, r4 +10004a2c: 0509 lsls r1, r1, #20 +10004a2e: 4319 orrs r1, r3 +10004a30: 4311 orrs r1, r2 +10004a32: bd10 pop {r4, pc} +10004a34: 20001d28 .word 0x20001d28 +10004a38: 0000041f .word 0x0000041f + +10004a3c <__wrap___aeabi_d2iz>: +10004a3c: b510 push {r4, lr} +10004a3e: 004c lsls r4, r1, #1 +10004a40: 0d62 lsrs r2, r4, #21 +10004a42: 2380 movs r3, #128 @ 0x80 +10004a44: 18d2 adds r2, r2, r3 +10004a46: 00db lsls r3, r3, #3 +10004a48: 1ad2 subs r2, r2, r3 +10004a4a: 055b lsls r3, r3, #21 +10004a4c: 2a7e cmp r2, #126 @ 0x7e +10004a4e: dd10 ble.n 10004a72 <__wrap___aeabi_d2iz+0x36> +10004a50: 3a9e subs r2, #158 @ 0x9e +10004a52: da13 bge.n 10004a7c <__wrap___aeabi_d2iz+0x40> +10004a54: 17cc asrs r4, r1, #31 +10004a56: 0309 lsls r1, r1, #12 +10004a58: 0849 lsrs r1, r1, #1 +10004a5a: 4319 orrs r1, r3 +10004a5c: 4252 negs r2, r2 +10004a5e: 40d1 lsrs r1, r2 +10004a60: 0064 lsls r4, r4, #1 +10004a62: 3401 adds r4, #1 +10004a64: 3215 adds r2, #21 +10004a66: 2a20 cmp r2, #32 +10004a68: da05 bge.n 10004a76 <__wrap___aeabi_d2iz+0x3a> +10004a6a: 40d0 lsrs r0, r2 +10004a6c: 4308 orrs r0, r1 +10004a6e: 4360 muls r0, r4 +10004a70: bd10 pop {r4, pc} +10004a72: 2000 movs r0, #0 +10004a74: bd10 pop {r4, pc} +10004a76: 4608 mov r0, r1 +10004a78: 4360 muls r0, r4 +10004a7a: bd10 pop {r4, pc} +10004a7c: 0fc8 lsrs r0, r1, #31 +10004a7e: 18c0 adds r0, r0, r3 +10004a80: 3801 subs r0, #1 +10004a82: bd10 pop {r4, pc} + +10004a84 <__wrap___aeabi_d2uiz>: +10004a84: b418 push {r3, r4} +10004a86: 4b04 ldr r3, [pc, #16] @ (10004a98 <__wrap___aeabi_d2uiz+0x14>) +10004a88: 6a5b ldr r3, [r3, #36] @ 0x24 +10004a8a: 46fc mov ip, pc +10004a8c: 9301 str r3, [sp, #4] +10004a8e: bd08 pop {r3, pc} +10004a90: 4fd9df24 .word 0x4fd9df24 +10004a94: 00001000 .word 0x00001000 +10004a98: 200010f0 .word 0x200010f0 + +10004a9c <__aeabi_double_init>: +10004a9c: 2313 movs r3, #19 +10004a9e: b570 push {r4, r5, r6, lr} +10004aa0: 781d ldrb r5, [r3, #0] +10004aa2: 2d01 cmp r5, #1 +10004aa4: d015 beq.n 10004ad2 <__aeabi_double_init+0x36> +10004aa6: dd10 ble.n 10004aca <__aeabi_double_init+0x2e> +10004aa8: 481d ldr r0, [pc, #116] @ (10004b20 <__aeabi_double_init+0x84>) +10004aaa: f7ff fc89 bl 100043c0 +10004aae: 4c1d ldr r4, [pc, #116] @ (10004b24 <__aeabi_double_init+0x88>) +10004ab0: 0001 movs r1, r0 +10004ab2: 2280 movs r2, #128 @ 0x80 +10004ab4: 0020 movs r0, r4 +10004ab6: f000 fb5d bl 10005174 <__wrap___aeabi_memcpy> +10004aba: 2d02 cmp r5, #2 +10004abc: d02d beq.n 10004b1a <__aeabi_double_init+0x7e> +10004abe: 481a ldr r0, [pc, #104] @ (10004b28 <__aeabi_double_init+0x8c>) +10004ac0: f7ff fc76 bl 100043b0 +10004ac4: 4b19 ldr r3, [pc, #100] @ (10004b2c <__aeabi_double_init+0x90>) +10004ac6: 6018 str r0, [r3, #0] +10004ac8: bd70 pop {r4, r5, r6, pc} +10004aca: 4b19 ldr r3, [pc, #100] @ (10004b30 <__aeabi_double_init+0x94>) +10004acc: 4c15 ldr r4, [pc, #84] @ (10004b24 <__aeabi_double_init+0x88>) +10004ace: 64a3 str r3, [r4, #72] @ 0x48 +10004ad0: e7f5 b.n 10004abe <__aeabi_double_init+0x22> +10004ad2: 4b17 ldr r3, [pc, #92] @ (10004b30 <__aeabi_double_init+0x94>) +10004ad4: 4c13 ldr r4, [pc, #76] @ (10004b24 <__aeabi_double_init+0x88>) +10004ad6: 6023 str r3, [r4, #0] +10004ad8: 6063 str r3, [r4, #4] +10004ada: 60a3 str r3, [r4, #8] +10004adc: 60e3 str r3, [r4, #12] +10004ade: 6123 str r3, [r4, #16] +10004ae0: 6163 str r3, [r4, #20] +10004ae2: 61a3 str r3, [r4, #24] +10004ae4: 61e3 str r3, [r4, #28] +10004ae6: 6223 str r3, [r4, #32] +10004ae8: 6263 str r3, [r4, #36] @ 0x24 +10004aea: 62a3 str r3, [r4, #40] @ 0x28 +10004aec: 62e3 str r3, [r4, #44] @ 0x2c +10004aee: 6323 str r3, [r4, #48] @ 0x30 +10004af0: 6363 str r3, [r4, #52] @ 0x34 +10004af2: 63a3 str r3, [r4, #56] @ 0x38 +10004af4: 63e3 str r3, [r4, #60] @ 0x3c +10004af6: 6423 str r3, [r4, #64] @ 0x40 +10004af8: 6463 str r3, [r4, #68] @ 0x44 +10004afa: 64a3 str r3, [r4, #72] @ 0x48 +10004afc: 64e3 str r3, [r4, #76] @ 0x4c +10004afe: 6523 str r3, [r4, #80] @ 0x50 +10004b00: 6563 str r3, [r4, #84] @ 0x54 +10004b02: 65a3 str r3, [r4, #88] @ 0x58 +10004b04: 65e3 str r3, [r4, #92] @ 0x5c +10004b06: 6623 str r3, [r4, #96] @ 0x60 +10004b08: 6663 str r3, [r4, #100] @ 0x64 +10004b0a: 66a3 str r3, [r4, #104] @ 0x68 +10004b0c: 66e3 str r3, [r4, #108] @ 0x6c +10004b0e: 6723 str r3, [r4, #112] @ 0x70 +10004b10: 6763 str r3, [r4, #116] @ 0x74 +10004b12: 67a3 str r3, [r4, #120] @ 0x78 +10004b14: 67e3 str r3, [r4, #124] @ 0x7c +10004b16: 64a3 str r3, [r4, #72] @ 0x48 +10004b18: e7d1 b.n 10004abe <__aeabi_double_init+0x22> +10004b1a: 4b05 ldr r3, [pc, #20] @ (10004b30 <__aeabi_double_init+0x94>) +10004b1c: 64a3 str r3, [r4, #72] @ 0x48 +10004b1e: e7ce b.n 10004abe <__aeabi_double_init+0x22> +10004b20: 00004453 .word 0x00004453 +10004b24: 200010f0 .word 0x200010f0 +10004b28: 0000334c .word 0x0000334c +10004b2c: 20001d28 .word 0x20001d28 +10004b30: 10004b35 .word 0x10004b35 + +10004b34 : +10004b34: b507 push {r0, r1, r2, lr} +10004b36: 4660 mov r0, ip +10004b38: 8801 ldrh r1, [r0, #0] +10004b3a: 0a0a lsrs r2, r1, #8 +10004b3c: 3002 adds r0, #2 +10004b3e: 2adf cmp r2, #223 @ 0xdf +10004b40: d1fa bne.n 10004b38 +10004b42: b2c9 uxtb r1, r1 +10004b44: 0882 lsrs r2, r0, #2 +10004b46: d304 bcc.n 10004b52 +10004b48: 8802 ldrh r2, [r0, #0] +10004b4a: 8840 ldrh r0, [r0, #2] +10004b4c: 0400 lsls r0, r0, #16 +10004b4e: 4310 orrs r0, r2 +10004b50: e000 b.n 10004b54 +10004b52: 6800 ldr r0, [r0, #0] +10004b54: 4a01 ldr r2, [pc, #4] @ (10004b5c ) +10004b56: 5050 str r0, [r2, r1] +10004b58: 9003 str r0, [sp, #12] +10004b5a: bd07 pop {r0, r1, r2, pc} +10004b5c: 200010f0 .word 0x200010f0 + +10004b60 : +10004b60: b40f push {r0, r1, r2, r3} +10004b62: bc03 pop {r0, r1} +10004b64: bc0c pop {r2, r3} + +10004b66 : +10004b66: b5f0 push {r4, r5, r6, r7, lr} +10004b68: 2401 movs r4, #1 +10004b6a: 07e4 lsls r4, r4, #31 +10004b6c: 4063 eors r3, r4 +10004b6e: e000 b.n 10004b72 + +10004b70 : +10004b70: b5f0 push {r4, r5, r6, r7, lr} + +10004b72 : +10004b72: 0d0c lsrs r4, r1, #20 +10004b74: 0fcf lsrs r7, r1, #31 +10004b76: 1e66 subs r6, r4, #1 +10004b78: 0536 lsls r6, r6, #20 +10004b7a: 1b89 subs r1, r1, r6 +10004b7c: 0564 lsls r4, r4, #21 +10004b7e: d303 bcc.n 10004b88 +10004b80: 43c9 mvns r1, r1 +10004b82: 4240 negs r0, r0 +10004b84: d300 bcc.n 10004b88 +10004b86: 3101 adds r1, #1 + +10004b88 : +10004b88: 0d64 lsrs r4, r4, #21 +10004b8a: d003 beq.n 10004b94 +10004b8c: 1c66 adds r6, r4, #1 +10004b8e: 0af6 lsrs r6, r6, #11 +10004b90: d007 beq.n 10004ba2 +10004b92: 1be4 subs r4, r4, r7 + +10004b94 : +10004b94: 2000 movs r0, #0 +10004b96: 007f lsls r7, r7, #1 +10004b98: 1c79 adds r1, r7, #1 +10004b9a: 0789 lsls r1, r1, #30 +10004b9c: 1289 asrs r1, r1, #10 +10004b9e: 3c80 subs r4, #128 @ 0x80 +10004ba0: 0324 lsls r4, r4, #12 + +10004ba2 : +10004ba2: 0d1d lsrs r5, r3, #20 +10004ba4: 0fdf lsrs r7, r3, #31 +10004ba6: 1e6e subs r6, r5, #1 +10004ba8: 0536 lsls r6, r6, #20 +10004baa: 1b9b subs r3, r3, r6 +10004bac: 056d lsls r5, r5, #21 +10004bae: d303 bcc.n 10004bb8 +10004bb0: 43db mvns r3, r3 +10004bb2: 4252 negs r2, r2 +10004bb4: d300 bcc.n 10004bb8 +10004bb6: 3301 adds r3, #1 + +10004bb8 : +10004bb8: 0d6d lsrs r5, r5, #21 +10004bba: d003 beq.n 10004bc4 +10004bbc: 1c6e adds r6, r5, #1 +10004bbe: 0af6 lsrs r6, r6, #11 +10004bc0: d007 beq.n 10004bd2 +10004bc2: 1bed subs r5, r5, r7 + +10004bc4 : +10004bc4: 2200 movs r2, #0 +10004bc6: 007f lsls r7, r7, #1 +10004bc8: 1c7b adds r3, r7, #1 +10004bca: 079b lsls r3, r3, #30 +10004bcc: 129b asrs r3, r3, #10 +10004bce: 3d80 subs r5, #128 @ 0x80 +10004bd0: 032d lsls r5, r5, #12 + +10004bd2 : +10004bd2: 1b2f subs r7, r5, r4 +10004bd4: 1b66 subs r6, r4, r5 +10004bd6: d458 bmi.n 10004c8a +10004bd8: 46a4 mov ip, r4 +10004bda: 2e20 cmp r6, #32 +10004bdc: da46 bge.n 10004c6c +10004bde: 3720 adds r7, #32 +10004be0: 0014 movs r4, r2 +10004be2: 40bc lsls r4, r7 + +10004be4 : +10004be4: 001d movs r5, r3 +10004be6: 40bd lsls r5, r7 +10004be8: 40f2 lsrs r2, r6 +10004bea: 4133 asrs r3, r6 +10004bec: 432a orrs r2, r5 + +10004bee : +10004bee: 1880 adds r0, r0, r2 +10004bf0: 4159 adcs r1, r3 + +10004bf2 : +10004bf2: 0fcb lsrs r3, r1, #31 +10004bf4: d005 beq.n 10004c02 +10004bf6: 43c9 mvns r1, r1 +10004bf8: 43c0 mvns r0, r0 +10004bfa: 2200 movs r2, #0 +10004bfc: 4264 negs r4, r4 +10004bfe: 4150 adcs r0, r2 +10004c00: 4151 adcs r1, r2 +10004c02: 4662 mov r2, ip +10004c04: 0d4d lsrs r5, r1, #21 +10004c06: d128 bne.n 10004c5a +10004c08: 0d0d lsrs r5, r1, #20 +10004c0a: d107 bne.n 10004c1c +10004c0c: 2800 cmp r0, #0 +10004c0e: d01f beq.n 10004c50 + +10004c10 : +10004c10: 1924 adds r4, r4, r4 +10004c12: 4140 adcs r0, r0 +10004c14: 4149 adcs r1, r1 +10004c16: 3a01 subs r2, #1 +10004c18: 0d0d lsrs r5, r1, #20 +10004c1a: d0f9 beq.n 10004c10 + +10004c1c : +10004c1c: 0064 lsls r4, r4, #1 +10004c1e: d306 bcc.n 10004c2e + +10004c20 : +10004c20: 3001 adds r0, #1 +10004c22: d300 bcc.n 10004c26 +10004c24: 3101 adds r1, #1 +10004c26: 2c00 cmp r4, #0 +10004c28: d101 bne.n 10004c2e +10004c2a: 0840 lsrs r0, r0, #1 +10004c2c: 0040 lsls r0, r0, #1 + +10004c2e : +10004c2e: 3a01 subs r2, #1 +10004c30: d40b bmi.n 10004c4a +10004c32: 1c94 adds r4, r2, #2 +10004c34: 0ae4 lsrs r4, r4, #11 +10004c36: d104 bne.n 10004c42 +10004c38: 0512 lsls r2, r2, #20 +10004c3a: 4411 add r1, r2 +10004c3c: 07db lsls r3, r3, #31 +10004c3e: 4419 add r1, r3 +10004c40: bdf0 pop {r4, r5, r6, r7, pc} + +10004c42 : +10004c42: 07d9 lsls r1, r3, #31 +10004c44: 4b20 ldr r3, [pc, #128] @ (10004cc8 ) +10004c46: 4319 orrs r1, r3 +10004c48: e000 b.n 10004c4c + +10004c4a : +10004c4a: 07d9 lsls r1, r3, #31 +10004c4c: 2000 movs r0, #0 +10004c4e: bdf0 pop {r4, r5, r6, r7, pc} + +10004c50 : +10004c50: 2900 cmp r1, #0 +10004c52: d1dd bne.n 10004c10 +10004c54: 2c00 cmp r4, #0 +10004c56: d1db bne.n 10004c10 +10004c58: bdf0 pop {r4, r5, r6, r7, pc} + +10004c5a : +10004c5a: 3201 adds r2, #1 +10004c5c: 07c6 lsls r6, r0, #31 +10004c5e: 0840 lsrs r0, r0, #1 +10004c60: 07cd lsls r5, r1, #31 +10004c62: 4328 orrs r0, r5 +10004c64: 0849 lsrs r1, r1, #1 +10004c66: 2e00 cmp r6, #0 +10004c68: d0e1 beq.n 10004c2e +10004c6a: e7d9 b.n 10004c20 + +10004c6c : +10004c6c: 2e3c cmp r6, #60 @ 0x3c +10004c6e: da29 bge.n 10004cc4 +10004c70: 3e20 subs r6, #32 +10004c72: 3740 adds r7, #64 @ 0x40 +10004c74: 0014 movs r4, r2 +10004c76: 40bc lsls r4, r7 +10004c78: d000 beq.n 10004c7c +10004c7a: 2401 movs r4, #1 +10004c7c: 40f2 lsrs r2, r6 +10004c7e: 4314 orrs r4, r2 +10004c80: 001a movs r2, r3 +10004c82: 40bb lsls r3, r7 +10004c84: 431c orrs r4, r3 +10004c86: 17d3 asrs r3, r2, #31 +10004c88: e7ac b.n 10004be4 + +10004c8a : +10004c8a: 46ac mov ip, r5 +10004c8c: 2f20 cmp r7, #32 +10004c8e: da08 bge.n 10004ca2 +10004c90: 3620 adds r6, #32 +10004c92: 0004 movs r4, r0 +10004c94: 40b4 lsls r4, r6 + +10004c96 : +10004c96: 000d movs r5, r1 +10004c98: 40b5 lsls r5, r6 +10004c9a: 40f8 lsrs r0, r7 +10004c9c: 4139 asrs r1, r7 +10004c9e: 4328 orrs r0, r5 +10004ca0: e7a5 b.n 10004bee + +10004ca2 : +10004ca2: 2f3c cmp r7, #60 @ 0x3c +10004ca4: da0c bge.n 10004cc0 +10004ca6: 3f20 subs r7, #32 +10004ca8: 3640 adds r6, #64 @ 0x40 +10004caa: 0004 movs r4, r0 +10004cac: 40b4 lsls r4, r6 +10004cae: d000 beq.n 10004cb2 +10004cb0: 2401 movs r4, #1 +10004cb2: 40f8 lsrs r0, r7 +10004cb4: 4304 orrs r4, r0 +10004cb6: 0008 movs r0, r1 +10004cb8: 40b1 lsls r1, r6 +10004cba: 430c orrs r4, r1 +10004cbc: 17c1 asrs r1, r0, #31 +10004cbe: e7ea b.n 10004c96 + +10004cc0 : +10004cc0: 0010 movs r0, r2 +10004cc2: 0019 movs r1, r3 + +10004cc4 : +10004cc4: 2400 movs r4, #0 +10004cc6: e794 b.n 10004bf2 +10004cc8: 7ff00000 .word 0x7ff00000 + +10004ccc : +10004ccc: b5f0 push {r4, r5, r6, r7, lr} +10004cce: 0d0c lsrs r4, r1, #20 +10004cd0: 1e66 subs r6, r4, #1 +10004cd2: 0536 lsls r6, r6, #20 +10004cd4: 1b89 subs r1, r1, r6 +10004cd6: 0ae6 lsrs r6, r4, #11 +10004cd8: 0564 lsls r4, r4, #21 +10004cda: 0d64 lsrs r4, r4, #21 +10004cdc: d002 beq.n 10004ce4 +10004cde: 1c65 adds r5, r4, #1 +10004ce0: 0aed lsrs r5, r5, #11 +10004ce2: d004 beq.n 10004cee + +10004ce4 : +10004ce4: 2000 movs r0, #0 +10004ce6: 2101 movs r1, #1 +10004ce8: 0509 lsls r1, r1, #20 +10004cea: 3c80 subs r4, #128 @ 0x80 +10004cec: 0324 lsls r4, r4, #12 + +10004cee : +10004cee: 46a4 mov ip, r4 +10004cf0: 0d1c lsrs r4, r3, #20 +10004cf2: 1e67 subs r7, r4, #1 +10004cf4: 053f lsls r7, r7, #20 +10004cf6: 1bdb subs r3, r3, r7 +10004cf8: 0ae7 lsrs r7, r4, #11 +10004cfa: 0564 lsls r4, r4, #21 +10004cfc: 0d64 lsrs r4, r4, #21 +10004cfe: d002 beq.n 10004d06 +10004d00: 1c65 adds r5, r4, #1 +10004d02: 0aed lsrs r5, r5, #11 +10004d04: d004 beq.n 10004d10 + +10004d06 : +10004d06: 2200 movs r2, #0 +10004d08: 2301 movs r3, #1 +10004d0a: 051b lsls r3, r3, #20 +10004d0c: 3c80 subs r4, #128 @ 0x80 +10004d0e: 0324 lsls r4, r4, #12 + +10004d10 : +10004d10: 4077 eors r7, r6 +10004d12: 4464 add r4, ip +10004d14: b497 push {r0, r1, r2, r4, r7} +10004d16: b284 uxth r4, r0 +10004d18: b296 uxth r6, r2 +10004d1a: 4374 muls r4, r6 +10004d1c: 0c07 lsrs r7, r0, #16 +10004d1e: 437e muls r6, r7 +10004d20: 0c15 lsrs r5, r2, #16 +10004d22: 436f muls r7, r5 +10004d24: b280 uxth r0, r0 +10004d26: 4368 muls r0, r5 +10004d28: 1836 adds r6, r6, r0 +10004d2a: d302 bcc.n 10004d32 +10004d2c: 2001 movs r0, #1 +10004d2e: 0400 lsls r0, r0, #16 +10004d30: 183f adds r7, r7, r0 + +10004d32 : +10004d32: 0430 lsls r0, r6, #16 +10004d34: 0c35 lsrs r5, r6, #16 +10004d36: 1900 adds r0, r0, r4 +10004d38: 417d adcs r5, r7 +10004d3a: 4684 mov ip, r0 +10004d3c: b288 uxth r0, r1 +10004d3e: b29a uxth r2, r3 +10004d40: 4350 muls r0, r2 +10004d42: 0c0c lsrs r4, r1, #16 +10004d44: 4362 muls r2, r4 +10004d46: 0c1f lsrs r7, r3, #16 +10004d48: 437c muls r4, r7 +10004d4a: b28e uxth r6, r1 +10004d4c: 437e muls r6, r7 +10004d4e: 1992 adds r2, r2, r6 +10004d50: d302 bcc.n 10004d58 +10004d52: 2601 movs r6, #1 +10004d54: 0436 lsls r6, r6, #16 +10004d56: 19a4 adds r4, r4, r6 + +10004d58 : +10004d58: 0416 lsls r6, r2, #16 +10004d5a: 0c17 lsrs r7, r2, #16 +10004d5c: 1836 adds r6, r6, r0 +10004d5e: 4167 adcs r7, r4 +10004d60: bc01 pop {r0} +10004d62: b281 uxth r1, r0 +10004d64: b29a uxth r2, r3 +10004d66: 4351 muls r1, r2 +10004d68: 0c04 lsrs r4, r0, #16 +10004d6a: 4362 muls r2, r4 +10004d6c: 0c1b lsrs r3, r3, #16 +10004d6e: 435c muls r4, r3 +10004d70: b280 uxth r0, r0 +10004d72: 4358 muls r0, r3 +10004d74: 1812 adds r2, r2, r0 +10004d76: d302 bcc.n 10004d7e +10004d78: 2001 movs r0, #1 +10004d7a: 0400 lsls r0, r0, #16 +10004d7c: 1824 adds r4, r4, r0 + +10004d7e : +10004d7e: 0410 lsls r0, r2, #16 +10004d80: 0c13 lsrs r3, r2, #16 +10004d82: 1840 adds r0, r0, r1 +10004d84: 4163 adcs r3, r4 +10004d86: 182d adds r5, r5, r0 +10004d88: 415e adcs r6, r3 +10004d8a: 2000 movs r0, #0 +10004d8c: 4147 adcs r7, r0 +10004d8e: bc06 pop {r1, r2} +10004d90: b288 uxth r0, r1 +10004d92: b293 uxth r3, r2 +10004d94: 4358 muls r0, r3 +10004d96: 0c0c lsrs r4, r1, #16 +10004d98: 4363 muls r3, r4 +10004d9a: 0c12 lsrs r2, r2, #16 +10004d9c: 4354 muls r4, r2 +10004d9e: b289 uxth r1, r1 +10004da0: 4351 muls r1, r2 +10004da2: 185b adds r3, r3, r1 +10004da4: d302 bcc.n 10004dac +10004da6: 2101 movs r1, #1 +10004da8: 0409 lsls r1, r1, #16 +10004daa: 1864 adds r4, r4, r1 + +10004dac : +10004dac: 0419 lsls r1, r3, #16 +10004dae: 0c1a lsrs r2, r3, #16 +10004db0: 1809 adds r1, r1, r0 +10004db2: 4162 adcs r2, r4 +10004db4: 186d adds r5, r5, r1 +10004db6: 4156 adcs r6, r2 +10004db8: 2000 movs r0, #0 +10004dba: 4147 adcs r7, r0 +10004dbc: bc18 pop {r3, r4} +10004dbe: 02f9 lsls r1, r7, #11 +10004dc0: 0d72 lsrs r2, r6, #21 +10004dc2: 4311 orrs r1, r2 +10004dc4: 02f0 lsls r0, r6, #11 +10004dc6: 0d6a lsrs r2, r5, #21 +10004dc8: 4310 orrs r0, r2 +10004dca: 02ed lsls r5, r5, #11 +10004dcc: 0d0a lsrs r2, r1, #20 +10004dce: d103 bne.n 10004dd8 +10004dd0: 196d adds r5, r5, r5 +10004dd2: 4140 adcs r0, r0 +10004dd4: 4149 adcs r1, r1 +10004dd6: 3b01 subs r3, #1 +10004dd8: 4e12 ldr r6, [pc, #72] @ (10004e24 ) +10004dda: 1b9b subs r3, r3, r6 +10004ddc: 0076 lsls r6, r6, #1 +10004dde: 42b3 cmp r3, r6 +10004de0: d20e bcs.n 10004e00 +10004de2: 006d lsls r5, r5, #1 +10004de4: d307 bcc.n 10004df6 +10004de6: 3001 adds r0, #1 +10004de8: 2600 movs r6, #0 +10004dea: 4171 adcs r1, r6 +10004dec: 4666 mov r6, ip +10004dee: 4335 orrs r5, r6 +10004df0: d101 bne.n 10004df6 +10004df2: 0840 lsrs r0, r0, #1 +10004df4: 0040 lsls r0, r0, #1 +10004df6: 051b lsls r3, r3, #20 +10004df8: 18c9 adds r1, r1, r3 + +10004dfa : +10004dfa: 07e4 lsls r4, r4, #31 +10004dfc: 4421 add r1, r4 +10004dfe: bdf0 pop {r4, r5, r6, r7, pc} + +10004e00 : +10004e00: da0b bge.n 10004e1a +10004e02: 3301 adds r3, #1 +10004e04: d106 bne.n 10004e14 +10004e06: 3001 adds r0, #1 +10004e08: d104 bne.n 10004e14 +10004e0a: 3101 adds r1, #1 +10004e0c: 0d4f lsrs r7, r1, #21 +10004e0e: d001 beq.n 10004e14 +10004e10: 0849 lsrs r1, r1, #1 +10004e12: e7f2 b.n 10004dfa +10004e14: 07e1 lsls r1, r4, #31 +10004e16: 2000 movs r0, #0 +10004e18: bdf0 pop {r4, r5, r6, r7, pc} + +10004e1a : +10004e1a: 3601 adds r6, #1 +10004e1c: 0531 lsls r1, r6, #20 +10004e1e: 2000 movs r0, #0 +10004e20: e7eb b.n 10004dfa +10004e22: 0000 .short 0x0000 +10004e24: 000003ff .word 0x000003ff + +10004e28 : +10004e28: b5f0 push {r4, r5, r6, r7, lr} + +10004e2a : +10004e2a: 0d1c lsrs r4, r3, #20 +10004e2c: 1e67 subs r7, r4, #1 +10004e2e: 053f lsls r7, r7, #20 +10004e30: 1bdb subs r3, r3, r7 +10004e32: 0ae7 lsrs r7, r4, #11 +10004e34: 0564 lsls r4, r4, #21 +10004e36: 0d64 lsrs r4, r4, #21 +10004e38: d002 beq.n 10004e40 +10004e3a: 1c66 adds r6, r4, #1 +10004e3c: 0af6 lsrs r6, r6, #11 +10004e3e: d004 beq.n 10004e4a + +10004e40 : +10004e40: 2200 movs r2, #0 +10004e42: 2301 movs r3, #1 +10004e44: 051b lsls r3, r3, #20 +10004e46: 3c80 subs r4, #128 @ 0x80 +10004e48: 0324 lsls r4, r4, #12 + +10004e4a : +10004e4a: 25d0 movs r5, #208 @ 0xd0 +10004e4c: 062d lsls r5, r5, #24 +10004e4e: 2600 movs r6, #0 +10004e50: 43f6 mvns r6, r6 +10004e52: 662e str r6, [r5, #96] @ 0x60 +10004e54: 091e lsrs r6, r3, #4 +10004e56: 666e str r6, [r5, #100] @ 0x64 +10004e58: 0fce lsrs r6, r1, #31 +10004e5a: 19f6 adds r6, r6, r7 +10004e5c: 46b4 mov ip, r6 +10004e5e: 0049 lsls r1, r1, #1 +10004e60: 0d4f lsrs r7, r1, #21 +10004e62: d002 beq.n 10004e6a +10004e64: 1c7e adds r6, r7, #1 +10004e66: 0af6 lsrs r6, r6, #11 +10004e68: d003 beq.n 10004e72 +10004e6a: 2000 movs r0, #0 +10004e6c: 2100 movs r1, #0 +10004e6e: 3f40 subs r7, #64 @ 0x40 +10004e70: 033f lsls r7, r7, #12 +10004e72: 1b3e subs r6, r7, r4 +10004e74: 00b6 lsls r6, r6, #2 +10004e76: 44b4 add ip, r6 +10004e78: 3f01 subs r7, #1 +10004e7a: 057f lsls r7, r7, #21 +10004e7c: 1bc9 subs r1, r1, r7 +10004e7e: 0849 lsrs r1, r1, #1 +10004e80: 6f2e ldr r6, [r5, #112] @ 0x70 +10004e82: 3601 adds r6, #1 +10004e84: 0876 lsrs r6, r6, #1 +10004e86: 029c lsls r4, r3, #10 +10004e88: 0d95 lsrs r5, r2, #22 +10004e8a: 4325 orrs r5, r4 +10004e8c: 4375 muls r5, r6 +10004e8e: 13ed asrs r5, r5, #15 +10004e90: 4375 muls r5, r6 +10004e92: 13ad asrs r5, r5, #14 +10004e94: 3501 adds r5, #1 +10004e96: 106d asrs r5, r5, #1 +10004e98: 03f6 lsls r6, r6, #15 +10004e9a: 1b76 subs r6, r6, r5 +10004e9c: b40c push {r2, r3} +10004e9e: 02cc lsls r4, r1, #11 +10004ea0: 0d45 lsrs r5, r0, #21 +10004ea2: 432c orrs r4, r5 +10004ea4: b2a2 uxth r2, r4 +10004ea6: b2b3 uxth r3, r6 +10004ea8: 435a muls r2, r3 +10004eaa: 0c27 lsrs r7, r4, #16 +10004eac: 437b muls r3, r7 +10004eae: 0c35 lsrs r5, r6, #16 +10004eb0: 436f muls r7, r5 +10004eb2: b2a4 uxth r4, r4 +10004eb4: 436c muls r4, r5 +10004eb6: 191b adds r3, r3, r4 +10004eb8: d302 bcc.n 10004ec0 +10004eba: 2401 movs r4, #1 +10004ebc: 0424 lsls r4, r4, #16 +10004ebe: 193f adds r7, r7, r4 + +10004ec0 : +10004ec0: 041c lsls r4, r3, #16 +10004ec2: 0c1d lsrs r5, r3, #16 +10004ec4: 18a4 adds r4, r4, r2 +10004ec6: 417d adcs r5, r7 +10004ec8: 1924 adds r4, r4, r4 +10004eca: 416d adcs r5, r5 +10004ecc: 9a00 ldr r2, [sp, #0] +10004ece: b291 uxth r1, r2 +10004ed0: b2ac uxth r4, r5 +10004ed2: 4361 muls r1, r4 +10004ed4: 0c17 lsrs r7, r2, #16 +10004ed6: 437c muls r4, r7 +10004ed8: 0c2b lsrs r3, r5, #16 +10004eda: 435f muls r7, r3 +10004edc: b292 uxth r2, r2 +10004ede: 435a muls r2, r3 +10004ee0: 18a4 adds r4, r4, r2 +10004ee2: d302 bcc.n 10004eea +10004ee4: 2201 movs r2, #1 +10004ee6: 0412 lsls r2, r2, #16 +10004ee8: 18bf adds r7, r7, r2 + +10004eea : +10004eea: 0422 lsls r2, r4, #16 +10004eec: 0c23 lsrs r3, r4, #16 +10004eee: 1852 adds r2, r2, r1 +10004ef0: 417b adcs r3, r7 +10004ef2: 9c01 ldr r4, [sp, #4] +10004ef4: 436c muls r4, r5 +10004ef6: 191b adds r3, r3, r4 +10004ef8: 0e52 lsrs r2, r2, #25 +10004efa: 01d9 lsls r1, r3, #7 +10004efc: 430a orrs r2, r1 +10004efe: 0144 lsls r4, r0, #5 +10004f00: 1aa0 subs r0, r4, r2 +10004f02: b281 uxth r1, r0 +10004f04: b2b2 uxth r2, r6 +10004f06: 4351 muls r1, r2 +10004f08: 1403 asrs r3, r0, #16 +10004f0a: 435a muls r2, r3 +10004f0c: 0c36 lsrs r6, r6, #16 +10004f0e: 4373 muls r3, r6 +10004f10: b287 uxth r7, r0 +10004f12: 4377 muls r7, r6 +10004f14: 17d6 asrs r6, r2, #31 +10004f16: 19d2 adds r2, r2, r7 +10004f18: 2700 movs r7, #0 +10004f1a: 417e adcs r6, r7 +10004f1c: 0436 lsls r6, r6, #16 +10004f1e: 199b adds r3, r3, r6 +10004f20: 0417 lsls r7, r2, #16 +10004f22: 0c16 lsrs r6, r2, #16 +10004f24: 187f adds r7, r7, r1 +10004f26: 415e adcs r6, r3 +10004f28: 1673 asrs r3, r6, #25 +10004f2a: 18ed adds r5, r5, r3 +10004f2c: 01f3 lsls r3, r6, #7 +10004f2e: 2600 movs r6, #0 +10004f30: 3380 adds r3, #128 @ 0x80 +10004f32: 4175 adcs r5, r6 +10004f34: 0fa9 lsrs r1, r5, #30 +10004f36: d106 bne.n 10004f46 +10004f38: 0064 lsls r4, r4, #1 +10004f3a: 0a69 lsrs r1, r5, #9 +10004f3c: 05e8 lsls r0, r5, #23 +10004f3e: 0a5b lsrs r3, r3, #9 +10004f40: 4318 orrs r0, r3 +10004f42: d209 bcs.n 10004f58 +10004f44: e02f b.n 10004fa6 + +10004f46 : +10004f46: 2204 movs r2, #4 +10004f48: 4494 add ip, r2 +10004f4a: 3380 adds r3, #128 @ 0x80 +10004f4c: 4175 adcs r5, r6 +10004f4e: 0aa9 lsrs r1, r5, #10 +10004f50: 05a8 lsls r0, r5, #22 +10004f52: 0a9b lsrs r3, r3, #10 +10004f54: 4318 orrs r0, r3 +10004f56: d326 bcc.n 10004fa6 + +10004f58 : +10004f58: 4140 adcs r0, r0 +10004f5a: 4149 adcs r1, r1 +10004f5c: 0424 lsls r4, r4, #16 +10004f5e: 9a00 ldr r2, [sp, #0] +10004f60: 9b01 ldr r3, [sp, #4] +10004f62: 000d movs r5, r1 +10004f64: 4355 muls r5, r2 +10004f66: 1b64 subs r4, r4, r5 +10004f68: 4343 muls r3, r0 +10004f6a: 1ae4 subs r4, r4, r3 +10004f6c: b295 uxth r5, r2 +10004f6e: b286 uxth r6, r0 +10004f70: 4375 muls r5, r6 +10004f72: 0c17 lsrs r7, r2, #16 +10004f74: 437e muls r6, r7 +10004f76: 0c03 lsrs r3, r0, #16 +10004f78: 435f muls r7, r3 +10004f7a: b292 uxth r2, r2 +10004f7c: 435a muls r2, r3 +10004f7e: 18b6 adds r6, r6, r2 +10004f80: d302 bcc.n 10004f88 +10004f82: 2201 movs r2, #1 +10004f84: 0412 lsls r2, r2, #16 +10004f86: 18bf adds r7, r7, r2 + +10004f88 : +10004f88: 0432 lsls r2, r6, #16 +10004f8a: 0c33 lsrs r3, r6, #16 +10004f8c: 1952 adds r2, r2, r5 +10004f8e: 417b adcs r3, r7 +10004f90: 4252 negs r2, r2 +10004f92: 419c sbcs r4, r3 +10004f94: 2c00 cmp r4, #0 +10004f96: d402 bmi.n 10004f9e +10004f98: 2200 movs r2, #0 +10004f9a: 3001 adds r0, #1 +10004f9c: 4151 adcs r1, r2 +10004f9e: 0840 lsrs r0, r0, #1 +10004fa0: 07ca lsls r2, r1, #31 +10004fa2: 4310 orrs r0, r2 +10004fa4: 0849 lsrs r1, r1, #1 + +10004fa6 : +10004fa6: b002 add sp, #8 +10004fa8: 4662 mov r2, ip +10004faa: 07d7 lsls r7, r2, #31 +10004fac: 1092 asrs r2, r2, #2 +10004fae: 4b08 ldr r3, [pc, #32] @ (10004fd0 ) +10004fb0: 18d2 adds r2, r2, r3 +10004fb2: 4b08 ldr r3, [pc, #32] @ (10004fd4 ) +10004fb4: 429a cmp r2, r3 +10004fb6: d203 bcs.n 10004fc0 +10004fb8: 0512 lsls r2, r2, #20 +10004fba: 1889 adds r1, r1, r2 + +10004fbc : +10004fbc: 19c9 adds r1, r1, r7 +10004fbe: bdf0 pop {r4, r5, r6, r7, pc} + +10004fc0 : +10004fc0: 2000 movs r0, #0 +10004fc2: 2a00 cmp r2, #0 +10004fc4: dc01 bgt.n 10004fca +10004fc6: 0039 movs r1, r7 +10004fc8: bdf0 pop {r4, r5, r6, r7, pc} + +10004fca : +10004fca: 3301 adds r3, #1 +10004fcc: 0519 lsls r1, r3, #20 +10004fce: e7f5 b.n 10004fbc +10004fd0: 000003fd .word 0x000003fd +10004fd4: 000007fe .word 0x000007fe + +10004fd8 : +10004fd8: 2200 movs r2, #0 + +10004fda : +10004fda: b500 push {lr} +10004fdc: 3220 adds r2, #32 +10004fde: f000 f804 bl 10004fea +10004fe2: 0008 movs r0, r1 +10004fe4: bd00 pop {pc} ... -10004344 : -10004344: 2200 movs r2, #0 - -10004346 : -10004346: 150b asrs r3, r1, #20 -10004348: d40a bmi.n 10004360 - -1000434a : -1000434a: b510 push {r4, lr} -1000434c: 4694 mov ip, r2 -1000434e: f000 f831 bl 100043b4 -10004352: 1414 asrs r4, r2, #16 -10004354: 3401 adds r4, #1 -10004356: da00 bge.n 1000435a -10004358: 2100 movs r1, #0 -1000435a: 17cb asrs r3, r1, #31 -1000435c: 4c14 ldr r4, [pc, #80] @ (100043b0 ) -1000435e: 4720 bx r4 - -10004360 : -10004360: 2000 movs r0, #0 -10004362: 2100 movs r1, #0 -10004364: 4770 bx lr - -10004366 : -10004366: 4462 add r2, ip -10004368: 3a34 subs r2, #52 @ 0x34 -1000436a: d40c bmi.n 10004386 -1000436c: 2a0c cmp r2, #12 -1000436e: da07 bge.n 10004380 -10004370: 0004 movs r4, r0 -10004372: 4091 lsls r1, r2 -10004374: 4090 lsls r0, r2 -10004376: 4252 negs r2, r2 -10004378: 3220 adds r2, #32 -1000437a: 40d4 lsrs r4, r2 -1000437c: 4321 orrs r1, r4 -1000437e: bd10 pop {r4, pc} -10004380: 43d8 mvns r0, r3 -10004382: 43d9 mvns r1, r3 -10004384: bd10 pop {r4, pc} -10004386: 3220 adds r2, #32 -10004388: d407 bmi.n 1000439a -1000438a: 460c mov r4, r1 -1000438c: 4094 lsls r4, r2 -1000438e: 4252 negs r2, r2 -10004390: 3220 adds r2, #32 -10004392: 4111 asrs r1, r2 -10004394: 40d0 lsrs r0, r2 -10004396: 4320 orrs r0, r4 -10004398: bd10 pop {r4, pc} -1000439a: 0008 movs r0, r1 -1000439c: 17c9 asrs r1, r1, #31 -1000439e: 3220 adds r2, #32 -100043a0: d403 bmi.n 100043aa -100043a2: 4252 negs r2, r2 -100043a4: 3220 adds r2, #32 -100043a6: 4110 asrs r0, r2 -100043a8: bd10 pop {r4, pc} -100043aa: 0018 movs r0, r3 -100043ac: 0019 movs r1, r3 -100043ae: bd10 pop {r4, pc} -100043b0: 10004367 .word 0x10004367 - -100043b4 : -100043b4: 0d0a lsrs r2, r1, #20 -100043b6: 0fcc lsrs r4, r1, #31 -100043b8: 1e53 subs r3, r2, #1 -100043ba: 051b lsls r3, r3, #20 -100043bc: 1ac9 subs r1, r1, r3 -100043be: 0552 lsls r2, r2, #21 -100043c0: d303 bcc.n 100043ca -100043c2: 43c9 mvns r1, r1 -100043c4: 4240 negs r0, r0 -100043c6: d300 bcc.n 100043ca -100043c8: 3101 adds r1, #1 - -100043ca : -100043ca: 0d52 lsrs r2, r2, #21 -100043cc: d003 beq.n 100043d6 -100043ce: 1c53 adds r3, r2, #1 -100043d0: 0adb lsrs r3, r3, #11 -100043d2: d007 beq.n 100043e4 -100043d4: 1b12 subs r2, r2, r4 - -100043d6 : -100043d6: 2000 movs r0, #0 -100043d8: 0064 lsls r4, r4, #1 -100043da: 1c61 adds r1, r4, #1 -100043dc: 0789 lsls r1, r1, #30 -100043de: 1289 asrs r1, r1, #10 -100043e0: 3a80 subs r2, #128 @ 0x80 -100043e2: 0312 lsls r2, r2, #12 - -100043e4 : -100043e4: 4b01 ldr r3, [pc, #4] @ (100043ec ) -100043e6: 1ad2 subs r2, r2, r3 -100043e8: 4770 bx lr -100043ea: 0000 .short 0x0000 -100043ec: 000003ff .word 0x000003ff - -100043f0 <__wrap___aeabi_lmul>: -100043f0: 4351 muls r1, r2 -100043f2: 4343 muls r3, r0 -100043f4: 18c9 adds r1, r1, r3 -100043f6: 468c mov ip, r1 -100043f8: 0c11 lsrs r1, r2, #16 -100043fa: b283 uxth r3, r0 -100043fc: 434b muls r3, r1 -100043fe: b410 push {r4} -10004400: 0c04 lsrs r4, r0, #16 -10004402: 4361 muls r1, r4 -10004404: b292 uxth r2, r2 -10004406: b280 uxth r0, r0 -10004408: 4350 muls r0, r2 -1000440a: 4362 muls r2, r4 -1000440c: 041c lsls r4, r3, #16 -1000440e: 0c1b lsrs r3, r3, #16 -10004410: 1900 adds r0, r0, r4 -10004412: bc10 pop {r4} -10004414: 4159 adcs r1, r3 -10004416: 0413 lsls r3, r2, #16 -10004418: 0c12 lsrs r2, r2, #16 -1000441a: 18c0 adds r0, r0, r3 -1000441c: 4151 adcs r1, r2 -1000441e: 4461 add r1, ip -10004420: 4770 bx lr +10004fe8 : +10004fe8: 2200 movs r2, #0 + +10004fea : +10004fea: 150b asrs r3, r1, #20 +10004fec: d40a bmi.n 10005004 + +10004fee : +10004fee: b510 push {r4, lr} +10004ff0: 4694 mov ip, r2 +10004ff2: f000 f831 bl 10005058 +10004ff6: 1414 asrs r4, r2, #16 +10004ff8: 3401 adds r4, #1 +10004ffa: da00 bge.n 10004ffe +10004ffc: 2100 movs r1, #0 +10004ffe: 17cb asrs r3, r1, #31 +10005000: 4c14 ldr r4, [pc, #80] @ (10005054 ) +10005002: 4720 bx r4 + +10005004 : +10005004: 2000 movs r0, #0 +10005006: 2100 movs r1, #0 +10005008: 4770 bx lr + +1000500a : +1000500a: 4462 add r2, ip +1000500c: 3a34 subs r2, #52 @ 0x34 +1000500e: d40c bmi.n 1000502a +10005010: 2a0c cmp r2, #12 +10005012: da07 bge.n 10005024 +10005014: 0004 movs r4, r0 +10005016: 4091 lsls r1, r2 +10005018: 4090 lsls r0, r2 +1000501a: 4252 negs r2, r2 +1000501c: 3220 adds r2, #32 +1000501e: 40d4 lsrs r4, r2 +10005020: 4321 orrs r1, r4 +10005022: bd10 pop {r4, pc} +10005024: 43d8 mvns r0, r3 +10005026: 43d9 mvns r1, r3 +10005028: bd10 pop {r4, pc} +1000502a: 3220 adds r2, #32 +1000502c: d407 bmi.n 1000503e +1000502e: 460c mov r4, r1 +10005030: 4094 lsls r4, r2 +10005032: 4252 negs r2, r2 +10005034: 3220 adds r2, #32 +10005036: 4111 asrs r1, r2 +10005038: 40d0 lsrs r0, r2 +1000503a: 4320 orrs r0, r4 +1000503c: bd10 pop {r4, pc} +1000503e: 0008 movs r0, r1 +10005040: 17c9 asrs r1, r1, #31 +10005042: 3220 adds r2, #32 +10005044: d403 bmi.n 1000504e +10005046: 4252 negs r2, r2 +10005048: 3220 adds r2, #32 +1000504a: 4110 asrs r0, r2 +1000504c: bd10 pop {r4, pc} +1000504e: 0018 movs r0, r3 +10005050: 0019 movs r1, r3 +10005052: bd10 pop {r4, pc} +10005054: 1000500b .word 0x1000500b + +10005058 : +10005058: 0d0a lsrs r2, r1, #20 +1000505a: 0fcc lsrs r4, r1, #31 +1000505c: 1e53 subs r3, r2, #1 +1000505e: 051b lsls r3, r3, #20 +10005060: 1ac9 subs r1, r1, r3 +10005062: 0552 lsls r2, r2, #21 +10005064: d303 bcc.n 1000506e +10005066: 43c9 mvns r1, r1 +10005068: 4240 negs r0, r0 +1000506a: d300 bcc.n 1000506e +1000506c: 3101 adds r1, #1 + +1000506e : +1000506e: 0d52 lsrs r2, r2, #21 +10005070: d003 beq.n 1000507a +10005072: 1c53 adds r3, r2, #1 +10005074: 0adb lsrs r3, r3, #11 +10005076: d007 beq.n 10005088 +10005078: 1b12 subs r2, r2, r4 + +1000507a : +1000507a: 2000 movs r0, #0 +1000507c: 0064 lsls r4, r4, #1 +1000507e: 1c61 adds r1, r4, #1 +10005080: 0789 lsls r1, r1, #30 +10005082: 1289 asrs r1, r1, #10 +10005084: 3a80 subs r2, #128 @ 0x80 +10005086: 0312 lsls r2, r2, #12 + +10005088 : +10005088: 4b01 ldr r3, [pc, #4] @ (10005090 ) +1000508a: 1ad2 subs r2, r2, r3 +1000508c: 4770 bx lr +1000508e: 0000 .short 0x0000 +10005090: 000003ff .word 0x000003ff + +10005094 <__wrap___aeabi_lmul>: +10005094: 4351 muls r1, r2 +10005096: 4343 muls r3, r0 +10005098: 18c9 adds r1, r1, r3 +1000509a: 468c mov ip, r1 +1000509c: 0c11 lsrs r1, r2, #16 +1000509e: b283 uxth r3, r0 +100050a0: 434b muls r3, r1 +100050a2: b410 push {r4} +100050a4: 0c04 lsrs r4, r0, #16 +100050a6: 4361 muls r1, r4 +100050a8: b292 uxth r2, r2 +100050aa: b280 uxth r0, r0 +100050ac: 4350 muls r0, r2 +100050ae: 4362 muls r2, r4 +100050b0: 041c lsls r4, r3, #16 +100050b2: 0c1b lsrs r3, r3, #16 +100050b4: 1900 adds r0, r0, r4 +100050b6: bc10 pop {r4} +100050b8: 4159 adcs r1, r3 +100050ba: 0413 lsls r3, r2, #16 +100050bc: 0c12 lsrs r2, r2, #16 +100050be: 18c0 adds r0, r0, r3 +100050c0: 4151 adcs r1, r2 +100050c2: 4461 add r1, ip +100050c4: 4770 bx lr ... -10004424 <__aeabi_float_init>: -10004424: 2313 movs r3, #19 -10004426: b510 push {r4, lr} -10004428: 4812 ldr r0, [pc, #72] @ (10004474 <__aeabi_float_init+0x50>) -1000442a: 781c ldrb r4, [r3, #0] -1000442c: f7ff f976 bl 1000371c -10004430: 0001 movs r1, r0 -10004432: 2c01 cmp r4, #1 -10004434: d00a beq.n 1000444c <__aeabi_float_init+0x28> -10004436: dd03 ble.n 10004440 <__aeabi_float_init+0x1c> -10004438: 2280 movs r2, #128 @ 0x80 -1000443a: 480f ldr r0, [pc, #60] @ (10004478 <__aeabi_float_init+0x54>) -1000443c: f000 f848 bl 100044d0 <__wrap___aeabi_memcpy> -10004440: 480e ldr r0, [pc, #56] @ (1000447c <__aeabi_float_init+0x58>) -10004442: f7ff f963 bl 1000370c -10004446: 4b0e ldr r3, [pc, #56] @ (10004480 <__aeabi_float_init+0x5c>) -10004448: 6018 str r0, [r3, #0] -1000444a: bd10 pop {r4, pc} -1000444c: 4c0a ldr r4, [pc, #40] @ (10004478 <__aeabi_float_init+0x54>) -1000444e: 2254 movs r2, #84 @ 0x54 -10004450: 0020 movs r0, r4 -10004452: f000 f83d bl 100044d0 <__wrap___aeabi_memcpy> -10004456: 4b0b ldr r3, [pc, #44] @ (10004484 <__aeabi_float_init+0x60>) -10004458: 6563 str r3, [r4, #84] @ 0x54 -1000445a: 65a3 str r3, [r4, #88] @ 0x58 -1000445c: 65e3 str r3, [r4, #92] @ 0x5c -1000445e: 6623 str r3, [r4, #96] @ 0x60 -10004460: 6663 str r3, [r4, #100] @ 0x64 -10004462: 66a3 str r3, [r4, #104] @ 0x68 -10004464: 66e3 str r3, [r4, #108] @ 0x6c -10004466: 6723 str r3, [r4, #112] @ 0x70 -10004468: 6763 str r3, [r4, #116] @ 0x74 -1000446a: 67a3 str r3, [r4, #120] @ 0x78 -1000446c: 67e3 str r3, [r4, #124] @ 0x7c -1000446e: 6223 str r3, [r4, #32] -10004470: 61e3 str r3, [r4, #28] -10004472: e7e5 b.n 10004440 <__aeabi_float_init+0x1c> -10004474: 00004653 .word 0x00004653 -10004478: 20001128 .word 0x20001128 -1000447c: 0000334c .word 0x0000334c -10004480: 20001c48 .word 0x20001c48 -10004484: 10004489 .word 0x10004489 - -10004488 : -10004488: b507 push {r0, r1, r2, lr} -1000448a: 4660 mov r0, ip -1000448c: 8801 ldrh r1, [r0, #0] -1000448e: 0a0a lsrs r2, r1, #8 -10004490: 3002 adds r0, #2 -10004492: 2adf cmp r2, #223 @ 0xdf -10004494: d1fa bne.n 1000448c -10004496: b2c9 uxtb r1, r1 -10004498: 0882 lsrs r2, r0, #2 -1000449a: d304 bcc.n 100044a6 -1000449c: 8802 ldrh r2, [r0, #0] -1000449e: 8840 ldrh r0, [r0, #2] -100044a0: 0400 lsls r0, r0, #16 -100044a2: 4310 orrs r0, r2 -100044a4: e000 b.n 100044a8 -100044a6: 6800 ldr r0, [r0, #0] -100044a8: 4a01 ldr r2, [pc, #4] @ (100044b0 ) -100044aa: 5050 str r0, [r2, r1] -100044ac: 9003 str r0, [sp, #12] -100044ae: bd07 pop {r0, r1, r2, pc} -100044b0: 20001128 .word 0x20001128 - -100044b4 <__aeabi_mem_init>: -100044b4: 4801 ldr r0, [pc, #4] @ (100044bc <__aeabi_mem_init+0x8>) -100044b6: 2104 movs r1, #4 -100044b8: 4b01 ldr r3, [pc, #4] @ (100044c0 <__aeabi_mem_init+0xc>) -100044ba: 4718 bx r3 -100044bc: 20000e70 .word 0x20000e70 -100044c0: 1000372d .word 0x1000372d - -100044c4 <__wrap_memset>: -100044c4: 4b01 ldr r3, [pc, #4] @ (100044cc <__wrap_memset+0x8>) -100044c6: 681b ldr r3, [r3, #0] -100044c8: 4718 bx r3 -100044ca: 0000 .short 0x0000 -100044cc: 20000e70 .word 0x20000e70 - -100044d0 <__wrap___aeabi_memcpy>: -100044d0: 4b01 ldr r3, [pc, #4] @ (100044d8 <__wrap___aeabi_memcpy+0x8>) -100044d2: 685b ldr r3, [r3, #4] -100044d4: 4718 bx r3 -100044d6: 0000 .short 0x0000 -100044d8: 20000e70 .word 0x20000e70 - -100044dc : -100044dc: b5f0 push {r4, r5, r6, r7, lr} -100044de: 46c6 mov lr, r8 -100044e0: b500 push {lr} -100044e2: 7d43 ldrb r3, [r0, #21] -100044e4: 0007 movs r7, r0 -100044e6: 000d movs r5, r1 -100044e8: 0016 movs r6, r2 -100044ea: 2b00 cmp r3, #0 -100044ec: d038 beq.n 10004560 -100044ee: 2a00 cmp r2, #0 -100044f0: dd2e ble.n 10004550 -100044f2: 2100 movs r1, #0 -100044f4: 1e6a subs r2, r5, #1 -100044f6: 4690 mov r8, r2 -100044f8: 5c6a ldrb r2, [r5, r1] -100044fa: 7d03 ldrb r3, [r0, #20] -100044fc: 1c4c adds r4, r1, #1 -100044fe: 2000 movs r0, #0 -10004500: 2a0a cmp r2, #10 -10004502: d00c beq.n 1000451e -10004504: 42a6 cmp r6, r4 -10004506: d016 beq.n 10004536 -10004508: 4643 mov r3, r8 -1000450a: 5d1b ldrb r3, [r3, r4] -1000450c: 0021 movs r1, r4 -1000450e: 3b0d subs r3, #13 -10004510: 425a negs r2, r3 -10004512: 4153 adcs r3, r2 -10004514: 5c6a ldrb r2, [r5, r1] -10004516: b2db uxtb r3, r3 -10004518: 1c4c adds r4, r1, #1 -1000451a: 2a0a cmp r2, #10 -1000451c: d1f2 bne.n 10004504 -1000451e: 2b00 cmp r3, #0 -10004520: d1f0 bne.n 10004504 -10004522: 4288 cmp r0, r1 -10004524: db17 blt.n 10004556 -10004526: 2102 movs r1, #2 -10004528: 4810 ldr r0, [pc, #64] @ (1000456c ) -1000452a: 683b ldr r3, [r7, #0] -1000452c: 4798 blx r3 -1000452e: 42a6 cmp r6, r4 -10004530: d007 beq.n 10004542 -10004532: 0020 movs r0, r4 -10004534: e7e8 b.n 10004508 -10004536: 4286 cmp r6, r0 -10004538: dd03 ble.n 10004542 -1000453a: 1a31 subs r1, r6, r0 -1000453c: 683b ldr r3, [r7, #0] -1000453e: 1828 adds r0, r5, r0 -10004540: 4798 blx r3 -10004542: 19ad adds r5, r5, r6 -10004544: 3d01 subs r5, #1 -10004546: 782b ldrb r3, [r5, #0] -10004548: 3b0d subs r3, #13 -1000454a: 425a negs r2, r3 -1000454c: 4153 adcs r3, r2 -1000454e: 753b strb r3, [r7, #20] -10004550: bc80 pop {r7} -10004552: 46b8 mov r8, r7 -10004554: bdf0 pop {r4, r5, r6, r7, pc} -10004556: 1a09 subs r1, r1, r0 -10004558: 683b ldr r3, [r7, #0] -1000455a: 1828 adds r0, r5, r0 -1000455c: 4798 blx r3 -1000455e: e7e2 b.n 10004526 -10004560: 6803 ldr r3, [r0, #0] -10004562: 0011 movs r1, r2 -10004564: 0028 movs r0, r5 -10004566: 4798 blx r3 -10004568: e7f2 b.n 10004550 -1000456a: 46c0 nop @ (mov r8, r8) -1000456c: 100071f4 .word 0x100071f4 - -10004570 : -10004570: b5f0 push {r4, r5, r6, r7, lr} -10004572: 46c6 mov lr, r8 -10004574: 680b ldr r3, [r1, #0] -10004576: 0006 movs r6, r0 -10004578: 000c movs r4, r1 -1000457a: b500 push {lr} -1000457c: 2b80 cmp r3, #128 @ 0x80 -1000457e: d006 beq.n 1000458e -10004580: 1c5a adds r2, r3, #1 -10004582: 6022 str r2, [r4, #0] -10004584: 18e4 adds r4, r4, r3 -10004586: 7126 strb r6, [r4, #4] -10004588: bc80 pop {r7} -1000458a: 46b8 mov r8, r7 -1000458c: bdf0 pop {r4, r5, r6, r7, pc} -1000458e: 4b0f ldr r3, [pc, #60] @ (100045cc ) -10004590: 681d ldr r5, [r3, #0] -10004592: 2d00 cmp r5, #0 -10004594: d016 beq.n 100045c4 -10004596: 1d0b adds r3, r1, #4 -10004598: 4698 mov r8, r3 -1000459a: 4f0d ldr r7, [pc, #52] @ (100045d0 ) -1000459c: e002 b.n 100045a4 -1000459e: 692d ldr r5, [r5, #16] -100045a0: 2d00 cmp r5, #0 -100045a2: d00f beq.n 100045c4 -100045a4: 682b ldr r3, [r5, #0] -100045a6: 2b00 cmp r3, #0 -100045a8: d0f9 beq.n 1000459e -100045aa: 683b ldr r3, [r7, #0] -100045ac: 2b00 cmp r3, #0 -100045ae: d001 beq.n 100045b4 -100045b0: 42ab cmp r3, r5 -100045b2: d1f4 bne.n 1000459e -100045b4: 0028 movs r0, r5 -100045b6: 4641 mov r1, r8 -100045b8: 6822 ldr r2, [r4, #0] -100045ba: f7ff ff8f bl 100044dc -100045be: 692d ldr r5, [r5, #16] -100045c0: 2d00 cmp r5, #0 -100045c2: d1ef bne.n 100045a4 -100045c4: 2201 movs r2, #1 -100045c6: 2300 movs r3, #0 -100045c8: e7db b.n 10004582 -100045ca: 46c0 nop @ (mov r8, r8) -100045cc: 200017f8 .word 0x200017f8 -100045d0: 20001800 .word 0x20001800 - -100045d4 <__wrap_putchar>: -100045d4: b5f0 push {r4, r5, r6, r7, lr} -100045d6: 46ce mov lr, r9 -100045d8: 4647 mov r7, r8 -100045da: b580 push {r7, lr} -100045dc: b083 sub sp, #12 -100045de: 466b mov r3, sp -100045e0: 0006 movs r6, r0 -100045e2: 1ddd adds r5, r3, #7 -100045e4: 7028 strb r0, [r5, #0] -100045e6: f7fc fe6b bl 100012c0 -100045ea: 2300 movs r3, #0 -100045ec: 4a1a ldr r2, [pc, #104] @ (10004658 <__wrap_putchar+0x84>) -100045ee: 1812 adds r2, r2, r0 -100045f0: 414b adcs r3, r1 -100045f2: 2180 movs r1, #128 @ 0x80 -100045f4: 0609 lsls r1, r1, #24 -100045f6: 428b cmp r3, r1 -100045f8: d302 bcc.n 10004600 <__wrap_putchar+0x2c> -100045fa: 2201 movs r2, #1 -100045fc: 4b17 ldr r3, [pc, #92] @ (1000465c <__wrap_putchar+0x88>) -100045fe: 4252 negs r2, r2 -10004600: 4917 ldr r1, [pc, #92] @ (10004660 <__wrap_putchar+0x8c>) -10004602: 0008 movs r0, r1 -10004604: 4688 mov r8, r1 -10004606: f002 fbe7 bl 10006dd8 <__mutex_try_enter_block_until_veneer> -1000460a: 4b16 ldr r3, [pc, #88] @ (10004664 <__wrap_putchar+0x90>) -1000460c: 4681 mov r9, r0 -1000460e: 681c ldr r4, [r3, #0] -10004610: 2c00 cmp r4, #0 -10004612: d014 beq.n 1000463e <__wrap_putchar+0x6a> -10004614: 4f14 ldr r7, [pc, #80] @ (10004668 <__wrap_putchar+0x94>) -10004616: e002 b.n 1000461e <__wrap_putchar+0x4a> -10004618: 6924 ldr r4, [r4, #16] -1000461a: 2c00 cmp r4, #0 -1000461c: d00f beq.n 1000463e <__wrap_putchar+0x6a> -1000461e: 6823 ldr r3, [r4, #0] -10004620: 2b00 cmp r3, #0 -10004622: d0f9 beq.n 10004618 <__wrap_putchar+0x44> -10004624: 683b ldr r3, [r7, #0] -10004626: 2b00 cmp r3, #0 -10004628: d001 beq.n 1000462e <__wrap_putchar+0x5a> -1000462a: 42a3 cmp r3, r4 -1000462c: d1f4 bne.n 10004618 <__wrap_putchar+0x44> -1000462e: 0020 movs r0, r4 -10004630: 2201 movs r2, #1 -10004632: 0029 movs r1, r5 -10004634: f7ff ff52 bl 100044dc -10004638: 6924 ldr r4, [r4, #16] -1000463a: 2c00 cmp r4, #0 -1000463c: d1ef bne.n 1000461e <__wrap_putchar+0x4a> -1000463e: 464b mov r3, r9 -10004640: 2b00 cmp r3, #0 -10004642: d105 bne.n 10004650 <__wrap_putchar+0x7c> -10004644: 0030 movs r0, r6 -10004646: b003 add sp, #12 -10004648: bcc0 pop {r6, r7} -1000464a: 46b9 mov r9, r7 -1000464c: 46b0 mov r8, r6 -1000464e: bdf0 pop {r4, r5, r6, r7, pc} -10004650: 4640 mov r0, r8 -10004652: f002 fb89 bl 10006d68 <__mutex_exit_veneer> -10004656: e7f5 b.n 10004644 <__wrap_putchar+0x70> -10004658: 000f4240 .word 0x000f4240 -1000465c: 7fffffff .word 0x7fffffff -10004660: 20000ed8 .word 0x20000ed8 -10004664: 200017f8 .word 0x200017f8 -10004668: 20001800 .word 0x20001800 - -1000466c <__wrap_puts>: -1000466c: b5f0 push {r4, r5, r6, r7, lr} -1000466e: 46de mov lr, fp -10004670: 4657 mov r7, sl -10004672: 464e mov r6, r9 -10004674: 4645 mov r5, r8 -10004676: b5e0 push {r5, r6, r7, lr} -10004678: b085 sub sp, #20 -1000467a: 0007 movs r7, r0 -1000467c: f002 fb3a bl 10006cf4 -10004680: 0006 movs r6, r0 -10004682: f7fc fe1d bl 100012c0 -10004686: 2300 movs r3, #0 -10004688: 4a2b ldr r2, [pc, #172] @ (10004738 <__wrap_puts+0xcc>) -1000468a: 1812 adds r2, r2, r0 -1000468c: 414b adcs r3, r1 -1000468e: 2180 movs r1, #128 @ 0x80 -10004690: 0609 lsls r1, r1, #24 -10004692: 428b cmp r3, r1 -10004694: d302 bcc.n 1000469c <__wrap_puts+0x30> -10004696: 2201 movs r2, #1 -10004698: 4b28 ldr r3, [pc, #160] @ (1000473c <__wrap_puts+0xd0>) -1000469a: 4252 negs r2, r2 -1000469c: 4928 ldr r1, [pc, #160] @ (10004740 <__wrap_puts+0xd4>) -1000469e: 0008 movs r0, r1 -100046a0: 468b mov fp, r1 -100046a2: f002 fb99 bl 10006dd8 <__mutex_try_enter_block_until_veneer> -100046a6: 4b27 ldr r3, [pc, #156] @ (10004744 <__wrap_puts+0xd8>) -100046a8: 9001 str r0, [sp, #4] -100046aa: 681c ldr r4, [r3, #0] -100046ac: 469a mov sl, r3 -100046ae: 2c00 cmp r4, #0 -100046b0: d03b beq.n 1000472a <__wrap_puts+0xbe> -100046b2: 4b25 ldr r3, [pc, #148] @ (10004748 <__wrap_puts+0xdc>) -100046b4: 4698 mov r8, r3 -100046b6: ab02 add r3, sp, #8 -100046b8: 1ddd adds r5, r3, #7 -100046ba: 230a movs r3, #10 -100046bc: 4699 mov r9, r3 -100046be: e002 b.n 100046c6 <__wrap_puts+0x5a> -100046c0: 6924 ldr r4, [r4, #16] -100046c2: 2c00 cmp r4, #0 -100046c4: d017 beq.n 100046f6 <__wrap_puts+0x8a> -100046c6: 6823 ldr r3, [r4, #0] -100046c8: 2b00 cmp r3, #0 -100046ca: d0f9 beq.n 100046c0 <__wrap_puts+0x54> -100046cc: 4643 mov r3, r8 -100046ce: 681b ldr r3, [r3, #0] -100046d0: 2b00 cmp r3, #0 -100046d2: d001 beq.n 100046d8 <__wrap_puts+0x6c> -100046d4: 429c cmp r4, r3 -100046d6: d1f3 bne.n 100046c0 <__wrap_puts+0x54> -100046d8: 0020 movs r0, r4 -100046da: 0032 movs r2, r6 -100046dc: 0039 movs r1, r7 -100046de: f7ff fefd bl 100044dc -100046e2: 464b mov r3, r9 -100046e4: 0020 movs r0, r4 -100046e6: 2201 movs r2, #1 -100046e8: 0029 movs r1, r5 -100046ea: 702b strb r3, [r5, #0] -100046ec: f7ff fef6 bl 100044dc -100046f0: 6924 ldr r4, [r4, #16] -100046f2: 2c00 cmp r4, #0 -100046f4: d1e7 bne.n 100046c6 <__wrap_puts+0x5a> -100046f6: 9b01 ldr r3, [sp, #4] -100046f8: 2b00 cmp r3, #0 -100046fa: d118 bne.n 1000472e <__wrap_puts+0xc2> -100046fc: 4653 mov r3, sl -100046fe: 681c ldr r4, [r3, #0] -10004700: 2c00 cmp r4, #0 -10004702: d006 beq.n 10004712 <__wrap_puts+0xa6> -10004704: 6863 ldr r3, [r4, #4] -10004706: 2b00 cmp r3, #0 -10004708: d00b beq.n 10004722 <__wrap_puts+0xb6> -1000470a: 4798 blx r3 -1000470c: 6924 ldr r4, [r4, #16] -1000470e: 2c00 cmp r4, #0 -10004710: d1f8 bne.n 10004704 <__wrap_puts+0x98> -10004712: 0030 movs r0, r6 -10004714: b005 add sp, #20 -10004716: bcf0 pop {r4, r5, r6, r7} -10004718: 46bb mov fp, r7 -1000471a: 46b2 mov sl, r6 -1000471c: 46a9 mov r9, r5 -1000471e: 46a0 mov r8, r4 -10004720: bdf0 pop {r4, r5, r6, r7, pc} -10004722: 6924 ldr r4, [r4, #16] -10004724: 2c00 cmp r4, #0 -10004726: d1ed bne.n 10004704 <__wrap_puts+0x98> -10004728: e7f3 b.n 10004712 <__wrap_puts+0xa6> -1000472a: 2800 cmp r0, #0 -1000472c: d0f1 beq.n 10004712 <__wrap_puts+0xa6> -1000472e: 4658 mov r0, fp -10004730: f002 fb1a bl 10006d68 <__mutex_exit_veneer> -10004734: e7e2 b.n 100046fc <__wrap_puts+0x90> -10004736: 46c0 nop @ (mov r8, r8) -10004738: 000f4240 .word 0x000f4240 -1000473c: 7fffffff .word 0x7fffffff -10004740: 20000ed8 .word 0x20000ed8 -10004744: 200017f8 .word 0x200017f8 -10004748: 20001800 .word 0x20001800 - -1000474c : -1000474c: 4a0a ldr r2, [pc, #40] @ (10004778 ) -1000474e: 6813 ldr r3, [r2, #0] -10004750: 2b00 cmp r3, #0 -10004752: d105 bne.n 10004760 -10004754: e00c b.n 10004770 -10004756: 001a movs r2, r3 -10004758: 691b ldr r3, [r3, #16] -1000475a: 3210 adds r2, #16 -1000475c: 2b00 cmp r3, #0 -1000475e: d007 beq.n 10004770 -10004760: 4298 cmp r0, r3 -10004762: d1f8 bne.n 10004756 -10004764: 2900 cmp r1, #0 -10004766: d102 bne.n 1000476e -10004768: 6903 ldr r3, [r0, #16] -1000476a: 6013 str r3, [r2, #0] -1000476c: 6101 str r1, [r0, #16] -1000476e: 4770 bx lr -10004770: 2900 cmp r1, #0 -10004772: d0fc beq.n 1000476e -10004774: 6010 str r0, [r2, #0] -10004776: e7fa b.n 1000476e -10004778: 200017f8 .word 0x200017f8 - -1000477c <__wrap_vprintf>: -1000477c: b5f0 push {r4, r5, r6, r7, lr} -1000477e: 46ce mov lr, r9 -10004780: 4647 mov r7, r8 -10004782: b580 push {r7, lr} -10004784: b0a3 sub sp, #140 @ 0x8c -10004786: 0004 movs r4, r0 -10004788: 000d movs r5, r1 -1000478a: f7fc fd99 bl 100012c0 -1000478e: 2300 movs r3, #0 -10004790: 4a29 ldr r2, [pc, #164] @ (10004838 <__wrap_vprintf+0xbc>) -10004792: 1812 adds r2, r2, r0 -10004794: 414b adcs r3, r1 -10004796: 2180 movs r1, #128 @ 0x80 -10004798: 0609 lsls r1, r1, #24 -1000479a: 428b cmp r3, r1 -1000479c: d302 bcc.n 100047a4 <__wrap_vprintf+0x28> -1000479e: 2201 movs r2, #1 -100047a0: 4b26 ldr r3, [pc, #152] @ (1000483c <__wrap_vprintf+0xc0>) -100047a2: 4252 negs r2, r2 -100047a4: 4f26 ldr r7, [pc, #152] @ (10004840 <__wrap_vprintf+0xc4>) -100047a6: 0038 movs r0, r7 -100047a8: f002 fb16 bl 10006dd8 <__mutex_try_enter_block_until_veneer> -100047ac: 2300 movs r3, #0 -100047ae: 0006 movs r6, r0 -100047b0: 9301 str r3, [sp, #4] -100047b2: 0022 movs r2, r4 -100047b4: 002b movs r3, r5 -100047b6: 4823 ldr r0, [pc, #140] @ (10004844 <__wrap_vprintf+0xc8>) -100047b8: a901 add r1, sp, #4 -100047ba: f7fe ff77 bl 100036ac -100047be: 9b01 ldr r3, [sp, #4] -100047c0: 4680 mov r8, r0 -100047c2: 2b00 cmp r3, #0 -100047c4: d114 bne.n 100047f0 <__wrap_vprintf+0x74> -100047c6: 4b20 ldr r3, [pc, #128] @ (10004848 <__wrap_vprintf+0xcc>) -100047c8: 681c ldr r4, [r3, #0] -100047ca: 2c00 cmp r4, #0 -100047cc: d006 beq.n 100047dc <__wrap_vprintf+0x60> -100047ce: 6863 ldr r3, [r4, #4] -100047d0: 2b00 cmp r3, #0 -100047d2: d00b beq.n 100047ec <__wrap_vprintf+0x70> -100047d4: 4798 blx r3 -100047d6: 6924 ldr r4, [r4, #16] -100047d8: 2c00 cmp r4, #0 -100047da: d1f8 bne.n 100047ce <__wrap_vprintf+0x52> -100047dc: 2e00 cmp r6, #0 -100047de: d125 bne.n 1000482c <__wrap_vprintf+0xb0> -100047e0: 4640 mov r0, r8 -100047e2: b023 add sp, #140 @ 0x8c -100047e4: bcc0 pop {r6, r7} -100047e6: 46b9 mov r9, r7 -100047e8: 46b0 mov r8, r6 -100047ea: bdf0 pop {r4, r5, r6, r7, pc} -100047ec: 6924 ldr r4, [r4, #16] -100047ee: e7ec b.n 100047ca <__wrap_vprintf+0x4e> -100047f0: 4b15 ldr r3, [pc, #84] @ (10004848 <__wrap_vprintf+0xcc>) -100047f2: 681d ldr r5, [r3, #0] -100047f4: 4699 mov r9, r3 -100047f6: 2d00 cmp r5, #0 -100047f8: d01c beq.n 10004834 <__wrap_vprintf+0xb8> -100047fa: 4c14 ldr r4, [pc, #80] @ (1000484c <__wrap_vprintf+0xd0>) -100047fc: e002 b.n 10004804 <__wrap_vprintf+0x88> -100047fe: 692d ldr r5, [r5, #16] -10004800: 2d00 cmp r5, #0 -10004802: d00f beq.n 10004824 <__wrap_vprintf+0xa8> -10004804: 682b ldr r3, [r5, #0] -10004806: 2b00 cmp r3, #0 -10004808: d0f9 beq.n 100047fe <__wrap_vprintf+0x82> -1000480a: 6823 ldr r3, [r4, #0] -1000480c: 2b00 cmp r3, #0 -1000480e: d001 beq.n 10004814 <__wrap_vprintf+0x98> -10004810: 42ab cmp r3, r5 -10004812: d1f4 bne.n 100047fe <__wrap_vprintf+0x82> -10004814: 0028 movs r0, r5 -10004816: 9a01 ldr r2, [sp, #4] -10004818: a902 add r1, sp, #8 -1000481a: f7ff fe5f bl 100044dc -1000481e: 692d ldr r5, [r5, #16] -10004820: 2d00 cmp r5, #0 -10004822: d1ef bne.n 10004804 <__wrap_vprintf+0x88> -10004824: 464b mov r3, r9 -10004826: 9501 str r5, [sp, #4] -10004828: 681c ldr r4, [r3, #0] -1000482a: e7ce b.n 100047ca <__wrap_vprintf+0x4e> -1000482c: 0038 movs r0, r7 -1000482e: f002 fa9b bl 10006d68 <__mutex_exit_veneer> -10004832: e7d5 b.n 100047e0 <__wrap_vprintf+0x64> -10004834: 9501 str r5, [sp, #4] -10004836: e7d1 b.n 100047dc <__wrap_vprintf+0x60> -10004838: 000f4240 .word 0x000f4240 -1000483c: 7fffffff .word 0x7fffffff -10004840: 20000ed8 .word 0x20000ed8 -10004844: 10004571 .word 0x10004571 -10004848: 200017f8 .word 0x200017f8 -1000484c: 20001800 .word 0x20001800 - -10004850 <__wrap_printf>: -10004850: b40f push {r0, r1, r2, r3} -10004852: b500 push {lr} -10004854: b083 sub sp, #12 -10004856: a904 add r1, sp, #16 -10004858: c901 ldmia r1!, {r0} -1000485a: 9101 str r1, [sp, #4] -1000485c: f7ff ff8e bl 1000477c <__wrap_vprintf> -10004860: b003 add sp, #12 -10004862: bc08 pop {r3} -10004864: b004 add sp, #16 -10004866: 4718 bx r3 - -10004868 : -10004868: b510 push {r4, lr} -1000486a: f000 f8cd bl 10004a08 -1000486e: f000 fac7 bl 10004e00 -10004872: 2001 movs r0, #1 -10004874: bd10 pop {r4, pc} -10004876: 46c0 nop @ (mov r8, r8) - -10004878 : -10004878: b5f0 push {r4, r5, r6, r7, lr} -1000487a: 2900 cmp r1, #0 -1000487c: dd15 ble.n 100048aa -1000487e: 4b0e ldr r3, [pc, #56] @ (100048b8 ) -10004880: 270d movs r7, #13 -10004882: 681a ldr r2, [r3, #0] -10004884: 4b0d ldr r3, [pc, #52] @ (100048bc ) -10004886: 4c0e ldr r4, [pc, #56] @ (100048c0 ) -10004888: 18d3 adds r3, r2, r3 -1000488a: 425d negs r5, r3 -1000488c: 416b adcs r3, r5 -1000488e: 1845 adds r5, r0, r1 -10004890: 2120 movs r1, #32 -10004892: 005b lsls r3, r3, #1 -10004894: 5f1e ldrsh r6, [r3, r4] -10004896: 7804 ldrb r4, [r0, #0] -10004898: 42a6 cmp r6, r4 -1000489a: d007 beq.n 100048ac -1000489c: 6993 ldr r3, [r2, #24] -1000489e: 4219 tst r1, r3 -100048a0: d1fc bne.n 1000489c -100048a2: 3001 adds r0, #1 -100048a4: 6014 str r4, [r2, #0] -100048a6: 42a8 cmp r0, r5 -100048a8: d1f5 bne.n 10004896 -100048aa: bdf0 pop {r4, r5, r6, r7, pc} -100048ac: 6993 ldr r3, [r2, #24] -100048ae: 4219 tst r1, r3 -100048b0: d1fc bne.n 100048ac -100048b2: 6017 str r7, [r2, #0] -100048b4: e7f2 b.n 1000489c -100048b6: 46c0 nop @ (mov r8, r8) -100048b8: 20001c6c .word 0x20001c6c -100048bc: bffc8000 .word 0xbffc8000 -100048c0: 20001c68 .word 0x20001c68 - -100048c4 : -100048c4: 4b21 ldr r3, [pc, #132] @ (1000494c ) -100048c6: b570 push {r4, r5, r6, lr} -100048c8: 0004 movs r4, r0 -100048ca: 1e0d subs r5, r1, #0 -100048cc: 681e ldr r6, [r3, #0] -100048ce: dd2c ble.n 1000492a -100048d0: 2000 movs r0, #0 -100048d2: 2110 movs r1, #16 -100048d4: 4b1e ldr r3, [pc, #120] @ (10004950 ) -100048d6: 3c01 subs r4, #1 -100048d8: 681a ldr r2, [r3, #0] -100048da: 6993 ldr r3, [r2, #24] -100048dc: 4219 tst r1, r3 -100048de: d115 bne.n 1000490c -100048e0: 3001 adds r0, #1 -100048e2: 6993 ldr r3, [r2, #24] -100048e4: 4219 tst r1, r3 -100048e6: d1fc bne.n 100048e2 -100048e8: 6813 ldr r3, [r2, #0] -100048ea: 5423 strb r3, [r4, r0] -100048ec: 4285 cmp r5, r0 -100048ee: d1f4 bne.n 100048da -100048f0: 2e00 cmp r6, #0 -100048f2: d009 beq.n 10004908 -100048f4: 2350 movs r3, #80 @ 0x50 -100048f6: 2138 movs r1, #56 @ 0x38 -100048f8: 6393 str r3, [r2, #56] @ 0x38 -100048fa: 6b53 ldr r3, [r2, #52] @ 0x34 -100048fc: 3234 adds r2, #52 @ 0x34 -100048fe: 4019 ands r1, r3 -10004900: 2380 movs r3, #128 @ 0x80 -10004902: 015b lsls r3, r3, #5 -10004904: 4313 orrs r3, r2 -10004906: 6019 str r1, [r3, #0] -10004908: 0028 movs r0, r5 -1000490a: e00d b.n 10004928 -1000490c: 2e00 cmp r6, #0 -1000490e: d009 beq.n 10004924 -10004910: 2350 movs r3, #80 @ 0x50 -10004912: 2138 movs r1, #56 @ 0x38 -10004914: 6393 str r3, [r2, #56] @ 0x38 -10004916: 6b53 ldr r3, [r2, #52] @ 0x34 -10004918: 3234 adds r2, #52 @ 0x34 -1000491a: 4019 ands r1, r3 -1000491c: 2380 movs r3, #128 @ 0x80 -1000491e: 015b lsls r3, r3, #5 -10004920: 431a orrs r2, r3 -10004922: 6011 str r1, [r2, #0] -10004924: 2800 cmp r0, #0 -10004926: d00e beq.n 10004946 -10004928: bd70 pop {r4, r5, r6, pc} -1000492a: 2e00 cmp r6, #0 -1000492c: d00b beq.n 10004946 -1000492e: 2250 movs r2, #80 @ 0x50 -10004930: 2138 movs r1, #56 @ 0x38 -10004932: 4b07 ldr r3, [pc, #28] @ (10004950 ) -10004934: 681b ldr r3, [r3, #0] -10004936: 639a str r2, [r3, #56] @ 0x38 -10004938: 6b5a ldr r2, [r3, #52] @ 0x34 -1000493a: 3334 adds r3, #52 @ 0x34 -1000493c: 4011 ands r1, r2 -1000493e: 2280 movs r2, #128 @ 0x80 -10004940: 0152 lsls r2, r2, #5 -10004942: 4313 orrs r3, r2 -10004944: 6019 str r1, [r3, #0] -10004946: 2003 movs r0, #3 -10004948: 4240 negs r0, r0 -1000494a: e7ed b.n 10004928 -1000494c: 2000177c .word 0x2000177c -10004950: 20001c6c .word 0x20001c6c - -10004954 : -10004954: 4b06 ldr r3, [pc, #24] @ (10004970 ) -10004956: b510 push {r4, lr} -10004958: 681b ldr r3, [r3, #0] -1000495a: 2b00 cmp r3, #0 -1000495c: d006 beq.n 1000496c -1000495e: 2100 movs r1, #0 -10004960: 4a04 ldr r2, [pc, #16] @ (10004974 ) -10004962: 6812 ldr r2, [r2, #0] -10004964: 6391 str r1, [r2, #56] @ 0x38 -10004966: 4a04 ldr r2, [pc, #16] @ (10004978 ) -10004968: 6810 ldr r0, [r2, #0] -1000496a: 4798 blx r3 -1000496c: bd10 pop {r4, pc} -1000496e: 46c0 nop @ (mov r8, r8) -10004970: 2000177c .word 0x2000177c -10004974: 20001c6c .word 0x20001c6c -10004978: 20001784 .word 0x20001784 - -1000497c : -1000497c: 4b1d ldr r3, [pc, #116] @ (100049f4 ) -1000497e: b5f0 push {r4, r5, r6, r7, lr} -10004980: 681a ldr r2, [r3, #0] -10004982: 46c6 mov lr, r8 -10004984: 4698 mov r8, r3 -10004986: 4b1c ldr r3, [pc, #112] @ (100049f8 ) -10004988: 000e movs r6, r1 -1000498a: 18d3 adds r3, r2, r3 -1000498c: 4259 negs r1, r3 -1000498e: 414b adcs r3, r1 -10004990: 4f1a ldr r7, [pc, #104] @ (100049fc ) -10004992: 3314 adds r3, #20 -10004994: 001c movs r4, r3 -10004996: 0005 movs r5, r0 -10004998: b500 push {lr} -1000499a: 683b ldr r3, [r7, #0] -1000499c: 2800 cmp r0, #0 -1000499e: d007 beq.n 100049b0 -100049a0: 2b00 cmp r3, #0 -100049a2: d011 beq.n 100049c8 -100049a4: 4b16 ldr r3, [pc, #88] @ (10004a00 ) -100049a6: 603d str r5, [r7, #0] -100049a8: 601e str r6, [r3, #0] -100049aa: bc80 pop {r7} -100049ac: 46b8 mov r8, r7 -100049ae: bdf0 pop {r4, r5, r6, r7, pc} -100049b0: 2b00 cmp r3, #0 -100049b2: d0f7 beq.n 100049a4 -100049b4: 6390 str r0, [r2, #56] @ 0x38 -100049b6: 2100 movs r1, #0 -100049b8: 0020 movs r0, r4 -100049ba: f7fb fdab bl 10000514 -100049be: 0020 movs r0, r4 -100049c0: 4910 ldr r1, [pc, #64] @ (10004a04 ) -100049c2: f7fb ff03 bl 100007cc -100049c6: e7ed b.n 100049a4 -100049c8: 0020 movs r0, r4 -100049ca: 490e ldr r1, [pc, #56] @ (10004a04 ) -100049cc: f7fb fdda bl 10000584 -100049d0: 2101 movs r1, #1 -100049d2: 0020 movs r0, r4 -100049d4: f7fb fd9e bl 10000514 -100049d8: 4643 mov r3, r8 -100049da: 2250 movs r2, #80 @ 0x50 -100049dc: 2138 movs r1, #56 @ 0x38 -100049de: 681b ldr r3, [r3, #0] -100049e0: 639a str r2, [r3, #56] @ 0x38 -100049e2: 6b5a ldr r2, [r3, #52] @ 0x34 -100049e4: 3334 adds r3, #52 @ 0x34 -100049e6: 4011 ands r1, r2 -100049e8: 2280 movs r2, #128 @ 0x80 -100049ea: 0152 lsls r2, r2, #5 -100049ec: 4313 orrs r3, r2 -100049ee: 6019 str r1, [r3, #0] -100049f0: e7d8 b.n 100049a4 -100049f2: 46c0 nop @ (mov r8, r8) -100049f4: 20001c6c .word 0x20001c6c -100049f8: bffc8000 .word 0xbffc8000 -100049fc: 2000177c .word 0x2000177c -10004a00: 20001784 .word 0x20001784 -10004a04: 10004955 .word 0x10004955 - -10004a08 : -10004a08: 4b0c ldr r3, [pc, #48] @ (10004a3c ) -10004a0a: b510 push {r4, lr} -10004a0c: 781b ldrb r3, [r3, #0] -10004a0e: 4b0c ldr r3, [pc, #48] @ (10004a40 ) -10004a10: 4c0c ldr r4, [pc, #48] @ (10004a44 ) -10004a12: 781b ldrb r3, [r3, #0] -10004a14: 4b0c ldr r3, [pc, #48] @ (10004a48 ) -10004a16: 2102 movs r1, #2 -10004a18: 2000 movs r0, #0 -10004a1a: 6023 str r3, [r4, #0] -10004a1c: f7fb fca0 bl 10000360 -10004a20: 2102 movs r1, #2 -10004a22: 2001 movs r0, #1 -10004a24: f7fb fc9c bl 10000360 -10004a28: 21e1 movs r1, #225 @ 0xe1 -10004a2a: 6820 ldr r0, [r4, #0] -10004a2c: 0249 lsls r1, r1, #9 -10004a2e: f7fc ff2f bl 10001890 -10004a32: 2101 movs r1, #1 -10004a34: 4805 ldr r0, [pc, #20] @ (10004a4c ) -10004a36: f7ff fe89 bl 1000474c -10004a3a: bd10 pop {r4, pc} -10004a3c: 10007374 .word 0x10007374 -10004a40: 10007370 .word 0x10007370 -10004a44: 20001c6c .word 0x20001c6c -10004a48: 40034000 .word 0x40034000 -10004a4c: 20000e80 .word 0x20000e80 - -10004a50 : -10004a50: 4770 bx lr -10004a52: 46c0 nop @ (mov r8, r8) - -10004a54 : -10004a54: 2200 movs r2, #0 -10004a56: 4b01 ldr r3, [pc, #4] @ (10004a5c ) -10004a58: 701a strb r2, [r3, #0] -10004a5a: 4770 bx lr -10004a5c: 20001c86 .word 0x20001c86 - -10004a60 : -10004a60: 794b ldrb r3, [r1, #5] -10004a62: 2000 movs r0, #0 -10004a64: 2bff cmp r3, #255 @ 0xff -10004a66: d10b bne.n 10004a80 -10004a68: 798b ldrb r3, [r1, #6] -10004a6a: 2b00 cmp r3, #0 -10004a6c: d108 bne.n 10004a80 -10004a6e: 79cb ldrb r3, [r1, #7] -10004a70: 2b01 cmp r3, #1 -10004a72: d105 bne.n 10004a80 -10004a74: 2a08 cmp r2, #8 -10004a76: d903 bls.n 10004a80 -10004a78: 4b02 ldr r3, [pc, #8] @ (10004a84 ) -10004a7a: 788a ldrb r2, [r1, #2] -10004a7c: 3009 adds r0, #9 -10004a7e: 701a strb r2, [r3, #0] -10004a80: 4770 bx lr -10004a82: 46c0 nop @ (mov r8, r8) -10004a84: 20001c86 .word 0x20001c86 - -10004a88 : -10004a88: 2001 movs r0, #1 -10004a8a: 4770 bx lr - -10004a8c : -10004a8c: b570 push {r4, r5, r6, lr} -10004a8e: 2901 cmp r1, #1 -10004a90: d001 beq.n 10004a96 -10004a92: 2001 movs r0, #1 -10004a94: bd70 pop {r4, r5, r6, pc} -10004a96: 4913 ldr r1, [pc, #76] @ (10004ae4 ) -10004a98: 7953 ldrb r3, [r2, #5] -10004a9a: 7910 ldrb r0, [r2, #4] -10004a9c: 7809 ldrb r1, [r1, #0] -10004a9e: 021b lsls r3, r3, #8 -10004aa0: 4303 orrs r3, r0 -10004aa2: 2000 movs r0, #0 -10004aa4: 4299 cmp r1, r3 -10004aa6: d1f5 bne.n 10004a94 -10004aa8: 7853 ldrb r3, [r2, #1] -10004aaa: 2b01 cmp r3, #1 -10004aac: d008 beq.n 10004ac0 -10004aae: 2b02 cmp r3, #2 -10004ab0: d1f0 bne.n 10004a94 -10004ab2: 2000 movs r0, #0 -10004ab4: 2264 movs r2, #100 @ 0x64 -10004ab6: 2100 movs r1, #0 -10004ab8: f7fd f974 bl 10001da4 -10004abc: 2001 movs r0, #1 -10004abe: e7e9 b.n 10004a94 -10004ac0: 7894 ldrb r4, [r2, #2] -10004ac2: 78d2 ldrb r2, [r2, #3] -10004ac4: 0005 movs r5, r0 -10004ac6: 0212 lsls r2, r2, #8 -10004ac8: 4314 orrs r4, r2 -10004aca: 05d2 lsls r2, r2, #23 -10004acc: d502 bpl.n 10004ad4 -10004ace: 0a62 lsrs r2, r4, #9 -10004ad0: 4093 lsls r3, r2 -10004ad2: 001d movs r5, r3 -10004ad4: 4804 ldr r0, [pc, #16] @ (10004ae8 ) -10004ad6: f7fe fe19 bl 1000370c -10004ada: 217f movs r1, #127 @ 0x7f -10004adc: 0003 movs r3, r0 -10004ade: 4021 ands r1, r4 -10004ae0: 0028 movs r0, r5 -10004ae2: 4798 blx r3 -10004ae4: 20001c86 .word 0x20001c86 -10004ae8: 00004255 .word 0x00004255 - -10004aec : -10004aec: 2301 movs r3, #1 -10004aee: 7003 strb r3, [r0, #0] -10004af0: 4800 ldr r0, [pc, #0] @ (10004af4 ) -10004af2: 4770 bx lr -10004af4: 1000720c .word 0x1000720c - -10004af8 : -10004af8: 784b ldrb r3, [r1, #1] -10004afa: 780a ldrb r2, [r1, #0] -10004afc: 021b lsls r3, r3, #8 -10004afe: 4313 orrs r3, r2 -10004b00: 788a ldrb r2, [r1, #2] -10004b02: b510 push {r4, lr} -10004b04: 0412 lsls r2, r2, #16 -10004b06: 431a orrs r2, r3 -10004b08: 78cb ldrb r3, [r1, #3] -10004b0a: 061b lsls r3, r3, #24 -10004b0c: 4313 orrs r3, r2 -10004b0e: 2296 movs r2, #150 @ 0x96 -10004b10: 00d2 lsls r2, r2, #3 -10004b12: 4293 cmp r3, r2 -10004b14: d000 beq.n 10004b18 -10004b16: bd10 pop {r4, pc} -10004b18: 4803 ldr r0, [pc, #12] @ (10004b28 ) -10004b1a: f7fe fdf7 bl 1000370c -10004b1e: 2100 movs r1, #0 -10004b20: 0003 movs r3, r0 -10004b22: 0008 movs r0, r1 -10004b24: 4798 blx r3 -10004b26: 46c0 nop @ (mov r8, r8) -10004b28: 00004255 .word 0x00004255 - -10004b2c : -10004b2c: 4b02 ldr r3, [pc, #8] @ (10004b38 ) -10004b2e: 6018 str r0, [r3, #0] -10004b30: 4b02 ldr r3, [pc, #8] @ (10004b3c ) -10004b32: 6019 str r1, [r3, #0] -10004b34: 4770 bx lr -10004b36: 46c0 nop @ (mov r8, r8) -10004b38: 20001780 .word 0x20001780 -10004b3c: 20001788 .word 0x20001788 - -10004b40 : -10004b40: b510 push {r4, lr} -10004b42: 4b02 ldr r3, [pc, #8] @ (10004b4c ) -10004b44: 7818 ldrb r0, [r3, #0] -10004b46: f7fb fcf7 bl 10000538 -10004b4a: bd10 pop {r4, pc} -10004b4c: 20001c87 .word 0x20001c87 - -10004b50 : -10004b50: 4b11 ldr r3, [pc, #68] @ (10004b98 ) -10004b52: b570 push {r4, r5, r6, lr} -10004b54: 681a ldr r2, [r3, #0] -10004b56: 2a00 cmp r2, #0 -10004b58: d01a beq.n 10004b90 -10004b5a: f3ef 8110 mrs r1, PRIMASK -10004b5e: b672 cpsid i -10004b60: 6810 ldr r0, [r2, #0] -10004b62: 2800 cmp r0, #0 -10004b64: d0fc beq.n 10004b60 -10004b66: f3bf 8f5f dmb sy -10004b6a: 2000 movs r0, #0 -10004b6c: 4a0b ldr r2, [pc, #44] @ (10004b9c ) -10004b6e: 6059 str r1, [r3, #4] -10004b70: 7010 strb r0, [r2, #0] -10004b72: 681b ldr r3, [r3, #0] -10004b74: f3bf 8f5f dmb sy -10004b78: 6018 str r0, [r3, #0] -10004b7a: f381 8810 msr PRIMASK, r1 -10004b7e: 2400 movs r4, #0 -10004b80: 2500 movs r5, #0 -10004b82: 4b07 ldr r3, [pc, #28] @ (10004ba0 ) -10004b84: 7818 ldrb r0, [r3, #0] -10004b86: f7fb fcd7 bl 10000538 -10004b8a: 0029 movs r1, r5 -10004b8c: 0020 movs r0, r4 -10004b8e: bd70 pop {r4, r5, r6, pc} -10004b90: 24fa movs r4, #250 @ 0xfa -10004b92: 2500 movs r5, #0 -10004b94: 00a4 lsls r4, r4, #2 -10004b96: e7f4 b.n 10004b82 -10004b98: 20001c28 .word 0x20001c28 -10004b9c: 20001c88 .word 0x20001c88 -10004ba0: 20001c87 .word 0x20001c87 - -10004ba4 : -10004ba4: b570 push {r4, r5, r6, lr} -10004ba6: 0004 movs r4, r0 -10004ba8: 2000 movs r0, #0 -10004baa: 000e movs r6, r1 -10004bac: f001 fae8 bl 10006180 -10004bb0: 2800 cmp r0, #0 -10004bb2: d036 beq.n 10004c22 -10004bb4: 2000 movs r0, #0 -10004bb6: f001 fafb bl 100061b0 -10004bba: 2800 cmp r0, #0 -10004bbc: d031 beq.n 10004c22 -10004bbe: f7fc fb7f bl 100012c0 -10004bc2: 2300 movs r3, #0 -10004bc4: 4a18 ldr r2, [pc, #96] @ (10004c28 ) -10004bc6: 1812 adds r2, r2, r0 -10004bc8: 414b adcs r3, r1 -10004bca: 2180 movs r1, #128 @ 0x80 -10004bcc: 0609 lsls r1, r1, #24 -10004bce: 428b cmp r3, r1 -10004bd0: d216 bcs.n 10004c00 -10004bd2: 4d16 ldr r5, [pc, #88] @ (10004c2c ) -10004bd4: 0028 movs r0, r5 -10004bd6: f002 f8ff bl 10006dd8 <__mutex_try_enter_block_until_veneer> -10004bda: 2800 cmp r0, #0 -10004bdc: d021 beq.n 10004c22 -10004bde: 2000 movs r0, #0 -10004be0: f001 face bl 10006180 -10004be4: 2800 cmp r0, #0 -10004be6: d10f bne.n 10004c08 -10004be8: 2001 movs r0, #1 -10004bea: 2100 movs r1, #0 -10004bec: 4240 negs r0, r0 -10004bee: f000 fcc1 bl 10005574 -10004bf2: 2403 movs r4, #3 -10004bf4: 4264 negs r4, r4 -10004bf6: 0028 movs r0, r5 -10004bf8: f002 f8b6 bl 10006d68 <__mutex_exit_veneer> -10004bfc: 0020 movs r0, r4 -10004bfe: bd70 pop {r4, r5, r6, pc} -10004c00: 2201 movs r2, #1 -10004c02: 4b0b ldr r3, [pc, #44] @ (10004c30 ) -10004c04: 4252 negs r2, r2 -10004c06: e7e4 b.n 10004bd2 -10004c08: 2000 movs r0, #0 -10004c0a: f001 fad1 bl 100061b0 -10004c0e: 2800 cmp r0, #0 -10004c10: d0ea beq.n 10004be8 -10004c12: 0021 movs r1, r4 -10004c14: 0032 movs r2, r6 -10004c16: 2000 movs r0, #0 -10004c18: f001 fad6 bl 100061c8 -10004c1c: 1e04 subs r4, r0, #0 -10004c1e: d1ea bne.n 10004bf6 -10004c20: e7e7 b.n 10004bf2 -10004c22: 2403 movs r4, #3 -10004c24: 4264 negs r4, r4 -10004c26: e7e9 b.n 10004bfc -10004c28: 000f4240 .word 0x000f4240 -10004c2c: 20001c50 .word 0x20001c50 -10004c30: 7fffffff .word 0x7fffffff - -10004c34 : -10004c34: b5f8 push {r3, r4, r5, r6, r7, lr} -10004c36: 46de mov lr, fp -10004c38: 4657 mov r7, sl -10004c3a: b580 push {r7, lr} -10004c3c: 0005 movs r5, r0 -10004c3e: 000c movs r4, r1 -10004c40: f7fc fb3e bl 100012c0 -10004c44: 2300 movs r3, #0 -10004c46: 4a37 ldr r2, [pc, #220] @ (10004d24 ) -10004c48: 1812 adds r2, r2, r0 -10004c4a: 414b adcs r3, r1 -10004c4c: 2180 movs r1, #128 @ 0x80 -10004c4e: 0609 lsls r1, r1, #24 -10004c50: 428b cmp r3, r1 -10004c52: d302 bcc.n 10004c5a -10004c54: 2201 movs r2, #1 -10004c56: 4b34 ldr r3, [pc, #208] @ (10004d28 ) -10004c58: 4252 negs r2, r2 -10004c5a: 4934 ldr r1, [pc, #208] @ (10004d2c ) -10004c5c: 0008 movs r0, r1 -10004c5e: 468a mov sl, r1 -10004c60: f002 f8ba bl 10006dd8 <__mutex_try_enter_block_until_veneer> -10004c64: 2800 cmp r0, #0 -10004c66: d103 bne.n 10004c70 -10004c68: bcc0 pop {r6, r7} -10004c6a: 46bb mov fp, r7 -10004c6c: 46b2 mov sl, r6 -10004c6e: bdf8 pop {r3, r4, r5, r6, r7, pc} -10004c70: 2000 movs r0, #0 -10004c72: f001 fa85 bl 10006180 -10004c76: 2800 cmp r0, #0 -10004c78: d04a beq.n 10004d10 -10004c7a: 2600 movs r6, #0 -10004c7c: 2c00 cmp r4, #0 -10004c7e: dd43 ble.n 10004d08 -10004c80: 4b2b ldr r3, [pc, #172] @ (10004d30 ) -10004c82: 469b mov fp, r3 -10004c84: e014 b.n 10004cb0 -10004c86: 19a9 adds r1, r5, r6 -10004c88: 2000 movs r0, #0 -10004c8a: f001 fb11 bl 100062b0 -10004c8e: 0007 movs r7, r0 -10004c90: 2001 movs r0, #1 -10004c92: 2100 movs r1, #0 -10004c94: 4240 negs r0, r0 -10004c96: f000 fc6d bl 10005574 -10004c9a: 2000 movs r0, #0 -10004c9c: f001 facc bl 10006238 -10004ca0: f7fc fb0e bl 100012c0 -10004ca4: 4b22 ldr r3, [pc, #136] @ (10004d30 ) -10004ca6: 19f6 adds r6, r6, r7 -10004ca8: 6018 str r0, [r3, #0] -10004caa: 6059 str r1, [r3, #4] -10004cac: 42b4 cmp r4, r6 -10004cae: dd2b ble.n 10004d08 -10004cb0: 2000 movs r0, #0 -10004cb2: f001 fb17 bl 100062e4 -10004cb6: 1ba7 subs r7, r4, r6 -10004cb8: 0002 movs r2, r0 -10004cba: 42b8 cmp r0, r7 -10004cbc: dd00 ble.n 10004cc0 -10004cbe: 003a movs r2, r7 -10004cc0: 2a00 cmp r2, #0 -10004cc2: d1e0 bne.n 10004c86 -10004cc4: 2001 movs r0, #1 -10004cc6: 2100 movs r1, #0 -10004cc8: 4240 negs r0, r0 -10004cca: f000 fc53 bl 10005574 -10004cce: 2000 movs r0, #0 -10004cd0: f001 fab2 bl 10006238 -10004cd4: 2000 movs r0, #0 -10004cd6: f001 fa53 bl 10006180 -10004cda: 2800 cmp r0, #0 -10004cdc: d014 beq.n 10004d08 -10004cde: 2000 movs r0, #0 -10004ce0: f001 fb00 bl 100062e4 -10004ce4: 2800 cmp r0, #0 -10004ce6: d1e1 bne.n 10004cac -10004ce8: f7fc faea bl 100012c0 -10004cec: 465b mov r3, fp -10004cee: 000f movs r7, r1 -10004cf0: 681a ldr r2, [r3, #0] -10004cf2: 685b ldr r3, [r3, #4] -10004cf4: 2100 movs r1, #0 -10004cf6: 4684 mov ip, r0 -10004cf8: 480e ldr r0, [pc, #56] @ (10004d34 ) -10004cfa: 1812 adds r2, r2, r0 -10004cfc: 414b adcs r3, r1 -10004cfe: 429f cmp r7, r3 -10004d00: d802 bhi.n 10004d08 -10004d02: d1d3 bne.n 10004cac -10004d04: 4594 cmp ip, r2 -10004d06: d9d1 bls.n 10004cac -10004d08: 4650 mov r0, sl -10004d0a: f002 f82d bl 10006d68 <__mutex_exit_veneer> -10004d0e: e7ab b.n 10004c68 -10004d10: 2000 movs r0, #0 -10004d12: 2100 movs r1, #0 -10004d14: 4b06 ldr r3, [pc, #24] @ (10004d30 ) -10004d16: 6018 str r0, [r3, #0] -10004d18: 6059 str r1, [r3, #4] -10004d1a: 4650 mov r0, sl -10004d1c: f002 f824 bl 10006d68 <__mutex_exit_veneer> -10004d20: e7a2 b.n 10004c68 -10004d22: 46c0 nop @ (mov r8, r8) -10004d24: 000f4240 .word 0x000f4240 -10004d28: 7fffffff .word 0x7fffffff -10004d2c: 20001c50 .word 0x20001c50 -10004d30: 20001020 .word 0x20001020 -10004d34: 0007a120 .word 0x0007a120 - -10004d38 : -10004d38: b510 push {r4, lr} -10004d3a: 4c24 ldr r4, [pc, #144] @ (10004dcc ) -10004d3c: b084 sub sp, #16 -10004d3e: 2100 movs r1, #0 -10004d40: 0020 movs r0, r4 -10004d42: f002 f831 bl 10006da8 <__mutex_try_enter_veneer> -10004d46: 2800 cmp r0, #0 -10004d48: d11c bne.n 10004d84 -10004d4a: 4b21 ldr r3, [pc, #132] @ (10004dd0 ) -10004d4c: 681a ldr r2, [r3, #0] -10004d4e: 2a00 cmp r2, #0 -10004d50: d016 beq.n 10004d80 -10004d52: f3ef 8110 mrs r1, PRIMASK -10004d56: b672 cpsid i -10004d58: 6810 ldr r0, [r2, #0] -10004d5a: 2800 cmp r0, #0 -10004d5c: d0fc beq.n 10004d58 -10004d5e: f3bf 8f5f dmb sy -10004d62: 2401 movs r4, #1 -10004d64: 481b ldr r0, [pc, #108] @ (10004dd4 ) -10004d66: 6059 str r1, [r3, #4] -10004d68: 7802 ldrb r2, [r0, #0] -10004d6a: 681b ldr r3, [r3, #0] -10004d6c: b2d2 uxtb r2, r2 -10004d6e: 7004 strb r4, [r0, #0] -10004d70: f3bf 8f5f dmb sy -10004d74: 2000 movs r0, #0 -10004d76: 6018 str r0, [r3, #0] -10004d78: f381 8810 msr PRIMASK, r1 -10004d7c: 2a00 cmp r2, #0 -10004d7e: d00a beq.n 10004d96 -10004d80: b004 add sp, #16 -10004d82: bd10 pop {r4, pc} -10004d84: 2001 movs r0, #1 -10004d86: 2100 movs r1, #0 -10004d88: 4240 negs r0, r0 -10004d8a: f000 fbf3 bl 10005574 -10004d8e: 0020 movs r0, r4 -10004d90: f001 ffea bl 10006d68 <__mutex_exit_veneer> -10004d94: e7f4 b.n 10004d80 -10004d96: f7fc f881 bl 10000e9c -10004d9a: 0004 movs r4, r0 -10004d9c: f7fc fa90 bl 100012c0 -10004da0: 22fa movs r2, #250 @ 0xfa -10004da2: 2300 movs r3, #0 -10004da4: 0092 lsls r2, r2, #2 -10004da6: 1812 adds r2, r2, r0 -10004da8: 414b adcs r3, r1 -10004daa: 2180 movs r1, #128 @ 0x80 -10004dac: 0609 lsls r1, r1, #24 -10004dae: 428b cmp r3, r1 -10004db0: d302 bcc.n 10004db8 -10004db2: 2201 movs r2, #1 -10004db4: 4b08 ldr r3, [pc, #32] @ (10004dd8 ) -10004db6: 4252 negs r2, r2 -10004db8: 2101 movs r1, #1 -10004dba: 9102 str r1, [sp, #8] -10004dbc: 2100 movs r1, #0 -10004dbe: 9101 str r1, [sp, #4] -10004dc0: 4906 ldr r1, [pc, #24] @ (10004ddc ) -10004dc2: 0020 movs r0, r4 -10004dc4: 9100 str r1, [sp, #0] -10004dc6: f7fc f86d bl 10000ea4 -10004dca: e7d9 b.n 10004d80 -10004dcc: 20001c50 .word 0x20001c50 -10004dd0: 20001c28 .word 0x20001c28 -10004dd4: 20001c88 .word 0x20001c88 -10004dd8: 7fffffff .word 0x7fffffff -10004ddc: 10004b51 .word 0x10004b51 - -10004de0 : -10004de0: 4b05 ldr r3, [pc, #20] @ (10004df8 ) -10004de2: b510 push {r4, lr} -10004de4: 6818 ldr r0, [r3, #0] -10004de6: 2800 cmp r0, #0 -10004de8: d004 beq.n 10004df4 -10004dea: 4b04 ldr r3, [pc, #16] @ (10004dfc ) -10004dec: 2200 movs r2, #0 -10004dee: 6819 ldr r1, [r3, #0] -10004df0: f001 f836 bl 10005e60 -10004df4: bd10 pop {r4, pc} -10004df6: 46c0 nop @ (mov r8, r8) -10004df8: 20001780 .word 0x20001780 -10004dfc: 20001788 .word 0x20001788 - -10004e00 : -10004e00: 23d0 movs r3, #208 @ 0xd0 -10004e02: b510 push {r4, lr} -10004e04: 061b lsls r3, r3, #24 -10004e06: b084 sub sp, #16 -10004e08: 681c ldr r4, [r3, #0] -10004e0a: f7fc f847 bl 10000e9c -10004e0e: f7fc f907 bl 10001020 -10004e12: 42a0 cmp r0, r4 -10004e14: d002 beq.n 10004e1c -10004e16: 2000 movs r0, #0 -10004e18: b004 add sp, #16 -10004e1a: bd10 pop {r4, pc} -10004e1c: 4b27 ldr r3, [pc, #156] @ (10004ebc ) -10004e1e: 781b ldrb r3, [r3, #0] -10004e20: f001 fc42 bl 100066a8 -10004e24: 4826 ldr r0, [pc, #152] @ (10004ec0 ) -10004e26: f7fb fe3d bl 10000aa4 -10004e2a: 2001 movs r0, #1 -10004e2c: f7fb fe1c bl 10000a68 -10004e30: 23ff movs r3, #255 @ 0xff -10004e32: 4c24 ldr r4, [pc, #144] @ (10004ec4 ) -10004e34: 4924 ldr r1, [pc, #144] @ (10004ec8 ) -10004e36: 7020 strb r0, [r4, #0] -10004e38: 4018 ands r0, r3 -10004e3a: f7fb fba3 bl 10000584 -10004e3e: 7820 ldrb r0, [r4, #0] -10004e40: 2101 movs r1, #1 -10004e42: f7fb fb67 bl 10000514 -10004e46: 2005 movs r0, #5 -10004e48: f7fb fb7e bl 10000548 -10004e4c: 2800 cmp r0, #0 -10004e4e: d127 bne.n 10004ea0 -10004e50: f7fc f824 bl 10000e9c -10004e54: 0004 movs r4, r0 -10004e56: f7fc fa33 bl 100012c0 -10004e5a: 22fa movs r2, #250 @ 0xfa -10004e5c: 2300 movs r3, #0 -10004e5e: 0092 lsls r2, r2, #2 -10004e60: 1812 adds r2, r2, r0 -10004e62: 414b adcs r3, r1 -10004e64: 2180 movs r1, #128 @ 0x80 -10004e66: 0609 lsls r1, r1, #24 -10004e68: 428b cmp r3, r1 -10004e6a: d302 bcc.n 10004e72 -10004e6c: 2201 movs r2, #1 -10004e6e: 4b17 ldr r3, [pc, #92] @ (10004ecc ) -10004e70: 4252 negs r2, r2 -10004e72: 2101 movs r1, #1 -10004e74: 9102 str r1, [sp, #8] -10004e76: 2100 movs r1, #0 -10004e78: 9101 str r1, [sp, #4] -10004e7a: 4915 ldr r1, [pc, #84] @ (10004ed0 ) -10004e7c: 0020 movs r0, r4 -10004e7e: 9100 str r1, [sp, #0] -10004e80: f7fc f810 bl 10000ea4 -10004e84: 2208 movs r2, #8 -10004e86: 0004 movs r4, r0 -10004e88: 2100 movs r1, #0 -10004e8a: 4812 ldr r0, [pc, #72] @ (10004ed4 ) -10004e8c: f7ff fb1a bl 100044c4 <__wrap_memset> -10004e90: 2c00 cmp r4, #0 -10004e92: dbc0 blt.n 10004e16 -10004e94: 4810 ldr r0, [pc, #64] @ (10004ed8 ) -10004e96: 2101 movs r1, #1 -10004e98: f7ff fc58 bl 1000474c -10004e9c: 2001 movs r0, #1 -10004e9e: e7bb b.n 10004e18 -10004ea0: 2200 movs r2, #0 -10004ea2: 490e ldr r1, [pc, #56] @ (10004edc ) -10004ea4: 2005 movs r0, #5 -10004ea6: f7fb fb97 bl 100005d8 -10004eaa: f7fb fb15 bl 100004d8 -10004eae: 4b09 ldr r3, [pc, #36] @ (10004ed4 ) -10004eb0: 0001 movs r1, r0 -10004eb2: 0018 movs r0, r3 -10004eb4: f7fb fe20 bl 10000af8 -10004eb8: e7ec b.n 10004e94 -10004eba: 46c0 nop @ (mov r8, r8) -10004ebc: 10007378 .word 0x10007378 -10004ec0: 20001c50 .word 0x20001c50 -10004ec4: 20001c87 .word 0x20001c87 -10004ec8: 10004d39 .word 0x10004d39 -10004ecc: 7fffffff .word 0x7fffffff -10004ed0: 10004b51 .word 0x10004b51 -10004ed4: 20001c28 .word 0x20001c28 -10004ed8: 20000e98 .word 0x20000e98 -10004edc: 10004b41 .word 0x10004b41 - -10004ee0 : -10004ee0: 4800 ldr r0, [pc, #0] @ (10004ee4 ) -10004ee2: 4770 bx lr -10004ee4: 1000729c .word 0x1000729c - -10004ee8 : -10004ee8: 4800 ldr r0, [pc, #0] @ (10004eec ) -10004eea: 4770 bx lr -10004eec: 10007248 .word 0x10007248 - -10004ef0 : -10004ef0: b510 push {r4, lr} -10004ef2: 0004 movs r4, r0 -10004ef4: 4817 ldr r0, [pc, #92] @ (10004f54 ) -10004ef6: 7803 ldrb r3, [r0, #0] -10004ef8: 2b00 cmp r3, #0 -10004efa: d020 beq.n 10004f3e -10004efc: 2c00 cmp r4, #0 -10004efe: d106 bne.n 10004f0e -10004f00: 4b15 ldr r3, [pc, #84] @ (10004f58 ) -10004f02: 4816 ldr r0, [pc, #88] @ (10004f5c ) -10004f04: 8043 strh r3, [r0, #2] -10004f06: 3b06 subs r3, #6 -10004f08: 3bff subs r3, #255 @ 0xff -10004f0a: 8003 strh r3, [r0, #0] -10004f0c: bd10 pop {r4, pc} -10004f0e: 2c05 cmp r4, #5 -10004f10: d819 bhi.n 10004f46 -10004f12: 4b13 ldr r3, [pc, #76] @ (10004f60 ) -10004f14: 00a4 lsls r4, r4, #2 -10004f16: 58e0 ldr r0, [r4, r3] -10004f18: 4912 ldr r1, [pc, #72] @ (10004f64 ) -10004f1a: 2301 movs r3, #1 -10004f1c: 3801 subs r0, #1 -10004f1e: e004 b.n 10004f2a -10004f20: 3301 adds r3, #1 -10004f22: 800a strh r2, [r1, #0] -10004f24: 3102 adds r1, #2 -10004f26: 2b14 cmp r3, #20 -10004f28: d00f beq.n 10004f4a -10004f2a: 5cc2 ldrb r2, [r0, r3] -10004f2c: 2a00 cmp r2, #0 -10004f2e: d1f7 bne.n 10004f20 -10004f30: 22c0 movs r2, #192 @ 0xc0 -10004f32: b2db uxtb r3, r3 -10004f34: 005b lsls r3, r3, #1 -10004f36: 0092 lsls r2, r2, #2 -10004f38: 4808 ldr r0, [pc, #32] @ (10004f5c ) -10004f3a: 4313 orrs r3, r2 -10004f3c: e7e5 b.n 10004f0a -10004f3e: 2111 movs r1, #17 -10004f40: f000 f81a bl 10004f78 -10004f44: e7da b.n 10004efc -10004f46: 2000 movs r0, #0 -10004f48: e7e0 b.n 10004f0c -10004f4a: 23ca movs r3, #202 @ 0xca -10004f4c: 4803 ldr r0, [pc, #12] @ (10004f5c ) -10004f4e: 009b lsls r3, r3, #2 -10004f50: e7db b.n 10004f0a -10004f52: 46c0 nop @ (mov r8, r8) -10004f54: 20001c70 .word 0x20001c70 -10004f58: 00000409 .word 0x00000409 -10004f5c: 200017d0 .word 0x200017d0 -10004f60: 10007230 .word 0x10007230 -10004f64: 200017d2 .word 0x200017d2 - -10004f68 <_retrieve_unique_id_on_boot>: -10004f68: b510 push {r4, lr} -10004f6a: 4802 ldr r0, [pc, #8] @ (10004f74 <_retrieve_unique_id_on_boot+0xc>) -10004f6c: f000 f8d8 bl 10005120 -10004f70: bd10 pop {r4, pc} -10004f72: 46c0 nop @ (mov r8, r8) -10004f74: 20001c40 .word 0x20001c40 - -10004f78 : -10004f78: b530 push {r4, r5, lr} -10004f7a: 1e4b subs r3, r1, #1 -10004f7c: 2901 cmp r1, #1 -10004f7e: d100 bne.n 10004f82 -10004f80: e0a7 b.n 100050d2 -10004f82: 4a66 ldr r2, [pc, #408] @ (1000511c ) -10004f84: 7811 ldrb r1, [r2, #0] -10004f86: 090d lsrs r5, r1, #4 -10004f88: 002c movs r4, r5 -10004f8a: 3430 adds r4, #48 @ 0x30 -10004f8c: 299f cmp r1, #159 @ 0x9f -10004f8e: d900 bls.n 10004f92 -10004f90: e0a2 b.n 100050d8 -10004f92: 7004 strb r4, [r0, #0] -10004f94: 2b01 cmp r3, #1 -10004f96: d100 bne.n 10004f9a -10004f98: e0be b.n 10005118 -10004f9a: 210f movs r1, #15 -10004f9c: 7814 ldrb r4, [r2, #0] -10004f9e: 4021 ands r1, r4 -10004fa0: 000c movs r4, r1 -10004fa2: 3430 adds r4, #48 @ 0x30 -10004fa4: 2909 cmp r1, #9 -10004fa6: d900 bls.n 10004faa -10004fa8: e098 b.n 100050dc -10004faa: 7044 strb r4, [r0, #1] -10004fac: 2b02 cmp r3, #2 -10004fae: d100 bne.n 10004fb2 -10004fb0: e0b2 b.n 10005118 -10004fb2: 7854 ldrb r4, [r2, #1] -10004fb4: 0925 lsrs r5, r4, #4 -10004fb6: 0029 movs r1, r5 -10004fb8: 3130 adds r1, #48 @ 0x30 -10004fba: 2c9f cmp r4, #159 @ 0x9f -10004fbc: d900 bls.n 10004fc0 -10004fbe: e090 b.n 100050e2 -10004fc0: 7081 strb r1, [r0, #2] -10004fc2: 2b03 cmp r3, #3 -10004fc4: d100 bne.n 10004fc8 -10004fc6: e0a7 b.n 10005118 -10004fc8: 210f movs r1, #15 -10004fca: 4021 ands r1, r4 -10004fcc: 000c movs r4, r1 -10004fce: 3430 adds r4, #48 @ 0x30 -10004fd0: 2909 cmp r1, #9 -10004fd2: d900 bls.n 10004fd6 -10004fd4: e087 b.n 100050e6 -10004fd6: 70c4 strb r4, [r0, #3] -10004fd8: 2b04 cmp r3, #4 -10004fda: d100 bne.n 10004fde -10004fdc: e09c b.n 10005118 -10004fde: 7894 ldrb r4, [r2, #2] -10004fe0: 0925 lsrs r5, r4, #4 -10004fe2: 0029 movs r1, r5 -10004fe4: 3130 adds r1, #48 @ 0x30 -10004fe6: 2c9f cmp r4, #159 @ 0x9f -10004fe8: d900 bls.n 10004fec -10004fea: e07f b.n 100050ec -10004fec: 7101 strb r1, [r0, #4] -10004fee: 2b05 cmp r3, #5 -10004ff0: d100 bne.n 10004ff4 -10004ff2: e091 b.n 10005118 -10004ff4: 210f movs r1, #15 -10004ff6: 4021 ands r1, r4 -10004ff8: 000c movs r4, r1 -10004ffa: 3430 adds r4, #48 @ 0x30 -10004ffc: 2909 cmp r1, #9 -10004ffe: d900 bls.n 10005002 -10005000: e076 b.n 100050f0 -10005002: 7144 strb r4, [r0, #5] -10005004: 2b06 cmp r3, #6 -10005006: d100 bne.n 1000500a -10005008: e086 b.n 10005118 -1000500a: 78d4 ldrb r4, [r2, #3] -1000500c: 0925 lsrs r5, r4, #4 -1000500e: 0029 movs r1, r5 -10005010: 3130 adds r1, #48 @ 0x30 -10005012: 2c9f cmp r4, #159 @ 0x9f -10005014: d900 bls.n 10005018 -10005016: e06e b.n 100050f6 -10005018: 7181 strb r1, [r0, #6] -1000501a: 2b07 cmp r3, #7 -1000501c: d100 bne.n 10005020 -1000501e: e07b b.n 10005118 -10005020: 210f movs r1, #15 -10005022: 4021 ands r1, r4 -10005024: 000c movs r4, r1 -10005026: 3430 adds r4, #48 @ 0x30 -10005028: 2909 cmp r1, #9 -1000502a: d866 bhi.n 100050fa -1000502c: 71c4 strb r4, [r0, #7] -1000502e: 2b08 cmp r3, #8 -10005030: d100 bne.n 10005034 -10005032: e071 b.n 10005118 -10005034: 7914 ldrb r4, [r2, #4] -10005036: 0925 lsrs r5, r4, #4 -10005038: 0029 movs r1, r5 -1000503a: 3130 adds r1, #48 @ 0x30 -1000503c: 2c9f cmp r4, #159 @ 0x9f -1000503e: d85f bhi.n 10005100 -10005040: 7201 strb r1, [r0, #8] -10005042: 2b09 cmp r3, #9 -10005044: d068 beq.n 10005118 -10005046: 210f movs r1, #15 -10005048: 4021 ands r1, r4 -1000504a: 000c movs r4, r1 -1000504c: 3430 adds r4, #48 @ 0x30 -1000504e: 2909 cmp r1, #9 -10005050: d858 bhi.n 10005104 -10005052: 7244 strb r4, [r0, #9] -10005054: 2b0a cmp r3, #10 -10005056: d05f beq.n 10005118 -10005058: 7954 ldrb r4, [r2, #5] -1000505a: 0925 lsrs r5, r4, #4 -1000505c: 0029 movs r1, r5 -1000505e: 3130 adds r1, #48 @ 0x30 -10005060: 2c9f cmp r4, #159 @ 0x9f -10005062: d852 bhi.n 1000510a -10005064: 7281 strb r1, [r0, #10] -10005066: 2b0b cmp r3, #11 -10005068: d056 beq.n 10005118 -1000506a: 210f movs r1, #15 -1000506c: 4021 ands r1, r4 -1000506e: 000c movs r4, r1 -10005070: 3430 adds r4, #48 @ 0x30 -10005072: 2909 cmp r1, #9 -10005074: d84b bhi.n 1000510e -10005076: 72c4 strb r4, [r0, #11] -10005078: 2b0c cmp r3, #12 -1000507a: d04d beq.n 10005118 -1000507c: 7994 ldrb r4, [r2, #6] -1000507e: 0925 lsrs r5, r4, #4 -10005080: 0029 movs r1, r5 -10005082: 3130 adds r1, #48 @ 0x30 -10005084: 2c9f cmp r4, #159 @ 0x9f -10005086: d900 bls.n 1000508a -10005088: 3107 adds r1, #7 -1000508a: 7301 strb r1, [r0, #12] -1000508c: 2b0d cmp r3, #13 -1000508e: d043 beq.n 10005118 -10005090: 210f movs r1, #15 -10005092: 4021 ands r1, r4 -10005094: 000c movs r4, r1 -10005096: 3430 adds r4, #48 @ 0x30 -10005098: 2909 cmp r1, #9 -1000509a: d901 bls.n 100050a0 -1000509c: 3137 adds r1, #55 @ 0x37 -1000509e: 000c movs r4, r1 -100050a0: 7344 strb r4, [r0, #13] -100050a2: 2b0e cmp r3, #14 -100050a4: d038 beq.n 10005118 -100050a6: 79d1 ldrb r1, [r2, #7] -100050a8: 090c lsrs r4, r1, #4 -100050aa: 0022 movs r2, r4 -100050ac: 3230 adds r2, #48 @ 0x30 -100050ae: 299f cmp r1, #159 @ 0x9f -100050b0: d900 bls.n 100050b4 -100050b2: 3207 adds r2, #7 -100050b4: 7382 strb r2, [r0, #14] -100050b6: 2b0f cmp r3, #15 -100050b8: d02e beq.n 10005118 -100050ba: 220f movs r2, #15 -100050bc: 400a ands r2, r1 -100050be: 0011 movs r1, r2 -100050c0: 3137 adds r1, #55 @ 0x37 -100050c2: 2a09 cmp r2, #9 -100050c4: d801 bhi.n 100050ca -100050c6: 3230 adds r2, #48 @ 0x30 -100050c8: 0011 movs r1, r2 -100050ca: 73c1 strb r1, [r0, #15] -100050cc: 2b10 cmp r3, #16 -100050ce: d023 beq.n 10005118 -100050d0: 3010 adds r0, #16 -100050d2: 2300 movs r3, #0 -100050d4: 7003 strb r3, [r0, #0] -100050d6: bd30 pop {r4, r5, pc} -100050d8: 3407 adds r4, #7 -100050da: e75a b.n 10004f92 -100050dc: 3137 adds r1, #55 @ 0x37 -100050de: 000c movs r4, r1 -100050e0: e763 b.n 10004faa -100050e2: 3107 adds r1, #7 -100050e4: e76c b.n 10004fc0 -100050e6: 3137 adds r1, #55 @ 0x37 -100050e8: 000c movs r4, r1 -100050ea: e774 b.n 10004fd6 -100050ec: 3107 adds r1, #7 -100050ee: e77d b.n 10004fec -100050f0: 3137 adds r1, #55 @ 0x37 -100050f2: 000c movs r4, r1 -100050f4: e785 b.n 10005002 -100050f6: 3107 adds r1, #7 -100050f8: e78e b.n 10005018 -100050fa: 3137 adds r1, #55 @ 0x37 -100050fc: 000c movs r4, r1 -100050fe: e795 b.n 1000502c -10005100: 3107 adds r1, #7 -10005102: e79d b.n 10005040 -10005104: 3137 adds r1, #55 @ 0x37 -10005106: 000c movs r4, r1 -10005108: e7a3 b.n 10005052 -1000510a: 3107 adds r1, #7 -1000510c: e7aa b.n 10005064 -1000510e: 3137 adds r1, #55 @ 0x37 -10005110: 000c movs r4, r1 -10005112: 72c4 strb r4, [r0, #11] -10005114: 2b0c cmp r3, #12 -10005116: d1b1 bne.n 1000507c -10005118: 18c0 adds r0, r0, r3 -1000511a: e7da b.n 100050d2 -1000511c: 20001c40 .word 0x20001c40 - -10005120 : -10005120: b510 push {r4, lr} -10005122: b088 sub sp, #32 -10005124: 0004 movs r4, r0 -10005126: 220d movs r2, #13 -10005128: 2100 movs r1, #0 -1000512a: 4668 mov r0, sp -1000512c: f7ff f9ca bl 100044c4 <__wrap_memset> -10005130: 220d movs r2, #13 -10005132: 2100 movs r1, #0 -10005134: a804 add r0, sp, #16 -10005136: f7ff f9c5 bl 100044c4 <__wrap_memset> -1000513a: 234b movs r3, #75 @ 0x4b -1000513c: 466a mov r2, sp -1000513e: 4668 mov r0, sp -10005140: 7013 strb r3, [r2, #0] -10005142: a904 add r1, sp, #16 -10005144: 220d movs r2, #13 -10005146: f001 fe07 bl 10006d58 <__flash_do_cmd_veneer> -1000514a: 2115 movs r1, #21 -1000514c: 2208 movs r2, #8 -1000514e: 0020 movs r0, r4 -10005150: 4469 add r1, sp -10005152: f7ff f9bd bl 100044d0 <__wrap___aeabi_memcpy> -10005156: b008 add sp, #32 -10005158: bd10 pop {r4, pc} -1000515a: 46c0 nop @ (mov r8, r8) - -1000515c : -1000515c: b510 push {r4, lr} -1000515e: 2101 movs r1, #1 -10005160: 2005 movs r0, #5 -10005162: f7fb f9d7 bl 10000514 -10005166: bd10 pop {r4, pc} - -10005168 : -10005168: b510 push {r4, lr} -1000516a: 2200 movs r2, #0 -1000516c: 2100 movs r1, #0 -1000516e: 4802 ldr r0, [pc, #8] @ (10005178 ) -10005170: f000 f958 bl 10005424 -10005174: bd10 pop {r4, pc} -10005176: 46c0 nop @ (mov r8, r8) -10005178: 20001824 .word 0x20001824 - -1000517c : -1000517c: 2280 movs r2, #128 @ 0x80 -1000517e: 4b02 ldr r3, [pc, #8] @ (10005188 ) -10005180: 0252 lsls r2, r2, #9 -10005182: 64da str r2, [r3, #76] @ 0x4c -10005184: 4770 bx lr -10005186: 46c0 nop @ (mov r8, r8) -10005188: 50112000 .word 0x50112000 - -1000518c : -1000518c: b5f0 push {r4, r5, r6, r7, lr} -1000518e: 46c6 mov lr, r8 -10005190: b500 push {lr} -10005192: 0006 movs r6, r0 -10005194: f000 f920 bl 100053d8 -10005198: 230c movs r3, #12 -1000519a: 4d1b ldr r5, [pc, #108] @ (10005208 ) -1000519c: 22ff movs r2, #255 @ 0xff -1000519e: 67ab str r3, [r5, #120] @ 0x78 -100051a0: 2005 movs r0, #5 -100051a2: 491a ldr r1, [pc, #104] @ (1000520c ) -100051a4: f7fb fa18 bl 100005d8 -100051a8: 2340 movs r3, #64 @ 0x40 -100051aa: 4698 mov r8, r3 -100051ac: 4c18 ldr r4, [pc, #96] @ (10005210 ) -100051ae: 2240 movs r2, #64 @ 0x40 -100051b0: 2100 movs r1, #0 -100051b2: 0020 movs r0, r4 -100051b4: f7ff f986 bl 100044c4 <__wrap_memset> -100051b8: 4643 mov r3, r8 -100051ba: 2701 movs r7, #1 -100051bc: 8323 strh r3, [r4, #24] -100051be: 2121 movs r1, #33 @ 0x21 -100051c0: 2300 movs r3, #0 -100051c2: 4a14 ldr r2, [pc, #80] @ (10005214 ) -100051c4: 7067 strb r7, [r4, #1] -100051c6: 60a2 str r2, [r4, #8] -100051c8: 6013 str r3, [r2, #0] -100051ca: 5463 strb r3, [r4, r1] -100051cc: 315f adds r1, #95 @ 0x5f -100051ce: 8461 strh r1, [r4, #34] @ 0x22 -100051d0: 4641 mov r1, r8 -100051d2: 8721 strh r1, [r4, #56] @ 0x38 -100051d4: 3905 subs r1, #5 -100051d6: 5463 strb r3, [r4, r1] -100051d8: 4a0f ldr r2, [pc, #60] @ (10005218 ) -100051da: 4910 ldr r1, [pc, #64] @ (1000521c ) -100051dc: 6063 str r3, [r4, #4] -100051de: 60e2 str r2, [r4, #12] -100051e0: 62a1 str r1, [r4, #40] @ 0x28 -100051e2: 600b str r3, [r1, #0] -100051e4: 6263 str r3, [r4, #36] @ 0x24 -100051e6: 62e2 str r2, [r4, #44] @ 0x2c -100051e8: f001 fe06 bl 10006df8 <__reset_non_control_endpoints_veneer> -100051ec: 2380 movs r3, #128 @ 0x80 -100051ee: 059b lsls r3, r3, #22 -100051f0: 642f str r7, [r5, #64] @ 0x40 -100051f2: 64eb str r3, [r5, #76] @ 0x4c -100051f4: 2390 movs r3, #144 @ 0x90 -100051f6: 4a0a ldr r2, [pc, #40] @ (10005220 ) -100051f8: 0030 movs r0, r6 -100051fa: 50ea str r2, [r5, r3] -100051fc: f7ff ffbe bl 1000517c -10005200: bc80 pop {r7} -10005202: 46b8 mov r8, r7 -10005204: bdf0 pop {r4, r5, r6, r7, pc} -10005206: 46c0 nop @ (mov r8, r8) -10005208: 50110000 .word 0x50110000 -1000520c: 200004a1 .word 0x200004a1 -10005210: 20001804 .word 0x20001804 -10005214: 50100084 .word 0x50100084 -10005218: 50100100 .word 0x50100100 -1000521c: 50100080 .word 0x50100080 -10005220: 0001d010 .word 0x0001d010 - -10005224 : -10005224: 780b ldrb r3, [r1, #0] -10005226: 065b lsls r3, r3, #25 -10005228: d102 bne.n 10005230 -1000522a: 784b ldrb r3, [r1, #1] -1000522c: 2b05 cmp r3, #5 -1000522e: d000 beq.n 10005232 -10005230: 4770 bx lr -10005232: 788a ldrb r2, [r1, #2] -10005234: 4b01 ldr r3, [pc, #4] @ (1000523c ) -10005236: 601a str r2, [r3, #0] -10005238: e7fa b.n 10005230 -1000523a: 46c0 nop @ (mov r8, r8) -1000523c: 50110000 .word 0x50110000 - -10005240 : -10005240: b5f0 push {r4, r5, r6, r7, lr} -10005242: 46c6 mov lr, r8 -10005244: b500 push {lr} -10005246: 78cc ldrb r4, [r1, #3] -10005248: 7888 ldrb r0, [r1, #2] -1000524a: 790a ldrb r2, [r1, #4] -1000524c: 794b ldrb r3, [r1, #5] -1000524e: 217f movs r1, #127 @ 0x7f -10005250: 07a4 lsls r4, r4, #30 -10005252: 4001 ands r1, r0 -10005254: 021b lsls r3, r3, #8 -10005256: 09c5 lsrs r5, r0, #7 -10005258: 4313 orrs r3, r2 -1000525a: 004f lsls r7, r1, #1 -1000525c: 0fa2 lsrs r2, r4, #30 -1000525e: 0014 movs r4, r2 -10005260: 4e32 ldr r6, [pc, #200] @ (1000532c ) -10005262: 197a adds r2, r7, r5 -10005264: 0152 lsls r2, r2, #5 -10005266: 18b2 adds r2, r6, r2 -10005268: 7090 strb r0, [r2, #2] -1000526a: 2001 movs r0, #1 -1000526c: 4068 eors r0, r5 -1000526e: 7050 strb r0, [r2, #1] -10005270: 2000 movs r0, #0 -10005272: 055b lsls r3, r3, #21 -10005274: 0d5b lsrs r3, r3, #21 -10005276: 70d0 strb r0, [r2, #3] -10005278: 8313 strh r3, [r2, #24] -1000527a: 76d4 strb r4, [r2, #27] -1000527c: 4680 mov r8, r0 -1000527e: 00ca lsls r2, r1, #3 -10005280: 2d01 cmp r5, #1 -10005282: d033 beq.n 100052ec -10005284: 482a ldr r0, [pc, #168] @ (10005330 ) -10005286: 4684 mov ip, r0 -10005288: 0188 lsls r0, r1, #6 -1000528a: 4462 add r2, ip -1000528c: 4684 mov ip, r0 -1000528e: 44b4 add ip, r6 -10005290: 4660 mov r0, ip -10005292: 6082 str r2, [r0, #8] -10005294: 4640 mov r0, r8 -10005296: 6010 str r0, [r2, #0] -10005298: 2900 cmp r1, #0 -1000529a: d033 beq.n 10005304 -1000529c: 4a25 ldr r2, [pc, #148] @ (10005334 ) -1000529e: 00c9 lsls r1, r1, #3 -100052a0: 4690 mov r8, r2 -100052a2: 4662 mov r2, ip -100052a4: 4441 add r1, r8 -100052a6: 6051 str r1, [r2, #4] -100052a8: 223f movs r2, #63 @ 0x3f -100052aa: 333f adds r3, #63 @ 0x3f -100052ac: 4393 bics r3, r2 -100052ae: 2c02 cmp r4, #2 -100052b0: d100 bne.n 100052b4 -100052b2: 005b lsls r3, r3, #1 -100052b4: 4820 ldr r0, [pc, #128] @ (10005338 ) -100052b6: 197a adds r2, r7, r5 -100052b8: 6801 ldr r1, [r0, #0] -100052ba: 0152 lsls r2, r2, #5 -100052bc: 18b2 adds r2, r6, r2 -100052be: 60d1 str r1, [r2, #12] -100052c0: 4a1e ldr r2, [pc, #120] @ (1000533c ) -100052c2: 18cb adds r3, r1, r3 -100052c4: 6003 str r3, [r0, #0] -100052c6: 4051 eors r1, r2 -100052c8: 405a eors r2, r3 -100052ca: 2380 movs r3, #128 @ 0x80 -100052cc: 4688 mov r8, r1 -100052ce: 015b lsls r3, r3, #5 -100052d0: 429a cmp r2, r3 -100052d2: d828 bhi.n 10005326 -100052d4: 4643 mov r3, r8 -100052d6: 06a4 lsls r4, r4, #26 -100052d8: 431c orrs r4, r3 -100052da: 2380 movs r3, #128 @ 0x80 -100052dc: 197f adds r7, r7, r5 -100052de: 017f lsls r7, r7, #5 -100052e0: 19f6 adds r6, r6, r7 -100052e2: 6872 ldr r2, [r6, #4] -100052e4: 061b lsls r3, r3, #24 -100052e6: 4323 orrs r3, r4 -100052e8: 6013 str r3, [r2, #0] -100052ea: e011 b.n 10005310 -100052ec: 4814 ldr r0, [pc, #80] @ (10005340 ) -100052ee: 4684 mov ip, r0 -100052f0: 0188 lsls r0, r1, #6 -100052f2: 4462 add r2, ip -100052f4: 4684 mov ip, r0 -100052f6: 44b4 add ip, r6 -100052f8: 4660 mov r0, ip -100052fa: 6282 str r2, [r0, #40] @ 0x28 -100052fc: 4640 mov r0, r8 -100052fe: 6010 str r0, [r2, #0] -10005300: 2900 cmp r1, #0 -10005302: d109 bne.n 10005318 -10005304: 2300 movs r3, #0 -10005306: 016d lsls r5, r5, #5 -10005308: 1975 adds r5, r6, r5 -1000530a: 606b str r3, [r5, #4] -1000530c: 4b0d ldr r3, [pc, #52] @ (10005344 ) -1000530e: 60eb str r3, [r5, #12] -10005310: 2001 movs r0, #1 -10005312: bc80 pop {r7} -10005314: 46b8 mov r8, r7 -10005316: bdf0 pop {r4, r5, r6, r7, pc} -10005318: 4a08 ldr r2, [pc, #32] @ (1000533c ) -1000531a: 00c9 lsls r1, r1, #3 -1000531c: 4690 mov r8, r2 -1000531e: 4662 mov r2, ip -10005320: 4441 add r1, r8 -10005322: 6251 str r1, [r2, #36] @ 0x24 -10005324: e7c0 b.n 100052a8 -10005326: f7fc fe35 bl 10001f94 -1000532a: e7d3 b.n 100052d4 -1000532c: 20001804 .word 0x20001804 -10005330: 50100084 .word 0x50100084 -10005334: 50100004 .word 0x50100004 -10005338: 20001c0c .word 0x20001c0c -1000533c: 50100000 .word 0x50100000 -10005340: 50100080 .word 0x50100080 -10005344: 50100100 .word 0x50100100 - -10005348 : -10005348: b510 push {r4, lr} -1000534a: f001 fd55 bl 10006df8 <__reset_non_control_endpoints_veneer> -1000534e: bd10 pop {r4, pc} - -10005350 : -10005350: b510 push {r4, lr} -10005352: 207f movs r0, #127 @ 0x7f -10005354: 000c movs r4, r1 -10005356: 4020 ands r0, r4 -10005358: 0040 lsls r0, r0, #1 -1000535a: 09e4 lsrs r4, r4, #7 -1000535c: 0011 movs r1, r2 -1000535e: 1900 adds r0, r0, r4 -10005360: 001a movs r2, r3 -10005362: 4b03 ldr r3, [pc, #12] @ (10005370 ) -10005364: 0140 lsls r0, r0, #5 -10005366: 18c0 adds r0, r0, r3 -10005368: f000 f85c bl 10005424 -1000536c: 2001 movs r0, #1 -1000536e: bd10 pop {r4, pc} -10005370: 20001804 .word 0x20001804 - -10005374 : -10005374: 237f movs r3, #127 @ 0x7f -10005376: 0018 movs r0, r3 -10005378: b510 push {r4, lr} -1000537a: 4008 ands r0, r1 -1000537c: 09ca lsrs r2, r1, #7 -1000537e: 420b tst r3, r1 -10005380: d103 bne.n 1000538a -10005382: 4907 ldr r1, [pc, #28] @ (100053a0 ) -10005384: 3b7d subs r3, #125 @ 0x7d -10005386: 1a9b subs r3, r3, r2 -10005388: 668b str r3, [r1, #104] @ 0x68 -1000538a: 0040 lsls r0, r0, #1 -1000538c: 1880 adds r0, r0, r2 -1000538e: 2280 movs r2, #128 @ 0x80 -10005390: 4b04 ldr r3, [pc, #16] @ (100053a4 ) -10005392: 0140 lsls r0, r0, #5 -10005394: 2100 movs r1, #0 -10005396: 18c0 adds r0, r0, r3 -10005398: 0112 lsls r2, r2, #4 -1000539a: f001 fd35 bl 10006e08 <___hw_endpoint_buffer_control_update32_veneer> -1000539e: bd10 pop {r4, pc} -100053a0: 50112000 .word 0x50112000 -100053a4: 20001804 .word 0x20001804 - -100053a8 : -100053a8: 227f movs r2, #127 @ 0x7f -100053aa: 0013 movs r3, r2 -100053ac: b510 push {r4, lr} -100053ae: 400b ands r3, r1 -100053b0: 420a tst r2, r1 -100053b2: d100 bne.n 100053b6 -100053b4: bd10 pop {r4, pc} -100053b6: 09c9 lsrs r1, r1, #7 -100053b8: 005b lsls r3, r3, #1 -100053ba: 185b adds r3, r3, r1 -100053bc: 4804 ldr r0, [pc, #16] @ (100053d0 ) -100053be: 015b lsls r3, r3, #5 -100053c0: 18c0 adds r0, r0, r3 -100053c2: 2300 movs r3, #0 -100053c4: 2200 movs r2, #0 -100053c6: 4903 ldr r1, [pc, #12] @ (100053d4 ) -100053c8: 70c3 strb r3, [r0, #3] -100053ca: f001 fd1d bl 10006e08 <___hw_endpoint_buffer_control_update32_veneer> -100053ce: e7f1 b.n 100053b4 -100053d0: 20001804 .word 0x20001804 -100053d4: fffff7ff .word 0xfffff7ff - -100053d8 : -100053d8: 2280 movs r2, #128 @ 0x80 -100053da: 4b0d ldr r3, [pc, #52] @ (10005410 ) -100053dc: 0452 lsls r2, r2, #17 -100053de: b510 push {r4, lr} -100053e0: 601a str r2, [r3, #0] -100053e2: 4b0c ldr r3, [pc, #48] @ (10005414 ) -100053e4: 490c ldr r1, [pc, #48] @ (10005418 ) -100053e6: 601a str r2, [r3, #0] -100053e8: 0010 movs r0, r2 -100053ea: 688b ldr r3, [r1, #8] -100053ec: 4398 bics r0, r3 -100053ee: d1fb bne.n 100053e8 -100053f0: 4c0a ldr r4, [pc, #40] @ (1000541c ) -100053f2: 229c movs r2, #156 @ 0x9c -100053f4: 2100 movs r1, #0 -100053f6: 0020 movs r0, r4 -100053f8: f7ff f864 bl 100044c4 <__wrap_memset> -100053fc: 2280 movs r2, #128 @ 0x80 -100053fe: 2100 movs r1, #0 -10005400: 0152 lsls r2, r2, #5 -10005402: 4807 ldr r0, [pc, #28] @ (10005420 ) -10005404: f7ff f85e bl 100044c4 <__wrap_memset> -10005408: 2309 movs r3, #9 -1000540a: 6763 str r3, [r4, #116] @ 0x74 -1000540c: bd10 pop {r4, pc} -1000540e: 46c0 nop @ (mov r8, r8) -10005410: 4000e000 .word 0x4000e000 -10005414: 4000f000 .word 0x4000f000 -10005418: 4000c000 .word 0x4000c000 -1000541c: 50110000 .word 0x50110000 -10005420: 50100000 .word 0x50100000 - -10005424 : -10005424: 2300 movs r3, #0 -10005426: b510 push {r4, lr} -10005428: 82c3 strh r3, [r0, #22] -1000542a: 3301 adds r3, #1 -1000542c: 8282 strh r2, [r0, #20] -1000542e: 7683 strb r3, [r0, #26] -10005430: 6101 str r1, [r0, #16] -10005432: 0004 movs r4, r0 -10005434: f001 fcc0 bl 10006db8 <__e15_is_bulkin_ep_veneer> -10005438: 2800 cmp r0, #0 -1000543a: d004 beq.n 10005446 -1000543c: 2180 movs r1, #128 @ 0x80 -1000543e: 2390 movs r3, #144 @ 0x90 -10005440: 4a07 ldr r2, [pc, #28] @ (10005460 ) -10005442: 0289 lsls r1, r1, #10 -10005444: 50d1 str r1, [r2, r3] -10005446: 0020 movs r0, r4 -10005448: f001 fc9e bl 10006d88 <__e15_is_critical_frame_period_veneer> -1000544c: 2800 cmp r0, #0 -1000544e: d002 beq.n 10005456 -10005450: 2301 movs r3, #1 -10005452: 7723 strb r3, [r4, #28] -10005454: bd10 pop {r4, pc} -10005456: 0020 movs r0, r4 -10005458: f001 fcc6 bl 10006de8 <__hw_endpoint_start_next_buffer_veneer> -1000545c: e7fa b.n 10005454 -1000545e: 46c0 nop @ (mov r8, r8) -10005460: 50112000 .word 0x50112000 - -10005464 : -10005464: 4b02 ldr r3, [pc, #8] @ (10005470 ) -10005466: 7858 ldrb r0, [r3, #1] -10005468: 1e43 subs r3, r0, #1 -1000546a: 4198 sbcs r0, r3 -1000546c: b2c0 uxtb r0, r0 -1000546e: 4770 bx lr -10005470: 20001550 .word 0x20001550 - -10005474 : -10005474: 4b02 ldr r3, [pc, #8] @ (10005480 ) -10005476: 7818 ldrb r0, [r3, #0] -10005478: 0740 lsls r0, r0, #29 -1000547a: 0fc0 lsrs r0, r0, #31 -1000547c: 4770 bx lr -1000547e: 46c0 nop @ (mov r8, r8) -10005480: 20001550 .word 0x20001550 - -10005484 : -10005484: 4b03 ldr r3, [pc, #12] @ (10005494 ) -10005486: 7818 ldrb r0, [r3, #0] -10005488: 38ff subs r0, #255 @ 0xff -1000548a: 1e43 subs r3, r0, #1 -1000548c: 4198 sbcs r0, r3 -1000548e: b2c0 uxtb r0, r0 -10005490: 4770 bx lr -10005492: 46c0 nop @ (mov r8, r8) -10005494: 20000ed4 .word 0x20000ed4 - -10005498 : -10005498: b5f8 push {r3, r4, r5, r6, r7, lr} -1000549a: 46ce mov lr, r9 -1000549c: 4647 mov r7, r8 -1000549e: b580 push {r7, lr} -100054a0: 4e2a ldr r6, [pc, #168] @ (1000554c ) -100054a2: 0005 movs r5, r0 -100054a4: 7833 ldrb r3, [r6, #0] -100054a6: 2bff cmp r3, #255 @ 0xff -100054a8: d001 beq.n 100054ae -100054aa: 2001 movs r0, #1 -100054ac: e03d b.n 1000552a -100054ae: 2253 movs r2, #83 @ 0x53 -100054b0: 2100 movs r1, #0 -100054b2: 4827 ldr r0, [pc, #156] @ (10005550 ) -100054b4: f7ff f806 bl 100044c4 <__wrap_memset> -100054b8: 4c26 ldr r4, [pc, #152] @ (10005554 ) -100054ba: 0020 movs r0, r4 -100054bc: f7fb faf2 bl 10000aa4 -100054c0: 4b25 ldr r3, [pc, #148] @ (10005558 ) -100054c2: 601c str r4, [r3, #0] -100054c4: 4c25 ldr r4, [pc, #148] @ (1000555c ) -100054c6: 0020 movs r0, r4 -100054c8: 3c14 subs r4, #20 -100054ca: f7fb fb07 bl 10000adc -100054ce: 0020 movs r0, r4 -100054d0: f001 fbcc bl 10006c6c -100054d4: 4b22 ldr r3, [pc, #136] @ (10005560 ) -100054d6: 4f23 ldr r7, [pc, #140] @ (10005564 ) -100054d8: 601c str r4, [r3, #0] -100054da: 4b23 ldr r3, [pc, #140] @ (10005568 ) -100054dc: 4698 mov r8, r3 -100054de: 2f00 cmp r7, #0 -100054e0: d01e beq.n 10005520 -100054e2: 0018 movs r0, r3 -100054e4: f7ff fb02 bl 10004aec -100054e8: 4b20 ldr r3, [pc, #128] @ (1000556c ) -100054ea: 6018 str r0, [r3, #0] -100054ec: 4643 mov r3, r8 -100054ee: 781b ldrb r3, [r3, #0] -100054f0: 4a1f ldr r2, [pc, #124] @ (10005570 ) -100054f2: 2400 movs r4, #0 -100054f4: 4691 mov r9, r2 -100054f6: 2f00 cmp r7, #0 -100054f8: d014 beq.n 10005524 -100054fa: 464a mov r2, r9 -100054fc: 42a3 cmp r3, r4 -100054fe: d81a bhi.n 10005536 -10005500: 4790 blx r2 -10005502: 4643 mov r3, r8 -10005504: 3401 adds r4, #1 -10005506: 781b ldrb r3, [r3, #0] -10005508: b2e4 uxtb r4, r4 -1000550a: 42a3 cmp r3, r4 -1000550c: d2f3 bcs.n 100054f6 -1000550e: 0028 movs r0, r5 -10005510: 7035 strb r5, [r6, #0] -10005512: f7ff fe3b bl 1000518c -10005516: 0028 movs r0, r5 -10005518: f7ff fe20 bl 1000515c -1000551c: 2001 movs r0, #1 -1000551e: e004 b.n 1000552a -10005520: 781b ldrb r3, [r3, #0] -10005522: e7e5 b.n 100054f0 -10005524: 2c00 cmp r4, #0 -10005526: d004 beq.n 10005532 -10005528: 2000 movs r0, #0 -1000552a: bcc0 pop {r6, r7} -1000552c: 46b9 mov r9, r7 -1000552e: 46b0 mov r8, r6 -10005530: bdf8 pop {r3, r4, r5, r6, r7, pc} -10005532: 4a0f ldr r2, [pc, #60] @ (10005570 ) -10005534: e7e4 b.n 10005500 -10005536: 4a0d ldr r2, [pc, #52] @ (1000556c ) -10005538: 0063 lsls r3, r4, #1 -1000553a: 6812 ldr r2, [r2, #0] -1000553c: 191b adds r3, r3, r4 -1000553e: 00db lsls r3, r3, #3 -10005540: 18d3 adds r3, r2, r3 -10005542: 2b00 cmp r3, #0 -10005544: d0f0 beq.n 10005528 -10005546: 681a ldr r2, [r3, #0] -10005548: e7da b.n 10005500 -1000554a: 46c0 nop @ (mov r8, r8) -1000554c: 20000ed4 .word 0x20000ed4 -10005550: 20001550 .word 0x20001550 -10005554: 20001508 .word 0x20001508 -10005558: 200015a4 .word 0x200015a4 -1000555c: 20000ecc .word 0x20000ecc -10005560: 200015a8 .word 0x200015a8 -10005564: 10004aed .word 0x10004aed -10005568: 20001c81 .word 0x20001c81 -1000556c: 20001228 .word 0x20001228 -10005570: 100062fd .word 0x100062fd - -10005574 : -10005574: b5f0 push {r4, r5, r6, r7, lr} -10005576: 46de mov lr, fp -10005578: 4657 mov r7, sl -1000557a: 464e mov r6, r9 -1000557c: 4645 mov r5, r8 -1000557e: b5e0 push {r5, r6, r7, lr} -10005580: b091 sub sp, #68 @ 0x44 -10005582: f001 f897 bl 100066b4 -10005586: 2800 cmp r0, #0 -10005588: d100 bne.n 1000558c -1000558a: e0fc b.n 10005786 -1000558c: 4bc3 ldr r3, [pc, #780] @ (1000589c ) -1000558e: 4ec4 ldr r6, [pc, #784] @ (100058a0 ) -10005590: 4699 mov r9, r3 -10005592: 4bc4 ldr r3, [pc, #784] @ (100058a4 ) -10005594: ac0d add r4, sp, #52 @ 0x34 -10005596: 9302 str r3, [sp, #8] -10005598: 4bc3 ldr r3, [pc, #780] @ (100058a8 ) -1000559a: 469b mov fp, r3 -1000559c: 464b mov r3, r9 -1000559e: 9301 str r3, [sp, #4] -100055a0: 6835 ldr r5, [r6, #0] -100055a2: 696a ldr r2, [r5, #20] -100055a4: f3ef 8110 mrs r1, PRIMASK -100055a8: b672 cpsid i -100055aa: 6813 ldr r3, [r2, #0] -100055ac: 2b00 cmp r3, #0 -100055ae: d0fc beq.n 100055aa -100055b0: f3bf 8f5f dmb sy -100055b4: 61a9 str r1, [r5, #24] -100055b6: 0028 movs r0, r5 -100055b8: 0021 movs r1, r4 -100055ba: f001 f985 bl 100068c8 -100055be: 696a ldr r2, [r5, #20] -100055c0: 69ab ldr r3, [r5, #24] -100055c2: f3bf 8f5f dmb sy -100055c6: 2100 movs r1, #0 -100055c8: 6011 str r1, [r2, #0] -100055ca: f383 8810 msr PRIMASK, r3 -100055ce: 2800 cmp r0, #0 -100055d0: d100 bne.n 100055d4 -100055d2: e0d8 b.n 10005786 -100055d4: 7863 ldrb r3, [r4, #1] -100055d6: 2b08 cmp r3, #8 -100055d8: d8e2 bhi.n 100055a0 -100055da: 9a01 ldr r2, [sp, #4] -100055dc: 009b lsls r3, r3, #2 -100055de: 58d3 ldr r3, [r2, r3] -100055e0: 469f mov pc, r3 -100055e2: 6863 ldr r3, [r4, #4] -100055e4: 2b00 cmp r3, #0 -100055e6: d0db beq.n 100055a0 -100055e8: 68a0 ldr r0, [r4, #8] -100055ea: 4798 blx r3 -100055ec: e7d8 b.n 100055a0 -100055ee: 207f movs r0, #127 @ 0x7f -100055f0: 7921 ldrb r1, [r4, #4] -100055f2: 4dac ldr r5, [pc, #688] @ (100058a4 ) -100055f4: 4008 ands r0, r1 -100055f6: 0043 lsls r3, r0, #1 -100055f8: 09ca lsrs r2, r1, #7 -100055fa: 18eb adds r3, r5, r3 -100055fc: 189b adds r3, r3, r2 -100055fe: 001d movs r5, r3 -10005600: 2701 movs r7, #1 -10005602: 3530 adds r5, #48 @ 0x30 -10005604: 78ea ldrb r2, [r5, #3] -10005606: 43ba bics r2, r7 -10005608: 70ea strb r2, [r5, #3] -1000560a: 78ea ldrb r2, [r5, #3] -1000560c: 3703 adds r7, #3 -1000560e: 43ba bics r2, r7 -10005610: 70ea strb r2, [r5, #3] -10005612: 2800 cmp r0, #0 -10005614: d100 bne.n 10005618 -10005616: e0f2 b.n 100057fe -10005618: 4fa4 ldr r7, [pc, #656] @ (100058ac ) -1000561a: 7cdb ldrb r3, [r3, #19] -1000561c: 2f00 cmp r7, #0 -1000561e: d006 beq.n 1000562e -10005620: 4aa3 ldr r2, [pc, #652] @ (100058b0 ) -10005622: 7812 ldrb r2, [r2, #0] -10005624: 4293 cmp r3, r2 -10005626: d200 bcs.n 1000562a -10005628: e0f1 b.n 1000580e -1000562a: 1a9b subs r3, r3, r2 -1000562c: b2db uxtb r3, r3 -1000562e: 2b00 cmp r3, #0 -10005630: d000 beq.n 10005634 -10005632: e0a8 b.n 10005786 -10005634: 4d9f ldr r5, [pc, #636] @ (100058b4 ) -10005636: 68a3 ldr r3, [r4, #8] -10005638: 7962 ldrb r2, [r4, #5] -1000563a: 7820 ldrb r0, [r4, #0] -1000563c: 47a8 blx r5 -1000563e: e7af b.n 100055a0 -10005640: 2201 movs r2, #1 -10005642: 4d98 ldr r5, [pc, #608] @ (100058a4 ) -10005644: 2001 movs r0, #1 -10005646: 782b ldrb r3, [r5, #0] -10005648: 2104 movs r1, #4 -1000564a: 4313 orrs r3, r2 -1000564c: 702b strb r3, [r5, #0] -1000564e: 2333 movs r3, #51 @ 0x33 -10005650: 5cea ldrb r2, [r5, r3] -10005652: 4382 bics r2, r0 -10005654: 54ea strb r2, [r5, r3] -10005656: 5cea ldrb r2, [r5, r3] -10005658: 438a bics r2, r1 -1000565a: 54ea strb r2, [r5, r3] -1000565c: 3301 adds r3, #1 -1000565e: 5cea ldrb r2, [r5, r3] -10005660: 4382 bics r2, r0 -10005662: 54ea strb r2, [r5, r3] -10005664: 5cea ldrb r2, [r5, r3] -10005666: 2000 movs r0, #0 -10005668: 438a bics r2, r1 -1000566a: 54ea strb r2, [r5, r3] -1000566c: 7823 ldrb r3, [r4, #0] -1000566e: 469a mov sl, r3 -10005670: f000 fcf8 bl 10006064 -10005674: 2260 movs r2, #96 @ 0x60 -10005676: 7923 ldrb r3, [r4, #4] -10005678: 401a ands r2, r3 -1000567a: 2a60 cmp r2, #96 @ 0x60 -1000567c: d100 bne.n 10005680 -1000567e: e0b5 b.n 100057ec -10005680: 2a40 cmp r2, #64 @ 0x40 -10005682: d100 bne.n 10005686 -10005684: e0af b.n 100057e6 -10005686: 06db lsls r3, r3, #27 -10005688: 0edb lsrs r3, r3, #27 -1000568a: 2b01 cmp r3, #1 -1000568c: d100 bne.n 10005690 -1000568e: e0d3 b.n 10005838 -10005690: 2b02 cmp r3, #2 -10005692: d100 bne.n 10005696 -10005694: e120 b.n 100058d8 -10005696: 2b00 cmp r3, #0 -10005698: d000 beq.n 1000569c -1000569a: e0a7 b.n 100057ec -1000569c: 2a20 cmp r2, #32 -1000569e: d100 bne.n 100056a2 -100056a0: e153 b.n 1000594a -100056a2: 2a00 cmp r2, #0 -100056a4: d000 beq.n 100056a8 -100056a6: e0a1 b.n 100057ec -100056a8: 7963 ldrb r3, [r4, #5] -100056aa: 2b09 cmp r3, #9 -100056ac: d900 bls.n 100056b0 -100056ae: e09d b.n 100057ec -100056b0: 4a81 ldr r2, [pc, #516] @ (100058b8 ) -100056b2: 009b lsls r3, r3, #2 -100056b4: 58d3 ldr r3, [r2, r3] -100056b6: 469f mov pc, r3 -100056b8: 9b02 ldr r3, [sp, #8] -100056ba: 781b ldrb r3, [r3, #0] -100056bc: 07db lsls r3, r3, #31 -100056be: d400 bmi.n 100056c2 -100056c0: e76e b.n 100055a0 -100056c2: 4b7e ldr r3, [pc, #504] @ (100058bc ) -100056c4: 2b00 cmp r3, #0 -100056c6: d100 bne.n 100056ca -100056c8: e76a b.n 100055a0 -100056ca: e000 b.n 100056ce -100056cc: bf00 nop -100056ce: e767 b.n 100055a0 -100056d0: 4d74 ldr r5, [pc, #464] @ (100058a4 ) -100056d2: 782b ldrb r3, [r5, #0] -100056d4: 07db lsls r3, r3, #31 -100056d6: d400 bmi.n 100056da -100056d8: e762 b.n 100055a0 -100056da: 4b79 ldr r3, [pc, #484] @ (100058c0 ) -100056dc: 2b00 cmp r3, #0 -100056de: d100 bne.n 100056e2 -100056e0: e75e b.n 100055a0 -100056e2: 7828 ldrb r0, [r5, #0] -100056e4: 0700 lsls r0, r0, #28 -100056e6: 0fc0 lsrs r0, r0, #31 -100056e8: e000 b.n 100056ec -100056ea: bf00 nop -100056ec: e758 b.n 100055a0 -100056ee: 2500 movs r5, #0 -100056f0: 7823 ldrb r3, [r4, #0] -100056f2: 4f6e ldr r7, [pc, #440] @ (100058ac ) -100056f4: 469a mov sl, r3 -100056f6: 4b6e ldr r3, [pc, #440] @ (100058b0 ) -100056f8: 4698 mov r8, r3 -100056fa: 781b ldrb r3, [r3, #0] -100056fc: 2f00 cmp r7, #0 -100056fe: d049 beq.n 10005794 -10005700: 465a mov r2, fp -10005702: 42ab cmp r3, r5 -10005704: d863 bhi.n 100057ce -10005706: 4650 mov r0, sl -10005708: 4790 blx r2 -1000570a: 4643 mov r3, r8 -1000570c: 3501 adds r5, #1 -1000570e: 781b ldrb r3, [r3, #0] -10005710: b2ed uxtb r5, r5 -10005712: 42ab cmp r3, r5 -10005714: d2f2 bcs.n 100056fc -10005716: 4d63 ldr r5, [pc, #396] @ (100058a4 ) -10005718: 2253 movs r2, #83 @ 0x53 -1000571a: 2100 movs r1, #0 -1000571c: 0028 movs r0, r5 -1000571e: f7fe fed1 bl 100044c4 <__wrap_memset> -10005722: 2210 movs r2, #16 -10005724: 21ff movs r1, #255 @ 0xff -10005726: 1ce8 adds r0, r5, #3 -10005728: f7fe fecc bl 100044c4 <__wrap_memset> -1000572c: 0028 movs r0, r5 -1000572e: 2220 movs r2, #32 -10005730: 21ff movs r1, #255 @ 0xff -10005732: 3013 adds r0, #19 -10005734: f7fe fec6 bl 100044c4 <__wrap_memset> -10005738: e02e b.n 10005798 -1000573a: 2500 movs r5, #0 -1000573c: 7823 ldrb r3, [r4, #0] -1000573e: 4f5b ldr r7, [pc, #364] @ (100058ac ) -10005740: 469a mov sl, r3 -10005742: 4b5b ldr r3, [pc, #364] @ (100058b0 ) -10005744: 4698 mov r8, r3 -10005746: 781b ldrb r3, [r3, #0] -10005748: 2f00 cmp r7, #0 -1000574a: d02e beq.n 100057aa -1000574c: 465a mov r2, fp -1000574e: 429d cmp r5, r3 -10005750: d333 bcc.n 100057ba -10005752: 4650 mov r0, sl -10005754: 4790 blx r2 -10005756: 4643 mov r3, r8 -10005758: 3501 adds r5, #1 -1000575a: 781b ldrb r3, [r3, #0] -1000575c: b2ed uxtb r5, r5 -1000575e: 42ab cmp r3, r5 -10005760: d2f2 bcs.n 10005748 -10005762: 4d50 ldr r5, [pc, #320] @ (100058a4 ) -10005764: 2253 movs r2, #83 @ 0x53 -10005766: 2100 movs r1, #0 -10005768: 0028 movs r0, r5 -1000576a: f7fe feab bl 100044c4 <__wrap_memset> -1000576e: 2210 movs r2, #16 -10005770: 21ff movs r1, #255 @ 0xff -10005772: 1ce8 adds r0, r5, #3 -10005774: f7fe fea6 bl 100044c4 <__wrap_memset> -10005778: 0028 movs r0, r5 -1000577a: 2220 movs r2, #32 -1000577c: 21ff movs r1, #255 @ 0xff -1000577e: 3013 adds r0, #19 -10005780: f7fe fea0 bl 100044c4 <__wrap_memset> -10005784: e014 b.n 100057b0 -10005786: b011 add sp, #68 @ 0x44 -10005788: bcf0 pop {r4, r5, r6, r7} -1000578a: 46bb mov fp, r7 -1000578c: 46b2 mov sl, r6 -1000578e: 46a9 mov r9, r5 -10005790: 46a0 mov r8, r4 -10005792: bdf0 pop {r4, r5, r6, r7, pc} -10005794: 2d00 cmp r5, #0 -10005796: d038 beq.n 1000580a -10005798: f000 fc5a bl 10006050 -1000579c: 4b49 ldr r3, [pc, #292] @ (100058c4 ) -1000579e: 2b00 cmp r3, #0 -100057a0: d100 bne.n 100057a4 -100057a2: e6fd b.n 100055a0 -100057a4: e000 b.n 100057a8 -100057a6: bf00 nop -100057a8: e6fa b.n 100055a0 -100057aa: 2d00 cmp r5, #0 -100057ac: d019 beq.n 100057e2 -100057ae: 4d3d ldr r5, [pc, #244] @ (100058a4 ) -100057b0: f000 fc4e bl 10006050 -100057b4: 7923 ldrb r3, [r4, #4] -100057b6: 70ab strb r3, [r5, #2] -100057b8: e6f2 b.n 100055a0 -100057ba: 4a43 ldr r2, [pc, #268] @ (100058c8 ) -100057bc: 006b lsls r3, r5, #1 -100057be: 6812 ldr r2, [r2, #0] -100057c0: 195b adds r3, r3, r5 -100057c2: 00db lsls r3, r3, #3 -100057c4: 18d3 adds r3, r2, r3 -100057c6: 2b00 cmp r3, #0 -100057c8: d0f1 beq.n 100057ae -100057ca: 685a ldr r2, [r3, #4] -100057cc: e7c1 b.n 10005752 -100057ce: 4a3e ldr r2, [pc, #248] @ (100058c8 ) -100057d0: 006b lsls r3, r5, #1 -100057d2: 6812 ldr r2, [r2, #0] -100057d4: 195b adds r3, r3, r5 -100057d6: 00db lsls r3, r3, #3 -100057d8: 18d3 adds r3, r2, r3 -100057da: 2b00 cmp r3, #0 -100057dc: d0dc beq.n 10005798 -100057de: 685a ldr r2, [r3, #4] -100057e0: e791 b.n 10005706 -100057e2: 4a31 ldr r2, [pc, #196] @ (100058a8 ) -100057e4: e7b5 b.n 10005752 -100057e6: 4839 ldr r0, [pc, #228] @ (100058cc ) -100057e8: 2800 cmp r0, #0 -100057ea: d11a bne.n 10005822 -100057ec: 7820 ldrb r0, [r4, #0] -100057ee: 2100 movs r1, #0 -100057f0: f7ff fdc0 bl 10005374 -100057f4: 2180 movs r1, #128 @ 0x80 -100057f6: 7820 ldrb r0, [r4, #0] -100057f8: f7ff fdbc bl 10005374 -100057fc: e6d0 b.n 100055a0 -100057fe: 68a3 ldr r3, [r4, #8] -10005800: 7962 ldrb r2, [r4, #5] -10005802: 7820 ldrb r0, [r4, #0] -10005804: f000 fc42 bl 1000608c -10005808: e6ca b.n 100055a0 -1000580a: 4a27 ldr r2, [pc, #156] @ (100058a8 ) -1000580c: e77b b.n 10005706 -1000580e: 4a2e ldr r2, [pc, #184] @ (100058c8 ) -10005810: 0058 lsls r0, r3, #1 -10005812: 6812 ldr r2, [r2, #0] -10005814: 18c3 adds r3, r0, r3 -10005816: 00db lsls r3, r3, #3 -10005818: 18d3 adds r3, r2, r3 -1000581a: 2b00 cmp r3, #0 -1000581c: d0b3 beq.n 10005786 -1000581e: 691d ldr r5, [r3, #16] -10005820: e709 b.n 10005636 -10005822: f000 fc1f bl 10006064 -10005826: 2101 movs r1, #1 -10005828: 4650 mov r0, sl -1000582a: aa0e add r2, sp, #56 @ 0x38 -1000582c: e000 b.n 10005830 -1000582e: bf00 nop -10005830: 2800 cmp r0, #0 -10005832: d000 beq.n 10005836 -10005834: e6b4 b.n 100055a0 -10005836: e7d9 b.n 100057ec -10005838: 7a23 ldrb r3, [r4, #8] -1000583a: 2b0f cmp r3, #15 -1000583c: d8d6 bhi.n 100057ec -1000583e: 4f1b ldr r7, [pc, #108] @ (100058ac ) -10005840: 18eb adds r3, r5, r3 -10005842: 78db ldrb r3, [r3, #3] -10005844: 2f00 cmp r7, #0 -10005846: d006 beq.n 10005856 -10005848: 4a19 ldr r2, [pc, #100] @ (100058b0 ) -1000584a: 7812 ldrb r2, [r2, #0] -1000584c: 4293 cmp r3, r2 -1000584e: d200 bcs.n 10005852 -10005850: e09c b.n 1000598c -10005852: 1a9b subs r3, r3, r2 -10005854: b2db uxtb r3, r3 -10005856: 2b00 cmp r3, #0 -10005858: d1c8 bne.n 100057ec -1000585a: 481d ldr r0, [pc, #116] @ (100058d0 ) -1000585c: 4d1d ldr r5, [pc, #116] @ (100058d4 ) -1000585e: f000 fc01 bl 10006064 -10005862: 2101 movs r1, #1 -10005864: 4650 mov r0, sl -10005866: 68eb ldr r3, [r5, #12] -10005868: aa0e add r2, sp, #56 @ 0x38 -1000586a: 4798 blx r3 -1000586c: 2800 cmp r0, #0 -1000586e: d000 beq.n 10005872 -10005870: e696 b.n 100055a0 -10005872: 2260 movs r2, #96 @ 0x60 -10005874: 0015 movs r5, r2 -10005876: 7923 ldrb r3, [r4, #4] -10005878: 401d ands r5, r3 -1000587a: 421a tst r2, r3 -1000587c: d1b6 bne.n 100057ec -1000587e: 7963 ldrb r3, [r4, #5] -10005880: 3b0a subs r3, #10 -10005882: 2b01 cmp r3, #1 -10005884: d8b2 bhi.n 100057ec -10005886: f000 fbed bl 10006064 -1000588a: 7963 ldrb r3, [r4, #5] -1000588c: 2b0a cmp r3, #10 -1000588e: d100 bne.n 10005892 -10005890: e17d b.n 10005b8e -10005892: 4650 mov r0, sl -10005894: a90e add r1, sp, #56 @ 0x38 -10005896: f000 fb6f bl 10005f78 -1000589a: e681 b.n 100055a0 -1000589c: 100072b0 .word 0x100072b0 -100058a0: 200015a8 .word 0x200015a8 -100058a4: 20001550 .word 0x20001550 -100058a8: 10006379 .word 0x10006379 -100058ac: 10004aed .word 0x10004aed -100058b0: 20001c81 .word 0x20001c81 -100058b4: 1000656d .word 0x1000656d -100058b8: 100072d4 .word 0x100072d4 - ... -100058c8: 20001228 .word 0x20001228 -100058cc: 00000000 .word 0x00000000 -100058d0: 10006489 .word 0x10006489 -100058d4: 1000733c .word 0x1000733c -100058d8: 2370 movs r3, #112 @ 0x70 -100058da: 7a21 ldrb r1, [r4, #8] -100058dc: 420b tst r3, r1 -100058de: d185 bne.n 100057ec -100058e0: 09c8 lsrs r0, r1, #7 -100058e2: 4684 mov ip, r0 -100058e4: 330f adds r3, #15 -100058e6: 400b ands r3, r1 -100058e8: 005b lsls r3, r3, #1 -100058ea: 18e8 adds r0, r5, r3 -100058ec: 4460 add r0, ip -100058ee: 7cc0 ldrb r0, [r0, #19] -100058f0: 4fb1 ldr r7, [pc, #708] @ (10005bb8 ) -100058f2: 4680 mov r8, r0 -100058f4: 2f00 cmp r7, #0 -100058f6: d007 beq.n 10005908 -100058f8: 48b0 ldr r0, [pc, #704] @ (10005bbc ) -100058fa: 7800 ldrb r0, [r0, #0] -100058fc: 4580 cmp r8, r0 -100058fe: d350 bcc.n 100059a2 -10005900: 4647 mov r7, r8 -10005902: 1a38 subs r0, r7, r0 -10005904: b2c0 uxtb r0, r0 -10005906: 4680 mov r8, r0 -10005908: 4640 mov r0, r8 -1000590a: 2800 cmp r0, #0 -1000590c: d13a bne.n 10005984 -1000590e: 2a00 cmp r2, #0 -10005910: d000 beq.n 10005914 -10005912: e0f5 b.n 10005b00 -10005914: 4aaa ldr r2, [pc, #680] @ (10005bc0 ) -10005916: 4690 mov r8, r2 -10005918: 7967 ldrb r7, [r4, #5] -1000591a: 2002 movs r0, #2 -1000591c: 003a movs r2, r7 -1000591e: 4382 bics r2, r0 -10005920: 2a01 cmp r2, #1 -10005922: d100 bne.n 10005926 -10005924: e0f0 b.n 10005b08 -10005926: 2f00 cmp r7, #0 -10005928: d000 beq.n 1000592c -1000592a: e75f b.n 100057ec -1000592c: 18eb adds r3, r5, r3 -1000592e: 4463 add r3, ip -10005930: 3330 adds r3, #48 @ 0x30 -10005932: 78db ldrb r3, [r3, #3] -10005934: aa0c add r2, sp, #48 @ 0x30 -10005936: 079b lsls r3, r3, #30 -10005938: 0fdb lsrs r3, r3, #31 -1000593a: 3202 adds r2, #2 -1000593c: 8013 strh r3, [r2, #0] -1000593e: 4650 mov r0, sl -10005940: 2302 movs r3, #2 -10005942: a90e add r1, sp, #56 @ 0x38 -10005944: f000 fb2e bl 10005fa4 -10005948: e62a b.n 100055a0 -1000594a: 7a23 ldrb r3, [r4, #8] -1000594c: 2b0f cmp r3, #15 -1000594e: d900 bls.n 10005952 -10005950: e74c b.n 100057ec -10005952: 4f99 ldr r7, [pc, #612] @ (10005bb8 ) -10005954: 18eb adds r3, r5, r3 -10005956: 78db ldrb r3, [r3, #3] -10005958: 2f00 cmp r7, #0 -1000595a: d006 beq.n 1000596a -1000595c: 4a97 ldr r2, [pc, #604] @ (10005bbc ) -1000595e: 7812 ldrb r2, [r2, #0] -10005960: 4293 cmp r3, r2 -10005962: d200 bcs.n 10005966 -10005964: e0f3 b.n 10005b4e -10005966: 1a9b subs r3, r3, r2 -10005968: b2db uxtb r3, r3 -1000596a: 2b00 cmp r3, #0 -1000596c: d000 beq.n 10005970 -1000596e: e73d b.n 100057ec -10005970: 4894 ldr r0, [pc, #592] @ (10005bc4 ) -10005972: 4d93 ldr r5, [pc, #588] @ (10005bc0 ) -10005974: f000 fb76 bl 10006064 -10005978: 2101 movs r1, #1 -1000597a: 4650 mov r0, sl -1000597c: 68eb ldr r3, [r5, #12] -1000597e: aa0e add r2, sp, #56 @ 0x38 -10005980: 4798 blx r3 -10005982: e755 b.n 10005830 -10005984: 4690 mov r8, r2 -10005986: 2a00 cmp r2, #0 -10005988: d0c6 beq.n 10005918 -1000598a: e72f b.n 100057ec -1000598c: 4a8e ldr r2, [pc, #568] @ (10005bc8 ) -1000598e: 0059 lsls r1, r3, #1 -10005990: 6815 ldr r5, [r2, #0] -10005992: 18cb adds r3, r1, r3 -10005994: 00db lsls r3, r3, #3 -10005996: 18ed adds r5, r5, r3 -10005998: 2d00 cmp r5, #0 -1000599a: d100 bne.n 1000599e -1000599c: e726 b.n 100057ec -1000599e: 68e8 ldr r0, [r5, #12] -100059a0: e75d b.n 1000585e -100059a2: 4647 mov r7, r8 -100059a4: 4888 ldr r0, [pc, #544] @ (10005bc8 ) -100059a6: 007f lsls r7, r7, #1 -100059a8: 6800 ldr r0, [r0, #0] -100059aa: 4447 add r7, r8 -100059ac: 4680 mov r8, r0 -100059ae: 00ff lsls r7, r7, #3 -100059b0: 44b8 add r8, r7 -100059b2: 2a00 cmp r2, #0 -100059b4: d0b0 beq.n 10005918 -100059b6: 4643 mov r3, r8 -100059b8: 2b00 cmp r3, #0 -100059ba: d100 bne.n 100059be -100059bc: e716 b.n 100057ec -100059be: 68d8 ldr r0, [r3, #12] -100059c0: f000 fb50 bl 10006064 -100059c4: 4643 mov r3, r8 -100059c6: 2101 movs r1, #1 -100059c8: 4650 mov r0, sl -100059ca: 68db ldr r3, [r3, #12] -100059cc: aa0e add r2, sp, #56 @ 0x38 -100059ce: 4798 blx r3 -100059d0: e72e b.n 10005830 -100059d2: 79a3 ldrb r3, [r4, #6] -100059d4: 9303 str r3, [sp, #12] -100059d6: 001a movs r2, r3 -100059d8: 786b ldrb r3, [r5, #1] -100059da: 429a cmp r2, r3 -100059dc: d007 beq.n 100059ee -100059de: 786b ldrb r3, [r5, #1] -100059e0: 2b00 cmp r3, #0 -100059e2: d000 beq.n 100059e6 -100059e4: e158 b.n 10005c98 -100059e6: 9b03 ldr r3, [sp, #12] -100059e8: 2b00 cmp r3, #0 -100059ea: d000 beq.n 100059ee -100059ec: e0f8 b.n 10005be0 -100059ee: 9b03 ldr r3, [sp, #12] -100059f0: 4650 mov r0, sl -100059f2: a90e add r1, sp, #56 @ 0x38 -100059f4: 706b strb r3, [r5, #1] -100059f6: f000 fabf bl 10005f78 -100059fa: e5d1 b.n 100055a0 -100059fc: 786b ldrb r3, [r5, #1] -100059fe: aa0c add r2, sp, #48 @ 0x30 -10005a00: 3202 adds r2, #2 -10005a02: 7013 strb r3, [r2, #0] -10005a04: 4650 mov r0, sl -10005a06: 2301 movs r3, #1 -10005a08: a90e add r1, sp, #56 @ 0x38 -10005a0a: f000 facb bl 10005fa4 -10005a0e: e5c7 b.n 100055a0 -10005a10: 88e3 ldrh r3, [r4, #6] -10005a12: 0a1a lsrs r2, r3, #8 -10005a14: b2d8 uxtb r0, r3 -10005a16: 2a0f cmp r2, #15 -10005a18: d900 bls.n 10005a1c -10005a1a: e6e7 b.n 100057ec -10005a1c: 496b ldr r1, [pc, #428] @ (10005bcc ) -10005a1e: 0093 lsls r3, r2, #2 -10005a20: 58cb ldr r3, [r1, r3] -10005a22: 469f mov pc, r3 -10005a24: a80e add r0, sp, #56 @ 0x38 -10005a26: f000 fb23 bl 10006070 -10005a2a: 4650 mov r0, sl -10005a2c: 79a1 ldrb r1, [r4, #6] -10005a2e: f7ff fb9b bl 10005168 -10005a32: 2202 movs r2, #2 -10005a34: 782b ldrb r3, [r5, #0] -10005a36: 4313 orrs r3, r2 -10005a38: 702b strb r3, [r5, #0] -10005a3a: e5b1 b.n 100055a0 -10005a3c: 88e3 ldrh r3, [r4, #6] -10005a3e: 2b01 cmp r3, #1 -10005a40: d000 beq.n 10005a44 -10005a42: e6d3 b.n 100057ec -10005a44: 2208 movs r2, #8 -10005a46: 782b ldrb r3, [r5, #0] -10005a48: 4650 mov r0, sl -10005a4a: 4393 bics r3, r2 -10005a4c: a90e add r1, sp, #56 @ 0x38 -10005a4e: 702b strb r3, [r5, #0] -10005a50: f000 fa92 bl 10005f78 -10005a54: e5a4 b.n 100055a0 -10005a56: 2002 movs r0, #2 -10005a58: 7829 ldrb r1, [r5, #0] -10005a5a: ab0c add r3, sp, #48 @ 0x30 -10005a5c: 1c9a adds r2, r3, #2 -10005a5e: 068b lsls r3, r1, #26 -10005a60: 0889 lsrs r1, r1, #2 -10005a62: 0fdb lsrs r3, r3, #31 -10005a64: 4001 ands r1, r0 -10005a66: 430b orrs r3, r1 -10005a68: e768 b.n 1000593c -10005a6a: 88e3 ldrh r3, [r4, #6] -10005a6c: 2b01 cmp r3, #1 -10005a6e: d000 beq.n 10005a72 -10005a70: e6bc b.n 100057ec -10005a72: 2208 movs r2, #8 -10005a74: 782b ldrb r3, [r5, #0] -10005a76: 4650 mov r0, sl -10005a78: 4313 orrs r3, r2 -10005a7a: a90e add r1, sp, #56 @ 0x38 -10005a7c: 702b strb r3, [r5, #0] -10005a7e: f000 fa7b bl 10005f78 -10005a82: e58d b.n 100055a0 -10005a84: 4b52 ldr r3, [pc, #328] @ (10005bd0 ) -10005a86: 2b00 cmp r3, #0 -10005a88: d100 bne.n 10005a8c -10005a8a: e6af b.n 100057ec -10005a8c: e000 b.n 10005a90 -10005a8e: bf00 nop -10005a90: 1e02 subs r2, r0, #0 -10005a92: d100 bne.n 10005a96 -10005a94: e6aa b.n 100057ec -10005a96: 78d3 ldrb r3, [r2, #3] -10005a98: 7891 ldrb r1, [r2, #2] -10005a9a: 021b lsls r3, r3, #8 -10005a9c: 430b orrs r3, r1 -10005a9e: 4650 mov r0, sl -10005aa0: a90e add r1, sp, #56 @ 0x38 -10005aa2: f000 fa7f bl 10005fa4 -10005aa6: e6c3 b.n 10005830 -10005aa8: 4b4a ldr r3, [pc, #296] @ (10005bd4 ) -10005aaa: 2b00 cmp r3, #0 -10005aac: d100 bne.n 10005ab0 -10005aae: e69d b.n 100057ec -10005ab0: e000 b.n 10005ab4 -10005ab2: bf00 nop -10005ab4: 1e02 subs r2, r0, #0 -10005ab6: d100 bne.n 10005aba -10005ab8: e698 b.n 100057ec -10005aba: 4650 mov r0, sl -10005abc: 7813 ldrb r3, [r2, #0] -10005abe: a90e add r1, sp, #56 @ 0x38 -10005ac0: f000 fa70 bl 10005fa4 -10005ac4: e6b4 b.n 10005830 -10005ac6: 8921 ldrh r1, [r4, #8] -10005ac8: f7ff fa12 bl 10004ef0 -10005acc: 1e02 subs r2, r0, #0 -10005ace: d1f4 bne.n 10005aba -10005ad0: e68c b.n 100057ec -10005ad2: 2a02 cmp r2, #2 -10005ad4: d100 bne.n 10005ad8 -10005ad6: e12d b.n 10005d34 -10005ad8: 4b3f ldr r3, [pc, #252] @ (10005bd8 ) -10005ada: 2b00 cmp r3, #0 -10005adc: d100 bne.n 10005ae0 -10005ade: e685 b.n 100057ec -10005ae0: e000 b.n 10005ae4 -10005ae2: bf00 nop -10005ae4: 0002 movs r2, r0 -10005ae6: 2a00 cmp r2, #0 -10005ae8: d100 bne.n 10005aec -10005aea: e67f b.n 100057ec -10005aec: e7d3 b.n 10005a96 -10005aee: f7ff f9f7 bl 10004ee0 -10005af2: 2312 movs r3, #18 -10005af4: 0002 movs r2, r0 -10005af6: a90e add r1, sp, #56 @ 0x38 -10005af8: 4650 mov r0, sl -10005afa: f000 fa53 bl 10005fa4 -10005afe: e697 b.n 10005830 -10005b00: 4b2f ldr r3, [pc, #188] @ (10005bc0 ) -10005b02: 4830 ldr r0, [pc, #192] @ (10005bc4 ) -10005b04: 4698 mov r8, r3 -10005b06: e75b b.n 100059c0 -10005b08: 88e2 ldrh r2, [r4, #6] -10005b0a: 2a00 cmp r2, #0 -10005b0c: d109 bne.n 10005b22 -10005b0e: 4a33 ldr r2, [pc, #204] @ (10005bdc ) -10005b10: 7810 ldrb r0, [r2, #0] -10005b12: 2f01 cmp r7, #1 -10005b14: d026 beq.n 10005b64 -10005b16: 18ef adds r7, r5, r3 -10005b18: 4467 add r7, ip -10005b1a: 3730 adds r7, #48 @ 0x30 -10005b1c: 78fb ldrb r3, [r7, #3] -10005b1e: 079b lsls r3, r3, #30 -10005b20: d53e bpl.n 10005ba0 -10005b22: 4643 mov r3, r8 -10005b24: 2b00 cmp r3, #0 -10005b26: d100 bne.n 10005b2a -10005b28: e53a b.n 100055a0 -10005b2a: 68d8 ldr r0, [r3, #12] -10005b2c: f000 fa9a bl 10006064 -10005b30: 4643 mov r3, r8 -10005b32: 2101 movs r1, #1 -10005b34: 68db ldr r3, [r3, #12] -10005b36: aa0e add r2, sp, #56 @ 0x38 -10005b38: 4650 mov r0, sl -10005b3a: 4798 blx r3 -10005b3c: 2000 movs r0, #0 -10005b3e: f000 fa91 bl 10006064 -10005b42: 2334 movs r3, #52 @ 0x34 -10005b44: 5ceb ldrb r3, [r5, r3] -10005b46: 07db lsls r3, r3, #31 -10005b48: d500 bpl.n 10005b4c -10005b4a: e529 b.n 100055a0 -10005b4c: e6a1 b.n 10005892 -10005b4e: 4a1e ldr r2, [pc, #120] @ (10005bc8 ) -10005b50: 0059 lsls r1, r3, #1 -10005b52: 6815 ldr r5, [r2, #0] -10005b54: 18cb adds r3, r1, r3 -10005b56: 00db lsls r3, r3, #3 -10005b58: 18ed adds r5, r5, r3 -10005b5a: 2d00 cmp r5, #0 -10005b5c: d100 bne.n 10005b60 -10005b5e: e645 b.n 100057ec -10005b60: 68e8 ldr r0, [r5, #12] -10005b62: e707 b.n 10005974 -10005b64: 2230 movs r2, #48 @ 0x30 -10005b66: 4691 mov r9, r2 -10005b68: 18eb adds r3, r5, r3 -10005b6a: 4463 add r3, ip -10005b6c: 4499 add r9, r3 -10005b6e: 464b mov r3, r9 -10005b70: 78db ldrb r3, [r3, #3] -10005b72: 079b lsls r3, r3, #30 -10005b74: d5d5 bpl.n 10005b22 -10005b76: f7ff fc17 bl 100053a8 -10005b7a: 464b mov r3, r9 -10005b7c: 2202 movs r2, #2 -10005b7e: 78db ldrb r3, [r3, #3] -10005b80: 4393 bics r3, r2 -10005b82: 464a mov r2, r9 -10005b84: 70d3 strb r3, [r2, #3] -10005b86: 78d3 ldrb r3, [r2, #3] -10005b88: 43bb bics r3, r7 -10005b8a: 70d3 strb r3, [r2, #3] -10005b8c: e7c9 b.n 10005b22 -10005b8e: ab0c add r3, sp, #48 @ 0x30 -10005b90: 1c9a adds r2, r3, #2 -10005b92: 4650 mov r0, sl -10005b94: 2301 movs r3, #1 -10005b96: a90e add r1, sp, #56 @ 0x38 -10005b98: 7015 strb r5, [r2, #0] -10005b9a: f000 fa03 bl 10005fa4 -10005b9e: e4ff b.n 100055a0 -10005ba0: f7ff fbe8 bl 10005374 -10005ba4: 2202 movs r2, #2 -10005ba6: 78fb ldrb r3, [r7, #3] -10005ba8: 4313 orrs r3, r2 -10005baa: 2201 movs r2, #1 -10005bac: 70fb strb r3, [r7, #3] -10005bae: 78fb ldrb r3, [r7, #3] -10005bb0: 4313 orrs r3, r2 -10005bb2: 70fb strb r3, [r7, #3] -10005bb4: e7b5 b.n 10005b22 -10005bb6: 46c0 nop @ (mov r8, r8) -10005bb8: 10004aed .word 0x10004aed -10005bbc: 20001c81 .word 0x20001c81 -10005bc0: 1000733c .word 0x1000733c -10005bc4: 10006489 .word 0x10006489 -10005bc8: 20001228 .word 0x20001228 -10005bcc: 100072fc .word 0x100072fc - ... -10005bdc: 20000ed4 .word 0x20000ed4 -10005be0: 1e58 subs r0, r3, #1 -10005be2: b2c0 uxtb r0, r0 -10005be4: f7ff f980 bl 10004ee8 -10005be8: 2800 cmp r0, #0 -10005bea: d100 bne.n 10005bee -10005bec: e5fe b.n 100057ec -10005bee: 7843 ldrb r3, [r0, #1] -10005bf0: 9307 str r3, [sp, #28] -10005bf2: 2b02 cmp r3, #2 -10005bf4: d000 beq.n 10005bf8 -10005bf6: e5f9 b.n 100057ec -10005bf8: 2101 movs r1, #1 -10005bfa: 79c2 ldrb r2, [r0, #7] -10005bfc: 46b1 mov r9, r6 -10005bfe: 1193 asrs r3, r2, #6 -10005c00: 1152 asrs r2, r2, #5 -10005c02: 400b ands r3, r1 -10005c04: 400a ands r2, r1 -10005c06: 0112 lsls r2, r2, #4 -10005c08: 015b lsls r3, r3, #5 -10005c0a: 4313 orrs r3, r2 -10005c0c: 782a ldrb r2, [r5, #0] -10005c0e: 312f adds r1, #47 @ 0x2f -10005c10: 438a bics r2, r1 -10005c12: 4313 orrs r3, r2 -10005c14: 702b strb r3, [r5, #0] -10005c16: 2309 movs r3, #9 -10005c18: 4698 mov r8, r3 -10005c1a: 4480 add r8, r0 -10005c1c: 4647 mov r7, r8 -10005c1e: 46a8 mov r8, r5 -10005c20: 78c3 ldrb r3, [r0, #3] -10005c22: 7882 ldrb r2, [r0, #2] -10005c24: 021b lsls r3, r3, #8 -10005c26: 4313 orrs r3, r2 -10005c28: 18c3 adds r3, r0, r3 -10005c2a: 9304 str r3, [sp, #16] -10005c2c: 4b5c ldr r3, [pc, #368] @ (10005da0 ) -10005c2e: 9309 str r3, [sp, #36] @ 0x24 -10005c30: 9b04 ldr r3, [sp, #16] -10005c32: 42bb cmp r3, r7 -10005c34: d800 bhi.n 10005c38 -10005c36: e081 b.n 10005d3c -10005c38: 787b ldrb r3, [r7, #1] -10005c3a: 2201 movs r2, #1 -10005c3c: 2b0b cmp r3, #11 -10005c3e: d102 bne.n 10005c46 -10005c40: 783b ldrb r3, [r7, #0] -10005c42: 78fa ldrb r2, [r7, #3] -10005c44: 18ff adds r7, r7, r3 -10005c46: 787b ldrb r3, [r7, #1] -10005c48: 2b04 cmp r3, #4 -10005c4a: d123 bne.n 10005c94 -10005c4c: 2500 movs r5, #0 -10005c4e: 9b04 ldr r3, [sp, #16] -10005c50: 920b str r2, [sp, #44] @ 0x2c -10005c52: 1bdb subs r3, r3, r7 -10005c54: b29b uxth r3, r3 -10005c56: 9305 str r3, [sp, #20] -10005c58: 4b52 ldr r3, [pc, #328] @ (10005da4 ) -10005c5a: 7819 ldrb r1, [r3, #0] -10005c5c: 9306 str r3, [sp, #24] -10005c5e: 4b52 ldr r3, [pc, #328] @ (10005da8 ) -10005c60: 930a str r3, [sp, #40] @ 0x28 -10005c62: 4b52 ldr r3, [pc, #328] @ (10005dac ) -10005c64: 9308 str r3, [sp, #32] -10005c66: 9b0a ldr r3, [sp, #40] @ 0x28 -10005c68: 2b00 cmp r3, #0 -10005c6a: d052 beq.n 10005d12 -10005c6c: 9b09 ldr r3, [sp, #36] @ 0x24 -10005c6e: 9e08 ldr r6, [sp, #32] -10005c70: 428d cmp r5, r1 -10005c72: d345 bcc.n 10005d00 -10005c74: 0039 movs r1, r7 -10005c76: 4650 mov r0, sl -10005c78: 9a05 ldr r2, [sp, #20] -10005c7a: 4798 blx r3 -10005c7c: 4684 mov ip, r0 -10005c7e: 2808 cmp r0, #8 -10005c80: d902 bls.n 10005c88 -10005c82: 9a05 ldr r2, [sp, #20] -10005c84: 4282 cmp r2, r0 -10005c86: d262 bcs.n 10005d4e -10005c88: 9b06 ldr r3, [sp, #24] -10005c8a: 3501 adds r5, #1 -10005c8c: 7819 ldrb r1, [r3, #0] -10005c8e: b2ed uxtb r5, r5 -10005c90: 42a9 cmp r1, r5 -10005c92: d2e8 bcs.n 10005c66 -10005c94: 464e mov r6, r9 -10005c96: e5a9 b.n 100057ec -10005c98: 4650 mov r0, sl -10005c9a: f7ff fb55 bl 10005348 -10005c9e: 2200 movs r2, #0 -10005ca0: 4691 mov r9, r2 -10005ca2: 4a43 ldr r2, [pc, #268] @ (10005db0 ) -10005ca4: 78ab ldrb r3, [r5, #2] -10005ca6: 9205 str r2, [sp, #20] -10005ca8: 002a movs r2, r5 -10005caa: 464d mov r5, r9 -10005cac: 4691 mov r9, r2 -10005cae: 9304 str r3, [sp, #16] -10005cb0: 4b3c ldr r3, [pc, #240] @ (10005da4 ) -10005cb2: 4f3d ldr r7, [pc, #244] @ (10005da8 ) -10005cb4: 4698 mov r8, r3 -10005cb6: 781b ldrb r3, [r3, #0] -10005cb8: 2f00 cmp r7, #0 -10005cba: d01b beq.n 10005cf4 -10005cbc: 9a05 ldr r2, [sp, #20] -10005cbe: 429d cmp r5, r3 -10005cc0: d32c bcc.n 10005d1c -10005cc2: 4650 mov r0, sl -10005cc4: 4790 blx r2 -10005cc6: 4643 mov r3, r8 -10005cc8: 3501 adds r5, #1 -10005cca: 781b ldrb r3, [r3, #0] -10005ccc: b2ed uxtb r5, r5 -10005cce: 42ab cmp r3, r5 -10005cd0: d2f2 bcs.n 10005cb8 -10005cd2: 464d mov r5, r9 -10005cd4: 2253 movs r2, #83 @ 0x53 -10005cd6: 2100 movs r1, #0 -10005cd8: 0028 movs r0, r5 -10005cda: f7fe fbf3 bl 100044c4 <__wrap_memset> -10005cde: 2210 movs r2, #16 -10005ce0: 21ff movs r1, #255 @ 0xff -10005ce2: 4834 ldr r0, [pc, #208] @ (10005db4 ) -10005ce4: f7fe fbee bl 100044c4 <__wrap_memset> -10005ce8: 2220 movs r2, #32 -10005cea: 21ff movs r1, #255 @ 0xff -10005cec: 4832 ldr r0, [pc, #200] @ (10005db8 ) -10005cee: f7fe fbe9 bl 100044c4 <__wrap_memset> -10005cf2: e002 b.n 10005cfa -10005cf4: 2d00 cmp r5, #0 -10005cf6: d01b beq.n 10005d30 -10005cf8: 464d mov r5, r9 -10005cfa: 9b04 ldr r3, [sp, #16] -10005cfc: 70ab strb r3, [r5, #2] -10005cfe: e672 b.n 100059e6 -10005d00: 2318 movs r3, #24 -10005d02: 4a2e ldr r2, [pc, #184] @ (10005dbc ) -10005d04: 436b muls r3, r5 -10005d06: 6816 ldr r6, [r2, #0] -10005d08: 18f6 adds r6, r6, r3 -10005d0a: 2e00 cmp r6, #0 -10005d0c: d0c2 beq.n 10005c94 -10005d0e: 68b3 ldr r3, [r6, #8] -10005d10: e7b0 b.n 10005c74 -10005d12: 2d00 cmp r5, #0 -10005d14: d1be bne.n 10005c94 -10005d16: 4b22 ldr r3, [pc, #136] @ (10005da0 ) -10005d18: 4e24 ldr r6, [pc, #144] @ (10005dac ) -10005d1a: e7ab b.n 10005c74 -10005d1c: 4a27 ldr r2, [pc, #156] @ (10005dbc ) -10005d1e: 006b lsls r3, r5, #1 -10005d20: 6812 ldr r2, [r2, #0] -10005d22: 195b adds r3, r3, r5 -10005d24: 00db lsls r3, r3, #3 -10005d26: 18d3 adds r3, r2, r3 -10005d28: 2b00 cmp r3, #0 -10005d2a: d0e5 beq.n 10005cf8 -10005d2c: 685a ldr r2, [r3, #4] -10005d2e: e7c8 b.n 10005cc2 -10005d30: 4a1f ldr r2, [pc, #124] @ (10005db0 ) -10005d32: e7c6 b.n 10005cc2 -10005d34: f7ff f8d8 bl 10004ee8 -10005d38: 0002 movs r2, r0 -10005d3a: e6d4 b.n 10005ae6 -10005d3c: 4b20 ldr r3, [pc, #128] @ (10005dc0 ) -10005d3e: 4645 mov r5, r8 -10005d40: 464e mov r6, r9 -10005d42: 2b00 cmp r3, #0 -10005d44: d100 bne.n 10005d48 -10005d46: e652 b.n 100059ee -10005d48: e000 b.n 10005d4c -10005d4a: bf00 nop -10005d4c: e64f b.n 100059ee -10005d4e: 9a0b ldr r2, [sp, #44] @ 0x2c -10005d50: 2a01 cmp r2, #1 -10005d52: d01f beq.n 10005d94 -10005d54: 2100 movs r1, #0 -10005d56: 4646 mov r6, r8 -10005d58: e009 b.n 10005d6e -10005d5a: 78bb ldrb r3, [r7, #2] -10005d5c: 18cb adds r3, r1, r3 -10005d5e: b2db uxtb r3, r3 -10005d60: 18f3 adds r3, r6, r3 -10005d62: 78d8 ldrb r0, [r3, #3] -10005d64: 28ff cmp r0, #255 @ 0xff -10005d66: d195 bne.n 10005c94 -10005d68: 3101 adds r1, #1 -10005d6a: 70dd strb r5, [r3, #3] -10005d6c: b2c9 uxtb r1, r1 -10005d6e: 4291 cmp r1, r2 -10005d70: d1f3 bne.n 10005d5a -10005d72: 46b0 mov r8, r6 -10005d74: 4666 mov r6, ip -10005d76: 002b movs r3, r5 -10005d78: 0039 movs r1, r7 -10005d7a: 0032 movs r2, r6 -10005d7c: 480e ldr r0, [pc, #56] @ (10005db8 ) -10005d7e: f000 fd1f bl 100067c0 -10005d82: 46b4 mov ip, r6 -10005d84: 9b06 ldr r3, [sp, #24] -10005d86: 4467 add r7, ip -10005d88: 781b ldrb r3, [r3, #0] -10005d8a: 42ab cmp r3, r5 -10005d8c: d300 bcc.n 10005d90 -10005d8e: e74f b.n 10005c30 -10005d90: 464e mov r6, r9 -10005d92: e52b b.n 100057ec -10005d94: 4b02 ldr r3, [pc, #8] @ (10005da0 ) -10005d96: 68b1 ldr r1, [r6, #8] -10005d98: 4299 cmp r1, r3 -10005d9a: d1db bne.n 10005d54 -10005d9c: 9a07 ldr r2, [sp, #28] -10005d9e: e7d9 b.n 10005d54 -10005da0: 100063a5 .word 0x100063a5 -10005da4: 20001c81 .word 0x20001c81 -10005da8: 10004aed .word 0x10004aed -10005dac: 1000733c .word 0x1000733c -10005db0: 10006379 .word 0x10006379 -10005db4: 20001553 .word 0x20001553 -10005db8: 20001563 .word 0x20001563 -10005dbc: 20001228 .word 0x20001228 -10005dc0: 00000000 .word 0x00000000 - -10005dc4 : -10005dc4: b5f8 push {r3, r4, r5, r6, r7, lr} -10005dc6: 4657 mov r7, sl -10005dc8: 464e mov r6, r9 -10005dca: 46de mov lr, fp -10005dcc: 4645 mov r5, r8 -10005dce: 000c movs r4, r1 -10005dd0: b5e0 push {r5, r6, r7, lr} -10005dd2: 0016 movs r6, r2 -10005dd4: 001f movs r7, r3 -10005dd6: 2a00 cmp r2, #0 -10005dd8: d03c beq.n 10005e54 -10005dda: 4b1f ldr r3, [pc, #124] @ (10005e58 ) -10005ddc: 2500 movs r5, #0 -10005dde: 469a mov sl, r3 -10005de0: 2370 movs r3, #112 @ 0x70 -10005de2: 4699 mov r9, r3 -10005de4: 4b1d ldr r3, [pc, #116] @ (10005e5c ) -10005de6: 469b mov fp, r3 -10005de8: e017 b.n 10005e1a -10005dea: 465b mov r3, fp -10005dec: 0020 movs r0, r4 -10005dee: 7899 ldrb r1, [r3, #2] -10005df0: f000 fca8 bl 10006744 -10005df4: 2800 cmp r0, #0 -10005df6: d01f beq.n 10005e38 -10005df8: 0021 movs r1, r4 -10005dfa: 4640 mov r0, r8 -10005dfc: f7ff fa20 bl 10005240 -10005e00: 2800 cmp r0, #0 -10005e02: d019 beq.n 10005e38 -10005e04: 78a3 ldrb r3, [r4, #2] -10005e06: 09da lsrs r2, r3, #7 -10005e08: 2a01 cmp r2, #1 -10005e0a: d01c beq.n 10005e46 -10005e0c: 9a0a ldr r2, [sp, #40] @ 0x28 -10005e0e: 3501 adds r5, #1 -10005e10: 7013 strb r3, [r2, #0] -10005e12: 7823 ldrb r3, [r4, #0] -10005e14: 18e4 adds r4, r4, r3 -10005e16: 42b5 cmp r5, r6 -10005e18: da1c bge.n 10005e54 -10005e1a: 7863 ldrb r3, [r4, #1] -10005e1c: 2b05 cmp r3, #5 -10005e1e: d10b bne.n 10005e38 -10005e20: 78e3 ldrb r3, [r4, #3] -10005e22: 079b lsls r3, r3, #30 -10005e24: 0f9b lsrs r3, r3, #30 -10005e26: 42bb cmp r3, r7 -10005e28: d106 bne.n 10005e38 -10005e2a: 4653 mov r3, sl -10005e2c: 464a mov r2, r9 -10005e2e: 781b ldrb r3, [r3, #0] -10005e30: 4698 mov r8, r3 -10005e32: 78a3 ldrb r3, [r4, #2] -10005e34: 421a tst r2, r3 -10005e36: d0d8 beq.n 10005dea -10005e38: 2000 movs r0, #0 -10005e3a: bcf0 pop {r4, r5, r6, r7} -10005e3c: 46bb mov fp, r7 -10005e3e: 46b2 mov sl, r6 -10005e40: 46a9 mov r9, r5 -10005e42: 46a0 mov r8, r4 -10005e44: bdf8 pop {r3, r4, r5, r6, r7, pc} -10005e46: 9a0b ldr r2, [sp, #44] @ 0x2c -10005e48: 3501 adds r5, #1 -10005e4a: 7013 strb r3, [r2, #0] -10005e4c: 7823 ldrb r3, [r4, #0] -10005e4e: 18e4 adds r4, r4, r3 -10005e50: 42b5 cmp r5, r6 -10005e52: dbe2 blt.n 10005e1a -10005e54: 2001 movs r0, #1 -10005e56: e7f0 b.n 10005e3a -10005e58: 20000ed4 .word 0x20000ed4 -10005e5c: 20001550 .word 0x20001550 - -10005e60 : -10005e60: 2380 movs r3, #128 @ 0x80 -10005e62: b510 push {r4, lr} -10005e64: 011b lsls r3, r3, #4 -10005e66: b084 sub sp, #16 -10005e68: 9301 str r3, [sp, #4] -10005e6a: 4b0e ldr r3, [pc, #56] @ (10005ea4 ) -10005e6c: 9002 str r0, [sp, #8] -10005e6e: 681c ldr r4, [r3, #0] -10005e70: 9103 str r1, [sp, #12] -10005e72: 6962 ldr r2, [r4, #20] -10005e74: f3ef 8310 mrs r3, PRIMASK -10005e78: b672 cpsid i -10005e7a: 6811 ldr r1, [r2, #0] -10005e7c: 2900 cmp r1, #0 -10005e7e: d0fc beq.n 10005e7a -10005e80: f3bf 8f5f dmb sy -10005e84: 61a3 str r3, [r4, #24] -10005e86: 0020 movs r0, r4 -10005e88: a901 add r1, sp, #4 -10005e8a: f000 fddf bl 10006a4c -10005e8e: 6962 ldr r2, [r4, #20] -10005e90: 69a3 ldr r3, [r4, #24] -10005e92: f3bf 8f5f dmb sy -10005e96: 2100 movs r1, #0 -10005e98: 6011 str r1, [r2, #0] -10005e9a: f383 8810 msr PRIMASK, r3 -10005e9e: b004 add sp, #16 -10005ea0: bd10 pop {r4, pc} -10005ea2: 46c0 nop @ (mov r8, r8) -10005ea4: 200015a8 .word 0x200015a8 - -10005ea8 : -10005ea8: 2270 movs r2, #112 @ 0x70 -10005eaa: b570 push {r4, r5, r6, lr} -10005eac: 4b09 ldr r3, [pc, #36] @ (10005ed4 ) -10005eae: 000c movs r4, r1 -10005eb0: 781d ldrb r5, [r3, #0] -10005eb2: 788b ldrb r3, [r1, #2] -10005eb4: 421a tst r2, r3 -10005eb6: d001 beq.n 10005ebc -10005eb8: 2000 movs r0, #0 -10005eba: bd70 pop {r4, r5, r6, pc} -10005ebc: 4b06 ldr r3, [pc, #24] @ (10005ed8 ) -10005ebe: 0020 movs r0, r4 -10005ec0: 7899 ldrb r1, [r3, #2] -10005ec2: f000 fc3f bl 10006744 -10005ec6: 2800 cmp r0, #0 -10005ec8: d0f6 beq.n 10005eb8 -10005eca: 0021 movs r1, r4 -10005ecc: 0028 movs r0, r5 -10005ece: f7ff f9b7 bl 10005240 -10005ed2: e7f2 b.n 10005eba -10005ed4: 20000ed4 .word 0x20000ed4 -10005ed8: 20001550 .word 0x20001550 - -10005edc : -10005edc: 000b movs r3, r1 -10005ede: 207f movs r0, #127 @ 0x7f -10005ee0: b510 push {r4, lr} -10005ee2: 4018 ands r0, r3 -10005ee4: 09db lsrs r3, r3, #7 -10005ee6: 3333 adds r3, #51 @ 0x33 -10005ee8: 0040 lsls r0, r0, #1 -10005eea: 4a04 ldr r2, [pc, #16] @ (10005efc ) -10005eec: 18c0 adds r0, r0, r3 -10005eee: 4b04 ldr r3, [pc, #16] @ (10005f00 ) -10005ef0: 6811 ldr r1, [r2, #0] -10005ef2: 18c0 adds r0, r0, r3 -10005ef4: f000 fbe2 bl 100066bc -10005ef8: bd10 pop {r4, pc} -10005efa: 46c0 nop @ (mov r8, r8) -10005efc: 200015a4 .word 0x200015a4 -10005f00: 20001550 .word 0x20001550 - -10005f04 : -10005f04: 000b movs r3, r1 -10005f06: 207f movs r0, #127 @ 0x7f -10005f08: b510 push {r4, lr} -10005f0a: 4018 ands r0, r3 -10005f0c: 09db lsrs r3, r3, #7 -10005f0e: 3333 adds r3, #51 @ 0x33 -10005f10: 0040 lsls r0, r0, #1 -10005f12: 4a04 ldr r2, [pc, #16] @ (10005f24 ) -10005f14: 18c0 adds r0, r0, r3 -10005f16: 4b04 ldr r3, [pc, #16] @ (10005f28 ) -10005f18: 6811 ldr r1, [r2, #0] -10005f1a: 18c0 adds r0, r0, r3 -10005f1c: f000 fbf6 bl 1000670c -10005f20: bd10 pop {r4, pc} -10005f22: 46c0 nop @ (mov r8, r8) -10005f24: 200015a4 .word 0x200015a4 -10005f28: 20001550 .word 0x20001550 - -10005f2c : -10005f2c: b570 push {r4, r5, r6, lr} -10005f2e: 247f movs r4, #127 @ 0x7f -10005f30: 480f ldr r0, [pc, #60] @ (10005f70 ) -10005f32: 400c ands r4, r1 -10005f34: 0064 lsls r4, r4, #1 -10005f36: 1904 adds r4, r0, r4 -10005f38: 09cd lsrs r5, r1, #7 -10005f3a: 1964 adds r4, r4, r5 -10005f3c: 3430 adds r4, #48 @ 0x30 -10005f3e: 78e0 ldrb r0, [r4, #3] -10005f40: 07c0 lsls r0, r0, #31 -10005f42: d501 bpl.n 10005f48 -10005f44: 2000 movs r0, #0 -10005f46: bd70 pop {r4, r5, r6, pc} -10005f48: 2601 movs r6, #1 -10005f4a: 78e5 ldrb r5, [r4, #3] -10005f4c: 4809 ldr r0, [pc, #36] @ (10005f74 ) -10005f4e: 4335 orrs r5, r6 -10005f50: 7800 ldrb r0, [r0, #0] -10005f52: 70e5 strb r5, [r4, #3] -10005f54: f7ff f9fc bl 10005350 -10005f58: 2800 cmp r0, #0 -10005f5a: d1f4 bne.n 10005f46 -10005f5c: 2201 movs r2, #1 -10005f5e: 78e3 ldrb r3, [r4, #3] -10005f60: 4393 bics r3, r2 -10005f62: 70e3 strb r3, [r4, #3] -10005f64: 78e3 ldrb r3, [r4, #3] -10005f66: 3203 adds r2, #3 -10005f68: 4393 bics r3, r2 -10005f6a: 70e3 strb r3, [r4, #3] -10005f6c: e7ea b.n 10005f44 -10005f6e: 46c0 nop @ (mov r8, r8) -10005f70: 20001550 .word 0x20001550 -10005f74: 20000ed4 .word 0x20000ed4 - -10005f78 : -10005f78: b570 push {r4, r5, r6, lr} -10005f7a: 4c09 ldr r4, [pc, #36] @ (10005fa0 ) -10005f7c: 0006 movs r6, r0 -10005f7e: 2208 movs r2, #8 -10005f80: 0020 movs r0, r4 -10005f82: 000d movs r5, r1 -10005f84: f7fe faa4 bl 100044d0 <__wrap___aeabi_memcpy> -10005f88: 2300 movs r3, #0 -10005f8a: 2180 movs r1, #128 @ 0x80 -10005f8c: 60e3 str r3, [r4, #12] -10005f8e: 60a3 str r3, [r4, #8] -10005f90: 782b ldrb r3, [r5, #0] -10005f92: 0030 movs r0, r6 -10005f94: 4399 bics r1, r3 -10005f96: 2200 movs r2, #0 -10005f98: 2300 movs r3, #0 -10005f9a: f7ff ffc7 bl 10005f2c -10005f9e: bd70 pop {r4, r5, r6, pc} -10005fa0: 200014f4 .word 0x200014f4 - -10005fa4 : -10005fa4: b5f8 push {r3, r4, r5, r6, r7, lr} -10005fa6: 46ce mov lr, r9 -10005fa8: 4647 mov r7, r8 -10005faa: 4690 mov r8, r2 -10005fac: 4e26 ldr r6, [pc, #152] @ (10006048 ) -10005fae: b580 push {r7, lr} -10005fb0: 4681 mov r9, r0 -10005fb2: 2208 movs r2, #8 -10005fb4: 0030 movs r0, r6 -10005fb6: 000d movs r5, r1 -10005fb8: 001f movs r7, r3 -10005fba: f7fe fa89 bl 100044d0 <__wrap___aeabi_memcpy> -10005fbe: 4643 mov r3, r8 -10005fc0: 60b3 str r3, [r6, #8] -10005fc2: 2300 movs r3, #0 -10005fc4: 81f3 strh r3, [r6, #14] -10005fc6: 79ec ldrb r4, [r5, #7] -10005fc8: 79ab ldrb r3, [r5, #6] -10005fca: 0224 lsls r4, r4, #8 -10005fcc: 431c orrs r4, r3 -10005fce: 1c23 adds r3, r4, #0 -10005fd0: 42bc cmp r4, r7 -10005fd2: d900 bls.n 10005fd6 -10005fd4: 1c3b adds r3, r7, #0 -10005fd6: b29f uxth r7, r3 -10005fd8: 81b3 strh r3, [r6, #12] -10005fda: 2c00 cmp r4, #0 -10005fdc: d00e beq.n 10005ffc -10005fde: 2f00 cmp r7, #0 -10005fe0: d018 beq.n 10006014 -10005fe2: 4643 mov r3, r8 -10005fe4: 2b00 cmp r3, #0 -10005fe6: d02c beq.n 10006042 -10005fe8: 1c3b adds r3, r7, #0 -10005fea: 2f40 cmp r7, #64 @ 0x40 -10005fec: d81b bhi.n 10006026 -10005fee: b29f uxth r7, r3 -10005ff0: 7833 ldrb r3, [r6, #0] -10005ff2: 2b7f cmp r3, #127 @ 0x7f -10005ff4: d81c bhi.n 10006030 -10005ff6: 2100 movs r1, #0 -10005ff8: 4a14 ldr r2, [pc, #80] @ (1000604c ) -10005ffa: e00f b.n 1000601c -10005ffc: 2180 movs r1, #128 @ 0x80 -10005ffe: 782b ldrb r3, [r5, #0] -10006000: 2200 movs r2, #0 -10006002: 4399 bics r1, r3 -10006004: 4648 mov r0, r9 -10006006: 2300 movs r3, #0 -10006008: f7ff ff90 bl 10005f2c -1000600c: bcc0 pop {r6, r7} -1000600e: 46b9 mov r9, r7 -10006010: 46b0 mov r8, r6 -10006012: bdf8 pop {r3, r4, r5, r6, r7, pc} -10006014: 237f movs r3, #127 @ 0x7f -10006016: 2200 movs r2, #0 -10006018: 7831 ldrb r1, [r6, #0] -1000601a: 4399 bics r1, r3 -1000601c: 003b movs r3, r7 -1000601e: 4648 mov r0, r9 -10006020: f7ff ff84 bl 10005f2c -10006024: e7f2 b.n 1000600c -10006026: 2340 movs r3, #64 @ 0x40 -10006028: b29f uxth r7, r3 -1000602a: 7833 ldrb r3, [r6, #0] -1000602c: 2b7f cmp r3, #127 @ 0x7f -1000602e: d9e2 bls.n 10005ff6 -10006030: 4c06 ldr r4, [pc, #24] @ (1000604c ) -10006032: 003a movs r2, r7 -10006034: 4641 mov r1, r8 -10006036: 0020 movs r0, r4 -10006038: f7fe fa4a bl 100044d0 <__wrap___aeabi_memcpy> -1000603c: 2180 movs r1, #128 @ 0x80 -1000603e: 0022 movs r2, r4 -10006040: e7ec b.n 1000601c -10006042: 2000 movs r0, #0 -10006044: e7e2 b.n 1000600c -10006046: 46c0 nop @ (mov r8, r8) -10006048: 200014f4 .word 0x200014f4 -1000604c: 20001510 .word 0x20001510 - -10006050 : +100050c8 <__aeabi_float_init>: +100050c8: 2313 movs r3, #19 +100050ca: b510 push {r4, lr} +100050cc: 4812 ldr r0, [pc, #72] @ (10005118 <__aeabi_float_init+0x50>) +100050ce: 781c ldrb r4, [r3, #0] +100050d0: f7ff f976 bl 100043c0 +100050d4: 0001 movs r1, r0 +100050d6: 2c01 cmp r4, #1 +100050d8: d00a beq.n 100050f0 <__aeabi_float_init+0x28> +100050da: dd03 ble.n 100050e4 <__aeabi_float_init+0x1c> +100050dc: 2280 movs r2, #128 @ 0x80 +100050de: 480f ldr r0, [pc, #60] @ (1000511c <__aeabi_float_init+0x54>) +100050e0: f000 f848 bl 10005174 <__wrap___aeabi_memcpy> +100050e4: 480e ldr r0, [pc, #56] @ (10005120 <__aeabi_float_init+0x58>) +100050e6: f7ff f963 bl 100043b0 +100050ea: 4b0e ldr r3, [pc, #56] @ (10005124 <__aeabi_float_init+0x5c>) +100050ec: 6018 str r0, [r3, #0] +100050ee: bd10 pop {r4, pc} +100050f0: 4c0a ldr r4, [pc, #40] @ (1000511c <__aeabi_float_init+0x54>) +100050f2: 2254 movs r2, #84 @ 0x54 +100050f4: 0020 movs r0, r4 +100050f6: f000 f83d bl 10005174 <__wrap___aeabi_memcpy> +100050fa: 4b0b ldr r3, [pc, #44] @ (10005128 <__aeabi_float_init+0x60>) +100050fc: 6563 str r3, [r4, #84] @ 0x54 +100050fe: 65a3 str r3, [r4, #88] @ 0x58 +10005100: 65e3 str r3, [r4, #92] @ 0x5c +10005102: 6623 str r3, [r4, #96] @ 0x60 +10005104: 6663 str r3, [r4, #100] @ 0x64 +10005106: 66a3 str r3, [r4, #104] @ 0x68 +10005108: 66e3 str r3, [r4, #108] @ 0x6c +1000510a: 6723 str r3, [r4, #112] @ 0x70 +1000510c: 6763 str r3, [r4, #116] @ 0x74 +1000510e: 67a3 str r3, [r4, #120] @ 0x78 +10005110: 67e3 str r3, [r4, #124] @ 0x7c +10005112: 6223 str r3, [r4, #32] +10005114: 61e3 str r3, [r4, #28] +10005116: e7e5 b.n 100050e4 <__aeabi_float_init+0x1c> +10005118: 00004653 .word 0x00004653 +1000511c: 200011f0 .word 0x200011f0 +10005120: 0000334c .word 0x0000334c +10005124: 20001d28 .word 0x20001d28 +10005128: 1000512d .word 0x1000512d + +1000512c : +1000512c: b507 push {r0, r1, r2, lr} +1000512e: 4660 mov r0, ip +10005130: 8801 ldrh r1, [r0, #0] +10005132: 0a0a lsrs r2, r1, #8 +10005134: 3002 adds r0, #2 +10005136: 2adf cmp r2, #223 @ 0xdf +10005138: d1fa bne.n 10005130 +1000513a: b2c9 uxtb r1, r1 +1000513c: 0882 lsrs r2, r0, #2 +1000513e: d304 bcc.n 1000514a +10005140: 8802 ldrh r2, [r0, #0] +10005142: 8840 ldrh r0, [r0, #2] +10005144: 0400 lsls r0, r0, #16 +10005146: 4310 orrs r0, r2 +10005148: e000 b.n 1000514c +1000514a: 6800 ldr r0, [r0, #0] +1000514c: 4a01 ldr r2, [pc, #4] @ (10005154 ) +1000514e: 5050 str r0, [r2, r1] +10005150: 9003 str r0, [sp, #12] +10005152: bd07 pop {r0, r1, r2, pc} +10005154: 200011f0 .word 0x200011f0 + +10005158 <__aeabi_mem_init>: +10005158: 4801 ldr r0, [pc, #4] @ (10005160 <__aeabi_mem_init+0x8>) +1000515a: 2104 movs r1, #4 +1000515c: 4b01 ldr r3, [pc, #4] @ (10005164 <__aeabi_mem_init+0xc>) +1000515e: 4718 bx r3 +10005160: 20000f30 .word 0x20000f30 +10005164: 100043d1 .word 0x100043d1 + +10005168 <__wrap_memset>: +10005168: 4b01 ldr r3, [pc, #4] @ (10005170 <__wrap_memset+0x8>) +1000516a: 681b ldr r3, [r3, #0] +1000516c: 4718 bx r3 +1000516e: 0000 .short 0x0000 +10005170: 20000f30 .word 0x20000f30 + +10005174 <__wrap___aeabi_memcpy>: +10005174: 4b01 ldr r3, [pc, #4] @ (1000517c <__wrap___aeabi_memcpy+0x8>) +10005176: 685b ldr r3, [r3, #4] +10005178: 4718 bx r3 +1000517a: 0000 .short 0x0000 +1000517c: 20000f30 .word 0x20000f30 + +10005180 : +10005180: b5f0 push {r4, r5, r6, r7, lr} +10005182: 46c6 mov lr, r8 +10005184: b500 push {lr} +10005186: 7d43 ldrb r3, [r0, #21] +10005188: 0007 movs r7, r0 +1000518a: 000d movs r5, r1 +1000518c: 0016 movs r6, r2 +1000518e: 2b00 cmp r3, #0 +10005190: d038 beq.n 10005204 +10005192: 2a00 cmp r2, #0 +10005194: dd2e ble.n 100051f4 +10005196: 2100 movs r1, #0 +10005198: 1e6a subs r2, r5, #1 +1000519a: 4690 mov r8, r2 +1000519c: 5c6a ldrb r2, [r5, r1] +1000519e: 7d03 ldrb r3, [r0, #20] +100051a0: 1c4c adds r4, r1, #1 +100051a2: 2000 movs r0, #0 +100051a4: 2a0a cmp r2, #10 +100051a6: d00c beq.n 100051c2 +100051a8: 42a6 cmp r6, r4 +100051aa: d016 beq.n 100051da +100051ac: 4643 mov r3, r8 +100051ae: 5d1b ldrb r3, [r3, r4] +100051b0: 0021 movs r1, r4 +100051b2: 3b0d subs r3, #13 +100051b4: 425a negs r2, r3 +100051b6: 4153 adcs r3, r2 +100051b8: 5c6a ldrb r2, [r5, r1] +100051ba: b2db uxtb r3, r3 +100051bc: 1c4c adds r4, r1, #1 +100051be: 2a0a cmp r2, #10 +100051c0: d1f2 bne.n 100051a8 +100051c2: 2b00 cmp r3, #0 +100051c4: d1f0 bne.n 100051a8 +100051c6: 4288 cmp r0, r1 +100051c8: db17 blt.n 100051fa +100051ca: 2102 movs r1, #2 +100051cc: 4810 ldr r0, [pc, #64] @ (10005210 ) +100051ce: 683b ldr r3, [r7, #0] +100051d0: 4798 blx r3 +100051d2: 42a6 cmp r6, r4 +100051d4: d007 beq.n 100051e6 +100051d6: 0020 movs r0, r4 +100051d8: e7e8 b.n 100051ac +100051da: 4286 cmp r6, r0 +100051dc: dd03 ble.n 100051e6 +100051de: 1a31 subs r1, r6, r0 +100051e0: 683b ldr r3, [r7, #0] +100051e2: 1828 adds r0, r5, r0 +100051e4: 4798 blx r3 +100051e6: 19ad adds r5, r5, r6 +100051e8: 3d01 subs r5, #1 +100051ea: 782b ldrb r3, [r5, #0] +100051ec: 3b0d subs r3, #13 +100051ee: 425a negs r2, r3 +100051f0: 4153 adcs r3, r2 +100051f2: 753b strb r3, [r7, #20] +100051f4: bc80 pop {r7} +100051f6: 46b8 mov r8, r7 +100051f8: bdf0 pop {r4, r5, r6, r7, pc} +100051fa: 1a09 subs r1, r1, r0 +100051fc: 683b ldr r3, [r7, #0] +100051fe: 1828 adds r0, r5, r0 +10005200: 4798 blx r3 +10005202: e7e2 b.n 100051ca +10005204: 6803 ldr r3, [r0, #0] +10005206: 0011 movs r1, r2 +10005208: 0028 movs r0, r5 +1000520a: 4798 blx r3 +1000520c: e7f2 b.n 100051f4 +1000520e: 46c0 nop @ (mov r8, r8) +10005210: 1000804c .word 0x1000804c + +10005214 : +10005214: b5f0 push {r4, r5, r6, r7, lr} +10005216: 46c6 mov lr, r8 +10005218: 680b ldr r3, [r1, #0] +1000521a: 0006 movs r6, r0 +1000521c: 000c movs r4, r1 +1000521e: b500 push {lr} +10005220: 2b80 cmp r3, #128 @ 0x80 +10005222: d006 beq.n 10005232 +10005224: 1c5a adds r2, r3, #1 +10005226: 6022 str r2, [r4, #0] +10005228: 18e4 adds r4, r4, r3 +1000522a: 7126 strb r6, [r4, #4] +1000522c: bc80 pop {r7} +1000522e: 46b8 mov r8, r7 +10005230: bdf0 pop {r4, r5, r6, r7, pc} +10005232: 4b0f ldr r3, [pc, #60] @ (10005270 ) +10005234: 681d ldr r5, [r3, #0] +10005236: 2d00 cmp r5, #0 +10005238: d016 beq.n 10005268 +1000523a: 1d0b adds r3, r1, #4 +1000523c: 4698 mov r8, r3 +1000523e: 4f0d ldr r7, [pc, #52] @ (10005274 ) +10005240: e002 b.n 10005248 +10005242: 692d ldr r5, [r5, #16] +10005244: 2d00 cmp r5, #0 +10005246: d00f beq.n 10005268 +10005248: 682b ldr r3, [r5, #0] +1000524a: 2b00 cmp r3, #0 +1000524c: d0f9 beq.n 10005242 +1000524e: 683b ldr r3, [r7, #0] +10005250: 2b00 cmp r3, #0 +10005252: d001 beq.n 10005258 +10005254: 42ab cmp r3, r5 +10005256: d1f4 bne.n 10005242 +10005258: 0028 movs r0, r5 +1000525a: 4641 mov r1, r8 +1000525c: 6822 ldr r2, [r4, #0] +1000525e: f7ff ff8f bl 10005180 +10005262: 692d ldr r5, [r5, #16] +10005264: 2d00 cmp r5, #0 +10005266: d1ef bne.n 10005248 +10005268: 2201 movs r2, #1 +1000526a: 2300 movs r3, #0 +1000526c: e7db b.n 10005226 +1000526e: 46c0 nop @ (mov r8, r8) +10005270: 200018c0 .word 0x200018c0 +10005274: 200018c8 .word 0x200018c8 + +10005278 <__wrap_putchar>: +10005278: b5f0 push {r4, r5, r6, r7, lr} +1000527a: 46ce mov lr, r9 +1000527c: 4647 mov r7, r8 +1000527e: b580 push {r7, lr} +10005280: b083 sub sp, #12 +10005282: 466b mov r3, sp +10005284: 0006 movs r6, r0 +10005286: 1ddd adds r5, r3, #7 +10005288: 7028 strb r0, [r5, #0] +1000528a: f7fc fe6b bl 10001f64 +1000528e: 2300 movs r3, #0 +10005290: 4a1a ldr r2, [pc, #104] @ (100052fc <__wrap_putchar+0x84>) +10005292: 1812 adds r2, r2, r0 +10005294: 414b adcs r3, r1 +10005296: 2180 movs r1, #128 @ 0x80 +10005298: 0609 lsls r1, r1, #24 +1000529a: 428b cmp r3, r1 +1000529c: d302 bcc.n 100052a4 <__wrap_putchar+0x2c> +1000529e: 2201 movs r2, #1 +100052a0: 4b17 ldr r3, [pc, #92] @ (10005300 <__wrap_putchar+0x88>) +100052a2: 4252 negs r2, r2 +100052a4: 4917 ldr r1, [pc, #92] @ (10005304 <__wrap_putchar+0x8c>) +100052a6: 0008 movs r0, r1 +100052a8: 4688 mov r8, r1 +100052aa: f002 fcb1 bl 10007c10 <__mutex_try_enter_block_until_veneer> +100052ae: 4b16 ldr r3, [pc, #88] @ (10005308 <__wrap_putchar+0x90>) +100052b0: 4681 mov r9, r0 +100052b2: 681c ldr r4, [r3, #0] +100052b4: 2c00 cmp r4, #0 +100052b6: d014 beq.n 100052e2 <__wrap_putchar+0x6a> +100052b8: 4f14 ldr r7, [pc, #80] @ (1000530c <__wrap_putchar+0x94>) +100052ba: e002 b.n 100052c2 <__wrap_putchar+0x4a> +100052bc: 6924 ldr r4, [r4, #16] +100052be: 2c00 cmp r4, #0 +100052c0: d00f beq.n 100052e2 <__wrap_putchar+0x6a> +100052c2: 6823 ldr r3, [r4, #0] +100052c4: 2b00 cmp r3, #0 +100052c6: d0f9 beq.n 100052bc <__wrap_putchar+0x44> +100052c8: 683b ldr r3, [r7, #0] +100052ca: 2b00 cmp r3, #0 +100052cc: d001 beq.n 100052d2 <__wrap_putchar+0x5a> +100052ce: 42a3 cmp r3, r4 +100052d0: d1f4 bne.n 100052bc <__wrap_putchar+0x44> +100052d2: 0020 movs r0, r4 +100052d4: 2201 movs r2, #1 +100052d6: 0029 movs r1, r5 +100052d8: f7ff ff52 bl 10005180 +100052dc: 6924 ldr r4, [r4, #16] +100052de: 2c00 cmp r4, #0 +100052e0: d1ef bne.n 100052c2 <__wrap_putchar+0x4a> +100052e2: 464b mov r3, r9 +100052e4: 2b00 cmp r3, #0 +100052e6: d105 bne.n 100052f4 <__wrap_putchar+0x7c> +100052e8: 0030 movs r0, r6 +100052ea: b003 add sp, #12 +100052ec: bcc0 pop {r6, r7} +100052ee: 46b9 mov r9, r7 +100052f0: 46b0 mov r8, r6 +100052f2: bdf0 pop {r4, r5, r6, r7, pc} +100052f4: 4640 mov r0, r8 +100052f6: f002 fc4b bl 10007b90 <__mutex_exit_veneer> +100052fa: e7f5 b.n 100052e8 <__wrap_putchar+0x70> +100052fc: 000f4240 .word 0x000f4240 +10005300: 7fffffff .word 0x7fffffff +10005304: 20000f98 .word 0x20000f98 +10005308: 200018c0 .word 0x200018c0 +1000530c: 200018c8 .word 0x200018c8 + +10005310 <__wrap_puts>: +10005310: b5f0 push {r4, r5, r6, r7, lr} +10005312: 46de mov lr, fp +10005314: 4657 mov r7, sl +10005316: 464e mov r6, r9 +10005318: 4645 mov r5, r8 +1000531a: b5e0 push {r5, r6, r7, lr} +1000531c: b085 sub sp, #20 +1000531e: 0007 movs r7, r0 +10005320: f002 fbfc bl 10007b1c +10005324: 0006 movs r6, r0 +10005326: f7fc fe1d bl 10001f64 +1000532a: 2300 movs r3, #0 +1000532c: 4a2b ldr r2, [pc, #172] @ (100053dc <__wrap_puts+0xcc>) +1000532e: 1812 adds r2, r2, r0 +10005330: 414b adcs r3, r1 +10005332: 2180 movs r1, #128 @ 0x80 +10005334: 0609 lsls r1, r1, #24 +10005336: 428b cmp r3, r1 +10005338: d302 bcc.n 10005340 <__wrap_puts+0x30> +1000533a: 2201 movs r2, #1 +1000533c: 4b28 ldr r3, [pc, #160] @ (100053e0 <__wrap_puts+0xd0>) +1000533e: 4252 negs r2, r2 +10005340: 4928 ldr r1, [pc, #160] @ (100053e4 <__wrap_puts+0xd4>) +10005342: 0008 movs r0, r1 +10005344: 468b mov fp, r1 +10005346: f002 fc63 bl 10007c10 <__mutex_try_enter_block_until_veneer> +1000534a: 4b27 ldr r3, [pc, #156] @ (100053e8 <__wrap_puts+0xd8>) +1000534c: 9001 str r0, [sp, #4] +1000534e: 681c ldr r4, [r3, #0] +10005350: 469a mov sl, r3 +10005352: 2c00 cmp r4, #0 +10005354: d03b beq.n 100053ce <__wrap_puts+0xbe> +10005356: 4b25 ldr r3, [pc, #148] @ (100053ec <__wrap_puts+0xdc>) +10005358: 4698 mov r8, r3 +1000535a: ab02 add r3, sp, #8 +1000535c: 1ddd adds r5, r3, #7 +1000535e: 230a movs r3, #10 +10005360: 4699 mov r9, r3 +10005362: e002 b.n 1000536a <__wrap_puts+0x5a> +10005364: 6924 ldr r4, [r4, #16] +10005366: 2c00 cmp r4, #0 +10005368: d017 beq.n 1000539a <__wrap_puts+0x8a> +1000536a: 6823 ldr r3, [r4, #0] +1000536c: 2b00 cmp r3, #0 +1000536e: d0f9 beq.n 10005364 <__wrap_puts+0x54> +10005370: 4643 mov r3, r8 +10005372: 681b ldr r3, [r3, #0] +10005374: 2b00 cmp r3, #0 +10005376: d001 beq.n 1000537c <__wrap_puts+0x6c> +10005378: 429c cmp r4, r3 +1000537a: d1f3 bne.n 10005364 <__wrap_puts+0x54> +1000537c: 0020 movs r0, r4 +1000537e: 0032 movs r2, r6 +10005380: 0039 movs r1, r7 +10005382: f7ff fefd bl 10005180 +10005386: 464b mov r3, r9 +10005388: 0020 movs r0, r4 +1000538a: 2201 movs r2, #1 +1000538c: 0029 movs r1, r5 +1000538e: 702b strb r3, [r5, #0] +10005390: f7ff fef6 bl 10005180 +10005394: 6924 ldr r4, [r4, #16] +10005396: 2c00 cmp r4, #0 +10005398: d1e7 bne.n 1000536a <__wrap_puts+0x5a> +1000539a: 9b01 ldr r3, [sp, #4] +1000539c: 2b00 cmp r3, #0 +1000539e: d118 bne.n 100053d2 <__wrap_puts+0xc2> +100053a0: 4653 mov r3, sl +100053a2: 681c ldr r4, [r3, #0] +100053a4: 2c00 cmp r4, #0 +100053a6: d006 beq.n 100053b6 <__wrap_puts+0xa6> +100053a8: 6863 ldr r3, [r4, #4] +100053aa: 2b00 cmp r3, #0 +100053ac: d00b beq.n 100053c6 <__wrap_puts+0xb6> +100053ae: 4798 blx r3 +100053b0: 6924 ldr r4, [r4, #16] +100053b2: 2c00 cmp r4, #0 +100053b4: d1f8 bne.n 100053a8 <__wrap_puts+0x98> +100053b6: 0030 movs r0, r6 +100053b8: b005 add sp, #20 +100053ba: bcf0 pop {r4, r5, r6, r7} +100053bc: 46bb mov fp, r7 +100053be: 46b2 mov sl, r6 +100053c0: 46a9 mov r9, r5 +100053c2: 46a0 mov r8, r4 +100053c4: bdf0 pop {r4, r5, r6, r7, pc} +100053c6: 6924 ldr r4, [r4, #16] +100053c8: 2c00 cmp r4, #0 +100053ca: d1ed bne.n 100053a8 <__wrap_puts+0x98> +100053cc: e7f3 b.n 100053b6 <__wrap_puts+0xa6> +100053ce: 2800 cmp r0, #0 +100053d0: d0f1 beq.n 100053b6 <__wrap_puts+0xa6> +100053d2: 4658 mov r0, fp +100053d4: f002 fbdc bl 10007b90 <__mutex_exit_veneer> +100053d8: e7e2 b.n 100053a0 <__wrap_puts+0x90> +100053da: 46c0 nop @ (mov r8, r8) +100053dc: 000f4240 .word 0x000f4240 +100053e0: 7fffffff .word 0x7fffffff +100053e4: 20000f98 .word 0x20000f98 +100053e8: 200018c0 .word 0x200018c0 +100053ec: 200018c8 .word 0x200018c8 + +100053f0 : +100053f0: 4a0a ldr r2, [pc, #40] @ (1000541c ) +100053f2: 6813 ldr r3, [r2, #0] +100053f4: 2b00 cmp r3, #0 +100053f6: d105 bne.n 10005404 +100053f8: e00c b.n 10005414 +100053fa: 001a movs r2, r3 +100053fc: 691b ldr r3, [r3, #16] +100053fe: 3210 adds r2, #16 +10005400: 2b00 cmp r3, #0 +10005402: d007 beq.n 10005414 +10005404: 4298 cmp r0, r3 +10005406: d1f8 bne.n 100053fa +10005408: 2900 cmp r1, #0 +1000540a: d102 bne.n 10005412 +1000540c: 6903 ldr r3, [r0, #16] +1000540e: 6013 str r3, [r2, #0] +10005410: 6101 str r1, [r0, #16] +10005412: 4770 bx lr +10005414: 2900 cmp r1, #0 +10005416: d0fc beq.n 10005412 +10005418: 6010 str r0, [r2, #0] +1000541a: e7fa b.n 10005412 +1000541c: 200018c0 .word 0x200018c0 + +10005420 <__wrap_vprintf>: +10005420: b5f0 push {r4, r5, r6, r7, lr} +10005422: 46ce mov lr, r9 +10005424: 4647 mov r7, r8 +10005426: b580 push {r7, lr} +10005428: b0a3 sub sp, #140 @ 0x8c +1000542a: 0004 movs r4, r0 +1000542c: 000d movs r5, r1 +1000542e: f7fc fd99 bl 10001f64 +10005432: 2300 movs r3, #0 +10005434: 4a29 ldr r2, [pc, #164] @ (100054dc <__wrap_vprintf+0xbc>) +10005436: 1812 adds r2, r2, r0 +10005438: 414b adcs r3, r1 +1000543a: 2180 movs r1, #128 @ 0x80 +1000543c: 0609 lsls r1, r1, #24 +1000543e: 428b cmp r3, r1 +10005440: d302 bcc.n 10005448 <__wrap_vprintf+0x28> +10005442: 2201 movs r2, #1 +10005444: 4b26 ldr r3, [pc, #152] @ (100054e0 <__wrap_vprintf+0xc0>) +10005446: 4252 negs r2, r2 +10005448: 4f26 ldr r7, [pc, #152] @ (100054e4 <__wrap_vprintf+0xc4>) +1000544a: 0038 movs r0, r7 +1000544c: f002 fbe0 bl 10007c10 <__mutex_try_enter_block_until_veneer> +10005450: 2300 movs r3, #0 +10005452: 0006 movs r6, r0 +10005454: 9301 str r3, [sp, #4] +10005456: 0022 movs r2, r4 +10005458: 002b movs r3, r5 +1000545a: 4823 ldr r0, [pc, #140] @ (100054e8 <__wrap_vprintf+0xc8>) +1000545c: a901 add r1, sp, #4 +1000545e: f7fe ff77 bl 10004350 +10005462: 9b01 ldr r3, [sp, #4] +10005464: 4680 mov r8, r0 +10005466: 2b00 cmp r3, #0 +10005468: d114 bne.n 10005494 <__wrap_vprintf+0x74> +1000546a: 4b20 ldr r3, [pc, #128] @ (100054ec <__wrap_vprintf+0xcc>) +1000546c: 681c ldr r4, [r3, #0] +1000546e: 2c00 cmp r4, #0 +10005470: d006 beq.n 10005480 <__wrap_vprintf+0x60> +10005472: 6863 ldr r3, [r4, #4] +10005474: 2b00 cmp r3, #0 +10005476: d00b beq.n 10005490 <__wrap_vprintf+0x70> +10005478: 4798 blx r3 +1000547a: 6924 ldr r4, [r4, #16] +1000547c: 2c00 cmp r4, #0 +1000547e: d1f8 bne.n 10005472 <__wrap_vprintf+0x52> +10005480: 2e00 cmp r6, #0 +10005482: d125 bne.n 100054d0 <__wrap_vprintf+0xb0> +10005484: 4640 mov r0, r8 +10005486: b023 add sp, #140 @ 0x8c +10005488: bcc0 pop {r6, r7} +1000548a: 46b9 mov r9, r7 +1000548c: 46b0 mov r8, r6 +1000548e: bdf0 pop {r4, r5, r6, r7, pc} +10005490: 6924 ldr r4, [r4, #16] +10005492: e7ec b.n 1000546e <__wrap_vprintf+0x4e> +10005494: 4b15 ldr r3, [pc, #84] @ (100054ec <__wrap_vprintf+0xcc>) +10005496: 681d ldr r5, [r3, #0] +10005498: 4699 mov r9, r3 +1000549a: 2d00 cmp r5, #0 +1000549c: d01c beq.n 100054d8 <__wrap_vprintf+0xb8> +1000549e: 4c14 ldr r4, [pc, #80] @ (100054f0 <__wrap_vprintf+0xd0>) +100054a0: e002 b.n 100054a8 <__wrap_vprintf+0x88> +100054a2: 692d ldr r5, [r5, #16] +100054a4: 2d00 cmp r5, #0 +100054a6: d00f beq.n 100054c8 <__wrap_vprintf+0xa8> +100054a8: 682b ldr r3, [r5, #0] +100054aa: 2b00 cmp r3, #0 +100054ac: d0f9 beq.n 100054a2 <__wrap_vprintf+0x82> +100054ae: 6823 ldr r3, [r4, #0] +100054b0: 2b00 cmp r3, #0 +100054b2: d001 beq.n 100054b8 <__wrap_vprintf+0x98> +100054b4: 42ab cmp r3, r5 +100054b6: d1f4 bne.n 100054a2 <__wrap_vprintf+0x82> +100054b8: 0028 movs r0, r5 +100054ba: 9a01 ldr r2, [sp, #4] +100054bc: a902 add r1, sp, #8 +100054be: f7ff fe5f bl 10005180 +100054c2: 692d ldr r5, [r5, #16] +100054c4: 2d00 cmp r5, #0 +100054c6: d1ef bne.n 100054a8 <__wrap_vprintf+0x88> +100054c8: 464b mov r3, r9 +100054ca: 9501 str r5, [sp, #4] +100054cc: 681c ldr r4, [r3, #0] +100054ce: e7ce b.n 1000546e <__wrap_vprintf+0x4e> +100054d0: 0038 movs r0, r7 +100054d2: f002 fb5d bl 10007b90 <__mutex_exit_veneer> +100054d6: e7d5 b.n 10005484 <__wrap_vprintf+0x64> +100054d8: 9501 str r5, [sp, #4] +100054da: e7d1 b.n 10005480 <__wrap_vprintf+0x60> +100054dc: 000f4240 .word 0x000f4240 +100054e0: 7fffffff .word 0x7fffffff +100054e4: 20000f98 .word 0x20000f98 +100054e8: 10005215 .word 0x10005215 +100054ec: 200018c0 .word 0x200018c0 +100054f0: 200018c8 .word 0x200018c8 + +100054f4 <__wrap_printf>: +100054f4: b40f push {r0, r1, r2, r3} +100054f6: b500 push {lr} +100054f8: b083 sub sp, #12 +100054fa: a904 add r1, sp, #16 +100054fc: c901 ldmia r1!, {r0} +100054fe: 9101 str r1, [sp, #4] +10005500: f7ff ff8e bl 10005420 <__wrap_vprintf> +10005504: b003 add sp, #12 +10005506: bc08 pop {r3} +10005508: b004 add sp, #16 +1000550a: 4718 bx r3 + +1000550c : +1000550c: b510 push {r4, lr} +1000550e: f000 f8cd bl 100056ac +10005512: f000 fac7 bl 10005aa4 +10005516: 2001 movs r0, #1 +10005518: bd10 pop {r4, pc} +1000551a: 46c0 nop @ (mov r8, r8) + +1000551c : +1000551c: b5f0 push {r4, r5, r6, r7, lr} +1000551e: 2900 cmp r1, #0 +10005520: dd15 ble.n 1000554e +10005522: 4b0e ldr r3, [pc, #56] @ (1000555c ) +10005524: 270d movs r7, #13 +10005526: 681a ldr r2, [r3, #0] +10005528: 4b0d ldr r3, [pc, #52] @ (10005560 ) +1000552a: 4c0e ldr r4, [pc, #56] @ (10005564 ) +1000552c: 18d3 adds r3, r2, r3 +1000552e: 425d negs r5, r3 +10005530: 416b adcs r3, r5 +10005532: 1845 adds r5, r0, r1 +10005534: 2120 movs r1, #32 +10005536: 005b lsls r3, r3, #1 +10005538: 5f1e ldrsh r6, [r3, r4] +1000553a: 7804 ldrb r4, [r0, #0] +1000553c: 42a6 cmp r6, r4 +1000553e: d007 beq.n 10005550 +10005540: 6993 ldr r3, [r2, #24] +10005542: 4219 tst r1, r3 +10005544: d1fc bne.n 10005540 +10005546: 3001 adds r0, #1 +10005548: 6014 str r4, [r2, #0] +1000554a: 42a8 cmp r0, r5 +1000554c: d1f5 bne.n 1000553a +1000554e: bdf0 pop {r4, r5, r6, r7, pc} +10005550: 6993 ldr r3, [r2, #24] +10005552: 4219 tst r1, r3 +10005554: d1fc bne.n 10005550 +10005556: 6017 str r7, [r2, #0] +10005558: e7f2 b.n 10005540 +1000555a: 46c0 nop @ (mov r8, r8) +1000555c: 20001d4c .word 0x20001d4c +10005560: bffc8000 .word 0xbffc8000 +10005564: 20001d48 .word 0x20001d48 + +10005568 : +10005568: 4b21 ldr r3, [pc, #132] @ (100055f0 ) +1000556a: b570 push {r4, r5, r6, lr} +1000556c: 0004 movs r4, r0 +1000556e: 1e0d subs r5, r1, #0 +10005570: 681e ldr r6, [r3, #0] +10005572: dd2c ble.n 100055ce +10005574: 2000 movs r0, #0 +10005576: 2110 movs r1, #16 +10005578: 4b1e ldr r3, [pc, #120] @ (100055f4 ) +1000557a: 3c01 subs r4, #1 +1000557c: 681a ldr r2, [r3, #0] +1000557e: 6993 ldr r3, [r2, #24] +10005580: 4219 tst r1, r3 +10005582: d115 bne.n 100055b0 +10005584: 3001 adds r0, #1 +10005586: 6993 ldr r3, [r2, #24] +10005588: 4219 tst r1, r3 +1000558a: d1fc bne.n 10005586 +1000558c: 6813 ldr r3, [r2, #0] +1000558e: 5423 strb r3, [r4, r0] +10005590: 4285 cmp r5, r0 +10005592: d1f4 bne.n 1000557e +10005594: 2e00 cmp r6, #0 +10005596: d009 beq.n 100055ac +10005598: 2350 movs r3, #80 @ 0x50 +1000559a: 2138 movs r1, #56 @ 0x38 +1000559c: 6393 str r3, [r2, #56] @ 0x38 +1000559e: 6b53 ldr r3, [r2, #52] @ 0x34 +100055a0: 3234 adds r2, #52 @ 0x34 +100055a2: 4019 ands r1, r3 +100055a4: 2380 movs r3, #128 @ 0x80 +100055a6: 015b lsls r3, r3, #5 +100055a8: 4313 orrs r3, r2 +100055aa: 6019 str r1, [r3, #0] +100055ac: 0028 movs r0, r5 +100055ae: e00d b.n 100055cc +100055b0: 2e00 cmp r6, #0 +100055b2: d009 beq.n 100055c8 +100055b4: 2350 movs r3, #80 @ 0x50 +100055b6: 2138 movs r1, #56 @ 0x38 +100055b8: 6393 str r3, [r2, #56] @ 0x38 +100055ba: 6b53 ldr r3, [r2, #52] @ 0x34 +100055bc: 3234 adds r2, #52 @ 0x34 +100055be: 4019 ands r1, r3 +100055c0: 2380 movs r3, #128 @ 0x80 +100055c2: 015b lsls r3, r3, #5 +100055c4: 431a orrs r2, r3 +100055c6: 6011 str r1, [r2, #0] +100055c8: 2800 cmp r0, #0 +100055ca: d00e beq.n 100055ea +100055cc: bd70 pop {r4, r5, r6, pc} +100055ce: 2e00 cmp r6, #0 +100055d0: d00b beq.n 100055ea +100055d2: 2250 movs r2, #80 @ 0x50 +100055d4: 2138 movs r1, #56 @ 0x38 +100055d6: 4b07 ldr r3, [pc, #28] @ (100055f4 ) +100055d8: 681b ldr r3, [r3, #0] +100055da: 639a str r2, [r3, #56] @ 0x38 +100055dc: 6b5a ldr r2, [r3, #52] @ 0x34 +100055de: 3334 adds r3, #52 @ 0x34 +100055e0: 4011 ands r1, r2 +100055e2: 2280 movs r2, #128 @ 0x80 +100055e4: 0152 lsls r2, r2, #5 +100055e6: 4313 orrs r3, r2 +100055e8: 6019 str r1, [r3, #0] +100055ea: 2003 movs r0, #3 +100055ec: 4240 negs r0, r0 +100055ee: e7ed b.n 100055cc +100055f0: 20001844 .word 0x20001844 +100055f4: 20001d4c .word 0x20001d4c + +100055f8 : +100055f8: 4b06 ldr r3, [pc, #24] @ (10005614 ) +100055fa: b510 push {r4, lr} +100055fc: 681b ldr r3, [r3, #0] +100055fe: 2b00 cmp r3, #0 +10005600: d006 beq.n 10005610 +10005602: 2100 movs r1, #0 +10005604: 4a04 ldr r2, [pc, #16] @ (10005618 ) +10005606: 6812 ldr r2, [r2, #0] +10005608: 6391 str r1, [r2, #56] @ 0x38 +1000560a: 4a04 ldr r2, [pc, #16] @ (1000561c ) +1000560c: 6810 ldr r0, [r2, #0] +1000560e: 4798 blx r3 +10005610: bd10 pop {r4, pc} +10005612: 46c0 nop @ (mov r8, r8) +10005614: 20001844 .word 0x20001844 +10005618: 20001d4c .word 0x20001d4c +1000561c: 2000184c .word 0x2000184c + +10005620 : +10005620: 4b1d ldr r3, [pc, #116] @ (10005698 ) +10005622: b5f0 push {r4, r5, r6, r7, lr} +10005624: 681a ldr r2, [r3, #0] +10005626: 46c6 mov lr, r8 +10005628: 4698 mov r8, r3 +1000562a: 4b1c ldr r3, [pc, #112] @ (1000569c ) +1000562c: 000e movs r6, r1 +1000562e: 18d3 adds r3, r2, r3 +10005630: 4259 negs r1, r3 +10005632: 414b adcs r3, r1 +10005634: 4f1a ldr r7, [pc, #104] @ (100056a0 ) +10005636: 3314 adds r3, #20 +10005638: 001c movs r4, r3 +1000563a: 0005 movs r5, r0 +1000563c: b500 push {lr} +1000563e: 683b ldr r3, [r7, #0] +10005640: 2800 cmp r0, #0 +10005642: d007 beq.n 10005654 +10005644: 2b00 cmp r3, #0 +10005646: d011 beq.n 1000566c +10005648: 4b16 ldr r3, [pc, #88] @ (100056a4 ) +1000564a: 603d str r5, [r7, #0] +1000564c: 601e str r6, [r3, #0] +1000564e: bc80 pop {r7} +10005650: 46b8 mov r8, r7 +10005652: bdf0 pop {r4, r5, r6, r7, pc} +10005654: 2b00 cmp r3, #0 +10005656: d0f7 beq.n 10005648 +10005658: 6390 str r0, [r2, #56] @ 0x38 +1000565a: 2100 movs r1, #0 +1000565c: 0020 movs r0, r4 +1000565e: f7fb fd97 bl 10001190 +10005662: 0020 movs r0, r4 +10005664: 4910 ldr r1, [pc, #64] @ (100056a8 ) +10005666: f7fb feef bl 10001448 +1000566a: e7ed b.n 10005648 +1000566c: 0020 movs r0, r4 +1000566e: 490e ldr r1, [pc, #56] @ (100056a8 ) +10005670: f7fb fdc6 bl 10001200 +10005674: 2101 movs r1, #1 +10005676: 0020 movs r0, r4 +10005678: f7fb fd8a bl 10001190 +1000567c: 4643 mov r3, r8 +1000567e: 2250 movs r2, #80 @ 0x50 +10005680: 2138 movs r1, #56 @ 0x38 +10005682: 681b ldr r3, [r3, #0] +10005684: 639a str r2, [r3, #56] @ 0x38 +10005686: 6b5a ldr r2, [r3, #52] @ 0x34 +10005688: 3334 adds r3, #52 @ 0x34 +1000568a: 4011 ands r1, r2 +1000568c: 2280 movs r2, #128 @ 0x80 +1000568e: 0152 lsls r2, r2, #5 +10005690: 4313 orrs r3, r2 +10005692: 6019 str r1, [r3, #0] +10005694: e7d8 b.n 10005648 +10005696: 46c0 nop @ (mov r8, r8) +10005698: 20001d4c .word 0x20001d4c +1000569c: bffc8000 .word 0xbffc8000 +100056a0: 20001844 .word 0x20001844 +100056a4: 2000184c .word 0x2000184c +100056a8: 100055f9 .word 0x100055f9 + +100056ac : +100056ac: 4b0c ldr r3, [pc, #48] @ (100056e0 ) +100056ae: b510 push {r4, lr} +100056b0: 781b ldrb r3, [r3, #0] +100056b2: 4b0c ldr r3, [pc, #48] @ (100056e4 ) +100056b4: 4c0c ldr r4, [pc, #48] @ (100056e8 ) +100056b6: 781b ldrb r3, [r3, #0] +100056b8: 4b0c ldr r3, [pc, #48] @ (100056ec ) +100056ba: 2102 movs r1, #2 +100056bc: 2000 movs r0, #0 +100056be: 6023 str r3, [r4, #0] +100056c0: f7fb fc8c bl 10000fdc +100056c4: 2102 movs r1, #2 +100056c6: 2001 movs r0, #1 +100056c8: f7fb fc88 bl 10000fdc +100056cc: 21e1 movs r1, #225 @ 0xe1 +100056ce: 6820 ldr r0, [r4, #0] +100056d0: 0249 lsls r1, r1, #9 +100056d2: f7fc ff2f bl 10002534 +100056d6: 2101 movs r1, #1 +100056d8: 4805 ldr r0, [pc, #20] @ (100056f0 ) +100056da: f7ff fe89 bl 100053f0 +100056de: bd10 pop {r4, pc} +100056e0: 100081cc .word 0x100081cc +100056e4: 100081c8 .word 0x100081c8 +100056e8: 20001d4c .word 0x20001d4c +100056ec: 40034000 .word 0x40034000 +100056f0: 20000f40 .word 0x20000f40 + +100056f4 : +100056f4: 4770 bx lr +100056f6: 46c0 nop @ (mov r8, r8) + +100056f8 : +100056f8: 2200 movs r2, #0 +100056fa: 4b01 ldr r3, [pc, #4] @ (10005700 ) +100056fc: 701a strb r2, [r3, #0] +100056fe: 4770 bx lr +10005700: 20001d66 .word 0x20001d66 + +10005704 : +10005704: 794b ldrb r3, [r1, #5] +10005706: 2000 movs r0, #0 +10005708: 2bff cmp r3, #255 @ 0xff +1000570a: d10b bne.n 10005724 +1000570c: 798b ldrb r3, [r1, #6] +1000570e: 2b00 cmp r3, #0 +10005710: d108 bne.n 10005724 +10005712: 79cb ldrb r3, [r1, #7] +10005714: 2b01 cmp r3, #1 +10005716: d105 bne.n 10005724 +10005718: 2a08 cmp r2, #8 +1000571a: d903 bls.n 10005724 +1000571c: 4b02 ldr r3, [pc, #8] @ (10005728 ) +1000571e: 788a ldrb r2, [r1, #2] +10005720: 3009 adds r0, #9 +10005722: 701a strb r2, [r3, #0] +10005724: 4770 bx lr +10005726: 46c0 nop @ (mov r8, r8) +10005728: 20001d66 .word 0x20001d66 + +1000572c : +1000572c: 2001 movs r0, #1 +1000572e: 4770 bx lr + +10005730 : +10005730: b570 push {r4, r5, r6, lr} +10005732: 2901 cmp r1, #1 +10005734: d001 beq.n 1000573a +10005736: 2001 movs r0, #1 +10005738: bd70 pop {r4, r5, r6, pc} +1000573a: 4913 ldr r1, [pc, #76] @ (10005788 ) +1000573c: 7953 ldrb r3, [r2, #5] +1000573e: 7910 ldrb r0, [r2, #4] +10005740: 7809 ldrb r1, [r1, #0] +10005742: 021b lsls r3, r3, #8 +10005744: 4303 orrs r3, r0 +10005746: 2000 movs r0, #0 +10005748: 4299 cmp r1, r3 +1000574a: d1f5 bne.n 10005738 +1000574c: 7853 ldrb r3, [r2, #1] +1000574e: 2b01 cmp r3, #1 +10005750: d008 beq.n 10005764 +10005752: 2b02 cmp r3, #2 +10005754: d1f0 bne.n 10005738 +10005756: 2000 movs r0, #0 +10005758: 2264 movs r2, #100 @ 0x64 +1000575a: 2100 movs r1, #0 +1000575c: f7fd f974 bl 10002a48 +10005760: 2001 movs r0, #1 +10005762: e7e9 b.n 10005738 +10005764: 7894 ldrb r4, [r2, #2] +10005766: 78d2 ldrb r2, [r2, #3] +10005768: 0005 movs r5, r0 +1000576a: 0212 lsls r2, r2, #8 +1000576c: 4314 orrs r4, r2 +1000576e: 05d2 lsls r2, r2, #23 +10005770: d502 bpl.n 10005778 +10005772: 0a62 lsrs r2, r4, #9 +10005774: 4093 lsls r3, r2 +10005776: 001d movs r5, r3 +10005778: 4804 ldr r0, [pc, #16] @ (1000578c ) +1000577a: f7fe fe19 bl 100043b0 +1000577e: 217f movs r1, #127 @ 0x7f +10005780: 0003 movs r3, r0 +10005782: 4021 ands r1, r4 +10005784: 0028 movs r0, r5 +10005786: 4798 blx r3 +10005788: 20001d66 .word 0x20001d66 +1000578c: 00004255 .word 0x00004255 + +10005790 : +10005790: 2301 movs r3, #1 +10005792: 7003 strb r3, [r0, #0] +10005794: 4800 ldr r0, [pc, #0] @ (10005798 ) +10005796: 4770 bx lr +10005798: 10008064 .word 0x10008064 + +1000579c : +1000579c: 784b ldrb r3, [r1, #1] +1000579e: 780a ldrb r2, [r1, #0] +100057a0: 021b lsls r3, r3, #8 +100057a2: 4313 orrs r3, r2 +100057a4: 788a ldrb r2, [r1, #2] +100057a6: b510 push {r4, lr} +100057a8: 0412 lsls r2, r2, #16 +100057aa: 431a orrs r2, r3 +100057ac: 78cb ldrb r3, [r1, #3] +100057ae: 061b lsls r3, r3, #24 +100057b0: 4313 orrs r3, r2 +100057b2: 2296 movs r2, #150 @ 0x96 +100057b4: 00d2 lsls r2, r2, #3 +100057b6: 4293 cmp r3, r2 +100057b8: d000 beq.n 100057bc +100057ba: bd10 pop {r4, pc} +100057bc: 4803 ldr r0, [pc, #12] @ (100057cc ) +100057be: f7fe fdf7 bl 100043b0 +100057c2: 2100 movs r1, #0 +100057c4: 0003 movs r3, r0 +100057c6: 0008 movs r0, r1 +100057c8: 4798 blx r3 +100057ca: 46c0 nop @ (mov r8, r8) +100057cc: 00004255 .word 0x00004255 + +100057d0 : +100057d0: 4b02 ldr r3, [pc, #8] @ (100057dc ) +100057d2: 6018 str r0, [r3, #0] +100057d4: 4b02 ldr r3, [pc, #8] @ (100057e0 ) +100057d6: 6019 str r1, [r3, #0] +100057d8: 4770 bx lr +100057da: 46c0 nop @ (mov r8, r8) +100057dc: 20001848 .word 0x20001848 +100057e0: 20001850 .word 0x20001850 + +100057e4 : +100057e4: b510 push {r4, lr} +100057e6: 4b02 ldr r3, [pc, #8] @ (100057f0 ) +100057e8: 7818 ldrb r0, [r3, #0] +100057ea: f7fb fce3 bl 100011b4 +100057ee: bd10 pop {r4, pc} +100057f0: 20001d67 .word 0x20001d67 + +100057f4 : +100057f4: 4b11 ldr r3, [pc, #68] @ (1000583c ) +100057f6: b570 push {r4, r5, r6, lr} +100057f8: 681a ldr r2, [r3, #0] +100057fa: 2a00 cmp r2, #0 +100057fc: d01a beq.n 10005834 +100057fe: f3ef 8110 mrs r1, PRIMASK +10005802: b672 cpsid i +10005804: 6810 ldr r0, [r2, #0] +10005806: 2800 cmp r0, #0 +10005808: d0fc beq.n 10005804 +1000580a: f3bf 8f5f dmb sy +1000580e: 2000 movs r0, #0 +10005810: 4a0b ldr r2, [pc, #44] @ (10005840 ) +10005812: 6059 str r1, [r3, #4] +10005814: 7010 strb r0, [r2, #0] +10005816: 681b ldr r3, [r3, #0] +10005818: f3bf 8f5f dmb sy +1000581c: 6018 str r0, [r3, #0] +1000581e: f381 8810 msr PRIMASK, r1 +10005822: 2400 movs r4, #0 +10005824: 2500 movs r5, #0 +10005826: 4b07 ldr r3, [pc, #28] @ (10005844 ) +10005828: 7818 ldrb r0, [r3, #0] +1000582a: f7fb fcc3 bl 100011b4 +1000582e: 0029 movs r1, r5 +10005830: 0020 movs r0, r4 +10005832: bd70 pop {r4, r5, r6, pc} +10005834: 24fa movs r4, #250 @ 0xfa +10005836: 2500 movs r5, #0 +10005838: 00a4 lsls r4, r4, #2 +1000583a: e7f4 b.n 10005826 +1000583c: 20001d08 .word 0x20001d08 +10005840: 20001d68 .word 0x20001d68 +10005844: 20001d67 .word 0x20001d67 + +10005848 : +10005848: b570 push {r4, r5, r6, lr} +1000584a: 0004 movs r4, r0 +1000584c: 2000 movs r0, #0 +1000584e: 000e movs r6, r1 +10005850: f001 fae8 bl 10006e24 +10005854: 2800 cmp r0, #0 +10005856: d036 beq.n 100058c6 +10005858: 2000 movs r0, #0 +1000585a: f001 fafb bl 10006e54 +1000585e: 2800 cmp r0, #0 +10005860: d031 beq.n 100058c6 +10005862: f7fc fb7f bl 10001f64 +10005866: 2300 movs r3, #0 +10005868: 4a18 ldr r2, [pc, #96] @ (100058cc ) +1000586a: 1812 adds r2, r2, r0 +1000586c: 414b adcs r3, r1 +1000586e: 2180 movs r1, #128 @ 0x80 +10005870: 0609 lsls r1, r1, #24 +10005872: 428b cmp r3, r1 +10005874: d216 bcs.n 100058a4 +10005876: 4d16 ldr r5, [pc, #88] @ (100058d0 ) +10005878: 0028 movs r0, r5 +1000587a: f002 f9c9 bl 10007c10 <__mutex_try_enter_block_until_veneer> +1000587e: 2800 cmp r0, #0 +10005880: d021 beq.n 100058c6 +10005882: 2000 movs r0, #0 +10005884: f001 face bl 10006e24 +10005888: 2800 cmp r0, #0 +1000588a: d10f bne.n 100058ac +1000588c: 2001 movs r0, #1 +1000588e: 2100 movs r1, #0 +10005890: 4240 negs r0, r0 +10005892: f000 fcc1 bl 10006218 +10005896: 2403 movs r4, #3 +10005898: 4264 negs r4, r4 +1000589a: 0028 movs r0, r5 +1000589c: f002 f978 bl 10007b90 <__mutex_exit_veneer> +100058a0: 0020 movs r0, r4 +100058a2: bd70 pop {r4, r5, r6, pc} +100058a4: 2201 movs r2, #1 +100058a6: 4b0b ldr r3, [pc, #44] @ (100058d4 ) +100058a8: 4252 negs r2, r2 +100058aa: e7e4 b.n 10005876 +100058ac: 2000 movs r0, #0 +100058ae: f001 fad1 bl 10006e54 +100058b2: 2800 cmp r0, #0 +100058b4: d0ea beq.n 1000588c +100058b6: 0021 movs r1, r4 +100058b8: 0032 movs r2, r6 +100058ba: 2000 movs r0, #0 +100058bc: f001 fad6 bl 10006e6c +100058c0: 1e04 subs r4, r0, #0 +100058c2: d1ea bne.n 1000589a +100058c4: e7e7 b.n 10005896 +100058c6: 2403 movs r4, #3 +100058c8: 4264 negs r4, r4 +100058ca: e7e9 b.n 100058a0 +100058cc: 000f4240 .word 0x000f4240 +100058d0: 20001d30 .word 0x20001d30 +100058d4: 7fffffff .word 0x7fffffff + +100058d8 : +100058d8: b5f8 push {r3, r4, r5, r6, r7, lr} +100058da: 46de mov lr, fp +100058dc: 4657 mov r7, sl +100058de: b580 push {r7, lr} +100058e0: 0005 movs r5, r0 +100058e2: 000c movs r4, r1 +100058e4: f7fc fb3e bl 10001f64 +100058e8: 2300 movs r3, #0 +100058ea: 4a37 ldr r2, [pc, #220] @ (100059c8 ) +100058ec: 1812 adds r2, r2, r0 +100058ee: 414b adcs r3, r1 +100058f0: 2180 movs r1, #128 @ 0x80 +100058f2: 0609 lsls r1, r1, #24 +100058f4: 428b cmp r3, r1 +100058f6: d302 bcc.n 100058fe +100058f8: 2201 movs r2, #1 +100058fa: 4b34 ldr r3, [pc, #208] @ (100059cc ) +100058fc: 4252 negs r2, r2 +100058fe: 4934 ldr r1, [pc, #208] @ (100059d0 ) +10005900: 0008 movs r0, r1 +10005902: 468a mov sl, r1 +10005904: f002 f984 bl 10007c10 <__mutex_try_enter_block_until_veneer> +10005908: 2800 cmp r0, #0 +1000590a: d103 bne.n 10005914 +1000590c: bcc0 pop {r6, r7} +1000590e: 46bb mov fp, r7 +10005910: 46b2 mov sl, r6 +10005912: bdf8 pop {r3, r4, r5, r6, r7, pc} +10005914: 2000 movs r0, #0 +10005916: f001 fa85 bl 10006e24 +1000591a: 2800 cmp r0, #0 +1000591c: d04a beq.n 100059b4 +1000591e: 2600 movs r6, #0 +10005920: 2c00 cmp r4, #0 +10005922: dd43 ble.n 100059ac +10005924: 4b2b ldr r3, [pc, #172] @ (100059d4 ) +10005926: 469b mov fp, r3 +10005928: e014 b.n 10005954 +1000592a: 19a9 adds r1, r5, r6 +1000592c: 2000 movs r0, #0 +1000592e: f001 fb11 bl 10006f54 +10005932: 0007 movs r7, r0 +10005934: 2001 movs r0, #1 +10005936: 2100 movs r1, #0 +10005938: 4240 negs r0, r0 +1000593a: f000 fc6d bl 10006218 +1000593e: 2000 movs r0, #0 +10005940: f001 facc bl 10006edc +10005944: f7fc fb0e bl 10001f64 +10005948: 4b22 ldr r3, [pc, #136] @ (100059d4 ) +1000594a: 19f6 adds r6, r6, r7 +1000594c: 6018 str r0, [r3, #0] +1000594e: 6059 str r1, [r3, #4] +10005950: 42b4 cmp r4, r6 +10005952: dd2b ble.n 100059ac +10005954: 2000 movs r0, #0 +10005956: f001 fb17 bl 10006f88 +1000595a: 1ba7 subs r7, r4, r6 +1000595c: 0002 movs r2, r0 +1000595e: 42b8 cmp r0, r7 +10005960: dd00 ble.n 10005964 +10005962: 003a movs r2, r7 +10005964: 2a00 cmp r2, #0 +10005966: d1e0 bne.n 1000592a +10005968: 2001 movs r0, #1 +1000596a: 2100 movs r1, #0 +1000596c: 4240 negs r0, r0 +1000596e: f000 fc53 bl 10006218 +10005972: 2000 movs r0, #0 +10005974: f001 fab2 bl 10006edc +10005978: 2000 movs r0, #0 +1000597a: f001 fa53 bl 10006e24 +1000597e: 2800 cmp r0, #0 +10005980: d014 beq.n 100059ac +10005982: 2000 movs r0, #0 +10005984: f001 fb00 bl 10006f88 +10005988: 2800 cmp r0, #0 +1000598a: d1e1 bne.n 10005950 +1000598c: f7fc faea bl 10001f64 +10005990: 465b mov r3, fp +10005992: 000f movs r7, r1 +10005994: 681a ldr r2, [r3, #0] +10005996: 685b ldr r3, [r3, #4] +10005998: 2100 movs r1, #0 +1000599a: 4684 mov ip, r0 +1000599c: 480e ldr r0, [pc, #56] @ (100059d8 ) +1000599e: 1812 adds r2, r2, r0 +100059a0: 414b adcs r3, r1 +100059a2: 429f cmp r7, r3 +100059a4: d802 bhi.n 100059ac +100059a6: d1d3 bne.n 10005950 +100059a8: 4594 cmp ip, r2 +100059aa: d9d1 bls.n 10005950 +100059ac: 4650 mov r0, sl +100059ae: f002 f8ef bl 10007b90 <__mutex_exit_veneer> +100059b2: e7ab b.n 1000590c +100059b4: 2000 movs r0, #0 +100059b6: 2100 movs r1, #0 +100059b8: 4b06 ldr r3, [pc, #24] @ (100059d4 ) +100059ba: 6018 str r0, [r3, #0] +100059bc: 6059 str r1, [r3, #4] +100059be: 4650 mov r0, sl +100059c0: f002 f8e6 bl 10007b90 <__mutex_exit_veneer> +100059c4: e7a2 b.n 1000590c +100059c6: 46c0 nop @ (mov r8, r8) +100059c8: 000f4240 .word 0x000f4240 +100059cc: 7fffffff .word 0x7fffffff +100059d0: 20001d30 .word 0x20001d30 +100059d4: 200010e8 .word 0x200010e8 +100059d8: 0007a120 .word 0x0007a120 + +100059dc : +100059dc: b510 push {r4, lr} +100059de: 4c24 ldr r4, [pc, #144] @ (10005a70 ) +100059e0: b084 sub sp, #16 +100059e2: 2100 movs r1, #0 +100059e4: 0020 movs r0, r4 +100059e6: f002 f8eb bl 10007bc0 <__mutex_try_enter_veneer> +100059ea: 2800 cmp r0, #0 +100059ec: d11c bne.n 10005a28 +100059ee: 4b21 ldr r3, [pc, #132] @ (10005a74 ) +100059f0: 681a ldr r2, [r3, #0] +100059f2: 2a00 cmp r2, #0 +100059f4: d016 beq.n 10005a24 +100059f6: f3ef 8110 mrs r1, PRIMASK +100059fa: b672 cpsid i +100059fc: 6810 ldr r0, [r2, #0] +100059fe: 2800 cmp r0, #0 +10005a00: d0fc beq.n 100059fc +10005a02: f3bf 8f5f dmb sy +10005a06: 2401 movs r4, #1 +10005a08: 481b ldr r0, [pc, #108] @ (10005a78 ) +10005a0a: 6059 str r1, [r3, #4] +10005a0c: 7802 ldrb r2, [r0, #0] +10005a0e: 681b ldr r3, [r3, #0] +10005a10: b2d2 uxtb r2, r2 +10005a12: 7004 strb r4, [r0, #0] +10005a14: f3bf 8f5f dmb sy +10005a18: 2000 movs r0, #0 +10005a1a: 6018 str r0, [r3, #0] +10005a1c: f381 8810 msr PRIMASK, r1 +10005a20: 2a00 cmp r2, #0 +10005a22: d00a beq.n 10005a3a +10005a24: b004 add sp, #16 +10005a26: bd10 pop {r4, pc} +10005a28: 2001 movs r0, #1 +10005a2a: 2100 movs r1, #0 +10005a2c: 4240 negs r0, r0 +10005a2e: f000 fbf3 bl 10006218 +10005a32: 0020 movs r0, r4 +10005a34: f002 f8ac bl 10007b90 <__mutex_exit_veneer> +10005a38: e7f4 b.n 10005a24 +10005a3a: f7fc f86d bl 10001b18 +10005a3e: 0004 movs r4, r0 +10005a40: f7fc fa90 bl 10001f64 +10005a44: 22fa movs r2, #250 @ 0xfa +10005a46: 2300 movs r3, #0 +10005a48: 0092 lsls r2, r2, #2 +10005a4a: 1812 adds r2, r2, r0 +10005a4c: 414b adcs r3, r1 +10005a4e: 2180 movs r1, #128 @ 0x80 +10005a50: 0609 lsls r1, r1, #24 +10005a52: 428b cmp r3, r1 +10005a54: d302 bcc.n 10005a5c +10005a56: 2201 movs r2, #1 +10005a58: 4b08 ldr r3, [pc, #32] @ (10005a7c ) +10005a5a: 4252 negs r2, r2 +10005a5c: 2101 movs r1, #1 +10005a5e: 9102 str r1, [sp, #8] +10005a60: 2100 movs r1, #0 +10005a62: 9101 str r1, [sp, #4] +10005a64: 4906 ldr r1, [pc, #24] @ (10005a80 ) +10005a66: 0020 movs r0, r4 +10005a68: 9100 str r1, [sp, #0] +10005a6a: f7fc f859 bl 10001b20 +10005a6e: e7d9 b.n 10005a24 +10005a70: 20001d30 .word 0x20001d30 +10005a74: 20001d08 .word 0x20001d08 +10005a78: 20001d68 .word 0x20001d68 +10005a7c: 7fffffff .word 0x7fffffff +10005a80: 100057f5 .word 0x100057f5 + +10005a84 : +10005a84: 4b05 ldr r3, [pc, #20] @ (10005a9c ) +10005a86: b510 push {r4, lr} +10005a88: 6818 ldr r0, [r3, #0] +10005a8a: 2800 cmp r0, #0 +10005a8c: d004 beq.n 10005a98 +10005a8e: 4b04 ldr r3, [pc, #16] @ (10005aa0 ) +10005a90: 2200 movs r2, #0 +10005a92: 6819 ldr r1, [r3, #0] +10005a94: f001 f836 bl 10006b04 +10005a98: bd10 pop {r4, pc} +10005a9a: 46c0 nop @ (mov r8, r8) +10005a9c: 20001848 .word 0x20001848 +10005aa0: 20001850 .word 0x20001850 + +10005aa4 : +10005aa4: 23d0 movs r3, #208 @ 0xd0 +10005aa6: b510 push {r4, lr} +10005aa8: 061b lsls r3, r3, #24 +10005aaa: b084 sub sp, #16 +10005aac: 681c ldr r4, [r3, #0] +10005aae: f7fc f833 bl 10001b18 +10005ab2: f7fc f8f3 bl 10001c9c +10005ab6: 42a0 cmp r0, r4 +10005ab8: d002 beq.n 10005ac0 +10005aba: 2000 movs r0, #0 +10005abc: b004 add sp, #16 +10005abe: bd10 pop {r4, pc} +10005ac0: 4b27 ldr r3, [pc, #156] @ (10005b60 ) +10005ac2: 781b ldrb r3, [r3, #0] +10005ac4: f001 fc42 bl 1000734c +10005ac8: 4826 ldr r0, [pc, #152] @ (10005b64 ) +10005aca: f7fb fe29 bl 10001720 +10005ace: 2001 movs r0, #1 +10005ad0: f7fb fe08 bl 100016e4 +10005ad4: 23ff movs r3, #255 @ 0xff +10005ad6: 4c24 ldr r4, [pc, #144] @ (10005b68 ) +10005ad8: 4924 ldr r1, [pc, #144] @ (10005b6c ) +10005ada: 7020 strb r0, [r4, #0] +10005adc: 4018 ands r0, r3 +10005ade: f7fb fb8f bl 10001200 +10005ae2: 7820 ldrb r0, [r4, #0] +10005ae4: 2101 movs r1, #1 +10005ae6: f7fb fb53 bl 10001190 +10005aea: 2005 movs r0, #5 +10005aec: f7fb fb6a bl 100011c4 +10005af0: 2800 cmp r0, #0 +10005af2: d127 bne.n 10005b44 +10005af4: f7fc f810 bl 10001b18 +10005af8: 0004 movs r4, r0 +10005afa: f7fc fa33 bl 10001f64 +10005afe: 22fa movs r2, #250 @ 0xfa +10005b00: 2300 movs r3, #0 +10005b02: 0092 lsls r2, r2, #2 +10005b04: 1812 adds r2, r2, r0 +10005b06: 414b adcs r3, r1 +10005b08: 2180 movs r1, #128 @ 0x80 +10005b0a: 0609 lsls r1, r1, #24 +10005b0c: 428b cmp r3, r1 +10005b0e: d302 bcc.n 10005b16 +10005b10: 2201 movs r2, #1 +10005b12: 4b17 ldr r3, [pc, #92] @ (10005b70 ) +10005b14: 4252 negs r2, r2 +10005b16: 2101 movs r1, #1 +10005b18: 9102 str r1, [sp, #8] +10005b1a: 2100 movs r1, #0 +10005b1c: 9101 str r1, [sp, #4] +10005b1e: 4915 ldr r1, [pc, #84] @ (10005b74 ) +10005b20: 0020 movs r0, r4 +10005b22: 9100 str r1, [sp, #0] +10005b24: f7fb fffc bl 10001b20 +10005b28: 2208 movs r2, #8 +10005b2a: 0004 movs r4, r0 +10005b2c: 2100 movs r1, #0 +10005b2e: 4812 ldr r0, [pc, #72] @ (10005b78 ) +10005b30: f7ff fb1a bl 10005168 <__wrap_memset> +10005b34: 2c00 cmp r4, #0 +10005b36: dbc0 blt.n 10005aba +10005b38: 4810 ldr r0, [pc, #64] @ (10005b7c ) +10005b3a: 2101 movs r1, #1 +10005b3c: f7ff fc58 bl 100053f0 +10005b40: 2001 movs r0, #1 +10005b42: e7bb b.n 10005abc +10005b44: 2200 movs r2, #0 +10005b46: 490e ldr r1, [pc, #56] @ (10005b80 ) +10005b48: 2005 movs r0, #5 +10005b4a: f7fb fb83 bl 10001254 +10005b4e: f7fb fb01 bl 10001154 +10005b52: 4b09 ldr r3, [pc, #36] @ (10005b78 ) +10005b54: 0001 movs r1, r0 +10005b56: 0018 movs r0, r3 +10005b58: f7fb fe0c bl 10001774 +10005b5c: e7ec b.n 10005b38 +10005b5e: 46c0 nop @ (mov r8, r8) +10005b60: 100081d0 .word 0x100081d0 +10005b64: 20001d30 .word 0x20001d30 +10005b68: 20001d67 .word 0x20001d67 +10005b6c: 100059dd .word 0x100059dd +10005b70: 7fffffff .word 0x7fffffff +10005b74: 100057f5 .word 0x100057f5 +10005b78: 20001d08 .word 0x20001d08 +10005b7c: 20000f58 .word 0x20000f58 +10005b80: 100057e5 .word 0x100057e5 + +10005b84 : +10005b84: 4800 ldr r0, [pc, #0] @ (10005b88 ) +10005b86: 4770 bx lr +10005b88: 100080f4 .word 0x100080f4 + +10005b8c : +10005b8c: 4800 ldr r0, [pc, #0] @ (10005b90 ) +10005b8e: 4770 bx lr +10005b90: 100080a0 .word 0x100080a0 + +10005b94 : +10005b94: b510 push {r4, lr} +10005b96: 0004 movs r4, r0 +10005b98: 4817 ldr r0, [pc, #92] @ (10005bf8 ) +10005b9a: 7803 ldrb r3, [r0, #0] +10005b9c: 2b00 cmp r3, #0 +10005b9e: d020 beq.n 10005be2 +10005ba0: 2c00 cmp r4, #0 +10005ba2: d106 bne.n 10005bb2 +10005ba4: 4b15 ldr r3, [pc, #84] @ (10005bfc ) +10005ba6: 4816 ldr r0, [pc, #88] @ (10005c00 ) +10005ba8: 8043 strh r3, [r0, #2] +10005baa: 3b06 subs r3, #6 +10005bac: 3bff subs r3, #255 @ 0xff +10005bae: 8003 strh r3, [r0, #0] +10005bb0: bd10 pop {r4, pc} +10005bb2: 2c05 cmp r4, #5 +10005bb4: d819 bhi.n 10005bea +10005bb6: 4b13 ldr r3, [pc, #76] @ (10005c04 ) +10005bb8: 00a4 lsls r4, r4, #2 +10005bba: 58e0 ldr r0, [r4, r3] +10005bbc: 4912 ldr r1, [pc, #72] @ (10005c08 ) +10005bbe: 2301 movs r3, #1 +10005bc0: 3801 subs r0, #1 +10005bc2: e004 b.n 10005bce +10005bc4: 3301 adds r3, #1 +10005bc6: 800a strh r2, [r1, #0] +10005bc8: 3102 adds r1, #2 +10005bca: 2b14 cmp r3, #20 +10005bcc: d00f beq.n 10005bee +10005bce: 5cc2 ldrb r2, [r0, r3] +10005bd0: 2a00 cmp r2, #0 +10005bd2: d1f7 bne.n 10005bc4 +10005bd4: 22c0 movs r2, #192 @ 0xc0 +10005bd6: b2db uxtb r3, r3 +10005bd8: 005b lsls r3, r3, #1 +10005bda: 0092 lsls r2, r2, #2 +10005bdc: 4808 ldr r0, [pc, #32] @ (10005c00 ) +10005bde: 4313 orrs r3, r2 +10005be0: e7e5 b.n 10005bae +10005be2: 2111 movs r1, #17 +10005be4: f000 f81a bl 10005c1c +10005be8: e7da b.n 10005ba0 +10005bea: 2000 movs r0, #0 +10005bec: e7e0 b.n 10005bb0 +10005bee: 23ca movs r3, #202 @ 0xca +10005bf0: 4803 ldr r0, [pc, #12] @ (10005c00 ) +10005bf2: 009b lsls r3, r3, #2 +10005bf4: e7db b.n 10005bae +10005bf6: 46c0 nop @ (mov r8, r8) +10005bf8: 20001d50 .word 0x20001d50 +10005bfc: 00000409 .word 0x00000409 +10005c00: 20001898 .word 0x20001898 +10005c04: 10008088 .word 0x10008088 +10005c08: 2000189a .word 0x2000189a + +10005c0c <_retrieve_unique_id_on_boot>: +10005c0c: b510 push {r4, lr} +10005c0e: 4802 ldr r0, [pc, #8] @ (10005c18 <_retrieve_unique_id_on_boot+0xc>) +10005c10: f000 f8d8 bl 10005dc4 +10005c14: bd10 pop {r4, pc} +10005c16: 46c0 nop @ (mov r8, r8) +10005c18: 20001d20 .word 0x20001d20 + +10005c1c : +10005c1c: b530 push {r4, r5, lr} +10005c1e: 1e4b subs r3, r1, #1 +10005c20: 2901 cmp r1, #1 +10005c22: d100 bne.n 10005c26 +10005c24: e0a7 b.n 10005d76 +10005c26: 4a66 ldr r2, [pc, #408] @ (10005dc0 ) +10005c28: 7811 ldrb r1, [r2, #0] +10005c2a: 090d lsrs r5, r1, #4 +10005c2c: 002c movs r4, r5 +10005c2e: 3430 adds r4, #48 @ 0x30 +10005c30: 299f cmp r1, #159 @ 0x9f +10005c32: d900 bls.n 10005c36 +10005c34: e0a2 b.n 10005d7c +10005c36: 7004 strb r4, [r0, #0] +10005c38: 2b01 cmp r3, #1 +10005c3a: d100 bne.n 10005c3e +10005c3c: e0be b.n 10005dbc +10005c3e: 210f movs r1, #15 +10005c40: 7814 ldrb r4, [r2, #0] +10005c42: 4021 ands r1, r4 +10005c44: 000c movs r4, r1 +10005c46: 3430 adds r4, #48 @ 0x30 +10005c48: 2909 cmp r1, #9 +10005c4a: d900 bls.n 10005c4e +10005c4c: e098 b.n 10005d80 +10005c4e: 7044 strb r4, [r0, #1] +10005c50: 2b02 cmp r3, #2 +10005c52: d100 bne.n 10005c56 +10005c54: e0b2 b.n 10005dbc +10005c56: 7854 ldrb r4, [r2, #1] +10005c58: 0925 lsrs r5, r4, #4 +10005c5a: 0029 movs r1, r5 +10005c5c: 3130 adds r1, #48 @ 0x30 +10005c5e: 2c9f cmp r4, #159 @ 0x9f +10005c60: d900 bls.n 10005c64 +10005c62: e090 b.n 10005d86 +10005c64: 7081 strb r1, [r0, #2] +10005c66: 2b03 cmp r3, #3 +10005c68: d100 bne.n 10005c6c +10005c6a: e0a7 b.n 10005dbc +10005c6c: 210f movs r1, #15 +10005c6e: 4021 ands r1, r4 +10005c70: 000c movs r4, r1 +10005c72: 3430 adds r4, #48 @ 0x30 +10005c74: 2909 cmp r1, #9 +10005c76: d900 bls.n 10005c7a +10005c78: e087 b.n 10005d8a +10005c7a: 70c4 strb r4, [r0, #3] +10005c7c: 2b04 cmp r3, #4 +10005c7e: d100 bne.n 10005c82 +10005c80: e09c b.n 10005dbc +10005c82: 7894 ldrb r4, [r2, #2] +10005c84: 0925 lsrs r5, r4, #4 +10005c86: 0029 movs r1, r5 +10005c88: 3130 adds r1, #48 @ 0x30 +10005c8a: 2c9f cmp r4, #159 @ 0x9f +10005c8c: d900 bls.n 10005c90 +10005c8e: e07f b.n 10005d90 +10005c90: 7101 strb r1, [r0, #4] +10005c92: 2b05 cmp r3, #5 +10005c94: d100 bne.n 10005c98 +10005c96: e091 b.n 10005dbc +10005c98: 210f movs r1, #15 +10005c9a: 4021 ands r1, r4 +10005c9c: 000c movs r4, r1 +10005c9e: 3430 adds r4, #48 @ 0x30 +10005ca0: 2909 cmp r1, #9 +10005ca2: d900 bls.n 10005ca6 +10005ca4: e076 b.n 10005d94 +10005ca6: 7144 strb r4, [r0, #5] +10005ca8: 2b06 cmp r3, #6 +10005caa: d100 bne.n 10005cae +10005cac: e086 b.n 10005dbc +10005cae: 78d4 ldrb r4, [r2, #3] +10005cb0: 0925 lsrs r5, r4, #4 +10005cb2: 0029 movs r1, r5 +10005cb4: 3130 adds r1, #48 @ 0x30 +10005cb6: 2c9f cmp r4, #159 @ 0x9f +10005cb8: d900 bls.n 10005cbc +10005cba: e06e b.n 10005d9a +10005cbc: 7181 strb r1, [r0, #6] +10005cbe: 2b07 cmp r3, #7 +10005cc0: d100 bne.n 10005cc4 +10005cc2: e07b b.n 10005dbc +10005cc4: 210f movs r1, #15 +10005cc6: 4021 ands r1, r4 +10005cc8: 000c movs r4, r1 +10005cca: 3430 adds r4, #48 @ 0x30 +10005ccc: 2909 cmp r1, #9 +10005cce: d866 bhi.n 10005d9e +10005cd0: 71c4 strb r4, [r0, #7] +10005cd2: 2b08 cmp r3, #8 +10005cd4: d100 bne.n 10005cd8 +10005cd6: e071 b.n 10005dbc +10005cd8: 7914 ldrb r4, [r2, #4] +10005cda: 0925 lsrs r5, r4, #4 +10005cdc: 0029 movs r1, r5 +10005cde: 3130 adds r1, #48 @ 0x30 +10005ce0: 2c9f cmp r4, #159 @ 0x9f +10005ce2: d85f bhi.n 10005da4 +10005ce4: 7201 strb r1, [r0, #8] +10005ce6: 2b09 cmp r3, #9 +10005ce8: d068 beq.n 10005dbc +10005cea: 210f movs r1, #15 +10005cec: 4021 ands r1, r4 +10005cee: 000c movs r4, r1 +10005cf0: 3430 adds r4, #48 @ 0x30 +10005cf2: 2909 cmp r1, #9 +10005cf4: d858 bhi.n 10005da8 +10005cf6: 7244 strb r4, [r0, #9] +10005cf8: 2b0a cmp r3, #10 +10005cfa: d05f beq.n 10005dbc +10005cfc: 7954 ldrb r4, [r2, #5] +10005cfe: 0925 lsrs r5, r4, #4 +10005d00: 0029 movs r1, r5 +10005d02: 3130 adds r1, #48 @ 0x30 +10005d04: 2c9f cmp r4, #159 @ 0x9f +10005d06: d852 bhi.n 10005dae +10005d08: 7281 strb r1, [r0, #10] +10005d0a: 2b0b cmp r3, #11 +10005d0c: d056 beq.n 10005dbc +10005d0e: 210f movs r1, #15 +10005d10: 4021 ands r1, r4 +10005d12: 000c movs r4, r1 +10005d14: 3430 adds r4, #48 @ 0x30 +10005d16: 2909 cmp r1, #9 +10005d18: d84b bhi.n 10005db2 +10005d1a: 72c4 strb r4, [r0, #11] +10005d1c: 2b0c cmp r3, #12 +10005d1e: d04d beq.n 10005dbc +10005d20: 7994 ldrb r4, [r2, #6] +10005d22: 0925 lsrs r5, r4, #4 +10005d24: 0029 movs r1, r5 +10005d26: 3130 adds r1, #48 @ 0x30 +10005d28: 2c9f cmp r4, #159 @ 0x9f +10005d2a: d900 bls.n 10005d2e +10005d2c: 3107 adds r1, #7 +10005d2e: 7301 strb r1, [r0, #12] +10005d30: 2b0d cmp r3, #13 +10005d32: d043 beq.n 10005dbc +10005d34: 210f movs r1, #15 +10005d36: 4021 ands r1, r4 +10005d38: 000c movs r4, r1 +10005d3a: 3430 adds r4, #48 @ 0x30 +10005d3c: 2909 cmp r1, #9 +10005d3e: d901 bls.n 10005d44 +10005d40: 3137 adds r1, #55 @ 0x37 +10005d42: 000c movs r4, r1 +10005d44: 7344 strb r4, [r0, #13] +10005d46: 2b0e cmp r3, #14 +10005d48: d038 beq.n 10005dbc +10005d4a: 79d1 ldrb r1, [r2, #7] +10005d4c: 090c lsrs r4, r1, #4 +10005d4e: 0022 movs r2, r4 +10005d50: 3230 adds r2, #48 @ 0x30 +10005d52: 299f cmp r1, #159 @ 0x9f +10005d54: d900 bls.n 10005d58 +10005d56: 3207 adds r2, #7 +10005d58: 7382 strb r2, [r0, #14] +10005d5a: 2b0f cmp r3, #15 +10005d5c: d02e beq.n 10005dbc +10005d5e: 220f movs r2, #15 +10005d60: 400a ands r2, r1 +10005d62: 0011 movs r1, r2 +10005d64: 3137 adds r1, #55 @ 0x37 +10005d66: 2a09 cmp r2, #9 +10005d68: d801 bhi.n 10005d6e +10005d6a: 3230 adds r2, #48 @ 0x30 +10005d6c: 0011 movs r1, r2 +10005d6e: 73c1 strb r1, [r0, #15] +10005d70: 2b10 cmp r3, #16 +10005d72: d023 beq.n 10005dbc +10005d74: 3010 adds r0, #16 +10005d76: 2300 movs r3, #0 +10005d78: 7003 strb r3, [r0, #0] +10005d7a: bd30 pop {r4, r5, pc} +10005d7c: 3407 adds r4, #7 +10005d7e: e75a b.n 10005c36 +10005d80: 3137 adds r1, #55 @ 0x37 +10005d82: 000c movs r4, r1 +10005d84: e763 b.n 10005c4e +10005d86: 3107 adds r1, #7 +10005d88: e76c b.n 10005c64 +10005d8a: 3137 adds r1, #55 @ 0x37 +10005d8c: 000c movs r4, r1 +10005d8e: e774 b.n 10005c7a +10005d90: 3107 adds r1, #7 +10005d92: e77d b.n 10005c90 +10005d94: 3137 adds r1, #55 @ 0x37 +10005d96: 000c movs r4, r1 +10005d98: e785 b.n 10005ca6 +10005d9a: 3107 adds r1, #7 +10005d9c: e78e b.n 10005cbc +10005d9e: 3137 adds r1, #55 @ 0x37 +10005da0: 000c movs r4, r1 +10005da2: e795 b.n 10005cd0 +10005da4: 3107 adds r1, #7 +10005da6: e79d b.n 10005ce4 +10005da8: 3137 adds r1, #55 @ 0x37 +10005daa: 000c movs r4, r1 +10005dac: e7a3 b.n 10005cf6 +10005dae: 3107 adds r1, #7 +10005db0: e7aa b.n 10005d08 +10005db2: 3137 adds r1, #55 @ 0x37 +10005db4: 000c movs r4, r1 +10005db6: 72c4 strb r4, [r0, #11] +10005db8: 2b0c cmp r3, #12 +10005dba: d1b1 bne.n 10005d20 +10005dbc: 18c0 adds r0, r0, r3 +10005dbe: e7da b.n 10005d76 +10005dc0: 20001d20 .word 0x20001d20 + +10005dc4 : +10005dc4: b510 push {r4, lr} +10005dc6: b088 sub sp, #32 +10005dc8: 0004 movs r4, r0 +10005dca: 220d movs r2, #13 +10005dcc: 2100 movs r1, #0 +10005dce: 4668 mov r0, sp +10005dd0: f7ff f9ca bl 10005168 <__wrap_memset> +10005dd4: 220d movs r2, #13 +10005dd6: 2100 movs r1, #0 +10005dd8: a804 add r0, sp, #16 +10005dda: f7ff f9c5 bl 10005168 <__wrap_memset> +10005dde: 234b movs r3, #75 @ 0x4b +10005de0: 466a mov r2, sp +10005de2: 4668 mov r0, sp +10005de4: 7013 strb r3, [r2, #0] +10005de6: a904 add r1, sp, #16 +10005de8: 220d movs r2, #13 +10005dea: f001 fec9 bl 10007b80 <__flash_do_cmd_veneer> +10005dee: 2115 movs r1, #21 +10005df0: 2208 movs r2, #8 +10005df2: 0020 movs r0, r4 +10005df4: 4469 add r1, sp +10005df6: f7ff f9bd bl 10005174 <__wrap___aeabi_memcpy> +10005dfa: b008 add sp, #32 +10005dfc: bd10 pop {r4, pc} +10005dfe: 46c0 nop @ (mov r8, r8) + +10005e00 : +10005e00: b510 push {r4, lr} +10005e02: 2101 movs r1, #1 +10005e04: 2005 movs r0, #5 +10005e06: f7fb f9c3 bl 10001190 +10005e0a: bd10 pop {r4, pc} + +10005e0c : +10005e0c: b510 push {r4, lr} +10005e0e: 2200 movs r2, #0 +10005e10: 2100 movs r1, #0 +10005e12: 4802 ldr r0, [pc, #8] @ (10005e1c ) +10005e14: f000 f958 bl 100060c8 +10005e18: bd10 pop {r4, pc} +10005e1a: 46c0 nop @ (mov r8, r8) +10005e1c: 200018ec .word 0x200018ec + +10005e20 : +10005e20: 2280 movs r2, #128 @ 0x80 +10005e22: 4b02 ldr r3, [pc, #8] @ (10005e2c ) +10005e24: 0252 lsls r2, r2, #9 +10005e26: 64da str r2, [r3, #76] @ 0x4c +10005e28: 4770 bx lr +10005e2a: 46c0 nop @ (mov r8, r8) +10005e2c: 50112000 .word 0x50112000 + +10005e30 : +10005e30: b5f0 push {r4, r5, r6, r7, lr} +10005e32: 46c6 mov lr, r8 +10005e34: b500 push {lr} +10005e36: 0006 movs r6, r0 +10005e38: f000 f920 bl 1000607c +10005e3c: 230c movs r3, #12 +10005e3e: 4d1b ldr r5, [pc, #108] @ (10005eac ) +10005e40: 22ff movs r2, #255 @ 0xff +10005e42: 67ab str r3, [r5, #120] @ 0x78 +10005e44: 2005 movs r0, #5 +10005e46: 491a ldr r1, [pc, #104] @ (10005eb0 ) +10005e48: f7fb fa04 bl 10001254 +10005e4c: 2340 movs r3, #64 @ 0x40 +10005e4e: 4698 mov r8, r3 +10005e50: 4c18 ldr r4, [pc, #96] @ (10005eb4 ) +10005e52: 2240 movs r2, #64 @ 0x40 +10005e54: 2100 movs r1, #0 +10005e56: 0020 movs r0, r4 +10005e58: f7ff f986 bl 10005168 <__wrap_memset> +10005e5c: 4643 mov r3, r8 +10005e5e: 2701 movs r7, #1 +10005e60: 8323 strh r3, [r4, #24] +10005e62: 2121 movs r1, #33 @ 0x21 +10005e64: 2300 movs r3, #0 +10005e66: 4a14 ldr r2, [pc, #80] @ (10005eb8 ) +10005e68: 7067 strb r7, [r4, #1] +10005e6a: 60a2 str r2, [r4, #8] +10005e6c: 6013 str r3, [r2, #0] +10005e6e: 5463 strb r3, [r4, r1] +10005e70: 315f adds r1, #95 @ 0x5f +10005e72: 8461 strh r1, [r4, #34] @ 0x22 +10005e74: 4641 mov r1, r8 +10005e76: 8721 strh r1, [r4, #56] @ 0x38 +10005e78: 3905 subs r1, #5 +10005e7a: 5463 strb r3, [r4, r1] +10005e7c: 4a0f ldr r2, [pc, #60] @ (10005ebc ) +10005e7e: 4910 ldr r1, [pc, #64] @ (10005ec0 ) +10005e80: 6063 str r3, [r4, #4] +10005e82: 60e2 str r2, [r4, #12] +10005e84: 62a1 str r1, [r4, #40] @ 0x28 +10005e86: 600b str r3, [r1, #0] +10005e88: 6263 str r3, [r4, #36] @ 0x24 +10005e8a: 62e2 str r2, [r4, #44] @ 0x2c +10005e8c: f001 fed0 bl 10007c30 <__reset_non_control_endpoints_veneer> +10005e90: 2380 movs r3, #128 @ 0x80 +10005e92: 059b lsls r3, r3, #22 +10005e94: 642f str r7, [r5, #64] @ 0x40 +10005e96: 64eb str r3, [r5, #76] @ 0x4c +10005e98: 2390 movs r3, #144 @ 0x90 +10005e9a: 4a0a ldr r2, [pc, #40] @ (10005ec4 ) +10005e9c: 0030 movs r0, r6 +10005e9e: 50ea str r2, [r5, r3] +10005ea0: f7ff ffbe bl 10005e20 +10005ea4: bc80 pop {r7} +10005ea6: 46b8 mov r8, r7 +10005ea8: bdf0 pop {r4, r5, r6, r7, pc} +10005eaa: 46c0 nop @ (mov r8, r8) +10005eac: 50110000 .word 0x50110000 +10005eb0: 200004a1 .word 0x200004a1 +10005eb4: 200018cc .word 0x200018cc +10005eb8: 50100084 .word 0x50100084 +10005ebc: 50100100 .word 0x50100100 +10005ec0: 50100080 .word 0x50100080 +10005ec4: 0001d010 .word 0x0001d010 + +10005ec8 : +10005ec8: 780b ldrb r3, [r1, #0] +10005eca: 065b lsls r3, r3, #25 +10005ecc: d102 bne.n 10005ed4 +10005ece: 784b ldrb r3, [r1, #1] +10005ed0: 2b05 cmp r3, #5 +10005ed2: d000 beq.n 10005ed6 +10005ed4: 4770 bx lr +10005ed6: 788a ldrb r2, [r1, #2] +10005ed8: 4b01 ldr r3, [pc, #4] @ (10005ee0 ) +10005eda: 601a str r2, [r3, #0] +10005edc: e7fa b.n 10005ed4 +10005ede: 46c0 nop @ (mov r8, r8) +10005ee0: 50110000 .word 0x50110000 + +10005ee4 : +10005ee4: b5f0 push {r4, r5, r6, r7, lr} +10005ee6: 46c6 mov lr, r8 +10005ee8: b500 push {lr} +10005eea: 78cc ldrb r4, [r1, #3] +10005eec: 7888 ldrb r0, [r1, #2] +10005eee: 790a ldrb r2, [r1, #4] +10005ef0: 794b ldrb r3, [r1, #5] +10005ef2: 217f movs r1, #127 @ 0x7f +10005ef4: 07a4 lsls r4, r4, #30 +10005ef6: 4001 ands r1, r0 +10005ef8: 021b lsls r3, r3, #8 +10005efa: 09c5 lsrs r5, r0, #7 +10005efc: 4313 orrs r3, r2 +10005efe: 004f lsls r7, r1, #1 +10005f00: 0fa2 lsrs r2, r4, #30 +10005f02: 0014 movs r4, r2 +10005f04: 4e32 ldr r6, [pc, #200] @ (10005fd0 ) +10005f06: 197a adds r2, r7, r5 +10005f08: 0152 lsls r2, r2, #5 +10005f0a: 18b2 adds r2, r6, r2 +10005f0c: 7090 strb r0, [r2, #2] +10005f0e: 2001 movs r0, #1 +10005f10: 4068 eors r0, r5 +10005f12: 7050 strb r0, [r2, #1] +10005f14: 2000 movs r0, #0 +10005f16: 055b lsls r3, r3, #21 +10005f18: 0d5b lsrs r3, r3, #21 +10005f1a: 70d0 strb r0, [r2, #3] +10005f1c: 8313 strh r3, [r2, #24] +10005f1e: 76d4 strb r4, [r2, #27] +10005f20: 4680 mov r8, r0 +10005f22: 00ca lsls r2, r1, #3 +10005f24: 2d01 cmp r5, #1 +10005f26: d033 beq.n 10005f90 +10005f28: 482a ldr r0, [pc, #168] @ (10005fd4 ) +10005f2a: 4684 mov ip, r0 +10005f2c: 0188 lsls r0, r1, #6 +10005f2e: 4462 add r2, ip +10005f30: 4684 mov ip, r0 +10005f32: 44b4 add ip, r6 +10005f34: 4660 mov r0, ip +10005f36: 6082 str r2, [r0, #8] +10005f38: 4640 mov r0, r8 +10005f3a: 6010 str r0, [r2, #0] +10005f3c: 2900 cmp r1, #0 +10005f3e: d033 beq.n 10005fa8 +10005f40: 4a25 ldr r2, [pc, #148] @ (10005fd8 ) +10005f42: 00c9 lsls r1, r1, #3 +10005f44: 4690 mov r8, r2 +10005f46: 4662 mov r2, ip +10005f48: 4441 add r1, r8 +10005f4a: 6051 str r1, [r2, #4] +10005f4c: 223f movs r2, #63 @ 0x3f +10005f4e: 333f adds r3, #63 @ 0x3f +10005f50: 4393 bics r3, r2 +10005f52: 2c02 cmp r4, #2 +10005f54: d100 bne.n 10005f58 +10005f56: 005b lsls r3, r3, #1 +10005f58: 4820 ldr r0, [pc, #128] @ (10005fdc ) +10005f5a: 197a adds r2, r7, r5 +10005f5c: 6801 ldr r1, [r0, #0] +10005f5e: 0152 lsls r2, r2, #5 +10005f60: 18b2 adds r2, r6, r2 +10005f62: 60d1 str r1, [r2, #12] +10005f64: 4a1e ldr r2, [pc, #120] @ (10005fe0 ) +10005f66: 18cb adds r3, r1, r3 +10005f68: 6003 str r3, [r0, #0] +10005f6a: 4051 eors r1, r2 +10005f6c: 405a eors r2, r3 +10005f6e: 2380 movs r3, #128 @ 0x80 +10005f70: 4688 mov r8, r1 +10005f72: 015b lsls r3, r3, #5 +10005f74: 429a cmp r2, r3 +10005f76: d828 bhi.n 10005fca +10005f78: 4643 mov r3, r8 +10005f7a: 06a4 lsls r4, r4, #26 +10005f7c: 431c orrs r4, r3 +10005f7e: 2380 movs r3, #128 @ 0x80 +10005f80: 197f adds r7, r7, r5 +10005f82: 017f lsls r7, r7, #5 +10005f84: 19f6 adds r6, r6, r7 +10005f86: 6872 ldr r2, [r6, #4] +10005f88: 061b lsls r3, r3, #24 +10005f8a: 4323 orrs r3, r4 +10005f8c: 6013 str r3, [r2, #0] +10005f8e: e011 b.n 10005fb4 +10005f90: 4814 ldr r0, [pc, #80] @ (10005fe4 ) +10005f92: 4684 mov ip, r0 +10005f94: 0188 lsls r0, r1, #6 +10005f96: 4462 add r2, ip +10005f98: 4684 mov ip, r0 +10005f9a: 44b4 add ip, r6 +10005f9c: 4660 mov r0, ip +10005f9e: 6282 str r2, [r0, #40] @ 0x28 +10005fa0: 4640 mov r0, r8 +10005fa2: 6010 str r0, [r2, #0] +10005fa4: 2900 cmp r1, #0 +10005fa6: d109 bne.n 10005fbc +10005fa8: 2300 movs r3, #0 +10005faa: 016d lsls r5, r5, #5 +10005fac: 1975 adds r5, r6, r5 +10005fae: 606b str r3, [r5, #4] +10005fb0: 4b0d ldr r3, [pc, #52] @ (10005fe8 ) +10005fb2: 60eb str r3, [r5, #12] +10005fb4: 2001 movs r0, #1 +10005fb6: bc80 pop {r7} +10005fb8: 46b8 mov r8, r7 +10005fba: bdf0 pop {r4, r5, r6, r7, pc} +10005fbc: 4a08 ldr r2, [pc, #32] @ (10005fe0 ) +10005fbe: 00c9 lsls r1, r1, #3 +10005fc0: 4690 mov r8, r2 +10005fc2: 4662 mov r2, ip +10005fc4: 4441 add r1, r8 +10005fc6: 6251 str r1, [r2, #36] @ 0x24 +10005fc8: e7c0 b.n 10005f4c +10005fca: f7fc fe35 bl 10002c38 +10005fce: e7d3 b.n 10005f78 +10005fd0: 200018cc .word 0x200018cc +10005fd4: 50100084 .word 0x50100084 +10005fd8: 50100004 .word 0x50100004 +10005fdc: 20001cec .word 0x20001cec +10005fe0: 50100000 .word 0x50100000 +10005fe4: 50100080 .word 0x50100080 +10005fe8: 50100100 .word 0x50100100 + +10005fec : +10005fec: b510 push {r4, lr} +10005fee: f001 fe1f bl 10007c30 <__reset_non_control_endpoints_veneer> +10005ff2: bd10 pop {r4, pc} + +10005ff4 : +10005ff4: b510 push {r4, lr} +10005ff6: 207f movs r0, #127 @ 0x7f +10005ff8: 000c movs r4, r1 +10005ffa: 4020 ands r0, r4 +10005ffc: 0040 lsls r0, r0, #1 +10005ffe: 09e4 lsrs r4, r4, #7 +10006000: 0011 movs r1, r2 +10006002: 1900 adds r0, r0, r4 +10006004: 001a movs r2, r3 +10006006: 4b03 ldr r3, [pc, #12] @ (10006014 ) +10006008: 0140 lsls r0, r0, #5 +1000600a: 18c0 adds r0, r0, r3 +1000600c: f000 f85c bl 100060c8 +10006010: 2001 movs r0, #1 +10006012: bd10 pop {r4, pc} +10006014: 200018cc .word 0x200018cc + +10006018 : +10006018: 237f movs r3, #127 @ 0x7f +1000601a: 0018 movs r0, r3 +1000601c: b510 push {r4, lr} +1000601e: 4008 ands r0, r1 +10006020: 09ca lsrs r2, r1, #7 +10006022: 420b tst r3, r1 +10006024: d103 bne.n 1000602e +10006026: 4907 ldr r1, [pc, #28] @ (10006044 ) +10006028: 3b7d subs r3, #125 @ 0x7d +1000602a: 1a9b subs r3, r3, r2 +1000602c: 668b str r3, [r1, #104] @ 0x68 +1000602e: 0040 lsls r0, r0, #1 +10006030: 1880 adds r0, r0, r2 +10006032: 2280 movs r2, #128 @ 0x80 +10006034: 4b04 ldr r3, [pc, #16] @ (10006048 ) +10006036: 0140 lsls r0, r0, #5 +10006038: 2100 movs r1, #0 +1000603a: 18c0 adds r0, r0, r3 +1000603c: 0112 lsls r2, r2, #4 +1000603e: f001 fdff bl 10007c40 <___hw_endpoint_buffer_control_update32_veneer> +10006042: bd10 pop {r4, pc} +10006044: 50112000 .word 0x50112000 +10006048: 200018cc .word 0x200018cc + +1000604c : +1000604c: 227f movs r2, #127 @ 0x7f +1000604e: 0013 movs r3, r2 10006050: b510 push {r4, lr} -10006052: 2214 movs r2, #20 -10006054: 2100 movs r1, #0 -10006056: 4802 ldr r0, [pc, #8] @ (10006060 ) -10006058: f7fe fa34 bl 100044c4 <__wrap_memset> -1000605c: bd10 pop {r4, pc} -1000605e: 46c0 nop @ (mov r8, r8) -10006060: 200014f4 .word 0x200014f4 - -10006064 : -10006064: 4b01 ldr r3, [pc, #4] @ (1000606c ) -10006066: 6118 str r0, [r3, #16] -10006068: 4770 bx lr -1000606a: 46c0 nop @ (mov r8, r8) -1000606c: 200014f4 .word 0x200014f4 - -10006070 : -10006070: b510 push {r4, lr} -10006072: 4c05 ldr r4, [pc, #20] @ (10006088 ) -10006074: 0001 movs r1, r0 -10006076: 2208 movs r2, #8 -10006078: 0020 movs r0, r4 -1000607a: f7fe fa29 bl 100044d0 <__wrap___aeabi_memcpy> -1000607e: 2300 movs r3, #0 -10006080: 60a3 str r3, [r4, #8] -10006082: 60e3 str r3, [r4, #12] -10006084: bd10 pop {r4, pc} -10006086: 46c0 nop @ (mov r8, r8) -10006088: 200014f4 .word 0x200014f4 - -1000608c : -1000608c: b570 push {r4, r5, r6, lr} -1000608e: 4c39 ldr r4, [pc, #228] @ (10006174 ) -10006090: 001d movs r5, r3 -10006092: 7823 ldrb r3, [r4, #0] -10006094: 0006 movs r6, r0 -10006096: 09da lsrs r2, r3, #7 -10006098: 09c9 lsrs r1, r1, #7 -1000609a: 428a cmp r2, r1 -1000609c: d013 beq.n 100060c6 -1000609e: 2000 movs r0, #0 -100060a0: 2d00 cmp r5, #0 -100060a2: d000 beq.n 100060a6 -100060a4: bd70 pop {r4, r5, r6, pc} -100060a6: 4b34 ldr r3, [pc, #208] @ (10006178 ) -100060a8: 2b00 cmp r3, #0 -100060aa: d003 beq.n 100060b4 -100060ac: 0021 movs r1, r4 -100060ae: 0030 movs r0, r6 -100060b0: f7ff f8b8 bl 10005224 -100060b4: 6923 ldr r3, [r4, #16] -100060b6: 2b00 cmp r3, #0 -100060b8: d003 beq.n 100060c2 -100060ba: 0022 movs r2, r4 -100060bc: 2103 movs r1, #3 -100060be: 0030 movs r0, r6 -100060c0: 4798 blx r3 -100060c2: 2001 movs r0, #1 -100060c4: e7ee b.n 100060a4 -100060c6: 68a0 ldr r0, [r4, #8] -100060c8: 2b7f cmp r3, #127 @ 0x7f -100060ca: d805 bhi.n 100060d8 -100060cc: 2800 cmp r0, #0 -100060ce: d034 beq.n 1000613a -100060d0: 002a movs r2, r5 -100060d2: 492a ldr r1, [pc, #168] @ (1000617c ) -100060d4: f7fe f9fc bl 100044d0 <__wrap___aeabi_memcpy> -100060d8: 89e2 ldrh r2, [r4, #14] -100060da: 68a1 ldr r1, [r4, #8] -100060dc: 1952 adds r2, r2, r5 -100060de: 88e3 ldrh r3, [r4, #6] -100060e0: b292 uxth r2, r2 -100060e2: 1949 adds r1, r1, r5 -100060e4: 81e2 strh r2, [r4, #14] -100060e6: 60a1 str r1, [r4, #8] -100060e8: 4293 cmp r3, r2 -100060ea: d014 beq.n 10006116 -100060ec: 2d3f cmp r5, #63 @ 0x3f -100060ee: d912 bls.n 10006116 -100060f0: 89a3 ldrh r3, [r4, #12] -100060f2: 1a98 subs r0, r3, r2 -100060f4: 1c05 adds r5, r0, #0 -100060f6: b280 uxth r0, r0 -100060f8: 2840 cmp r0, #64 @ 0x40 -100060fa: d82a bhi.n 10006152 -100060fc: 7820 ldrb r0, [r4, #0] -100060fe: b2ad uxth r5, r5 -10006100: 287f cmp r0, #127 @ 0x7f -10006102: d828 bhi.n 10006156 -10006104: 2100 movs r1, #0 -10006106: 429a cmp r2, r3 -10006108: d032 beq.n 10006170 -1000610a: 4a1c ldr r2, [pc, #112] @ (1000617c ) -1000610c: 002b movs r3, r5 -1000610e: 0030 movs r0, r6 -10006110: f7ff ff0c bl 10005f2c -10006114: e7c6 b.n 100060a4 -10006116: 6923 ldr r3, [r4, #16] -10006118: 2b00 cmp r3, #0 -1000611a: d005 beq.n 10006128 -1000611c: 0022 movs r2, r4 -1000611e: 2102 movs r1, #2 -10006120: 0030 movs r0, r6 -10006122: 4798 blx r3 -10006124: 2800 cmp r0, #0 -10006126: d00a beq.n 1000613e -10006128: 2180 movs r1, #128 @ 0x80 -1000612a: 7823 ldrb r3, [r4, #0] -1000612c: 2200 movs r2, #0 -1000612e: 4399 bics r1, r3 -10006130: 0030 movs r0, r6 -10006132: 2300 movs r3, #0 -10006134: f7ff fefa bl 10005f2c -10006138: e7b4 b.n 100060a4 -1000613a: 2000 movs r0, #0 -1000613c: e7b2 b.n 100060a4 -1000613e: 2100 movs r1, #0 -10006140: 0030 movs r0, r6 -10006142: f7ff f917 bl 10005374 -10006146: 0030 movs r0, r6 -10006148: 2180 movs r1, #128 @ 0x80 -1000614a: f7ff f913 bl 10005374 +10006052: 400b ands r3, r1 +10006054: 420a tst r2, r1 +10006056: d100 bne.n 1000605a +10006058: bd10 pop {r4, pc} +1000605a: 09c9 lsrs r1, r1, #7 +1000605c: 005b lsls r3, r3, #1 +1000605e: 185b adds r3, r3, r1 +10006060: 4804 ldr r0, [pc, #16] @ (10006074 ) +10006062: 015b lsls r3, r3, #5 +10006064: 18c0 adds r0, r0, r3 +10006066: 2300 movs r3, #0 +10006068: 2200 movs r2, #0 +1000606a: 4903 ldr r1, [pc, #12] @ (10006078 ) +1000606c: 70c3 strb r3, [r0, #3] +1000606e: f001 fde7 bl 10007c40 <___hw_endpoint_buffer_control_update32_veneer> +10006072: e7f1 b.n 10006058 +10006074: 200018cc .word 0x200018cc +10006078: fffff7ff .word 0xfffff7ff + +1000607c : +1000607c: 2280 movs r2, #128 @ 0x80 +1000607e: 4b0d ldr r3, [pc, #52] @ (100060b4 ) +10006080: 0452 lsls r2, r2, #17 +10006082: b510 push {r4, lr} +10006084: 601a str r2, [r3, #0] +10006086: 4b0c ldr r3, [pc, #48] @ (100060b8 ) +10006088: 490c ldr r1, [pc, #48] @ (100060bc ) +1000608a: 601a str r2, [r3, #0] +1000608c: 0010 movs r0, r2 +1000608e: 688b ldr r3, [r1, #8] +10006090: 4398 bics r0, r3 +10006092: d1fb bne.n 1000608c +10006094: 4c0a ldr r4, [pc, #40] @ (100060c0 ) +10006096: 229c movs r2, #156 @ 0x9c +10006098: 2100 movs r1, #0 +1000609a: 0020 movs r0, r4 +1000609c: f7ff f864 bl 10005168 <__wrap_memset> +100060a0: 2280 movs r2, #128 @ 0x80 +100060a2: 2100 movs r1, #0 +100060a4: 0152 lsls r2, r2, #5 +100060a6: 4807 ldr r0, [pc, #28] @ (100060c4 ) +100060a8: f7ff f85e bl 10005168 <__wrap_memset> +100060ac: 2309 movs r3, #9 +100060ae: 6763 str r3, [r4, #116] @ 0x74 +100060b0: bd10 pop {r4, pc} +100060b2: 46c0 nop @ (mov r8, r8) +100060b4: 4000e000 .word 0x4000e000 +100060b8: 4000f000 .word 0x4000f000 +100060bc: 4000c000 .word 0x4000c000 +100060c0: 50110000 .word 0x50110000 +100060c4: 50100000 .word 0x50100000 + +100060c8 : +100060c8: 2300 movs r3, #0 +100060ca: b510 push {r4, lr} +100060cc: 82c3 strh r3, [r0, #22] +100060ce: 3301 adds r3, #1 +100060d0: 8282 strh r2, [r0, #20] +100060d2: 7683 strb r3, [r0, #26] +100060d4: 6101 str r1, [r0, #16] +100060d6: 0004 movs r4, r0 +100060d8: f001 fd7a bl 10007bd0 <__e15_is_bulkin_ep_veneer> +100060dc: 2800 cmp r0, #0 +100060de: d004 beq.n 100060ea +100060e0: 2180 movs r1, #128 @ 0x80 +100060e2: 2390 movs r3, #144 @ 0x90 +100060e4: 4a07 ldr r2, [pc, #28] @ (10006104 ) +100060e6: 0289 lsls r1, r1, #10 +100060e8: 50d1 str r1, [r2, r3] +100060ea: 0020 movs r0, r4 +100060ec: f001 fdb0 bl 10007c50 <__e15_is_critical_frame_period_veneer> +100060f0: 2800 cmp r0, #0 +100060f2: d002 beq.n 100060fa +100060f4: 2301 movs r3, #1 +100060f6: 7723 strb r3, [r4, #28] +100060f8: bd10 pop {r4, pc} +100060fa: 0020 movs r0, r4 +100060fc: f001 fd90 bl 10007c20 <__hw_endpoint_start_next_buffer_veneer> +10006100: e7fa b.n 100060f8 +10006102: 46c0 nop @ (mov r8, r8) +10006104: 50112000 .word 0x50112000 + +10006108 : +10006108: 4b02 ldr r3, [pc, #8] @ (10006114 ) +1000610a: 7858 ldrb r0, [r3, #1] +1000610c: 1e43 subs r3, r0, #1 +1000610e: 4198 sbcs r0, r3 +10006110: b2c0 uxtb r0, r0 +10006112: 4770 bx lr +10006114: 20001618 .word 0x20001618 + +10006118 : +10006118: 4b02 ldr r3, [pc, #8] @ (10006124 ) +1000611a: 7818 ldrb r0, [r3, #0] +1000611c: 0740 lsls r0, r0, #29 +1000611e: 0fc0 lsrs r0, r0, #31 +10006120: 4770 bx lr +10006122: 46c0 nop @ (mov r8, r8) +10006124: 20001618 .word 0x20001618 + +10006128 : +10006128: 4b03 ldr r3, [pc, #12] @ (10006138 ) +1000612a: 7818 ldrb r0, [r3, #0] +1000612c: 38ff subs r0, #255 @ 0xff +1000612e: 1e43 subs r3, r0, #1 +10006130: 4198 sbcs r0, r3 +10006132: b2c0 uxtb r0, r0 +10006134: 4770 bx lr +10006136: 46c0 nop @ (mov r8, r8) +10006138: 20000f94 .word 0x20000f94 + +1000613c : +1000613c: b5f8 push {r3, r4, r5, r6, r7, lr} +1000613e: 46ce mov lr, r9 +10006140: 4647 mov r7, r8 +10006142: b580 push {r7, lr} +10006144: 4e2a ldr r6, [pc, #168] @ (100061f0 ) +10006146: 0005 movs r5, r0 +10006148: 7833 ldrb r3, [r6, #0] +1000614a: 2bff cmp r3, #255 @ 0xff +1000614c: d001 beq.n 10006152 1000614e: 2001 movs r0, #1 -10006150: e7a8 b.n 100060a4 -10006152: 2540 movs r5, #64 @ 0x40 -10006154: e7d2 b.n 100060fc -10006156: 429a cmp r2, r3 -10006158: d007 beq.n 1000616a -1000615a: 4c08 ldr r4, [pc, #32] @ (1000617c ) -1000615c: 002a movs r2, r5 +10006150: e03d b.n 100061ce +10006152: 2253 movs r2, #83 @ 0x53 +10006154: 2100 movs r1, #0 +10006156: 4827 ldr r0, [pc, #156] @ (100061f4 ) +10006158: f7ff f806 bl 10005168 <__wrap_memset> +1000615c: 4c26 ldr r4, [pc, #152] @ (100061f8 ) 1000615e: 0020 movs r0, r4 -10006160: f7fe f9b6 bl 100044d0 <__wrap___aeabi_memcpy> -10006164: 2180 movs r1, #128 @ 0x80 -10006166: 0022 movs r2, r4 -10006168: e7d0 b.n 1000610c -1000616a: 2180 movs r1, #128 @ 0x80 -1000616c: 2200 movs r2, #0 -1000616e: e7cd b.n 1000610c -10006170: 2200 movs r2, #0 -10006172: e7cb b.n 1000610c -10006174: 200014f4 .word 0x200014f4 -10006178: 10005225 .word 0x10005225 -1000617c: 20001510 .word 0x20001510 - -10006180 : -10006180: b510 push {r4, lr} -10006182: 0004 movs r4, r0 -10006184: f7ff f96e bl 10005464 -10006188: 2800 cmp r0, #0 -1000618a: d101 bne.n 10006190 -1000618c: 2000 movs r0, #0 -1000618e: bd10 pop {r4, pc} -10006190: f7ff f970 bl 10005474 -10006194: 2800 cmp r0, #0 -10006196: d1f9 bne.n 1000618c -10006198: 22b2 movs r2, #178 @ 0xb2 -1000619a: 0092 lsls r2, r2, #2 -1000619c: 4362 muls r2, r4 -1000619e: 4b03 ldr r3, [pc, #12] @ (100061ac ) -100061a0: 3001 adds r0, #1 -100061a2: 189b adds r3, r3, r2 -100061a4: 791b ldrb r3, [r3, #4] -100061a6: 4018 ands r0, r3 -100061a8: e7f1 b.n 1000618e -100061aa: 46c0 nop @ (mov r8, r8) -100061ac: 2000122c .word 0x2000122c - -100061b0 : -100061b0: 23b2 movs r3, #178 @ 0xb2 -100061b2: 009b lsls r3, r3, #2 -100061b4: 4343 muls r3, r0 -100061b6: b510 push {r4, lr} -100061b8: 4802 ldr r0, [pc, #8] @ (100061c4 ) -100061ba: 1818 adds r0, r3, r0 -100061bc: f000 fb50 bl 10006860 -100061c0: bd10 pop {r4, pc} -100061c2: 46c0 nop @ (mov r8, r8) -100061c4: 2000123c .word 0x2000123c - -100061c8 : -100061c8: b5f0 push {r4, r5, r6, r7, lr} -100061ca: 25b2 movs r5, #178 @ 0xb2 -100061cc: 00ad lsls r5, r5, #2 -100061ce: 4345 muls r5, r0 -100061d0: 002c movs r4, r5 -100061d2: 46c6 mov lr, r8 -100061d4: 4f17 ldr r7, [pc, #92] @ (10006234 ) -100061d6: 3410 adds r4, #16 -100061d8: 19e4 adds r4, r4, r7 -100061da: b500 push {lr} -100061dc: 0020 movs r0, r4 -100061de: b292 uxth r2, r2 -100061e0: f000 fbc0 bl 10006964 -100061e4: 0006 movs r6, r0 -100061e6: 0020 movs r0, r4 -100061e8: f000 fb58 bl 1000689c -100061ec: 283f cmp r0, #63 @ 0x3f -100061ee: d803 bhi.n 100061f8 -100061f0: 0030 movs r0, r6 -100061f2: bc80 pop {r7} -100061f4: 46b8 mov r8, r7 -100061f6: bdf0 pop {r4, r5, r6, r7, pc} -100061f8: 197b adds r3, r7, r5 -100061fa: 2000 movs r0, #0 -100061fc: 78d9 ldrb r1, [r3, #3] -100061fe: 4698 mov r8, r3 -10006200: f7ff fe6c bl 10005edc -10006204: 2800 cmp r0, #0 -10006206: d0f3 beq.n 100061f0 -10006208: 0020 movs r0, r4 -1000620a: f000 fb47 bl 1000689c -1000620e: 283f cmp r0, #63 @ 0x3f -10006210: d90a bls.n 10006228 -10006212: 2392 movs r3, #146 @ 0x92 -10006214: 009b lsls r3, r3, #2 -10006216: 18ea adds r2, r5, r3 -10006218: 4643 mov r3, r8 -1000621a: 19d2 adds r2, r2, r7 -1000621c: 78d9 ldrb r1, [r3, #3] -1000621e: 2000 movs r0, #0 -10006220: 2340 movs r3, #64 @ 0x40 -10006222: f7ff fe83 bl 10005f2c -10006226: e7e3 b.n 100061f0 -10006228: 4643 mov r3, r8 -1000622a: 2000 movs r0, #0 -1000622c: 78d9 ldrb r1, [r3, #3] -1000622e: f7ff fe69 bl 10005f04 -10006232: e7dd b.n 100061f0 -10006234: 2000122c .word 0x2000122c - -10006238 : -10006238: b5f8 push {r3, r4, r5, r6, r7, lr} -1000623a: 0004 movs r4, r0 -1000623c: f7ff f912 bl 10005464 -10006240: 2800 cmp r0, #0 -10006242: d101 bne.n 10006248 -10006244: 2000 movs r0, #0 -10006246: bdf8 pop {r3, r4, r5, r6, r7, pc} -10006248: f7ff f914 bl 10005474 -1000624c: 2800 cmp r0, #0 -1000624e: d1f9 bne.n 10006244 -10006250: 23b2 movs r3, #178 @ 0xb2 -10006252: 009b lsls r3, r3, #2 -10006254: 435c muls r4, r3 -10006256: 0025 movs r5, r4 -10006258: 4e14 ldr r6, [pc, #80] @ (100062ac ) -1000625a: 3524 adds r5, #36 @ 0x24 -1000625c: 19ad adds r5, r5, r6 -1000625e: 0028 movs r0, r5 -10006260: f000 fafe bl 10006860 -10006264: 2800 cmp r0, #0 -10006266: d0ed beq.n 10006244 -10006268: 1937 adds r7, r6, r4 -1000626a: 2000 movs r0, #0 -1000626c: 78b9 ldrb r1, [r7, #2] -1000626e: f7ff fe35 bl 10005edc +10006160: f7fb fade bl 10001720 +10006164: 4b25 ldr r3, [pc, #148] @ (100061fc ) +10006166: 601c str r4, [r3, #0] +10006168: 4c25 ldr r4, [pc, #148] @ (10006200 ) +1000616a: 0020 movs r0, r4 +1000616c: 3c14 subs r4, #20 +1000616e: f7fb faf3 bl 10001758 +10006172: 0020 movs r0, r4 +10006174: f001 fbcc bl 10007910 +10006178: 4b22 ldr r3, [pc, #136] @ (10006204 ) +1000617a: 4f23 ldr r7, [pc, #140] @ (10006208 ) +1000617c: 601c str r4, [r3, #0] +1000617e: 4b23 ldr r3, [pc, #140] @ (1000620c ) +10006180: 4698 mov r8, r3 +10006182: 2f00 cmp r7, #0 +10006184: d01e beq.n 100061c4 +10006186: 0018 movs r0, r3 +10006188: f7ff fb02 bl 10005790 +1000618c: 4b20 ldr r3, [pc, #128] @ (10006210 ) +1000618e: 6018 str r0, [r3, #0] +10006190: 4643 mov r3, r8 +10006192: 781b ldrb r3, [r3, #0] +10006194: 4a1f ldr r2, [pc, #124] @ (10006214 ) +10006196: 2400 movs r4, #0 +10006198: 4691 mov r9, r2 +1000619a: 2f00 cmp r7, #0 +1000619c: d014 beq.n 100061c8 +1000619e: 464a mov r2, r9 +100061a0: 42a3 cmp r3, r4 +100061a2: d81a bhi.n 100061da +100061a4: 4790 blx r2 +100061a6: 4643 mov r3, r8 +100061a8: 3401 adds r4, #1 +100061aa: 781b ldrb r3, [r3, #0] +100061ac: b2e4 uxtb r4, r4 +100061ae: 42a3 cmp r3, r4 +100061b0: d2f3 bcs.n 1000619a +100061b2: 0028 movs r0, r5 +100061b4: 7035 strb r5, [r6, #0] +100061b6: f7ff fe3b bl 10005e30 +100061ba: 0028 movs r0, r5 +100061bc: f7ff fe20 bl 10005e00 +100061c0: 2001 movs r0, #1 +100061c2: e004 b.n 100061ce +100061c4: 781b ldrb r3, [r3, #0] +100061c6: e7e5 b.n 10006194 +100061c8: 2c00 cmp r4, #0 +100061ca: d004 beq.n 100061d6 +100061cc: 2000 movs r0, #0 +100061ce: bcc0 pop {r6, r7} +100061d0: 46b9 mov r9, r7 +100061d2: 46b0 mov r8, r6 +100061d4: bdf8 pop {r3, r4, r5, r6, r7, pc} +100061d6: 4a0f ldr r2, [pc, #60] @ (10006214 ) +100061d8: e7e4 b.n 100061a4 +100061da: 4a0d ldr r2, [pc, #52] @ (10006210 ) +100061dc: 0063 lsls r3, r4, #1 +100061de: 6812 ldr r2, [r2, #0] +100061e0: 191b adds r3, r3, r4 +100061e2: 00db lsls r3, r3, #3 +100061e4: 18d3 adds r3, r2, r3 +100061e6: 2b00 cmp r3, #0 +100061e8: d0f0 beq.n 100061cc +100061ea: 681a ldr r2, [r3, #0] +100061ec: e7da b.n 100061a4 +100061ee: 46c0 nop @ (mov r8, r8) +100061f0: 20000f94 .word 0x20000f94 +100061f4: 20001618 .word 0x20001618 +100061f8: 200015d0 .word 0x200015d0 +100061fc: 2000166c .word 0x2000166c +10006200: 20000f8c .word 0x20000f8c +10006204: 20001670 .word 0x20001670 +10006208: 10005791 .word 0x10005791 +1000620c: 20001d61 .word 0x20001d61 +10006210: 200012f0 .word 0x200012f0 +10006214: 10006fa1 .word 0x10006fa1 + +10006218 : +10006218: b5f0 push {r4, r5, r6, r7, lr} +1000621a: 46de mov lr, fp +1000621c: 4657 mov r7, sl +1000621e: 464e mov r6, r9 +10006220: 4645 mov r5, r8 +10006222: b5e0 push {r5, r6, r7, lr} +10006224: b091 sub sp, #68 @ 0x44 +10006226: f001 f897 bl 10007358 +1000622a: 2800 cmp r0, #0 +1000622c: d100 bne.n 10006230 +1000622e: e0fc b.n 1000642a +10006230: 4bc3 ldr r3, [pc, #780] @ (10006540 ) +10006232: 4ec4 ldr r6, [pc, #784] @ (10006544 ) +10006234: 4699 mov r9, r3 +10006236: 4bc4 ldr r3, [pc, #784] @ (10006548 ) +10006238: ac0d add r4, sp, #52 @ 0x34 +1000623a: 9302 str r3, [sp, #8] +1000623c: 4bc3 ldr r3, [pc, #780] @ (1000654c ) +1000623e: 469b mov fp, r3 +10006240: 464b mov r3, r9 +10006242: 9301 str r3, [sp, #4] +10006244: 6835 ldr r5, [r6, #0] +10006246: 696a ldr r2, [r5, #20] +10006248: f3ef 8110 mrs r1, PRIMASK +1000624c: b672 cpsid i +1000624e: 6813 ldr r3, [r2, #0] +10006250: 2b00 cmp r3, #0 +10006252: d0fc beq.n 1000624e +10006254: f3bf 8f5f dmb sy +10006258: 61a9 str r1, [r5, #24] +1000625a: 0028 movs r0, r5 +1000625c: 0021 movs r1, r4 +1000625e: f001 f985 bl 1000756c +10006262: 696a ldr r2, [r5, #20] +10006264: 69ab ldr r3, [r5, #24] +10006266: f3bf 8f5f dmb sy +1000626a: 2100 movs r1, #0 +1000626c: 6011 str r1, [r2, #0] +1000626e: f383 8810 msr PRIMASK, r3 10006272: 2800 cmp r0, #0 -10006274: d0e6 beq.n 10006244 -10006276: 23a2 movs r3, #162 @ 0xa2 -10006278: 009b lsls r3, r3, #2 -1000627a: 469c mov ip, r3 -1000627c: 4464 add r4, ip -1000627e: 19a4 adds r4, r4, r6 -10006280: 0021 movs r1, r4 -10006282: 0028 movs r0, r5 -10006284: 2240 movs r2, #64 @ 0x40 -10006286: f000 fb6d bl 10006964 -1000628a: 78b9 ldrb r1, [r7, #2] -1000628c: 1e05 subs r5, r0, #0 -1000628e: d008 beq.n 100062a2 -10006290: 0003 movs r3, r0 -10006292: 0022 movs r2, r4 -10006294: 2000 movs r0, #0 -10006296: f7ff fe49 bl 10005f2c -1000629a: 2800 cmp r0, #0 -1000629c: d0d2 beq.n 10006244 -1000629e: 0028 movs r0, r5 -100062a0: e7d1 b.n 10006246 -100062a2: 2000 movs r0, #0 -100062a4: f7ff fe2e bl 10005f04 -100062a8: e7cc b.n 10006244 -100062aa: 46c0 nop @ (mov r8, r8) -100062ac: 2000122c .word 0x2000122c - -100062b0 : -100062b0: b570 push {r4, r5, r6, lr} -100062b2: 24b2 movs r4, #178 @ 0xb2 -100062b4: 00a4 lsls r4, r4, #2 -100062b6: 4344 muls r4, r0 -100062b8: 4b09 ldr r3, [pc, #36] @ (100062e0 ) -100062ba: 0005 movs r5, r0 -100062bc: 18e4 adds r4, r4, r3 -100062be: 0020 movs r0, r4 -100062c0: b292 uxth r2, r2 -100062c2: f000 fc17 bl 10006af4 -100062c6: 0006 movs r6, r0 -100062c8: 0020 movs r0, r4 -100062ca: f000 fac9 bl 10006860 -100062ce: 283f cmp r0, #63 @ 0x3f -100062d0: d801 bhi.n 100062d6 -100062d2: 0030 movs r0, r6 -100062d4: bd70 pop {r4, r5, r6, pc} -100062d6: 0028 movs r0, r5 -100062d8: f7ff ffae bl 10006238 -100062dc: e7f9 b.n 100062d2 -100062de: 46c0 nop @ (mov r8, r8) -100062e0: 20001250 .word 0x20001250 - -100062e4 : -100062e4: 23b2 movs r3, #178 @ 0xb2 -100062e6: 009b lsls r3, r3, #2 -100062e8: 4343 muls r3, r0 -100062ea: b510 push {r4, lr} -100062ec: 4802 ldr r0, [pc, #8] @ (100062f8 ) -100062ee: 1818 adds r0, r3, r0 -100062f0: f000 fad4 bl 1000689c -100062f4: bd10 pop {r4, pc} -100062f6: 46c0 nop @ (mov r8, r8) -100062f8: 20001250 .word 0x20001250 - -100062fc : -100062fc: 22b2 movs r2, #178 @ 0xb2 -100062fe: b5f0 push {r4, r5, r6, r7, lr} -10006300: 4c1b ldr r4, [pc, #108] @ (10006370 ) -10006302: b083 sub sp, #12 -10006304: 2100 movs r1, #0 -10006306: 0020 movs r0, r4 -10006308: 0092 lsls r2, r2, #2 -1000630a: f7fe f8db bl 100044c4 <__wrap_memset> -1000630e: 23ff movs r3, #255 @ 0xff -10006310: 7163 strb r3, [r4, #5] -10006312: 4b18 ldr r3, [pc, #96] @ (10006374 ) -10006314: 2680 movs r6, #128 @ 0x80 -10006316: 2500 movs r5, #0 -10006318: 80e3 strh r3, [r4, #6] -1000631a: 2701 movs r7, #1 -1000631c: 2308 movs r3, #8 -1000631e: 0021 movs r1, r4 -10006320: 0020 movs r0, r4 -10006322: 0076 lsls r6, r6, #1 -10006324: 7323 strb r3, [r4, #12] -10006326: 0032 movs r2, r6 -10006328: 8127 strh r7, [r4, #8] -1000632a: 3138 adds r1, #56 @ 0x38 -1000632c: 9500 str r5, [sp, #0] -1000632e: 3b07 subs r3, #7 -10006330: 3010 adds r0, #16 -10006332: f000 fa5f bl 100067f4 -10006336: 0021 movs r1, r4 -10006338: 0020 movs r0, r4 -1000633a: 3139 adds r1, #57 @ 0x39 -1000633c: 0032 movs r2, r6 -1000633e: 31ff adds r1, #255 @ 0xff -10006340: 2301 movs r3, #1 -10006342: 9700 str r7, [sp, #0] -10006344: 3024 adds r0, #36 @ 0x24 -10006346: f000 fa55 bl 100067f4 -1000634a: 238e movs r3, #142 @ 0x8e -1000634c: 009b lsls r3, r3, #2 -1000634e: 18e6 adds r6, r4, r3 -10006350: 0030 movs r0, r6 -10006352: f7fa fba7 bl 10000aa4 -10006356: 2390 movs r3, #144 @ 0x90 -10006358: 009b lsls r3, r3, #2 -1000635a: 6226 str r6, [r4, #32] -1000635c: 18e6 adds r6, r4, r3 -1000635e: 0030 movs r0, r6 -10006360: 61e5 str r5, [r4, #28] -10006362: f7fa fb9f bl 10000aa4 -10006366: 6326 str r6, [r4, #48] @ 0x30 -10006368: 6365 str r5, [r4, #52] @ 0x34 -1000636a: b003 add sp, #12 -1000636c: bdf0 pop {r4, r5, r6, r7, pc} -1000636e: 46c0 nop @ (mov r8, r8) -10006370: 2000122c .word 0x2000122c -10006374: ffffc200 .word 0xffffc200 - -10006378 : -10006378: b510 push {r4, lr} -1000637a: 4c09 ldr r4, [pc, #36] @ (100063a0 ) -1000637c: 2205 movs r2, #5 -1000637e: 2100 movs r1, #0 -10006380: 0020 movs r0, r4 -10006382: f7fe f89f bl 100044c4 <__wrap_memset> -10006386: 0020 movs r0, r4 -10006388: 3424 adds r4, #36 @ 0x24 -1000638a: 3010 adds r0, #16 -1000638c: f000 fc6e bl 10006c6c -10006390: 0020 movs r0, r4 -10006392: f000 fc6b bl 10006c6c -10006396: 2101 movs r1, #1 -10006398: 0020 movs r0, r4 -1000639a: f000 fc87 bl 10006cac -1000639e: bd10 pop {r4, pc} -100063a0: 2000122c .word 0x2000122c - -100063a4 : -100063a4: b5f0 push {r4, r5, r6, r7, lr} -100063a6: 794b ldrb r3, [r1, #5] -100063a8: 0006 movs r6, r0 -100063aa: b083 sub sp, #12 -100063ac: 2b02 cmp r3, #2 -100063ae: d102 bne.n 100063b6 -100063b0: 798b ldrb r3, [r1, #6] -100063b2: 2b02 cmp r3, #2 -100063b4: d003 beq.n 100063be -100063b6: 2500 movs r5, #0 -100063b8: 0028 movs r0, r5 -100063ba: b003 add sp, #12 -100063bc: bdf0 pop {r4, r5, r6, r7, pc} -100063be: 4f2f ldr r7, [pc, #188] @ (1000647c ) -100063c0: 78bb ldrb r3, [r7, #2] -100063c2: 2b00 cmp r3, #0 -100063c4: d1f7 bne.n 100063b6 -100063c6: 788b ldrb r3, [r1, #2] -100063c8: 2509 movs r5, #9 -100063ca: 703b strb r3, [r7, #0] -100063cc: 780c ldrb r4, [r1, #0] -100063ce: 190c adds r4, r1, r4 -100063d0: 7863 ldrb r3, [r4, #1] -100063d2: 2b24 cmp r3, #36 @ 0x24 -100063d4: d10b bne.n 100063ee -100063d6: 2a08 cmp r2, #8 -100063d8: d802 bhi.n 100063e0 -100063da: e01f b.n 1000641c -100063dc: 42aa cmp r2, r5 -100063de: d31d bcc.n 1000641c +10006274: d100 bne.n 10006278 +10006276: e0d8 b.n 1000642a +10006278: 7863 ldrb r3, [r4, #1] +1000627a: 2b08 cmp r3, #8 +1000627c: d8e2 bhi.n 10006244 +1000627e: 9a01 ldr r2, [sp, #4] +10006280: 009b lsls r3, r3, #2 +10006282: 58d3 ldr r3, [r2, r3] +10006284: 469f mov pc, r3 +10006286: 6863 ldr r3, [r4, #4] +10006288: 2b00 cmp r3, #0 +1000628a: d0db beq.n 10006244 +1000628c: 68a0 ldr r0, [r4, #8] +1000628e: 4798 blx r3 +10006290: e7d8 b.n 10006244 +10006292: 207f movs r0, #127 @ 0x7f +10006294: 7921 ldrb r1, [r4, #4] +10006296: 4dac ldr r5, [pc, #688] @ (10006548 ) +10006298: 4008 ands r0, r1 +1000629a: 0043 lsls r3, r0, #1 +1000629c: 09ca lsrs r2, r1, #7 +1000629e: 18eb adds r3, r5, r3 +100062a0: 189b adds r3, r3, r2 +100062a2: 001d movs r5, r3 +100062a4: 2701 movs r7, #1 +100062a6: 3530 adds r5, #48 @ 0x30 +100062a8: 78ea ldrb r2, [r5, #3] +100062aa: 43ba bics r2, r7 +100062ac: 70ea strb r2, [r5, #3] +100062ae: 78ea ldrb r2, [r5, #3] +100062b0: 3703 adds r7, #3 +100062b2: 43ba bics r2, r7 +100062b4: 70ea strb r2, [r5, #3] +100062b6: 2800 cmp r0, #0 +100062b8: d100 bne.n 100062bc +100062ba: e0f2 b.n 100064a2 +100062bc: 4fa4 ldr r7, [pc, #656] @ (10006550 ) +100062be: 7cdb ldrb r3, [r3, #19] +100062c0: 2f00 cmp r7, #0 +100062c2: d006 beq.n 100062d2 +100062c4: 4aa3 ldr r2, [pc, #652] @ (10006554 ) +100062c6: 7812 ldrb r2, [r2, #0] +100062c8: 4293 cmp r3, r2 +100062ca: d200 bcs.n 100062ce +100062cc: e0f1 b.n 100064b2 +100062ce: 1a9b subs r3, r3, r2 +100062d0: b2db uxtb r3, r3 +100062d2: 2b00 cmp r3, #0 +100062d4: d000 beq.n 100062d8 +100062d6: e0a8 b.n 1000642a +100062d8: 4d9f ldr r5, [pc, #636] @ (10006558 ) +100062da: 68a3 ldr r3, [r4, #8] +100062dc: 7962 ldrb r2, [r4, #5] +100062de: 7820 ldrb r0, [r4, #0] +100062e0: 47a8 blx r5 +100062e2: e7af b.n 10006244 +100062e4: 2201 movs r2, #1 +100062e6: 4d98 ldr r5, [pc, #608] @ (10006548 ) +100062e8: 2001 movs r0, #1 +100062ea: 782b ldrb r3, [r5, #0] +100062ec: 2104 movs r1, #4 +100062ee: 4313 orrs r3, r2 +100062f0: 702b strb r3, [r5, #0] +100062f2: 2333 movs r3, #51 @ 0x33 +100062f4: 5cea ldrb r2, [r5, r3] +100062f6: 4382 bics r2, r0 +100062f8: 54ea strb r2, [r5, r3] +100062fa: 5cea ldrb r2, [r5, r3] +100062fc: 438a bics r2, r1 +100062fe: 54ea strb r2, [r5, r3] +10006300: 3301 adds r3, #1 +10006302: 5cea ldrb r2, [r5, r3] +10006304: 4382 bics r2, r0 +10006306: 54ea strb r2, [r5, r3] +10006308: 5cea ldrb r2, [r5, r3] +1000630a: 2000 movs r0, #0 +1000630c: 438a bics r2, r1 +1000630e: 54ea strb r2, [r5, r3] +10006310: 7823 ldrb r3, [r4, #0] +10006312: 469a mov sl, r3 +10006314: f000 fcf8 bl 10006d08 +10006318: 2260 movs r2, #96 @ 0x60 +1000631a: 7923 ldrb r3, [r4, #4] +1000631c: 401a ands r2, r3 +1000631e: 2a60 cmp r2, #96 @ 0x60 +10006320: d100 bne.n 10006324 +10006322: e0b5 b.n 10006490 +10006324: 2a40 cmp r2, #64 @ 0x40 +10006326: d100 bne.n 1000632a +10006328: e0af b.n 1000648a +1000632a: 06db lsls r3, r3, #27 +1000632c: 0edb lsrs r3, r3, #27 +1000632e: 2b01 cmp r3, #1 +10006330: d100 bne.n 10006334 +10006332: e0d3 b.n 100064dc +10006334: 2b02 cmp r3, #2 +10006336: d100 bne.n 1000633a +10006338: e120 b.n 1000657c +1000633a: 2b00 cmp r3, #0 +1000633c: d000 beq.n 10006340 +1000633e: e0a7 b.n 10006490 +10006340: 2a20 cmp r2, #32 +10006342: d100 bne.n 10006346 +10006344: e153 b.n 100065ee +10006346: 2a00 cmp r2, #0 +10006348: d000 beq.n 1000634c +1000634a: e0a1 b.n 10006490 +1000634c: 7963 ldrb r3, [r4, #5] +1000634e: 2b09 cmp r3, #9 +10006350: d900 bls.n 10006354 +10006352: e09d b.n 10006490 +10006354: 4a81 ldr r2, [pc, #516] @ (1000655c ) +10006356: 009b lsls r3, r3, #2 +10006358: 58d3 ldr r3, [r2, r3] +1000635a: 469f mov pc, r3 +1000635c: 9b02 ldr r3, [sp, #8] +1000635e: 781b ldrb r3, [r3, #0] +10006360: 07db lsls r3, r3, #31 +10006362: d400 bmi.n 10006366 +10006364: e76e b.n 10006244 +10006366: 4b7e ldr r3, [pc, #504] @ (10006560 ) +10006368: 2b00 cmp r3, #0 +1000636a: d100 bne.n 1000636e +1000636c: e76a b.n 10006244 +1000636e: e000 b.n 10006372 +10006370: bf00 nop +10006372: e767 b.n 10006244 +10006374: 4d74 ldr r5, [pc, #464] @ (10006548 ) +10006376: 782b ldrb r3, [r5, #0] +10006378: 07db lsls r3, r3, #31 +1000637a: d400 bmi.n 1000637e +1000637c: e762 b.n 10006244 +1000637e: 4b79 ldr r3, [pc, #484] @ (10006564 ) +10006380: 2b00 cmp r3, #0 +10006382: d100 bne.n 10006386 +10006384: e75e b.n 10006244 +10006386: 7828 ldrb r0, [r5, #0] +10006388: 0700 lsls r0, r0, #28 +1000638a: 0fc0 lsrs r0, r0, #31 +1000638c: e000 b.n 10006390 +1000638e: bf00 nop +10006390: e758 b.n 10006244 +10006392: 2500 movs r5, #0 +10006394: 7823 ldrb r3, [r4, #0] +10006396: 4f6e ldr r7, [pc, #440] @ (10006550 ) +10006398: 469a mov sl, r3 +1000639a: 4b6e ldr r3, [pc, #440] @ (10006554 ) +1000639c: 4698 mov r8, r3 +1000639e: 781b ldrb r3, [r3, #0] +100063a0: 2f00 cmp r7, #0 +100063a2: d049 beq.n 10006438 +100063a4: 465a mov r2, fp +100063a6: 42ab cmp r3, r5 +100063a8: d863 bhi.n 10006472 +100063aa: 4650 mov r0, sl +100063ac: 4790 blx r2 +100063ae: 4643 mov r3, r8 +100063b0: 3501 adds r5, #1 +100063b2: 781b ldrb r3, [r3, #0] +100063b4: b2ed uxtb r5, r5 +100063b6: 42ab cmp r3, r5 +100063b8: d2f2 bcs.n 100063a0 +100063ba: 4d63 ldr r5, [pc, #396] @ (10006548 ) +100063bc: 2253 movs r2, #83 @ 0x53 +100063be: 2100 movs r1, #0 +100063c0: 0028 movs r0, r5 +100063c2: f7fe fed1 bl 10005168 <__wrap_memset> +100063c6: 2210 movs r2, #16 +100063c8: 21ff movs r1, #255 @ 0xff +100063ca: 1ce8 adds r0, r5, #3 +100063cc: f7fe fecc bl 10005168 <__wrap_memset> +100063d0: 0028 movs r0, r5 +100063d2: 2220 movs r2, #32 +100063d4: 21ff movs r1, #255 @ 0xff +100063d6: 3013 adds r0, #19 +100063d8: f7fe fec6 bl 10005168 <__wrap_memset> +100063dc: e02e b.n 1000643c +100063de: 2500 movs r5, #0 100063e0: 7823 ldrb r3, [r4, #0] -100063e2: 18e4 adds r4, r4, r3 -100063e4: 195d adds r5, r3, r5 -100063e6: 7863 ldrb r3, [r4, #1] -100063e8: b2ad uxth r5, r5 -100063ea: 2b24 cmp r3, #36 @ 0x24 -100063ec: d0f6 beq.n 100063dc -100063ee: 2b05 cmp r3, #5 -100063f0: d031 beq.n 10006456 -100063f2: 2b04 cmp r3, #4 -100063f4: d112 bne.n 1000641c -100063f6: 7963 ldrb r3, [r4, #5] -100063f8: 2b0a cmp r3, #10 -100063fa: d10f bne.n 1000641c -100063fc: 4b20 ldr r3, [pc, #128] @ (10006480 ) -100063fe: 7827 ldrb r7, [r4, #0] -10006400: 9301 str r3, [sp, #4] -10006402: 3301 adds r3, #1 -10006404: 9300 str r3, [sp, #0] -10006406: 2202 movs r2, #2 -10006408: 2302 movs r3, #2 -1000640a: 0030 movs r0, r6 -1000640c: 19e1 adds r1, r4, r7 -1000640e: f7ff fcd9 bl 10005dc4 -10006412: 2800 cmp r0, #0 -10006414: d0cf beq.n 100063b6 -10006416: 350e adds r5, #14 -10006418: 19ed adds r5, r5, r7 -1000641a: b2ad uxth r5, r5 -1000641c: 4c19 ldr r4, [pc, #100] @ (10006484 ) -1000641e: 0020 movs r0, r4 -10006420: f000 fa3c bl 1000689c -10006424: 283f cmp r0, #63 @ 0x3f -10006426: d9c7 bls.n 100063b8 -10006428: 0026 movs r6, r4 -1000642a: 3e10 subs r6, #16 -1000642c: 2000 movs r0, #0 -1000642e: 78f1 ldrb r1, [r6, #3] -10006430: f7ff fd54 bl 10005edc -10006434: 2800 cmp r0, #0 -10006436: d0bf beq.n 100063b8 -10006438: 0020 movs r0, r4 -1000643a: f000 fa2f bl 1000689c -1000643e: 283f cmp r0, #63 @ 0x3f -10006440: d917 bls.n 10006472 -10006442: 238e movs r3, #142 @ 0x8e -10006444: 009b lsls r3, r3, #2 -10006446: 18e2 adds r2, r4, r3 -10006448: 3bf9 subs r3, #249 @ 0xf9 -1000644a: 78f1 ldrb r1, [r6, #3] -1000644c: 3bff subs r3, #255 @ 0xff -1000644e: 2000 movs r0, #0 -10006450: f7ff fd6c bl 10005f2c -10006454: e7b0 b.n 100063b8 -10006456: 0021 movs r1, r4 -10006458: 0030 movs r0, r6 -1000645a: f7ff fd25 bl 10005ea8 -1000645e: 2800 cmp r0, #0 -10006460: d0a9 beq.n 100063b6 -10006462: 78a3 ldrb r3, [r4, #2] -10006464: 707b strb r3, [r7, #1] -10006466: 7823 ldrb r3, [r4, #0] -10006468: 195d adds r5, r3, r5 -1000646a: 18e4 adds r4, r4, r3 -1000646c: 7863 ldrb r3, [r4, #1] -1000646e: b2ad uxth r5, r5 -10006470: e7bf b.n 100063f2 -10006472: 78f1 ldrb r1, [r6, #3] -10006474: 2000 movs r0, #0 -10006476: f7ff fd45 bl 10005f04 -1000647a: e79d b.n 100063b8 -1000647c: 2000122c .word 0x2000122c -10006480: 2000122e .word 0x2000122e -10006484: 2000123c .word 0x2000123c - -10006488 : -10006488: b5f8 push {r3, r4, r5, r6, r7, lr} -1000648a: 2360 movs r3, #96 @ 0x60 -1000648c: 0014 movs r4, r2 -1000648e: 7812 ldrb r2, [r2, #0] -10006490: 0005 movs r5, r0 -10006492: 4013 ands r3, r2 -10006494: 2000 movs r0, #0 -10006496: 2b20 cmp r3, #32 -10006498: d112 bne.n 100064c0 -1000649a: 4a2f ldr r2, [pc, #188] @ (10006558 ) -1000649c: 7963 ldrb r3, [r4, #5] -1000649e: 7927 ldrb r7, [r4, #4] -100064a0: 7816 ldrb r6, [r2, #0] -100064a2: 021b lsls r3, r3, #8 -100064a4: 433b orrs r3, r7 -100064a6: 429e cmp r6, r3 -100064a8: d10a bne.n 100064c0 -100064aa: 7863 ldrb r3, [r4, #1] -100064ac: 2b22 cmp r3, #34 @ 0x22 -100064ae: d01a beq.n 100064e6 -100064b0: d807 bhi.n 100064c2 -100064b2: 2b20 cmp r3, #32 -100064b4: d03c beq.n 10006530 -100064b6: 2b21 cmp r3, #33 @ 0x21 -100064b8: d102 bne.n 100064c0 -100064ba: 2901 cmp r1, #1 -100064bc: d030 beq.n 10006520 -100064be: 2001 movs r0, #1 -100064c0: bdf8 pop {r3, r4, r5, r6, r7, pc} -100064c2: 2b23 cmp r3, #35 @ 0x23 -100064c4: d1fc bne.n 100064c0 -100064c6: 2901 cmp r1, #1 -100064c8: d03f beq.n 1000654a -100064ca: 2903 cmp r1, #3 -100064cc: d1f7 bne.n 100064be -100064ce: 4b23 ldr r3, [pc, #140] @ (1000655c ) -100064d0: 2b00 cmp r3, #0 -100064d2: d0f4 beq.n 100064be -100064d4: 78e1 ldrb r1, [r4, #3] -100064d6: 78a3 ldrb r3, [r4, #2] -100064d8: 0209 lsls r1, r1, #8 -100064da: 2000 movs r0, #0 -100064dc: 4319 orrs r1, r3 -100064de: e000 b.n 100064e2 -100064e0: bf00 nop -100064e2: 2001 movs r0, #1 -100064e4: e7ec b.n 100064c0 -100064e6: 2901 cmp r1, #1 -100064e8: d02f beq.n 1000654a -100064ea: 2903 cmp r1, #3 -100064ec: d1e7 bne.n 100064be -100064ee: 2501 movs r5, #1 -100064f0: 002e movs r6, r5 -100064f2: 78a3 ldrb r3, [r4, #2] -100064f4: 78e4 ldrb r4, [r4, #3] -100064f6: 3902 subs r1, #2 -100064f8: 0224 lsls r4, r4, #8 -100064fa: 431c orrs r4, r3 -100064fc: 7114 strb r4, [r2, #4] -100064fe: 4026 ands r6, r4 -10006500: 3224 adds r2, #36 @ 0x24 -10006502: 0010 movs r0, r2 -10006504: 4071 eors r1, r6 -10006506: f000 fbd1 bl 10006cac -1000650a: 4b15 ldr r3, [pc, #84] @ (10006560 ) -1000650c: 2b00 cmp r3, #0 -1000650e: d0d6 beq.n 100064be -10006510: 0862 lsrs r2, r4, #1 -10006512: 2000 movs r0, #0 -10006514: 0031 movs r1, r6 -10006516: 402a ands r2, r5 -10006518: e000 b.n 1000651c -1000651a: bf00 nop -1000651c: 2001 movs r0, #1 -1000651e: e7cf b.n 100064c0 -10006520: 2307 movs r3, #7 -10006522: 0021 movs r1, r4 -10006524: 0028 movs r0, r5 -10006526: 4a0f ldr r2, [pc, #60] @ (10006564 ) -10006528: f7ff fd3c bl 10005fa4 -1000652c: 2001 movs r0, #1 -1000652e: e7c7 b.n 100064c0 -10006530: 2901 cmp r1, #1 -10006532: d0f5 beq.n 10006520 -10006534: 2903 cmp r1, #3 -10006536: d1c2 bne.n 100064be -10006538: 4b0b ldr r3, [pc, #44] @ (10006568 ) -1000653a: 2b00 cmp r3, #0 -1000653c: d0bf beq.n 100064be -1000653e: 2000 movs r0, #0 -10006540: 1d91 adds r1, r2, #6 -10006542: f7fe fad9 bl 10004af8 -10006546: 2001 movs r0, #1 -10006548: e7ba b.n 100064c0 -1000654a: 0021 movs r1, r4 -1000654c: 0028 movs r0, r5 -1000654e: f7ff fd13 bl 10005f78 -10006552: 2001 movs r0, #1 -10006554: e7b4 b.n 100064c0 -10006556: 46c0 nop @ (mov r8, r8) -10006558: 2000122c .word 0x2000122c +100063e2: 4f5b ldr r7, [pc, #364] @ (10006550 ) +100063e4: 469a mov sl, r3 +100063e6: 4b5b ldr r3, [pc, #364] @ (10006554 ) +100063e8: 4698 mov r8, r3 +100063ea: 781b ldrb r3, [r3, #0] +100063ec: 2f00 cmp r7, #0 +100063ee: d02e beq.n 1000644e +100063f0: 465a mov r2, fp +100063f2: 429d cmp r5, r3 +100063f4: d333 bcc.n 1000645e +100063f6: 4650 mov r0, sl +100063f8: 4790 blx r2 +100063fa: 4643 mov r3, r8 +100063fc: 3501 adds r5, #1 +100063fe: 781b ldrb r3, [r3, #0] +10006400: b2ed uxtb r5, r5 +10006402: 42ab cmp r3, r5 +10006404: d2f2 bcs.n 100063ec +10006406: 4d50 ldr r5, [pc, #320] @ (10006548 ) +10006408: 2253 movs r2, #83 @ 0x53 +1000640a: 2100 movs r1, #0 +1000640c: 0028 movs r0, r5 +1000640e: f7fe feab bl 10005168 <__wrap_memset> +10006412: 2210 movs r2, #16 +10006414: 21ff movs r1, #255 @ 0xff +10006416: 1ce8 adds r0, r5, #3 +10006418: f7fe fea6 bl 10005168 <__wrap_memset> +1000641c: 0028 movs r0, r5 +1000641e: 2220 movs r2, #32 +10006420: 21ff movs r1, #255 @ 0xff +10006422: 3013 adds r0, #19 +10006424: f7fe fea0 bl 10005168 <__wrap_memset> +10006428: e014 b.n 10006454 +1000642a: b011 add sp, #68 @ 0x44 +1000642c: bcf0 pop {r4, r5, r6, r7} +1000642e: 46bb mov fp, r7 +10006430: 46b2 mov sl, r6 +10006432: 46a9 mov r9, r5 +10006434: 46a0 mov r8, r4 +10006436: bdf0 pop {r4, r5, r6, r7, pc} +10006438: 2d00 cmp r5, #0 +1000643a: d038 beq.n 100064ae +1000643c: f000 fc5a bl 10006cf4 +10006440: 4b49 ldr r3, [pc, #292] @ (10006568 ) +10006442: 2b00 cmp r3, #0 +10006444: d100 bne.n 10006448 +10006446: e6fd b.n 10006244 +10006448: e000 b.n 1000644c +1000644a: bf00 nop +1000644c: e6fa b.n 10006244 +1000644e: 2d00 cmp r5, #0 +10006450: d019 beq.n 10006486 +10006452: 4d3d ldr r5, [pc, #244] @ (10006548 ) +10006454: f000 fc4e bl 10006cf4 +10006458: 7923 ldrb r3, [r4, #4] +1000645a: 70ab strb r3, [r5, #2] +1000645c: e6f2 b.n 10006244 +1000645e: 4a43 ldr r2, [pc, #268] @ (1000656c ) +10006460: 006b lsls r3, r5, #1 +10006462: 6812 ldr r2, [r2, #0] +10006464: 195b adds r3, r3, r5 +10006466: 00db lsls r3, r3, #3 +10006468: 18d3 adds r3, r2, r3 +1000646a: 2b00 cmp r3, #0 +1000646c: d0f1 beq.n 10006452 +1000646e: 685a ldr r2, [r3, #4] +10006470: e7c1 b.n 100063f6 +10006472: 4a3e ldr r2, [pc, #248] @ (1000656c ) +10006474: 006b lsls r3, r5, #1 +10006476: 6812 ldr r2, [r2, #0] +10006478: 195b adds r3, r3, r5 +1000647a: 00db lsls r3, r3, #3 +1000647c: 18d3 adds r3, r2, r3 +1000647e: 2b00 cmp r3, #0 +10006480: d0dc beq.n 1000643c +10006482: 685a ldr r2, [r3, #4] +10006484: e791 b.n 100063aa +10006486: 4a31 ldr r2, [pc, #196] @ (1000654c ) +10006488: e7b5 b.n 100063f6 +1000648a: 4839 ldr r0, [pc, #228] @ (10006570 ) +1000648c: 2800 cmp r0, #0 +1000648e: d11a bne.n 100064c6 +10006490: 7820 ldrb r0, [r4, #0] +10006492: 2100 movs r1, #0 +10006494: f7ff fdc0 bl 10006018 +10006498: 2180 movs r1, #128 @ 0x80 +1000649a: 7820 ldrb r0, [r4, #0] +1000649c: f7ff fdbc bl 10006018 +100064a0: e6d0 b.n 10006244 +100064a2: 68a3 ldr r3, [r4, #8] +100064a4: 7962 ldrb r2, [r4, #5] +100064a6: 7820 ldrb r0, [r4, #0] +100064a8: f000 fc42 bl 10006d30 +100064ac: e6ca b.n 10006244 +100064ae: 4a27 ldr r2, [pc, #156] @ (1000654c ) +100064b0: e77b b.n 100063aa +100064b2: 4a2e ldr r2, [pc, #184] @ (1000656c ) +100064b4: 0058 lsls r0, r3, #1 +100064b6: 6812 ldr r2, [r2, #0] +100064b8: 18c3 adds r3, r0, r3 +100064ba: 00db lsls r3, r3, #3 +100064bc: 18d3 adds r3, r2, r3 +100064be: 2b00 cmp r3, #0 +100064c0: d0b3 beq.n 1000642a +100064c2: 691d ldr r5, [r3, #16] +100064c4: e709 b.n 100062da +100064c6: f000 fc1f bl 10006d08 +100064ca: 2101 movs r1, #1 +100064cc: 4650 mov r0, sl +100064ce: aa0e add r2, sp, #56 @ 0x38 +100064d0: e000 b.n 100064d4 +100064d2: bf00 nop +100064d4: 2800 cmp r0, #0 +100064d6: d000 beq.n 100064da +100064d8: e6b4 b.n 10006244 +100064da: e7d9 b.n 10006490 +100064dc: 7a23 ldrb r3, [r4, #8] +100064de: 2b0f cmp r3, #15 +100064e0: d8d6 bhi.n 10006490 +100064e2: 4f1b ldr r7, [pc, #108] @ (10006550 ) +100064e4: 18eb adds r3, r5, r3 +100064e6: 78db ldrb r3, [r3, #3] +100064e8: 2f00 cmp r7, #0 +100064ea: d006 beq.n 100064fa +100064ec: 4a19 ldr r2, [pc, #100] @ (10006554 ) +100064ee: 7812 ldrb r2, [r2, #0] +100064f0: 4293 cmp r3, r2 +100064f2: d200 bcs.n 100064f6 +100064f4: e09c b.n 10006630 +100064f6: 1a9b subs r3, r3, r2 +100064f8: b2db uxtb r3, r3 +100064fa: 2b00 cmp r3, #0 +100064fc: d1c8 bne.n 10006490 +100064fe: 481d ldr r0, [pc, #116] @ (10006574 ) +10006500: 4d1d ldr r5, [pc, #116] @ (10006578 ) +10006502: f000 fc01 bl 10006d08 +10006506: 2101 movs r1, #1 +10006508: 4650 mov r0, sl +1000650a: 68eb ldr r3, [r5, #12] +1000650c: aa0e add r2, sp, #56 @ 0x38 +1000650e: 4798 blx r3 +10006510: 2800 cmp r0, #0 +10006512: d000 beq.n 10006516 +10006514: e696 b.n 10006244 +10006516: 2260 movs r2, #96 @ 0x60 +10006518: 0015 movs r5, r2 +1000651a: 7923 ldrb r3, [r4, #4] +1000651c: 401d ands r5, r3 +1000651e: 421a tst r2, r3 +10006520: d1b6 bne.n 10006490 +10006522: 7963 ldrb r3, [r4, #5] +10006524: 3b0a subs r3, #10 +10006526: 2b01 cmp r3, #1 +10006528: d8b2 bhi.n 10006490 +1000652a: f000 fbed bl 10006d08 +1000652e: 7963 ldrb r3, [r4, #5] +10006530: 2b0a cmp r3, #10 +10006532: d100 bne.n 10006536 +10006534: e17d b.n 10006832 +10006536: 4650 mov r0, sl +10006538: a90e add r1, sp, #56 @ 0x38 +1000653a: f000 fb6f bl 10006c1c +1000653e: e681 b.n 10006244 +10006540: 10008108 .word 0x10008108 +10006544: 20001670 .word 0x20001670 +10006548: 20001618 .word 0x20001618 +1000654c: 1000701d .word 0x1000701d +10006550: 10005791 .word 0x10005791 +10006554: 20001d61 .word 0x20001d61 +10006558: 10007211 .word 0x10007211 +1000655c: 1000812c .word 0x1000812c + ... +1000656c: 200012f0 .word 0x200012f0 +10006570: 00000000 .word 0x00000000 +10006574: 1000712d .word 0x1000712d +10006578: 10008194 .word 0x10008194 +1000657c: 2370 movs r3, #112 @ 0x70 +1000657e: 7a21 ldrb r1, [r4, #8] +10006580: 420b tst r3, r1 +10006582: d185 bne.n 10006490 +10006584: 09c8 lsrs r0, r1, #7 +10006586: 4684 mov ip, r0 +10006588: 330f adds r3, #15 +1000658a: 400b ands r3, r1 +1000658c: 005b lsls r3, r3, #1 +1000658e: 18e8 adds r0, r5, r3 +10006590: 4460 add r0, ip +10006592: 7cc0 ldrb r0, [r0, #19] +10006594: 4fb1 ldr r7, [pc, #708] @ (1000685c ) +10006596: 4680 mov r8, r0 +10006598: 2f00 cmp r7, #0 +1000659a: d007 beq.n 100065ac +1000659c: 48b0 ldr r0, [pc, #704] @ (10006860 ) +1000659e: 7800 ldrb r0, [r0, #0] +100065a0: 4580 cmp r8, r0 +100065a2: d350 bcc.n 10006646 +100065a4: 4647 mov r7, r8 +100065a6: 1a38 subs r0, r7, r0 +100065a8: b2c0 uxtb r0, r0 +100065aa: 4680 mov r8, r0 +100065ac: 4640 mov r0, r8 +100065ae: 2800 cmp r0, #0 +100065b0: d13a bne.n 10006628 +100065b2: 2a00 cmp r2, #0 +100065b4: d000 beq.n 100065b8 +100065b6: e0f5 b.n 100067a4 +100065b8: 4aaa ldr r2, [pc, #680] @ (10006864 ) +100065ba: 4690 mov r8, r2 +100065bc: 7967 ldrb r7, [r4, #5] +100065be: 2002 movs r0, #2 +100065c0: 003a movs r2, r7 +100065c2: 4382 bics r2, r0 +100065c4: 2a01 cmp r2, #1 +100065c6: d100 bne.n 100065ca +100065c8: e0f0 b.n 100067ac +100065ca: 2f00 cmp r7, #0 +100065cc: d000 beq.n 100065d0 +100065ce: e75f b.n 10006490 +100065d0: 18eb adds r3, r5, r3 +100065d2: 4463 add r3, ip +100065d4: 3330 adds r3, #48 @ 0x30 +100065d6: 78db ldrb r3, [r3, #3] +100065d8: aa0c add r2, sp, #48 @ 0x30 +100065da: 079b lsls r3, r3, #30 +100065dc: 0fdb lsrs r3, r3, #31 +100065de: 3202 adds r2, #2 +100065e0: 8013 strh r3, [r2, #0] +100065e2: 4650 mov r0, sl +100065e4: 2302 movs r3, #2 +100065e6: a90e add r1, sp, #56 @ 0x38 +100065e8: f000 fb2e bl 10006c48 +100065ec: e62a b.n 10006244 +100065ee: 7a23 ldrb r3, [r4, #8] +100065f0: 2b0f cmp r3, #15 +100065f2: d900 bls.n 100065f6 +100065f4: e74c b.n 10006490 +100065f6: 4f99 ldr r7, [pc, #612] @ (1000685c ) +100065f8: 18eb adds r3, r5, r3 +100065fa: 78db ldrb r3, [r3, #3] +100065fc: 2f00 cmp r7, #0 +100065fe: d006 beq.n 1000660e +10006600: 4a97 ldr r2, [pc, #604] @ (10006860 ) +10006602: 7812 ldrb r2, [r2, #0] +10006604: 4293 cmp r3, r2 +10006606: d200 bcs.n 1000660a +10006608: e0f3 b.n 100067f2 +1000660a: 1a9b subs r3, r3, r2 +1000660c: b2db uxtb r3, r3 +1000660e: 2b00 cmp r3, #0 +10006610: d000 beq.n 10006614 +10006612: e73d b.n 10006490 +10006614: 4894 ldr r0, [pc, #592] @ (10006868 ) +10006616: 4d93 ldr r5, [pc, #588] @ (10006864 ) +10006618: f000 fb76 bl 10006d08 +1000661c: 2101 movs r1, #1 +1000661e: 4650 mov r0, sl +10006620: 68eb ldr r3, [r5, #12] +10006622: aa0e add r2, sp, #56 @ 0x38 +10006624: 4798 blx r3 +10006626: e755 b.n 100064d4 +10006628: 4690 mov r8, r2 +1000662a: 2a00 cmp r2, #0 +1000662c: d0c6 beq.n 100065bc +1000662e: e72f b.n 10006490 +10006630: 4a8e ldr r2, [pc, #568] @ (1000686c ) +10006632: 0059 lsls r1, r3, #1 +10006634: 6815 ldr r5, [r2, #0] +10006636: 18cb adds r3, r1, r3 +10006638: 00db lsls r3, r3, #3 +1000663a: 18ed adds r5, r5, r3 +1000663c: 2d00 cmp r5, #0 +1000663e: d100 bne.n 10006642 +10006640: e726 b.n 10006490 +10006642: 68e8 ldr r0, [r5, #12] +10006644: e75d b.n 10006502 +10006646: 4647 mov r7, r8 +10006648: 4888 ldr r0, [pc, #544] @ (1000686c ) +1000664a: 007f lsls r7, r7, #1 +1000664c: 6800 ldr r0, [r0, #0] +1000664e: 4447 add r7, r8 +10006650: 4680 mov r8, r0 +10006652: 00ff lsls r7, r7, #3 +10006654: 44b8 add r8, r7 +10006656: 2a00 cmp r2, #0 +10006658: d0b0 beq.n 100065bc +1000665a: 4643 mov r3, r8 +1000665c: 2b00 cmp r3, #0 +1000665e: d100 bne.n 10006662 +10006660: e716 b.n 10006490 +10006662: 68d8 ldr r0, [r3, #12] +10006664: f000 fb50 bl 10006d08 +10006668: 4643 mov r3, r8 +1000666a: 2101 movs r1, #1 +1000666c: 4650 mov r0, sl +1000666e: 68db ldr r3, [r3, #12] +10006670: aa0e add r2, sp, #56 @ 0x38 +10006672: 4798 blx r3 +10006674: e72e b.n 100064d4 +10006676: 79a3 ldrb r3, [r4, #6] +10006678: 9303 str r3, [sp, #12] +1000667a: 001a movs r2, r3 +1000667c: 786b ldrb r3, [r5, #1] +1000667e: 429a cmp r2, r3 +10006680: d007 beq.n 10006692 +10006682: 786b ldrb r3, [r5, #1] +10006684: 2b00 cmp r3, #0 +10006686: d000 beq.n 1000668a +10006688: e158 b.n 1000693c +1000668a: 9b03 ldr r3, [sp, #12] +1000668c: 2b00 cmp r3, #0 +1000668e: d000 beq.n 10006692 +10006690: e0f8 b.n 10006884 +10006692: 9b03 ldr r3, [sp, #12] +10006694: 4650 mov r0, sl +10006696: a90e add r1, sp, #56 @ 0x38 +10006698: 706b strb r3, [r5, #1] +1000669a: f000 fabf bl 10006c1c +1000669e: e5d1 b.n 10006244 +100066a0: 786b ldrb r3, [r5, #1] +100066a2: aa0c add r2, sp, #48 @ 0x30 +100066a4: 3202 adds r2, #2 +100066a6: 7013 strb r3, [r2, #0] +100066a8: 4650 mov r0, sl +100066aa: 2301 movs r3, #1 +100066ac: a90e add r1, sp, #56 @ 0x38 +100066ae: f000 facb bl 10006c48 +100066b2: e5c7 b.n 10006244 +100066b4: 88e3 ldrh r3, [r4, #6] +100066b6: 0a1a lsrs r2, r3, #8 +100066b8: b2d8 uxtb r0, r3 +100066ba: 2a0f cmp r2, #15 +100066bc: d900 bls.n 100066c0 +100066be: e6e7 b.n 10006490 +100066c0: 496b ldr r1, [pc, #428] @ (10006870 ) +100066c2: 0093 lsls r3, r2, #2 +100066c4: 58cb ldr r3, [r1, r3] +100066c6: 469f mov pc, r3 +100066c8: a80e add r0, sp, #56 @ 0x38 +100066ca: f000 fb23 bl 10006d14 +100066ce: 4650 mov r0, sl +100066d0: 79a1 ldrb r1, [r4, #6] +100066d2: f7ff fb9b bl 10005e0c +100066d6: 2202 movs r2, #2 +100066d8: 782b ldrb r3, [r5, #0] +100066da: 4313 orrs r3, r2 +100066dc: 702b strb r3, [r5, #0] +100066de: e5b1 b.n 10006244 +100066e0: 88e3 ldrh r3, [r4, #6] +100066e2: 2b01 cmp r3, #1 +100066e4: d000 beq.n 100066e8 +100066e6: e6d3 b.n 10006490 +100066e8: 2208 movs r2, #8 +100066ea: 782b ldrb r3, [r5, #0] +100066ec: 4650 mov r0, sl +100066ee: 4393 bics r3, r2 +100066f0: a90e add r1, sp, #56 @ 0x38 +100066f2: 702b strb r3, [r5, #0] +100066f4: f000 fa92 bl 10006c1c +100066f8: e5a4 b.n 10006244 +100066fa: 2002 movs r0, #2 +100066fc: 7829 ldrb r1, [r5, #0] +100066fe: ab0c add r3, sp, #48 @ 0x30 +10006700: 1c9a adds r2, r3, #2 +10006702: 068b lsls r3, r1, #26 +10006704: 0889 lsrs r1, r1, #2 +10006706: 0fdb lsrs r3, r3, #31 +10006708: 4001 ands r1, r0 +1000670a: 430b orrs r3, r1 +1000670c: e768 b.n 100065e0 +1000670e: 88e3 ldrh r3, [r4, #6] +10006710: 2b01 cmp r3, #1 +10006712: d000 beq.n 10006716 +10006714: e6bc b.n 10006490 +10006716: 2208 movs r2, #8 +10006718: 782b ldrb r3, [r5, #0] +1000671a: 4650 mov r0, sl +1000671c: 4313 orrs r3, r2 +1000671e: a90e add r1, sp, #56 @ 0x38 +10006720: 702b strb r3, [r5, #0] +10006722: f000 fa7b bl 10006c1c +10006726: e58d b.n 10006244 +10006728: 4b52 ldr r3, [pc, #328] @ (10006874 ) +1000672a: 2b00 cmp r3, #0 +1000672c: d100 bne.n 10006730 +1000672e: e6af b.n 10006490 +10006730: e000 b.n 10006734 +10006732: bf00 nop +10006734: 1e02 subs r2, r0, #0 +10006736: d100 bne.n 1000673a +10006738: e6aa b.n 10006490 +1000673a: 78d3 ldrb r3, [r2, #3] +1000673c: 7891 ldrb r1, [r2, #2] +1000673e: 021b lsls r3, r3, #8 +10006740: 430b orrs r3, r1 +10006742: 4650 mov r0, sl +10006744: a90e add r1, sp, #56 @ 0x38 +10006746: f000 fa7f bl 10006c48 +1000674a: e6c3 b.n 100064d4 +1000674c: 4b4a ldr r3, [pc, #296] @ (10006878 ) +1000674e: 2b00 cmp r3, #0 +10006750: d100 bne.n 10006754 +10006752: e69d b.n 10006490 +10006754: e000 b.n 10006758 +10006756: bf00 nop +10006758: 1e02 subs r2, r0, #0 +1000675a: d100 bne.n 1000675e +1000675c: e698 b.n 10006490 +1000675e: 4650 mov r0, sl +10006760: 7813 ldrb r3, [r2, #0] +10006762: a90e add r1, sp, #56 @ 0x38 +10006764: f000 fa70 bl 10006c48 +10006768: e6b4 b.n 100064d4 +1000676a: 8921 ldrh r1, [r4, #8] +1000676c: f7ff fa12 bl 10005b94 +10006770: 1e02 subs r2, r0, #0 +10006772: d1f4 bne.n 1000675e +10006774: e68c b.n 10006490 +10006776: 2a02 cmp r2, #2 +10006778: d100 bne.n 1000677c +1000677a: e12d b.n 100069d8 +1000677c: 4b3f ldr r3, [pc, #252] @ (1000687c ) +1000677e: 2b00 cmp r3, #0 +10006780: d100 bne.n 10006784 +10006782: e685 b.n 10006490 +10006784: e000 b.n 10006788 +10006786: bf00 nop +10006788: 0002 movs r2, r0 +1000678a: 2a00 cmp r2, #0 +1000678c: d100 bne.n 10006790 +1000678e: e67f b.n 10006490 +10006790: e7d3 b.n 1000673a +10006792: f7ff f9f7 bl 10005b84 +10006796: 2312 movs r3, #18 +10006798: 0002 movs r2, r0 +1000679a: a90e add r1, sp, #56 @ 0x38 +1000679c: 4650 mov r0, sl +1000679e: f000 fa53 bl 10006c48 +100067a2: e697 b.n 100064d4 +100067a4: 4b2f ldr r3, [pc, #188] @ (10006864 ) +100067a6: 4830 ldr r0, [pc, #192] @ (10006868 ) +100067a8: 4698 mov r8, r3 +100067aa: e75b b.n 10006664 +100067ac: 88e2 ldrh r2, [r4, #6] +100067ae: 2a00 cmp r2, #0 +100067b0: d109 bne.n 100067c6 +100067b2: 4a33 ldr r2, [pc, #204] @ (10006880 ) +100067b4: 7810 ldrb r0, [r2, #0] +100067b6: 2f01 cmp r7, #1 +100067b8: d026 beq.n 10006808 +100067ba: 18ef adds r7, r5, r3 +100067bc: 4467 add r7, ip +100067be: 3730 adds r7, #48 @ 0x30 +100067c0: 78fb ldrb r3, [r7, #3] +100067c2: 079b lsls r3, r3, #30 +100067c4: d53e bpl.n 10006844 +100067c6: 4643 mov r3, r8 +100067c8: 2b00 cmp r3, #0 +100067ca: d100 bne.n 100067ce +100067cc: e53a b.n 10006244 +100067ce: 68d8 ldr r0, [r3, #12] +100067d0: f000 fa9a bl 10006d08 +100067d4: 4643 mov r3, r8 +100067d6: 2101 movs r1, #1 +100067d8: 68db ldr r3, [r3, #12] +100067da: aa0e add r2, sp, #56 @ 0x38 +100067dc: 4650 mov r0, sl +100067de: 4798 blx r3 +100067e0: 2000 movs r0, #0 +100067e2: f000 fa91 bl 10006d08 +100067e6: 2334 movs r3, #52 @ 0x34 +100067e8: 5ceb ldrb r3, [r5, r3] +100067ea: 07db lsls r3, r3, #31 +100067ec: d500 bpl.n 100067f0 +100067ee: e529 b.n 10006244 +100067f0: e6a1 b.n 10006536 +100067f2: 4a1e ldr r2, [pc, #120] @ (1000686c ) +100067f4: 0059 lsls r1, r3, #1 +100067f6: 6815 ldr r5, [r2, #0] +100067f8: 18cb adds r3, r1, r3 +100067fa: 00db lsls r3, r3, #3 +100067fc: 18ed adds r5, r5, r3 +100067fe: 2d00 cmp r5, #0 +10006800: d100 bne.n 10006804 +10006802: e645 b.n 10006490 +10006804: 68e8 ldr r0, [r5, #12] +10006806: e707 b.n 10006618 +10006808: 2230 movs r2, #48 @ 0x30 +1000680a: 4691 mov r9, r2 +1000680c: 18eb adds r3, r5, r3 +1000680e: 4463 add r3, ip +10006810: 4499 add r9, r3 +10006812: 464b mov r3, r9 +10006814: 78db ldrb r3, [r3, #3] +10006816: 079b lsls r3, r3, #30 +10006818: d5d5 bpl.n 100067c6 +1000681a: f7ff fc17 bl 1000604c +1000681e: 464b mov r3, r9 +10006820: 2202 movs r2, #2 +10006822: 78db ldrb r3, [r3, #3] +10006824: 4393 bics r3, r2 +10006826: 464a mov r2, r9 +10006828: 70d3 strb r3, [r2, #3] +1000682a: 78d3 ldrb r3, [r2, #3] +1000682c: 43bb bics r3, r7 +1000682e: 70d3 strb r3, [r2, #3] +10006830: e7c9 b.n 100067c6 +10006832: ab0c add r3, sp, #48 @ 0x30 +10006834: 1c9a adds r2, r3, #2 +10006836: 4650 mov r0, sl +10006838: 2301 movs r3, #1 +1000683a: a90e add r1, sp, #56 @ 0x38 +1000683c: 7015 strb r5, [r2, #0] +1000683e: f000 fa03 bl 10006c48 +10006842: e4ff b.n 10006244 +10006844: f7ff fbe8 bl 10006018 +10006848: 2202 movs r2, #2 +1000684a: 78fb ldrb r3, [r7, #3] +1000684c: 4313 orrs r3, r2 +1000684e: 2201 movs r2, #1 +10006850: 70fb strb r3, [r7, #3] +10006852: 78fb ldrb r3, [r7, #3] +10006854: 4313 orrs r3, r2 +10006856: 70fb strb r3, [r7, #3] +10006858: e7b5 b.n 100067c6 +1000685a: 46c0 nop @ (mov r8, r8) +1000685c: 10005791 .word 0x10005791 +10006860: 20001d61 .word 0x20001d61 +10006864: 10008194 .word 0x10008194 +10006868: 1000712d .word 0x1000712d +1000686c: 200012f0 .word 0x200012f0 +10006870: 10008154 .word 0x10008154 ... -10006564: 20001232 .word 0x20001232 -10006568: 10004af9 .word 0x10004af9 - -1000656c : -1000656c: b5f8 push {r3, r4, r5, r6, r7, lr} -1000656e: 4645 mov r5, r8 -10006570: 4657 mov r7, sl -10006572: 46de mov lr, fp -10006574: 464e mov r6, r9 -10006576: b5e0 push {r5, r6, r7, lr} -10006578: 4d46 ldr r5, [pc, #280] @ (10006694 ) -1000657a: 001f movs r7, r3 -1000657c: 78ea ldrb r2, [r5, #3] -1000657e: 4680 mov r8, r0 -10006580: 000c movs r4, r1 -10006582: 78ab ldrb r3, [r5, #2] -10006584: 428a cmp r2, r1 -10006586: d046 beq.n 10006616 -10006588: 2000 movs r0, #0 -1000658a: 428b cmp r3, r1 -1000658c: d01a beq.n 100065c4 -1000658e: bcf0 pop {r4, r5, r6, r7} -10006590: 46bb mov fp, r7 -10006592: 46b2 mov sl, r6 -10006594: 46a9 mov r9, r5 -10006596: 46a0 mov r8, r4 -10006598: bdf8 pop {r3, r4, r5, r6, r7, pc} -1000659a: 4b3f ldr r3, [pc, #252] @ (10006698 ) -1000659c: 2b00 cmp r3, #0 -1000659e: d004 beq.n 100065aa -100065a0: 4648 mov r0, r9 -100065a2: f000 f973 bl 1000688c -100065a6: 2800 cmp r0, #0 -100065a8: d06c beq.n 10006684 -100065aa: 4648 mov r0, r9 -100065ac: f000 f976 bl 1000689c -100065b0: 283f cmp r0, #63 @ 0x3f -100065b2: d907 bls.n 100065c4 -100065b4: 464e mov r6, r9 -100065b6: 3e10 subs r6, #16 -100065b8: 2000 movs r0, #0 -100065ba: 78f1 ldrb r1, [r6, #3] -100065bc: f7ff fc8e bl 10005edc -100065c0: 2800 cmp r0, #0 -100065c2: d151 bne.n 10006668 -100065c4: 78ab ldrb r3, [r5, #2] -100065c6: 42a3 cmp r3, r4 -100065c8: d001 beq.n 100065ce -100065ca: 2001 movs r0, #1 -100065cc: e7df b.n 1000658e -100065ce: 4b33 ldr r3, [pc, #204] @ (1000669c ) -100065d0: 2b00 cmp r3, #0 -100065d2: d002 beq.n 100065da -100065d4: 2000 movs r0, #0 -100065d6: e000 b.n 100065da -100065d8: bf00 nop -100065da: 2000 movs r0, #0 -100065dc: f7ff fe2c bl 10006238 -100065e0: 2800 cmp r0, #0 -100065e2: d1f2 bne.n 100065ca -100065e4: 4c2e ldr r4, [pc, #184] @ (100066a0 ) -100065e6: 0020 movs r0, r4 -100065e8: f000 f93a bl 10006860 -100065ec: 2800 cmp r0, #0 -100065ee: d1ec bne.n 100065ca -100065f0: 2f00 cmp r7, #0 -100065f2: d0ea beq.n 100065ca -100065f4: 06bf lsls r7, r7, #26 -100065f6: d1e8 bne.n 100065ca -100065f8: 3c24 subs r4, #36 @ 0x24 -100065fa: 4640 mov r0, r8 -100065fc: 78a1 ldrb r1, [r4, #2] -100065fe: f7ff fc6d bl 10005edc -10006602: 2800 cmp r0, #0 -10006604: d0e1 beq.n 100065ca -10006606: 2300 movs r3, #0 -10006608: 2200 movs r2, #0 -1000660a: 4640 mov r0, r8 -1000660c: 78a1 ldrb r1, [r4, #2] -1000660e: f7ff fc8d bl 10005f2c -10006612: 2001 movs r0, #1 -10006614: e7bb b.n 1000658e -10006616: 2392 movs r3, #146 @ 0x92 -10006618: 009b lsls r3, r3, #2 -1000661a: 18ee adds r6, r5, r3 -1000661c: 2310 movs r3, #16 -1000661e: 469b mov fp, r3 -10006620: 44ab add fp, r5 -10006622: 0031 movs r1, r6 -10006624: 4658 mov r0, fp -10006626: b2ba uxth r2, r7 -10006628: f000 fa64 bl 10006af4 -1000662c: 4b1d ldr r3, [pc, #116] @ (100066a4 ) -1000662e: 46d9 mov r9, fp -10006630: 2b00 cmp r3, #0 -10006632: d0b2 beq.n 1000659a -10006634: 796b ldrb r3, [r5, #5] -10006636: 2bff cmp r3, #255 @ 0xff -10006638: d0af beq.n 1000659a -1000663a: 2f00 cmp r7, #0 -1000663c: d0ad beq.n 1000659a -1000663e: 19f2 adds r2, r6, r7 -10006640: 4692 mov sl, r2 -10006642: e003 b.n 1000664c -10006644: 3601 adds r6, #1 -10006646: 45b2 cmp sl, r6 -10006648: d0a7 beq.n 1000659a -1000664a: 796b ldrb r3, [r5, #5] -1000664c: 7832 ldrb r2, [r6, #0] -1000664e: 429a cmp r2, r3 -10006650: d1f8 bne.n 10006644 -10006652: 4648 mov r0, r9 -10006654: f000 f91a bl 1000688c -10006658: 2800 cmp r0, #0 -1000665a: d1f3 bne.n 10006644 -1000665c: 464b mov r3, r9 -1000665e: 3b10 subs r3, #16 -10006660: 7959 ldrb r1, [r3, #5] -10006662: e000 b.n 10006666 -10006664: bf00 nop -10006666: e7ed b.n 10006644 -10006668: 4648 mov r0, r9 -1000666a: f000 f917 bl 1000689c -1000666e: 283f cmp r0, #63 @ 0x3f -10006670: d90b bls.n 1000668a -10006672: 228e movs r2, #142 @ 0x8e -10006674: 0092 lsls r2, r2, #2 -10006676: 2340 movs r3, #64 @ 0x40 -10006678: 78f1 ldrb r1, [r6, #3] -1000667a: 444a add r2, r9 -1000667c: 2000 movs r0, #0 -1000667e: f7ff fc55 bl 10005f2c -10006682: e79f b.n 100065c4 -10006684: f7fe fbac bl 10004de0 -10006688: e78f b.n 100065aa -1000668a: 78f1 ldrb r1, [r6, #3] -1000668c: 2000 movs r0, #0 -1000668e: f7ff fc39 bl 10005f04 -10006692: e797 b.n 100065c4 -10006694: 2000122c .word 0x2000122c -10006698: 10004de1 .word 0x10004de1 -1000669c: 00000000 .word 0x00000000 -100066a0: 20001250 .word 0x20001250 -100066a4: 00000000 .word 0x00000000 - -100066a8 : -100066a8: b510 push {r4, lr} -100066aa: 2000 movs r0, #0 -100066ac: f7fe fef4 bl 10005498 -100066b0: bd10 pop {r4, pc} -100066b2: 46c0 nop @ (mov r8, r8) - -100066b4 : -100066b4: b510 push {r4, lr} -100066b6: f7fe fee5 bl 10005484 -100066ba: bd10 pop {r4, pc} - -100066bc : -100066bc: 7803 ldrb r3, [r0, #0] -100066be: b570 push {r4, r5, r6, lr} -100066c0: 07db lsls r3, r3, #31 -100066c2: 0004 movs r4, r0 -100066c4: 000e movs r6, r1 -100066c6: 0fdd lsrs r5, r3, #31 -100066c8: 2b00 cmp r3, #0 -100066ca: d117 bne.n 100066fc -100066cc: 7803 ldrb r3, [r0, #0] -100066ce: 075b lsls r3, r3, #29 -100066d0: d501 bpl.n 100066d6 -100066d2: 0028 movs r0, r5 -100066d4: bd70 pop {r4, r5, r6, pc} -100066d6: 2101 movs r1, #1 -100066d8: 0030 movs r0, r6 -100066da: 4249 negs r1, r1 -100066dc: f000 fb74 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -100066e0: 7823 ldrb r3, [r4, #0] -100066e2: 07db lsls r3, r3, #31 -100066e4: 0fdd lsrs r5, r3, #31 -100066e6: 2b00 cmp r3, #0 -100066e8: d10a bne.n 10006700 -100066ea: 7823 ldrb r3, [r4, #0] -100066ec: 075b lsls r3, r3, #29 -100066ee: d408 bmi.n 10006702 -100066f0: 2204 movs r2, #4 -100066f2: 7823 ldrb r3, [r4, #0] -100066f4: 2501 movs r5, #1 -100066f6: 4313 orrs r3, r2 -100066f8: 7023 strb r3, [r4, #0] -100066fa: e002 b.n 10006702 -100066fc: 2500 movs r5, #0 -100066fe: e7e8 b.n 100066d2 -10006700: 2500 movs r5, #0 -10006702: 0030 movs r0, r6 -10006704: f000 fb30 bl 10006d68 <__mutex_exit_veneer> -10006708: e7e3 b.n 100066d2 -1000670a: 46c0 nop @ (mov r8, r8) - -1000670c : -1000670c: b570 push {r4, r5, r6, lr} -1000670e: 000c movs r4, r1 -10006710: 2101 movs r1, #1 -10006712: 0006 movs r6, r0 -10006714: 4249 negs r1, r1 -10006716: 0020 movs r0, r4 -10006718: f000 fb56 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -1000671c: 7833 ldrb r3, [r6, #0] -1000671e: 075b lsls r3, r3, #29 -10006720: 0fdd lsrs r5, r3, #31 -10006722: 2b00 cmp r3, #0 -10006724: db04 blt.n 10006730 -10006726: 0020 movs r0, r4 -10006728: f000 fb1e bl 10006d68 <__mutex_exit_veneer> -1000672c: 0028 movs r0, r5 -1000672e: bd70 pop {r4, r5, r6, pc} -10006730: 7833 ldrb r3, [r6, #0] -10006732: 07db lsls r3, r3, #31 -10006734: d404 bmi.n 10006740 -10006736: 2204 movs r2, #4 -10006738: 7833 ldrb r3, [r6, #0] -1000673a: 4393 bics r3, r2 -1000673c: 7033 strb r3, [r6, #0] -1000673e: e7f2 b.n 10006726 -10006740: 2500 movs r5, #0 -10006742: e7f0 b.n 10006726 - -10006744 : -10006744: 7943 ldrb r3, [r0, #5] -10006746: 7902 ldrb r2, [r0, #4] -10006748: 021b lsls r3, r3, #8 -1000674a: 4313 orrs r3, r2 -1000674c: 78c2 ldrb r2, [r0, #3] -1000674e: 055b lsls r3, r3, #21 -10006750: 0792 lsls r2, r2, #30 -10006752: 0d5b lsrs r3, r3, #21 -10006754: 0f92 lsrs r2, r2, #30 -10006756: 2a02 cmp r2, #2 -10006758: d01d beq.n 10006796 -1000675a: 2a03 cmp r2, #3 -1000675c: d00c beq.n 10006778 -1000675e: 2000 movs r0, #0 -10006760: 2a01 cmp r2, #1 -10006762: d108 bne.n 10006776 -10006764: 3902 subs r1, #2 -10006766: 424a negs r2, r1 -10006768: 4151 adcs r1, r2 -1000676a: 4a12 ldr r2, [pc, #72] @ (100067b4 ) -1000676c: 4694 mov ip, r2 -1000676e: 4461 add r1, ip -10006770: 4299 cmp r1, r3 -10006772: 4140 adcs r0, r0 -10006774: b2c0 uxtb r0, r0 -10006776: 4770 bx lr -10006778: 3902 subs r1, #2 -1000677a: 1e4a subs r2, r1, #1 -1000677c: 4191 sbcs r1, r2 -1000677e: 4a0e ldr r2, [pc, #56] @ (100067b8 ) -10006780: 4249 negs r1, r1 -10006782: 4011 ands r1, r2 -10006784: 2280 movs r2, #128 @ 0x80 -10006786: 00d2 lsls r2, r2, #3 -10006788: 4694 mov ip, r2 -1000678a: 2000 movs r0, #0 -1000678c: 4461 add r1, ip -1000678e: 4299 cmp r1, r3 -10006790: 4140 adcs r0, r0 -10006792: b2c0 uxtb r0, r0 -10006794: e7ef b.n 10006776 -10006796: 2902 cmp r1, #2 -10006798: d005 beq.n 100067a6 -1000679a: 2000 movs r0, #0 -1000679c: 2240 movs r2, #64 @ 0x40 -1000679e: 429a cmp r2, r3 -100067a0: 4140 adcs r0, r0 -100067a2: b2c0 uxtb r0, r0 -100067a4: e7e7 b.n 10006776 -100067a6: 4a05 ldr r2, [pc, #20] @ (100067bc ) -100067a8: 1898 adds r0, r3, r2 -100067aa: 4243 negs r3, r0 -100067ac: 4158 adcs r0, r3 -100067ae: b2c0 uxtb r0, r0 -100067b0: e7e1 b.n 10006776 -100067b2: 46c0 nop @ (mov r8, r8) -100067b4: 000003ff .word 0x000003ff -100067b8: fffffc40 .word 0xfffffc40 -100067bc: fffffe00 .word 0xfffffe00 - -100067c0 : -100067c0: 188a adds r2, r1, r2 -100067c2: b570 push {r4, r5, r6, lr} -100067c4: 4291 cmp r1, r2 -100067c6: d207 bcs.n 100067d8 -100067c8: 267f movs r6, #127 @ 0x7f -100067ca: 784c ldrb r4, [r1, #1] -100067cc: 2c05 cmp r4, #5 -100067ce: d004 beq.n 100067da -100067d0: 780c ldrb r4, [r1, #0] -100067d2: 1909 adds r1, r1, r4 -100067d4: 428a cmp r2, r1 -100067d6: d8f8 bhi.n 100067ca -100067d8: bd70 pop {r4, r5, r6, pc} -100067da: 0034 movs r4, r6 -100067dc: 788d ldrb r5, [r1, #2] -100067de: 402c ands r4, r5 -100067e0: 0064 lsls r4, r4, #1 -100067e2: 1904 adds r4, r0, r4 -100067e4: 09ed lsrs r5, r5, #7 -100067e6: 5563 strb r3, [r4, r5] -100067e8: 780c ldrb r4, [r1, #0] -100067ea: 1909 adds r1, r1, r4 -100067ec: 428a cmp r2, r1 -100067ee: d8ec bhi.n 100067ca -100067f0: e7f2 b.n 100067d8 -100067f2: 46c0 nop @ (mov r8, r8) - -100067f4 : -100067f4: b5f0 push {r4, r5, r6, r7, lr} -100067f6: 46c6 mov lr, r8 -100067f8: b500 push {lr} -100067fa: 0004 movs r4, r0 -100067fc: a806 add r0, sp, #24 -100067fe: 7805 ldrb r5, [r0, #0] -10006800: 2080 movs r0, #128 @ 0x80 -10006802: 4688 mov r8, r1 -10006804: 0017 movs r7, r2 -10006806: 001e movs r6, r3 -10006808: 0200 lsls r0, r0, #8 -1000680a: 4282 cmp r2, r0 -1000680c: d826 bhi.n 1000685c -1000680e: 68e0 ldr r0, [r4, #12] -10006810: 2800 cmp r0, #0 -10006812: d003 beq.n 1000681c -10006814: 2101 movs r1, #1 -10006816: 4249 negs r1, r1 -10006818: f000 fad6 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -1000681c: 6920 ldr r0, [r4, #16] -1000681e: 2800 cmp r0, #0 -10006820: d003 beq.n 1000682a -10006822: 2101 movs r1, #1 -10006824: 4249 negs r1, r1 -10006826: f000 facf bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -1000682a: 4643 mov r3, r8 -1000682c: 6023 str r3, [r4, #0] -1000682e: 0473 lsls r3, r6, #17 -10006830: 0c5b lsrs r3, r3, #17 -10006832: 03ed lsls r5, r5, #15 -10006834: 431d orrs r5, r3 -10006836: 2300 movs r3, #0 -10006838: 68e0 ldr r0, [r4, #12] -1000683a: 8163 strh r3, [r4, #10] -1000683c: 80a7 strh r7, [r4, #4] -1000683e: 80e5 strh r5, [r4, #6] -10006840: 8123 strh r3, [r4, #8] -10006842: 2800 cmp r0, #0 -10006844: d001 beq.n 1000684a -10006846: f000 fa8f bl 10006d68 <__mutex_exit_veneer> -1000684a: 6920 ldr r0, [r4, #16] -1000684c: 2800 cmp r0, #0 -1000684e: d001 beq.n 10006854 -10006850: f000 fa8a bl 10006d68 <__mutex_exit_veneer> -10006854: 2001 movs r0, #1 -10006856: bc80 pop {r7} -10006858: 46b8 mov r8, r7 -1000685a: bdf0 pop {r4, r5, r6, r7, pc} -1000685c: 2000 movs r0, #0 -1000685e: e7fa b.n 10006856 - -10006860 : -10006860: b510 push {r4, lr} -10006862: 8904 ldrh r4, [r0, #8] -10006864: 8941 ldrh r1, [r0, #10] -10006866: 8882 ldrh r2, [r0, #4] -10006868: b2a3 uxth r3, r4 -1000686a: b288 uxth r0, r1 -1000686c: 428c cmp r4, r1 -1000686e: d307 bcc.n 10006880 -10006870: 1a1b subs r3, r3, r0 -10006872: b29b uxth r3, r3 -10006874: 1c10 adds r0, r2, #0 -10006876: 429a cmp r2, r3 -10006878: d900 bls.n 1000687c -1000687a: 1c18 adds r0, r3, #0 -1000687c: b280 uxth r0, r0 -1000687e: bd10 pop {r4, pc} -10006880: 0051 lsls r1, r2, #1 -10006882: 1a09 subs r1, r1, r0 -10006884: 185b adds r3, r3, r1 -10006886: b29b uxth r3, r3 -10006888: e7f4 b.n 10006874 -1000688a: 46c0 nop @ (mov r8, r8) - -1000688c : -1000688c: 8903 ldrh r3, [r0, #8] -1000688e: 8940 ldrh r0, [r0, #10] -10006890: 1a18 subs r0, r3, r0 -10006892: 4243 negs r3, r0 -10006894: 4158 adcs r0, r3 -10006896: b2c0 uxtb r0, r0 -10006898: 4770 bx lr -1000689a: 46c0 nop @ (mov r8, r8) - -1000689c : -1000689c: b510 push {r4, lr} -1000689e: 8904 ldrh r4, [r0, #8] -100068a0: 8941 ldrh r1, [r0, #10] -100068a2: 8882 ldrh r2, [r0, #4] -100068a4: b2a3 uxth r3, r4 -100068a6: b288 uxth r0, r1 -100068a8: 428c cmp r4, r1 -100068aa: d307 bcc.n 100068bc -100068ac: 1a1b subs r3, r3, r0 -100068ae: b29b uxth r3, r3 -100068b0: 2000 movs r0, #0 -100068b2: 429a cmp r2, r3 -100068b4: d901 bls.n 100068ba -100068b6: 1ad2 subs r2, r2, r3 -100068b8: b290 uxth r0, r2 -100068ba: bd10 pop {r4, pc} -100068bc: 0051 lsls r1, r2, #1 -100068be: 1a09 subs r1, r1, r0 -100068c0: 185b adds r3, r3, r1 -100068c2: b29b uxth r3, r3 -100068c4: e7f4 b.n 100068b0 -100068c6: 46c0 nop @ (mov r8, r8) - -100068c8 : -100068c8: b570 push {r4, r5, r6, lr} -100068ca: 0004 movs r4, r0 -100068cc: 6900 ldr r0, [r0, #16] -100068ce: 000e movs r6, r1 -100068d0: 2800 cmp r0, #0 -100068d2: d003 beq.n 100068dc -100068d4: 2101 movs r1, #1 -100068d6: 4249 negs r1, r1 -100068d8: f000 fa76 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -100068dc: 8925 ldrh r5, [r4, #8] -100068de: 8960 ldrh r0, [r4, #10] -100068e0: 88a2 ldrh r2, [r4, #4] -100068e2: b2a9 uxth r1, r5 -100068e4: b283 uxth r3, r0 -100068e6: 4285 cmp r5, r0 -100068e8: d32c bcc.n 10006944 -100068ea: 1acd subs r5, r1, r3 -100068ec: b2ad uxth r5, r5 -100068ee: 2d00 cmp r5, #0 -100068f0: d02e beq.n 10006950 -100068f2: 42aa cmp r2, r5 -100068f4: d208 bcs.n 10006908 -100068f6: 4291 cmp r1, r2 -100068f8: d330 bcc.n 1000695c -100068fa: 1a89 subs r1, r1, r2 -100068fc: b28b uxth r3, r1 -100068fe: 8163 strh r3, [r4, #10] -10006900: 429a cmp r2, r3 -10006902: d803 bhi.n 1000690c -10006904: 1a9b subs r3, r3, r2 -10006906: b29b uxth r3, r3 -10006908: 429a cmp r2, r3 -1000690a: d9fb bls.n 10006904 -1000690c: 88e2 ldrh r2, [r4, #6] -1000690e: 6821 ldr r1, [r4, #0] -10006910: 0452 lsls r2, r2, #17 -10006912: 0c52 lsrs r2, r2, #17 -10006914: 4353 muls r3, r2 -10006916: 0030 movs r0, r6 -10006918: 18c9 adds r1, r1, r3 -1000691a: f7fd fdd9 bl 100044d0 <__wrap___aeabi_memcpy> -1000691e: 8963 ldrh r3, [r4, #10] -10006920: 2501 movs r5, #1 -10006922: 1c59 adds r1, r3, #1 -10006924: b289 uxth r1, r1 -10006926: 88a2 ldrh r2, [r4, #4] -10006928: 428b cmp r3, r1 -1000692a: d913 bls.n 10006954 -1000692c: 2100 movs r1, #0 -1000692e: 0052 lsls r2, r2, #1 -10006930: 1a89 subs r1, r1, r2 -10006932: b289 uxth r1, r1 -10006934: 6920 ldr r0, [r4, #16] -10006936: 8161 strh r1, [r4, #10] -10006938: 2800 cmp r0, #0 -1000693a: d001 beq.n 10006940 -1000693c: f000 fa14 bl 10006d68 <__mutex_exit_veneer> -10006940: 0028 movs r0, r5 -10006942: bd70 pop {r4, r5, r6, pc} -10006944: 0055 lsls r5, r2, #1 -10006946: 1aed subs r5, r5, r3 -10006948: 194d adds r5, r1, r5 -1000694a: b2ad uxth r5, r5 -1000694c: 2d00 cmp r5, #0 -1000694e: d1d0 bne.n 100068f2 -10006950: 8961 ldrh r1, [r4, #10] -10006952: b289 uxth r1, r1 -10006954: 0052 lsls r2, r2, #1 -10006956: 4291 cmp r1, r2 -10006958: dbec blt.n 10006934 -1000695a: e7e9 b.n 10006930 -1000695c: 1889 adds r1, r1, r2 -1000695e: b28b uxth r3, r1 -10006960: 8163 strh r3, [r4, #10] -10006962: e7cd b.n 10006900 - -10006964 : -10006964: b5f0 push {r4, r5, r6, r7, lr} -10006966: 4646 mov r6, r8 -10006968: 464f mov r7, r9 -1000696a: 46d6 mov lr, sl -1000696c: b5c0 push {r6, r7, lr} -1000696e: 0006 movs r6, r0 -10006970: 6900 ldr r0, [r0, #16] -10006972: 4689 mov r9, r1 -10006974: 4690 mov r8, r2 -10006976: 2800 cmp r0, #0 -10006978: d003 beq.n 10006982 -1000697a: 2101 movs r1, #1 -1000697c: 4249 negs r1, r1 -1000697e: f000 fa23 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -10006982: 8931 ldrh r1, [r6, #8] -10006984: 8972 ldrh r2, [r6, #10] -10006986: 88b5 ldrh r5, [r6, #4] -10006988: b28b uxth r3, r1 -1000698a: b294 uxth r4, r2 -1000698c: 4291 cmp r1, r2 -1000698e: d354 bcc.n 10006a3a -10006990: 1b1f subs r7, r3, r4 -10006992: b2bf uxth r7, r7 -10006994: 2f00 cmp r7, #0 -10006996: d04a beq.n 10006a2e -10006998: 42bd cmp r5, r7 -1000699a: d205 bcs.n 100069a8 -1000699c: 42ab cmp r3, r5 -1000699e: d251 bcs.n 10006a44 -100069a0: 195b adds r3, r3, r5 -100069a2: b29c uxth r4, r3 -100069a4: 002f movs r7, r5 -100069a6: 8174 strh r4, [r6, #10] -100069a8: 4643 mov r3, r8 -100069aa: 45b8 cmp r8, r7 -100069ac: d83d bhi.n 10006a2a -100069ae: b29f uxth r7, r3 -100069b0: 42a5 cmp r5, r4 -100069b2: d803 bhi.n 100069bc -100069b4: 1b64 subs r4, r4, r5 -100069b6: b2a4 uxth r4, r4 -100069b8: 42a5 cmp r5, r4 -100069ba: d9fb bls.n 100069b4 -100069bc: 88f2 ldrh r2, [r6, #6] -100069be: 6831 ldr r1, [r6, #0] -100069c0: 0452 lsls r2, r2, #17 -100069c2: 0c52 lsrs r2, r2, #17 -100069c4: 4690 mov r8, r2 -100069c6: 4362 muls r2, r4 -100069c8: 1b2b subs r3, r5, r4 -100069ca: b29b uxth r3, r3 -100069cc: 1889 adds r1, r1, r2 -100069ce: 4642 mov r2, r8 -100069d0: 429f cmp r7, r3 -100069d2: d925 bls.n 10006a20 -100069d4: 4353 muls r3, r2 -100069d6: b29b uxth r3, r3 -100069d8: 001a movs r2, r3 -100069da: 4648 mov r0, r9 -100069dc: 469a mov sl, r3 -100069de: f7fd fd77 bl 100044d0 <__wrap___aeabi_memcpy> -100069e2: 4643 mov r3, r8 -100069e4: 4648 mov r0, r9 -100069e6: 1b7d subs r5, r7, r5 -100069e8: 1964 adds r4, r4, r5 -100069ea: 435c muls r4, r3 -100069ec: 6831 ldr r1, [r6, #0] -100069ee: 4450 add r0, sl -100069f0: b2a2 uxth r2, r4 -100069f2: f7fd fd6d bl 100044d0 <__wrap___aeabi_memcpy> -100069f6: 8971 ldrh r1, [r6, #10] -100069f8: 88b5 ldrh r5, [r6, #4] -100069fa: 19cb adds r3, r1, r7 -100069fc: b29b uxth r3, r3 -100069fe: 006a lsls r2, r5, #1 -10006a00: 4299 cmp r1, r3 -10006a02: d916 bls.n 10006a32 -10006a04: 1a9b subs r3, r3, r2 -10006a06: b29b uxth r3, r3 -10006a08: 6930 ldr r0, [r6, #16] -10006a0a: 8173 strh r3, [r6, #10] -10006a0c: 2800 cmp r0, #0 -10006a0e: d001 beq.n 10006a14 -10006a10: f000 f9aa bl 10006d68 <__mutex_exit_veneer> -10006a14: 0038 movs r0, r7 -10006a16: bce0 pop {r5, r6, r7} -10006a18: 46ba mov sl, r7 -10006a1a: 46b1 mov r9, r6 -10006a1c: 46a8 mov r8, r5 -10006a1e: bdf0 pop {r4, r5, r6, r7, pc} -10006a20: 4648 mov r0, r9 -10006a22: 437a muls r2, r7 -10006a24: f7fd fd54 bl 100044d0 <__wrap___aeabi_memcpy> -10006a28: e7e5 b.n 100069f6 -10006a2a: 1c3b adds r3, r7, #0 -10006a2c: e7bf b.n 100069ae -10006a2e: 8973 ldrh r3, [r6, #10] -10006a30: b29b uxth r3, r3 -10006a32: 006a lsls r2, r5, #1 -10006a34: 4293 cmp r3, r2 -10006a36: dbe7 blt.n 10006a08 -10006a38: e7e4 b.n 10006a04 -10006a3a: 006f lsls r7, r5, #1 -10006a3c: 1b3f subs r7, r7, r4 -10006a3e: 19df adds r7, r3, r7 -10006a40: b2bf uxth r7, r7 -10006a42: e7a7 b.n 10006994 -10006a44: 1b5b subs r3, r3, r5 -10006a46: b29c uxth r4, r3 -10006a48: e7ac b.n 100069a4 -10006a4a: 46c0 nop @ (mov r8, r8) - -10006a4c : -10006a4c: b5f8 push {r3, r4, r5, r6, r7, lr} -10006a4e: 0004 movs r4, r0 -10006a50: 68c0 ldr r0, [r0, #12] -10006a52: 000e movs r6, r1 -10006a54: 2800 cmp r0, #0 -10006a56: d003 beq.n 10006a60 -10006a58: 2101 movs r1, #1 -10006a5a: 4249 negs r1, r1 -10006a5c: f000 f9b4 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -10006a60: 8925 ldrh r5, [r4, #8] -10006a62: 8920 ldrh r0, [r4, #8] -10006a64: 8961 ldrh r1, [r4, #10] -10006a66: 88a2 ldrh r2, [r4, #4] -10006a68: b2ad uxth r5, r5 -10006a6a: b283 uxth r3, r0 -10006a6c: b28f uxth r7, r1 -10006a6e: 4288 cmp r0, r1 -10006a70: d329 bcc.n 10006ac6 -10006a72: 1bdb subs r3, r3, r7 -10006a74: b29b uxth r3, r3 -10006a76: 429a cmp r2, r3 -10006a78: d809 bhi.n 10006a8e -10006a7a: 79e7 ldrb r7, [r4, #7] -10006a7c: 09ff lsrs r7, r7, #7 -10006a7e: d106 bne.n 10006a8e -10006a80: 68e0 ldr r0, [r4, #12] -10006a82: 2800 cmp r0, #0 -10006a84: d001 beq.n 10006a8a -10006a86: f000 f96f bl 10006d68 <__mutex_exit_veneer> -10006a8a: 0038 movs r0, r7 -10006a8c: bdf8 pop {r3, r4, r5, r6, r7, pc} -10006a8e: 4295 cmp r5, r2 -10006a90: d31e bcc.n 10006ad0 -10006a92: 002b movs r3, r5 -10006a94: 1a9b subs r3, r3, r2 -10006a96: b29b uxth r3, r3 -10006a98: 4293 cmp r3, r2 -10006a9a: d2fb bcs.n 10006a94 -10006a9c: 88e2 ldrh r2, [r4, #6] -10006a9e: 6820 ldr r0, [r4, #0] -10006aa0: 0452 lsls r2, r2, #17 -10006aa2: 0c52 lsrs r2, r2, #17 -10006aa4: 4353 muls r3, r2 -10006aa6: 0031 movs r1, r6 -10006aa8: 18c0 adds r0, r0, r3 -10006aaa: f7fd fd11 bl 100044d0 <__wrap___aeabi_memcpy> -10006aae: 1c6b adds r3, r5, #1 -10006ab0: b29b uxth r3, r3 -10006ab2: 88a2 ldrh r2, [r4, #4] -10006ab4: 429d cmp r5, r3 -10006ab6: d918 bls.n 10006aea -10006ab8: 2300 movs r3, #0 -10006aba: 0052 lsls r2, r2, #1 -10006abc: 1a9b subs r3, r3, r2 -10006abe: b29b uxth r3, r3 -10006ac0: 2701 movs r7, #1 -10006ac2: 8123 strh r3, [r4, #8] -10006ac4: e7dc b.n 10006a80 -10006ac6: 0051 lsls r1, r2, #1 -10006ac8: 1bc9 subs r1, r1, r7 -10006aca: 185b adds r3, r3, r1 -10006acc: b29b uxth r3, r3 -10006ace: e7d2 b.n 10006a76 -10006ad0: 002b movs r3, r5 -10006ad2: 88e2 ldrh r2, [r4, #6] -10006ad4: 6820 ldr r0, [r4, #0] -10006ad6: 0452 lsls r2, r2, #17 -10006ad8: 0c52 lsrs r2, r2, #17 -10006ada: 4353 muls r3, r2 -10006adc: 0031 movs r1, r6 -10006ade: 18c0 adds r0, r0, r3 -10006ae0: f7fd fcf6 bl 100044d0 <__wrap___aeabi_memcpy> -10006ae4: 3501 adds r5, #1 -10006ae6: 88a2 ldrh r2, [r4, #4] -10006ae8: b2ab uxth r3, r5 -10006aea: 0052 lsls r2, r2, #1 -10006aec: 4293 cmp r3, r2 -10006aee: dbe7 blt.n 10006ac0 -10006af0: e7e4 b.n 10006abc -10006af2: 46c0 nop @ (mov r8, r8) - -10006af4 : -10006af4: b5f0 push {r4, r5, r6, r7, lr} -10006af6: 4657 mov r7, sl -10006af8: 4645 mov r5, r8 -10006afa: 46de mov lr, fp -10006afc: 464e mov r6, r9 -10006afe: b5e0 push {r5, r6, r7, lr} -10006b00: 0014 movs r4, r2 -10006b02: 0005 movs r5, r0 -10006b04: 000f movs r7, r1 -10006b06: b083 sub sp, #12 -10006b08: 2a00 cmp r2, #0 -10006b0a: d075 beq.n 10006bf8 -10006b0c: 68c0 ldr r0, [r0, #12] -10006b0e: 2800 cmp r0, #0 -10006b10: d003 beq.n 10006b1a -10006b12: 2101 movs r1, #1 -10006b14: 4249 negs r1, r1 -10006b16: f000 f957 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -10006b1a: 892e ldrh r6, [r5, #8] -10006b1c: 79e9 ldrb r1, [r5, #7] -10006b1e: 896a ldrh r2, [r5, #10] -10006b20: 88ab ldrh r3, [r5, #4] -10006b22: b2b6 uxth r6, r6 -10006b24: b292 uxth r2, r2 -10006b26: 09c9 lsrs r1, r1, #7 -10006b28: d145 bne.n 10006bb6 -10006b2a: 4296 cmp r6, r2 -10006b2c: d300 bcc.n 10006b30 -10006b2e: e06d b.n 10006c0c -10006b30: 0059 lsls r1, r3, #1 -10006b32: 1a8a subs r2, r1, r2 -10006b34: 18b2 adds r2, r6, r2 -10006b36: b292 uxth r2, r2 -10006b38: 2100 movs r1, #0 -10006b3a: 4689 mov r9, r1 -10006b3c: 429a cmp r2, r3 -10006b3e: d234 bcs.n 10006baa -10006b40: 1a9a subs r2, r3, r2 -10006b42: 1c11 adds r1, r2, #0 -10006b44: b292 uxth r2, r2 -10006b46: 42a2 cmp r2, r4 -10006b48: d900 bls.n 10006b4c -10006b4a: 1c21 adds r1, r4, #0 -10006b4c: b28a uxth r2, r1 -10006b4e: 4691 mov r9, r2 -10006b50: 88ea ldrh r2, [r5, #6] -10006b52: 0452 lsls r2, r2, #17 -10006b54: 0c52 lsrs r2, r2, #17 -10006b56: 4690 mov r8, r2 -10006b58: 464a mov r2, r9 -10006b5a: 18b2 adds r2, r6, r2 -10006b5c: b292 uxth r2, r2 -10006b5e: 4692 mov sl, r2 -10006b60: 464a mov r2, r9 -10006b62: 1ad2 subs r2, r2, r3 -10006b64: b292 uxth r2, r2 -10006b66: 4693 mov fp, r2 -10006b68: 0034 movs r4, r6 -10006b6a: 429e cmp r6, r3 -10006b6c: d303 bcc.n 10006b76 -10006b6e: 1ae4 subs r4, r4, r3 -10006b70: b2a4 uxth r4, r4 -10006b72: 429c cmp r4, r3 -10006b74: d2fb bcs.n 10006b6e -10006b76: 4642 mov r2, r8 -10006b78: 4362 muls r2, r4 -10006b7a: 6828 ldr r0, [r5, #0] -10006b7c: 1b1b subs r3, r3, r4 -10006b7e: b29b uxth r3, r3 -10006b80: 1880 adds r0, r0, r2 -10006b82: 4642 mov r2, r8 -10006b84: 454b cmp r3, r9 -10006b86: d354 bcc.n 10006c32 -10006b88: 464b mov r3, r9 -10006b8a: 0039 movs r1, r7 -10006b8c: 435a muls r2, r3 -10006b8e: f7fd fc9f bl 100044d0 <__wrap___aeabi_memcpy> -10006b92: 88ab ldrh r3, [r5, #4] -10006b94: 005b lsls r3, r3, #1 -10006b96: 45b2 cmp sl, r6 -10006b98: d301 bcc.n 10006b9e -10006b9a: 459a cmp sl, r3 -10006b9c: db03 blt.n 10006ba6 -10006b9e: 4652 mov r2, sl -10006ba0: 1ad3 subs r3, r2, r3 -10006ba2: b29b uxth r3, r3 -10006ba4: 469a mov sl, r3 -10006ba6: 4653 mov r3, sl -10006ba8: 812b strh r3, [r5, #8] -10006baa: 68e8 ldr r0, [r5, #12] -10006bac: 2800 cmp r0, #0 -10006bae: d025 beq.n 10006bfc -10006bb0: f000 f8da bl 10006d68 <__mutex_exit_veneer> -10006bb4: e022 b.n 10006bfc -10006bb6: 88e9 ldrh r1, [r5, #6] -10006bb8: 0449 lsls r1, r1, #17 -10006bba: 0c49 lsrs r1, r1, #17 -10006bbc: 4688 mov r8, r1 -10006bbe: 429c cmp r4, r3 -10006bc0: d227 bcs.n 10006c12 -10006bc2: 4296 cmp r6, r2 -10006bc4: d347 bcc.n 10006c56 -10006bc6: 1ab1 subs r1, r6, r2 -10006bc8: b289 uxth r1, r1 -10006bca: 468c mov ip, r1 -10006bcc: 0058 lsls r0, r3, #1 -10006bce: 1ae1 subs r1, r4, r3 -10006bd0: b289 uxth r1, r1 -10006bd2: 468b mov fp, r1 -10006bd4: 4661 mov r1, ip -10006bd6: 1909 adds r1, r1, r4 -10006bd8: 4281 cmp r1, r0 -10006bda: db08 blt.n 10006bee -10006bdc: 18d1 adds r1, r2, r3 -10006bde: b289 uxth r1, r1 -10006be0: 1b0e subs r6, r1, r4 -10006be2: b2b6 uxth r6, r6 -10006be4: 468a mov sl, r1 -10006be6: 42b2 cmp r2, r6 -10006be8: d93b bls.n 10006c62 -10006bea: 1a36 subs r6, r6, r0 -10006bec: b2b6 uxth r6, r6 -10006bee: 19a2 adds r2, r4, r6 -10006bf0: b292 uxth r2, r2 -10006bf2: 4692 mov sl, r2 -10006bf4: 46a1 mov r9, r4 -10006bf6: e7b7 b.n 10006b68 -10006bf8: 2300 movs r3, #0 -10006bfa: 4699 mov r9, r3 -10006bfc: 4648 mov r0, r9 -10006bfe: b003 add sp, #12 -10006c00: bcf0 pop {r4, r5, r6, r7} -10006c02: 46bb mov fp, r7 -10006c04: 46b2 mov sl, r6 -10006c06: 46a9 mov r9, r5 -10006c08: 46a0 mov r8, r4 -10006c0a: bdf0 pop {r4, r5, r6, r7, pc} -10006c0c: 1ab2 subs r2, r6, r2 -10006c0e: b292 uxth r2, r2 -10006c10: e792 b.n 10006b38 -10006c12: 2100 movs r1, #0 -10006c14: 4689 mov r9, r1 -10006c16: 2b00 cmp r3, #0 -10006c18: d0c7 beq.n 10006baa -10006c1a: 4641 mov r1, r8 -10006c1c: 1ae4 subs r4, r4, r3 -10006c1e: 434c muls r4, r1 -10006c20: 0016 movs r6, r2 -10006c22: 18d1 adds r1, r2, r3 -10006c24: 2200 movs r2, #0 -10006c26: b289 uxth r1, r1 -10006c28: 468a mov sl, r1 -10006c2a: 4699 mov r9, r3 -10006c2c: 4693 mov fp, r2 -10006c2e: 193f adds r7, r7, r4 -10006c30: e79a b.n 10006b68 -10006c32: 4353 muls r3, r2 -10006c34: b29b uxth r3, r3 -10006c36: 001a movs r2, r3 -10006c38: 0039 movs r1, r7 -10006c3a: 445c add r4, fp -10006c3c: 9301 str r3, [sp, #4] -10006c3e: f7fd fc47 bl 100044d0 <__wrap___aeabi_memcpy> -10006c42: 4641 mov r1, r8 -10006c44: 0022 movs r2, r4 -10006c46: 434a muls r2, r1 -10006c48: 9b01 ldr r3, [sp, #4] -10006c4a: 6828 ldr r0, [r5, #0] -10006c4c: b292 uxth r2, r2 -10006c4e: 18f9 adds r1, r7, r3 -10006c50: f7fd fc3e bl 100044d0 <__wrap___aeabi_memcpy> -10006c54: e79d b.n 10006b92 -10006c56: 0058 lsls r0, r3, #1 -10006c58: 1a81 subs r1, r0, r2 -10006c5a: 1871 adds r1, r6, r1 -10006c5c: b289 uxth r1, r1 -10006c5e: 468c mov ip, r1 -10006c60: e7b5 b.n 10006bce -10006c62: 46a1 mov r9, r4 -10006c64: 42b0 cmp r0, r6 -10006c66: dd00 ble.n 10006c6a -10006c68: e77e b.n 10006b68 -10006c6a: e7be b.n 10006bea - -10006c6c : -10006c6c: b510 push {r4, lr} -10006c6e: 0004 movs r4, r0 -10006c70: 68c0 ldr r0, [r0, #12] -10006c72: 2800 cmp r0, #0 -10006c74: d003 beq.n 10006c7e -10006c76: 2101 movs r1, #1 -10006c78: 4249 negs r1, r1 -10006c7a: f000 f8a5 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -10006c7e: 6920 ldr r0, [r4, #16] -10006c80: 2800 cmp r0, #0 -10006c82: d003 beq.n 10006c8c -10006c84: 2101 movs r1, #1 -10006c86: 4249 negs r1, r1 -10006c88: f000 f89e bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -10006c8c: 2300 movs r3, #0 -10006c8e: 68e0 ldr r0, [r4, #12] -10006c90: 8163 strh r3, [r4, #10] -10006c92: 8123 strh r3, [r4, #8] -10006c94: 2800 cmp r0, #0 -10006c96: d001 beq.n 10006c9c -10006c98: f000 f866 bl 10006d68 <__mutex_exit_veneer> -10006c9c: 6920 ldr r0, [r4, #16] -10006c9e: 2800 cmp r0, #0 -10006ca0: d001 beq.n 10006ca6 -10006ca2: f000 f861 bl 10006d68 <__mutex_exit_veneer> -10006ca6: 2001 movs r0, #1 -10006ca8: bd10 pop {r4, pc} -10006caa: 46c0 nop @ (mov r8, r8) - -10006cac : -10006cac: b570 push {r4, r5, r6, lr} -10006cae: 0004 movs r4, r0 -10006cb0: 68c0 ldr r0, [r0, #12] -10006cb2: 000d movs r5, r1 -10006cb4: 2800 cmp r0, #0 -10006cb6: d003 beq.n 10006cc0 -10006cb8: 2101 movs r1, #1 -10006cba: 4249 negs r1, r1 -10006cbc: f000 f884 bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -10006cc0: 6920 ldr r0, [r4, #16] -10006cc2: 2800 cmp r0, #0 -10006cc4: d003 beq.n 10006cce -10006cc6: 2101 movs r1, #1 -10006cc8: 4249 negs r1, r1 -10006cca: f000 f87d bl 10006dc8 <__mutex_enter_timeout_ms_veneer> -10006cce: 217f movs r1, #127 @ 0x7f -10006cd0: 79e3 ldrb r3, [r4, #7] -10006cd2: 01ed lsls r5, r5, #7 -10006cd4: 4019 ands r1, r3 -10006cd6: 68e0 ldr r0, [r4, #12] -10006cd8: 4329 orrs r1, r5 -10006cda: 71e1 strb r1, [r4, #7] -10006cdc: 2800 cmp r0, #0 -10006cde: d001 beq.n 10006ce4 -10006ce0: f000 f842 bl 10006d68 <__mutex_exit_veneer> -10006ce4: 6920 ldr r0, [r4, #16] -10006ce6: 2800 cmp r0, #0 -10006ce8: d001 beq.n 10006cee -10006cea: f000 f83d bl 10006d68 <__mutex_exit_veneer> -10006cee: 2001 movs r0, #1 -10006cf0: bd70 pop {r4, r5, r6, pc} -10006cf2: 46c0 nop @ (mov r8, r8) - -10006cf4 : +10006880: 20000f94 .word 0x20000f94 +10006884: 1e58 subs r0, r3, #1 +10006886: b2c0 uxtb r0, r0 +10006888: f7ff f980 bl 10005b8c +1000688c: 2800 cmp r0, #0 +1000688e: d100 bne.n 10006892 +10006890: e5fe b.n 10006490 +10006892: 7843 ldrb r3, [r0, #1] +10006894: 9307 str r3, [sp, #28] +10006896: 2b02 cmp r3, #2 +10006898: d000 beq.n 1000689c +1000689a: e5f9 b.n 10006490 +1000689c: 2101 movs r1, #1 +1000689e: 79c2 ldrb r2, [r0, #7] +100068a0: 46b1 mov r9, r6 +100068a2: 1193 asrs r3, r2, #6 +100068a4: 1152 asrs r2, r2, #5 +100068a6: 400b ands r3, r1 +100068a8: 400a ands r2, r1 +100068aa: 0112 lsls r2, r2, #4 +100068ac: 015b lsls r3, r3, #5 +100068ae: 4313 orrs r3, r2 +100068b0: 782a ldrb r2, [r5, #0] +100068b2: 312f adds r1, #47 @ 0x2f +100068b4: 438a bics r2, r1 +100068b6: 4313 orrs r3, r2 +100068b8: 702b strb r3, [r5, #0] +100068ba: 2309 movs r3, #9 +100068bc: 4698 mov r8, r3 +100068be: 4480 add r8, r0 +100068c0: 4647 mov r7, r8 +100068c2: 46a8 mov r8, r5 +100068c4: 78c3 ldrb r3, [r0, #3] +100068c6: 7882 ldrb r2, [r0, #2] +100068c8: 021b lsls r3, r3, #8 +100068ca: 4313 orrs r3, r2 +100068cc: 18c3 adds r3, r0, r3 +100068ce: 9304 str r3, [sp, #16] +100068d0: 4b5c ldr r3, [pc, #368] @ (10006a44 ) +100068d2: 9309 str r3, [sp, #36] @ 0x24 +100068d4: 9b04 ldr r3, [sp, #16] +100068d6: 42bb cmp r3, r7 +100068d8: d800 bhi.n 100068dc +100068da: e081 b.n 100069e0 +100068dc: 787b ldrb r3, [r7, #1] +100068de: 2201 movs r2, #1 +100068e0: 2b0b cmp r3, #11 +100068e2: d102 bne.n 100068ea +100068e4: 783b ldrb r3, [r7, #0] +100068e6: 78fa ldrb r2, [r7, #3] +100068e8: 18ff adds r7, r7, r3 +100068ea: 787b ldrb r3, [r7, #1] +100068ec: 2b04 cmp r3, #4 +100068ee: d123 bne.n 10006938 +100068f0: 2500 movs r5, #0 +100068f2: 9b04 ldr r3, [sp, #16] +100068f4: 920b str r2, [sp, #44] @ 0x2c +100068f6: 1bdb subs r3, r3, r7 +100068f8: b29b uxth r3, r3 +100068fa: 9305 str r3, [sp, #20] +100068fc: 4b52 ldr r3, [pc, #328] @ (10006a48 ) +100068fe: 7819 ldrb r1, [r3, #0] +10006900: 9306 str r3, [sp, #24] +10006902: 4b52 ldr r3, [pc, #328] @ (10006a4c ) +10006904: 930a str r3, [sp, #40] @ 0x28 +10006906: 4b52 ldr r3, [pc, #328] @ (10006a50 ) +10006908: 9308 str r3, [sp, #32] +1000690a: 9b0a ldr r3, [sp, #40] @ 0x28 +1000690c: 2b00 cmp r3, #0 +1000690e: d052 beq.n 100069b6 +10006910: 9b09 ldr r3, [sp, #36] @ 0x24 +10006912: 9e08 ldr r6, [sp, #32] +10006914: 428d cmp r5, r1 +10006916: d345 bcc.n 100069a4 +10006918: 0039 movs r1, r7 +1000691a: 4650 mov r0, sl +1000691c: 9a05 ldr r2, [sp, #20] +1000691e: 4798 blx r3 +10006920: 4684 mov ip, r0 +10006922: 2808 cmp r0, #8 +10006924: d902 bls.n 1000692c +10006926: 9a05 ldr r2, [sp, #20] +10006928: 4282 cmp r2, r0 +1000692a: d262 bcs.n 100069f2 +1000692c: 9b06 ldr r3, [sp, #24] +1000692e: 3501 adds r5, #1 +10006930: 7819 ldrb r1, [r3, #0] +10006932: b2ed uxtb r5, r5 +10006934: 42a9 cmp r1, r5 +10006936: d2e8 bcs.n 1000690a +10006938: 464e mov r6, r9 +1000693a: e5a9 b.n 10006490 +1000693c: 4650 mov r0, sl +1000693e: f7ff fb55 bl 10005fec +10006942: 2200 movs r2, #0 +10006944: 4691 mov r9, r2 +10006946: 4a43 ldr r2, [pc, #268] @ (10006a54 ) +10006948: 78ab ldrb r3, [r5, #2] +1000694a: 9205 str r2, [sp, #20] +1000694c: 002a movs r2, r5 +1000694e: 464d mov r5, r9 +10006950: 4691 mov r9, r2 +10006952: 9304 str r3, [sp, #16] +10006954: 4b3c ldr r3, [pc, #240] @ (10006a48 ) +10006956: 4f3d ldr r7, [pc, #244] @ (10006a4c ) +10006958: 4698 mov r8, r3 +1000695a: 781b ldrb r3, [r3, #0] +1000695c: 2f00 cmp r7, #0 +1000695e: d01b beq.n 10006998 +10006960: 9a05 ldr r2, [sp, #20] +10006962: 429d cmp r5, r3 +10006964: d32c bcc.n 100069c0 +10006966: 4650 mov r0, sl +10006968: 4790 blx r2 +1000696a: 4643 mov r3, r8 +1000696c: 3501 adds r5, #1 +1000696e: 781b ldrb r3, [r3, #0] +10006970: b2ed uxtb r5, r5 +10006972: 42ab cmp r3, r5 +10006974: d2f2 bcs.n 1000695c +10006976: 464d mov r5, r9 +10006978: 2253 movs r2, #83 @ 0x53 +1000697a: 2100 movs r1, #0 +1000697c: 0028 movs r0, r5 +1000697e: f7fe fbf3 bl 10005168 <__wrap_memset> +10006982: 2210 movs r2, #16 +10006984: 21ff movs r1, #255 @ 0xff +10006986: 4834 ldr r0, [pc, #208] @ (10006a58 ) +10006988: f7fe fbee bl 10005168 <__wrap_memset> +1000698c: 2220 movs r2, #32 +1000698e: 21ff movs r1, #255 @ 0xff +10006990: 4832 ldr r0, [pc, #200] @ (10006a5c ) +10006992: f7fe fbe9 bl 10005168 <__wrap_memset> +10006996: e002 b.n 1000699e +10006998: 2d00 cmp r5, #0 +1000699a: d01b beq.n 100069d4 +1000699c: 464d mov r5, r9 +1000699e: 9b04 ldr r3, [sp, #16] +100069a0: 70ab strb r3, [r5, #2] +100069a2: e672 b.n 1000668a +100069a4: 2318 movs r3, #24 +100069a6: 4a2e ldr r2, [pc, #184] @ (10006a60 ) +100069a8: 436b muls r3, r5 +100069aa: 6816 ldr r6, [r2, #0] +100069ac: 18f6 adds r6, r6, r3 +100069ae: 2e00 cmp r6, #0 +100069b0: d0c2 beq.n 10006938 +100069b2: 68b3 ldr r3, [r6, #8] +100069b4: e7b0 b.n 10006918 +100069b6: 2d00 cmp r5, #0 +100069b8: d1be bne.n 10006938 +100069ba: 4b22 ldr r3, [pc, #136] @ (10006a44 ) +100069bc: 4e24 ldr r6, [pc, #144] @ (10006a50 ) +100069be: e7ab b.n 10006918 +100069c0: 4a27 ldr r2, [pc, #156] @ (10006a60 ) +100069c2: 006b lsls r3, r5, #1 +100069c4: 6812 ldr r2, [r2, #0] +100069c6: 195b adds r3, r3, r5 +100069c8: 00db lsls r3, r3, #3 +100069ca: 18d3 adds r3, r2, r3 +100069cc: 2b00 cmp r3, #0 +100069ce: d0e5 beq.n 1000699c +100069d0: 685a ldr r2, [r3, #4] +100069d2: e7c8 b.n 10006966 +100069d4: 4a1f ldr r2, [pc, #124] @ (10006a54 ) +100069d6: e7c6 b.n 10006966 +100069d8: f7ff f8d8 bl 10005b8c +100069dc: 0002 movs r2, r0 +100069de: e6d4 b.n 1000678a +100069e0: 4b20 ldr r3, [pc, #128] @ (10006a64 ) +100069e2: 4645 mov r5, r8 +100069e4: 464e mov r6, r9 +100069e6: 2b00 cmp r3, #0 +100069e8: d100 bne.n 100069ec +100069ea: e652 b.n 10006692 +100069ec: e000 b.n 100069f0 +100069ee: bf00 nop +100069f0: e64f b.n 10006692 +100069f2: 9a0b ldr r2, [sp, #44] @ 0x2c +100069f4: 2a01 cmp r2, #1 +100069f6: d01f beq.n 10006a38 +100069f8: 2100 movs r1, #0 +100069fa: 4646 mov r6, r8 +100069fc: e009 b.n 10006a12 +100069fe: 78bb ldrb r3, [r7, #2] +10006a00: 18cb adds r3, r1, r3 +10006a02: b2db uxtb r3, r3 +10006a04: 18f3 adds r3, r6, r3 +10006a06: 78d8 ldrb r0, [r3, #3] +10006a08: 28ff cmp r0, #255 @ 0xff +10006a0a: d195 bne.n 10006938 +10006a0c: 3101 adds r1, #1 +10006a0e: 70dd strb r5, [r3, #3] +10006a10: b2c9 uxtb r1, r1 +10006a12: 4291 cmp r1, r2 +10006a14: d1f3 bne.n 100069fe +10006a16: 46b0 mov r8, r6 +10006a18: 4666 mov r6, ip +10006a1a: 002b movs r3, r5 +10006a1c: 0039 movs r1, r7 +10006a1e: 0032 movs r2, r6 +10006a20: 480e ldr r0, [pc, #56] @ (10006a5c ) +10006a22: f000 fd1f bl 10007464 +10006a26: 46b4 mov ip, r6 +10006a28: 9b06 ldr r3, [sp, #24] +10006a2a: 4467 add r7, ip +10006a2c: 781b ldrb r3, [r3, #0] +10006a2e: 42ab cmp r3, r5 +10006a30: d300 bcc.n 10006a34 +10006a32: e74f b.n 100068d4 +10006a34: 464e mov r6, r9 +10006a36: e52b b.n 10006490 +10006a38: 4b02 ldr r3, [pc, #8] @ (10006a44 ) +10006a3a: 68b1 ldr r1, [r6, #8] +10006a3c: 4299 cmp r1, r3 +10006a3e: d1db bne.n 100069f8 +10006a40: 9a07 ldr r2, [sp, #28] +10006a42: e7d9 b.n 100069f8 +10006a44: 10007049 .word 0x10007049 +10006a48: 20001d61 .word 0x20001d61 +10006a4c: 10005791 .word 0x10005791 +10006a50: 10008194 .word 0x10008194 +10006a54: 1000701d .word 0x1000701d +10006a58: 2000161b .word 0x2000161b +10006a5c: 2000162b .word 0x2000162b +10006a60: 200012f0 .word 0x200012f0 +10006a64: 00000000 .word 0x00000000 + +10006a68 : +10006a68: b5f8 push {r3, r4, r5, r6, r7, lr} +10006a6a: 4657 mov r7, sl +10006a6c: 464e mov r6, r9 +10006a6e: 46de mov lr, fp +10006a70: 4645 mov r5, r8 +10006a72: 000c movs r4, r1 +10006a74: b5e0 push {r5, r6, r7, lr} +10006a76: 0016 movs r6, r2 +10006a78: 001f movs r7, r3 +10006a7a: 2a00 cmp r2, #0 +10006a7c: d03c beq.n 10006af8 +10006a7e: 4b1f ldr r3, [pc, #124] @ (10006afc ) +10006a80: 2500 movs r5, #0 +10006a82: 469a mov sl, r3 +10006a84: 2370 movs r3, #112 @ 0x70 +10006a86: 4699 mov r9, r3 +10006a88: 4b1d ldr r3, [pc, #116] @ (10006b00 ) +10006a8a: 469b mov fp, r3 +10006a8c: e017 b.n 10006abe +10006a8e: 465b mov r3, fp +10006a90: 0020 movs r0, r4 +10006a92: 7899 ldrb r1, [r3, #2] +10006a94: f000 fca8 bl 100073e8 +10006a98: 2800 cmp r0, #0 +10006a9a: d01f beq.n 10006adc +10006a9c: 0021 movs r1, r4 +10006a9e: 4640 mov r0, r8 +10006aa0: f7ff fa20 bl 10005ee4 +10006aa4: 2800 cmp r0, #0 +10006aa6: d019 beq.n 10006adc +10006aa8: 78a3 ldrb r3, [r4, #2] +10006aaa: 09da lsrs r2, r3, #7 +10006aac: 2a01 cmp r2, #1 +10006aae: d01c beq.n 10006aea +10006ab0: 9a0a ldr r2, [sp, #40] @ 0x28 +10006ab2: 3501 adds r5, #1 +10006ab4: 7013 strb r3, [r2, #0] +10006ab6: 7823 ldrb r3, [r4, #0] +10006ab8: 18e4 adds r4, r4, r3 +10006aba: 42b5 cmp r5, r6 +10006abc: da1c bge.n 10006af8 +10006abe: 7863 ldrb r3, [r4, #1] +10006ac0: 2b05 cmp r3, #5 +10006ac2: d10b bne.n 10006adc +10006ac4: 78e3 ldrb r3, [r4, #3] +10006ac6: 079b lsls r3, r3, #30 +10006ac8: 0f9b lsrs r3, r3, #30 +10006aca: 42bb cmp r3, r7 +10006acc: d106 bne.n 10006adc +10006ace: 4653 mov r3, sl +10006ad0: 464a mov r2, r9 +10006ad2: 781b ldrb r3, [r3, #0] +10006ad4: 4698 mov r8, r3 +10006ad6: 78a3 ldrb r3, [r4, #2] +10006ad8: 421a tst r2, r3 +10006ada: d0d8 beq.n 10006a8e +10006adc: 2000 movs r0, #0 +10006ade: bcf0 pop {r4, r5, r6, r7} +10006ae0: 46bb mov fp, r7 +10006ae2: 46b2 mov sl, r6 +10006ae4: 46a9 mov r9, r5 +10006ae6: 46a0 mov r8, r4 +10006ae8: bdf8 pop {r3, r4, r5, r6, r7, pc} +10006aea: 9a0b ldr r2, [sp, #44] @ 0x2c +10006aec: 3501 adds r5, #1 +10006aee: 7013 strb r3, [r2, #0] +10006af0: 7823 ldrb r3, [r4, #0] +10006af2: 18e4 adds r4, r4, r3 +10006af4: 42b5 cmp r5, r6 +10006af6: dbe2 blt.n 10006abe +10006af8: 2001 movs r0, #1 +10006afa: e7f0 b.n 10006ade +10006afc: 20000f94 .word 0x20000f94 +10006b00: 20001618 .word 0x20001618 + +10006b04 : +10006b04: 2380 movs r3, #128 @ 0x80 +10006b06: b510 push {r4, lr} +10006b08: 011b lsls r3, r3, #4 +10006b0a: b084 sub sp, #16 +10006b0c: 9301 str r3, [sp, #4] +10006b0e: 4b0e ldr r3, [pc, #56] @ (10006b48 ) +10006b10: 9002 str r0, [sp, #8] +10006b12: 681c ldr r4, [r3, #0] +10006b14: 9103 str r1, [sp, #12] +10006b16: 6962 ldr r2, [r4, #20] +10006b18: f3ef 8310 mrs r3, PRIMASK +10006b1c: b672 cpsid i +10006b1e: 6811 ldr r1, [r2, #0] +10006b20: 2900 cmp r1, #0 +10006b22: d0fc beq.n 10006b1e +10006b24: f3bf 8f5f dmb sy +10006b28: 61a3 str r3, [r4, #24] +10006b2a: 0020 movs r0, r4 +10006b2c: a901 add r1, sp, #4 +10006b2e: f000 fddf bl 100076f0 +10006b32: 6962 ldr r2, [r4, #20] +10006b34: 69a3 ldr r3, [r4, #24] +10006b36: f3bf 8f5f dmb sy +10006b3a: 2100 movs r1, #0 +10006b3c: 6011 str r1, [r2, #0] +10006b3e: f383 8810 msr PRIMASK, r3 +10006b42: b004 add sp, #16 +10006b44: bd10 pop {r4, pc} +10006b46: 46c0 nop @ (mov r8, r8) +10006b48: 20001670 .word 0x20001670 + +10006b4c : +10006b4c: 2270 movs r2, #112 @ 0x70 +10006b4e: b570 push {r4, r5, r6, lr} +10006b50: 4b09 ldr r3, [pc, #36] @ (10006b78 ) +10006b52: 000c movs r4, r1 +10006b54: 781d ldrb r5, [r3, #0] +10006b56: 788b ldrb r3, [r1, #2] +10006b58: 421a tst r2, r3 +10006b5a: d001 beq.n 10006b60 +10006b5c: 2000 movs r0, #0 +10006b5e: bd70 pop {r4, r5, r6, pc} +10006b60: 4b06 ldr r3, [pc, #24] @ (10006b7c ) +10006b62: 0020 movs r0, r4 +10006b64: 7899 ldrb r1, [r3, #2] +10006b66: f000 fc3f bl 100073e8 +10006b6a: 2800 cmp r0, #0 +10006b6c: d0f6 beq.n 10006b5c +10006b6e: 0021 movs r1, r4 +10006b70: 0028 movs r0, r5 +10006b72: f7ff f9b7 bl 10005ee4 +10006b76: e7f2 b.n 10006b5e +10006b78: 20000f94 .word 0x20000f94 +10006b7c: 20001618 .word 0x20001618 + +10006b80 : +10006b80: 000b movs r3, r1 +10006b82: 207f movs r0, #127 @ 0x7f +10006b84: b510 push {r4, lr} +10006b86: 4018 ands r0, r3 +10006b88: 09db lsrs r3, r3, #7 +10006b8a: 3333 adds r3, #51 @ 0x33 +10006b8c: 0040 lsls r0, r0, #1 +10006b8e: 4a04 ldr r2, [pc, #16] @ (10006ba0 ) +10006b90: 18c0 adds r0, r0, r3 +10006b92: 4b04 ldr r3, [pc, #16] @ (10006ba4 ) +10006b94: 6811 ldr r1, [r2, #0] +10006b96: 18c0 adds r0, r0, r3 +10006b98: f000 fbe2 bl 10007360 +10006b9c: bd10 pop {r4, pc} +10006b9e: 46c0 nop @ (mov r8, r8) +10006ba0: 2000166c .word 0x2000166c +10006ba4: 20001618 .word 0x20001618 + +10006ba8 : +10006ba8: 000b movs r3, r1 +10006baa: 207f movs r0, #127 @ 0x7f +10006bac: b510 push {r4, lr} +10006bae: 4018 ands r0, r3 +10006bb0: 09db lsrs r3, r3, #7 +10006bb2: 3333 adds r3, #51 @ 0x33 +10006bb4: 0040 lsls r0, r0, #1 +10006bb6: 4a04 ldr r2, [pc, #16] @ (10006bc8 ) +10006bb8: 18c0 adds r0, r0, r3 +10006bba: 4b04 ldr r3, [pc, #16] @ (10006bcc ) +10006bbc: 6811 ldr r1, [r2, #0] +10006bbe: 18c0 adds r0, r0, r3 +10006bc0: f000 fbf6 bl 100073b0 +10006bc4: bd10 pop {r4, pc} +10006bc6: 46c0 nop @ (mov r8, r8) +10006bc8: 2000166c .word 0x2000166c +10006bcc: 20001618 .word 0x20001618 + +10006bd0 : +10006bd0: b570 push {r4, r5, r6, lr} +10006bd2: 247f movs r4, #127 @ 0x7f +10006bd4: 480f ldr r0, [pc, #60] @ (10006c14 ) +10006bd6: 400c ands r4, r1 +10006bd8: 0064 lsls r4, r4, #1 +10006bda: 1904 adds r4, r0, r4 +10006bdc: 09cd lsrs r5, r1, #7 +10006bde: 1964 adds r4, r4, r5 +10006be0: 3430 adds r4, #48 @ 0x30 +10006be2: 78e0 ldrb r0, [r4, #3] +10006be4: 07c0 lsls r0, r0, #31 +10006be6: d501 bpl.n 10006bec +10006be8: 2000 movs r0, #0 +10006bea: bd70 pop {r4, r5, r6, pc} +10006bec: 2601 movs r6, #1 +10006bee: 78e5 ldrb r5, [r4, #3] +10006bf0: 4809 ldr r0, [pc, #36] @ (10006c18 ) +10006bf2: 4335 orrs r5, r6 +10006bf4: 7800 ldrb r0, [r0, #0] +10006bf6: 70e5 strb r5, [r4, #3] +10006bf8: f7ff f9fc bl 10005ff4 +10006bfc: 2800 cmp r0, #0 +10006bfe: d1f4 bne.n 10006bea +10006c00: 2201 movs r2, #1 +10006c02: 78e3 ldrb r3, [r4, #3] +10006c04: 4393 bics r3, r2 +10006c06: 70e3 strb r3, [r4, #3] +10006c08: 78e3 ldrb r3, [r4, #3] +10006c0a: 3203 adds r2, #3 +10006c0c: 4393 bics r3, r2 +10006c0e: 70e3 strb r3, [r4, #3] +10006c10: e7ea b.n 10006be8 +10006c12: 46c0 nop @ (mov r8, r8) +10006c14: 20001618 .word 0x20001618 +10006c18: 20000f94 .word 0x20000f94 + +10006c1c : +10006c1c: b570 push {r4, r5, r6, lr} +10006c1e: 4c09 ldr r4, [pc, #36] @ (10006c44 ) +10006c20: 0006 movs r6, r0 +10006c22: 2208 movs r2, #8 +10006c24: 0020 movs r0, r4 +10006c26: 000d movs r5, r1 +10006c28: f7fe faa4 bl 10005174 <__wrap___aeabi_memcpy> +10006c2c: 2300 movs r3, #0 +10006c2e: 2180 movs r1, #128 @ 0x80 +10006c30: 60e3 str r3, [r4, #12] +10006c32: 60a3 str r3, [r4, #8] +10006c34: 782b ldrb r3, [r5, #0] +10006c36: 0030 movs r0, r6 +10006c38: 4399 bics r1, r3 +10006c3a: 2200 movs r2, #0 +10006c3c: 2300 movs r3, #0 +10006c3e: f7ff ffc7 bl 10006bd0 +10006c42: bd70 pop {r4, r5, r6, pc} +10006c44: 200015bc .word 0x200015bc + +10006c48 : +10006c48: b5f8 push {r3, r4, r5, r6, r7, lr} +10006c4a: 46ce mov lr, r9 +10006c4c: 4647 mov r7, r8 +10006c4e: 4690 mov r8, r2 +10006c50: 4e26 ldr r6, [pc, #152] @ (10006cec ) +10006c52: b580 push {r7, lr} +10006c54: 4681 mov r9, r0 +10006c56: 2208 movs r2, #8 +10006c58: 0030 movs r0, r6 +10006c5a: 000d movs r5, r1 +10006c5c: 001f movs r7, r3 +10006c5e: f7fe fa89 bl 10005174 <__wrap___aeabi_memcpy> +10006c62: 4643 mov r3, r8 +10006c64: 60b3 str r3, [r6, #8] +10006c66: 2300 movs r3, #0 +10006c68: 81f3 strh r3, [r6, #14] +10006c6a: 79ec ldrb r4, [r5, #7] +10006c6c: 79ab ldrb r3, [r5, #6] +10006c6e: 0224 lsls r4, r4, #8 +10006c70: 431c orrs r4, r3 +10006c72: 1c23 adds r3, r4, #0 +10006c74: 42bc cmp r4, r7 +10006c76: d900 bls.n 10006c7a +10006c78: 1c3b adds r3, r7, #0 +10006c7a: b29f uxth r7, r3 +10006c7c: 81b3 strh r3, [r6, #12] +10006c7e: 2c00 cmp r4, #0 +10006c80: d00e beq.n 10006ca0 +10006c82: 2f00 cmp r7, #0 +10006c84: d018 beq.n 10006cb8 +10006c86: 4643 mov r3, r8 +10006c88: 2b00 cmp r3, #0 +10006c8a: d02c beq.n 10006ce6 +10006c8c: 1c3b adds r3, r7, #0 +10006c8e: 2f40 cmp r7, #64 @ 0x40 +10006c90: d81b bhi.n 10006cca +10006c92: b29f uxth r7, r3 +10006c94: 7833 ldrb r3, [r6, #0] +10006c96: 2b7f cmp r3, #127 @ 0x7f +10006c98: d81c bhi.n 10006cd4 +10006c9a: 2100 movs r1, #0 +10006c9c: 4a14 ldr r2, [pc, #80] @ (10006cf0 ) +10006c9e: e00f b.n 10006cc0 +10006ca0: 2180 movs r1, #128 @ 0x80 +10006ca2: 782b ldrb r3, [r5, #0] +10006ca4: 2200 movs r2, #0 +10006ca6: 4399 bics r1, r3 +10006ca8: 4648 mov r0, r9 +10006caa: 2300 movs r3, #0 +10006cac: f7ff ff90 bl 10006bd0 +10006cb0: bcc0 pop {r6, r7} +10006cb2: 46b9 mov r9, r7 +10006cb4: 46b0 mov r8, r6 +10006cb6: bdf8 pop {r3, r4, r5, r6, r7, pc} +10006cb8: 237f movs r3, #127 @ 0x7f +10006cba: 2200 movs r2, #0 +10006cbc: 7831 ldrb r1, [r6, #0] +10006cbe: 4399 bics r1, r3 +10006cc0: 003b movs r3, r7 +10006cc2: 4648 mov r0, r9 +10006cc4: f7ff ff84 bl 10006bd0 +10006cc8: e7f2 b.n 10006cb0 +10006cca: 2340 movs r3, #64 @ 0x40 +10006ccc: b29f uxth r7, r3 +10006cce: 7833 ldrb r3, [r6, #0] +10006cd0: 2b7f cmp r3, #127 @ 0x7f +10006cd2: d9e2 bls.n 10006c9a +10006cd4: 4c06 ldr r4, [pc, #24] @ (10006cf0 ) +10006cd6: 003a movs r2, r7 +10006cd8: 4641 mov r1, r8 +10006cda: 0020 movs r0, r4 +10006cdc: f7fe fa4a bl 10005174 <__wrap___aeabi_memcpy> +10006ce0: 2180 movs r1, #128 @ 0x80 +10006ce2: 0022 movs r2, r4 +10006ce4: e7ec b.n 10006cc0 +10006ce6: 2000 movs r0, #0 +10006ce8: e7e2 b.n 10006cb0 +10006cea: 46c0 nop @ (mov r8, r8) +10006cec: 200015bc .word 0x200015bc +10006cf0: 200015d8 .word 0x200015d8 + +10006cf4 : 10006cf4: b510 push {r4, lr} -10006cf6: 0783 lsls r3, r0, #30 -10006cf8: d00a beq.n 10006d10 -10006cfa: 0003 movs r3, r0 -10006cfc: 2103 movs r1, #3 -10006cfe: e002 b.n 10006d06 -10006d00: 3301 adds r3, #1 -10006d02: 420b tst r3, r1 -10006d04: d005 beq.n 10006d12 -10006d06: 781a ldrb r2, [r3, #0] -10006d08: 2a00 cmp r2, #0 -10006d0a: d1f9 bne.n 10006d00 -10006d0c: 1a18 subs r0, r3, r0 -10006d0e: bd10 pop {r4, pc} -10006d10: 0003 movs r3, r0 -10006d12: 6819 ldr r1, [r3, #0] -10006d14: 4a0c ldr r2, [pc, #48] @ (10006d48 ) -10006d16: 4c0d ldr r4, [pc, #52] @ (10006d4c ) -10006d18: 188a adds r2, r1, r2 -10006d1a: 438a bics r2, r1 -10006d1c: 4222 tst r2, r4 -10006d1e: d10f bne.n 10006d40 -10006d20: 6859 ldr r1, [r3, #4] -10006d22: 4a09 ldr r2, [pc, #36] @ (10006d48 ) -10006d24: 3304 adds r3, #4 -10006d26: 188a adds r2, r1, r2 -10006d28: 438a bics r2, r1 -10006d2a: 4222 tst r2, r4 -10006d2c: d108 bne.n 10006d40 -10006d2e: 6859 ldr r1, [r3, #4] -10006d30: 4a05 ldr r2, [pc, #20] @ (10006d48 ) -10006d32: 3304 adds r3, #4 -10006d34: 188a adds r2, r1, r2 -10006d36: 438a bics r2, r1 -10006d38: 4222 tst r2, r4 -10006d3a: d0f1 beq.n 10006d20 -10006d3c: e000 b.n 10006d40 -10006d3e: 3301 adds r3, #1 -10006d40: 781a ldrb r2, [r3, #0] -10006d42: 2a00 cmp r2, #0 -10006d44: d1fb bne.n 10006d3e -10006d46: e7e1 b.n 10006d0c -10006d48: fefefeff .word 0xfefefeff -10006d4c: 80808080 .word 0x80808080 - -10006d50 <_fini>: -10006d50: b5f8 push {r3, r4, r5, r6, r7, lr} -10006d52: 46c0 nop @ (mov r8, r8) -10006d54: 0000 movs r0, r0 +10006cf6: 2214 movs r2, #20 +10006cf8: 2100 movs r1, #0 +10006cfa: 4802 ldr r0, [pc, #8] @ (10006d04 ) +10006cfc: f7fe fa34 bl 10005168 <__wrap_memset> +10006d00: bd10 pop {r4, pc} +10006d02: 46c0 nop @ (mov r8, r8) +10006d04: 200015bc .word 0x200015bc + +10006d08 : +10006d08: 4b01 ldr r3, [pc, #4] @ (10006d10 ) +10006d0a: 6118 str r0, [r3, #16] +10006d0c: 4770 bx lr +10006d0e: 46c0 nop @ (mov r8, r8) +10006d10: 200015bc .word 0x200015bc + +10006d14 : +10006d14: b510 push {r4, lr} +10006d16: 4c05 ldr r4, [pc, #20] @ (10006d2c ) +10006d18: 0001 movs r1, r0 +10006d1a: 2208 movs r2, #8 +10006d1c: 0020 movs r0, r4 +10006d1e: f7fe fa29 bl 10005174 <__wrap___aeabi_memcpy> +10006d22: 2300 movs r3, #0 +10006d24: 60a3 str r3, [r4, #8] +10006d26: 60e3 str r3, [r4, #12] +10006d28: bd10 pop {r4, pc} +10006d2a: 46c0 nop @ (mov r8, r8) +10006d2c: 200015bc .word 0x200015bc + +10006d30 : +10006d30: b570 push {r4, r5, r6, lr} +10006d32: 4c39 ldr r4, [pc, #228] @ (10006e18 ) +10006d34: 001d movs r5, r3 +10006d36: 7823 ldrb r3, [r4, #0] +10006d38: 0006 movs r6, r0 +10006d3a: 09da lsrs r2, r3, #7 +10006d3c: 09c9 lsrs r1, r1, #7 +10006d3e: 428a cmp r2, r1 +10006d40: d013 beq.n 10006d6a +10006d42: 2000 movs r0, #0 +10006d44: 2d00 cmp r5, #0 +10006d46: d000 beq.n 10006d4a +10006d48: bd70 pop {r4, r5, r6, pc} +10006d4a: 4b34 ldr r3, [pc, #208] @ (10006e1c ) +10006d4c: 2b00 cmp r3, #0 +10006d4e: d003 beq.n 10006d58 +10006d50: 0021 movs r1, r4 +10006d52: 0030 movs r0, r6 +10006d54: f7ff f8b8 bl 10005ec8 +10006d58: 6923 ldr r3, [r4, #16] +10006d5a: 2b00 cmp r3, #0 +10006d5c: d003 beq.n 10006d66 +10006d5e: 0022 movs r2, r4 +10006d60: 2103 movs r1, #3 +10006d62: 0030 movs r0, r6 +10006d64: 4798 blx r3 +10006d66: 2001 movs r0, #1 +10006d68: e7ee b.n 10006d48 +10006d6a: 68a0 ldr r0, [r4, #8] +10006d6c: 2b7f cmp r3, #127 @ 0x7f +10006d6e: d805 bhi.n 10006d7c +10006d70: 2800 cmp r0, #0 +10006d72: d034 beq.n 10006dde +10006d74: 002a movs r2, r5 +10006d76: 492a ldr r1, [pc, #168] @ (10006e20 ) +10006d78: f7fe f9fc bl 10005174 <__wrap___aeabi_memcpy> +10006d7c: 89e2 ldrh r2, [r4, #14] +10006d7e: 68a1 ldr r1, [r4, #8] +10006d80: 1952 adds r2, r2, r5 +10006d82: 88e3 ldrh r3, [r4, #6] +10006d84: b292 uxth r2, r2 +10006d86: 1949 adds r1, r1, r5 +10006d88: 81e2 strh r2, [r4, #14] +10006d8a: 60a1 str r1, [r4, #8] +10006d8c: 4293 cmp r3, r2 +10006d8e: d014 beq.n 10006dba +10006d90: 2d3f cmp r5, #63 @ 0x3f +10006d92: d912 bls.n 10006dba +10006d94: 89a3 ldrh r3, [r4, #12] +10006d96: 1a98 subs r0, r3, r2 +10006d98: 1c05 adds r5, r0, #0 +10006d9a: b280 uxth r0, r0 +10006d9c: 2840 cmp r0, #64 @ 0x40 +10006d9e: d82a bhi.n 10006df6 +10006da0: 7820 ldrb r0, [r4, #0] +10006da2: b2ad uxth r5, r5 +10006da4: 287f cmp r0, #127 @ 0x7f +10006da6: d828 bhi.n 10006dfa +10006da8: 2100 movs r1, #0 +10006daa: 429a cmp r2, r3 +10006dac: d032 beq.n 10006e14 +10006dae: 4a1c ldr r2, [pc, #112] @ (10006e20 ) +10006db0: 002b movs r3, r5 +10006db2: 0030 movs r0, r6 +10006db4: f7ff ff0c bl 10006bd0 +10006db8: e7c6 b.n 10006d48 +10006dba: 6923 ldr r3, [r4, #16] +10006dbc: 2b00 cmp r3, #0 +10006dbe: d005 beq.n 10006dcc +10006dc0: 0022 movs r2, r4 +10006dc2: 2102 movs r1, #2 +10006dc4: 0030 movs r0, r6 +10006dc6: 4798 blx r3 +10006dc8: 2800 cmp r0, #0 +10006dca: d00a beq.n 10006de2 +10006dcc: 2180 movs r1, #128 @ 0x80 +10006dce: 7823 ldrb r3, [r4, #0] +10006dd0: 2200 movs r2, #0 +10006dd2: 4399 bics r1, r3 +10006dd4: 0030 movs r0, r6 +10006dd6: 2300 movs r3, #0 +10006dd8: f7ff fefa bl 10006bd0 +10006ddc: e7b4 b.n 10006d48 +10006dde: 2000 movs r0, #0 +10006de0: e7b2 b.n 10006d48 +10006de2: 2100 movs r1, #0 +10006de4: 0030 movs r0, r6 +10006de6: f7ff f917 bl 10006018 +10006dea: 0030 movs r0, r6 +10006dec: 2180 movs r1, #128 @ 0x80 +10006dee: f7ff f913 bl 10006018 +10006df2: 2001 movs r0, #1 +10006df4: e7a8 b.n 10006d48 +10006df6: 2540 movs r5, #64 @ 0x40 +10006df8: e7d2 b.n 10006da0 +10006dfa: 429a cmp r2, r3 +10006dfc: d007 beq.n 10006e0e +10006dfe: 4c08 ldr r4, [pc, #32] @ (10006e20 ) +10006e00: 002a movs r2, r5 +10006e02: 0020 movs r0, r4 +10006e04: f7fe f9b6 bl 10005174 <__wrap___aeabi_memcpy> +10006e08: 2180 movs r1, #128 @ 0x80 +10006e0a: 0022 movs r2, r4 +10006e0c: e7d0 b.n 10006db0 +10006e0e: 2180 movs r1, #128 @ 0x80 +10006e10: 2200 movs r2, #0 +10006e12: e7cd b.n 10006db0 +10006e14: 2200 movs r2, #0 +10006e16: e7cb b.n 10006db0 +10006e18: 200015bc .word 0x200015bc +10006e1c: 10005ec9 .word 0x10005ec9 +10006e20: 200015d8 .word 0x200015d8 + +10006e24 : +10006e24: b510 push {r4, lr} +10006e26: 0004 movs r4, r0 +10006e28: f7ff f96e bl 10006108 +10006e2c: 2800 cmp r0, #0 +10006e2e: d101 bne.n 10006e34 +10006e30: 2000 movs r0, #0 +10006e32: bd10 pop {r4, pc} +10006e34: f7ff f970 bl 10006118 +10006e38: 2800 cmp r0, #0 +10006e3a: d1f9 bne.n 10006e30 +10006e3c: 22b2 movs r2, #178 @ 0xb2 +10006e3e: 0092 lsls r2, r2, #2 +10006e40: 4362 muls r2, r4 +10006e42: 4b03 ldr r3, [pc, #12] @ (10006e50 ) +10006e44: 3001 adds r0, #1 +10006e46: 189b adds r3, r3, r2 +10006e48: 791b ldrb r3, [r3, #4] +10006e4a: 4018 ands r0, r3 +10006e4c: e7f1 b.n 10006e32 +10006e4e: 46c0 nop @ (mov r8, r8) +10006e50: 200012f4 .word 0x200012f4 + +10006e54 : +10006e54: 23b2 movs r3, #178 @ 0xb2 +10006e56: 009b lsls r3, r3, #2 +10006e58: 4343 muls r3, r0 +10006e5a: b510 push {r4, lr} +10006e5c: 4802 ldr r0, [pc, #8] @ (10006e68 ) +10006e5e: 1818 adds r0, r3, r0 +10006e60: f000 fb50 bl 10007504 +10006e64: bd10 pop {r4, pc} +10006e66: 46c0 nop @ (mov r8, r8) +10006e68: 20001304 .word 0x20001304 + +10006e6c : +10006e6c: b5f0 push {r4, r5, r6, r7, lr} +10006e6e: 25b2 movs r5, #178 @ 0xb2 +10006e70: 00ad lsls r5, r5, #2 +10006e72: 4345 muls r5, r0 +10006e74: 002c movs r4, r5 +10006e76: 46c6 mov lr, r8 +10006e78: 4f17 ldr r7, [pc, #92] @ (10006ed8 ) +10006e7a: 3410 adds r4, #16 +10006e7c: 19e4 adds r4, r4, r7 +10006e7e: b500 push {lr} +10006e80: 0020 movs r0, r4 +10006e82: b292 uxth r2, r2 +10006e84: f000 fbc0 bl 10007608 +10006e88: 0006 movs r6, r0 +10006e8a: 0020 movs r0, r4 +10006e8c: f000 fb58 bl 10007540 +10006e90: 283f cmp r0, #63 @ 0x3f +10006e92: d803 bhi.n 10006e9c +10006e94: 0030 movs r0, r6 +10006e96: bc80 pop {r7} +10006e98: 46b8 mov r8, r7 +10006e9a: bdf0 pop {r4, r5, r6, r7, pc} +10006e9c: 197b adds r3, r7, r5 +10006e9e: 2000 movs r0, #0 +10006ea0: 78d9 ldrb r1, [r3, #3] +10006ea2: 4698 mov r8, r3 +10006ea4: f7ff fe6c bl 10006b80 +10006ea8: 2800 cmp r0, #0 +10006eaa: d0f3 beq.n 10006e94 +10006eac: 0020 movs r0, r4 +10006eae: f000 fb47 bl 10007540 +10006eb2: 283f cmp r0, #63 @ 0x3f +10006eb4: d90a bls.n 10006ecc +10006eb6: 2392 movs r3, #146 @ 0x92 +10006eb8: 009b lsls r3, r3, #2 +10006eba: 18ea adds r2, r5, r3 +10006ebc: 4643 mov r3, r8 +10006ebe: 19d2 adds r2, r2, r7 +10006ec0: 78d9 ldrb r1, [r3, #3] +10006ec2: 2000 movs r0, #0 +10006ec4: 2340 movs r3, #64 @ 0x40 +10006ec6: f7ff fe83 bl 10006bd0 +10006eca: e7e3 b.n 10006e94 +10006ecc: 4643 mov r3, r8 +10006ece: 2000 movs r0, #0 +10006ed0: 78d9 ldrb r1, [r3, #3] +10006ed2: f7ff fe69 bl 10006ba8 +10006ed6: e7dd b.n 10006e94 +10006ed8: 200012f4 .word 0x200012f4 + +10006edc : +10006edc: b5f8 push {r3, r4, r5, r6, r7, lr} +10006ede: 0004 movs r4, r0 +10006ee0: f7ff f912 bl 10006108 +10006ee4: 2800 cmp r0, #0 +10006ee6: d101 bne.n 10006eec +10006ee8: 2000 movs r0, #0 +10006eea: bdf8 pop {r3, r4, r5, r6, r7, pc} +10006eec: f7ff f914 bl 10006118 +10006ef0: 2800 cmp r0, #0 +10006ef2: d1f9 bne.n 10006ee8 +10006ef4: 23b2 movs r3, #178 @ 0xb2 +10006ef6: 009b lsls r3, r3, #2 +10006ef8: 435c muls r4, r3 +10006efa: 0025 movs r5, r4 +10006efc: 4e14 ldr r6, [pc, #80] @ (10006f50 ) +10006efe: 3524 adds r5, #36 @ 0x24 +10006f00: 19ad adds r5, r5, r6 +10006f02: 0028 movs r0, r5 +10006f04: f000 fafe bl 10007504 +10006f08: 2800 cmp r0, #0 +10006f0a: d0ed beq.n 10006ee8 +10006f0c: 1937 adds r7, r6, r4 +10006f0e: 2000 movs r0, #0 +10006f10: 78b9 ldrb r1, [r7, #2] +10006f12: f7ff fe35 bl 10006b80 +10006f16: 2800 cmp r0, #0 +10006f18: d0e6 beq.n 10006ee8 +10006f1a: 23a2 movs r3, #162 @ 0xa2 +10006f1c: 009b lsls r3, r3, #2 +10006f1e: 469c mov ip, r3 +10006f20: 4464 add r4, ip +10006f22: 19a4 adds r4, r4, r6 +10006f24: 0021 movs r1, r4 +10006f26: 0028 movs r0, r5 +10006f28: 2240 movs r2, #64 @ 0x40 +10006f2a: f000 fb6d bl 10007608 +10006f2e: 78b9 ldrb r1, [r7, #2] +10006f30: 1e05 subs r5, r0, #0 +10006f32: d008 beq.n 10006f46 +10006f34: 0003 movs r3, r0 +10006f36: 0022 movs r2, r4 +10006f38: 2000 movs r0, #0 +10006f3a: f7ff fe49 bl 10006bd0 +10006f3e: 2800 cmp r0, #0 +10006f40: d0d2 beq.n 10006ee8 +10006f42: 0028 movs r0, r5 +10006f44: e7d1 b.n 10006eea +10006f46: 2000 movs r0, #0 +10006f48: f7ff fe2e bl 10006ba8 +10006f4c: e7cc b.n 10006ee8 +10006f4e: 46c0 nop @ (mov r8, r8) +10006f50: 200012f4 .word 0x200012f4 + +10006f54 : +10006f54: b570 push {r4, r5, r6, lr} +10006f56: 24b2 movs r4, #178 @ 0xb2 +10006f58: 00a4 lsls r4, r4, #2 +10006f5a: 4344 muls r4, r0 +10006f5c: 4b09 ldr r3, [pc, #36] @ (10006f84 ) +10006f5e: 0005 movs r5, r0 +10006f60: 18e4 adds r4, r4, r3 +10006f62: 0020 movs r0, r4 +10006f64: b292 uxth r2, r2 +10006f66: f000 fc17 bl 10007798 +10006f6a: 0006 movs r6, r0 +10006f6c: 0020 movs r0, r4 +10006f6e: f000 fac9 bl 10007504 +10006f72: 283f cmp r0, #63 @ 0x3f +10006f74: d801 bhi.n 10006f7a +10006f76: 0030 movs r0, r6 +10006f78: bd70 pop {r4, r5, r6, pc} +10006f7a: 0028 movs r0, r5 +10006f7c: f7ff ffae bl 10006edc +10006f80: e7f9 b.n 10006f76 +10006f82: 46c0 nop @ (mov r8, r8) +10006f84: 20001318 .word 0x20001318 + +10006f88 : +10006f88: 23b2 movs r3, #178 @ 0xb2 +10006f8a: 009b lsls r3, r3, #2 +10006f8c: 4343 muls r3, r0 +10006f8e: b510 push {r4, lr} +10006f90: 4802 ldr r0, [pc, #8] @ (10006f9c ) +10006f92: 1818 adds r0, r3, r0 +10006f94: f000 fad4 bl 10007540 +10006f98: bd10 pop {r4, pc} +10006f9a: 46c0 nop @ (mov r8, r8) +10006f9c: 20001318 .word 0x20001318 + +10006fa0 : +10006fa0: 22b2 movs r2, #178 @ 0xb2 +10006fa2: b5f0 push {r4, r5, r6, r7, lr} +10006fa4: 4c1b ldr r4, [pc, #108] @ (10007014 ) +10006fa6: b083 sub sp, #12 +10006fa8: 2100 movs r1, #0 +10006faa: 0020 movs r0, r4 +10006fac: 0092 lsls r2, r2, #2 +10006fae: f7fe f8db bl 10005168 <__wrap_memset> +10006fb2: 23ff movs r3, #255 @ 0xff +10006fb4: 7163 strb r3, [r4, #5] +10006fb6: 4b18 ldr r3, [pc, #96] @ (10007018 ) +10006fb8: 2680 movs r6, #128 @ 0x80 +10006fba: 2500 movs r5, #0 +10006fbc: 80e3 strh r3, [r4, #6] +10006fbe: 2701 movs r7, #1 +10006fc0: 2308 movs r3, #8 +10006fc2: 0021 movs r1, r4 +10006fc4: 0020 movs r0, r4 +10006fc6: 0076 lsls r6, r6, #1 +10006fc8: 7323 strb r3, [r4, #12] +10006fca: 0032 movs r2, r6 +10006fcc: 8127 strh r7, [r4, #8] +10006fce: 3138 adds r1, #56 @ 0x38 +10006fd0: 9500 str r5, [sp, #0] +10006fd2: 3b07 subs r3, #7 +10006fd4: 3010 adds r0, #16 +10006fd6: f000 fa5f bl 10007498 +10006fda: 0021 movs r1, r4 +10006fdc: 0020 movs r0, r4 +10006fde: 3139 adds r1, #57 @ 0x39 +10006fe0: 0032 movs r2, r6 +10006fe2: 31ff adds r1, #255 @ 0xff +10006fe4: 2301 movs r3, #1 +10006fe6: 9700 str r7, [sp, #0] +10006fe8: 3024 adds r0, #36 @ 0x24 +10006fea: f000 fa55 bl 10007498 +10006fee: 238e movs r3, #142 @ 0x8e +10006ff0: 009b lsls r3, r3, #2 +10006ff2: 18e6 adds r6, r4, r3 +10006ff4: 0030 movs r0, r6 +10006ff6: f7fa fb93 bl 10001720 +10006ffa: 2390 movs r3, #144 @ 0x90 +10006ffc: 009b lsls r3, r3, #2 +10006ffe: 6226 str r6, [r4, #32] +10007000: 18e6 adds r6, r4, r3 +10007002: 0030 movs r0, r6 +10007004: 61e5 str r5, [r4, #28] +10007006: f7fa fb8b bl 10001720 +1000700a: 6326 str r6, [r4, #48] @ 0x30 +1000700c: 6365 str r5, [r4, #52] @ 0x34 +1000700e: b003 add sp, #12 +10007010: bdf0 pop {r4, r5, r6, r7, pc} +10007012: 46c0 nop @ (mov r8, r8) +10007014: 200012f4 .word 0x200012f4 +10007018: ffffc200 .word 0xffffc200 + +1000701c : +1000701c: b510 push {r4, lr} +1000701e: 4c09 ldr r4, [pc, #36] @ (10007044 ) +10007020: 2205 movs r2, #5 +10007022: 2100 movs r1, #0 +10007024: 0020 movs r0, r4 +10007026: f7fe f89f bl 10005168 <__wrap_memset> +1000702a: 0020 movs r0, r4 +1000702c: 3424 adds r4, #36 @ 0x24 +1000702e: 3010 adds r0, #16 +10007030: f000 fc6e bl 10007910 +10007034: 0020 movs r0, r4 +10007036: f000 fc6b bl 10007910 +1000703a: 2101 movs r1, #1 +1000703c: 0020 movs r0, r4 +1000703e: f000 fc87 bl 10007950 +10007042: bd10 pop {r4, pc} +10007044: 200012f4 .word 0x200012f4 + +10007048 : +10007048: b5f0 push {r4, r5, r6, r7, lr} +1000704a: 794b ldrb r3, [r1, #5] +1000704c: 0006 movs r6, r0 +1000704e: b083 sub sp, #12 +10007050: 2b02 cmp r3, #2 +10007052: d102 bne.n 1000705a +10007054: 798b ldrb r3, [r1, #6] +10007056: 2b02 cmp r3, #2 +10007058: d003 beq.n 10007062 +1000705a: 2500 movs r5, #0 +1000705c: 0028 movs r0, r5 +1000705e: b003 add sp, #12 +10007060: bdf0 pop {r4, r5, r6, r7, pc} +10007062: 4f2f ldr r7, [pc, #188] @ (10007120 ) +10007064: 78bb ldrb r3, [r7, #2] +10007066: 2b00 cmp r3, #0 +10007068: d1f7 bne.n 1000705a +1000706a: 788b ldrb r3, [r1, #2] +1000706c: 2509 movs r5, #9 +1000706e: 703b strb r3, [r7, #0] +10007070: 780c ldrb r4, [r1, #0] +10007072: 190c adds r4, r1, r4 +10007074: 7863 ldrb r3, [r4, #1] +10007076: 2b24 cmp r3, #36 @ 0x24 +10007078: d10b bne.n 10007092 +1000707a: 2a08 cmp r2, #8 +1000707c: d802 bhi.n 10007084 +1000707e: e01f b.n 100070c0 +10007080: 42aa cmp r2, r5 +10007082: d31d bcc.n 100070c0 +10007084: 7823 ldrb r3, [r4, #0] +10007086: 18e4 adds r4, r4, r3 +10007088: 195d adds r5, r3, r5 +1000708a: 7863 ldrb r3, [r4, #1] +1000708c: b2ad uxth r5, r5 +1000708e: 2b24 cmp r3, #36 @ 0x24 +10007090: d0f6 beq.n 10007080 +10007092: 2b05 cmp r3, #5 +10007094: d031 beq.n 100070fa +10007096: 2b04 cmp r3, #4 +10007098: d112 bne.n 100070c0 +1000709a: 7963 ldrb r3, [r4, #5] +1000709c: 2b0a cmp r3, #10 +1000709e: d10f bne.n 100070c0 +100070a0: 4b20 ldr r3, [pc, #128] @ (10007124 ) +100070a2: 7827 ldrb r7, [r4, #0] +100070a4: 9301 str r3, [sp, #4] +100070a6: 3301 adds r3, #1 +100070a8: 9300 str r3, [sp, #0] +100070aa: 2202 movs r2, #2 +100070ac: 2302 movs r3, #2 +100070ae: 0030 movs r0, r6 +100070b0: 19e1 adds r1, r4, r7 +100070b2: f7ff fcd9 bl 10006a68 +100070b6: 2800 cmp r0, #0 +100070b8: d0cf beq.n 1000705a +100070ba: 350e adds r5, #14 +100070bc: 19ed adds r5, r5, r7 +100070be: b2ad uxth r5, r5 +100070c0: 4c19 ldr r4, [pc, #100] @ (10007128 ) +100070c2: 0020 movs r0, r4 +100070c4: f000 fa3c bl 10007540 +100070c8: 283f cmp r0, #63 @ 0x3f +100070ca: d9c7 bls.n 1000705c +100070cc: 0026 movs r6, r4 +100070ce: 3e10 subs r6, #16 +100070d0: 2000 movs r0, #0 +100070d2: 78f1 ldrb r1, [r6, #3] +100070d4: f7ff fd54 bl 10006b80 +100070d8: 2800 cmp r0, #0 +100070da: d0bf beq.n 1000705c +100070dc: 0020 movs r0, r4 +100070de: f000 fa2f bl 10007540 +100070e2: 283f cmp r0, #63 @ 0x3f +100070e4: d917 bls.n 10007116 +100070e6: 238e movs r3, #142 @ 0x8e +100070e8: 009b lsls r3, r3, #2 +100070ea: 18e2 adds r2, r4, r3 +100070ec: 3bf9 subs r3, #249 @ 0xf9 +100070ee: 78f1 ldrb r1, [r6, #3] +100070f0: 3bff subs r3, #255 @ 0xff +100070f2: 2000 movs r0, #0 +100070f4: f7ff fd6c bl 10006bd0 +100070f8: e7b0 b.n 1000705c +100070fa: 0021 movs r1, r4 +100070fc: 0030 movs r0, r6 +100070fe: f7ff fd25 bl 10006b4c +10007102: 2800 cmp r0, #0 +10007104: d0a9 beq.n 1000705a +10007106: 78a3 ldrb r3, [r4, #2] +10007108: 707b strb r3, [r7, #1] +1000710a: 7823 ldrb r3, [r4, #0] +1000710c: 195d adds r5, r3, r5 +1000710e: 18e4 adds r4, r4, r3 +10007110: 7863 ldrb r3, [r4, #1] +10007112: b2ad uxth r5, r5 +10007114: e7bf b.n 10007096 +10007116: 78f1 ldrb r1, [r6, #3] +10007118: 2000 movs r0, #0 +1000711a: f7ff fd45 bl 10006ba8 +1000711e: e79d b.n 1000705c +10007120: 200012f4 .word 0x200012f4 +10007124: 200012f6 .word 0x200012f6 +10007128: 20001304 .word 0x20001304 + +1000712c : +1000712c: b5f8 push {r3, r4, r5, r6, r7, lr} +1000712e: 2360 movs r3, #96 @ 0x60 +10007130: 0014 movs r4, r2 +10007132: 7812 ldrb r2, [r2, #0] +10007134: 0005 movs r5, r0 +10007136: 4013 ands r3, r2 +10007138: 2000 movs r0, #0 +1000713a: 2b20 cmp r3, #32 +1000713c: d112 bne.n 10007164 +1000713e: 4a2f ldr r2, [pc, #188] @ (100071fc ) +10007140: 7963 ldrb r3, [r4, #5] +10007142: 7927 ldrb r7, [r4, #4] +10007144: 7816 ldrb r6, [r2, #0] +10007146: 021b lsls r3, r3, #8 +10007148: 433b orrs r3, r7 +1000714a: 429e cmp r6, r3 +1000714c: d10a bne.n 10007164 +1000714e: 7863 ldrb r3, [r4, #1] +10007150: 2b22 cmp r3, #34 @ 0x22 +10007152: d01a beq.n 1000718a +10007154: d807 bhi.n 10007166 +10007156: 2b20 cmp r3, #32 +10007158: d03c beq.n 100071d4 +1000715a: 2b21 cmp r3, #33 @ 0x21 +1000715c: d102 bne.n 10007164 +1000715e: 2901 cmp r1, #1 +10007160: d030 beq.n 100071c4 +10007162: 2001 movs r0, #1 +10007164: bdf8 pop {r3, r4, r5, r6, r7, pc} +10007166: 2b23 cmp r3, #35 @ 0x23 +10007168: d1fc bne.n 10007164 +1000716a: 2901 cmp r1, #1 +1000716c: d03f beq.n 100071ee +1000716e: 2903 cmp r1, #3 +10007170: d1f7 bne.n 10007162 +10007172: 4b23 ldr r3, [pc, #140] @ (10007200 ) +10007174: 2b00 cmp r3, #0 +10007176: d0f4 beq.n 10007162 +10007178: 78e1 ldrb r1, [r4, #3] +1000717a: 78a3 ldrb r3, [r4, #2] +1000717c: 0209 lsls r1, r1, #8 +1000717e: 2000 movs r0, #0 +10007180: 4319 orrs r1, r3 +10007182: e000 b.n 10007186 +10007184: bf00 nop +10007186: 2001 movs r0, #1 +10007188: e7ec b.n 10007164 +1000718a: 2901 cmp r1, #1 +1000718c: d02f beq.n 100071ee +1000718e: 2903 cmp r1, #3 +10007190: d1e7 bne.n 10007162 +10007192: 2501 movs r5, #1 +10007194: 002e movs r6, r5 +10007196: 78a3 ldrb r3, [r4, #2] +10007198: 78e4 ldrb r4, [r4, #3] +1000719a: 3902 subs r1, #2 +1000719c: 0224 lsls r4, r4, #8 +1000719e: 431c orrs r4, r3 +100071a0: 7114 strb r4, [r2, #4] +100071a2: 4026 ands r6, r4 +100071a4: 3224 adds r2, #36 @ 0x24 +100071a6: 0010 movs r0, r2 +100071a8: 4071 eors r1, r6 +100071aa: f000 fbd1 bl 10007950 +100071ae: 4b15 ldr r3, [pc, #84] @ (10007204 ) +100071b0: 2b00 cmp r3, #0 +100071b2: d0d6 beq.n 10007162 +100071b4: 0862 lsrs r2, r4, #1 +100071b6: 2000 movs r0, #0 +100071b8: 0031 movs r1, r6 +100071ba: 402a ands r2, r5 +100071bc: e000 b.n 100071c0 +100071be: bf00 nop +100071c0: 2001 movs r0, #1 +100071c2: e7cf b.n 10007164 +100071c4: 2307 movs r3, #7 +100071c6: 0021 movs r1, r4 +100071c8: 0028 movs r0, r5 +100071ca: 4a0f ldr r2, [pc, #60] @ (10007208 ) +100071cc: f7ff fd3c bl 10006c48 +100071d0: 2001 movs r0, #1 +100071d2: e7c7 b.n 10007164 +100071d4: 2901 cmp r1, #1 +100071d6: d0f5 beq.n 100071c4 +100071d8: 2903 cmp r1, #3 +100071da: d1c2 bne.n 10007162 +100071dc: 4b0b ldr r3, [pc, #44] @ (1000720c ) +100071de: 2b00 cmp r3, #0 +100071e0: d0bf beq.n 10007162 +100071e2: 2000 movs r0, #0 +100071e4: 1d91 adds r1, r2, #6 +100071e6: f7fe fad9 bl 1000579c +100071ea: 2001 movs r0, #1 +100071ec: e7ba b.n 10007164 +100071ee: 0021 movs r1, r4 +100071f0: 0028 movs r0, r5 +100071f2: f7ff fd13 bl 10006c1c +100071f6: 2001 movs r0, #1 +100071f8: e7b4 b.n 10007164 +100071fa: 46c0 nop @ (mov r8, r8) +100071fc: 200012f4 .word 0x200012f4 + ... +10007208: 200012fa .word 0x200012fa +1000720c: 1000579d .word 0x1000579d + +10007210 : +10007210: b5f8 push {r3, r4, r5, r6, r7, lr} +10007212: 4645 mov r5, r8 +10007214: 4657 mov r7, sl +10007216: 46de mov lr, fp +10007218: 464e mov r6, r9 +1000721a: b5e0 push {r5, r6, r7, lr} +1000721c: 4d46 ldr r5, [pc, #280] @ (10007338 ) +1000721e: 001f movs r7, r3 +10007220: 78ea ldrb r2, [r5, #3] +10007222: 4680 mov r8, r0 +10007224: 000c movs r4, r1 +10007226: 78ab ldrb r3, [r5, #2] +10007228: 428a cmp r2, r1 +1000722a: d046 beq.n 100072ba +1000722c: 2000 movs r0, #0 +1000722e: 428b cmp r3, r1 +10007230: d01a beq.n 10007268 +10007232: bcf0 pop {r4, r5, r6, r7} +10007234: 46bb mov fp, r7 +10007236: 46b2 mov sl, r6 +10007238: 46a9 mov r9, r5 +1000723a: 46a0 mov r8, r4 +1000723c: bdf8 pop {r3, r4, r5, r6, r7, pc} +1000723e: 4b3f ldr r3, [pc, #252] @ (1000733c ) +10007240: 2b00 cmp r3, #0 +10007242: d004 beq.n 1000724e +10007244: 4648 mov r0, r9 +10007246: f000 f973 bl 10007530 +1000724a: 2800 cmp r0, #0 +1000724c: d06c beq.n 10007328 +1000724e: 4648 mov r0, r9 +10007250: f000 f976 bl 10007540 +10007254: 283f cmp r0, #63 @ 0x3f +10007256: d907 bls.n 10007268 +10007258: 464e mov r6, r9 +1000725a: 3e10 subs r6, #16 +1000725c: 2000 movs r0, #0 +1000725e: 78f1 ldrb r1, [r6, #3] +10007260: f7ff fc8e bl 10006b80 +10007264: 2800 cmp r0, #0 +10007266: d151 bne.n 1000730c +10007268: 78ab ldrb r3, [r5, #2] +1000726a: 42a3 cmp r3, r4 +1000726c: d001 beq.n 10007272 +1000726e: 2001 movs r0, #1 +10007270: e7df b.n 10007232 +10007272: 4b33 ldr r3, [pc, #204] @ (10007340 ) +10007274: 2b00 cmp r3, #0 +10007276: d002 beq.n 1000727e +10007278: 2000 movs r0, #0 +1000727a: e000 b.n 1000727e +1000727c: bf00 nop +1000727e: 2000 movs r0, #0 +10007280: f7ff fe2c bl 10006edc +10007284: 2800 cmp r0, #0 +10007286: d1f2 bne.n 1000726e +10007288: 4c2e ldr r4, [pc, #184] @ (10007344 ) +1000728a: 0020 movs r0, r4 +1000728c: f000 f93a bl 10007504 +10007290: 2800 cmp r0, #0 +10007292: d1ec bne.n 1000726e +10007294: 2f00 cmp r7, #0 +10007296: d0ea beq.n 1000726e +10007298: 06bf lsls r7, r7, #26 +1000729a: d1e8 bne.n 1000726e +1000729c: 3c24 subs r4, #36 @ 0x24 +1000729e: 4640 mov r0, r8 +100072a0: 78a1 ldrb r1, [r4, #2] +100072a2: f7ff fc6d bl 10006b80 +100072a6: 2800 cmp r0, #0 +100072a8: d0e1 beq.n 1000726e +100072aa: 2300 movs r3, #0 +100072ac: 2200 movs r2, #0 +100072ae: 4640 mov r0, r8 +100072b0: 78a1 ldrb r1, [r4, #2] +100072b2: f7ff fc8d bl 10006bd0 +100072b6: 2001 movs r0, #1 +100072b8: e7bb b.n 10007232 +100072ba: 2392 movs r3, #146 @ 0x92 +100072bc: 009b lsls r3, r3, #2 +100072be: 18ee adds r6, r5, r3 +100072c0: 2310 movs r3, #16 +100072c2: 469b mov fp, r3 +100072c4: 44ab add fp, r5 +100072c6: 0031 movs r1, r6 +100072c8: 4658 mov r0, fp +100072ca: b2ba uxth r2, r7 +100072cc: f000 fa64 bl 10007798 +100072d0: 4b1d ldr r3, [pc, #116] @ (10007348 ) +100072d2: 46d9 mov r9, fp +100072d4: 2b00 cmp r3, #0 +100072d6: d0b2 beq.n 1000723e +100072d8: 796b ldrb r3, [r5, #5] +100072da: 2bff cmp r3, #255 @ 0xff +100072dc: d0af beq.n 1000723e +100072de: 2f00 cmp r7, #0 +100072e0: d0ad beq.n 1000723e +100072e2: 19f2 adds r2, r6, r7 +100072e4: 4692 mov sl, r2 +100072e6: e003 b.n 100072f0 +100072e8: 3601 adds r6, #1 +100072ea: 45b2 cmp sl, r6 +100072ec: d0a7 beq.n 1000723e +100072ee: 796b ldrb r3, [r5, #5] +100072f0: 7832 ldrb r2, [r6, #0] +100072f2: 429a cmp r2, r3 +100072f4: d1f8 bne.n 100072e8 +100072f6: 4648 mov r0, r9 +100072f8: f000 f91a bl 10007530 +100072fc: 2800 cmp r0, #0 +100072fe: d1f3 bne.n 100072e8 +10007300: 464b mov r3, r9 +10007302: 3b10 subs r3, #16 +10007304: 7959 ldrb r1, [r3, #5] +10007306: e000 b.n 1000730a +10007308: bf00 nop +1000730a: e7ed b.n 100072e8 +1000730c: 4648 mov r0, r9 +1000730e: f000 f917 bl 10007540 +10007312: 283f cmp r0, #63 @ 0x3f +10007314: d90b bls.n 1000732e +10007316: 228e movs r2, #142 @ 0x8e +10007318: 0092 lsls r2, r2, #2 +1000731a: 2340 movs r3, #64 @ 0x40 +1000731c: 78f1 ldrb r1, [r6, #3] +1000731e: 444a add r2, r9 +10007320: 2000 movs r0, #0 +10007322: f7ff fc55 bl 10006bd0 +10007326: e79f b.n 10007268 +10007328: f7fe fbac bl 10005a84 +1000732c: e78f b.n 1000724e +1000732e: 78f1 ldrb r1, [r6, #3] +10007330: 2000 movs r0, #0 +10007332: f7ff fc39 bl 10006ba8 +10007336: e797 b.n 10007268 +10007338: 200012f4 .word 0x200012f4 +1000733c: 10005a85 .word 0x10005a85 +10007340: 00000000 .word 0x00000000 +10007344: 20001318 .word 0x20001318 +10007348: 00000000 .word 0x00000000 + +1000734c : +1000734c: b510 push {r4, lr} +1000734e: 2000 movs r0, #0 +10007350: f7fe fef4 bl 1000613c +10007354: bd10 pop {r4, pc} +10007356: 46c0 nop @ (mov r8, r8) + +10007358 : +10007358: b510 push {r4, lr} +1000735a: f7fe fee5 bl 10006128 +1000735e: bd10 pop {r4, pc} + +10007360 : +10007360: 7803 ldrb r3, [r0, #0] +10007362: b570 push {r4, r5, r6, lr} +10007364: 07db lsls r3, r3, #31 +10007366: 0004 movs r4, r0 +10007368: 000e movs r6, r1 +1000736a: 0fdd lsrs r5, r3, #31 +1000736c: 2b00 cmp r3, #0 +1000736e: d117 bne.n 100073a0 +10007370: 7803 ldrb r3, [r0, #0] +10007372: 075b lsls r3, r3, #29 +10007374: d501 bpl.n 1000737a +10007376: 0028 movs r0, r5 +10007378: bd70 pop {r4, r5, r6, pc} +1000737a: 2101 movs r1, #1 +1000737c: 0030 movs r0, r6 +1000737e: 4249 negs r1, r1 +10007380: f000 fc2e bl 10007be0 <__mutex_enter_timeout_ms_veneer> +10007384: 7823 ldrb r3, [r4, #0] +10007386: 07db lsls r3, r3, #31 +10007388: 0fdd lsrs r5, r3, #31 +1000738a: 2b00 cmp r3, #0 +1000738c: d10a bne.n 100073a4 +1000738e: 7823 ldrb r3, [r4, #0] +10007390: 075b lsls r3, r3, #29 +10007392: d408 bmi.n 100073a6 +10007394: 2204 movs r2, #4 +10007396: 7823 ldrb r3, [r4, #0] +10007398: 2501 movs r5, #1 +1000739a: 4313 orrs r3, r2 +1000739c: 7023 strb r3, [r4, #0] +1000739e: e002 b.n 100073a6 +100073a0: 2500 movs r5, #0 +100073a2: e7e8 b.n 10007376 +100073a4: 2500 movs r5, #0 +100073a6: 0030 movs r0, r6 +100073a8: f000 fbf2 bl 10007b90 <__mutex_exit_veneer> +100073ac: e7e3 b.n 10007376 +100073ae: 46c0 nop @ (mov r8, r8) + +100073b0 : +100073b0: b570 push {r4, r5, r6, lr} +100073b2: 000c movs r4, r1 +100073b4: 2101 movs r1, #1 +100073b6: 0006 movs r6, r0 +100073b8: 4249 negs r1, r1 +100073ba: 0020 movs r0, r4 +100073bc: f000 fc10 bl 10007be0 <__mutex_enter_timeout_ms_veneer> +100073c0: 7833 ldrb r3, [r6, #0] +100073c2: 075b lsls r3, r3, #29 +100073c4: 0fdd lsrs r5, r3, #31 +100073c6: 2b00 cmp r3, #0 +100073c8: db04 blt.n 100073d4 +100073ca: 0020 movs r0, r4 +100073cc: f000 fbe0 bl 10007b90 <__mutex_exit_veneer> +100073d0: 0028 movs r0, r5 +100073d2: bd70 pop {r4, r5, r6, pc} +100073d4: 7833 ldrb r3, [r6, #0] +100073d6: 07db lsls r3, r3, #31 +100073d8: d404 bmi.n 100073e4 +100073da: 2204 movs r2, #4 +100073dc: 7833 ldrb r3, [r6, #0] +100073de: 4393 bics r3, r2 +100073e0: 7033 strb r3, [r6, #0] +100073e2: e7f2 b.n 100073ca +100073e4: 2500 movs r5, #0 +100073e6: e7f0 b.n 100073ca + +100073e8 : +100073e8: 7943 ldrb r3, [r0, #5] +100073ea: 7902 ldrb r2, [r0, #4] +100073ec: 021b lsls r3, r3, #8 +100073ee: 4313 orrs r3, r2 +100073f0: 78c2 ldrb r2, [r0, #3] +100073f2: 055b lsls r3, r3, #21 +100073f4: 0792 lsls r2, r2, #30 +100073f6: 0d5b lsrs r3, r3, #21 +100073f8: 0f92 lsrs r2, r2, #30 +100073fa: 2a02 cmp r2, #2 +100073fc: d01d beq.n 1000743a +100073fe: 2a03 cmp r2, #3 +10007400: d00c beq.n 1000741c +10007402: 2000 movs r0, #0 +10007404: 2a01 cmp r2, #1 +10007406: d108 bne.n 1000741a +10007408: 3902 subs r1, #2 +1000740a: 424a negs r2, r1 +1000740c: 4151 adcs r1, r2 +1000740e: 4a12 ldr r2, [pc, #72] @ (10007458 ) +10007410: 4694 mov ip, r2 +10007412: 4461 add r1, ip +10007414: 4299 cmp r1, r3 +10007416: 4140 adcs r0, r0 +10007418: b2c0 uxtb r0, r0 +1000741a: 4770 bx lr +1000741c: 3902 subs r1, #2 +1000741e: 1e4a subs r2, r1, #1 +10007420: 4191 sbcs r1, r2 +10007422: 4a0e ldr r2, [pc, #56] @ (1000745c ) +10007424: 4249 negs r1, r1 +10007426: 4011 ands r1, r2 +10007428: 2280 movs r2, #128 @ 0x80 +1000742a: 00d2 lsls r2, r2, #3 +1000742c: 4694 mov ip, r2 +1000742e: 2000 movs r0, #0 +10007430: 4461 add r1, ip +10007432: 4299 cmp r1, r3 +10007434: 4140 adcs r0, r0 +10007436: b2c0 uxtb r0, r0 +10007438: e7ef b.n 1000741a +1000743a: 2902 cmp r1, #2 +1000743c: d005 beq.n 1000744a +1000743e: 2000 movs r0, #0 +10007440: 2240 movs r2, #64 @ 0x40 +10007442: 429a cmp r2, r3 +10007444: 4140 adcs r0, r0 +10007446: b2c0 uxtb r0, r0 +10007448: e7e7 b.n 1000741a +1000744a: 4a05 ldr r2, [pc, #20] @ (10007460 ) +1000744c: 1898 adds r0, r3, r2 +1000744e: 4243 negs r3, r0 +10007450: 4158 adcs r0, r3 +10007452: b2c0 uxtb r0, r0 +10007454: e7e1 b.n 1000741a +10007456: 46c0 nop @ (mov r8, r8) +10007458: 000003ff .word 0x000003ff +1000745c: fffffc40 .word 0xfffffc40 +10007460: fffffe00 .word 0xfffffe00 + +10007464 : +10007464: 188a adds r2, r1, r2 +10007466: b570 push {r4, r5, r6, lr} +10007468: 4291 cmp r1, r2 +1000746a: d207 bcs.n 1000747c +1000746c: 267f movs r6, #127 @ 0x7f +1000746e: 784c ldrb r4, [r1, #1] +10007470: 2c05 cmp r4, #5 +10007472: d004 beq.n 1000747e +10007474: 780c ldrb r4, [r1, #0] +10007476: 1909 adds r1, r1, r4 +10007478: 428a cmp r2, r1 +1000747a: d8f8 bhi.n 1000746e +1000747c: bd70 pop {r4, r5, r6, pc} +1000747e: 0034 movs r4, r6 +10007480: 788d ldrb r5, [r1, #2] +10007482: 402c ands r4, r5 +10007484: 0064 lsls r4, r4, #1 +10007486: 1904 adds r4, r0, r4 +10007488: 09ed lsrs r5, r5, #7 +1000748a: 5563 strb r3, [r4, r5] +1000748c: 780c ldrb r4, [r1, #0] +1000748e: 1909 adds r1, r1, r4 +10007490: 428a cmp r2, r1 +10007492: d8ec bhi.n 1000746e +10007494: e7f2 b.n 1000747c +10007496: 46c0 nop @ (mov r8, r8) + +10007498 : +10007498: b5f0 push {r4, r5, r6, r7, lr} +1000749a: 46c6 mov lr, r8 +1000749c: b500 push {lr} +1000749e: 0004 movs r4, r0 +100074a0: a806 add r0, sp, #24 +100074a2: 7805 ldrb r5, [r0, #0] +100074a4: 2080 movs r0, #128 @ 0x80 +100074a6: 4688 mov r8, r1 +100074a8: 0017 movs r7, r2 +100074aa: 001e movs r6, r3 +100074ac: 0200 lsls r0, r0, #8 +100074ae: 4282 cmp r2, r0 +100074b0: d826 bhi.n 10007500 +100074b2: 68e0 ldr r0, [r4, #12] +100074b4: 2800 cmp r0, #0 +100074b6: d003 beq.n 100074c0 +100074b8: 2101 movs r1, #1 +100074ba: 4249 negs r1, r1 +100074bc: f000 fb90 bl 10007be0 <__mutex_enter_timeout_ms_veneer> +100074c0: 6920 ldr r0, [r4, #16] +100074c2: 2800 cmp r0, #0 +100074c4: d003 beq.n 100074ce +100074c6: 2101 movs r1, #1 +100074c8: 4249 negs r1, r1 +100074ca: f000 fb89 bl 10007be0 <__mutex_enter_timeout_ms_veneer> +100074ce: 4643 mov r3, r8 +100074d0: 6023 str r3, [r4, #0] +100074d2: 0473 lsls r3, r6, #17 +100074d4: 0c5b lsrs r3, r3, #17 +100074d6: 03ed lsls r5, r5, #15 +100074d8: 431d orrs r5, r3 +100074da: 2300 movs r3, #0 +100074dc: 68e0 ldr r0, [r4, #12] +100074de: 8163 strh r3, [r4, #10] +100074e0: 80a7 strh r7, [r4, #4] +100074e2: 80e5 strh r5, [r4, #6] +100074e4: 8123 strh r3, [r4, #8] +100074e6: 2800 cmp r0, #0 +100074e8: d001 beq.n 100074ee +100074ea: f000 fb51 bl 10007b90 <__mutex_exit_veneer> +100074ee: 6920 ldr r0, [r4, #16] +100074f0: 2800 cmp r0, #0 +100074f2: d001 beq.n 100074f8 +100074f4: f000 fb4c bl 10007b90 <__mutex_exit_veneer> +100074f8: 2001 movs r0, #1 +100074fa: bc80 pop {r7} +100074fc: 46b8 mov r8, r7 +100074fe: bdf0 pop {r4, r5, r6, r7, pc} +10007500: 2000 movs r0, #0 +10007502: e7fa b.n 100074fa + +10007504 : +10007504: b510 push {r4, lr} +10007506: 8904 ldrh r4, [r0, #8] +10007508: 8941 ldrh r1, [r0, #10] +1000750a: 8882 ldrh r2, [r0, #4] +1000750c: b2a3 uxth r3, r4 +1000750e: b288 uxth r0, r1 +10007510: 428c cmp r4, r1 +10007512: d307 bcc.n 10007524 +10007514: 1a1b subs r3, r3, r0 +10007516: b29b uxth r3, r3 +10007518: 1c10 adds r0, r2, #0 +1000751a: 429a cmp r2, r3 +1000751c: d900 bls.n 10007520 +1000751e: 1c18 adds r0, r3, #0 +10007520: b280 uxth r0, r0 +10007522: bd10 pop {r4, pc} +10007524: 0051 lsls r1, r2, #1 +10007526: 1a09 subs r1, r1, r0 +10007528: 185b adds r3, r3, r1 +1000752a: b29b uxth r3, r3 +1000752c: e7f4 b.n 10007518 +1000752e: 46c0 nop @ (mov r8, r8) + +10007530 : +10007530: 8903 ldrh r3, [r0, #8] +10007532: 8940 ldrh r0, [r0, #10] +10007534: 1a18 subs r0, r3, r0 +10007536: 4243 negs r3, r0 +10007538: 4158 adcs r0, r3 +1000753a: b2c0 uxtb r0, r0 +1000753c: 4770 bx lr +1000753e: 46c0 nop @ (mov r8, r8) + +10007540 : +10007540: b510 push {r4, lr} +10007542: 8904 ldrh r4, [r0, #8] +10007544: 8941 ldrh r1, [r0, #10] +10007546: 8882 ldrh r2, [r0, #4] +10007548: b2a3 uxth r3, r4 +1000754a: b288 uxth r0, r1 +1000754c: 428c cmp r4, r1 +1000754e: d307 bcc.n 10007560 +10007550: 1a1b subs r3, r3, r0 +10007552: b29b uxth r3, r3 +10007554: 2000 movs r0, #0 +10007556: 429a cmp r2, r3 +10007558: d901 bls.n 1000755e +1000755a: 1ad2 subs r2, r2, r3 +1000755c: b290 uxth r0, r2 +1000755e: bd10 pop {r4, pc} +10007560: 0051 lsls r1, r2, #1 +10007562: 1a09 subs r1, r1, r0 +10007564: 185b adds r3, r3, r1 +10007566: b29b uxth r3, r3 +10007568: e7f4 b.n 10007554 +1000756a: 46c0 nop @ (mov r8, r8) + +1000756c : +1000756c: b570 push {r4, r5, r6, lr} +1000756e: 0004 movs r4, r0 +10007570: 6900 ldr r0, [r0, #16] +10007572: 000e movs r6, r1 +10007574: 2800 cmp r0, #0 +10007576: d003 beq.n 10007580 +10007578: 2101 movs r1, #1 +1000757a: 4249 negs r1, r1 +1000757c: f000 fb30 bl 10007be0 <__mutex_enter_timeout_ms_veneer> +10007580: 8925 ldrh r5, [r4, #8] +10007582: 8960 ldrh r0, [r4, #10] +10007584: 88a2 ldrh r2, [r4, #4] +10007586: b2a9 uxth r1, r5 +10007588: b283 uxth r3, r0 +1000758a: 4285 cmp r5, r0 +1000758c: d32c bcc.n 100075e8 +1000758e: 1acd subs r5, r1, r3 +10007590: b2ad uxth r5, r5 +10007592: 2d00 cmp r5, #0 +10007594: d02e beq.n 100075f4 +10007596: 42aa cmp r2, r5 +10007598: d208 bcs.n 100075ac +1000759a: 4291 cmp r1, r2 +1000759c: d330 bcc.n 10007600 +1000759e: 1a89 subs r1, r1, r2 +100075a0: b28b uxth r3, r1 +100075a2: 8163 strh r3, [r4, #10] +100075a4: 429a cmp r2, r3 +100075a6: d803 bhi.n 100075b0 +100075a8: 1a9b subs r3, r3, r2 +100075aa: b29b uxth r3, r3 +100075ac: 429a cmp r2, r3 +100075ae: d9fb bls.n 100075a8 +100075b0: 88e2 ldrh r2, [r4, #6] +100075b2: 6821 ldr r1, [r4, #0] +100075b4: 0452 lsls r2, r2, #17 +100075b6: 0c52 lsrs r2, r2, #17 +100075b8: 4353 muls r3, r2 +100075ba: 0030 movs r0, r6 +100075bc: 18c9 adds r1, r1, r3 +100075be: f7fd fdd9 bl 10005174 <__wrap___aeabi_memcpy> +100075c2: 8963 ldrh r3, [r4, #10] +100075c4: 2501 movs r5, #1 +100075c6: 1c59 adds r1, r3, #1 +100075c8: b289 uxth r1, r1 +100075ca: 88a2 ldrh r2, [r4, #4] +100075cc: 428b cmp r3, r1 +100075ce: d913 bls.n 100075f8 +100075d0: 2100 movs r1, #0 +100075d2: 0052 lsls r2, r2, #1 +100075d4: 1a89 subs r1, r1, r2 +100075d6: b289 uxth r1, r1 +100075d8: 6920 ldr r0, [r4, #16] +100075da: 8161 strh r1, [r4, #10] +100075dc: 2800 cmp r0, #0 +100075de: d001 beq.n 100075e4 +100075e0: f000 fad6 bl 10007b90 <__mutex_exit_veneer> +100075e4: 0028 movs r0, r5 +100075e6: bd70 pop {r4, r5, r6, pc} +100075e8: 0055 lsls r5, r2, #1 +100075ea: 1aed subs r5, r5, r3 +100075ec: 194d adds r5, r1, r5 +100075ee: b2ad uxth r5, r5 +100075f0: 2d00 cmp r5, #0 +100075f2: d1d0 bne.n 10007596 +100075f4: 8961 ldrh r1, [r4, #10] +100075f6: b289 uxth r1, r1 +100075f8: 0052 lsls r2, r2, #1 +100075fa: 4291 cmp r1, r2 +100075fc: dbec blt.n 100075d8 +100075fe: e7e9 b.n 100075d4 +10007600: 1889 adds r1, r1, r2 +10007602: b28b uxth r3, r1 +10007604: 8163 strh r3, [r4, #10] +10007606: e7cd b.n 100075a4 + +10007608 : +10007608: b5f0 push {r4, r5, r6, r7, lr} +1000760a: 4646 mov r6, r8 +1000760c: 464f mov r7, r9 +1000760e: 46d6 mov lr, sl +10007610: b5c0 push {r6, r7, lr} +10007612: 0006 movs r6, r0 +10007614: 6900 ldr r0, [r0, #16] +10007616: 4689 mov r9, r1 +10007618: 4690 mov r8, r2 +1000761a: 2800 cmp r0, #0 +1000761c: d003 beq.n 10007626 +1000761e: 2101 movs r1, #1 +10007620: 4249 negs r1, r1 +10007622: f000 fadd bl 10007be0 <__mutex_enter_timeout_ms_veneer> +10007626: 8931 ldrh r1, [r6, #8] +10007628: 8972 ldrh r2, [r6, #10] +1000762a: 88b5 ldrh r5, [r6, #4] +1000762c: b28b uxth r3, r1 +1000762e: b294 uxth r4, r2 +10007630: 4291 cmp r1, r2 +10007632: d354 bcc.n 100076de +10007634: 1b1f subs r7, r3, r4 +10007636: b2bf uxth r7, r7 +10007638: 2f00 cmp r7, #0 +1000763a: d04a beq.n 100076d2 +1000763c: 42bd cmp r5, r7 +1000763e: d205 bcs.n 1000764c +10007640: 42ab cmp r3, r5 +10007642: d251 bcs.n 100076e8 +10007644: 195b adds r3, r3, r5 +10007646: b29c uxth r4, r3 +10007648: 002f movs r7, r5 +1000764a: 8174 strh r4, [r6, #10] +1000764c: 4643 mov r3, r8 +1000764e: 45b8 cmp r8, r7 +10007650: d83d bhi.n 100076ce +10007652: b29f uxth r7, r3 +10007654: 42a5 cmp r5, r4 +10007656: d803 bhi.n 10007660 +10007658: 1b64 subs r4, r4, r5 +1000765a: b2a4 uxth r4, r4 +1000765c: 42a5 cmp r5, r4 +1000765e: d9fb bls.n 10007658 +10007660: 88f2 ldrh r2, [r6, #6] +10007662: 6831 ldr r1, [r6, #0] +10007664: 0452 lsls r2, r2, #17 +10007666: 0c52 lsrs r2, r2, #17 +10007668: 4690 mov r8, r2 +1000766a: 4362 muls r2, r4 +1000766c: 1b2b subs r3, r5, r4 +1000766e: b29b uxth r3, r3 +10007670: 1889 adds r1, r1, r2 +10007672: 4642 mov r2, r8 +10007674: 429f cmp r7, r3 +10007676: d925 bls.n 100076c4 +10007678: 4353 muls r3, r2 +1000767a: b29b uxth r3, r3 +1000767c: 001a movs r2, r3 +1000767e: 4648 mov r0, r9 +10007680: 469a mov sl, r3 +10007682: f7fd fd77 bl 10005174 <__wrap___aeabi_memcpy> +10007686: 4643 mov r3, r8 +10007688: 4648 mov r0, r9 +1000768a: 1b7d subs r5, r7, r5 +1000768c: 1964 adds r4, r4, r5 +1000768e: 435c muls r4, r3 +10007690: 6831 ldr r1, [r6, #0] +10007692: 4450 add r0, sl +10007694: b2a2 uxth r2, r4 +10007696: f7fd fd6d bl 10005174 <__wrap___aeabi_memcpy> +1000769a: 8971 ldrh r1, [r6, #10] +1000769c: 88b5 ldrh r5, [r6, #4] +1000769e: 19cb adds r3, r1, r7 +100076a0: b29b uxth r3, r3 +100076a2: 006a lsls r2, r5, #1 +100076a4: 4299 cmp r1, r3 +100076a6: d916 bls.n 100076d6 +100076a8: 1a9b subs r3, r3, r2 +100076aa: b29b uxth r3, r3 +100076ac: 6930 ldr r0, [r6, #16] +100076ae: 8173 strh r3, [r6, #10] +100076b0: 2800 cmp r0, #0 +100076b2: d001 beq.n 100076b8 +100076b4: f000 fa6c bl 10007b90 <__mutex_exit_veneer> +100076b8: 0038 movs r0, r7 +100076ba: bce0 pop {r5, r6, r7} +100076bc: 46ba mov sl, r7 +100076be: 46b1 mov r9, r6 +100076c0: 46a8 mov r8, r5 +100076c2: bdf0 pop {r4, r5, r6, r7, pc} +100076c4: 4648 mov r0, r9 +100076c6: 437a muls r2, r7 +100076c8: f7fd fd54 bl 10005174 <__wrap___aeabi_memcpy> +100076cc: e7e5 b.n 1000769a +100076ce: 1c3b adds r3, r7, #0 +100076d0: e7bf b.n 10007652 +100076d2: 8973 ldrh r3, [r6, #10] +100076d4: b29b uxth r3, r3 +100076d6: 006a lsls r2, r5, #1 +100076d8: 4293 cmp r3, r2 +100076da: dbe7 blt.n 100076ac +100076dc: e7e4 b.n 100076a8 +100076de: 006f lsls r7, r5, #1 +100076e0: 1b3f subs r7, r7, r4 +100076e2: 19df adds r7, r3, r7 +100076e4: b2bf uxth r7, r7 +100076e6: e7a7 b.n 10007638 +100076e8: 1b5b subs r3, r3, r5 +100076ea: b29c uxth r4, r3 +100076ec: e7ac b.n 10007648 +100076ee: 46c0 nop @ (mov r8, r8) + +100076f0 : +100076f0: b5f8 push {r3, r4, r5, r6, r7, lr} +100076f2: 0004 movs r4, r0 +100076f4: 68c0 ldr r0, [r0, #12] +100076f6: 000e movs r6, r1 +100076f8: 2800 cmp r0, #0 +100076fa: d003 beq.n 10007704 +100076fc: 2101 movs r1, #1 +100076fe: 4249 negs r1, r1 +10007700: f000 fa6e bl 10007be0 <__mutex_enter_timeout_ms_veneer> +10007704: 8925 ldrh r5, [r4, #8] +10007706: 8920 ldrh r0, [r4, #8] +10007708: 8961 ldrh r1, [r4, #10] +1000770a: 88a2 ldrh r2, [r4, #4] +1000770c: b2ad uxth r5, r5 +1000770e: b283 uxth r3, r0 +10007710: b28f uxth r7, r1 +10007712: 4288 cmp r0, r1 +10007714: d329 bcc.n 1000776a +10007716: 1bdb subs r3, r3, r7 +10007718: b29b uxth r3, r3 +1000771a: 429a cmp r2, r3 +1000771c: d809 bhi.n 10007732 +1000771e: 79e7 ldrb r7, [r4, #7] +10007720: 09ff lsrs r7, r7, #7 +10007722: d106 bne.n 10007732 +10007724: 68e0 ldr r0, [r4, #12] +10007726: 2800 cmp r0, #0 +10007728: d001 beq.n 1000772e +1000772a: f000 fa31 bl 10007b90 <__mutex_exit_veneer> +1000772e: 0038 movs r0, r7 +10007730: bdf8 pop {r3, r4, r5, r6, r7, pc} +10007732: 4295 cmp r5, r2 +10007734: d31e bcc.n 10007774 +10007736: 002b movs r3, r5 +10007738: 1a9b subs r3, r3, r2 +1000773a: b29b uxth r3, r3 +1000773c: 4293 cmp r3, r2 +1000773e: d2fb bcs.n 10007738 +10007740: 88e2 ldrh r2, [r4, #6] +10007742: 6820 ldr r0, [r4, #0] +10007744: 0452 lsls r2, r2, #17 +10007746: 0c52 lsrs r2, r2, #17 +10007748: 4353 muls r3, r2 +1000774a: 0031 movs r1, r6 +1000774c: 18c0 adds r0, r0, r3 +1000774e: f7fd fd11 bl 10005174 <__wrap___aeabi_memcpy> +10007752: 1c6b adds r3, r5, #1 +10007754: b29b uxth r3, r3 +10007756: 88a2 ldrh r2, [r4, #4] +10007758: 429d cmp r5, r3 +1000775a: d918 bls.n 1000778e +1000775c: 2300 movs r3, #0 +1000775e: 0052 lsls r2, r2, #1 +10007760: 1a9b subs r3, r3, r2 +10007762: b29b uxth r3, r3 +10007764: 2701 movs r7, #1 +10007766: 8123 strh r3, [r4, #8] +10007768: e7dc b.n 10007724 +1000776a: 0051 lsls r1, r2, #1 +1000776c: 1bc9 subs r1, r1, r7 +1000776e: 185b adds r3, r3, r1 +10007770: b29b uxth r3, r3 +10007772: e7d2 b.n 1000771a +10007774: 002b movs r3, r5 +10007776: 88e2 ldrh r2, [r4, #6] +10007778: 6820 ldr r0, [r4, #0] +1000777a: 0452 lsls r2, r2, #17 +1000777c: 0c52 lsrs r2, r2, #17 +1000777e: 4353 muls r3, r2 +10007780: 0031 movs r1, r6 +10007782: 18c0 adds r0, r0, r3 +10007784: f7fd fcf6 bl 10005174 <__wrap___aeabi_memcpy> +10007788: 3501 adds r5, #1 +1000778a: 88a2 ldrh r2, [r4, #4] +1000778c: b2ab uxth r3, r5 +1000778e: 0052 lsls r2, r2, #1 +10007790: 4293 cmp r3, r2 +10007792: dbe7 blt.n 10007764 +10007794: e7e4 b.n 10007760 +10007796: 46c0 nop @ (mov r8, r8) + +10007798 : +10007798: b5f0 push {r4, r5, r6, r7, lr} +1000779a: 4657 mov r7, sl +1000779c: 4645 mov r5, r8 +1000779e: 46de mov lr, fp +100077a0: 464e mov r6, r9 +100077a2: b5e0 push {r5, r6, r7, lr} +100077a4: 0014 movs r4, r2 +100077a6: 0005 movs r5, r0 +100077a8: 000f movs r7, r1 +100077aa: b083 sub sp, #12 +100077ac: 2a00 cmp r2, #0 +100077ae: d075 beq.n 1000789c +100077b0: 68c0 ldr r0, [r0, #12] +100077b2: 2800 cmp r0, #0 +100077b4: d003 beq.n 100077be +100077b6: 2101 movs r1, #1 +100077b8: 4249 negs r1, r1 +100077ba: f000 fa11 bl 10007be0 <__mutex_enter_timeout_ms_veneer> +100077be: 892e ldrh r6, [r5, #8] +100077c0: 79e9 ldrb r1, [r5, #7] +100077c2: 896a ldrh r2, [r5, #10] +100077c4: 88ab ldrh r3, [r5, #4] +100077c6: b2b6 uxth r6, r6 +100077c8: b292 uxth r2, r2 +100077ca: 09c9 lsrs r1, r1, #7 +100077cc: d145 bne.n 1000785a +100077ce: 4296 cmp r6, r2 +100077d0: d300 bcc.n 100077d4 +100077d2: e06d b.n 100078b0 +100077d4: 0059 lsls r1, r3, #1 +100077d6: 1a8a subs r2, r1, r2 +100077d8: 18b2 adds r2, r6, r2 +100077da: b292 uxth r2, r2 +100077dc: 2100 movs r1, #0 +100077de: 4689 mov r9, r1 +100077e0: 429a cmp r2, r3 +100077e2: d234 bcs.n 1000784e +100077e4: 1a9a subs r2, r3, r2 +100077e6: 1c11 adds r1, r2, #0 +100077e8: b292 uxth r2, r2 +100077ea: 42a2 cmp r2, r4 +100077ec: d900 bls.n 100077f0 +100077ee: 1c21 adds r1, r4, #0 +100077f0: b28a uxth r2, r1 +100077f2: 4691 mov r9, r2 +100077f4: 88ea ldrh r2, [r5, #6] +100077f6: 0452 lsls r2, r2, #17 +100077f8: 0c52 lsrs r2, r2, #17 +100077fa: 4690 mov r8, r2 +100077fc: 464a mov r2, r9 +100077fe: 18b2 adds r2, r6, r2 +10007800: b292 uxth r2, r2 +10007802: 4692 mov sl, r2 +10007804: 464a mov r2, r9 +10007806: 1ad2 subs r2, r2, r3 +10007808: b292 uxth r2, r2 +1000780a: 4693 mov fp, r2 +1000780c: 0034 movs r4, r6 +1000780e: 429e cmp r6, r3 +10007810: d303 bcc.n 1000781a +10007812: 1ae4 subs r4, r4, r3 +10007814: b2a4 uxth r4, r4 +10007816: 429c cmp r4, r3 +10007818: d2fb bcs.n 10007812 +1000781a: 4642 mov r2, r8 +1000781c: 4362 muls r2, r4 +1000781e: 6828 ldr r0, [r5, #0] +10007820: 1b1b subs r3, r3, r4 +10007822: b29b uxth r3, r3 +10007824: 1880 adds r0, r0, r2 +10007826: 4642 mov r2, r8 +10007828: 454b cmp r3, r9 +1000782a: d354 bcc.n 100078d6 +1000782c: 464b mov r3, r9 +1000782e: 0039 movs r1, r7 +10007830: 435a muls r2, r3 +10007832: f7fd fc9f bl 10005174 <__wrap___aeabi_memcpy> +10007836: 88ab ldrh r3, [r5, #4] +10007838: 005b lsls r3, r3, #1 +1000783a: 45b2 cmp sl, r6 +1000783c: d301 bcc.n 10007842 +1000783e: 459a cmp sl, r3 +10007840: db03 blt.n 1000784a +10007842: 4652 mov r2, sl +10007844: 1ad3 subs r3, r2, r3 +10007846: b29b uxth r3, r3 +10007848: 469a mov sl, r3 +1000784a: 4653 mov r3, sl +1000784c: 812b strh r3, [r5, #8] +1000784e: 68e8 ldr r0, [r5, #12] +10007850: 2800 cmp r0, #0 +10007852: d025 beq.n 100078a0 +10007854: f000 f99c bl 10007b90 <__mutex_exit_veneer> +10007858: e022 b.n 100078a0 +1000785a: 88e9 ldrh r1, [r5, #6] +1000785c: 0449 lsls r1, r1, #17 +1000785e: 0c49 lsrs r1, r1, #17 +10007860: 4688 mov r8, r1 +10007862: 429c cmp r4, r3 +10007864: d227 bcs.n 100078b6 +10007866: 4296 cmp r6, r2 +10007868: d347 bcc.n 100078fa +1000786a: 1ab1 subs r1, r6, r2 +1000786c: b289 uxth r1, r1 +1000786e: 468c mov ip, r1 +10007870: 0058 lsls r0, r3, #1 +10007872: 1ae1 subs r1, r4, r3 +10007874: b289 uxth r1, r1 +10007876: 468b mov fp, r1 +10007878: 4661 mov r1, ip +1000787a: 1909 adds r1, r1, r4 +1000787c: 4281 cmp r1, r0 +1000787e: db08 blt.n 10007892 +10007880: 18d1 adds r1, r2, r3 +10007882: b289 uxth r1, r1 +10007884: 1b0e subs r6, r1, r4 +10007886: b2b6 uxth r6, r6 +10007888: 468a mov sl, r1 +1000788a: 42b2 cmp r2, r6 +1000788c: d93b bls.n 10007906 +1000788e: 1a36 subs r6, r6, r0 +10007890: b2b6 uxth r6, r6 +10007892: 19a2 adds r2, r4, r6 +10007894: b292 uxth r2, r2 +10007896: 4692 mov sl, r2 +10007898: 46a1 mov r9, r4 +1000789a: e7b7 b.n 1000780c +1000789c: 2300 movs r3, #0 +1000789e: 4699 mov r9, r3 +100078a0: 4648 mov r0, r9 +100078a2: b003 add sp, #12 +100078a4: bcf0 pop {r4, r5, r6, r7} +100078a6: 46bb mov fp, r7 +100078a8: 46b2 mov sl, r6 +100078aa: 46a9 mov r9, r5 +100078ac: 46a0 mov r8, r4 +100078ae: bdf0 pop {r4, r5, r6, r7, pc} +100078b0: 1ab2 subs r2, r6, r2 +100078b2: b292 uxth r2, r2 +100078b4: e792 b.n 100077dc +100078b6: 2100 movs r1, #0 +100078b8: 4689 mov r9, r1 +100078ba: 2b00 cmp r3, #0 +100078bc: d0c7 beq.n 1000784e +100078be: 4641 mov r1, r8 +100078c0: 1ae4 subs r4, r4, r3 +100078c2: 434c muls r4, r1 +100078c4: 0016 movs r6, r2 +100078c6: 18d1 adds r1, r2, r3 +100078c8: 2200 movs r2, #0 +100078ca: b289 uxth r1, r1 +100078cc: 468a mov sl, r1 +100078ce: 4699 mov r9, r3 +100078d0: 4693 mov fp, r2 +100078d2: 193f adds r7, r7, r4 +100078d4: e79a b.n 1000780c +100078d6: 4353 muls r3, r2 +100078d8: b29b uxth r3, r3 +100078da: 001a movs r2, r3 +100078dc: 0039 movs r1, r7 +100078de: 445c add r4, fp +100078e0: 9301 str r3, [sp, #4] +100078e2: f7fd fc47 bl 10005174 <__wrap___aeabi_memcpy> +100078e6: 4641 mov r1, r8 +100078e8: 0022 movs r2, r4 +100078ea: 434a muls r2, r1 +100078ec: 9b01 ldr r3, [sp, #4] +100078ee: 6828 ldr r0, [r5, #0] +100078f0: b292 uxth r2, r2 +100078f2: 18f9 adds r1, r7, r3 +100078f4: f7fd fc3e bl 10005174 <__wrap___aeabi_memcpy> +100078f8: e79d b.n 10007836 +100078fa: 0058 lsls r0, r3, #1 +100078fc: 1a81 subs r1, r0, r2 +100078fe: 1871 adds r1, r6, r1 +10007900: b289 uxth r1, r1 +10007902: 468c mov ip, r1 +10007904: e7b5 b.n 10007872 +10007906: 46a1 mov r9, r4 +10007908: 42b0 cmp r0, r6 +1000790a: dd00 ble.n 1000790e +1000790c: e77e b.n 1000780c +1000790e: e7be b.n 1000788e + +10007910 : +10007910: b510 push {r4, lr} +10007912: 0004 movs r4, r0 +10007914: 68c0 ldr r0, [r0, #12] +10007916: 2800 cmp r0, #0 +10007918: d003 beq.n 10007922 +1000791a: 2101 movs r1, #1 +1000791c: 4249 negs r1, r1 +1000791e: f000 f95f bl 10007be0 <__mutex_enter_timeout_ms_veneer> +10007922: 6920 ldr r0, [r4, #16] +10007924: 2800 cmp r0, #0 +10007926: d003 beq.n 10007930 +10007928: 2101 movs r1, #1 +1000792a: 4249 negs r1, r1 +1000792c: f000 f958 bl 10007be0 <__mutex_enter_timeout_ms_veneer> +10007930: 2300 movs r3, #0 +10007932: 68e0 ldr r0, [r4, #12] +10007934: 8163 strh r3, [r4, #10] +10007936: 8123 strh r3, [r4, #8] +10007938: 2800 cmp r0, #0 +1000793a: d001 beq.n 10007940 +1000793c: f000 f928 bl 10007b90 <__mutex_exit_veneer> +10007940: 6920 ldr r0, [r4, #16] +10007942: 2800 cmp r0, #0 +10007944: d001 beq.n 1000794a +10007946: f000 f923 bl 10007b90 <__mutex_exit_veneer> +1000794a: 2001 movs r0, #1 +1000794c: bd10 pop {r4, pc} +1000794e: 46c0 nop @ (mov r8, r8) + +10007950 : +10007950: b570 push {r4, r5, r6, lr} +10007952: 0004 movs r4, r0 +10007954: 68c0 ldr r0, [r0, #12] +10007956: 000d movs r5, r1 +10007958: 2800 cmp r0, #0 +1000795a: d003 beq.n 10007964 +1000795c: 2101 movs r1, #1 +1000795e: 4249 negs r1, r1 +10007960: f000 f93e bl 10007be0 <__mutex_enter_timeout_ms_veneer> +10007964: 6920 ldr r0, [r4, #16] +10007966: 2800 cmp r0, #0 +10007968: d003 beq.n 10007972 +1000796a: 2101 movs r1, #1 +1000796c: 4249 negs r1, r1 +1000796e: f000 f937 bl 10007be0 <__mutex_enter_timeout_ms_veneer> +10007972: 217f movs r1, #127 @ 0x7f +10007974: 79e3 ldrb r3, [r4, #7] +10007976: 01ed lsls r5, r5, #7 +10007978: 4019 ands r1, r3 +1000797a: 68e0 ldr r0, [r4, #12] +1000797c: 4329 orrs r1, r5 +1000797e: 71e1 strb r1, [r4, #7] +10007980: 2800 cmp r0, #0 +10007982: d001 beq.n 10007988 +10007984: f000 f904 bl 10007b90 <__mutex_exit_veneer> +10007988: 6920 ldr r0, [r4, #16] +1000798a: 2800 cmp r0, #0 +1000798c: d001 beq.n 10007992 +1000798e: f000 f8ff bl 10007b90 <__mutex_exit_veneer> +10007992: 2001 movs r0, #1 +10007994: bd70 pop {r4, r5, r6, pc} +10007996: 46c0 nop @ (mov r8, r8) + +10007998 : +10007998: b5f0 push {r4, r5, r6, r7, lr} +1000799a: 464e mov r6, r9 +1000799c: 4681 mov r9, r0 +1000799e: 4a4d ldr r2, [pc, #308] @ (10007ad4 ) +100079a0: 4645 mov r5, r8 +100079a2: 444a add r2, r9 +100079a4: 1e53 subs r3, r2, #1 +100079a6: 419a sbcs r2, r3 +100079a8: 2380 movs r3, #128 @ 0x80 +100079aa: 46de mov lr, fp +100079ac: 4657 mov r7, sl +100079ae: 025b lsls r3, r3, #9 +100079b0: 469c mov ip, r3 +100079b2: b5e0 push {r5, r6, r7, lr} +100079b4: 4b48 ldr r3, [pc, #288] @ (10007ad8 ) +100079b6: 0412 lsls r2, r2, #16 +100079b8: 4462 add r2, ip +100079ba: 601a str r2, [r3, #0] +100079bc: 4b47 ldr r3, [pc, #284] @ (10007adc ) +100079be: 000d movs r5, r1 +100079c0: 4947 ldr r1, [pc, #284] @ (10007ae0 ) +100079c2: b083 sub sp, #12 +100079c4: 601a str r2, [r3, #0] +100079c6: 0010 movs r0, r2 +100079c8: 688b ldr r3, [r1, #8] +100079ca: 4398 bics r0, r3 +100079cc: d1fb bne.n 100079c6 +100079ce: 2006 movs r0, #6 +100079d0: f7fa ffda bl 10002988 +100079d4: 464b mov r3, r9 +100079d6: 685a ldr r2, [r3, #4] +100079d8: 2302 movs r3, #2 +100079da: 401a ands r2, r3 +100079dc: 9201 str r2, [sp, #4] +100079de: 2204 movs r2, #4 +100079e0: 444a add r2, r9 +100079e2: 4693 mov fp, r2 +100079e4: 22c0 movs r2, #192 @ 0xc0 +100079e6: 4659 mov r1, fp +100079e8: 0192 lsls r2, r2, #6 +100079ea: 4311 orrs r1, r2 +100079ec: 600b str r3, [r1, #0] +100079ee: 468a mov sl, r1 +100079f0: 2180 movs r1, #128 @ 0x80 +100079f2: 4680 mov r8, r0 +100079f4: 0049 lsls r1, r1, #1 +100079f6: 468c mov ip, r1 +100079f8: 4641 mov r1, r8 +100079fa: 2002 movs r0, #2 +100079fc: 46a8 mov r8, r5 +100079fe: 0def lsrs r7, r5, #23 +10007a00: 026e lsls r6, r5, #9 +10007a02: 0dab lsrs r3, r5, #22 +10007a04: 02aa lsls r2, r5, #10 +10007a06: 9100 str r1, [sp, #0] +10007a08: e004 b.n 10007a14 +10007a0a: 9c00 ldr r4, [sp, #0] +10007a0c: 42a5 cmp r5, r4 +10007a0e: d85e bhi.n 10007ace +10007a10: 4560 cmp r0, ip +10007a12: d053 beq.n 10007abc +10007a14: 0001 movs r1, r0 +10007a16: 0015 movs r5, r2 +10007a18: 001c movs r4, r3 +10007a1a: 3002 adds r0, #2 +10007a1c: 1992 adds r2, r2, r6 +10007a1e: 417b adcs r3, r7 +10007a20: 2c00 cmp r4, #0 +10007a22: d0f2 beq.n 10007a0a +10007a24: 9b00 ldr r3, [sp, #0] +10007a26: 4645 mov r5, r8 +10007a28: 4698 mov r8, r3 +10007a2a: 465b mov r3, fp +10007a2c: 2480 movs r4, #128 @ 0x80 +10007a2e: 46ab mov fp, r5 +10007a30: 000d movs r5, r1 +10007a32: 020e lsls r6, r1, #8 +10007a34: 1a76 subs r6, r6, r1 +10007a36: 0064 lsls r4, r4, #1 +10007a38: 9300 str r3, [sp, #0] +10007a3a: 0027 movs r7, r4 +10007a3c: 3c01 subs r4, #1 +10007a3e: 2c00 cmp r4, #0 +10007a40: d040 beq.n 10007ac4 +10007a42: 0031 movs r1, r6 +10007a44: 4640 mov r0, r8 +10007a46: f7fc fd0d bl 10004464 <__wrap___aeabi_uidiv> +10007a4a: 1b76 subs r6, r6, r5 +10007a4c: 4583 cmp fp, r0 +10007a4e: d2f4 bcs.n 10007a3a +10007a50: 9b00 ldr r3, [sp, #0] +10007a52: 0029 movs r1, r5 +10007a54: 469b mov fp, r3 +10007a56: 436f muls r7, r5 +10007a58: 0224 lsls r4, r4, #8 +10007a5a: 464b mov r3, r9 +10007a5c: 6119 str r1, [r3, #16] +10007a5e: 681b ldr r3, [r3, #0] +10007a60: 464a mov r2, r9 +10007a62: 405c eors r4, r3 +10007a64: 23ff movs r3, #255 @ 0xff +10007a66: 021b lsls r3, r3, #8 +10007a68: 401c ands r4, r3 +10007a6a: 2380 movs r3, #128 @ 0x80 +10007a6c: 015b lsls r3, r3, #5 +10007a6e: 4313 orrs r3, r2 +10007a70: 2280 movs r2, #128 @ 0x80 +10007a72: 4659 mov r1, fp +10007a74: 9801 ldr r0, [sp, #4] +10007a76: 0192 lsls r2, r2, #6 +10007a78: 4311 orrs r1, r2 +10007a7a: 601c str r4, [r3, #0] +10007a7c: 6008 str r0, [r1, #0] +10007a7e: 4648 mov r0, r9 +10007a80: 4655 mov r5, sl +10007a82: 6844 ldr r4, [r0, #4] +10007a84: 2002 movs r0, #2 +10007a86: 6028 str r0, [r5, #0] +10007a88: 464d mov r5, r9 +10007a8a: 682e ldr r6, [r5, #0] +10007a8c: 2507 movs r5, #7 +10007a8e: 406e eors r6, r5 +10007a90: 35c8 adds r5, #200 @ 0xc8 +10007a92: 4035 ands r5, r6 +10007a94: 601d str r5, [r3, #0] +10007a96: 464b mov r3, r9 +10007a98: 3324 adds r3, #36 @ 0x24 +10007a9a: 431a orrs r2, r3 +10007a9c: 2303 movs r3, #3 +10007a9e: 4004 ands r4, r0 +10007aa0: 600c str r4, [r1, #0] +10007aa2: 6013 str r3, [r2, #0] +10007aa4: 6008 str r0, [r1, #0] +10007aa6: 0039 movs r1, r7 +10007aa8: 4640 mov r0, r8 +10007aaa: f7fc fcdb bl 10004464 <__wrap___aeabi_uidiv> +10007aae: b003 add sp, #12 +10007ab0: bcf0 pop {r4, r5, r6, r7} +10007ab2: 46bb mov fp, r7 +10007ab4: 46b2 mov sl, r6 +10007ab6: 46a9 mov r9, r5 +10007ab8: 46a0 mov r8, r4 +10007aba: bdf0 pop {r4, r5, r6, r7, pc} +10007abc: 4645 mov r5, r8 +10007abe: 0001 movs r1, r0 +10007ac0: 46a0 mov r8, r4 +10007ac2: e7b2 b.n 10007a2a +10007ac4: 9b00 ldr r3, [sp, #0] +10007ac6: 0029 movs r1, r5 +10007ac8: 469b mov fp, r3 +10007aca: 002f movs r7, r5 +10007acc: e7c5 b.n 10007a5a +10007ace: 4645 mov r5, r8 +10007ad0: 46a0 mov r8, r4 +10007ad2: e7aa b.n 10007a2a +10007ad4: bffc4000 .word 0xbffc4000 +10007ad8: 4000e000 .word 0x4000e000 +10007adc: 4000f000 .word 0x4000f000 +10007ae0: 4000c000 .word 0x4000c000 + +10007ae4 : +10007ae4: 23c0 movs r3, #192 @ 0xc0 +10007ae6: 2102 movs r1, #2 +10007ae8: 1d02 adds r2, r0, #4 +10007aea: 019b lsls r3, r3, #6 +10007aec: 431a orrs r2, r3 +10007aee: 6011 str r1, [r2, #0] +10007af0: 0002 movs r2, r0 +10007af2: 3224 adds r2, #36 @ 0x24 +10007af4: 4313 orrs r3, r2 +10007af6: 2203 movs r2, #3 +10007af8: 601a str r2, [r3, #0] +10007afa: 4b06 ldr r3, [pc, #24] @ (10007b14 ) +10007afc: 469c mov ip, r3 +10007afe: 4460 add r0, ip +10007b00: 1e43 subs r3, r0, #1 +10007b02: 4198 sbcs r0, r3 +10007b04: 2380 movs r3, #128 @ 0x80 +10007b06: 025b lsls r3, r3, #9 +10007b08: 469c mov ip, r3 +10007b0a: 0400 lsls r0, r0, #16 +10007b0c: 4b02 ldr r3, [pc, #8] @ (10007b18 ) +10007b0e: 4460 add r0, ip +10007b10: 6018 str r0, [r3, #0] +10007b12: 4770 bx lr +10007b14: bffc4000 .word 0xbffc4000 +10007b18: 4000e000 .word 0x4000e000 + +10007b1c : +10007b1c: b510 push {r4, lr} +10007b1e: 0783 lsls r3, r0, #30 +10007b20: d00a beq.n 10007b38 +10007b22: 0003 movs r3, r0 +10007b24: 2103 movs r1, #3 +10007b26: e002 b.n 10007b2e +10007b28: 3301 adds r3, #1 +10007b2a: 420b tst r3, r1 +10007b2c: d005 beq.n 10007b3a +10007b2e: 781a ldrb r2, [r3, #0] +10007b30: 2a00 cmp r2, #0 +10007b32: d1f9 bne.n 10007b28 +10007b34: 1a18 subs r0, r3, r0 +10007b36: bd10 pop {r4, pc} +10007b38: 0003 movs r3, r0 +10007b3a: 6819 ldr r1, [r3, #0] +10007b3c: 4a0c ldr r2, [pc, #48] @ (10007b70 ) +10007b3e: 4c0d ldr r4, [pc, #52] @ (10007b74 ) +10007b40: 188a adds r2, r1, r2 +10007b42: 438a bics r2, r1 +10007b44: 4222 tst r2, r4 +10007b46: d10f bne.n 10007b68 +10007b48: 6859 ldr r1, [r3, #4] +10007b4a: 4a09 ldr r2, [pc, #36] @ (10007b70 ) +10007b4c: 3304 adds r3, #4 +10007b4e: 188a adds r2, r1, r2 +10007b50: 438a bics r2, r1 +10007b52: 4222 tst r2, r4 +10007b54: d108 bne.n 10007b68 +10007b56: 6859 ldr r1, [r3, #4] +10007b58: 4a05 ldr r2, [pc, #20] @ (10007b70 ) +10007b5a: 3304 adds r3, #4 +10007b5c: 188a adds r2, r1, r2 +10007b5e: 438a bics r2, r1 +10007b60: 4222 tst r2, r4 +10007b62: d0f1 beq.n 10007b48 +10007b64: e000 b.n 10007b68 +10007b66: 3301 adds r3, #1 +10007b68: 781a ldrb r2, [r3, #0] +10007b6a: 2a00 cmp r2, #0 +10007b6c: d1fb bne.n 10007b66 +10007b6e: e7e1 b.n 10007b34 +10007b70: fefefeff .word 0xfefefeff +10007b74: 80808080 .word 0x80808080 + +10007b78 <_fini>: +10007b78: b5f8 push {r3, r4, r5, r6, r7, lr} +10007b7a: 46c0 nop @ (mov r8, r8) +10007b7c: 0000 movs r0, r0 ... -10006d58 <__flash_do_cmd_veneer>: -10006d58: b401 push {r0} -10006d5a: 4802 ldr r0, [pc, #8] @ (10006d64 <__flash_do_cmd_veneer+0xc>) -10006d5c: 4684 mov ip, r0 -10006d5e: bc01 pop {r0} -10006d60: 4760 bx ip -10006d62: bf00 nop -10006d64: 200002c9 .word 0x200002c9 - -10006d68 <__mutex_exit_veneer>: -10006d68: b401 push {r0} -10006d6a: 4802 ldr r0, [pc, #8] @ (10006d74 <__mutex_exit_veneer+0xc>) -10006d6c: 4684 mov ip, r0 -10006d6e: bc01 pop {r0} -10006d70: 4760 bx ip -10006d72: bf00 nop -10006d74: 2000022d .word 0x2000022d - -10006d78 <____aeabi_ldiv0_veneer>: -10006d78: b401 push {r0} -10006d7a: 4802 ldr r0, [pc, #8] @ (10006d84 <____aeabi_ldiv0_veneer+0xc>) -10006d7c: 4684 mov ip, r0 -10006d7e: bc01 pop {r0} -10006d80: 4760 bx ip -10006d82: bf00 nop -10006d84: 20000d75 .word 0x20000d75 - -10006d88 <__e15_is_critical_frame_period_veneer>: -10006d88: b401 push {r0} -10006d8a: 4802 ldr r0, [pc, #8] @ (10006d94 <__e15_is_critical_frame_period_veneer+0xc>) -10006d8c: 4684 mov ip, r0 -10006d8e: bc01 pop {r0} -10006d90: 4760 bx ip -10006d92: bf00 nop -10006d94: 200009d9 .word 0x200009d9 - -10006d98 <____aeabi_idiv0_veneer>: -10006d98: b401 push {r0} -10006d9a: 4802 ldr r0, [pc, #8] @ (10006da4 <____aeabi_idiv0_veneer+0xc>) -10006d9c: 4684 mov ip, r0 -10006d9e: bc01 pop {r0} -10006da0: 4760 bx ip -10006da2: bf00 nop -10006da4: 20000d75 .word 0x20000d75 - -10006da8 <__mutex_try_enter_veneer>: -10006da8: b401 push {r0} -10006daa: 4802 ldr r0, [pc, #8] @ (10006db4 <__mutex_try_enter_veneer+0xc>) -10006dac: 4684 mov ip, r0 -10006dae: bc01 pop {r0} -10006db0: 4760 bx ip -10006db2: bf00 nop -10006db4: 200000c1 .word 0x200000c1 - -10006db8 <__e15_is_bulkin_ep_veneer>: -10006db8: b401 push {r0} -10006dba: 4802 ldr r0, [pc, #8] @ (10006dc4 <__e15_is_bulkin_ep_veneer+0xc>) -10006dbc: 4684 mov ip, r0 -10006dbe: bc01 pop {r0} -10006dc0: 4760 bx ip -10006dc2: bf00 nop -10006dc4: 200009b1 .word 0x200009b1 - -10006dc8 <__mutex_enter_timeout_ms_veneer>: -10006dc8: b401 push {r0} -10006dca: 4802 ldr r0, [pc, #8] @ (10006dd4 <__mutex_enter_timeout_ms_veneer+0xc>) -10006dcc: 4684 mov ip, r0 -10006dce: bc01 pop {r0} -10006dd0: 4760 bx ip -10006dd2: bf00 nop -10006dd4: 2000019d .word 0x2000019d - -10006dd8 <__mutex_try_enter_block_until_veneer>: -10006dd8: b401 push {r0} -10006dda: 4802 ldr r0, [pc, #8] @ (10006de4 <__mutex_try_enter_block_until_veneer+0xc>) -10006ddc: 4684 mov ip, r0 -10006dde: bc01 pop {r0} -10006de0: 4760 bx ip -10006de2: bf00 nop -10006de4: 20000101 .word 0x20000101 - -10006de8 <__hw_endpoint_start_next_buffer_veneer>: -10006de8: b401 push {r0} -10006dea: 4802 ldr r0, [pc, #8] @ (10006df4 <__hw_endpoint_start_next_buffer_veneer+0xc>) -10006dec: 4684 mov ip, r0 -10006dee: bc01 pop {r0} -10006df0: 4760 bx ip -10006df2: bf00 nop -10006df4: 20000b4d .word 0x20000b4d - -10006df8 <__reset_non_control_endpoints_veneer>: -10006df8: b401 push {r0} -10006dfa: 4802 ldr r0, [pc, #8] @ (10006e04 <__reset_non_control_endpoints_veneer+0xc>) -10006dfc: 4684 mov ip, r0 -10006dfe: bc01 pop {r0} -10006e00: 4760 bx ip -10006e02: bf00 nop -10006e04: 20000389 .word 0x20000389 - -10006e08 <___hw_endpoint_buffer_control_update32_veneer>: -10006e08: b401 push {r0} -10006e0a: 4802 ldr r0, [pc, #8] @ (10006e14 <___hw_endpoint_buffer_control_update32_veneer+0xc>) -10006e0c: 4684 mov ip, r0 -10006e0e: bc01 pop {r0} -10006e10: 4760 bx ip -10006e12: bf00 nop -10006e14: 20000af5 .word 0x20000af5 +10007b80 <__flash_do_cmd_veneer>: +10007b80: b401 push {r0} +10007b82: 4802 ldr r0, [pc, #8] @ (10007b8c <__flash_do_cmd_veneer+0xc>) +10007b84: 4684 mov ip, r0 +10007b86: bc01 pop {r0} +10007b88: 4760 bx ip +10007b8a: bf00 nop +10007b8c: 200002c9 .word 0x200002c9 + +10007b90 <__mutex_exit_veneer>: +10007b90: b401 push {r0} +10007b92: 4802 ldr r0, [pc, #8] @ (10007b9c <__mutex_exit_veneer+0xc>) +10007b94: 4684 mov ip, r0 +10007b96: bc01 pop {r0} +10007b98: 4760 bx ip +10007b9a: bf00 nop +10007b9c: 2000022d .word 0x2000022d + +10007ba0 <____aeabi_ldiv0_veneer>: +10007ba0: b401 push {r0} +10007ba2: 4802 ldr r0, [pc, #8] @ (10007bac <____aeabi_ldiv0_veneer+0xc>) +10007ba4: 4684 mov ip, r0 +10007ba6: bc01 pop {r0} +10007ba8: 4760 bx ip +10007baa: bf00 nop +10007bac: 20000e35 .word 0x20000e35 + +10007bb0 <____aeabi_idiv0_veneer>: +10007bb0: b401 push {r0} +10007bb2: 4802 ldr r0, [pc, #8] @ (10007bbc <____aeabi_idiv0_veneer+0xc>) +10007bb4: 4684 mov ip, r0 +10007bb6: bc01 pop {r0} +10007bb8: 4760 bx ip +10007bba: bf00 nop +10007bbc: 20000e35 .word 0x20000e35 + +10007bc0 <__mutex_try_enter_veneer>: +10007bc0: b401 push {r0} +10007bc2: 4802 ldr r0, [pc, #8] @ (10007bcc <__mutex_try_enter_veneer+0xc>) +10007bc4: 4684 mov ip, r0 +10007bc6: bc01 pop {r0} +10007bc8: 4760 bx ip +10007bca: bf00 nop +10007bcc: 200000c1 .word 0x200000c1 + +10007bd0 <__e15_is_bulkin_ep_veneer>: +10007bd0: b401 push {r0} +10007bd2: 4802 ldr r0, [pc, #8] @ (10007bdc <__e15_is_bulkin_ep_veneer+0xc>) +10007bd4: 4684 mov ip, r0 +10007bd6: bc01 pop {r0} +10007bd8: 4760 bx ip +10007bda: bf00 nop +10007bdc: 200009b1 .word 0x200009b1 + +10007be0 <__mutex_enter_timeout_ms_veneer>: +10007be0: b401 push {r0} +10007be2: 4802 ldr r0, [pc, #8] @ (10007bec <__mutex_enter_timeout_ms_veneer+0xc>) +10007be4: 4684 mov ip, r0 +10007be6: bc01 pop {r0} +10007be8: 4760 bx ip +10007bea: bf00 nop +10007bec: 2000019d .word 0x2000019d + +10007bf0 <__spi_write_blocking_veneer>: +10007bf0: b401 push {r0} +10007bf2: 4802 ldr r0, [pc, #8] @ (10007bfc <__spi_write_blocking_veneer+0xc>) +10007bf4: 4684 mov ip, r0 +10007bf6: bc01 pop {r0} +10007bf8: 4760 bx ip +10007bfa: bf00 nop +10007bfc: 20000de9 .word 0x20000de9 + +10007c00 <__spi_write_read_blocking_veneer>: +10007c00: b401 push {r0} +10007c02: 4802 ldr r0, [pc, #8] @ (10007c0c <__spi_write_read_blocking_veneer+0xc>) +10007c04: 4684 mov ip, r0 +10007c06: bc01 pop {r0} +10007c08: 4760 bx ip +10007c0a: bf00 nop +10007c0c: 20000d75 .word 0x20000d75 + +10007c10 <__mutex_try_enter_block_until_veneer>: +10007c10: b401 push {r0} +10007c12: 4802 ldr r0, [pc, #8] @ (10007c1c <__mutex_try_enter_block_until_veneer+0xc>) +10007c14: 4684 mov ip, r0 +10007c16: bc01 pop {r0} +10007c18: 4760 bx ip +10007c1a: bf00 nop +10007c1c: 20000101 .word 0x20000101 + +10007c20 <__hw_endpoint_start_next_buffer_veneer>: +10007c20: b401 push {r0} +10007c22: 4802 ldr r0, [pc, #8] @ (10007c2c <__hw_endpoint_start_next_buffer_veneer+0xc>) +10007c24: 4684 mov ip, r0 +10007c26: bc01 pop {r0} +10007c28: 4760 bx ip +10007c2a: bf00 nop +10007c2c: 20000b4d .word 0x20000b4d + +10007c30 <__reset_non_control_endpoints_veneer>: +10007c30: b401 push {r0} +10007c32: 4802 ldr r0, [pc, #8] @ (10007c3c <__reset_non_control_endpoints_veneer+0xc>) +10007c34: 4684 mov ip, r0 +10007c36: bc01 pop {r0} +10007c38: 4760 bx ip +10007c3a: bf00 nop +10007c3c: 20000389 .word 0x20000389 + +10007c40 <___hw_endpoint_buffer_control_update32_veneer>: +10007c40: b401 push {r0} +10007c42: 4802 ldr r0, [pc, #8] @ (10007c4c <___hw_endpoint_buffer_control_update32_veneer+0xc>) +10007c44: 4684 mov ip, r0 +10007c46: bc01 pop {r0} +10007c48: 4760 bx ip +10007c4a: bf00 nop +10007c4c: 20000af5 .word 0x20000af5 + +10007c50 <__e15_is_critical_frame_period_veneer>: +10007c50: b401 push {r0} +10007c52: 4802 ldr r0, [pc, #8] @ (10007c5c <__e15_is_critical_frame_period_veneer+0xc>) +10007c54: 4684 mov ip, r0 +10007c56: bc01 pop {r0} +10007c58: 4760 bx ip +10007c5a: bf00 nop +10007c5c: 200009d9 .word 0x200009d9 Disassembly of section .data: @@ -13593,7 +15302,7 @@ Disassembly of section .data: 20000156: f381 8810 msr PRIMASK, r1 2000015a: 0028 movs r0, r5 2000015c: 0031 movs r1, r6 -2000015e: f000 fe13 bl 20000d88 <__best_effort_wfe_or_timeout_veneer> +2000015e: f000 fe73 bl 20000e48 <__best_effort_wfe_or_timeout_veneer> 20000162: 2800 cmp r0, #0 20000164: d1ed bne.n 20000142 20000166: 6822 ldr r2, [r4, #0] @@ -13626,7 +15335,7 @@ Disassembly of section .data: 200001a0: b500 push {lr} 200001a2: 000d movs r5, r1 200001a4: 0004 movs r4, r0 -200001a6: f000 fe17 bl 20000dd8 <__time_us_64_veneer> +200001a6: f000 fe5f bl 20000e68 <__time_us_64_veneer> 200001aa: 22fa movs r2, #250 @ 0xfa 200001ac: 0006 movs r6, r0 200001ae: 000f movs r7, r1 @@ -13634,7 +15343,7 @@ Disassembly of section .data: 200001b2: 0028 movs r0, r5 200001b4: 2100 movs r1, #0 200001b6: 0092 lsls r2, r2, #2 -200001b8: f000 fdfe bl 20000db8 <____wrap___aeabi_lmul_veneer> +200001b8: f000 fe6e bl 20000e98 <____wrap___aeabi_lmul_veneer> 200001bc: 2380 movs r3, #128 @ 0x80 200001be: 1836 adds r6, r6, r0 200001c0: 414f adcs r7, r1 @@ -13656,7 +15365,7 @@ Disassembly of section .data: 200001e2: f381 8810 msr PRIMASK, r1 200001e6: 0030 movs r0, r6 200001e8: 0039 movs r1, r7 -200001ea: f000 fdcd bl 20000d88 <__best_effort_wfe_or_timeout_veneer> +200001ea: f000 fe2d bl 20000e48 <__best_effort_wfe_or_timeout_veneer> 200001ee: 2800 cmp r0, #0 200001f0: d118 bne.n 20000224 200001f2: 6822 ldr r2, [r4, #0] @@ -13721,8 +15430,8 @@ Disassembly of section .data: 20000272: 7023 strb r3, [r4, #0] 20000274: bd10 pop {r4, pc} 20000276: 46c0 nop @ (mov r8, r8) -20000278: 20001c83 .word 0x20001c83 -2000027c: 1000167c .word 0x1000167c +20000278: 20001d63 .word 0x20001d63 +2000027c: 10001744 .word 0x10001744 20000280: 10000100 .word 0x10000100 20000284 : @@ -13730,7 +15439,7 @@ Disassembly of section .data: 20000286: 4b01 ldr r3, [pc, #4] @ (2000028c ) 20000288: 4798 blx r3 2000028a: bd10 pop {r4, pc} -2000028c: 2000167d .word 0x2000167d +2000028c: 20001745 .word 0x20001745 20000290 : 20000290: 4b03 ldr r3, [pc, #12] @ (200002a0 ) @@ -13889,15 +15598,15 @@ Disassembly of section .data: 200003cc: 0092 lsls r2, r2, #2 200003ce: 2100 movs r1, #0 200003d0: 4804 ldr r0, [pc, #16] @ (200003e4 ) -200003d2: f000 fcf9 bl 20000dc8 <____wrap_memset_veneer> +200003d2: f000 fd51 bl 20000e78 <____wrap_memset_veneer> 200003d6: 4b04 ldr r3, [pc, #16] @ (200003e8 ) 200003d8: 4a04 ldr r2, [pc, #16] @ (200003ec ) 200003da: 601a str r2, [r3, #0] 200003dc: bd10 pop {r4, pc} 200003de: 46c0 nop @ (mov r8, r8) 200003e0: 50100000 .word 0x50100000 -200003e4: 20001844 .word 0x20001844 -200003e8: 20001c0c .word 0x20001c0c +200003e4: 2000190c .word 0x2000190c +200003e8: 20001cec .word 0x20001cec 200003ec: 50100180 .word 0x50100180 200003f0 : @@ -13964,7 +15673,7 @@ Disassembly of section .data: 2000046a: 2206 movs r2, #6 2000046c: 3006 adds r0, #6 2000046e: 9300 str r3, [sp, #0] -20000470: f000 fcaa bl 20000dc8 <____wrap_memset_veneer> +20000470: f000 fd02 bl 20000e78 <____wrap_memset_veneer> 20000474: 23e0 movs r3, #224 @ 0xe0 20000476: a902 add r1, sp, #8 20000478: 00db lsls r3, r3, #3 @@ -13981,7 +15690,7 @@ Disassembly of section .data: 20000492: e7db b.n 2000044c 20000494: 50110000 .word 0x50110000 20000498: 50113000 .word 0x50113000 -2000049c: 20001804 .word 0x20001804 +2000049c: 200018cc .word 0x200018cc 200004a0 : 200004a0: 2398 movs r3, #152 @ 0x98 @@ -14103,7 +15812,7 @@ Disassembly of section .data: 20000588: 466b mov r3, sp 2000058a: 2100 movs r1, #0 2000058c: 1d98 adds r0, r3, #6 -2000058e: f000 fc1b bl 20000dc8 <____wrap_memset_veneer> +2000058e: f000 fc73 bl 20000e78 <____wrap_memset_veneer> 20000592: 23c0 movs r3, #192 @ 0xc0 20000594: 0564 lsls r4, r4, #21 20000596: ae01 add r6, sp, #4 @@ -14165,7 +15874,7 @@ Disassembly of section .data: 2000060a: 220a movs r2, #10 2000060c: 2100 movs r1, #0 2000060e: 1d98 adds r0, r3, #6 -20000610: f000 fbda bl 20000dc8 <____wrap_memset_veneer> +20000610: f000 fc32 bl 20000e78 <____wrap_memset_veneer> 20000614: 23a0 movs r3, #160 @ 0xa0 20000616: ae01 add r6, sp, #4 20000618: 00db lsls r3, r3, #3 @@ -14183,7 +15892,7 @@ Disassembly of section .data: 20000632: 220a movs r2, #10 20000634: 2100 movs r1, #0 20000636: 1d98 adds r0, r3, #6 -20000638: f000 fbc6 bl 20000dc8 <____wrap_memset_veneer> +20000638: f000 fc1e bl 20000e78 <____wrap_memset_veneer> 2000063c: 2380 movs r3, #128 @ 0x80 2000063e: ae01 add r6, sp, #4 20000640: 00db lsls r3, r3, #3 @@ -14205,7 +15914,7 @@ Disassembly of section .data: 20000664: 220a movs r2, #10 20000666: 2100 movs r1, #0 20000668: 1d98 adds r0, r3, #6 -2000066a: f000 fbad bl 20000dc8 <____wrap_memset_veneer> +2000066a: f000 fc05 bl 20000e78 <____wrap_memset_veneer> 2000066e: 2380 movs r3, #128 @ 0x80 20000670: 005b lsls r3, r3, #1 20000672: 8033 strh r3, [r6, #0] @@ -14376,8 +16085,8 @@ Disassembly of section .data: 200007c2: e699 b.n 200004f8 200007c4: 50110000 .word 0x50110000 200007c8: 40054000 .word 0x40054000 -200007cc: 20001804 .word 0x20001804 -200007d0: 200017fc .word 0x200017fc +200007cc: 200018cc .word 0x200018cc +200007d0: 200018c4 .word 0x200018c4 200007d4: 0000023b .word 0x0000023b 200007d8: 0000027b .word 0x0000027b 200007dc: 000002bb .word 0x000002bb @@ -14386,7 +16095,7 @@ Disassembly of section .data: 200007e8: 0000037b .word 0x0000037b 200007ec: 000003bb .word 0x000003bb 200007f0: 000003fb .word 0x000003fb -200007f4: 20001c82 .word 0x20001c82 +200007f4: 20001d62 .word 0x20001d62 200007f8: 50113000 .word 0x50113000 200007fc: 00020010 .word 0x00020010 20000800: 50100000 .word 0x50100000 @@ -14571,12 +16280,12 @@ Disassembly of section .data: 20000994: 0021 movs r1, r4 20000996: 4805 ldr r0, [pc, #20] @ (200009ac ) 20000998: 4069 eors r1, r5 -2000099a: f000 f9fd bl 20000d98 <__panic_veneer> +2000099a: f000 fa75 bl 20000e88 <__panic_veneer> 2000099e: 46c0 nop @ (mov r8, r8) 200009a0: 000003ba .word 0x000003ba 200009a4: 000003fb .word 0x000003fb 200009a8: 000003fa .word 0x000003fa -200009ac: 10006f7c .word 0x10006f7c +200009ac: 10007dd4 .word 0x10007dd4 200009b0 : 200009b0: 4a08 ldr r2, [pc, #32] @ (200009d4 ) @@ -14621,7 +16330,7 @@ Disassembly of section .data: 200009fe: 46c0 nop @ (mov r8, r8) 20000a00: fffffce0 .word 0xfffffce0 20000a04: 40054000 .word 0x40054000 -20000a08: 200017fc .word 0x200017fc +20000a08: 200018c4 .word 0x200018c4 20000a0c : 20000a0c: b5f8 push {r3, r4, r5, r6, r7, lr} @@ -14667,7 +16376,7 @@ Disassembly of section .data: 20000a5c: 18c0 adds r0, r0, r3 20000a5e: 0032 movs r2, r6 20000a60: 6921 ldr r1, [r4, #16] -20000a62: f000 f9a1 bl 20000da8 <____wrap_memcpy_veneer> +20000a62: f000 f9f9 bl 20000e58 <____wrap_memcpy_veneer> 20000a66: 6923 ldr r3, [r4, #16] 20000a68: 199b adds r3, r3, r6 20000a6a: 6123 str r3, [r4, #16] @@ -14706,7 +16415,7 @@ Disassembly of section .data: 20000aa8: 1859 adds r1, r3, r1 20000aaa: 002a movs r2, r5 20000aac: 6920 ldr r0, [r4, #16] -20000aae: f000 f97b bl 20000da8 <____wrap_memcpy_veneer> +20000aae: f000 f9d3 bl 20000e58 <____wrap_memcpy_veneer> 20000ab2: 8ae3 ldrh r3, [r4, #22] 20000ab4: 18eb adds r3, r5, r3 20000ab6: 82e3 strh r3, [r4, #22] @@ -14780,10 +16489,10 @@ Disassembly of section .data: 20000b36: 4001 ands r1, r0 20000b38: 58d2 ldr r2, [r2, r3] 20000b3a: 4803 ldr r0, [pc, #12] @ (20000b48 <_hw_endpoint_buffer_control_update32+0x54>) -20000b3c: f000 f92c bl 20000d98 <__panic_veneer> +20000b3c: f000 f9a4 bl 20000e88 <__panic_veneer> 20000b40: fffffbff .word 0xfffffbff -20000b44: 20000eb0 .word 0x20000eb0 -20000b48: 10006f90 .word 0x10006f90 +20000b44: 20000f70 .word 0x20000f70 +20000b48: 10007de8 .word 0x10007de8 20000b4c : 20000b4c: 6843 ldr r3, [r0, #4] @@ -14867,9 +16576,9 @@ Disassembly of section .data: 20000bf6: 4001 ands r1, r0 20000bf8: 58d2 ldr r2, [r2, r3] 20000bfa: 4802 ldr r0, [pc, #8] @ (20000c04 ) -20000bfc: f000 f8cc bl 20000d98 <__panic_veneer> -20000c00: 20000eb0 .word 0x20000eb0 -20000c04: 10006fb0 .word 0x10006fb0 +20000bfc: f000 f944 bl 20000e88 <__panic_veneer> +20000c00: 20000f70 .word 0x20000f70 +20000c04: 10007e08 .word 0x10007e08 20000c08 : 20000c08: b5f0 push {r4, r5, r6, r7, lr} @@ -14933,7 +16642,7 @@ Disassembly of section .data: 20000c7c: 220a movs r2, #10 20000c7e: 2100 movs r1, #0 20000c80: 1d98 adds r0, r3, #6 -20000c82: f000 f8a1 bl 20000dc8 <____wrap_memset_veneer> +20000c82: f000 f8f9 bl 20000e78 <____wrap_memset_veneer> 20000c86: 466a mov r2, sp 20000c88: 782b ldrb r3, [r5, #0] 20000c8a: 7113 strb r3, [r2, #4] @@ -14982,7 +16691,7 @@ Disassembly of section .data: 20000cea: 61a1 str r1, [r4, #24] 20000cec: 0029 movs r1, r5 20000cee: 0020 movs r0, r4 -20000cf0: f000 f842 bl 20000d78 <__tu_fifo_write_veneer> +20000cf0: f000 f8a2 bl 20000e38 <__tu_fifo_write_veneer> 20000cf4: 6962 ldr r2, [r4, #20] 20000cf6: 69a3 ldr r3, [r4, #24] 20000cf8: f3bf 8f5f dmb sy @@ -15033,154 +16742,254 @@ Disassembly of section .data: 20000d5a: 2b00 cmp r3, #0 20000d5c: d1c3 bne.n 20000ce6 20000d5e: e7fb b.n 20000d58 -20000d60: 20001c81 .word 0x20001c81 -20000d64: 20001228 .word 0x20001228 -20000d68: 10004aed .word 0x10004aed -20000d6c: 20001550 .word 0x20001550 -20000d70: 200015a8 .word 0x200015a8 - -20000d74 <__aeabi_idiv0>: -20000d74: 4770 bx lr -20000d76: 46c0 nop @ (mov r8, r8) - -20000d78 <__tu_fifo_write_veneer>: -20000d78: b401 push {r0} -20000d7a: 4802 ldr r0, [pc, #8] @ (20000d84 <__tu_fifo_write_veneer+0xc>) -20000d7c: 4684 mov ip, r0 -20000d7e: bc01 pop {r0} -20000d80: 4760 bx ip -20000d82: bf00 nop -20000d84: 10006a4d .word 0x10006a4d - -20000d88 <__best_effort_wfe_or_timeout_veneer>: -20000d88: b401 push {r0} -20000d8a: 4802 ldr r0, [pc, #8] @ (20000d94 <__best_effort_wfe_or_timeout_veneer+0xc>) -20000d8c: 4684 mov ip, r0 -20000d8e: bc01 pop {r0} -20000d90: 4760 bx ip -20000d92: bf00 nop -20000d94: 10001121 .word 0x10001121 - -20000d98 <__panic_veneer>: -20000d98: b401 push {r0} -20000d9a: 4802 ldr r0, [pc, #8] @ (20000da4 <__panic_veneer+0xc>) -20000d9c: 4684 mov ip, r0 -20000d9e: bc01 pop {r0} -20000da0: 4760 bx ip -20000da2: bf00 nop -20000da4: 10001f65 .word 0x10001f65 - -20000da8 <____wrap_memcpy_veneer>: -20000da8: b401 push {r0} -20000daa: 4802 ldr r0, [pc, #8] @ (20000db4 <____wrap_memcpy_veneer+0xc>) -20000dac: 4684 mov ip, r0 -20000dae: bc01 pop {r0} -20000db0: 4760 bx ip -20000db2: bf00 nop -20000db4: 100044d1 .word 0x100044d1 - -20000db8 <____wrap___aeabi_lmul_veneer>: -20000db8: b401 push {r0} -20000dba: 4802 ldr r0, [pc, #8] @ (20000dc4 <____wrap___aeabi_lmul_veneer+0xc>) -20000dbc: 4684 mov ip, r0 -20000dbe: bc01 pop {r0} -20000dc0: 4760 bx ip -20000dc2: bf00 nop -20000dc4: 100043f1 .word 0x100043f1 - -20000dc8 <____wrap_memset_veneer>: -20000dc8: b401 push {r0} -20000dca: 4802 ldr r0, [pc, #8] @ (20000dd4 <____wrap_memset_veneer+0xc>) -20000dcc: 4684 mov ip, r0 -20000dce: bc01 pop {r0} -20000dd0: 4760 bx ip -20000dd2: bf00 nop -20000dd4: 100044c5 .word 0x100044c5 - -20000dd8 <__time_us_64_veneer>: -20000dd8: b401 push {r0} -20000dda: 4802 ldr r0, [pc, #8] @ (20000de4 <__time_us_64_veneer+0xc>) -20000ddc: 4684 mov ip, r0 -20000dde: bc01 pop {r0} -20000de0: 4760 bx ip -20000de2: bf00 nop -20000de4: 100012c1 .word 0x100012c1 - -20000de8 : -20000de8: 00000010 .... - -20000dec : -20000dec: 00000000 .word 0x00000000 -20000df0: 00010000 .word 0x00010000 +20000d60: 20001d61 .word 0x20001d61 +20000d64: 200012f0 .word 0x200012f0 +20000d68: 10005791 .word 0x10005791 +20000d6c: 20001618 .word 0x20001618 +20000d70: 20001670 .word 0x20001670 + +20000d74 : +20000d74: b5f0 push {r4, r5, r6, r7, lr} +20000d76: 0006 movs r6, r0 +20000d78: 001c movs r4, r3 +20000d7a: 0018 movs r0, r3 +20000d7c: 001d movs r5, r3 +20000d7e: 2304 movs r3, #4 +20000d80: 46ce mov lr, r9 +20000d82: 4647 mov r7, r8 +20000d84: 469c mov ip, r3 +20000d86: 3b02 subs r3, #2 +20000d88: 4699 mov r9, r3 +20000d8a: b580 push {r7, lr} +20000d8c: 2800 cmp r0, #0 +20000d8e: d01c beq.n 20000dca +20000d90: 2c00 cmp r4, #0 +20000d92: d107 bne.n 20000da4 +20000d94: 2d00 cmp r5, #0 +20000d96: d018 beq.n 20000dca +20000d98: 4663 mov r3, ip +20000d9a: 68f7 ldr r7, [r6, #12] +20000d9c: 423b tst r3, r7 +20000d9e: d118 bne.n 20000dd2 +20000da0: 2c00 cmp r4, #0 +20000da2: d0f9 beq.n 20000d98 +20000da4: 4688 mov r8, r1 +20000da6: 464b mov r3, r9 +20000da8: 68f7 ldr r7, [r6, #12] +20000daa: 423b tst r3, r7 +20000dac: d018 beq.n 20000de0 +20000dae: 0027 movs r7, r4 +20000db0: 3708 adds r7, #8 +20000db2: 42af cmp r7, r5 +20000db4: d914 bls.n 20000de0 +20000db6: 4643 mov r3, r8 +20000db8: 781f ldrb r7, [r3, #0] +20000dba: 3c01 subs r4, #1 +20000dbc: 60b7 str r7, [r6, #8] +20000dbe: 3101 adds r1, #1 +20000dc0: 0027 movs r7, r4 +20000dc2: 2d00 cmp r5, #0 +20000dc4: d1e8 bne.n 20000d98 +20000dc6: 2f00 cmp r7, #0 +20000dc8: d1e2 bne.n 20000d90 +20000dca: bcc0 pop {r6, r7} +20000dcc: 46b9 mov r9, r7 +20000dce: 46b0 mov r8, r6 +20000dd0: bdf0 pop {r4, r5, r6, r7, pc} +20000dd2: 68b7 ldr r7, [r6, #8] +20000dd4: 3d01 subs r5, #1 +20000dd6: 7017 strb r7, [r2, #0] +20000dd8: 002f movs r7, r5 +20000dda: 3201 adds r2, #1 +20000ddc: 4327 orrs r7, r4 +20000dde: e7f2 b.n 20000dc6 +20000de0: 2d00 cmp r5, #0 +20000de2: d0e0 beq.n 20000da6 +20000de4: e7d8 b.n 20000d98 +20000de6: 46c0 nop @ (mov r8, r8) + +20000de8 : +20000de8: b530 push {r4, r5, lr} +20000dea: 0004 movs r4, r0 +20000dec: 1e10 subs r0, r2, #0 +20000dee: d00a beq.n 20000e06 +20000df0: 000a movs r2, r1 +20000df2: 180d adds r5, r1, r0 +20000df4: 2102 movs r1, #2 +20000df6: 68e3 ldr r3, [r4, #12] +20000df8: 4219 tst r1, r3 +20000dfa: d0fc beq.n 20000df6 +20000dfc: 7813 ldrb r3, [r2, #0] +20000dfe: 3201 adds r2, #1 +20000e00: 60a3 str r3, [r4, #8] +20000e02: 4295 cmp r5, r2 +20000e04: d1f7 bne.n 20000df6 +20000e06: 68e3 ldr r3, [r4, #12] +20000e08: 075b lsls r3, r3, #29 +20000e0a: d504 bpl.n 20000e16 +20000e0c: 2104 movs r1, #4 +20000e0e: 68a3 ldr r3, [r4, #8] +20000e10: 68e3 ldr r3, [r4, #12] +20000e12: 4219 tst r1, r3 +20000e14: d1fb bne.n 20000e0e +20000e16: 2110 movs r1, #16 +20000e18: 68e3 ldr r3, [r4, #12] +20000e1a: 4219 tst r1, r3 +20000e1c: d1fc bne.n 20000e18 +20000e1e: 68e3 ldr r3, [r4, #12] +20000e20: 075b lsls r3, r3, #29 +20000e22: d504 bpl.n 20000e2e +20000e24: 2104 movs r1, #4 +20000e26: 68a3 ldr r3, [r4, #8] +20000e28: 68e3 ldr r3, [r4, #12] +20000e2a: 4219 tst r1, r3 +20000e2c: d1fb bne.n 20000e26 +20000e2e: 2301 movs r3, #1 +20000e30: 6223 str r3, [r4, #32] +20000e32: bd30 pop {r4, r5, pc} + +20000e34 <__aeabi_idiv0>: +20000e34: 4770 bx lr +20000e36: 46c0 nop @ (mov r8, r8) + +20000e38 <__tu_fifo_write_veneer>: +20000e38: b401 push {r0} +20000e3a: 4802 ldr r0, [pc, #8] @ (20000e44 <__tu_fifo_write_veneer+0xc>) +20000e3c: 4684 mov ip, r0 +20000e3e: bc01 pop {r0} +20000e40: 4760 bx ip +20000e42: bf00 nop +20000e44: 100076f1 .word 0x100076f1 + +20000e48 <__best_effort_wfe_or_timeout_veneer>: +20000e48: b401 push {r0} +20000e4a: 4802 ldr r0, [pc, #8] @ (20000e54 <__best_effort_wfe_or_timeout_veneer+0xc>) +20000e4c: 4684 mov ip, r0 +20000e4e: bc01 pop {r0} +20000e50: 4760 bx ip +20000e52: bf00 nop +20000e54: 10001dc5 .word 0x10001dc5 + +20000e58 <____wrap_memcpy_veneer>: +20000e58: b401 push {r0} +20000e5a: 4802 ldr r0, [pc, #8] @ (20000e64 <____wrap_memcpy_veneer+0xc>) +20000e5c: 4684 mov ip, r0 +20000e5e: bc01 pop {r0} +20000e60: 4760 bx ip +20000e62: bf00 nop +20000e64: 10005175 .word 0x10005175 + +20000e68 <__time_us_64_veneer>: +20000e68: b401 push {r0} +20000e6a: 4802 ldr r0, [pc, #8] @ (20000e74 <__time_us_64_veneer+0xc>) +20000e6c: 4684 mov ip, r0 +20000e6e: bc01 pop {r0} +20000e70: 4760 bx ip +20000e72: bf00 nop +20000e74: 10001f65 .word 0x10001f65 + +20000e78 <____wrap_memset_veneer>: +20000e78: b401 push {r0} +20000e7a: 4802 ldr r0, [pc, #8] @ (20000e84 <____wrap_memset_veneer+0xc>) +20000e7c: 4684 mov ip, r0 +20000e7e: bc01 pop {r0} +20000e80: 4760 bx ip +20000e82: bf00 nop +20000e84: 10005169 .word 0x10005169 + +20000e88 <__panic_veneer>: +20000e88: b401 push {r0} +20000e8a: 4802 ldr r0, [pc, #8] @ (20000e94 <__panic_veneer+0xc>) +20000e8c: 4684 mov ip, r0 +20000e8e: bc01 pop {r0} +20000e90: 4760 bx ip +20000e92: bf00 nop +20000e94: 10002c09 .word 0x10002c09 + +20000e98 <____wrap___aeabi_lmul_veneer>: +20000e98: b401 push {r0} +20000e9a: 4802 ldr r0, [pc, #8] @ (20000ea4 <____wrap___aeabi_lmul_veneer+0xc>) +20000e9c: 4684 mov ip, r0 +20000e9e: bc01 pop {r0} +20000ea0: 4760 bx ip +20000ea2: bf00 nop +20000ea4: 10005095 .word 0x10005095 + +20000ea8 : +20000ea8: 00000010 .... + +20000eac : +20000eac: 00000000 .word 0x00000000 +20000eb0: 00010000 .word 0x00010000 ... -20000dfc: 00020000 .word 0x00020000 +20000ebc: 00020000 .word 0x00020000 ... -20000e08: 00030000 .word 0x00030000 +20000ec8: 00030000 .word 0x00030000 ... -20000e14: 00ff0000 .word 0x00ff0000 -20000e18: 00000000 .word 0x00000000 - -20000e1c : -20000e1c: b501 push {r0, lr} -20000e1e: 6848 ldr r0, [r1, #4] -20000e20: 3101 adds r1, #1 -20000e22: 468e mov lr, r1 -20000e24: 4700 bx r0 - -20000e26 : -20000e26: 4670 mov r0, lr -20000e28: 3809 subs r0, #9 -20000e2a: 4901 ldr r1, [pc, #4] @ (20000e30 ) -20000e2c: 4788 blx r1 -20000e2e: bd01 pop {r0, pc} -20000e30: 10000991 .word 0x10000991 - -20000e34 : -20000e34: 20000e4c 00000000 20000f20 20001790 L.. .... .. ... +20000ed4: 00ff0000 .word 0x00ff0000 +20000ed8: 00000000 .word 0x00000000 + +20000edc : +20000edc: b501 push {r0, lr} +20000ede: 6848 ldr r0, [r1, #4] +20000ee0: 3101 adds r1, #1 +20000ee2: 468e mov lr, r1 +20000ee4: 4700 bx r0 + +20000ee6 : +20000ee6: 4670 mov r0, lr +20000ee8: 3809 subs r0, #9 +20000eea: 4901 ldr r1, [pc, #4] @ (20000ef0 ) +20000eec: 4788 blx r1 +20000eee: bd01 pop {r0, pc} +20000ef0: 1000160d .word 0x1000160d + +20000ef4 : +20000ef4: 20000f0c 00000000 20000fe8 20001858 ... ....... X.. ... -20000e4c : -20000e4c: 200017a0 00000000 00000000 00000010 ... ............ -20000e5c: 00000000 .... +20000f0c : +20000f0c: 20001868 00000000 00000000 00000010 h.. ............ +20000f1c: 00000000 .... -20000e60 : -20000e60: 00003350 .word 0x00003350 -20000e64: 0000334c .word 0x0000334c -20000e68: 00003354 .word 0x00003354 -20000e6c: 00003352 .word 0x00003352 +20000f20 : +20000f20: 00003350 .word 0x00003350 +20000f24: 0000334c .word 0x0000334c +20000f28: 00003354 .word 0x00003354 +20000f2c: 00003352 .word 0x00003352 -20000e70 : -20000e70: 0000534d .word 0x0000534d -20000e74: 0000434d .word 0x0000434d -20000e78: 00003453 .word 0x00003453 -20000e7c: 00003443 .word 0x00003443 +20000f30 : +20000f30: 0000534d .word 0x0000534d +20000f34: 0000434d .word 0x0000434d +20000f38: 00003453 .word 0x00003453 +20000f3c: 00003443 .word 0x00003443 -20000e80 : -20000e80: 10004879 00000000 100048c5 1000497d yH.......H..}I.. -20000e90: 00000000 00000100 ........ +20000f40 : +20000f40: 1000551d 00000000 10005569 10005621 .U......iU..!V.. +20000f50: 00000000 00000100 ........ -20000e98 : -20000e98: 10004c35 00000000 10004ba5 10004b2d 5L.......K..-K.. -20000ea8: 00000000 00000100 ........ +20000f58 : +20000f58: 100058d9 00000000 10005849 100057d1 .X......IX...W.. +20000f68: 00000000 00000100 ........ -20000eb0 : -20000eb0: 10006fdc 10006f18 .o...o.. +20000f70 : +20000f70: 10007e34 10007d70 4~..p}.. -20000eb8 <_usbd_qdef>: -20000eb8: 200015ac 000c0010 00000000 00000000 ... ............ +20000f78 <_usbd_qdef>: +20000f78: 20001674 000c0010 00000000 00000000 t.. ............ ... -20000ed4 <_usbd_rhport>: -20000ed4: 000000ff .... +20000f94 <_usbd_rhport>: +20000f94: 000000ff .... -20000ed8 : +20000f98 : ... -20000ee0 <__mutex_array_end>: -20000ee0: 100044b5 .word 0x100044b5 -20000ee4: 100036fd .word 0x100036fd -20000ee8: 10003df9 .word 0x10003df9 -20000eec: 10004425 .word 0x10004425 +20000fa0 <__mutex_array_end>: +20000fa0: 10005159 .word 0x10005159 +20000fa4: 100043a1 .word 0x100043a1 +20000fa8: 10004a9d .word 0x10004a9d +20000fac: 100050c9 .word 0x100050c9 -20000ef0 <__frame_dummy_init_array_entry>: -20000ef0: 100002e5 10004f69 ....iO.. +20000fb0 <__frame_dummy_init_array_entry>: +20000fb0: 100002e5 100003b1 10005c0d .........\.. diff --git a/Code/BITS/BITSv5/test/build/test.elf b/Code/BITS/BITSv5/test/build/test.elf index 91a075703d3471a4579655877b8e88e8646ca86f..4b5b32b7bc8606ccf6deea2d9bda2fd539284081 100755 GIT binary patch delta 27681 zcmchgd3;n=w(s{jsZ>TnB?JhWs3AZI0TKp5MJ+NM5)v>9D3g#7q7{Zvgn$vj3W8ij z^ac)+fS}-Xk)Rz2QAE(tZQIyQdn+w%0|FNn1?NK1jHKRgoguYT&3o^U_xZfTr*i7M z*V=2ZJ@0*nV*5u1&##7Rv*^BUtJON_%sR&C6UcCw7!z=6+KUfkW`vtMBN*%4S~^f% zl5lAA)JWq&gq>L@Uy6LdMPgDr-kX`-)fCxarjPR7gzxmh;hYqbWAMD*$|f-u{3E-J zAa@huEJJn_X z8CNVw$P+BPqySs|G?NY1pgV&s6n^PubYB0Yol8Z88~N;`0oMaU?o1x<28laSmXM7Cik}vun42Y9Ojwb8c@$pkglhZvhW!)v7tVZ zh1bPZ2C-Ucu@ubuGPm_yf?x}FjxUWePIr80w`FuRA9c9a+v9WOBEcHu`L%5#Nv@|<86!7O;HItA`jLwLz(#T;SfVW zW>{vFu}`M!$$CLvEV<1)<7;e!bxdiPlNmD|Un!n8IM|R~_9sy~(a7t<4zZ33Q#g1r z-ik6A$|7=vF(aKpp7|Ynvwv$2gU;!8!FE_H56XKnDpf@8)4Ovo)>j=rN+qK>C%I5t z)aYjA8QCW3$@-lc?Ci$NLfuXj{fxXmRg0urn>$GuB0EQwqKF;0vrp{e3t%(Y2lFwcU)COT}Nc;ir3CRjqG~`qx>nw<_!F;Vf)%+{$%c@5w)Vz4p%O0~Rl1%+nYaAH>$z z2c+L~{-&)|at{hy{+vxnn!NmuQZaqFG0eHxF&LGSXphfmYqqlY90O1m2b3N)rG2qf zDqV642LxL{I`yG^ge*c>;HZG~OHQ;O7iuV@JshG#ZSOe*^KLt{EJ1aA*G|RB+aKE7^F7~s%r*$D}-K^1^hemwRR<&5#=QOgN@qwkiY;Ln)Rh#nneoeVA z(h}N(Y>Ts~F}w7(Y|`3tXImEPh#V?y`}el|QhU!TQrmKq6ns@JQgSGoF$_PU2R=C* z$Ziu&n?gf}=8no792#oB%`hr6N=!0Fg<3PkZRZb1iE*ybKAB=@m_5qSCo@iD#<F|wt$fA0u2zi59L zRW=xAhm{sN&e=mT%7s~)tnR_WkkYJB=WWIc#~ti~-D=+^4N*F7og*KuRi+Fxx=m(&5MC@*SrS(yql5wuuo`d6FP(d>L6&58Kl8S@DsH-L zi=?M5eW38fovOl@or|SCmVsQ9a|r2a#Ep<0J#_wpkpHy2xGtHAT0-x4M&~_`gaYJ% z0|px<-Pk!E>}`3iD^JRmF2$Q%=L0Oc83ro_PU&K{WEPSeGMUNVmJ3}IB?>LSnTuBc zX?2>nkr>W z4@#FCpTgX-{;@#zjI>q4Y62A#SnoOho^)7xL)wcupw5}+lD>C}b(b)DZ^6)-TzX*n zXeSMk@WJBN?;Jz~FjJ3OJZ4-N9^53u^YQ9AR9L$I^Nt z<3{rg=>Xh*)~mGqA+r4*WrTekZRSs{f+eN&aR=rQG|_doIm~6N67KZgDZb$z@{Cis zvsSvt__$-D^r_u04Y0?ct!7Adj?L08yI8j~{#eoW9KmYzeB+%aSy?(8?W{&~Rarcc zjwxoebBhvk(YqNg14QdecG+PqPFmI`~Z@>gzEHPtBX=YKT zqc?`*fyiN7bC6AZ;}z$c(a$*DmLXNb5Gq;7koRKgnIf@Hu)21}7b2-AyyAf%+jglq zYnQ}qL$GL~q8;r_N72qy5?$#%mW`r??w42-Vo2#xurXNI4MoAKD;(hk!TdrHI}>u1 z8gPAAPTqPcCWE>E{>5ba$+)$V%=A_T)0y_;5OT;UU9A;t<3UR38^_!2VSx6No9tQ zMiSq2sY7mL&N$5N#4lsW?FGp+wS1CjO{h-o%=0uVRUdLYnvFR#voaHFCpH~^%=OLC z(vw=h7SNwrm)EP#YERaOg=1E8hJ_Y8eKXsW|A(24+c&CD>SKJRV03p4-y(q2pK3NzZ28aBFpu}j))N#KG~+6@ps zV=*)Ke83KGi?uyZ%8=$9vsHO*EJbiL{Hi{2?L zmK&qTiTfkupQ00uwb*S;kCCJL&Jzzt$mM?o%dc%5}3OL zJFPPO_LyOUMG=0%E?3d#OLmze2q(PW0|yurPB8Y3 z{M3N|iXbftAu}Zj@*T1F8;`()MG5k@*z;m)f?O7NO87w@7e7Ss$n)dVg<5&0+(1gH@ZstH z%=BXnGuas%V*;}r=cF4A`x4UyVYB?{z>&R;?N3T9`4zW?rC|rsUyd}V55K={6uXl} z#Xd8U4eNV>4ZGWIWTHMkV+ zj>l(Ae`a>y6KFRz2IL7WhKZ9gpSPM$EQHLxMtHMa= z)iy5i$2O+Wv#noWO-4m-O=PC=g@JZ5TACn#WBbUcrXwFtx?3zwX!s>5Dp1Txkc}x; z;Y7pGl+mKt)LWjH`W#LTKc!9<1h;(qh@F-%Zyw3`{nNPo_^D0SLk_e(&u{HV3cFg) zw0E`axY^aRS^jl|C8Gga|NQjgRqXBUAN;+etIIV3rNZpEieTT1-FZDeC{&Pt}GI6O-1;JMNH- zX5d*@!TN@#4^_@~Zq1fq&1(V%CA4LrT>MFFEN1sTSPhc!I5H9jJ*26G~u#b_ux|r4|V+Ws_=Ys zk2Lz;k1IloBU5HB4$ViVSykr;Xl8$$xp_nu1QcYYfZJa$X>S1JJMg|5vTY!@WnuS&J@3S-d<-magd`yjE zUQA_2%U7MI6OSawQ|H_f`=`#KC<^C^_9QmwRd(ZQFf2Imf%xS)w}~IO$>-;o#mY9h zb55F=mLQLqJ4W2lCNG@3f6&jZbypGBV$6#voK;vLiJos-U*>8k4Q8&%=@0c0zL&Ef z$_o)a2U~Ak?QB^p?|f)vzgey4u9AkHAT@^H9+WRV6kDXb>$ai1j2r6X9i1(sTRU5R zZQYw8x*7HyrV~T*;wlACM(5z1j+UWaRDQu-URzRrQm)wP(5Ch~YDs^RMg(VJ*AuTsx@tK^^NJ!~z2IK;qMEed=SM7z|2$Mv(b7&DtB zb3((a`L7G2IYCY=N)bMmbBp5o{;AD$!qmvHAQhoF6VxRAAU{?#TrkN0Rg{S#@B5-b z!s&*{1#yD)G%RjlrUC;#KVax!I3u9~CYTB^KzRms$y1B1!fAPV@vso@P16Zxjx0DW zzg9dX@aoO$S5M2$#U+KSZ?a^AyUJ2+3!412*j#|sf~Ou~qFb=p9yOgHuD;oha-i5^ z-popMCFPtH(~p^{9od7LdQ(#*4gh<{>l#hc_TKW2g~_H%?St~-3kT(!S@eXCmS5ZD zPZmBgcst6D;<)?bLMzT&s7d3z73Eok!t+Ei^S)&b-$3oOGu9#oOMy;nLzi3JJNePw7(}(x>#|knS*i zJo1U9FBnzN<#}b2=+=B<-}!19aEM`MsgknvT9k1c)YLt z^0LZVr+JP7ebPc=V4}%*DfC^+>qZ~ z-d{BIkw02q1{hoZC|j*aQV%!h3+u*^*K^_-X(<~gGnj_D(}m(Na+JE|cZyx^Od zH1>5-d&@H&gNsXwX-nB8-H?~BAj|t!d>(oO#q>KqNMU2eKcWb!Wa((f_dO3bELxc& zL{Rusv(;Ka3NNpkAdcviFRvOr=$DSK&~luO;Y_d?S#E|I(~hZgbmg3&i@n(}!{@}8 zd9hRyIiM2OPF|E@K~`+xq`Y2iQttZt*g_L~#!;Jz z?TWd*)-G%_SSM%6Qj>L-v`vW23@hA>OCwcMF54naltlA>>E~W$VqLET zBHL=X%yz$)G4E_)_B6MEYw+<*OxrfV_4q`V`iq;rkd1Bp9H}a)PU^)X#8t5iv4|hS zgb6Iw?oMZRsk5cm%~f&hvv2%^y)cx$AT7&G67!@1MRAVF(p`vt^VMuzt~hX&**ia=^_sp;YqE(JG2sOvHZ!tNWJ#m?WCmDc z3ypcZr9x$U2iH)t%pm3!X2ldbC+YF!8*8eg#$r7y91(LiNW$^LN$i8M5%TM6?-sx9 zC9hhWC|_ASCW4oq3z7RhF*wpZy}YPw#nRG>iqf)2%!3w&Hr(~ZD}t+VJXV0(XD0Vu z597}TnmmWov*Ua8oy@cf=LqfGdWXsscB_xW7w+nzK!V*c@>i@e|Nnek|DI4X9B|-6 z=l@qHCfxOZv5}zVloa1Wf^_ydAg^9G&y|YBH{G23;>k^}G1~X{yc6Ee$M;^L>P@_9 zM{ew^0tZ8H8%DI>9$=<6d;&4D2nofPtI~>Enucg#muw~ANpQ_^IUwc;QKawHsaI%Ff(1or+Oh;!XxVW6!?f1 zwioAB+V^dcufk`Mrblt|wJ`eb_sQ!HNQTnBW$HvmlN(KdG;va9lCfYIgU==rTT`63 zkMM7JjUnh?0l%sbH785(=2|Lonz|MxU9rFYut$RLb@J^wSJ_JjY zYt3xrm(5Mb-<9fdefAxPa94llNG6OLlKG44DjR;;eHPPa8m1#tVyHWm^@&WuzH-b7GW^qEdBs7Jj%Jgp@o(W+&Ming;lzr9ALy>H!q$x&7XO@} zbFey2uDnm)u_w`5dY>My28ZBoI3Mr%0{NRglM{RO!}bQnNloh-&NER}^qmezj6C(l zQTHTZ2SiwkvjyFazN4YAb2HWNxi~j#U5~=YV884{7pp+=n^^ePeSHUel{o63S#WG$ zCNu4s%uF8_Fw@s)xQ7DJ%jX`dUfz3a{qu+aFjElYAD3s>XGGC`ZHg9ve{>vNC%;uc zLZn;s^&_I1G{*xNMhF~B5*iW@JtyF~0{N}OQ(g32ffCLP>~Hu&jP*TyG_cQbrmhsO zZ~&t-jX^l!P?_XB*K_tRK|rkA`xZQ=r#+hzz#BNi8MqF?k#+Km4I}P9$^{!xfW*4p z-eBtHyr0Cp+2dUN{?I?ZPEI_M7}dlDry#g#ojeu6A9BHWA^5{}@)Jky7Aqf@-#?Nl z7Os&m9VttvhaM;i0VPXG*J~wBgX0xN$@sG4B(C0`;PqmU` z#R|vd)dh}~_KvD!M%IR(Yd>eh2&>AjuH`|9R_yYs}u_-Cw+sdJHAWF zcDOG<$+n&20k<%i!^z3ubdHm5p+A$8lYVVCyVT~iyE{Ow_%V^)9Z$zVRm zl;i0flia~^RV7+^ zxE(oCuHi$Qh7U5B!^z2^GktyfBoD_dgcA<6N?+xexo;a&g4|dS0~35wSr@kZ{T<=wM*^LUERdVN&l#i)gFD^7r?f{A-W}z21R{j zy~fF3hddR9qql!@=m$>T2>Fl1sEzLUF}}i9^t%~7x|t#%poxpHH`W*7d&o^lkg7{> zP6s(T<%q@k^shsoZiU1s`bKr6=H#Rwud@q2l1FAeKx@#RH7xFT4GrK zf@x_-RYD~=4ou5D$X!YRB|vqm8c+@T)`2Q31{4LA^)(|c2xh^c0|wI|*B1=Ly1hps z*AKl>Rx26OdbA4)bbIMIwDd-kHqe*jU69kgCS*WK;4ql(Z>c#9WyisETS{ljklSwr z$mi^ld@iw)K9ZzSoo!xQl%T6e02QIGa2iFbA9|hDatWM)d?$D& zl&H!mM;=a2oNDdq@KKJxLi~5FE+_~-14nH=BOFii@jJn~JHA19%pjkfN}zUdPtM_T z{JUR<=uUT&3*7=cVx>`$$4!0)kgXn7vWa6#u-cFH4G9%_?^_JT+x_%iNh!Vr`rabK zcur0UW^qhoup3Kbekji2u_hej40E0kaK|{Rze9N0MEL2D@^w(uw{_X08?q` z1{QL1Y+qOjcp=Ute*))^M`NBuyCtT=ZXMN~pwa;gAxAI{Osu5vVRwMabjMqfYb(`L ze)5=cx?Jti6F4S&RUB`CLub)}3lJ`7_BQEqnpmr$K=;v4h50Ns_G$jh9Z^yl8=)2HTD=*I<_s=Rw*U7`h$3lzc0F&V7&W6BYNaj4e-$RP#M zVO}85w1fH!#ebFCtNsCUy0U>_%D>1?BET0%jbP>?kVAVp2bz7#kX-j-i`papmtfy8 zc-?yqOirkWYJb0CPn%eO;SB0Myq-&t9BA@mH^-fR@k0ZtYV_l}Hx*1hNIldIWONov zK%ZDCfrS*H9BLKRb37FWnmB$KoRsa;Ujk0!xEws5<4W)nj-LQmg1aZy4G4IWQ`ijN z%yBh%2gf_WS2*4U{v*d!+!r{e4D$MWp}%Mnb9Lu@;4m)AqzG^wY4 z7pJe(Hz%j~!5qJh_!T+btypC5BVb`pPlJE;qVNXA(P2I9hXyp$* ztyTK9`ZInBe#0^4=m(C;fmV)5-o^31;81+7FN0UXu23$34D{oe4DbnA;*;4^>^syksgQF(hP=F+wQEYw?f{YPhQcO} z_kp)_{5tq$j_bfjIj#qP$T99fuzzrT47@pCD^Z##{)m7jdI0!u;455&GvJ>%{v7-Z z$6tYGbMbMdlEriUBe;O$U%)1f(NRU#f`Ad6LMPbFu@J=AWR8vC435LVA95TGewpJ0 z@D7d#gPT;QfkIuIoZ=LyN1f()BqChlcr5rQj_(8;r}!G_M6ikDN#Ic&PXW(VSQ)59 zHVpw!a0;`)2RWV(W>b9$ECjc6@=|atC#POv_2VRtDTB$x>Od*7G8jnV6e_@Wj#q;x zb6f>(;&>zYJC3)2rF(r2Zw1ffcnA1(u$n%q0FR@yO`O6$a1+O`gO77u2mUL^l%um8 z*F*lZ#`^m98Yh1nazg<(QIdg~1wN0Ppisu~N8r^Qp9XK@n2P*4Kd$!U>3;0KmzyZb zz+A3d{R0W;hdwfH=M4OK3;8KdPWEE%^JR#b9>i2_hO#b-ua!TRdFn`&>K9=;$NhY3 zKSiGm?&T)d6i!YfXFAxofV=J;5B8~C_u2vJWJEo#dvp9EkSvW$K&c}6=D9c*eXHPH zBhA%*yvC2q{MhNog&aTV^Rv5Xs(f-6n-7I`2-uE<_3e=9eqUi%K%QTv?(g*7Ni-*S zK~9gB(#)dAcXIL_kkezQRDN_#>qYRXZgz#T*API@z~Tf2^*UoEXMjqilVd6|(=?xh zB)`Bh$vqsCJbt=QpX6qpY1U8-=mB6-xZ%g)+O1oCjLk=hKn;hwyP*syhzyWD%Av~Y zB_k>Uoexn?wZo-1*LW_0_n|=diu0kQ7wKG1{wd`2G^}2vG=$ta0D<3`ot7Yjg-!FIe7u(#K=dt+)h=djv88> zAwkG-7!(8K5YJQsDywx$ManZ(iO#c;pnm98e1j{2C6LooH&`{PbvzX3R!*T33iL=0 z_Ocjkv#=DJ?kt$u3ybJaPns%r^k8tDoy6(lwRtC+^n$^5$L%eDsoDY6wM04Nl$y z`EOuco9m800grg7PQxOewQ$j+)M~2?Ww8iw_!-RMB2bB(<~SYtX73t{*uA8fiweY#Rg2)WG%GnD{G4w_k!^zE%n~|X2 zXvyKDTpd%Ri|6!7-t>^qJ~73|iGEonlnoD)kNqoA92+K||5swasW4AZ@d=R9z-k9) z^_L^g#tIAMp=U=5Yvoz^TPr_(HdEex$&^6KWJ)hAJpN}^5Rn_?wzC6;CV9ZQfqgH) z5Iw(#*+nt@E%*m{%DFf^dRKbRCgQ=p=g!57y~E`L=Ms&HaC1R|{K>fyE;i5SJY_DN zW6DfC$0Rp%O!8EYNuI_r$q#Z&@>3i`?qZj@08+TZF&S{r@9E$Vetd&t(vL3esUO2J z$+I{f$_lXd-~vdY!jBjDRe@5>(9^3#eMLm&lyG_S=ZWIDaCy<^BgC9=dDrJ7gcAAV z&j$*R%HMuIaPUT?fL^Bb5d2JnG7+xvOYlgcJmNy4i03G$UYHtn%1>%2lHa;8!u6qF zFQSJn$p_`pFUp2?&^Ylbn4YwphA@3P4=(Z*6RAgYOw|y>G0BrSek&aHMlWj!ia|9O z$(#a37|$^ooWL>3JsiJ>0D4_T?{$9#)B7Ik$Q{Z)1Jh%oI$xrpm7XJ29SCI}DA2nn zx`L8}1wC^}@46se9O^h@FVR_Koru33a($el_-i;h#B8p^r$4kW0yb~~q>!~pF1s|s zPk9cxbZV5&h8Tym&u{ zvp9}%Ap*V46OCAUW6$9fD91l=Y=b_%D`e;NZ*X$bH!Rg1RF|&79FyF{v9jro<^o6| zm1C-cG>%CgQ|3#6m>j|hhgt=cAqBysZc!phzW6R>dr{yEVD}&by-IWn+X1~qrgL&i z(7`b|xP)WHA&yCYfn$;vEYmZfU8u<=m#dQQO?N&Qfeg;{ z<3c~K_v33ElLIp=d=8Mkg&Y_79B?tco78d&6v42vr-3v-w)^oCKMr2iGrq@Xzrr!eqaW`nujqv;QPS6D)@u}?9C#%377504 z2FRe3W9KdO$8gVYt?`pneERtVHGMd+9SXjiaOzU@0%w3CcsPE|&)_ZZ*eRKzKk5y; zgWS-oiR72AggpEXZ1L9|KL+zxkuHMi$Me)UM)ng}e^{JW5F(z3;JGiDw@1F?7bYUU zPIS>aKsPfCYU@yjG@8@unp#~ISEdwg3&#_oztvB_nv;|MZjNU_e_v017u(AzP=tdV zFF}MuJtMGsPEPvAIbIL_lYaV5oSgJebG$nO)!pnD!Oba9gbN(MjRd~%)4$BgN&g3q zKZE{tKYb4;SN52lT);1gAgt+G1q=+kIMksqoZ~)t-6+ye-^9tup?HqRL*K&bE7P5s zQ=kZ`9M4CDbS?t5i8M}5`V%0DFvlZ4QZceo;6YfTq=6}d1pc}o-f7o(F8I3kv;@g3 zz?wlt|7q|5>>moSBO&&-$}K%&#e$L%)OX((dPzJQSB~a=8Sp;5TELX^EzP2l(lsxK>5e4MmuQfUp9! zh^a*G1=CNgdh{HF{~YNnffeA}!Ssd?#oqwd-^4Ouhg1#zIz_$2OY&V{dM6C(ihdpV z5S~F&9-$$H_YlylH#504h4bJ$xi;|=c*;O^i$(eYefSc(?hOO)s z8xGd1h%z`1{H_hxnCSu}8I=4K3c%Mb%yft5P%)TZ(Y&H@C3rv~Uenb0Kfq68)k%9m zvbPWX{2csXtH#H`eYq-W23PiWF*6lmBpTfX1l*pgUOyxQzk=~Pes?1b#Fm6!dZg|{ zIf$n%3Nx7LuZacYS6dm|W5QdlC~btIT|@%^UzfW>D`hl0odV*bJ^j@dgYFo*ZKe?gwWALAGK~it^7r|d+-8^11a1G2?$uD3FF1e8d z)F`{ay})`2M)XG`<66B9%#RbUbOeN8C-9AyfF1lBuE`~7JQa-B36(0K1m=Q!aYece zoPhmys;2)WxCG;b?!dF)S!lF$ZHP)_CsntTp| zhvO;!%~}HQgXslzedNRaV@9t6>qY!C_*)!t0r!W%gRgeaz7vI;w zzKcA*0|6{XZ`F800nB@RANVBK1|9-Go8W7d4}<@~Rl$1jO!OM~rHri4g6Y?`fJ%wh zfTv)+u!QD+S}-&sU>1hXEKT7Q_;apTTmUzt$aVRTU|$Zg`N0c>-}a)XsVD&~;lRFb zdfofqn4XttSFubij3q&Ci9-qCZ9~PQ2|Xg9pM&3g0KY}5IW!xr52ds~c?A4CH*7z7hy!Y2d%3QB(R#1PK8HP$YUIc?dil z^LMf$H!=sCtkf>Fqd>`m~;h0J8v()$pM_W@nqlf~Z= zuoOe1Q&YGAj+}$O0XCD{f}Imv4Dpb`Fcqzm~Yg#f$42i zrO0UDu=^=Y2A@d6k4tC?ECAn*C6%7wD)3t5NNsc?+Xy}s>YGdUf%ydMz~AED0o~)G zM*0yr#DxV%nw9{bg72|xz5rf{R$Z<|xB+hBx>-m98WC2_c1=D2j6=(iz(#=ShYVg< z4no;0$pJG zPY3pE9FPb`9qU!n8~huJc%~vZvN2%ZfxE$x$gr-TlZf`uE8GW#Yg`d80&hh(O41Ts z4Ss`L;cNl(i^^SK`UQt-P5&+MAq&%n1}Uq20F*Zt&y1JTVe z_EQxoi%_t+dx3&wHkhC9v%$@9SZ}1$!8o+JCXl%>SF>ES>fH#XZnTmZ^Z7xIH-h;R zss<-xC^bNC!DO}DPyQPCvB!M_Q62ajZL>*L{4sc`uS9VJ5dkIK^x6XE2bMrH3}Qjy z&>V^a^EpfaKg-Q-cY%3_B{1Bjzwj!Q-G^^JIp+U42$+I?oCXCd0VjARHyyooe)1MD-)kZ;Mkiq4nX5U_ z7kn40^n%8T;IVnWf$47WX@35{4*{=Xqj6b_PzWB*jRP)lFDy7FX!57QJ0C?q*BaGM z@JTFEO`7}-FrVYY;7D}iyESvYWzc*uI{`~nXRxX&IJAcWt@**~EX8NexDn}HPc=puW zR7_8wR*+jkKO^^WNqM$oL4jjh+I+`?5yi{OR#Z64mpMnIH>|#yA0|3WYyKE4d{T3J zs4%f+Z>X?n^a^L`{71`6D@x`sShB2mF@Az>{;HC)l9FbMB}EIn6?TLPZ`7;~ z6$aN-hX{ApoDUKD*9;03qUl>`O-!iJtLASZLcf|;`twGZurAu?>6mFHWec+l91h1j zL&Jqvg#=$7((;$xUzEA5?BUW!vLUZ9WxiS4=OiT$Wi;z9ieRl#4bB=~vvls-(PlWqEl?Sw%tlvWk-8iqd6e z*^Zj`O~PBDl-9x$O6{G+k-~t0C|@Dy1@zAPXyLFBykbd7iF5wS6*Xh}3CCi6Sxg@_ zsiY#eeEGDBqKcI(vRBpo*iV?y-)E*rS=J=?7v7BLB9nvnKP;7(EMHktR{U7@(s$1E z7v2vT=*#0+HIGQ4ps2iP>5A+M95vN(LQbU5PUa}JeEt zf;-9=fvnzNiR6q4!q-BAPmoR?6)bzSq+F|;BF8)5B?_a2ngM3v9SK%bU!5WP?OP4CovqntmeiLeTT1FwC68x=K0 zRwR~hg^ARrnt2pXYkJLz-3afM3@*5rhHd=XQO&znAS%7B<#ssY7MnGJ~Q(K>2;vzHk=%>+ALV zoy=fuT)rC^VJBPl0rFB{M5Y5KgP>krej-_v+p6DcsO%ozUx@0@?l!pI)_$G7YwPp<)rw@YC#str2{_6N zVSiV4$RgJkWrFM--e0}ePCgSJYEOi$u!~$DK1IFRPTmS1s@61>#z&MWN|5|-WZ#fG zjpMFHDWY;E{JYr>9w7{;71-V0-0YOSqh3(;zuXsJZM5kOj$LS|Mv<-5_3*(bw;wN4q({Yy2?DQ|Q?shpFgG2N95@~fEMN*CEK zHdR?EC&hlC9FXC0(?g$Xh!YQqz@XG&`Qg6ymy)jiTZ!;WeJtrRYMkJduf@f5TGr@= z(8V^;|MB?kKU!4h$^XWMhx9?j)8JXVw!*Q%UpNwl=#u~zDLJG1l!iReTTy-|$MxuS z-%qz!B#W5WE5k)XmZw5H7hRT2T=+Y_Ywyh-p@WJHjBde0WKQE$1cTpW9zwa@} zF$_k{0z{&BqActgudI^q^_-ymS$2qDY$xHcwsL*^+tF)K=tS(mQvO>pPELp5#~Q63umY>XmRh9+iC)`iCkFLZj{V-(8JC zBmK}G-9FPhk&Lc!%C!k6?0PwJeD9&^8fWRBdIx%|Sx&j9Uxad|^mM<6R2BVC9k?Ec z(w7I0Q4}9}anP3VU+>2pN<_w-QNG|{Q9943P&#e2sl3P+55WYSeN z#VPweIk`>W;WT5!$SqI46cFP;e|kuW6qLPjsEnH$2eVH!YLO|>#tsIly6TP^T3+M zU#=!5-6s%tH^p322tr$wUrL^kJT`e`a#i`tk~V0&K{9fBH+4&+95cPJOK{^i7%2ZE zqx@ldFSWjl44sjnbe7|0tPJ@}!{=9(SI)F5W5Gz_&>g9n@vL7qDlPJx{)rAXYvx*e z9z4u;%3o)O`sqJ~s{jUPC3Su44yM%6jdfnlKU{T*0Q~y$j)I=sh>rC9tPru%@tFdlt)7RmytkG&yU9V;(+#9`V&0WWl zMVQxfuxs`by%O^gmYh))$s$5Y4bI6KwF(ZWEz1mc_ zTn>4rmwRsg`KzRF7Ej&c(NwHCh+|Neh_O}LQbol5SxR+3OfMD5W{oN%5odcri8HII zZd83!U7Op*Nou8V*-9Kox~F!{RjQMkqEi~{hTNsNJMT6}Mx{lKcI5;mHrBn~=*m^X z8|!8_diz7TtWm^tKhsnfCF`E)X=|!;)XSJ>qmqjn8|ykX`fAf#W1Z{nP1G$4TI+t{;do3W6DDL^0Tudav=7#VHHMGBtZ0;-Xtla`kYp&L}zJm z_AW(DbjtVV#wl&&4|BVA`p<305l6X*5aB8mCxR-Hqh!duo><~i=M7iv@{jYnDYnw` zd0mwV8%9t8e6wNqM`<{m58XVh;%}68Hb4$q5aal%pSH80R&p1OX!%=`Wcs9H!3PnZj|F;>0Tw(Q0XB%<&))+`Cs|y5c_k z0G0q_FJr&WG=AJ`$agTkt@xc2kJ$ysXN+Tpaip|+?Z-Un?p6vUs7K~#9RF{2_x~)Y z01h0(PRIYP6PpwMKQ=;)nv$YlFX5o0#{v1-AE&s_&eJcFzFx7~eZlzsUi090Yw^3C zpMEj*cv;G*eejD<%rl{|rcD)x2Q*I-AocHu?3gP}{Dj$Vy7jvsf+yV zjR=i^5?yC`qWb4$VGi-2M#Lkk;x1HXv=s` z&N~`US9jZv#s|`k21@l37+ly2ou!wKu2*ntM9%xySU24o(b9!Ye2gE&ILku+u!%2l zq+aN+v6rAD4PP9v=}dCY6PdkB5D=U8u7jyZGkcL*0yi+38K{9^@^f;^vG~U_S+WgL zB{uEe2c{9i>}t%-&S3ewKz{~q2OSFy%woxLNX~jr1{@C!%x1|$kevOT9D01Hnm$)9 zJ07YA&6C@X&+F~LSfU~nM3#!KHX=>)(yPd1vH~W#Lk>9+MwzFa2z@%k%Z!^U{sm=o zvx%DKSU@I|Q|8r-Nxp$G$&WGqNS;3t=BCthEcNqylyZT|N#AMnctxeS7?b=UU zIJ)~iL_3&is(gi?y!G*uvwGb_^#W5RFKQW6)_TSy$LT^#*skakD^hW**chPxZROn$ z;@n9nif;ZTK%^QK&SqIBK%RyQnw^-6%3<~UxPl~oD9$qlJx87Ub|aKnf_m zRSlvTlfiS0N&gySk~`bC&hKJO@+y;Qlu-iJ7zb>6pQ0LRh|d}4=wsxK3Yb-eAA;1Oo2jF zd%q_GaTcrL8)pcRN`gt}F|PfWD%WX7aV&q;KBeVER$$O~I@q$sgu*wk7p^ z{~hf9;U1MMW~#qJz8#E_-_rkfFgeyeu@k(P$#HYDrEYX<_EB&;44D1DIHE=F7M-E6 z9SL|e+oDk7QP7%gKbS0<1}d057Wt2YXW&TkUO0B^j)f486I1XqqFV~o2H@cqHr6Q@ zGC&WTo`Ie`>8wXP$|7GBXUg@~+sv2>yui3G9Lirn_ls!&>Gm$0a$2W`L4lrUoowsz zn4W8y4v@j9c#~Bz1p4$~3x}2wIhe^w|KNijeHu`QExZ?3kVvL}s@M3Wkw8otPBA8f zwHBrtkpc61j~vnv1160;Gd3D9l>ahYcrziVOIRdR{Z+A$YGmdxGSH(sJxM?JXkrem z@F+v2rg@zuzXa>^AX%ts-U22k^i6lj)}I{E#;Gb^X9mq7?yo6O7Cj+^(OKm{{MP2fMk46!PjVZh0_i#IwI;}CEm<4Eu(#Y-K!!gtIqAQ~nDk2+ABO(>j7jbs;)y8OEn-?HhyfN(vT&w_H(R)hF*$hC z!nLg!@!!xYL5R*44zloWR--ehp}Cp!M!iKpZ>Xon4gE^h@bfO9tJls z15J?giKUHQ%UP-CuW1edXX=3eYnq+l8H{7WIgH)?kdVs~hJrntK2sfL4vc{O6UNl0 zrx-s1`DMnBfvXu$0N?enTTDhm$KQBDG!^V(JPRDp_*w83#?OIIGR^}hGF}ND!?+MU zwuQ0&Z$iSmEeWdF0?uW;4ZN4}>)>q0yTNN2?*r#C{u_7~;{)JrCe!+N7zwUKPXvyG z@0tpbe**rA@qfThrca$JiZL}w4C5;3Co;YQ9%C^2pDJ!5VH#8T37pNi9=x9MU2qv= zTN@$1Wb6m_8Rn^w13Z~=C-8WkssF1Y7zw{)3RI(I7S3l(H7sBphWx7-cLQ%_`~Y|t zoT^Q=Ida7Qdt8gBl=d;eA}W=vK-5DUd9}vCOhV~Bvdjc17BG9 zoP|HK@F@!)X6)nf9u?E4cJ~FQfaj{>B6t%DHZPsBM|zs18|1Y(@24|a^GYU%$rB)_ z*THDPG4r2d@==h}t6~&Yy8kuKhx$Jr4Vnq#p>Pf%!vPBVdH-2vfFd$6+2as}Fq<*S z2aIYhPh(8-T*k3fejZEE3>eSrs18&>x`neClRiZR2W%L05-kFU<`SX~(6moi=S;+F&dgN{`cs^sy;OJA#V8&m;0KJ~4 z7hn_D!St%0$rL6liQ*^bF;aP5thzs90CP;XMqNgIjd(dc`W4gJ_9*o zw)SKu?*}=(ji^9w-owvi@}ZE^yAUyuz<1gz2WYIVEUKVUK<_o0y_kA6y|rmF)gX}>cnJm2n}+0p8NoCrmypvNio6NZ znS3|o^p0hQUVptto0&o>6k=dN@05PxWAJK=!5vJWLKh%#OtqZB)y_q%Y(VLCtt1~7RL0D9Szk8|@)9kb1&SRWV)ePXg>j&rI25SurnVquA&1y^zTxL8K8R#|EK%|=s=`|)N{hN#zLO%ui z8BD*L$w@zBoEZUCDA3%@5M?os%ORfwCJSb#UBu*PAWuYrW~U{GYuQvzoi3N@ z`;%|ZM@^6PVMqp`hs{r1@{?yW=!(kj7eVE z!hQ5MTww{e7Emaf!S`qKuiDDsTcPT;wsO#|c=dK$`OK|&e95roR+tha58Voj?vEml z`su?06Qg#}MwNh(nXfQ>e^Fh|# z$R52q=#d+(<4Mq4hciW6XML`x{%OkpP8N;LoVs%@4i_{25c>2MeMjWc`Zt{k?O+OI zFD26~P!(s9;6Q5q#^iQQZP0%BKem5dp+zH)yP2a@Sntqzd7VfJPO){$1%p_;7P_*UY}_m2T4AF zG0FEbCV5E<8_zhaS`zf@+RKc|Ks{qJ(8QSJIn!G^kjt3l#f&Nc4wKDyaq?!gHn5s8 z8JIY;wLF_K$v4gN$ca5)OZbTfN-#FFNp>6h=zn^R%a{T3@UVsbXL|}D`3S~jzl<@- zD;O*In!(&m2WoXW^?%)g%&gW06k2$zg-=>|#+=sq)1GO~wHD6KCOMUFIIves(7D~c zJZ5sLamrjz0bTE*zlc8n)i%56Zjn=d?F(S7e5|g&fr97phJOFaX_>k3Mp}!(bc?}z zK0wn;$N&2CvzsixDUwxnKC`C5SQQh(bM01>u4EUh!JfBL>|zVJn(6Pea0Qs#quS#8 z>9O^pZd!{?vtK}M34%nkt9gcz%YsJP3K;(Y{WTVSxYlBi^fxhXkJl#PD!16bC?5B)CN61t@xQGHxZWZhJIq&9;kyn+mKEE%$xoC;XP_)X|9vFPVAIq4TLu7Lg;rthYy zVKq~r44W8VL53|X1L<#Oa?;Rbm*VA=$~tm8_Uh*mIPHSMuzK_4A+>P3aDkg75cX=`t?js`nGwVsp%;6 zeZg9vpyh@_>cbQ$Lr2CxBExXwIc*^Hy^(XJw|;?597dLK5}^O5h+g>hl=0k`&Gh%cCio%rxo2m1Ty4-D}+9dN&XUeIac@t&44QY3ZCO996by! z2R~xGTtEe$2AlSXzX31CDRnwd(uscrf2hBF;MNjsxb&y15;_NOk8_sxVD0gVqH{1f z&p7LI2%G2up34dx2A+!LC(dwa9C!u;cy!Ai(vDk6bCLEu7igmKi$$G`#*!}+Zb)R zqXZl7uC#-Ph>WJt5nROD5LYPT%|QJsgY<`hJrSvC9tr-1MdV5FhpKQ@X!h)4HrQ+u zYT^apPF;)}Z)7mvqOcbH2wwFZWH|IHm_F>fZ1CT}i*fbY$Ka#j?{E@EmqBFjD{#$N z;m9?(7QBEpLE8?vED8{A7lo`nI$38Vyb|VVf}Y^1UY<_(8!&w;MWcgiFdmG7<)Z%` z!bfC*!_fp=!Q{XTU|!>O;15|R-wZxF*sZrQWq1b(>u{o7YZy2NKK``F;5qOSoP>=v zIIs^1w=u49&_Z|yKj^PZ zP=QpySK$4uQ~nH|%7$4RT-p{!ne#?l(E)5mz=2^MPM5yMpQdpLU(vS{`u{)-BPxLk z7zu@$XaZ_u;wQJ8c=5NAMrurI1s3)Q3Lm zgz-NI31*GIgu+qQOMe9OaeN0n6X&&842S$X;|4lLL6pJ4;Nz@`V!(4)gdPSj!PTWX zZ;W*#0Yj(7fl1(UbTYb~K@pe{0l0Tw1fpSR{21=y+g z1(_31O>;*ucQ^!mlvN-Wd>x;L3^4LP2>#5FlF2ccPNNHw!2t0%> z$3wy4=mR#xfycnwyn^!KmQBn;LO0yzOf(dhf0y7@a!!xeJ;IAldIwocyT-YbrNs{mfuNe!kv1j(<<-*p3o9G=;Ch`!VkO7+eEhkm)(c^TV0TY1U~w5*rTF)EffUZYdx?Rj4o66JbRR z2Zy`c3&$y=fGJ3zzsNSx;OXF*Xfv}-=YxMi2z9w#Yy$HFw}D?l4Nd*s7WsbgH5Sp2 z!0t{M2IesP5((Z|o%CLfSM9+3oUH*&ABJx*91IA-Nh?lZ1{fR)UV`UZyNzKu6wLFF z275+XTk&WJ#vfOh35DBZ^pH~s^T3(L4GIe3Ixt_JcY=GuVYAbffw38DgSR*ihEB^l z;pfEA-)lI0B?SGShp-w7DVPaqoQ7kjYXWn*cPQ3-YV!b~?3KF9i>Wq7oZGO!bnrQqvqF?tou9ohwkyDt2XQvAezi~K$Cn;4b} zkdwoeVEXF;q)+U=f`kvz>$e&SKZEIy-SjZ{F1Q_=$$Z1GzGGD68uBo({s+Z$g9%{n z;2<#1p90>88+XZiez%xv$?z0dqP~(+zjST)Xs&e79lp*1{ZiLPQz0S zdkNr?7$tcI4+FRK0b2hjA%S1X%mtrrgNex)M)}~yY#vw-_Dm$Icon>a^_jnc6-Bu8 zCbf%C!1?U_;ylUl}U&KV>G}te^b*BjelR=2JnGIjq3HmdV zc0<1hX|#%F}C?g0qZaN#}f< zz3~ymdIOHv7P-76o1Y1-M;X z&sy-4MczbmHcC1~V5&whpKLe~4Bmn!ykKx7cq6SHC|`@fa3q{!bMttxf^lDE$Y+Ar zuyI>J2C!BPHstHUzdVCssp$5$fkV(I%(dWcFmI9r;JI+nJ=8F890@h76I}#<+%im5 zaUINWsr(9l6TRGA9lawlD$vUxH0<3E9@4>cT@VZA4m_lDk~R}jn+!$*{@{dbgJ!@k z9tS^)<<>l7nFX$K3datk05N@fZc;+(jF|_PJCsApfi;0jTHB(pLX?k+9&;%V7k%nd zIu~tnDUPB`E+wSspiAjew8N!zEZP~W3@fT|D$b${p~|A7bz#b1iyB?Z@&g;gmDiO6 zk4Gve)S^DoO3$J)Aaa>Km^d@ha-@ppsnl z?1M^XQPqRWrw87DNV%-|&UtR(Z|5vrFi;dFgejd5eA`zEREp~RDTCFZxkdf@E1|yh z2Ty{Q;n{J~)BTk&?XSCLyil~FztUYPF4}{G4Urg7^f?LX= __HeapLimit), region RAM overflowed) 0x00000001 ASSERT (((__binary_info_header_end - __logical_binary_start) <= 0x100), Binary info must be in first 256 bytes of the binary) -LOAD CMakeFiles/test.dir/test.c.obj +LOAD CMakeFiles/test.dir/test.cpp.obj +LOAD CMakeFiles/test.dir/SX126x.cpp.obj LOAD CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj LOAD CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj LOAD CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj @@ -2663,7 +2790,8 @@ LOAD CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS LOAD CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj LOAD CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj LOAD CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj -LOAD /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccxB0Kde.o +LOAD CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj +LOAD /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccESsim2.o LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libstdc++.a LOAD /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libm.a START GROUP @@ -2687,111 +2815,116 @@ LOAD linker stubs .ARM.attributes 0x0000001e 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtbegin.o .ARM.attributes - 0x0000004a 0x2c CMakeFiles/test.dir/test.c.obj + 0x0000004a 0x2c CMakeFiles/test.dir/test.cpp.obj + .ARM.attributes + 0x00000076 0x2c CMakeFiles/test.dir/SX126x.cpp.obj + .ARM.attributes + 0x000000a2 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj .ARM.attributes - 0x00000076 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj + 0x000000ce 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj .ARM.attributes - 0x000000a2 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj + 0x000000fa 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj .ARM.attributes - 0x000000ce 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj + 0x00000126 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj .ARM.attributes - 0x000000fa 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_sync/sync.c.obj + 0x00000152 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj .ARM.attributes - 0x00000126 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq.c.obj + 0x0000017e 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj .ARM.attributes - 0x00000152 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.obj + 0x000001a0 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj .ARM.attributes - 0x00000174 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/lock_core.c.obj + 0x000001cc 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj .ARM.attributes - 0x000001a0 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/mutex.c.obj + 0x000001f8 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj .ARM.attributes - 0x000001cc 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_sync/critical_section.c.obj + 0x00000224 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj .ARM.attributes - 0x000001f8 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_time/time.c.obj + 0x00000250 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj .ARM.attributes - 0x00000224 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_timer/timer.c.obj + 0x0000027c 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj .ARM.attributes - 0x00000250 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/common/pico_util/pheap.c.obj + 0x000002a8 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj .ARM.attributes - 0x0000027c 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_uart/uart.c.obj + 0x000002d4 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj .ARM.attributes - 0x000002a8 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.obj + 0x00000300 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj .ARM.attributes - 0x000002d4 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_pll/pll.c.obj + 0x0000032c 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj .ARM.attributes - 0x00000300 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.obj + 0x00000358 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj .ARM.attributes - 0x0000032c 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.obj + 0x00000384 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj .ARM.attributes - 0x00000358 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_runtime/runtime.c.obj + 0x000003b0 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj .ARM.attributes - 0x00000384 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_printf/printf.c.obj + 0x000003dc 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj .ARM.attributes - 0x000003b0 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.obj + 0x000003fe 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj .ARM.attributes - 0x000003d2 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.obj + 0x0000042a 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj .ARM.attributes - 0x000003fe 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_divider/divider.S.obj + 0x0000044c 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj .ARM.attributes - 0x00000420 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_aeabi.S.obj + 0x0000046e 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj .ARM.attributes - 0x00000442 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_init_rom.c.obj + 0x0000049a 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj .ARM.attributes - 0x0000046e 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim.S.obj + 0x000004bc 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj .ARM.attributes - 0x00000490 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.obj + 0x000004de 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj .ARM.attributes - 0x000004b2 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_aeabi.S.obj + 0x00000500 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj .ARM.attributes - 0x000004d4 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_init_rom.c.obj + 0x0000052c 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj .ARM.attributes - 0x00000500 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim.S.obj + 0x0000054e 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj .ARM.attributes - 0x00000522 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj + 0x00000570 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj .ARM.attributes - 0x00000544 0x22 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj + 0x00000592 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj .ARM.attributes - 0x00000566 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj + 0x000005be 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj .ARM.attributes - 0x00000592 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj + 0x000005ea 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj .ARM.attributes - 0x000005be 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj + 0x00000616 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj .ARM.attributes - 0x000005ea 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.obj + 0x00000642 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj .ARM.attributes - 0x00000616 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.obj + 0x0000066e 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj .ARM.attributes - 0x00000642 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.obj + 0x0000069a 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj .ARM.attributes - 0x0000066e 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj + 0x000006c6 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj .ARM.attributes - 0x0000069a 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj + 0x000006f2 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj .ARM.attributes - 0x000006c6 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.obj + 0x0000071e 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj .ARM.attributes - 0x000006f2 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.obj + 0x0000074a 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj .ARM.attributes - 0x0000071e 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd.c.obj + 0x00000776 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj .ARM.attributes - 0x0000074a 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/device/usbd_control.c.obj + 0x000007a2 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj .ARM.attributes - 0x00000776 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj + 0x000007ce 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj .ARM.attributes - 0x000007a2 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj + 0x000007fa 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj .ARM.attributes - 0x000007ce 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + 0x00000826 0x2c CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .ARM.attributes - 0x000007fa 0x22 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccxB0Kde.o + 0x00000852 0x22 /var/folders/n7/t1959y0j4_gczygmz5tcw0qc0000gn/T//ccESsim2.o .ARM.attributes - 0x0000081c 0x1e /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) + 0x00000874 0x1e /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/libgcc.a(_dvmd_tls.o) .ARM.attributes - 0x0000083a 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-strlen-stub.o) + 0x00000892 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-strlen-stub.o) .ARM.attributes - 0x00000866 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtend.o + 0x000008be 0x2c /Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/13.2.1/thumb/v6-m/nofp/crtend.o .comment 0x00000000 0x44 - .comment 0x00000000 0x44 CMakeFiles/test.dir/test.c.obj + .comment 0x00000000 0x44 CMakeFiles/test.dir/test.cpp.obj 0x45 (size before relaxing) + .comment 0x00000044 0x45 CMakeFiles/test.dir/SX126x.cpp.obj .comment 0x00000044 0x45 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj .comment 0x00000044 0x45 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/pico_platform/platform.c.obj .comment 0x00000044 0x45 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_claim/claim.c.obj @@ -2828,6 +2961,7 @@ LOAD linker stubs .comment 0x00000044 0x45 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.obj .comment 0x00000044 0x45 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/tusb.c.obj .comment 0x00000044 0x45 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.obj + .comment 0x00000044 0x45 CMakeFiles/test.dir/Users/michaelshipman/Developer/command_module/Code/BITS/BITSv5/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj .debug_line_str 0x00000000 0xd2 diff --git a/Code/BITS/BITSv5/test/build/test.hex b/Code/BITS/BITSv5/test/build/test.hex index 98f90474..4246ae52 100644 --- a/Code/BITS/BITSv5/test/build/test.hex +++ b/Code/BITS/BITSv5/test/build/test.hex @@ -28,2053 +28,2294 @@ :1001A000CD010010CD010010CD010010CD010010D7 :1001B000CD010010CD010010CD010010CD010010C7 :1001C00000BE00BE00BE00BE00BE00BEEFF3058054 -:1001D000103800BEF2EB8871547300107C7300106D +:1001D000103800BEF2EB8871AC810010D4810010A1 :1001E0003402001090A31AE700201F49086006C8D7 :1001F00081F3088810471D48006800282FD10DA4FE :100200000ECC002902D000F012F8F9E71849194A7B :10021000002000E001C19142FCD1174988471749ED :1002200088471749884700BEFDE701C901C29A42C5 -:10023000FBD370477C730010C0000020F80E002034 -:10024000B48100100000042000000420B4810010DC +:10023000FBD37047D4810010C0000020BC0F002009 +:10024000D09000100000042000000420D090001086 :10025000001004200010042000000000704709482E -:1002600003F054FA0047000008ED00E0000000D061 -:10027000F80E00208C1C0020691E001009030010DD -:100280005D1F00105756000006005250ABB360537C -:10029000EC6E001006005250861C0302FC6E00102B -:1002A000060052505422A29D046F001005005250C7 -:1002B000DE65F468B4810010F8B5C0460648074909 +:1002600004F0A6F80047000008ED00E0000000D010 +:10027000C00F00206C1D00200D2B00100903001082 +:10028000012C00105756000006005250ABB36053CB +:10029000447D001006005250861C0302547D00105D +:1002A000060052505422A29D5C7D00100500525061 +:1002B000DE65F468D0900010F8B5C04606480749DE :1002C000091A8B10C90FC91810B5491003D0044B77 -:1002D000002B00D0984710BDF80E0020F80E00202B +:1002D000002B00D0984710BDBC0F0020BC0F0020A1 :1002E00000000000054B10B5002B03D00449054861 :1002F00000E000BFFFF7E2FF10BDC04600000000B5 -:10030000101C0020186E0010F0B5C64600B504F0B1 -:10031000ABFAD025002000F03BF801232D066B62DC -:100320000C4B012698460C4C0C4F2100226840468D -:1003300004F08EFA380004F099F9FA206E6180001A -:1003400000F0D2FEFA20AE61800000F0CDFE043451 -:10035000EBE7C046186E001000F0FF10306E001082 -:10036000094A10B594464024830063441A68C000CB -:100370006240803414408022520113431C60034BBE -:100380009C466044416010BD04C0014000400140F3 -:100390000123D0228340120693629361094A4021CF -:1003A0009446830063441A68C0004A40803111407B -:1003B0008022520113431960034B9C46052360447D -:1003C0004360704704C0014000400140024B186880 -:1003D0008007C00F7047C04600C0064070B5EFF3FD -:1003E000108C72B60D4D2B68002BFCD0BFF35F8FC5 -:1003F0000724CB08C618C05C01230C40A3401C0096 -:100400000440034207D118433070BFF35F8F2C6064 -:100410008CF3108870BD100001F0A4FD2C0100D0F9 -:10042000F8B54746CE46884680B5EFF3108C72B6D5 -:10043000214D2C68002CFCD0BFF35F8F9A422CD842 -:10044000D4080727055D061901241740BC402C423B -:100450001FD007210127894609E0D408055D061948 -:100460004C4639001440A1400C00294211D0013201 -:100470009342F2D201204042BFF35F8F00220E4B25 -:100480001A608CF3108800280FDBC0BCB946B04658 -:10049000F8BD254310003570EEE7BFF35F8F0023F2 -:1004A0002B608CF31088012040424346002BECD097 -:1004B000089801F057FDC0462C0100D00021044BE4 -:1004C000044ABFF35F8F02C39342FAD17047C0461C -:1004D000000100D0800100D0044A1078431CDBB238 -:1004E000172B00D9102313707047C046E80D002069 -:1004F00010B5064B064C82B00100009318221F2352 -:100500002000FFF78DFF02B010BDC046406E001006 -:100510008C17002001238340002904D0034A136074 -:10052000034A13607047034A1360FBE780E200E070 -:1005300000E100E080E100E001238340014A136014 -:100540007047C04600E200E0084B10309B68800016 -:10055000C358002B07D0064A00209B1A2F229A422C -:100560004041C0B270470020FCE7C04600ED00E00B -:10057000EC0D0020024B10309B688000C058704783 -:1005800000ED00E070B50D00EFF3108672B60F4A73 -:100590001368002BFCD0BFF35F8F0D4B10309B68AE -:1005A00084001B590B4A934203D09D4201D001F0B5 -:1005B000F1FC074B9B681D51BFF35F8FBFF35F8F4B -:1005C0000022024B1A6086F3108870BD240100D00F -:1005D00000ED00E0CD010010F0B557464E46DE4676 -:1005E0004546E0B585B0060000911700EFF3108B8B -:1005F00072B66A4A1368002BFCD0BFF35F8F0025E8 -:10060000674B5D579A46002D00DAA9E06B00654CF8 -:1006100001935B199B009846A146C1444B46524644 -:100620009B7910361370604BB6009B6899590B1B71 -:100630002F2B33D95D4B994200D0ACE0019B424651 -:100640009C465B4B6544AD0063535A4B0232A21883 -:10065000043B9B1A1B05584A5B0D651913436B80BD -:10066000564B0121AB80FF23AB71009BEF71AB6058 -:100670004B460B4319004C4B9B689951BFF35F8F5E -:10068000BFF35F8F0022454B1A608BF3108805B0D3 -:10069000F0BCBB46B246A946A046F0BD01200A0008 -:1006A0008243D3798C46BB4231D845461300444936 -:1006B0001B1B5B415943090D3D4B63533D4B0235B9 -:1006C0006519043B5B1B1B053B4D5B0D2B43AA4689 -:1006D0004D466B800425AC465546E044131F444408 -:1006E0001B1B1B055B0D1D434B46997100999D809B -:1006F00099604946DF71334B01431360BBE75800F3 -:10070000C01880002018C179B9422FD902000623F1 -:10071000D356002BF3DA02932B4B61460393131D40 -:100720009A4604235B429C46E14450464B461B1AC2 -:100730001B055B0D9C46204B9571984663464046D1 -:1007400003439380019B5A199200039BA418A38032 -:10075000029B1C4AA371009B2260E771A3608AE799 -:1007600001F018FC002553465D574FE7908802932F -:100770004005131D9A46031561469C464046D444E5 -:10078000634604302018181AE0230005400D1B02B0 -:1007900018430390C5E701F0FDFB4FE7240100D0AB -:1007A000851C0020EC0D002000ED00E0CD010010C4 -:1007B00000A1FFFF1C0E002000E0FFFF01BDFFFFB6 -:1007C000AAAA00000148804701BD0000F0B5DE463E -:1007D00057464E464546E0B50C0083B0EFF310880F -:1007E00072B65D4A1368002BFCD0BFF35F8F5B4B82 -:1007F0005B499A68030010339F00D5598D4239D068 -:10080000A5424AD0574EAA1B2F2A33D8012292461E -:10081000824091464846544A12681040019048462A -:10082000524A1060BFF35F8FEFF305829346002AB0 -:1008300035D0934201D001F0ADFB2A0053469A43D4 -:100840009068844208D175E04B005B189B00F31858 -:100850009868A04234D01A00062151560029F3DAD4 -:10086000844253D0019B002B26D04A46404B1A604D -:100870003D4B1A60394B9B68DD51BFF35F8FBFF36F -:100880005F8F0022344B1A6088F3108803B0F0BCED -:10089000BB46B246A946A046F0BD0D00EAE72A00D5 -:1008A00053469A4390688442D6D1062010561300CE -:1008B000002809DA0D0031E04A462C4B1A60D9E7CE -:1008C00006201856002822DB4200111889007418EF -:1008D0008A46A1689960E179D971062161569971BA -:1008E000002925DBA488F11A64052415544409194C -:1008F000E0240905490D24022143998013181D4A5B -:100900009B001178F31899711070ABE713005946EA -:10091000002914D1FF3191711749918015490A7846 -:100920009A71164A9B1B5B415A43120D0A7099E754 -:100930001349E2E70620105613000028C4DA114AD2 -:100940001149D21A083A5002400D014399800F49CB -:1009500052080A43DA8085E7240100D000ED00E068 -:10096000CD010010EC0D002000E100E080E100E08E -:1009700080E200E0851C002001BDFFFFAAAA000064 -:1009800001BD0000260E002000F0FFFF00F8FFFF71 -:1009900070B5EFF3058101240443EFF3108C72B6B8 -:1009A000214A1368002BFCD0BFF35F8F1F4B05005B -:1009B0001F4AED1A6D416A43120D1E4D8900AE6843 -:1009C00052B27658A6421CD00621595691421CD0EC -:1009D00012215956914222D01E215956914220D0BF -:1009E0002A2159560324914210D0134B19781A70BA -:1009F0008171BFF35F8F00220B4B1A608CF310885C -:100A000070BDAB680D4C5C50EFE700246100091924 -:100A100089005B18FF21997109499980E5E7012454 -:100A2000F4E70224F2E7C046240100D0EC0D0020D8 -:100A3000AAAA000000ED00E0851C0020CD010010F6 -:100A400001BDFFFF054B064A1360064A1360536061 -:100A50009360D3601361536193617047808080809D -:100A600000E400E004E400E010B5084B084C82B05C -:100A700001000093002205232000FFF7D1FC00288D -:100A800001DB1F23181A02B010BDC0465C6E0010B7 -:100A90008A1C0020024B9C4661448900016070471B -:100AA0004000003410B50400FFF716FD01002000DF -:100AB000FFF7F0FFFF232371BFF35F8F10BDC04628 -:100AC00010B50400FFF708FD01002000FFF7E2FF6A -:100AD000FF23A380BFF35F8F10BDC04610B5040095 -:100AE0000120FFF705FD034BC3189B002360BFF3F4 -:100AF0005F8F10BD40000034034B9C466144890069 -:100B00000160BFF35F8F70474000003483680B487B -:100B100010B58446614462441201090159189B18BA -:100B20005C684A680120944201D802D00020C0B21B -:100B300010BD1A680B689A42F9D8F7E7FFFFFF0F5C -:100B40000A4B1968EFF3108072B60A68002AFCD0CD -:100B5000BFF35F8F1B68BFF35F8F00221A6080F3C3 -:100B6000108840BF002000217047C0464C1C002068 -:100B7000F8B5574645464E46DE46E0B598460CABBE -:100B80001C780DAB1B78070091469A460568002C2F -:100B900059D1AC7B002C3BD0660029683619033E46 -:100BA00089194B78AB73002B00D1EB7300238B704A -:100BB0004B700B702D4BE218BB6812019B184A4614 -:100BC0001A6042465A600A9A9A600B9ADA600023C9 -:100BD0008B704B700B706B7B9B46002B26D02200DA -:100BE0006B685946A86898475B465B005B442A6877 -:100BF000033B002812D058469619B070D118D35C28 -:100C0000002B00D073705B460C706B735C450ED08C -:100C1000F0BCBB46B246A946A046F8BDD3189C70AE -:100C20009119925D002A1CD15B460B706C734A4689 -:100C30004346387D00F0D8FB051E0AD10E9B002BE1 -:100C4000E6D01D70E4E7660029683619033E89196D -:100C5000B0E75346002BF1D12100386800F0DCFDED -:100C6000ECE75A705B460B706C73E0E7FFFFFF0F19 -:100C7000F0B5DE4657464E4645460023E0B58BB0FC -:100C80000893684B8200D45800239B46099000F0DB -:100C900017FB02000B006068EFF3108A72B656462D -:100CA00001680029FCD0B246BFF35F8F21684F7BFB -:100CB0008C46002F2ED0A5685B49A94679180901FA -:100CC000894449460868496805000E00AD1A9E41EE -:100CD000002E5FDD02000B00099800F085FB002369 -:100CE00000229946002306920793002398466368E2 -:100CF000BFF35F8F5A461A608AF310884346002B71 -:100D000012D10028C3D10BB0F0BCBB46B246A946F5 -:100D1000A046F0BD002300229946002306920793C7 -:100D2000002300209846E2E7089B49461802384312 -:100D3000C047626805000E00EFF3108A72B61368B0 -:100D4000002BFCD0BFF35F8F002E41DB2B00334321 -:100D500002D02369002B56D12368D97B002905D006 -:100D60001A68480041185218033A57709A7B002AB3 -:100D700000D19F73DF73E268013FD35D0133D35528 -:100D80005B4623616368BFF35F8F5A461A608AF33C -:100D900010887CE7002E02D1002D00D09AE70021B8 -:100DA000604600F0B7FC4B461A685B6806920793F2 -:100DB0004B469B6898464B46DB689946E368DB19CF -:100DC000013B1B7808931B020343236100208EE73D -:100DD0002369002BC0D0069A079B8021521BB34188 -:100DE00009068B4202D30122104B5242002104918A -:100DF000013103914946019141462000029700913B -:100E0000FFF7B6FEBCE700F05BFA2A0033001218C9 -:100E10004B41802109068B42E8D30122034B524209 -:100E2000E4E7C046301C0020FFFFFF0FFFFFFF7FFD -:100E300010B5144C6368002B04D00A211248FFF748 -:100E400029FE10BD2300114A1021206800F07EFB0E -:100E5000032000F029FA032000F02EFB03200C49A8 -:100E600000F07CFAFFF738FB0A4B9C4603232375FE -:100E7000D0231B061B6860446375074B80006060CD -:100E8000DC60DAE7340E00204C1C00200D0B001053 -:100E9000710C001040000034301C002000487047E6 -:100EA000340E0020F0B557464E464546DE46E0B5C6 -:100EB00085B0019310AB1B780600039300239A467C -:100EC000984600927268EFF3108B72B61368002B8D -:100ED000FCD0BFF35F8F3568AC7B002C00D16EE097 -:100EE00067002B683F19033FDB195A78AA73002A61 -:100EF00000D1EA73484AA118B26809015218009853 -:100F00000199106051600E9991600F99D16042462D -:100F10009A705A701A706B7B9946002B00D16BE067 -:100F200022006B684946A86898474B465B004B44D3 -:100F30002A68033B002856D04846D719B870D11804 -:100F4000D35C002B00D07B704B460C706B734C4510 -:100F500053D0F3681B19013B18787368BFF35F8F98 -:100F600042461A608BF310885346002B08D10002CA -:100F7000204305B0F0BCBB46B246A946A046F0BD32 -:100F8000039B002B46D00E9B00200F99984703002F -:100F90000B433FD004000D1E1ADA009A019B121B6E -:100FA000AB410092019380221206934204D30123A5 -:100FB0001A4C5B4200930194039B9A4682E7736844 -:100FC000BFF35F8F1C608BF3108801204042D0E795 -:100FD00000F076F980220019694112060090019113 -:100FE0009142E9D3E3E7D3189C70D119D25D002A6E -:100FF00000D05A704B460B706C73307D009A019B89 -:1010000000F0F2F982460028A3D02100306800F0F9 -:1010100003FC9EE70020ACE7FFFFFF0FFFFFFF7F11 -:10102000407D7047F0B504000D0006267642F717A4 -:10103000C64636196F4100B584B08F4214D811D01E -:1010400000F03EF932003B00121A8B41002B15DCF8 -:10105000002B3ED02000290000F070F904B080BCC5 -:10106000B846F0BD8642EBD90026002700F028F9EB -:1010700032003B00121A8B41002BE9DD0023029362 -:101080000193154B3200009314483B00FFF70AFF11 -:101090000028DFDB00239846BC46114A114F7B6ACB -:1010A0009C4504D8B96A8E42D4D99C45D2D11168E6 -:1010B000EFF3108072B60B68002BFCD0BFF35F8F8C -:1010C0001368BFF35F8F4146196080F3108820BF1B -:1010D000E5E7002ABED0D1E7410B0010340E002016 -:1010E0004C1C00200040054070B5060000F0E8F8F8 -:1010F000FA2204000D00002330000021920003F0CA -:1011000077F98023001969411B06994202D3012017 -:1011100002494042FFF786FF70BDC046FFFFFF7FD8 -:10112000F0B5EFF30583CE46474680B505000C00C9 -:1011300085B0002B12D02A4A0020536AA34203D361 -:10114000926A0130AA4204D305B0C0BCB946B04689 -:10115000F0BD1B1B5A1E9341D8B2F5E7214E0293F6 -:101160000193214B0200009330000B00FFF79AFE21 -:10117000031EE0DD20BF7168EFF3108772B60A68C6 -:10118000002AFCD0BFF35F8FDAB29446FF223068AA -:101190001A40417B61450FD001688946510088465D -:1011A00049469044414403398978002904D1326981 -:1011B000934209D1316107E0F1681B0A8A18013AAC -:1011C0001278DBB29A4207D07368BFF35F8F0022B8 -:1011D0001A6087F31088AEE7614600F01DFBF3E765 -:1011E00000400540340E0020410B0010F0B5EFF335 -:1011F0000582D6464F4646461000C0B51038EFF37C -:10120000108872B6214C2368002BFCD0BFF35F8F8F -:101210000123190081401E4D1F006963AA461D4D20 -:1012200029601D4D2E78AC463500C5402F402B421D -:1012300015D053465F6A194B8500EB589F4218D36F -:101240006246174B8E43EB581670BFF35F8F002238 -:10125000226088F31088002B06D0984704E0BFF383 -:101260005F8F276088F31088E0BCBA46B146A84675 -:10127000F0BD0C4B92009C46624413681360BFF3B0 -:101280005F8F0023236088F31088EDE7280100D0EA -:10129000004005403C700540891C0020581C00207F -:1012A0006C160020D03F054010B5034B010018001C -:1012B000024AFFF793F810BD841C0020786E0010DE -:1012C000034B596A0A00986A596A8A42FAD17047F0 -:1012D0000040054070B504000D00174A536A19001C -:1012E000966A536A8B42FAD13000190024184D4196 -:1012F000AB4216D813D0104B2A005B6A9D4203D92B -:101300000D494B6A9342FCD3934207D10A4A02E04B -:10131000516A994202D1916AA142F9D370BDA642A5 -:10132000E9D9054B5B6A1C005A1CEFD0012201244D -:101330006442E5175242E3E700400540064A536A1B -:101340009942FCD807D1044B02E05A6A914202D17B -:101350009A6A8242F9D370470040054070B5040094 -:101360000D00EFF3108672B61A4A1368002BFCD0FA -:10137000BFF35F8F002D1BD02000FFF7FBF816494D -:1013800081420AD02000FFF7FDF801212000FFF77D -:10139000C1F80123A340114A1360114BA400E5508A -:1013A000BFF35F8F00220B4B1A6086F3108870BD6D -:1013B0000121A1400A4BA200D5500A4B20001A7807 -:1013C0008A4305491A70FFF701FA00212000FFF750 -:1013D000A1F8E5E7280100D0ED11001038600540C4 -:1013E0006C160020891C0020F0B54F46D6464646B4 -:1013F000C0B507002B4C616A0D00A66A616AA9425C -:10140000FAD18B4208D805D00120E0BCBA46B146DB -:10141000A846F0BDB242F7D9EFF3108A72B622485F -:1014200001680029FCD0BFF35F8F0125BD401F4933 -:101430001C4C8846097889462943C9B28C464146E6 -:1014400060460870391D890065630A511849B80063 -:101450004350216A0020294219D0616A0800A66A17 -:10146000616A8142FAD18B4219D801D1B24216D8B1 -:10147000CC450BD00B4B1F221D625D6301233A400C -:1014800093400C4A136043464A461A700120BFF34A -:101490005F8F0022044B1A608AF31088B5E70020A2 -:1014A000F5E7C04600400540280100D0891C002017 -:1014B000581C002080E200E0EFF3108C72B60A495D -:1014C0000B68002BFCD0BFF35F8F01238340074ADA -:1014D0000748136202789A430270BFF35F8F0023BC -:1014E0000B608CF310887047280100D00040054045 -:1014F000891C002070B506000D00140000291DD0C5 -:10150000002A12D073688068984762006B00121935 -:101510005B193168033A033B002808D08A1895709C -:10152000C818CB5C002B0BD10470280070BDCB1801 -:101530009C7088188A5C002A05D105702000F5E7A8 -:1015400053700470F1E75A700570F7E710B58360C7 -:101550000023CCB243730133426004738373C473BA -:101560000068421C012C05D90133DBB21370033231 -:101570009C42F9D1FF230B405A00D318C018002316 -:101580000338437010BDC04670B505000C1E07D06F -:10159000630001681B19033BCB185A78002A01D15C -:1015A000200070BD500080180338091800204E78C4 -:1015B0004870210058702800FFF79CFF310004009C -:1015C0002800FFF7E1FF0600002C20D00028E7D01C -:1015D000320021006B68A868984772006300921976 -:1015E0001B192968033A033B002808D08A18947015 -:1015F000C818CB5C002B00D053700670D0E7CB1816 -:101600009E7088188A5C002A00D05A7004703400DA -:10161000C6E7C046F0B557464546DE464E46E0B5FD -:101620000D006F0001687F19033F0400C85D83B09F -:101630000192CA19002850D043001B18033BCB1855 -:101640005E78B446002E1AD1019E002E42D0E67B71 -:10165000002E04D073009B19CB18033B5D70A37B55 -:10166000002B00D1A573E57300282FD10023537000 -:1016700003B0F0BCBB46B246A946A046F0BD72001E -:101680006244033A8A18517888460021517089468D -:101690005970320001002000FFF72CFF43468246BC -:1016A000002B07D05B0021684344033BCB185A78DA -:1016B000002A16D1424651462000FFF71BFF216841 -:1016C000019BCA19002BC2D10028CFD043001B18A0 -:1016D000033BCB1800219970C8E7019B002BB6D1C2 -:1016E000C4E75000801803380918487883464846F4 -:1016F0004870587041462000FFF7FCFE594680466E -:101700002000FFF741FF414602002000FFF7F2FEF4 -:101710008046CFE7F0B557464546DE464E46E0B533 -:1017200083B00191457B04006F0000687F19033F7F -:10173000C15DC219002952D04B005B18033BC3188E -:101740005E78B446002E1CD1019E002E44D0E67B6C -:10175000002E04D073009B19C318033B5D70A37B5C -:10176000002B00D1A573E573002931D10023280097 -:101770005370617303B0F0BCBB46B246A946A046A5 -:10178000F0BD72006244033A82185078804600200F -:1017900050708146587032002000FFF7ABFE434680 -:1017A0008246002B07D05B0021684344033BCB18E3 -:1017B0005A78002A17D1424651462000FFF79AFE78 -:1017C000019B01002068C219002BC0D10029CDD097 -:1017D0004B005B18033BC31800209870C6E7019BC1 -:1017E000002BB4D1C2E7500080180338091848789C -:1017F000834648464870587041462000FFF77AFEFD -:10180000594680462000FFF7BFFE414602002000F7 -:10181000FFF770FE8046CEE770B5050000292CD09A -:10182000437B8B422ED04C0000686418033C0419A3 -:10183000A278002A21D053009B18033BC25CC61833 -:101840008A4202D11BE0002A08D053009B18033BB8 -:10185000C3185A788A42F6D162785A70002301225E -:101860002800A3706370FFF7D5FE697B0200280093 -:10187000FFF740FE6873012000E0002070BD637830 -:101880003370EBE701221900FFF7C4FEF2E7C04610 -:10189000F8B5CE464746040080B506200D0000F09E -:1018A00021FA061E53D0534B5349E3185A1E934155 -:1018B0008022120494465B429B0D504A9B05634470 -:1018C00013604F4A136018008A689043FBD1494B5C -:1018D0004C4AE31859424B4180215B0049000620E5 -:1018E000995200F0FFF92900C00001F069FFC30917 -:1018F00032D14022012190466162A362266BF30738 -:1019000036D427008025E36A00232C376D013D4340 -:101910002B600620266300F0E5F94146800001F0C7 -:101920004FFF236B06009846DB073BD46023E26A37 -:101930005A400E3313402B6043462363802310220A -:101940009B013B431A60304B23630323A3643000A5 -:10195000C0BCB946B046F8BD2C4A93423FD90023DB -:101960002B492C4A6162A362266B9046F307C8D5C7 -:101970002200C02330329B011343234A06201A6001 -:10198000656AA36AAD01ED1800F0ACF9224901F0D7 -:1019900017FFAD020100280001F012FF0021FFF740 -:1019A00099FCAEE72200C02330329B011343164A54 -:1019B00006201A60636AA26A9B019946914400F06E -:1019C00091F94B4614499B02994601F0F9FE01003A -:1019D000484601F0F5FE0021FFF77CFCA6E77F22D8 -:1019E00099018846024001325208190090441300C0 -:1019F00082E7C0460080FCBF00C0004000E000401D -:101A000000F00040681C002001030000FEFF000001 -:101A1000FFFF0000C0FF3F004E0E000010B50C207D -:101A200082B000F0B7F9FEF7D1FC002810D08B4B44 -:101A30008B488B498B4A186059609860D96018614F -:101A400059619861D961186259625A6202B010BD39 -:101A5000854CA06700F0F4F90122844B1A60636C96 -:101A6000012BFCD10322824B1A607F4A936B012B1E -:101A7000FCD1013301217F4A7F480093043300F0F9 -:101A800037F905237D4A009301217D4800F030F9A4 -:101A90007C4B5A68FF2A02D8802252005A6080226A -:101AA000734B6E4C12011A602169002907D06069DE -:101AB00001F086FE013043001B18033BFDD2E022FB -:101AC000704B714819680A4002600222196851403F -:101AD00001320A40042102609A681142FCD0802140 -:101AE0006A4A09011160802252005A60684B2361E2 -:101AF000684B5968FF2900D85A60032201215B4BCB -:101B00001A60644A93681942FCD0E02310680340CD -:101B100061480360126803234A40022113405D4A72 -:101B2000036093681942FCD080215C4B0901196065 -:101B300080215B4B4900516063615A4B5A68FF2A10 -:101B400000D859608022584B12011A60E1690029BF -:101B500007D0606901F034FE013043001B18033BDD -:101B6000FDD2E0234F4A11680B4050490B608021A1 -:101B70004F4B090119608021394B49005160E361E5 -:101B80004C4B5A68FF2A00D8596080224A4B1201F8 -:101B90001A60216A002907D0606901F011FE013046 -:101BA00043001B18033BFDD2E023424A11680B405F -:101BB00042490B608021424B0901196080235B0080 -:101BC00053608022264BD20223623E4B59689142D9 -:101BD00000D25A6080223C4B12011A60616A0029CF -:101BE00007D0606901F0ECFD013043001B18033B96 -:101BF000FDD2E023334A11680B4034490B60802149 -:101C0000334B090119608023DB025360154B63627B -:101C1000304B5A68FF2A02D8802252005A60802234 -:101C20002D4B12011A60A169002907D0606901F0EB -:101C3000C7FD013043001B18033BFDD2E023254ABA -:101C400011680B4025490B608021254B0901196063 -:101C500080235B005360124BA361F7E6F80E00206F -:101C6000006CDC021BB70000008000403CB000406C -:101C700030B00040002F685900800240008C864739 -:101C800000C00240308000403090004030A0004052 -:101C9000001BB7003C8000403C9000403CA000404E -:101CA000405973075480004054B0004054900040A5 -:101CB00054A000406080004060B000406090004050 -:101CC00060A000406C8000406CB000406C90004010 -:101CD0006CA000404880004048B000404890004060 -:101CE00048A00040014B8000C0587047F80E00200B -:101CF000F8B5040022481E0017000D0001F060FD39 -:101D00000100380001F05CFD069B36041B031E43F6 -:101D10002368002B22DB1B4B1B49E3185A1E9341FF -:101D20008022920194465B421B0B184A1B036344BA -:101D30001360174A13601F008A689743FBD1C022C3 -:101D4000231D92011A4321232560A060136023689C -:101D5000002BFCDA0823E6601360F8BD3F232268FD -:101D60001340AB42D7D1A3681B051B0D8342D2D1D0 -:101D7000EE22E368D2021340B342CCD1EDE7C04675 -:101D8000001BB7000040FDBF00C0004000E0004065 -:101D900000F000408023024A9B000343D362704757 -:101DA0000080054010B580241C4BE4051C60002811 -:101DB0001AD001231A4C18431A4BDC611A4C4440C8 -:101DC0001C62596298628021144BC905196017483A -:101DD00017490860E021C9041960002A07D1802250 -:101DE000144B12061A6010BD0E4BD861EBE753017D -:101DF0009B1A9B009A18802312015B049A4209D215 -:101E000013000D490B60074B5A608022094BD20525 -:101E10001A60E8E7094B1A00F3E7C04600B0054036 -:101E2000D3C007B0008005402D3FF84FFCFF0100F4 -:101E30000820014000A00540081C0020FFFFFF0013 -:101E4000AA23064A1B0113602F230549D360054BC3 -:101E500019605368002BFCDA7047C046004002400E -:101E600000B0FA00006002402C4B2D4A70B51A6099 -:101E70002C4A2D4B2D491A6014008B689C43FBD1D2 -:101E80002B4D2C4EB54208D2013E761BB60808CD2C -:101E9000984723000134B342F9D1FFF7BFFD264A2A -:101EA000214B1A60214A9368DB43DB01DD09002BDB -:101EB000F9D14022214B224C224E9A675A671A6769 -:101EC000DA66B44208D223682000002B20D0083400 -:101ED000FEF7F6FDB442F6D31B4C1C4EC022B1688F -:101EE000200002F0F5FAB460FEF7E8FAFEF7AAFD6A -:101EF000FEF79EFF164C174EB44208D2013E361B29 -:101F0000B60808CC98472B0001359E42F9D170BD28 -:101F10000834FEF7C7FDB442D5D3DDE700E000404A -:101F2000BFCDFBFEFE7F3C0000F0004000C0004043 -:101F3000E00E0020F00E0020FFFFFF0100F0014046 -:101F4000D80E0020E00E00200000002000ED00E090 -:101F5000F00E0020F80E002000BEFDE710B5FFF7E0 -:101F6000FBFFC0460FB400B5084883B002F07EFB0B -:101F7000049B002B07D005A91800019101F0A6FBD6 -:101F8000034802F073FB0120FFF7E6FF9C6E001090 -:101F9000AC6E001010B50148FFF7E4FFB06E001002 -:101FA0007047C046F8B55746DE464E464546E0B552 -:101FB00099460A9B07009A460D9B884693460B9CC0 -:101FC0009B073BD10C9B9C423DD21E1B0B941500E2 -:101FD0000C005E442A004B46013521002020B84702 -:101FE000B542F7D1A0460B9C002C20D045463619AF -:101FF0005346321B013C185D29004B46B847002C64 -:10200000F6D12B00350098460D9B9B070FD55B46FC -:10201000EC1A0C9BA3420AD9464698462A004B4626 -:10202000310020200134B84701354445F6D328005B -:10203000F0BCBB46B246A946A046F8BD1600150046 -:10204000002CD3D1E0E71600002CCFD11500EEE72D -:10205000F0B54F464646D646C0B584B098460EAB5E -:102060001B7894469946129B0D9C109F119E9A07CF -:1020700025D4002E65D1BC4221D201221A409246BD -:10208000202C00D1E9E00C9A551E302202E0202CD1 -:1020900000D17BE001342A55A742F8D85246002AE5 -:1020A0000DD0B4420BD20C9A551E3022202C02D1F6 -:1020B00071E0202C2DD001342A55B442F9D1DA0632 -:1020C0003CD55A052ED4002C28D10F9A102A00D1C5 -:1020D000B6E0022A00D1BCE030220C9C2270012420 -:1020E0004A46002A65D15A0700D499E02B220C9D5C -:1020F0002A55013403930C9B624600930296434693 -:102100000194FFF74FFF04B0E0BCBA46B146A846C1 -:10211000F0BD2024DA06EDD55A0503D4A74266D0D7 -:10212000B44264D00F9A102A71D0022A57D0202CC2 -:10213000E0D02200013430250C9FBD54202CD9D092 -:10214000CEE7012215001D40AA461A4236D04A4663 -:10215000002A4AD10C321A4247D1BC42A1D2202CCB -:1021600091D1202E17D82024DA06C3D55A051BD4C6 -:10217000202F01D0202ED5D11F220F9D102D6FD0E2 -:10218000022DD8D162250C9FBD54D0E75246002ABB -:1021900079D0202EBDD92024DA06ABD55A0503D438 -:1021A000202FE9D0202EE7D00F9A102AA2D1202488 -:1021B000A0E72D220C9D2A5501349BE7BC4200D399 -:1021C0007DE7202C00D05EE7DA06F0D55A05EED484 -:1021D000202F62D0202EEAD134001F22CDE7202C00 -:1021E00000D187E722000134CCE7013EB5E7621E4B -:1021F000012CC2D10F9A102A00D06AE79A063BD56B -:1022000058220C9C2270283A6270022468E79A06D1 -:102210000ED4202CCBD078220C9D2A55013486E791 -:102220001A0700D466E720220C9D2A55013461E785 -:10223000202CBCD058250C9A12191570013476E761 -:102240009A0608D558220C9C227030226270022413 -:1022500046E76032F7E77822F5E7002A83D1B3E753 -:10226000A21E013C9D0603D478250C9FBD5460E757 -:1022700058250C9FBD545CE778220C9C2270483A8C -:10228000627002242CE7DA0600D433E75A058BD4B7 -:10229000202F00D044E71F226FE73C001F226CE78D -:1022A00010B5002800D110BD02F094F9FBE7C0463C -:1022B0000B0010B5002802D049681B68984710BD74 -:1022C000F0B557464E464546DE46E0B599B08246E3 -:1022D000894690460893229A239B1000190001F02A -:1022E00030FD002800D0CDE0229823990122D94B5F -:1022F000524201F021FD002800D0C3E0229823992A -:102300000122D54B524201F009FD002800D0B9E06E -:10231000229823990022002301F000FD002800D01C -:10232000F1E1229E239F8023269ADB001A400D9222 -:10233000269A1A4201D1062324938023269A1B0150 -:102340001A403B0093460996334300D0B3E0002A7D -:1023500000D0C2E1002300240A930B94002304253B -:102360000993259B0024AB4200D95C1B0223269ACB -:102370001A400C92269A134203D06B426B415B4287 -:102380001C40099B002B07D00A9A0B9B3000390098 -:1023900001F063FC06000F0022982399002200231D -:1023A00001F0BCFC002803D0802109067B181F0027 -:1023B000269AAA4B009601971340089E0493249BEB -:1023C00003940293424633004946504600F0AAF96E -:1023D0000400002D67D02020269A494602401300B1 -:1023E0005A4253415B42621C18400A923300220059 -:1023F0004530D047099A6F1ED317D4185C40D30FCD -:102400009B46002501E0202D13D008AA94461F23E7 -:10241000200063440A2101355E1901F0D1F9303101 -:10242000317020000A2101F0CBF926000400092EAA -:10243000E9D805230693002304930A3303935B46EC -:10244000089E029310AB0A9A009349463300504607 -:1024500005970195FFF7FCFD0C9A0400002A22D095 -:102460004246851A259AAA421DD9B04657461600FB -:1024700022004346494620200135B8470134AE4288 -:10248000F6D810E0269B42460493259B49460393C9 -:10249000249B50460293229B239C00930194089B0B -:1024A00000F040F90400200019B0F0BCBB46B24671 -:1024B000A946A046F0BD6A4B78009C46400D60449A -:1024C00001F052FC674A684B01F0E5FB674A684B34 -:1024D00001F0BAFB674A3B031B0B1A4304000D00D3 -:1024E00009981100644B002201F0A5FB634A644B7C -:1024F00001F0D1FB02000B002000290001F0A4FB39 -:1025000001F04AFC099001F02FFC5E4A5E4B04008A -:102510000D0001F0C0FB00225C4B01F095FB01F0C7 -:102520003BFC5B4A5B4B29000C90200001F0B3FBA5 -:1025300004000C980D0001F017FC574A574B01F0AE -:10254000AAFB02000B002000290001F074FB04002C -:102550000D0002000B000A940B9501F09CFB040097 -:102560000D000A980B9902000B0001F06DFB002290 -:102570000E900F914A4B2000290001F06EFB0022C3 -:10258000484B01F061FB02000B002000290001F024 -:1025900064FB0022444B01F057FB02000B002000BB -:1025A000290001F05AFB0A9A0B9B0D0080210400C0 -:1025B000C905002001F03FFB02000B0020002900AC -:1025C00001F042FB02000B000E980F9901F045FB51 -:1025D0000022284B01F038FB344B0C9C9C46644491 -:1025E0002305002201F057FB04000D0002000B0040 -:1025F000300039000A940B9501F090FB00285DD162 -:1026000023002A00C625099963318D42AD41594600 -:102610006D420435002900D1A3E6134363D0300096 -:102620003900234A234B01F07FFB002807D000220A -:1026300030003900204B01F071FB002853D1249B5E -:10264000002B00D18DE60D9B5A1E9341249AD31A7C -:10265000249386E6FFFFEF7FFFFFEFFFFFF7FFFF0B -:1026600001FCFFFFFB799F501344D33FB3C8608B3D -:10267000288AC63F0000F03F0000F83F61436F63C7 -:10268000A787D23F71A379094F930A400000E03F2A -:102690001655B5BBB16B0240EF39FAFE422EE63F4C -:1026A00000002C400000244000001840FF03000000 -:1026B0002D431CEBE2361A3F80842E41099B0022F9 -:1026C000013B09932000164B290001F0C6FA0A00CD -:1026D000010003000A910B9294E7002300240A935F -:1026E0000B9400230993249A099B9A4214DDD31A70 -:1026F000013B24938023269ADB001A430023002504 -:10270000269209932DE6802212069446229B1E00F3 -:10271000239B63441F0006E600232493EAE7C04698 -:1027200000002440F0B54546DE464E465746E0B52B -:1027300095B08B46904699461E9A1F9B0A901900A9 -:102740001000209D01F0FDFA002800D0B0E11E9895 -:102750001F990122C74B524201F0E0FA002800D035 -:1027600037E11E981F990122C34B524201F0E4FA4F -:10277000002800D0A7E01E981F990022BF4B01F04F -:10278000DBFA002800D088E01E981F990022BC4B7D -:1027900001F0C4FA002800D07FE01E981F990022A3 -:1027A000002301F0BBFA002800D0FAE000230B93CD -:1027B0008023229C229ADB001C401A4200D102E1B5 -:1027C000092D00D87CE106A98C462C001722002395 -:1027D0003021093C62440133D154EF1A202B00D13F -:1027E00032E1A342F7D10022A44B069207931E9830 -:1027F0001F9901F0D1FA050001F0B6FA02000B00B2 -:102800001E981F9901F017FA069A079B01F043FAE8 -:102810000890099101F0E4FA060001F0A1FA020023 -:102820000B000898099901F006FA0022954B0890D0 -:10283000099101F081FA002800D1D2E00136300080 -:1028400001F08EFA069A079B01F06EFA002801D07B -:1028500000260135AA46002F00D098E0280001F09C -:1028600083FA02000B001E981F9901F0E4F9854BD2 -:10287000002206000F0001F051FA0CAB9A46002826 -:1028800045D10022300039007E4B01F055FA002876 -:102890003DD1EB073BD5013539E0229B42460493FD -:1028A000219B594603930A981E9B1F9C02950093F7 -:1028B00001944B46FFF704FD15B0F0BCBB46B24691 -:1028C000A946A046F0BD229B5B0767D403226E4B4E -:1028D00022990192039121990291009342464B461D -:1028E00059460A98FFF75EFBE6E706AA94461723C7 -:1028F000280063440A2101341E1900F039FF3031E9 -:10290000280031700A2100F033FF051E76D0202CFC -:10291000EBD10323229A1340012B1DD1219B002BC5 -:102920001AD00B9B002B00D0BBE0229A0C33134231 -:1029300000D0B6E0219BA34200D887E006AB9C46BE -:1029400017223023624404E02199013413558C424C -:1029500059D0202CF8D12024229B01940393219B51 -:1029600002935346B9E706AA944617230A21634403 -:10297000300001341D1900F023FF30312970300080 -:102980000A21013F00F01CFF092E46D90600202C29 -:10299000E9D155460CAB20249A46B8E704223B4BBC -:1029A00096E71E9A1F9B0020002101F044F90123A5 -:1029B0000B938023229C229ADB001E901F911C40C7 -:1029C0001A4200D0FCE60022314B062706920793FC -:1029D0000DE7229B0393219B0293042301932D4B2C -:1029E0007BE7002208980999264B01F097F9002807 -:1029F00000D02FE7002E4FD101362BE70323229A78 -:102A00001340012B66D0202CA6D00B9B002B1FD08F -:102A10002D235246135501349EE75546202CB9D03C -:102A200030233A19002F08D0172006A901340918BD -:102A30000B55202CAED09442F6D10CAB9A462E23E7 -:102A400052461355013462E72024CCE6202C83D073 -:102A5000229B5B0708D4229B1B0700D47CE7202322 -:102A600052461355013477E72B2352461355013450 -:102A700072E7C046FFFFEFFFFFFFEF7F65CDCD415F -:102A800065CDCDC10000E03FC46E0010BC6E0010EB -:102A900080842E41CC6E0010F30700D4DAE60136B4 -:102AA000D8E6219B013B2193A34200D946E7AAE740 -:102AB000229B0393219B029303230193074B0CE773 -:102AC000074BEA009B185C681B682F00069307946D -:102AD00000248CE6219B002B95D022E7C86E0010C5 -:102AE00080710010F0B55746DE464E464546E0B5CB -:102AF000A5B01F002E9B91460D93CA4ACA4B824631 -:102B00008B461A60002900D129E2002338789846C4 -:102B1000002800D12BE2C54B44460C93C44B5546CC -:102B20004E460E930AE0631C984622003300594635 -:102B3000A84744463878002800D187E00137252887 -:102B4000F1D108239A46043B9946023B9846013B43 -:102B500000229C460B943878791C0300203BDBB2A2 -:102B6000102B03D80C9C9B00E3589F460300303B7E -:102B70000B9C0B92092B3AD9002398462A2800D1A6 -:102B8000DDE000239A462E284BD00300683BDBB2E1 -:102B9000122B1ED80E9A9B00D3589F4663460F00F7 -:102BA0001A43D8E743460F001A43D4E74B460F00B9 -:102BB0001A43D0E710230F001A43CCE753460F0007 -:102BC0001A43C8E780235B000B9A78781A430B926C -:102BD00001310F0067284FD82428A4D90300253BD2 -:102BE000DBB2422B9FD893499B00CB589F460023D2 -:102BF00098460B9B47469C4600E00131BB00DB1921 -:102C00005B001F180878303F0300303B092BF4D9D4 -:102C100063460B930023B8469A460F0001312E28D5 -:102C2000B3D180200B9AC00002430B923022524253 -:102C3000944678780B0084446246092A00D8AAE1B9 -:102C40002A2800D1B9E10F0001319EE7A046AA462B -:102C5000B146C84503D301235B424B4498464B46DB -:102C6000424659460020D047200025B0F0BCBB4664 -:102C7000B246A946A046F0BD01006939C9B20F2984 -:102C800000D950E701238B409C466B4B9946634625 -:102C90004A4613400F9362464B461A4200D068E101 -:102CA0000A2956D0072900D03DE70D9B02CB984654 -:102CB000002900D092E10B9B10211A008A431000DA -:102CC00011310843814680201A00C00002401100E3 -:102CD00003421CD114AB9C461F220F2362440D9566 -:102CE0009C4615000F9B0B9402E0202B0CD011008A -:102CF00064460C4020003730092C00D807380133D7 -:102D0000E8540A090F29F0D80B9C0D9D0F934B46F0 -:102D10000822069353460592083203920022049338 -:102D20000F9B029201931CAB220000935946330083 -:102D30002800FFF78DF9434604000D93FAE60D9B3A -:102D400004CB9046002A79DB78780D930F0001318F -:102D500017E70D9B02CB14930B789C461800534643 -:102D6000002B00D134E1002815D05346013B01333C -:102D700099460D940B9C89444A460B00A14601E0FC -:102D8000934203D05C780133002CF9D14A465B1A98 -:102D90000D9C0B920F938023DB0099460B9A1340F6 -:102DA0000D934B461A4204D00F9B534501D953460D -:102DB0000F93022399460B9A13400B934B461342F1 -:102DC00000D1F5E16346002B00D1D6E10D9B002B2D -:102DD00000D182E10B1BD14631009A463B00A14451 -:102DE0002E005F464D4622009B46894609E04B4631 -:102DF0003900541CB0475346185D002800D192E1B9 -:102E000022009542F3D14B465A46A946BB463500AF -:102E100017001E004C460B9B002B00D0ADE1149B0D -:102E20000D9387E6E52A0010041C0020E06F0010D7 -:102E30002470001070700010419000000B9A283828 -:102E400002430B9242465242787890460F000D930F -:102E5000013196E678786C2800D15DE180230B9AE9 -:102E60005B001A430B920131B3E680239B00ABE673 -:102E70007878682800D148E180230B9A01311A4301 -:102E80000B92A6E6672800D1B2E0472800D11AE1EC -:102E9000452800D11CE10B9A0721049242460D9B64 -:102EA0000392073352468B43190002920CC9280043 -:102EB000009201930D91220033005946FFF700FA6A -:102EC000040037E6462800D18DE00B9A07210492D2 -:102ED00042460D9B0392073352468B4319000292E0 -:102EE0000CC92800009201930D912200330059462D -:102EF000FFF718FC04001DE6631C9846220033000F -:102F000059462520A847444614E60D9B04330F93E9 -:102F1000631C99460B9B9A0700D40AE10D9B220083 -:102F2000187859463300A84743464444012B00D83B -:102F30006FE1B0462E0025004C46B9465F462200A0 -:102F40004346013439002020B047AC42F7D12C0071 -:102F5000BB4635004F4646460F9B0D93EAE5D64BE0 -:102F600038789A4600239846002800D0D3E50024FC -:102F70006FE66F2842D000D8FDE11023782800D1F9 -:102F80009BE00B9A9A430B920A239C4600231493CE -:102F90000A330F9338E057460B9AB900C919490014 -:102FA00001330F181878303F010030390929F4D95E -:102FB000BA460B921F00591CE7E50D9BB87804CB6D -:102FC0000237D143C9170A4092460D93791CDCE5BC -:102FD000002800D1DFE602235B42C8E621200B9ADD -:102FE0000243914676E620230B9A1A430B926CE734 -:102FF00080230B9A1B011A430B924CE708239C4633 -:103000000023149308330F930B9880230200DB00F6 -:103010001A4011000200184200D080E00C239A43AD -:103020001000802302009B001A400B92184200D02F -:10303000F1E0802302005B001A4091460D9A0432B1 -:103040001492184200D0C3E2430600D5D7E003062D -:1030500000D421E30D9B1B880993002B00D02DE1A8 -:1030600010339843002900D128E1002399464346B4 -:103070000593534604930F9B0690039300230293FA -:103080004B4601931CAB22000093594633002800A5 -:10309000FEF7DEFF0400C2E6582809D0622800D0FF -:1030A000E3E202239C460023149302330F93ABE721 -:1030B00020230B9A1A430B92103B9C460023149337 -:1030C00010330F93A0E780230B9A1B011A430B9236 -:1030D00020230B9A1A430B92DDE60B1B9A460F9B9B -:1030E00099463B0037005E469B4622003B0031007C -:1030F000A84753460134185D0028F6D14B460F937C -:103100005B46B3463E001F0085E6C0230B9AB878A5 -:103110001A430B92F91C5CE5C0239B00F6E70D23D4 -:103120009A4310007DE75B463500BB464E461F00C4 -:1031300071E64346012B66D9631E434432002E00DC -:103140001D003B00A2465F4691469B4622004B462F -:10315000013439002020B047AC42F7D15B4635003E -:10316000BB464E46A14654461F000D9B4A46187862 -:10317000594633004444A847EEE60F9BA1469845C4 -:1031800000D84CE64444E41AB0462E0025004C46D4 -:10319000B9465F4622004346013439002020B0473B -:1031A000AC42F7D12C00BB4635004F46464636E6CA -:1031B0000F98804500D873E24346E218131A320094 -:1031C0002E001D003B0091465F469B460F9122005A -:1031D0004B46013439002020B047AC42F7D15B4662 -:1031E000BB461F0043460F9901330F930B78350000 -:1031F0009C464E466046002800D0E7E50FE60D9B52 -:103200001B78099329E70D9B220018785946330053 -:10321000A8474C46A0E60D9AFA3BFF3B07329A437B -:103220000133994691444B460D93136852681592A9 -:103230001A4306D11032904300220992002900D08F -:1032400083E06122810600D54122D2B20A9214AAFB -:1032500091460A9A00210A3A0B9242461792524628 -:1032600018925A46B24609911E001F31149B4944D8 -:10327000BB4616941A950024674698468946159DC4 -:1032800019901B920AE03032D2B24B4601341A55E3 -:10329000A8454CD0202C4CD006000D003A0000234D -:1032A0003000290000F0CAFAD2B2092AEBD90B9BF0 -:1032B0009C466244D2B2E8E7A11F00106123820657 -:1032C00000D54123DBB20A3B0B93434614A91F22CE -:1032D0008C46159353466244B2460D9417974C465C -:1032E0008046A9461700099D0F9E169308E03033CB -:1032F000DBB201343B55B5420ED3202C0CD0050077 -:103300003100280000F05CFACBB20929EFD90B9A02 -:1033100094466344DBB2ECE7159B40469846169B07 -:103320004D465646A1469A460D9C179F9FE6B742CA -:10333000B0D9179B56469846189B5F469A461B9BEA -:1033400009949B46169C19981A9D4346059353462B -:1033500004930F9B0690039300230293099B019310 -:103360001CAB22000093594633002800FEF770FE84 -:103370000400FFF7DFFB10230B9A9A430F92692892 -:1033800000D091E10B9980230A00DB001A40100065 -:103390000A00194203D0112118008A430F920F9A94 -:1033A000802311009B0019408C461A425BD1802378 -:1033B00011005B00194089460D9904310B911A42A6 -:1033C00000D0B2E013005B0600D4EDE00D9B1B784B -:1033D0001A00D90F0D91002B00D1A3E0100014AA00 -:1033E000944642461F23159252466344A846BA4665 -:1033F0004D461494B14604001F00169201E0202DA2 -:103400000FD020000A2100F0DBF901357E193031A0 -:10341000317020000A2100F0D3F926000400092EA3 -:10342000EDD8159B4E46A94645469846169B5746ED -:103430009A46149C0F9B0693434605935346049368 -:103440000A2303930D9B02934B4601931CAB22006E -:103450000093594633002800FEF7FAFD0B9B040049 -:103460000D93FFF767FB07220D9B07339343013250 -:1034700094469C4462460D920CCBD90F0B911100DF -:10348000194300D19BE0D91713911291514010912B -:1034900013995940119110981199129A139B801AFF -:1034A00099411090119114AA944642460023159216 -:1034B00052469946169232001F336344A8464E4640 -:1034C000BA4614941F00109C119D914601E0202ED5 -:1034D00010D0200029000A22002300F0AFF90136A5 -:1034E00030322B00BA550D0022000400002BEED123 -:1034F000092AECD8159B10941195454698464B46E1 -:10350000169AB14657461E009246149C0F9B06938E -:1035100043460593534604930A2303930B9B02935C -:103520004B461CE7002885D159E70D9B1B68DA0F35 -:103530001100002B00D1A6E0DA179818504014AA09 -:1035400091461F2342464B44A8460D94169704000B -:103550006546B1461F001491159201E0202D0FD051 -:1035600020000A2100F02CF901357E19303131702C -:1035700020000A2100F024F926000400092EEDD8CD -:10358000159BAC4645469846149B4E4619000D9C2B -:10359000169F0F9B0291069343460593534604934F -:1035A0000A230393634650E713001B066ED50D9B59 -:1035B00000229B5ED9175A184A4092B209E70023AD -:1035C00099460028A2D100220023109211936AE7A5 -:1035D0000D9B1B689946002B03D11033984300299B -:1035E00038D16123820600D54123DBB20A3B0D931B -:1035F00043461693534614A91F228C4617932B005B -:1036000062444D46B2461594189780461700994675 -:103610000B9C0F9E08E03033DBB201343B55B542C2 -:103620000ED3202C0CD005003100280000F0C8F883 -:10363000CBB20929EFD90D9A94466344DBB2ECE78B -:10364000169B40469846179B56464D469A460B9405 -:10365000189F159C43460593534604930F9B069071 -:103660000393002302930B9B0BE50B9980230A0025 -:10367000DB001A4010000A00194200D08BE610232C -:103680009A430F928BE6002883D158E70D9B1B6865 -:10369000D9175A184A409CE60D9B1B680993DCE435 -:1036A000030001330F93A5E50B926DE400B585B0DF -:1036B0000391012102900093034813004A4202A99A -:1036C000FFF710FA05B000BDB122001010B5094A8D -:1036D0000300146884B0002C08D001220091064831 -:1036E000524203A9A047012004B010BD00F0BEFF64 -:1036F0000020F9E7041C0020A12200100148042149 -:10370000014B1847600E00202D370010142310B510 -:103710000100188804331B88984710BD162310B584 -:103720000100188802331B88984710BDF8B547463A -:10373000CE4680B50F1E19D01423994604330400D9 -:103740000025012698464B461888434621681B8869 -:10375000984701C4431E9841013540420640AF429C -:10376000F1D13000C0BCB946B046F8BD0126F8E73B -:10377000124A936F9B0815D29066D166002905D036 -:10378000FFE7FFE7FFE7516F106F704704B5802137 -:103790000906C2175140002800D0C84303F0FCFAC4 -:1037A000002104BDF0B5146E556E576F166FFFF70C -:1037B000E3FF1466556657671667F0BD000000D03A -:1037C000114A936F9B0813D210665166002905D0E9 -:1037D000FFE7FFE7FFE7516F106F704704B5002860 -:1037E00001D00020C04303F0D7FA002104BDC04639 -:1037F000F0B5146E556E576F166FFFF7E5FF146640 -:10380000556657671667F0BD000000D094464A4AD7 -:10381000926F9208624601D228E0C046F0B5464E4B -:10382000346E756E776F366F00F020F89446424A1A -:1038300014665566576716676246F0BD94463E4A61 -:10384000926F9208624601D254E0C046F0B53A4EFB -:10385000346E756E776F366F00F04CF89446364ACA -:1038600014665566576716676246F0BD002B24DB69 -:1038700011D000293EDA00B5C943404200D10131E0 -:1038800000F038F8C943404200D10131DB435242D5 -:1038900000D1013300BD002AEBD1002801D100295D -:1038A00005D00020C90FC90701D1C043410800B5A8 -:1038B00003F062FA0022002300BD00B500290ADBF4 -:1038C000DB43524200D1013300F014F8C9434042B7 -:1038D00000D1013100BDC943404200D10131DB4379 -:1038E000524200D1013300F005F8DB43524200D1CF -:1038F000013300BD002923D1002B18D1002A0CD0A0 -:10390000BC460D4F38667A6600210023FFE7FFE7CB -:10391000FFE77A6F386F67467047002801D0074885 -:10392000010000B503F028FA0022002300BD0200C8 -:103930000B00002000217047000000D0FFFFFFFFB8 -:10394000002B00D0BFE0130C28D1002AE7D080B4B0 -:10395000114F39667A66FFE7FFE730B4040C7B6FDE -:10396000396F1B0423433B667A66FFE7FFE7FFE7F7 -:10397000C04684B27B6F3D6F1B0423433B667A666F -:10398000FFE7FFE7C04600232C042D0C7A6F386F49 -:1039900000196941B0BC7047000000D0F0B59446F2 -:1039A0000025140E01D112020835140F01D11201A5 -:1039B0000435940F01D192000235D40F01D1520089 -:1039C0000135D40B0134254F7C66254C3C660E0C2A -:1039D00093B2FFE7FFE7FFE73C6F6643360C7703E0 -:1039E000BE467343DF0B5B04C01AB941130C73432B -:1039F000DB18C91ACE086643360CB64493B273433B -:103A00001F0F1B01C01AB941130C73431F0B1B0579 -:103A1000C01AB941860D8F023E436643360C092D0C -:103A200024DB520A7243801A7703460A6643360C37 -:103A300016235B1BDE40DF40BF1964466643821BD2 -:103A40007046043506330100D940A840C01900D3A0 -:103A50000131A24206D20023F0BD0000000000D0D8 -:103A6000FFFFFFFF121B0130F3D3F1E709277F1B94 -:103A7000FE406446A2B27243801A00D20139220C81 -:103A80007243130C1204821A99410B0070460435DC -:103A900013370100F940A840801900D30131002BF1 -:103AA00002D1A2420AD2F0BD013000D30131121B73 -:103AB000FAD2013BF8D1A24200D2F0BD013000D3CE -:103AC0000131121BF7E7F0B51C0C00D080E00CB4FC -:103AD00000251C0A04D11B02160E334312020835BE -:103AE0001C0B04D11B01160F3343120104359C0B30 -:103AF00004D19B00960F334392000235DC0B02D1B8 -:103B000092185B4101351C00971864410134464FFF -:103B10007C66464C3C660E0CFFE7FFE7FFE7C046BD -:103B20003C6F6643360C7703BE4697B27743C01BA3 -:103B300000D20139C01B00D201399FB27743C91BA3 -:103B4000C91B170C77437E04FF0B801BB941CE08BD -:103B50006643360C0C2D33DBB644120B1F053A437B -:103B60001B0B97B27743C01B00D201399FB277433A -:103B7000C91B170C77433E043F0C801BB941860DCF -:103B80008F023E43664329277F1BFE400C3D77464C -:103B9000AF40BF1930BCA2B2ABB272437343801ABC -:103BA0009941220C7243130C1204801A99410200AD -:103BB0000B000137001BA941F9D2781E0021F0BD8E -:103BC0000C277F1BFE4077467F0BAF40FF19E0E7D5 -:103BD00000245D1C07D0144F7D663966FFE7FFE7C0 -:103BE000FFE7FFE73C6F95B29EB265436643401B1B -:103BF000B141150C1E0C6543664336042F0C3E4341 -:103C00002D04401BB141994204D202000B00200058 -:103C10000021F0BD01D19042F7D3801A99410134BF -:103C20009942F2D3F6E70000000000D0FFFFFFFF4B -:103C300048404140484018B41B4B5B68FC46019328 -:103C400008BD04DFC33E001018B4174B1B68FC46C8 -:103C5000019308BD00DFCD3E00109446134A926FD9 -:103C6000920809D2624618B40F4BDB68FC460193F8 -:103C700008BD0CDF854100100C4AF0B5146E556E7E -:103C8000576F166F6246FFF7EEFF084A14665566D7 -:103C900057671667F0BD18B4034B9B68FC46019349 -:103CA00008BD08DF2940001028100020000000D0C7 -:103CB000FFB550404240504059404B40594000E011 -:103CC000FFB5154F4C00640D03D0BC4204D10C036A -:103CD00014D80020090D09055C00640D03D0BC4216 -:103CE00004D11C030AD800221B0D1B0501264B40E2 -:103CF00009D44B4003D58B4200D18242FFBD99428B -:103D0000FCD19042FFBD0B43DB1803431343F5D0B6 -:103D1000C9434918FFBD0000FF07000000B5FFF7C9 -:103D2000CFFF804100BDC04600B5FFF7C1FF01D9FC -:103D3000002000BD012000BD00B5FFF7B9FF8041A4 -:103D400000BD012040054A00121804D85A0012187C -:103D500001D8002070470120704700207047000004 -:103D60000021002805D17047C1174840401AFAD0F9 -:103D7000C90713B5064B1B6898470CBC441CA240EE -:103D80001005120B0349091B09051943114310BD06 -:103D9000481C00201F04000010B54C00620D802359 -:103DA000D218DB00D21A5B057E2A10DD9E3A13DAA8 -:103DB000CC170903490819435242D1406400013429 -:103DC0001532202A05DAD0400843604310BD002098 -:103DD00010BD0846604310BDC80FC018013810BDA3 -:103DE00018B4044B5B6AFC46019308BD24DF3543DD -:103DF0000010000028100020132370B51D78012D3D -:103E000015D010DD1D48FFF789FC1D4C01008022F4 -:103E1000200000F05DFB022D2DD01A48FFF776FC44 -:103E2000194B186070BD194B154CA364F5E7174B7F -:103E3000134C23606360A360E36023616361A3614B -:103E4000E36123626362A362E36223636363A36348 -:103E5000E36323646364A364E36423656365A36528 -:103E6000E36523666366A366E36623676367A36708 -:103E7000E367A364D1E7054BA364CEE75344000096 -:103E8000281000204C330000481C0020913E0010F8 -:103E900007B5604601880A0A0230DF2AFAD1C9B2A2 -:103EA000820804D3028840880004104300E00068C0 -:103EB000014A5050039007BD281000200FB403BCE6 -:103EC0000CBCF0B50124E407634000E0F0B50C0D34 -:103ED000CF0F661E3605891B640503D3C9434042D4 -:103EE00000D30131640D03D0661CF60A07D0E41B31 -:103EF00000207F00791C89078912803C24031D0D56 -:103F0000DF0F6E1E36059B1B6D0503D3DB4352424C -:103F100000D301336D0D03D06E1CF60A07D0ED1BE4 -:103F200000227F007B1C9B079B12803D2D032F1BD3 -:103F3000661B58D4A446202E46DA20371400BC4015 -:103F40001D00BD40F24033412A4380185941CB0F38 -:103F500005D0C943C04300226442504151416246EA -:103F60004D0D28D10D0D07D100281FD02419404137 -:103F70004941013A0D0DF9D0640006D3013000D358 -:103F80000131002C01D140084000013A0BD4941CAF -:103F9000E40A04D112051144DB071944F0BDD90726 -:103FA000204B194300E0D9070020F0BD0029DDD1E6 -:103FB000002CDBD1F0BD0132C6074008CD072843F5 -:103FC0004908002EE1D0D9E73C2E29DA203E4037BF -:103FD0001400BC4000D00124F24014431A00BB403E -:103FE0001C43D317ACE7AC46202F08DA2036040078 -:103FF000B4400D00B540F84039412843A5E73C2FB7 -:104000000CDA203F40360400B44000D00124F840D0 -:1040100004430800B1400C43C117EAE7100019003F -:10402000002494E70000F07FF0B50C0D661E360505 -:10403000891BE60A6405640D02D0651CED0A04D0F4 -:10404000002001210905803C2403A4461C0D671EA5 -:104050003F05DB1BE70A6405640D02D0651CED0A11 -:1040600004D0002201231B05803C240377406444D4 -:1040700097B484B296B27443070C7E43150C6F4319 -:1040800080B26843361802D3012000043F18300480 -:10409000350C00197D41844688B29AB250430C0C0D -:1040A00062431F0C7C438EB27E43921902D30126D9 -:1040B0003604A4191604170C3618674101BC81B2E6 -:1040C0009AB25143040C62431B0C5C4380B25843C8 -:1040D000121802D30120000424181004130C4018F5 -:1040E00063412D185E410020474106BC88B293B25F -:1040F00058430C0C6343120C544389B251435B1870 -:1041000002D301210904641819041A0C0918624128 -:104110006D1856410020474118BCF902720D114339 -:10412000F0026A0D1043ED020A0D03D16D194041F2 -:104130004941013B124E9B1B7600B3420ED26D00EB -:1041400007D30130002671416646354301D140084E -:1041500040001B05C918E4072144F0BD0BDA013308 -:1041600006D1013004D101314F0D01D04908F2E7E9 -:10417000E1070020F0BD013631050020EBE700002B -:10418000FF030000F0B51C0D671E3F05DB1BE70AAF -:104190006405640D02D0661CF60A04D000220123D7 -:1041A0001B05803C2403D0252D060026F6432E66F1 -:1041B0001E096E66CE0FF619B44649004F0D02D0A7 -:1041C0007E1CF60A03D000200021403F3F033E1B27 -:1041D000B600B444013F7F05C91B49082E6F013664 -:1041E00076089C02950D25437543ED137543AD1379 -:1041F00001356D10F603761B0CB4CC02450D2C4333 -:10420000A2B2B3B25A43270C7B43350C6F43A4B21E -:104210006C431B1902D3012424043F191C041D0CF8 -:10422000A4187D4124196D41009A91B2ACB261434A -:10423000170C7C432B0C5F4392B25A43A41802D351 -:1042400001221204BF182204230C52187B41019C46 -:104250006C431B19520ED9010A434401A01A81B2C2 -:10426000B2B2514303145A43360C734387B27743B7 -:10427000D617D21900277E4136049B191704160C55 -:104280007F185E417316ED18F301002680337541E7 -:10429000A90F06D16400690AE8055B0A184309D230 -:1042A0002FE00422944480337541A90AA8059B0A93 -:1042B000184326D3404149412404009A019B0D0034 -:1042C0005543641B4343E41A95B286B27543170CF9 -:1042D0007E43030C5F4392B25A43B61802D30122C5 -:1042E0001204BF183204330C52197B4152429C41D4 -:1042F000002C02D40022013051414008CA0710436B -:10430000490802B06246D7079210084BD218084BF2 -:104310009A4203D212058918C919F0BD0020002A5B -:1043200001DC3900F0BD01331905F5E7FD0300009C -:10433000FE070000002200B5203200F004F808005B -:1043400000BD000000220B150AD410B5944600F001 -:1043500031F81414013400DA0021CB17144C204733 -:104360000020002170476244343A0CD40C2A07DA4A -:1043700004009140904052422032D440214310BD6D -:10438000D843D94310BD203207D40C469440524242 -:1043900020321141D040204310BD0800C9172032FF -:1043A00003D452422032104110BD1800190010BD34 -:1043B000674300100A0DCC0F531E1B05C91A520586 -:1043C00003D3C943404200D30131520D03D0531CE3 -:1043D000DB0A07D0121B00206400611C89078912C8 -:1043E000803A1203014BD21A70470000FF0300000D -:1043F00051434343C9188C46110C83B24B4310B44C -:10440000040C614392B280B2504362431C041B0C03 -:10441000001910BC59411304120CC01851416144D9 -:1044200070470000132310B512481C78FFF776F987 -:104430000100012C0AD003DD80220F4800F048F86B -:104440000E48FFF763F90E4B186010BD0A4C54225A -:10445000200000F03DF80B4B6365A365E365236620 -:104460006366A366E36623676367A367E367236204 -:10447000E361E5E753460000281100204C330000BB -:10448000481C00208944001007B5604601880A0ACC -:104490000230DF2AFAD1C9B2820804D302884088E8 -:1044A0000004104300E00068014A5050039007BD2B -:1044B0002811002001480421014B1847700E0020EC -:1044C0002D370010014B1B6818470000700E0020AC -:1044D000014B5B6818470000700E0020F0B5C6461F -:1044E00000B5437D07000D001600002B38D0002AD0 -:1044F0002EDD00216A1E90466A5C037D4C1C002064 -:104500000A2A0CD0A64216D043461B5D21000D3B63 -:104510005A4253416A5CDBB24C1C0A2AF2D1002B8E -:10452000F0D1884217DB022110483B689847A64229 -:1045300007D02000E8E7864203DD311A3B682818DF -:104540009847AD19013D2B780D3B5A4253413B75BD -:1045500080BCB846F0BD091A3B6828189847E2E7C6 -:104560000368110028009847F2E7C046F471001074 -:10457000F0B5C6460B6806000C0000B5802B06D0CF -:104580005A1C2260E418267180BCB846F0BD0F4B5F -:104590001D68002D16D00B1D98460D4F02E02D69A9 -:1045A000002D0FD02B68002BF9D03B68002B01D0D9 -:1045B000AB42F4D1280041462268FFF78FFF2D69F6 -:1045C000002DEFD101220023DBE7C046F8170020C1 -:1045D00000180020F0B5CE46474680B583B06B4644 -:1045E0000600DD1D2870FCF76BFE00231A4A121826 -:1045F0004B41802109068B4202D30122174B5242C4 -:1046000017490800884602F0E7FB164B81461C68F4 -:10461000002C14D0144F02E02469002C0FD0236822 -:10462000002BF9D03B68002B01D0A342F4D120002D -:1046300001222900FFF752FF2469002CEFD14B46DD -:10464000002B05D1300003B0C0BCB946B046F0BD68 -:10465000404602F089FBF5E740420F00FFFFFF7F75 -:10466000D80E0020F817002000180020F0B5DE4614 -:1046700057464E464546E0B585B0070002F03AFB86 -:104680000600FCF71DFE00232B4A12184B41802127 -:1046900009068B4202D30122284B524228490800C6 -:1046A0008B4602F099FB274B01901C689A46002C20 -:1046B0003BD0254B984602ABDD1D0A23994602E00C -:1046C0002469002C17D02368002BF9D043461B68BF -:1046D000002B01D09C42F3D1200032003900FFF7BB -:1046E000FDFE4B462000012229002B70FFF7F6FE4D -:1046F0002469002CE7D1019B002B18D153461C687C -:10470000002C06D06368002B0BD098472469002C3E -:10471000F8D1300005B0F0BCBB46B246A946A04671 -:10472000F0BD2469002CEDD1F3E70028F1D0584604 -:1047300002F01AFBE2E7C04640420F00FFFFFF7F96 -:10474000D80E0020F8170020001800200A4A13682D -:10475000002B05D10CE01A001B691032002B07D08A -:104760009842F8D1002902D10369136001617047B2 -:104770000029FCD01060FAE7F8170020F0B5CE460B -:10478000474680B5A3B004000D00FCF799FD002357 -:10479000294A12184B41802109068B4202D301227B -:1047A000264B5242264F380002F016FB002306002B -:1047B000019322002B00234801A9FEF777FF019BFC -:1047C0008046002B14D1204B1C68002C06D0636857 -:1047D000002B0BD098472469002CF8D1002E25D14E -:1047E000404623B0C0BCB946B046F0BD2469ECE7F2 -:1047F000154B1D689946002D1CD0144C02E02D6904 -:10480000002D0FD02B68002BF9D02368002B01D08E -:10481000AB42F4D12800019A02A9FFF75FFE2D698F -:10482000002DEFD14B4601951C68CEE7380002F011 -:104830009BFAD5E70195D1E740420F00FFFFFF7FCC -:10484000D80E002071450010F81700200018002035 -:104850000FB400B583B004A901C90191FFF78EFF21 -:1048600003B008BC04B0184710B500F0CDF800F054 -:10487000C7FA012010BDC046F0B5002915DD0E4B6A -:104880000D271A680D4B0E4CD3185D426B4145182D -:1048900020215B001E5F0478A64207D0936919426D -:1048A000FCD101301460A842F5D1F0BD93691942E2 -:1048B000FCD11760F2E7C0466C1C00200080FCBFF2 -:1048C000681C0020214B70B504000D1E1E682CDDF5 -:1048D000002010211E4B013C1A689369194215D122 -:1048E000013093691942FCD1136823548542F4D1F5 -:1048F000002E09D0502338219363536B3432194072 -:1049000080235B011343196028000DE0002E09D0BD -:10491000502338219363536B3432194080235B0159 -:104920001A43116000280ED070BD002E0BD050220B -:104930003821074B1B689A635A6B3433114080222D -:1049400052011343196003204042EDE77C17002019 -:104950006C1C0020064B10B51B68002B06D00021F4 -:10496000044A12689163044A1068984710BDC04613 -:104970007C1700206C1C0020841700201D4BF0B514 -:104980001A68C64698461C4B0E00D31859424B4134 -:104990001A4F14331C00050000B53B68002807D0EF -:1049A000002B11D0164B3D601E6080BCB846F0BD98 -:1049B000002BF7D0906300212000FBF7ABFD200017 -:1049C0001049FBF703FFEDE720000E49FBF7DAFD86 -:1049D00001212000FBF79EFD4346502238211B6831 -:1049E0009A635A6B34331140802252011343196089 -:1049F000D8E7C0466C1C00200080FCBF7C1700205C -:104A000084170020554900100C4B10B51B780C4B37 -:104A10000C4C1B780C4B022100202360FBF7A0FC00 -:104A200002210120FBF79CFCE12120684902FCF7F0 -:104A30002FFF01210548FFF789FE10BD7473001098 -:104A4000707300106C1C002000400340800E00209A -:104A50007047C0460022014B1A707047861C002028 -:104A60004B790020FF2B0BD18B79002B08D1CB7910 -:104A7000012B05D1082A03D9024B8A7809301A7014 -:104A80007047C046861C00200120704770B5012980 -:104A900001D0012070BD13495379107909781B02A8 -:104AA000034300209942F5D15378012B08D0022B03 -:104AB000F0D1002064220021FDF774F90120E9E71C -:104AC0009478D278050012021443D20502D5620A06 -:104AD00093401D000448FEF719FE7F21030021408A -:104AE00028009847861C00205542000001230370CF -:104AF000004870470C7200104B780A781B02134371 -:104B00008A7810B512041A43CB781B0613439622F9 -:104B1000D200934200D010BD0348FEF7F7FD0021FC -:104B2000030008009847C04655420000024B186039 -:104B3000024B19607047C04680170020881700207C -:104B400010B5024B1878FBF7F7FC10BD871C00204E -:104B5000114B70B51A68002A1AD0EFF3108172B6A3 -:104B600010680028FCD0BFF35F8F00200B4A59600B -:104B700010701B68BFF35F8F186081F310880024EA -:104B80000025074B1878FBF7D7FC2900200070BDE3 -:104B9000FA240025A400F4E7281C0020881C00202B -:104BA000871C002070B5040000200E0001F0E8FA18 -:104BB000002836D0002001F0FBFA002831D0FCF7A5 -:104BC0007FFB0023184A12184B41802109068B42B3 -:104BD00016D2164D280002F0FFF8002821D0002040 -:104BE00001F0CEFA00280FD101200021404200F050 -:104BF000C1FC03246442280002F0B6F8200070BD16 -:104C000001220B4B5242E4E7002001F0D1FA0028C8 -:104C1000EAD021003200002001F0D6FA041EEAD1C9 -:104C2000E7E703246442E9E740420F00501C0020FC -:104C3000FFFFFF7FF8B5DE46574680B505000C0044 -:104C4000FCF73EFB0023374A12184B41802109062E -:104C50008B4202D30122344B5242344908008A4627 -:104C600002F0BAF8002803D1C0BCBB46B246F8BD7A -:104C7000002001F085FA00284AD00026002C43DDF0 -:104C80002B4B9B4614E0A919002001F011FB0700F3 -:104C900001200021404200F06DFC002001F0CCFA20 -:104CA000FCF70EFB224BF61918605960B4422BDD5D -:104CB000002001F017FBA71B0200B84200DD3A00FC -:104CC000002AE0D101200021404200F053FC0020E6 -:104CD00001F0B2FA002001F053FA002814D00020AD -:104CE00001F000FB0028E1D1FCF7EAFA5B460F0077 -:104CF0001A685B68002184460E4812184B419F4297 -:104D000002D8D3D19445D1D9504602F02DF8ABE763 -:104D100000200021064B18605960504602F024F82C -:104D2000A2E7C04640420F00FFFFFF7F501C00205B -:104D30002010002020A1070010B5244C84B00021D1 -:104D4000200002F031F800281CD1214B1A68002AFB -:104D500016D0EFF3108172B610680028FCD0BFF3B4 -:104D60005F8F01241B48596002781B68D2B204701F -:104D7000BFF35F8F0020186081F31088002A0AD0EB -:104D800004B010BD01200021404200F0F3FB2000E0 -:104D900001F0EAFFF4E7FCF781F80400FCF790FA71 -:104DA000FA220023920012184B41802109068B42FF -:104DB00002D30122084B52420121029100210191AC -:104DC000064920000091FCF76DF8D9E7501C00203F -:104DD000281C0020881C0020FFFFFF7F514B001083 -:104DE000054B10B51868002804D0044B0022196840 -:104DF00001F036F810BDC04680170020881700204B -:104E0000D02310B51B0684B01C68FCF747F8FCF7EC -:104E100007F9A04202D0002004B010BD274B1B7838 -:104E200001F042FC2648FBF73DFE0120FBF71CFE8B -:104E3000FF23244C244920701840FBF7A3FB207863 -:104E40000121FBF767FB0520FBF77EFB002827D13C -:104E5000FCF724F80400FCF733FAFA22002392004E -:104E600012184B41802109068B4202D30122174BB5 -:104E70005242012102910021019115492000009127 -:104E8000FCF710F80822040000211248FFF71AFB73 -:104E9000002CC0DB10480121FFF758FC0120BBE7C4 -:104EA00000220E490520FBF797FBFBF715FB094B8A -:104EB00001001800FBF720FEECE7C04678730010F5 -:104EC000501C0020871C0020394D0010FFFFFF7F81 -:104ED000514B0010281C0020980E0020414B001060 -:104EE000004870479C7200100048704748720010DC -:104EF00010B5040017480378002B20D0002C06D1F1 -:104F0000154B16484380063BFF3B038010BD052C24 -:104F100019D8134BA400E05812490123013804E0CA -:104F200001330A800231142B0FD0C25C002AF7D162 -:104F3000C022DBB25B00920008481343E5E7112171 -:104F400000F01AF8DAE70020E0E7CA2303489B00E4 -:104F5000DBE7C046701C002009040000D0170020C9 -:104F600030720010D217002010B5024800F0D8F8B7 -:104F700010BDC046401C002030B54B1E012900D199 -:104F8000A7E0664A11780D092C0030349F2900D91A -:104F9000A2E00470012B00D1BEE00F211478214063 -:104FA0000C003034092900D998E04470022B00D15C -:104FB000B2E054782509290030319F2C00D990E0C7 -:104FC0008170032B00D1A7E00F2121400C00303469 -:104FD000092900D987E0C470042B00D19CE09478A3 -:104FE0002509290030319F2C00D97FE00171052B64 -:104FF00000D191E00F2121400C003034092900D963 -:1050000076E04471062B00D186E0D478250929008A -:1050100030319F2C00D96EE08171072B00D17BE0ED -:105020000F2121400C003034092966D8C471082BA7 -:1050300000D171E014792509290030319F2C5FD807 -:105040000172092B68D00F2121400C00303409294E -:1050500058D844720A2B5FD0547925092900303181 -:105060009F2C52D881720B2B56D00F2121400C005F -:10507000303409294BD8C4720C2B4DD094792509B2 -:10508000290030319F2C00D9073101730D2B43D0FB -:105090000F2121400C003034092901D937310C008F -:1050A00044730E2B38D0D1790C09220030329F295D -:1050B00000D9073282730F2B2ED00F220A40110025 -:1050C0003731092A01D830321100C173102B23D097 -:1050D00010300023037030BD07345AE737310C001D -:1050E00063E707316CE737310C0074E707317DE780 -:1050F00037310C0085E707318EE737310C0095E733 -:1051000007319DE737310C00A3E70731AAE73731B4 -:105110000C00C4720C2BB1D1C018DAE7401C00207F -:1051200010B588B004000D2200216846FFF7CAF9C7 -:105130000D22002104A8FFF7C5F94B236A466846F3 -:10514000137004A90D2201F007FE1521082220008A -:105150006944FFF7BDF908B010BDC04610B5012184 -:105160000520FBF7D7F910BD10B500220021024839 -:1051700000F058F910BDC046241800208022024BD0 -:105180005202DA647047C04600201150F0B5C6469E -:1051900000B5060000F020F90C231B4DFF22AB6781 -:1051A00005201A49FBF718FA40239846184C40226C -:1051B00000212000FFF786F94346012723832121A0 -:1051C0000023144A6770A260136063545F316184E6 -:1051D00041462187053963540F4A10496360E260F4 -:1051E000A1620B606362E26201F006FE80239B0510 -:1051F0002F64EB6490230A4A3000EA50FFF7BEFFA9 -:1052000080BCB846F0BDC04600001150A10400208B -:10521000041800208400105000011050800010502D -:1052200010D001000B785B0602D14B78052B00D023 -:1052300070478A78014B1A60FAE7C04600001150A7 -:10524000F0B5C64600B5CC7888780A794B797F21CD -:10525000A40701401B02C50913434F00A20F14000D -:10526000324E7A195201B218907001206840507085 -:1052700000205B055B0DD0701383D4768046CA0096 -:10528000012D33D02A488446880162448446B444C0 -:105290006046826040461060002933D0254AC9002C -:1052A00090466246414451603F223F339343022C73 -:1052B00000D15B0020487A1901685201B218D16010 -:1052C0001E4ACB18036051405A40802388465B0138 -:1052D0009A4228D84346A4061C4380237F197F01A5 -:1052E000F61972681B062343136011E014488446C4 -:1052F000880162448446B44460468262404610603D -:10530000002909D100236D0175196B600D4BEB600D -:10531000012080BCB846F0BD084AC90090466246EC -:1053200041445162C0E7FCF735FED3E70418002082 -:1053300084001050040010500C1C0020000010507D -:10534000800010500001105010B501F055FD10BD47 -:1053500010B57F200C0020404000E4091100001926 -:105360001A00034B4001C01800F05CF8012010BD8A -:10537000041800207F23180010B50840CA090B420A -:1053800003D107497D3B9B1A8B6640008018802221 -:10539000044B40010021C018120101F035FD10BD81 -:1053A00000201150041800207F22130010B50B407C -:1053B0000A4200D110BDC9095B005B1804485B01BB -:1053C000C018002300220349C37001F01DFDF1E75E -:1053D00004180020FFF7FFFF80220D4B520410B588 -:1053E0001A600C4B0C491A6010008B689843FBD173 -:1053F0000A4C9C2200212000FFF764F88022002143 -:1054000052010748FFF75EF80923636710BDC046E5 -:1054100000E0004000F0004000C0004000001150DB -:1054200000001050002310B5C382013382828376BE -:105430000161040001F0C0FC002804D08021902309 -:10544000074A8902D150200001F09EFC002802D0BA -:105450000123237710BD200001F0C6FCFAE7C04607 -:1054600000201150024B5878431E9841C0B270473B -:1054700050150020024B18784007C00F7047C046F7 -:1054800050150020034B1878FF38431E9841C0B2D6 -:105490007047C046D40E0020F8B5CE46474680B5CA -:1054A0002A4E05003378FF2B01D001203DE0532226 -:1054B00000212748FFF706F8264C2000FBF7F2FAF8 -:1054C000254B1C60254C2000143CFBF707FB2000FB -:1054D00001F0CCFB224B234F1C60234B9846002F3E -:1054E0001ED01800FFF702FB204B186043461B78C4 -:1054F0001F4A00249146002F14D04A46A3421AD8CE -:105500009047434601341B78E4B2A342F3D228000B -:105510003570FFF73BFE2800FFF720FE012004E076 -:105520001B78E5E7002C04D00020C0BCB946B0468B -:10553000F8BD0F4AE4E70D4A630012681B19DB004F -:10554000D318002BF0D01A68DAE7C046D40E00203A -:105550005015002008150020A4150020CC0E0020B6 -:10556000A8150020ED4A0010811C00202812002000 -:10557000FD620010F0B5DE4657464E464546E0B5A2 -:1055800091B001F097F8002800D1FCE0C34BC44E65 -:105590009946C44B0DAC0293C34B9B464B460193BB -:1055A00035686A69EFF3108172B61368002BFCD07E -:1055B000BFF35F8FA9612800210001F085F96A69B6 -:1055C000AB69BFF35F8F0021116083F3108800285F -:1055D00000D1D8E06378082BE2D8019A9B00D35819 -:1055E0009F466368002BDBD0A0689847D8E77F20F0 -:1055F0002179AC4D08404300CA09EB189B181D00E7 -:1056000001273035EA78BA43EA70EA780337BA43BB -:10561000EA70002800D1F2E0A44FDB7C002F06D016 -:10562000A34A1278934200D2F1E09B1ADBB2002B1E -:1056300000D0A8E09F4DA36862792078A847AFE723 -:105640000122984D01202B78042113432B70332322 -:10565000EA5C8243EA54EA5C8A43EA540133EA5C36 -:105660008243EA54EA5C00208A43EA5423789A464B -:1056700000F0F8FC602223791A40602A00D1B5E0DE -:10568000402A00D1AFE0DB06DB0E012B00D1D3E0D6 -:10569000022B00D120E1002B00D0A7E0202A00D16E -:1056A00053E1002A00D0A1E06379092B00D99DE0E5 -:1056B000814A9B00D3589F46029B1B78DB0700D48E -:1056C0006EE77E4B002B00D16AE700E000BF67E782 -:1056D000744D2B78DB0700D462E7794B002B00D1A7 -:1056E0005EE728780007C00F00E000BF58E70025FC -:1056F00023786E4F9A466E4B98461B78002F49D000 -:105700005A46AB4263D850469047434601351B7812 -:10571000EDB2AB42F2D2634D532200212800FEF7D6 -:10572000D1FE1022FF21E81CFEF7CCFE280020222B -:10573000FF211330FEF7C6FE2EE0002523785B4FD5 -:105740009A465B4B98461B78002F2ED05A469D42B6 -:1057500033D350469047434601351B78EDB2AB42F8 -:10576000F2D2504D532200212800FEF7ABFE10224A -:10577000FF21E81CFEF7A6FE28002022FF2113309F -:10578000FEF7A0FE14E011B0F0BCBB46B246A9463D -:10579000A046F0BD002D38D000F05AFC494B002B3C -:1057A00000D1FDE600E000BFFAE6002D19D03D4D26 -:1057B00000F04EFC2379AB70F2E6434A6B001268AE -:1057C0005B19DB00D318002BF1D05A68C1E73E4AC1 -:1057D0006B0012685B19DB00D318002BDCD05A6811 -:1057E00091E7314AB5E7394800281AD120780021DD -:1057F000FFF7C0FD80212078FFF7BCFDD0E6A3684D -:105800006279207800F042FCCAE6274A7BE72E4AFC -:1058100058001268C318DB00D318002BB3D01D69E1 -:1058200009E700F01FFC012150460EAA00E000BF6E -:10583000002800D0B4E6D9E7237A0F2BD6D81B4F27 -:10584000EB18DB78002F06D0194A1278934200D269 -:105850009CE09B1ADBB2002BC8D11D481D4D00F007 -:1058600001FC01215046EB680EAA9847002800D0A1 -:1058700096E66022150023791D401A42B6D163795D -:105880000A3B012BB2D800F0EDFB63790A2B00D163 -:105890007DE150460EA900F06FFB81E6B07200106A -:1058A000A81500205015002079630010ED4A001063 -:1058B000811C00206D650010D472001000000000F3 -:1058C000000000000000000028120020000000007E -:1058D000896400103C7300107023217A0B4285D13B -:1058E000C80984460F330B405B00E8186044C07C55 -:1058F000B14F8046002F07D0B0480078804550D384 -:105900004746381AC0B28046404600283AD1002A9D -:1059100000D0F5E0AA4A9046677902203A00824317 -:10592000012A00D1F0E0002F00D05FE7EB186344BC -:105930003033DB780CAA9B07DB0F02321380504612 -:1059400002230EA900F02EFB2AE6237A0F2B00D9A2 -:105950004CE7994FEB18DB78002F06D0974A127866 -:10596000934200D2F3E09B1ADBB2002B00D03DE75C -:105970009448934D00F076FB01215046EB680EAA47 -:10598000984755E79046002AC6D02FE78E4A59001F -:105990001568CB18DB00ED18002D00D126E7E8686C -:1059A0005DE7474688487F00006847448046FF001F -:1059B000B844002AB0D04346002B00D116E7D8687F -:1059C00000F050FB434601215046DB680EAA984781 -:1059D0002EE7A37903931A006B789A4207D06B786D -:1059E000002B00D058E1039B002B00D0F8E0039B74 -:1059F00050460EA96B7000F0BFFAD1E56B780CAA87 -:105A000002321370504601230EA900F0CBFAC7E50D -:105A1000E3881A0AD8B20F2A00D9E7E66B49930047 -:105A2000CB589F460EA800F023FB5046A179FFF704 -:105A30009BFB02222B7813432B70B1E5E388012BEB -:105A400000D0D3E608222B78504693430EA92B7042 -:105A500000F092FAA4E5022029780CAB9A1C8B0680 -:105A60008908DB0F01400B4368E7E388012B00D076 -:105A7000BCE608222B78504613430EA92B7000F089 -:105A80007BFA8DE5524B002B00D1AFE600E000BF62 -:105A9000021E00D1AAE6D37891781B020B43504630 -:105AA0000EA900F07FFAC3E64A4B002B00D19DE619 -:105AB00000E000BF021E00D198E6504613780EA900 -:105AC00000F070FAB4E62189FFF712FA021EF4D151 -:105AD0008CE6022A00D12DE13F4B002B00D185E658 -:105AE00000E000BF0200002A00D17FE6D3E7FFF705 -:105AF000F7F9122302000EA9504600F053FA97E678 -:105B00002F4B304898465BE7E288002A09D1334A98 -:105B10001078012F26D0EF1867443037FB789B07A9 -:105B20003ED54346002B00D13AE5D86800F09AFAFA -:105B300043460121DB680EAA50469847002000F03A -:105B400091FA3423EB5CDB0700D529E5A1E61E4A78 -:105B500059001568CB18DB00ED18002D00D145E683 -:105B6000E86807E730229146EB18634499444B46B6 -:105B7000DB789B07D5D5FFF717FC4B460222DB7875 -:105B800093434A46D370D378BB43D370C9E70CAB79 -:105B90009A1C504601230EA9157000F003FAFFE489 -:105BA000FFF7E8FB0222FB7813430122FB70FB782E -:105BB0001343FB70B5E7C046ED4A0010811C00207E -:105BC0003C7300108964001028120020FC72001041 -:105BD000000000000000000000000000D40E0020C3 -:105BE000581EC0B2FFF780F9002800D1FEE54378C7 -:105BF0000793022B00D0F9E50121C279B146931138 -:105C000052110B400A4012015B0113432A782F31D5 -:105C10008A4313432B700923984680444746A8467D -:105C2000C37882781B021343C31804935C4B099317 -:105C3000049BBB4200D881E07B7801220B2B02D170 -:105C40003B78FA78FF187B78042B23D10025049B3E -:105C50000B92DB1B9BB20593524B19780693524B68 -:105C60000A93524B08930A9B002B52D0099B089E23 -:105C70008D4245D339005046059A984784460828F6 -:105C800002D9059A824262D2069B01351978EDB29B -:105C9000A942E8D24E46A9E55046FFF755FB00223F -:105CA0009146434AAB7805922A004D4691460493AB -:105CB0003C4B3D4F98461B78002F1BD0059A9D42C8 -:105CC0002CD350469047434601351B78EDB2AB428A -:105CD000F2D24D46532200212800FEF7F3FB10229A -:105CE000FF213448FEF7EEFB2022FF213248FEF769 -:105CF000E9FB02E0002D1BD04D46049BAB7072E621 -:105D000018232E4A6B431668F618002EC2D0B368CB -:105D1000B0E7002DBED1224B244EABE7274A6B00E3 -:105D200012685B19DB00D318002BE5D05A68C8E76E -:105D30001F4AC6E7FFF7D8F80200D4E6204B4546D5 -:105D40004E46002B00D152E600E000BF4FE60B9A12 -:105D5000012A1FD00021464609E0BB78CB18DBB2F0 -:105D6000F318D878FF2895D10131DD70C9B291427E -:105D7000F3D1B04666462B00390032000E4800F0E1 -:105D80001FFDB446069B67441B78AB4200D34FE728 -:105D90004E462BE5024BB1689942DBD1079AD9E711 -:105DA000A5630010811C0020ED4A00103C73001018 -:105DB000796300105315002063150020281200207D -:105DC00000000000F8B557464E46DE4645460C003A -:105DD000E0B516001F00002A3CD01F4B00259A4654 -:105DE000702399461D4B9B4617E05B46200099782F -:105DF00000F0A8FC00281FD021004046FFF720FA41 -:105E0000002819D0A378DA09012A1CD00A9A013592 -:105E100013702378E418B5421CDA6378052B0BD194 -:105E2000E3789B079B0FBB4206D153464A461B783B -:105E30009846A3781A42D8D00020F0BCBB46B246A0 -:105E4000A946A046F8BD0B9A013513702378E418D3 -:105E5000B542E2DB0120F0E7D40E0020501500200F -:105E6000802310B51B0184B001930E4B02901C6877 -:105E700003916269EFF3108372B611680029FCD0B8 -:105E8000BFF35F8FA361200001A900F0DFFD62690D -:105E9000A369BFF35F8F0021116083F3108804B002 -:105EA00010BDC046A8150020702270B5094B0C002B -:105EB0001D788B781A4201D0002070BD064B20005F -:105EC000997800F03FFC0028F6D021002800FFF769 -:105ED000B7F9F2E7D40E0020501500200B007F2008 -:105EE00010B51840DB0933334000044AC018044B96 -:105EF0001168C01800F0E2FB10BDC046A4150020D8 -:105F0000501500200B007F2010B51840DB093333FB -:105F10004000044AC018044B1168C01800F0F6FB9A -:105F200010BDC046A41500205015002070B57F2478 -:105F30000F480C4064000419CD0964193034E0782E -:105F4000C00701D5002070BD0126E578094835431A -:105F50000078E570FFF7FCF90028F4D10122E3781E -:105F60009343E370E37803329343E370EAE7C04678 -:105F700050150020D40E002070B5094C06000822F0 -:105F800020000D00FEF7A4FA00238021E360A36047 -:105F90002B783000994300220023FFF7C7FF70BD24 -:105FA000F4140020F8B5CE4647469046264E80B5FC -:105FB0008146082230000D001F00FEF789FA434693 -:105FC000B3600023F381EC79AB7924021C43231CDA -:105FD000BC4200D93B1C9FB2B381002C0ED0002FD5 -:105FE00018D04346002B2CD03B1C402F1BD89FB20F -:105FF00033787F2B1CD80021144A0FE080212B78A6 -:106000000022994348460023FFF790FFC0BCB946E1 -:10601000B046F8BD7F230022317899433B004846C3 -:10602000FFF784FFF2E740239FB233787F2BE2D95A -:10603000064C3A0041462000FEF74AFA8021220031 -:10604000ECE70020E2E7C046F41400201015002021 -:1060500010B5142200210248FEF734FA10BDC046E4 -:10606000F4140020014B18617047C046F41400205E -:1060700010B5054C010008222000FEF729FA002384 -:10608000A360E36010BDC046F414002070B5394C25 -:106090001D0023780600DA09C9098A4213D00020BE -:1060A000002D00D070BD344B002B03D021003000F8 -:1060B000FFF7B8F82369002B03D02200032130003A -:1060C00098470120EEE7A0687F2B05D8002834D040 -:1060D0002A002A49FEF7FCF9E289A1685219E388EF -:1060E00092B24919E281A160934214D03F2D12D996 -:1060F000A389981A051C80B240282AD82078ADB20E -:106100007F2828D800219A4232D01C4A2B00300028 -:10611000FFF70CFFC6E72369002B05D02200022100 -:106120003000984700280AD0802123780022994324 -:1061300030000023FFF7FAFEB4E70020B2E70021A9 -:106140003000FFF717F930008021FFF713F9012025 -:10615000A8E74025D2E79A4207D0084C2A00200041 -:10616000FEF7B6F980212200D0E780210022CDE79A -:106170000022CBE7F4140020255200101015002057 -:1061800010B50400FFF76EF9002801D1002010BD02 -:10619000FFF770F90028F9D1B22292006243034B55 -:1061A00001309B181B791840F1E7C0462C120020E3 -:1061B000B2239B00434310B50248181800F050FB6F -:1061C00010BDC0463C120020F0B5B225AD004543DD -:1061D0002C00C646174F1034E41900B5200092B2C7 -:1061E00000F0C0FB0600200000F058FB3F2803D859 -:1061F000300080BCB846F0BD7B190020D9789846A5 -:10620000FFF76CFE0028F3D0200000F047FB3F288A -:106210000AD992239B00EA184346D219D978002064 -:106220004023FFF783FEE3E743460020D978FFF7DA -:1062300069FEDDE72C120020F8B50400FFF712F923 -:10624000002801D10020F8BDFFF714F90028F9D18A -:10625000B2239B005C432500144E2435AD19280061 -:1062600000F0FEFA0028EDD037190020B978FFF7CA -:1062700035FE0028E6D0A2239B009C466444A41966 -:1062800021002800402200F06DFBB978051E08D0DF -:10629000030022000020FFF749FE0028D2D028008A -:1062A000D1E70020FFF72EFECCE7C0462C120020DD -:1062B00070B5B224A4004443094B0500E418200043 -:1062C00092B200F017FC0600200000F0C9FA3F2847 -:1062D00001D8300070BD2800FFF7AEFFF9E7C046D7 -:1062E00050120020B2239B00434310B502481818F7 -:1062F00000F0D4FA10BDC04650120020B222F0B512 -:106300001B4C83B0002120009200FEF7DBF8FF2336 -:106310006371184B80260025E380012708232100A4 -:106320002000760023733200278138310095073B27 -:10633000103000F05FFA2100200039313200FF31C7 -:1063400001230097243000F055FA8E239B00E618B5 -:106350003000FAF7A7FB90239B002662E618300076 -:10636000E561FAF79FFB2663656303B0F0BDC046A5 -:106370002C12002000C2FFFF10B5094C052200219D -:106380002000FEF79FF820002434103000F06EFC4F -:10639000200000F06BFC0121200000F087FC10BD04 -:1063A0002C120020F0B54B79060083B0022B02D1ED -:1063B0008B79022B03D00025280003B0F0BD2F4FAE -:1063C000BB78002BF7D18B7809253B700C780C1922 -:1063D0006378242B0BD1082A02D81FE0AA421DD3D0 -:1063E0002378E4185D196378ADB2242BF6D0052B21 -:1063F00031D0042B12D163790A2B0FD1204B27788F -:10640000019301330093022202233000E119FFF7C8 -:10641000D9FC0028CFD00E35ED19ADB2194C2000B3 -:1064200000F03CFA3F28C7D92600103E0020F17842 -:10643000FFF754FD0028BFD0200000F02FFA3F28BE -:1064400017D98E239B00E218F93BF178FF3B00201F -:10645000FFF76CFDB0E721003000FFF725FD0028B5 -:10646000A9D0A3787B7023785D19E4186378ADB266 -:10647000BFE7F1780020FFF745FD9DE72C120020D3 -:106480002E1200203C120020F8B560231400127870 -:10649000050013400020202B12D12F4A6379277961 -:1064A00016781B023B439E420AD16378222B1AD0F6 -:1064B00007D8202B3CD0212B02D1012930D001203C -:1064C000F8BD232BFCD101293FD00329F7D1234B61 -:1064D000002BF4D0E178A37809020020194300E0F2 -:1064E00000BF0120ECE701292FD00329E7D10125C6 -:1064F0002E00A378E478023924021C43147126404C -:1065000024321000714000F0D1FB154B002BD6D087 -:106510006208002031002A4000E000BF0120CFE7E0 -:106520000723210028000F4AFFF73CFD0120C7E7A1 -:106530000129F5D00329C2D10B4B002BBFD000207D -:10654000911DFEF7D9FA0120BAE721002800FFF7D4 -:1065500013FD0120B4E7C0462C120020000000000B -:106560000000000032120020F94A0010F8B545463C -:106570005746DE464E46E0B5464D1F00EA78804657 -:106580000C00AB788A4246D000208B421AD0F0BC77 -:10659000BB46B246A946A046F8BD3F4B002B04D0EF -:1065A000484600F073F900286CD0484600F076F9B0 -:1065B0003F2807D94E46103E0020F178FFF78EFCA9 -:1065C000002851D1AB78A34201D00120DFE7334B43 -:1065D000002B02D0002000E000BF0020FFF72CFEBF -:1065E0000028F2D12E4C200000F03AF90028ECD11E -:1065F000002FEAD0BF06E8D1243C4046A178FFF73F -:106600006DFC0028E1D0002300224046A178FFF76E -:106610008DFC0120BBE792239B00EE1810239B46C4 -:10662000AB4431005846BAB200F064FA1D4BD9466B -:10663000002BB2D06B79FF2BAFD0002FADD0F21969 -:10664000924603E00136B245A7D06B7932789A4280 -:10665000F8D1484600F01AF90028F3D14B46103B18 -:10666000597900E000BFEDE7484600F017F93F28F0 -:106670000BD98E2292004023F1784A440020FFF784 -:1066800055FC9FE7FEF7ACFB8FE7F1780020FFF7A2 -:1066900039FC97E72C120020E14D001000000000AB -:1066A000501200200000000010B50020FEF7F4FE9C -:1066B00010BDC04610B5FEF7E5FE10BD037870B5FD -:1066C000DB0704000E00DD0F002B17D103785B07FA -:1066D00001D5280070BD01213000494200F074FB53 -:1066E0002378DB07DD0F002B0AD123785B0708D462 -:1066F0000422237801251343237002E00025E8E7F4 -:106700000025300000F030FBE3E7C04670B50C0018 -:10671000012106004942200000F056FB33785B0758 -:10672000DD0F002B04DB200000F01EFB280070BDF5 -:106730003378DB0704D40422337893433370F2E7D1 -:106740000025F0E7437902791B021343C2785B0509 -:1067500092075B0D920F022A1DD0032A0CD0002055 -:10676000012A08D102394A425141124A94466144F1 -:1067700099424041C0B2704702394A1E91410E4AC7 -:10678000494211408022D20094460020614499423F -:106790004041C0B2EFE7022905D0002040229A42D2 -:1067A0004041C0B2E7E7054A981843425841C0B299 -:1067B000E1E7C046FF03000040FCFFFF00FEFFFFD3 -:1067C0008A1870B5914207D27F264C78052C04D0E8 -:1067D0000C7809198A42F8D870BD34008D782C40A5 -:1067E00064000419ED0963550C7809198A42ECD844 -:1067F000F2E7C046F0B5C64600B5040006A8057825 -:106800008020884617001E000002824226D8E068D9 -:10681000002803D00121494200F0D6FA206900285F -:1068200003D00121494200F0CFFA434623607304AC -:106830005B0CED031D430023E0686381A780E580C6 -:106840002381002801D000F08FFA2069002801D0B0 -:1068500000F08AFA012080BCB846F0BD0020FAE7BB -:1068600010B5048941898288A3B288B28C4207D3CB -:106870001B1A9BB2101C9A4200D9181C80B210BD82 -:106880005100091A5B189BB2F4E7C046038940899E -:10689000181A43425841C0B27047C04610B5048927 -:1068A00041898288A3B288B28C4207D31B1A9BB25B -:1068B00000209A4201D9D21A90B210BD5100091A93 -:1068C0005B189BB2F4E7C04670B5040000690E0087 -:1068D000002803D00121494200F076FA2589608919 -:1068E000A288A9B283B285422CD3CD1AADB2002DB5 -:1068F0002ED0AA4208D2914230D3891A8BB263813A -:106900009A4203D89B1A9BB29A42FBD9E28821682B -:106910005204520C53433000C918FDF7D9FD638966 -:106920000125591C89B2A2888B4213D9002152003B -:10693000891A89B220696181002801D000F014FA17 -:10694000280070BD5500ED1A4D19ADB2002DD0D103 -:10695000618989B252009142ECDBE9E789188BB278 -:106960006381CDE7F0B546464F46D646C0B5060032 -:10697000006989469046002803D00121494200F071 -:1069800023FA31897289B5888BB294B2914254D37B -:106990001F1BBFB2002F4AD0BD4205D2AB4251D21D -:1069A0005B199CB22F0074814346B8453DD89FB215 -:1069B000A54203D8641BA4B2A542FBD9F288316872 -:1069C0005204520C904662432B1B9BB289184246DC -:1069D0009F4225D953439BB21A0048469A46FDF779 -:1069E00077FD434648467D1B64195C43316850443B -:1069F000A2B2FDF76DFD7189B588CB199BB26A0013 -:106A0000994216D99B1A9BB230697381002801D034 -:106A100000F0AAF93800E0BCBA46B146A846F0BD7D -:106A200048467A43FDF754FDE5E73B1CBFE7738911 -:106A30009BB26A009342E7DBE4E76F003F1BDF197C -:106A4000BFB2A7E75B1B9CB2ACE7C046F8B5040039 -:106A5000C0680E00002803D00121494200F0B4F9BB -:106A6000258920896189A288ADB283B28FB288421C -:106A700029D3DB1B9BB29A4209D8E779FF0906D1DB -:106A8000E068002801D000F06FF93800F8BD9542A9 -:106A90001ED32B009B1A9BB29342FBD2E288206844 -:106AA0005204520C53433100C018FDF711FD6B1C0A -:106AB0009BB2A2889D4218D9002352009B1A9BB218 -:106AC00001272381DCE75100C91B5B189BB2D2E789 -:106AD0002B00E28820685204520C53433100C01846 -:106AE000FDF7F6FC0135A288ABB252009342E7DB1A -:106AF000E4E7C046F0B557464546DE464E46E0B5AB -:106B0000140005000F0083B0002A75D0C06800286B -:106B100003D00121494200F057F92E89E9796A89A9 -:106B2000AB88B6B292B2C90945D1964200D36DE0A6 -:106B300059008A1AB21892B2002189469A4234D278 -:106B40009A1A111C92B2A24200D9211C8AB2914613 -:106B5000EA885204520C90464A46B21892B29246C3 -:106B60004A46D21A92B2934634009E4203D3E41AA4 -:106B7000A4B29C42FBD24246624328681B1B9BB2D4 -:106B8000801842464B4554D34B4639005A43FDF7D3 -:106B90009FFCAB885B00B24501D39A4503DB5246AC -:106BA000D31A9BB29A4653462B81E868002825D019 -:106BB00000F0DAF822E0E9884904490C88469C4252 -:106BC00027D2964247D3B11A89B28C465800E11AAF -:106BD00089B28B4661460919814208DBD11889B216 -:106BE0000E1BB6B28A46B2423BD9361AB6B2A219C9 -:106BF00092B29246A146B7E700239946484603B0B1 -:106C0000F0BCBB46B246A946A046F0BDB21A92B24D -:106C100092E700218946002BC7D04146E41A4C4335 -:106C20001600D118002289B28A46994693463F1928 -:106C30009AE753439BB21A0039005C440193FDF775 -:106C400047FC414622004A43019B286892B2F9184A -:106C5000FDF73EFC9DE75800811A711889B28C46F9 -:106C6000B5E7A146B04200DD7EE7BEE710B50400FF -:106C7000C068002803D00121494200F0A5F820692E -:106C8000002803D00121494200F09EF80023E0686B -:106C900063812381002801D000F066F82069002874 -:106CA00001D000F061F8012010BDC04670B50400AD -:106CB000C0680D00002803D00121494200F084F88B -:106CC0002069002803D00121494200F07DF87F218E -:106CD000E379ED011940E0682943E171002801D012 -:106CE00000F042F82069002801D000F03DF80120B2 -:106CF00070BDC04610B583070AD00300032102E02F -:106D000001330B4205D01A78002AF9D1181A10BDA8 -:106D1000030019680C4A0D4C8A188A4322420FD18D -:106D20005968094A04338A188A43224208D15968AB -:106D3000054A04338A188A432242F1D000E0013325 -:106D40001A78002AFBD1E1E7FFFEFEFE80808080FA -:106D5000F8B5C0460000000001B40248844601BCFA -:106D6000604700BFC902002001B40248844601BC4C -:106D7000604700BF2D02002001B40248844601BCD8 -:106D8000604700BF750D002001B40248844601BC75 -:106D9000604700BFD909002001B40248844601BC05 -:106DA000604700BF750D002001B40248844601BC55 -:106DB000604700BFC100002001B40248844601BC06 -:106DC000604700BFB109002001B40248844601BCFD -:106DD000604700BF9D01002001B40248844601BC09 -:106DE000604700BF0101002001B40248844601BC95 -:106DF000604700BF4D0B002001B40248844601BC2F -:106E0000604700BF8903002001B40248844601BCEA -:086E1000604700BFF50A0020F5 -:106E180056616C756520617420255820697320259A -:106E2800580A00000000000048656C6C6F2C204276 -:106E380049545321000000004E6F207370696E6C36 -:106E48006F636B732061726520617661696C616242 -:106E58006C6500004E6F207573657220495251733E -:106E68002061726520617661696C61626C65000001 -:106E7800486172647761726520616C61726D20256A -:106E88006420616C726561647920636C61696D6509 -:106E9800640000000A2A2A2A2050414E4943202A29 -:106EA8002A2A0A000A00000048617264206173738C -:106EB80065727400666E692B00000000666E6900DA -:106EC8006E616E00666E692D0000000052656C658B -:106ED80061736500626F6F74325F77323571303875 -:106EE80030000000312E352E310000007069636FCC -:106EF8000000000074657374000000004E6F762077 -:106F08002037203230323300554152542073746494 -:106F1800696E000055415254207374646F75740093 -:106F28005541525420737464696E202F2073746421 -:106F38006F75740055534220737464696E202F2056 -:106F48007374646F75740000526173706265727255 -:106F580079205069000000005069636F000000004C -:106F6800426F6172642043444300000052657365B8 -:106F780074000000556E68616E646C656420495247 -:106F88005120307825780A00657020256420257303 -:106F98002077617320616C72656164792061766124 -:106FA800696C61626C65000043616E277420636FD1 -:106FB8006E74696E75652078666572206F6E2069DB -:106FC8006E61637469766520657020256420257379 -:106FD800000000006F757400BC2B00106C2B0010B3 -:106FE8006C2B0010B42B00106C2B00106C2B0010B5 -:106FF8006C2B00106C2B00106C2B00106C2B0010ED -:107008006C2B0010AC2B00106C2B0010A42B001064 -:107018006C2B00106C2B00109C2B0010702E001095 -:10702800D22B00106A2E0010D22B0010542E001004 -:10703800D22B0010D22B0010D22B0010D22B001014 -:10704800D22B0010D22B0010D22B0010C42B001012 -:10705800D22B0010D22B0010D22B0010D22B0010F4 -:10706800D22B0010C42B0010F82E0010262B001075 -:10707800262B0010262B0010262B0010262B001084 -:10708800262B0010262B0010262B0010262B001074 -:10709800262B0010262B0010262B0010262B001064 -:1070A800262B0010262B0010262B0010262B001054 -:1070B800262B0010262B0010262B0010262B001044 -:1070C800262B0010262B0010262B0010262B001034 -:1070D800262B0010262B0010262B0010262B001024 -:1070E800262B0010262B0010842E0010C42E001012 -:1070F800842E0010262B0010262B0010262B0010A3 -:10710800262B0010262B0010262B0010262B0010F3 -:10711800262B0010262B0010262B0010262B0010E3 -:10712800262B0010262B0010262B0010262B0010D3 -:10713800262B001098300010262B0010262B00104C -:10714800262B0010262B0010262B0010262B0010B3 -:10715800262B0010262B0010262B0010983000102C -:107168000A2F001098300010842E0010C42E001032 -:10717800842E001000000000000000000000F03F16 -:1071880000000000000024400000000000005940FA -:107198000000000000408F40000000000088C3404D -:1071A80000000000006AF8400000000080842E41C2 -:1071B80000000000D01263410000000084D797410E -:1071C8000000000065CDCD4106005250D3F0754255 -:1071D800D46E001006005250E182887FDC6E0010E9 -:1071E80006005250BBFF3CB6F46E00100D0A0000BA -:1071F8000600525053B4F4A1286F001008005250F2 -:1072080092000000514A0010554A0010614A0010CF -:107218008D4A0010894A00100000000006005250F4 -:1072280053B4F4A13C6F001000000000506F001030 -:10723800606F0010701C0020686F0010746F0010E1 -:1072480009025400030100807D080B0002020200BD -:1072580000090400000102020004052400200105C1 -:107268002401000104240202052406000107058107 -:107278000308001009040100020A000000070502C3 -:1072880002400000070582024000000904020000D5 -:10729800FF00010512010002EF0201408A2E0A00D8 -:1072A8000001010203010000A05500103A57001028 -:1072B800EE560010A0550010D0560010B856001019 -:1072C80040560010EE550010E2550010565A0010B6 -:1072D8003C5A0010EC5700106A5A0010EC57001086 -:1072E800245A0010105A0010EC570010FC590010D6 -:1072F800D2590010EC570010EE5A0010D25A001064 -:10730800C65A0010EC570010EC570010A85A00108D -:10731800D25A0010EC570010EC570010EC57001030 -:10732800EC570010EC570010EC570010EC57001009 -:10733800845A0010FD62001079630010A5630010E4 -:0C734800896400106D650010000000005A -:10735400D0710010DC71001088020010E871001078 -:1073640094020010A0020010AC020010047200107D -:08737400F871001024720010F2 -:10737C0003000068EFF3108C72B60268002AFCD090 -:10738C00BFF35F8F04229A56002A04DB002900D039 -:10739C000A60002004E0D0220120120612681A7143 -:1073AC001B68BFF35F8F00221A608CF31088704744 -:1073BC00F0B5C646150000B504001E000268EFF3D8 -:1073CC00108172B61368002BFCD0BFF35F8F0423BF -:1073DC00E356002B2DDB2268BFF35F8F002010607B -:1073EC0081F31088D0221206127852B290469A423B -:1073FC0003D1002080BCB846F0BD00270BE0236809 -:10740C00BFF35F8F1F6081F310882800310000F0FC -:10741C0013FE0028EDD12268EFF3108172B61368C9 -:10742C00002BFCD0BFF35F8F23797F2BE7D943462A -:10743C0002E0D0231B061B6823712368BFF35F8F08 -:10744C0000221A6081F310880120D3E7F0B5C646FC -:10745C0000B50D00040000F017FEFA2206000F0024 -:10746C00002328000021920000F0FEFD8023361836 -:10747C004F411B069F4202D30126174F7642D02361 -:10748C001B061B68002598460BE02368BFF35F8F33 -:10749C001D6081F310883000390000F0CDFD00280C -:1074AC0018D12268EFF3108172B61368002BFCD050 -:1074BC00BFF35F8F23797F2BE7D943462371236872 -:1074CC00BFF35F8F00221A6081F31088012080BC0B -:1074DC00B846F0BD0020FAE7FFFFFF7F0268EFF32C -:1074EC00108172B61368002BFCD0BFF35F8FFF23A3 -:1074FC0003710368BFF35F8F00221A6081F3108859 -:10750C0040BF704710B5084C2378002B0AD180235C -:10751C00064807495B051A68C25004338B42FAD1FE -:10752C000123237010BDC046831C00207C16001064 -:10753C000001001010B5014B984710BD7D160020BE -:10754C00034B1A68C0239B009343024A1360704795 -:10755C000C8001400C900140054B1A6880239B0065 -:10756C005340C02292001340024A13607047C04639 -:10757C000C8001400C9001401423F0B5D6464F46C8 -:10758C0046469A46814618880433C0B598460E0084 -:10759C001B88264914009847534607001888434611 -:1075AC0023491B88984753460500188843462149B0 -:1075BC001B8898478046FFF7A5FFB847A847FFF7F9 -:1075CC00CBFF221E20D0C02108270220490511E044 -:1075DC00002C14D0131B0D2B20D9002D0AD0230006 -:1075EC00002A05D00B6E013A337013000136234389 -:1075FC00002B09D03D008B6A1D401842E8D1002DAC -:10760C00EDD123001343F5D1FFF79AFFC047FFF7E5 -:10761C0091FFE0BCBA46B146A846F0BD4B461B787C -:10762C00013C0B6601239C46E144E8E74946000017 -:10763C0045580000464300000022154B10B59A60D7 -:10764C00DA601A615A619A61DA611A625A629A6254 -:10765C00DA621A635A639A63DA631A645A649A6434 -:10766C00DA641A655A659A65DA651A665A669A6614 -:10767C00DA661A675A679A67DA67F0329200002165 -:10768C00044800F0F9FC044B044A1A6010BDC046D3 -:10769C0000001050441800200C1C002080011050D9 -:1076AC00F0B557464E464546DE46E0B5254B00251F -:1076BC009F6D012687B0002F23D0234B99460123C1 -:1076CC009B46224B984601E0202D1AD032002C000C -:1076DC000135B2463A40EDB27600002AF4D04B4662 -:1076EC0052469A655B46640864002B40E4186401BA -:1076FC004444200000F0B8FB002809D153469F43B6 -:10770C00E2D107B0F0BCBB46B246A946A046F0BDDC -:10771C00E28AA37802A80192002106220630009387 -:10772C0000F0AAFCE02302A9DB008B80009B019AED -:10773C000B7203A80121059200F0BEFB200000F0A3 -:10774C002BFBDBE700001150003011500418002017 -:10775C009823C84AF0B5D55880232C009B021026DC -:10776C0085B01C401D427AD0C34BC44C9A6AC44BA2 -:10777C0000261A603B23E35C022B00D1DFE07B2365 -:10778C00E35C022B00D1B9E1BB23E35C022B00D1FB -:10779C00A9E1FB23E35C022B00D199E13C23FF33ED -:1077AC00E35C022B00D158E17C23FF33E35C022B1A -:1077BC0000D145E1BC23FF33E35C022B00D132E165 -:1077CC00FC23FF33E35C022B00D11FE1AD4BE35CE8 -:1077DC00022B00D10EE1AC4BE35C022B00D1FDE09F -:1077EC00AA4BE35C022B00D1ECE0A94BE35C022B2F -:1077FC0000D1DBE0A74BE35C022B00D1CAE0A64B27 -:10780C00E35C022B00D1ABE0A44BE35C022B00D178 -:10781C007FE1A34BE35C022B00D196E1002E08D153 -:10782C00A04B1B78002B04D180219F4A90338902F6 -:10783C00D150904B0A229C6C6B460021981D00F095 -:10784C001BFCC023640501AE9B00640D338030002B -:10785C0002940121802400F02FFB944EA402EB062D -:10786C0069D480235B021D4214D0012223211C43C6 -:10787C00824B5A54DA70C0238D4ADB00019302AB61 -:10788C0003CA03C3012101A800F016FB8022864B1A -:10789C0092021A6580235B011D4233D18023DB01E8 -:1078AC001D421CD180231B021D4204D1AC4200D0CE -:1078BC00C8E105B0F0BD1C436B460A220021981D9F -:1078CC0000F0DAFBA02301AEDB0033800121300095 -:1078DC0000F0F2FA8022744B12011A65E6E71C43A1 -:1078EC006B460A220021981D00F0C6FB802301AED6 -:1078FC00DB0033800121300000F0DEFA10226A4BED -:10790C001A65CFE700221C435A4B01AE1A60FFF7F1 -:10791C0093FE6B460A220021981D00F0ADFB8023DC -:10792C005B0033800121300000F0C6FA80225E4BF0 -:10793C0012031A65B2E7FFF7B3FE340091E7383350 -:10794C00E65C002E00D11AE70233E25C002A00D17B -:10795C0015E7200000222030E25400F04FFA0EE729 -:10796C00544BE75C002F00D14EE70233E25C002A57 -:10797C0000D060E1494BE35C022B00D1DBE0484BCB -:10798C00E35C022B00D054E74B4BE35C002B00D0A4 -:10799C00E0E04EE7494BE75C002F00D12FE70233C4 -:1079AC00E25C002A00D03EE13E0028E7444BE75C55 -:1079BC00002F00D11EE70233E25C002A00D02AE13E -:1079CC003E0017E73F4BE75C002F00D10DE7023379 -:1079DC00E25C002A00D016E13E0006E73A4BE75C79 -:1079EC00002F00D1FCE60233E25C002A00D002E159 -:1079FC003E00F5E6354BE75C002F00D1EBE6023399 -:107A0C00E25C002A00D0EEE03E00E4E6F933FF33FE -:107A1C00E75C002F00D1D9E60233E25C002A00D0EB -:107A2C00D8E03E00D2E6B933FF33E75C002F00D13B -:107A3C00C6E60233E25C002A00D0C2E03E00BFE69C -:107A4C007933FF33E75C002F00D1B3E60233E25CFD -:107A5C00002A00D0ACE03E00ACE63933FF33E75CE3 -:107A6C00002F00D1A0E60233E25C002A00D096E0A1 -:107A7C003E0099E60000115000400540041800201B -:107A8C00FC1700203B0200007B020000BB02000040 -:107A9C00FB0200003B0300007B030000BB03000063 -:107AAC00FB030000821C002000301150100002006B -:107ABC00000010507A030000FA0300003A030000A3 -:107ACC00FA020000BA0200007A0200003A0200003A -:107ADC00F833E75C002F00D160E60233E25C002A49 -:107AEC0055D13E005AE6B833E75C002F00D150E682 -:107AFC000233E25C002A42D13E004AE67833E75C6E -:107B0C00002F00D140E60233E25C002A2FD13E0068 -:107B1C003AE64F4BE35C002B00D17AE6EF239B0057 -:107B2C00E25C002A00D12AE70022E2541C3BE01858 -:107B3C0000F064F923E7464BE35C002BEED1454B98 -:107B4C00E35C022B00D074E63E00434BE35C002B5D -:107B5C0000D163E6FF239B00E25C002A00D168E6BB -:107B6C000022E2541C3BE01800F048F961E62000CA -:107B7C0000226030E2543E0000F040F904E62000A0 -:107B8C000022A030E2543E0000F038F901E620005B -:107B9C000022E030E2543E0000F030F9FEE5200017 -:107BAC0000222130FF30E2543E0000F027F9FBE5C3 -:107BBC00200000226130FF30E2543E0000F01EF93C -:107BCC00F8E520000022A130FF30E2543E0000F026 -:107BDC0015F9F5E520000022E130FF30E2543E00BB -:107BEC0000F00CF9F2E50022E2541C3BE01800F026 -:107BFC0005F93E00EFE50022E2541C3BE01800F0D2 -:107C0C00FDF83E00ECE50022E2541C3BE01800F0CD -:107C1C00F5F83E00E9E50022E2541C3BE01800F0C8 -:107C2C00EDF83E00E6E50022E2541C3BE01800F0C3 -:107C3C00E5F83E00E3E50022E2541C3BE01800F0BE -:107C4C00DDF897E621000548694000F0FDF9C046D3 -:107C5C00BA030000FB030000FA0300007C6F001065 -:107C6C00084A0300126C0020920703D49A78D209B8 -:107C7C00012A00D07047D87E023843425841C0B226 -:107C8C00F8E7C0460000115010B5FFF7E9FF0028D7 -:107C9C000CD00749074B8C46074A9B6A1268634411 -:107CAC009B1A0020C6229A424041C0B210BDC04669 -:107CBC00E0FCFFFF00400540FC170020F8B5028BEC -:107CCC00838A04000F00161C9A4200D91E1CE2780D -:107CDC0080211500681E8541B6B2C90031436D0381 -:107CEC000D4301214A409B1BE27062789BB2A38238 -:107CFC00002A09D0002B02D18023DB011D43002F69 -:107D0C0000D02D042800F8BDE068BB01C01832007B -:107D1C00216900F0A1F923699B19236180231B02BF -:107D2C001D43A38AE6E7C046836870B504001D684E -:107D3C00002900D02D0C6378AD05AD0D002B09D1B9 -:107D4C00E38AEB18E382238BAB4201D90023A38295 -:107D5C00280070BDE368890159182A00206900F0D9 -:107D6C007BF9E38AEB18E38223695B192361EAE769 -:107D7C0010B50400836800211B68FFF7D5FF63680A -:107D8C001B685B0002D5238B834200D010BD012100 -:107D9C002000FFF7C9FFF9E70023837643610361F5 -:107DAC007047C04610B58368002901D01C6821407B -:107DBC00002A11D08024E400114322420CD01A680E -:107DCC0022420BD10A4A0A401A60FFE7FFE7FFE79D -:107DDC00FFE7FFE7FFE78368196010BD81787F201C -:107DEC00CA09044B92000140D258034800F02CF908 -:107DFC00FFFBFFFFB00E0020906F0010436870B5C2 -:107E0C00002180251E680400FFF758FF134B6D01FD -:107E1C001B6C05439B070FD5A3785B060FD0104B4B -:107E2C001E4080239B0533436268002113602000B1 -:107E3C002A00FFF7B7FF70BDA378DB09EFD0A38A48 -:107E4C00002BECD001212000FFF738FFA023054ABE -:107E5C00DB05324005431343E6E7C04600001150F2 -:107E6C00FFFFFFAFFFFFFFDF70B5857E0400002D25 -:107E7C0014D0FFF77DFFA38A002B01D1280070BD21 -:107E8C002000FFF701FF002803D0012300252377F2 -:107E9C00F4E72000FFF7B2FF0025EFE781787F20A1 -:107EAC00CA09034B92000140D258024800F0CCF8AA -:107EBC00B00E0020B06F0010F0B5C64600B5437888 -:107ECC00050084B0042B00D178E047D8022B00D1F8 -:107EDC0086E0032B56D14E4F4E4A002490463B78F9 -:107EEC004D4E03E00134E4B29C4216D8002EF9D07A -:107EFC009C42F7D24146620009681219D2008A18D6 -:107F0C00002AEFD05269002AECD069682878904793 -:107F1C0001343B78E4B29C42E8D9404B1A785207C2 -:107F2C0048D504211A788A431A706B460A2200211C -:107F3C00981D00F0A1F86A462B7813710523537134 -:107F4C00374B1C686269EFF3108172B61368002B13 -:107F5C00FCD0BFF35F8FA16101A920E0052B11D1EB -:107F6C002E4B1A78D20725D504211A788A431A7019 -:107F7C002B4B1C686269EFF3108172B61368002BEF -:107F8C0009D1FBE7264B1C686269EFF3108172B6CE -:107F9C001368002BFCD0BFF35F8FA1612900200078 -:107FAC0000F042F86269A369BFF35F8F0021116092 -:107FBC0083F3108804B080BCB846F0BD174B1A7818 -:107FCC00D207F7D504211A780A431A70144B1C688F -:107FDC006269EFF3108172B61368002BDBD1FBE7FB -:107FEC0001200E4A117881431170117899430023B6 -:107FFC0011700421537013788B431370084B1C6859 -:10800C006269EFF3108172B61368002BC3D1FBE7E2 -:10801C00811C002028120020ED4A00105015002071 -:10802C00A81500207047C04601B40248844601BC24 -:10803C00604700BF4D6A001001B40248844601BC81 -:10804C00604700BF2111001001B40248844601BCF6 -:10805C00604700BF651F001001B40248844601BC94 -:10806C00604700BFD144001001B40248844601BCF3 -:10807C00604700BFF143001001B40248844601BCC4 -:10808C00604700BFC544001001B40248844601BCDF -:10809C00604700BFC112001010000000000000007B -:1080AC0000000100000000000000000000000200C1 -:1080BC0000000000000000000000030000000000B1 -:1080CC00000000000000FF000000000001B548683F -:1080DC0001318E460047704609380149884701BD79 -:1080EC00910900104C0E002000000000200F002011 -:1080FC00901700200000000000000000A0170020D6 -:10810C000000000000000000100000000000000053 -:10811C00503300004C330000543300005233000045 -:10812C004D5300004D430000533400004334000015 -:10813C007948001000000000C54800107D4900106F -:10814C000000000000010000354C00100000000091 -:10815C00A54B00102D4B001000000000000100008A -:10816C00DC6F0010186F0010AC15002010000C0014 -:10817C0000000000000000000000000000000000F3 -:10818C0000000000FF0000000000000000000000E4 -:10819C00B5440010FD360010F93D001025440010C8 -:0881AC00E5020010694F00100C +:10030000F01C0020607C0010F0B5D64646464F46F3 +:10031000C0B586B005F0FAF8D026002000F076FED1 +:100320000123360673621D4B01219A4603231C4AA2 +:100330005B42504600F0E8FA0023039302930193D6 +:10034000083300930422073B0721504600F0DEFDEE +:10035000144B17249946144B144D98466C442A6844 +:100360002900484605F0C6F82178404605F0C2F855 +:10037000012221000223504600F0E2FB0127FA206F +:100380002378800001332370776101F0FFFCFA20AD +:10039000B761800001F0FAFC0435E0E7D41C0020CE +:1003A000400ECF19607C0010787C001000F0FF1028 +:1003B0000A2300B583B000931722192101330248A4 +:1003C00000F05AF803B000BDD41C0020F0B546463A +:1003D0004F46D646C0B584B01E000CAB1B78070054 +:1003E00098466B4608001500D022D91D01230870DD +:1003F000386912065468C4402342FBD1B868834070 +:100400001C489361012207F0F3FB002E14D0002357 +:10041000A9460F2500249A466D4453464A462B7040 +:1004200029000123134807F0EBFB01239C4601340C +:10043000E4B2E144B442F0D10E4807F053FB01238B +:10044000BA68D0249340240663614346002B05D14B +:1004500004B0E0BCBA46B146A846F0BD0021012078 +:1004600001F080FC012239696368CB401A42FBD15C +:10047000EEE7C04600C0034070B504002361049B52 +:100480000125636100230800A160E260A37100F010 +:10049000BDFD2A00A368D0269A4036067262E06845 +:1004A00000F0B4FD2A00E36820699A40726200F00F +:1004B000ADFD2A00236960699A40B26200F0A6FD92 +:1004C000636904499D400448B56207F065FA20005D +:1004D00070BDC04680841E0000C00340F0B5C64613 +:1004E000072300B50600100C0B40C0B2110A000231 +:1004F000C9B2090403430B431206134382B00193AC +:100500006B46D020991C9723012234690B7000069A +:100510004368E3401A42FBD1B36800279A408261E6 +:100520000122144807F064FB02AB98466B4601AC0D +:10053000DD1C2200012329000E4801342F7007F032 +:100540005FFBA045F5D10B4807F0CCFA0123B26858 +:10055000D0249340240600210120636101F002FCB5 +:10056000012231696368CB401A42FBD102B080BCE2 +:10057000B846F0BD00C00340F0B54646D6464F46EB +:10058000C0B5594B0600884682B0994200D886E033 +:1005900001AB99464A46554B13806A469823D024AE +:1005A000012793703269240663683900D3401940EB +:1005B0008A461F42F8D13A00B3684D489A406B46CC +:1005C000A261991C012207F013FB6B46DD1C534608 +:1005D0004A4629002B704648012307F011FB534679 +:1005E0006A46290005322B704148012307F008FBB9 +:1005F0003F4807F077FAB36800219F400120676108 +:1006000001F0B0FBD0210122376909064B68FB409D +:100610001A42FBD1404604F0F5F90022354B04F0B4 +:100620006EF904F02FFA6A468623D02193700122D6 +:1006300000BA019009064B68FB401A42FBD1B3682F +:100640002B489A406B468A61991C012207F0D0FA28 +:1006500002AB4C469846002722000123290024487B +:100660002F70013407F0CCFAA045F5D1204807F0EF +:1006700039FA0123B268D0249340240600210120D6 +:10068000636101F06FFB012231696368CB401A425C +:10069000FBD102B0E0BCBA46B146A846F0BD164B4D +:1006A000994205D901AB99464A46144B138074E729 +:1006B000134B994208D8134B99420BD901AB994679 +:1006C0004A46114B138068E701AB99464A460F4BE7 +:1006D000138062E70E4B01AA9146994200D85CE76D +:1006E0000C4B138059E7C04600E9A435E1E9FFFF50 +:1006F00000C003408084EE3F80F8A932D7D8FFFFC6 +:100700008044E52D000B6B1B7581FFFFC1C5FFFF0A +:1007100040FC54196B6F0000F0B50B1C070083B050 +:1007200003313FDAFD236946D0250B718E23012466 +:100730004A713A6902312D060B706B682600D3406E +:100740001E401C42F9D12200BB6819489A40AA6198 +:10075000012207F04DFA6B466946DE7001AA0123BB +:100760000331134807F04CFA6B466A466946053276 +:100770000331DE700E48012307F042FA0C4807F0FF +:10078000B1F9BB6801209C4000216C6101F0EAFADC +:10079000D0210122386909064B68C3401A42FBD1B7 +:1007A00003B0F0BD59B21629BDDD1623BBE7C04624 +:1007B00000C00340F0B5C64600B5204B82B001AC86 +:1007C00023806B46A1700600991C05690D23D0207B +:1007D00001220B7000064368EB401A42FBD1B3685C +:1007E00000279A4082610122154807F001FA072389 +:1007F0006B4498466B46DD1C2200012329001048FB +:1008000001342F7007F0FCF94445F5D10C4807F08E +:1008100069F90123B268D024934024060021012005 +:10082000636101F09FFA012231696368CB401A428B +:10083000FBD102B080BCB846F0BDC04608E7FFFF60 +:1008400000C00340F0B5C646140000B584B00AAA43 +:10085000CEB20500360210880A0A29493243260A18 +:100860000A403604324312022406120A224302923C +:10087000DAB212021B0A1343020A0B40120413439A +:100880001B0200061B0A034303936B46D020991DED +:10089000082301222C690B7000064368E3401A42CA +:1008A000FBD1AB6800279A4082610122154807F00E +:1008B0009FF904AB98466B4602ACDE1D2200012373 +:1008C000310010480134377007F09AF9A045F5D18E +:1008D0000C4807F007F90123AA68D02493402406A6 +:1008E00000210120636101F03DFA0122296963685A +:1008F000CB401A42FBD104B080BCB846F0BDC04624 +:10090000FFFF00FF00C00340F0B5D64646464F4605 +:10091000C0B50126050084B00A209046994601F032 +:1009200035FA3200EB68D0249A402406A2611420E4 +:1009300001F02CFAEB680A209E40666101F026FA6D +:1009400001222B696168D9400A42FBD10B21C022E8 +:10095000D026012769440A70360674683A00DC40E4 +:10096000224092462742F8D13A00AB684C489A4060 +:10097000B261012207F03CF90A246B46524603A9F2 +:100980001A734748012300226C4407F039F900220A +:1009900001232100424807F033F9414807F0A2F84B +:1009A000AB6801209F400021776101F0DBF9D02383 +:1009B00001272A691B0659683E00D1400E400F42AC +:1009C000F9D123782A2B06D0102004B0E0BCBA4617 +:1009D000B146A846F0BD6B4680211E732800012356 +:1009E00003AA0097FFF7F2FCA0220721280052007B +:1009F000FFF774FD7F236A468921137328007E3B2D +:100A000003AA0097FFF7E2FC6B469D211F732800A5 +:100A1000012303AA0097FFF7D9FC6B4680211E73C0 +:100A20002800012303AA0097FFF7D0FC6B4696210C +:100A30001F732800012303AA0097FFF7C7FC6B462A +:100A40008F219E812800022303AA0097FFF7BEFC96 +:100A5000144B95212800039303AA04230097FFF762 +:100A6000B5FC38212800FFF7A5FE4B464946DE1CA1 +:100A700010DA0321494204222800FFF74DFE00232B +:100A800028000949094A0093FFF7DCFE4146280087 +:100A9000FFF772FD49B21629EDDD1621EBE7C046DE +:100AA00000C0034004070001FF0300000302000030 +:100AB000F0B583B06B46D025991C122307000124A2 +:100AC00002690B702D066B682600D3401E401C4245 +:100AD000F9D12200BB6819489A40AA61012207F0A7 +:100AE00087F86B460022D91C0E700123134801AE13 +:100AF00007F086F8012300223100104807F080F843 +:100B000069460022012305310C4807F079F80B48AB +:100B100006F0E8FFBB6801209C4000216C6101F0F9 +:100B200021F9D0210122386909064B68C3401A42D5 +:100B3000FBD1308840BA80B203B0F0BD00C00340A2 +:100B4000F0B5DE464E4645465746E0B585B00193C2 +:100B5000837905008B4691460020002B06D005B016 +:100B6000F0BCBB46B246A946A046F0BDAB704B46B2 +:100B7000EB7002ABDE1C01228C23D0212869AA7104 +:100B8000337009064B68C3401A42FBD1AB68B848C2 +:100B90009A408A610122310007F02AF8AB1D9A467B +:100BA0002F00002355469846BA4603AC43463A0008 +:100BB000237021000123AE48013707F021F8BD4220 +:100BC000F4D15546AA4806F08DFF0123AA68D02724 +:100BD00093403F06002101207B6101F0C3F8012111 +:100BE0002A697B68D3401942FBD181235B002380B3 +:100BF000013BFF3B02A9D0278B70013B98463F0683 +:100C00007B684146D340404619401842F8D14246DD +:100C1000AB688A469A4002AB991CBA61944801229B +:100C200006F0E6FF5346220031003370904801235E +:100C300006F0E6FF534602AA3100053233708C48B5 +:100C4000012306F0DDFF8A4806F04CFF4246AB6800 +:100C500001209A4000217A6101F084F8D02101221C +:100C6000286909064B68C3401A42FBD1AB6880482B +:100C70009A400E238A6123700122210006F0B8FFFA +:100C8000012200217A4806F0B3FF4B460027002BD3 +:100C90000BD0A8465D46E91902227548013706F0D7 +:100CA000A7FFBBB24B45F6D345460120AB680121F7 +:100CB00098408446D020634600062A694361436811 +:100CC0000F00D3401F401942F9D1072302A9A37096 +:100CD0007C338B70D0212780012709064B68D340D5 +:100CE0001F42FBD163468B6102AB0122991C604815 +:100CF00006F07EFF02AA0723944663449A46002327 +:100D00002700984643463A00337031000123584883 +:100D1000013706F075FFBA45F4D1554806F0E2FEFA +:100D20000123AA68D02793403F06002101207B6160 +:100D300001F018F8012229697B68CB401A42FBD1E7 +:100D4000019B01209B0700D409E72800FFF7B0FEB4 +:100D5000484B8346184200D087E0D0231B069946B3 +:100D600001272A69122302A98B704B465B68390060 +:100D7000D340194088461F42F7D13A00AB683C483F +:100D80009A4013004A46936102AB991C012206F077 +:100D90002FFF43460022310033703548012306F00F +:100DA0002FFF012300222100314806F029FF02A96C +:100DB0000123002205312E4806F022FF2C4806F0C0 +:100DC00091FE3A00AB6800219A4013004A46012088 +:100DD000536100F0C7FF2A6911004B465B68D3409E +:100DE0001F42FAD123885BBA98B283462148184241 +:100DF000B8D00023AB71013B02AAD0202380A3709E +:100E000083339370012200064368CB401A42FBD122 +:100E1000AB6800279A4002AB8261991C01221448FA +:100E200006F0E6FE2200012331001148377001343C +:100E300006F0E6FEA245F5D10D4806F053FE01236B +:100E4000AA68D0249340240600210120636100F0A9 +:100E500089FF012229696368CB401A42FBD1064809 +:100E60005844431E9841C0B279E62969C1E7C0469B +:100E700000C003400102000000FEFFFFF0B5C646BF +:100E800000B582B00B0C01AC23700B0A63706B468B +:100E9000A1700600991C05698223D02001220B70E5 +:100EA00000064368EB401A42FBD1B36800279A4022 +:100EB00082610122144806F09BFE07236B4498468A +:100EC0006B46DD1C2200012329000F4801342F70DE +:100ED00006F096FEA045F5D10B4806F003FE01236F +:100EE000B268D0249340240600210120636100F001 +:100EF00039FF012231696368CB401A42FBD102B04D +:100F000080BCB846F0BDC04600C00340F0B5DE4628 +:100F100057464E464546E0B585B004000EA8008809 +:100F2000160281460FA800781B04804610A800789E +:100F30000E43834611A80778002001251E436B4607 +:100F4000824618739F210123200003AA0095FFF712 +:100F50003DFA6B465246A0211A732000012303AAD2 +:100F60000095FFF733FA6B468A211D732000012399 +:100F700003AA0095FFF72AFA042303AA8B21200075 +:100F800000950396FFF722FA4B4642465BBA238050 +:100F9000FF23002A01D04346A846E3704346A370CE +:100FA0005B4623717B1E9F41012322008C21200080 +:100FB000009367710533FFF709FA002380222000B0 +:100FC000044900939200FFF73DFC20000249FFF71F +:100FD00055FFC046FF030000FFFFFF00094A10B5A0 +:100FE00094464024830063441A68C0006240803401 +:100FF00014408022520113431C60034B9C46604402 +:10100000416010BD04C00140004001400123D022D6 +:101010008340120693629361094A402194468300FB +:1010200063441A68C0004A40803111408022520156 +:1010300013431960034B9C4605236044436070478B +:1010400004C0014000400140024B18688007C00FF7 +:101050007047C04600C0064070B5EFF3108C72B602 +:101060000D4D2B68002BFCD0BFF35F8F0724CB08FE +:10107000C618C05C01230C40A3401C00044003427E +:1010800007D118433070BFF35F8F2C608CF310884A +:1010900070BD100001F0B8FD2C0100D0F8B5474636 +:1010A000CE46884680B5EFF3108C72B6214D2C6881 +:1010B000002CFCD0BFF35F8F9A422CD8D4080727AE +:1010C000055D061901241740BC402C421FD00721A2 +:1010D0000127894609E0D408055D06194C46390008 +:1010E0001440A1400C00294211D001329342F2D2A7 +:1010F00001204042BFF35F8F00220E4B1A608CF339 +:10110000108800280FDBC0BCB946B046F8BD2543A7 +:1011100010003570EEE7BFF35F8F00232B608CF378 +:101120001088012040424346002BECD0089801F083 +:101130006BFDC0462C0100D00021044B044ABFF3D4 +:101140005F8F02C39342FAD17047C046000100D0BE +:10115000800100D0044A1078431CDBB2172B00D961 +:10116000102313707047C046A80E002010B5064B20 +:10117000064C82B00100009318221F232000FFF7C5 +:101180008DFF02B010BDC046987C0010541800209E +:1011900001238340002904D0034A1360034A1360EB +:1011A0007047034A1360FBE780E200E000E100E0E3 +:1011B00080E100E001238340014A13607047C0468C +:1011C00000E200E0084B10309B688000C358002B01 +:1011D00007D0064A00209B1A2F229A424041C0B2F3 +:1011E00070470020FCE7C04600ED00E0AC0E002098 +:1011F000024B10309B688000C058704700ED00E043 +:1012000070B50D00EFF3108672B60F4A1368002B0D +:10121000FCD0BFF35F8F0D4B10309B6884001B59CF +:101220000B4A934203D09D4201D001F005FD074BCC +:101230009B681D51BFF35F8FBFF35F8F0022024B8E +:101240001A6086F3108870BD240100D000ED00E024 +:10125000CD010010F0B557464E46DE464546E0B596 +:1012600085B0060000911700EFF3108B72B66A4A42 +:101270001368002BFCD0BFF35F8F0025674B5D57D1 +:101280009A46002D00DAA9E06B00654C01935B19CA +:101290009B009846A146C1444B4652469B79103666 +:1012A0001370604BB6009B6899590B1B2F2B33D9D9 +:1012B0005D4B994200D0ACE0019B42469C465B4BA3 +:1012C0006544AD0063535A4B0232A218043B9B1A8B +:1012D0001B05584A5B0D651913436B80564B012162 +:1012E000AB80FF23AB71009BEF71AB604B460B43B0 +:1012F00019004C4B9B689951BFF35F8FBFF35F8F11 +:101300000022454B1A608BF3108805B0F0BCBB4639 +:10131000B246A946A046F0BD01200A008243D37917 +:101320008C46BB4231D84546130044491B1B5B41E8 +:101330005943090D3D4B63533D4B02356519043B41 +:101340005B1B1B053B4D5B0D2B43AA464D466B803B +:101350000425AC465546E044131F44441B1B1B05A3 +:101360005B0D1D434B46997100999D8099604946DC +:10137000DF71334B01431360BBE75800C018800096 +:101380002018C179B9422FD902000623D356002B69 +:10139000F3DA02932B4B61460393131D9A46042301 +:1013A0005B429C46E14450464B461B1A1B055B0DB5 +:1013B0009C46204B95719846634640460343938074 +:1013C000019B5A199200039BA418A380029B1C4AFC +:1013D000A371009B2260E771A3608AE701F02CFCF7 +:1013E000002553465D574FE7908802934005131D33 +:1013F0009A46031561469C464046D44463460430F1 +:101400002018181AE0230005400D1B021843039012 +:10141000C5E701F011FC4FE7240100D0651D002055 +:10142000AC0E002000ED00E0CD01001000A1FFFF98 +:10143000DC0E002000E0FFFF01BDFFFFAAAA0000B4 +:101440000148804701BD0000F0B5DE4657464E46D4 +:101450004546E0B50C0083B0EFF3108872B65D4AE4 +:101460001368002BFCD0BFF35F8F5B4B5B499A681E +:10147000030010339F00D5598D4239D0A5424AD080 +:10148000574EAA1B2F2A33D80122924682409146FA +:101490004846544A1268104001904846524A10602B +:1014A000BFF35F8FEFF305829346002A35D0934256 +:1014B00001D001F0C1FB2A0053469A439068844250 +:1014C00008D175E04B005B189B00F3189868A042A8 +:1014D00034D01A00062151560029F3DA844253D041 +:1014E000019B002B26D04A46404B1A603D4B1A60A8 +:1014F000394B9B68DD51BFF35F8FBFF35F8F0022D5 +:10150000344B1A6088F3108803B0F0BCBB46B24677 +:10151000A946A046F0BD0D00EAE72A0053469A43CB +:1015200090688442D6D1062010561300002809DAAC +:101530000D0031E04A462C4B1A60D9E706201856B8 +:10154000002822DB42001118890074188A46A1681D +:101550009960E179D971062161569971002925DBDD +:10156000A488F11A6405241554440919E0240905D6 +:10157000490D24022143998013181D4A9B001178BC +:10158000F31899711070ABE713005946002914D174 +:10159000FF3191711749918015490A789A71164A5D +:1015A0009B1B5B415A43120D0A7099E71349E2E70E +:1015B0000620105613000028C4DA114A1149D21A25 +:1015C000083A5002400D014399800F4952080A43DE +:1015D000DA8085E7240100D000ED00E0CD010010A5 +:1015E000AC0E002000E100E080E100E080E200E0DD +:1015F000651D002001BDFFFFAAAA000001BD00007B +:10160000E60E002000F0FFFF00F8FFFF70B5EFF3DB +:10161000058101240443EFF3108C72B6214A13684C +:10162000002BFCD0BFF35F8F1F4B05001F4AED1A44 +:101630006D416A43120D1E4D8900AE6852B2765854 +:10164000A6421CD00621595691421CD0122159564F +:10165000914222D01E215956914220D02A2159561A +:101660000324914210D0134B19781A708171BFF383 +:101670005F8F00220B4B1A608CF3108870BDAB6833 +:101680000D4C5C50EFE700246100091989005B18DC +:10169000FF21997109499980E5E70124F4E70224C3 +:1016A000F2E7C046240100D0AC0E0020AAAA000038 +:1016B00000ED00E0651D0020CD01001001BDFFFF21 +:1016C000054B064A1360064A136053609360D3606B +:1016D00013615361936170478080808000E400E073 +:1016E00004E400E010B5084B084C82B00100009300 +:1016F000002205232000FFF7D1FC002801DB1F2377 +:10170000181A02B010BDC046B47C00106A1D00203B +:10171000024B9C46614489000160704740000034E0 +:1017200010B50400FFF716FD01002000FFF7F0FFE1 +:10173000FF232371BFF35F8F10BDC04610B50400B7 +:10174000FFF708FD01002000FFF7E2FFFF23A38061 +:10175000BFF35F8F10BDC04610B504000120FFF736 +:1017600005FD034BC3189B002360BFF35F8F10BDC3 +:1017700040000034034B9C46614489000160BFF384 +:101780005F8F70474000003483680B4810B5844673 +:10179000614462441201090159189B185C684A6847 +:1017A0000120944201D802D00020C0B210BD1A68B6 +:1017B0000B689A42F9D8F7E7FFFFFF0F0A4B196849 +:1017C000EFF3108072B60A68002AFCD0BFF35F8F77 +:1017D0001B68BFF35F8F00221A6080F3108840BF40 +:1017E000002000217047C0462C1D0020F8B5574648 +:1017F00045464E46DE46E0B598460CAB1C780DAB30 +:101800001B78070091469A460568002C59D1AC7B9D +:10181000002C3BD0660029683619033E89194B78A5 +:10182000AB73002B00D1EB7300238B704B700B70EC +:101830002D4BE218BB6812019B184A461A604246BB +:101840005A600A9A9A600B9ADA6000238B704B7088 +:101850000B706B7B9B46002B26D022006B68594691 +:10186000A86898475B465B005B442A68033B0028F6 +:1018700012D058469619B070D118D35C002B00D006 +:1018800073705B460C706B735C450ED0F0BCBB464E +:10189000B246A946A046F8BDD3189C709119925D36 +:1018A000002A1CD15B460B706C734A464346387D58 +:1018B00000F0ECFB051E0AD10E9B002BE6D01D703C +:1018C000E4E7660029683619033E8919B0E75346F4 +:1018D000002BF1D12100386800F0F0FDECE75A70E0 +:1018E0005B460B706C73E0E7FFFFFF0FF0B5DE4661 +:1018F00057464E4645460023E0B58BB00893684BEB +:101900008200D45800239B46099000F02BFB020074 +:101910000B006068EFF3108A72B656460168002922 +:10192000FCD0B246BFF35F8F21684F7B8C46002FFF +:101930002ED0A5685B49A946791809018944494612 +:101940000868496805000E00AD1A9E41002E5FDD53 +:1019500002000B00099800F099FB00230022994631 +:10196000002306920793002398466368BFF35F8FB6 +:101970005A461A608AF310884346002B12D1002879 +:10198000C3D10BB0F0BCBB46B246A946A046F0BDE1 +:10199000002300229946002306920793002300208B +:1019A0009846E2E7089B494618023843C0476268F8 +:1019B00005000E00EFF3108A72B61368002BFCD0FE +:1019C000BFF35F8F002E41DB2B00334302D023692E +:1019D000002B56D12368D97B002905D01A6848000E +:1019E00041185218033A57709A7B002A00D19F730E +:1019F000DF73E268013FD35D0133D3555B4623615A +:101A00006368BFF35F8F5A461A608AF310887CE7D9 +:101A1000002E02D1002D00D09AE70021604600F090 +:101A2000CBFC4B461A685B68069207934B469B6853 +:101A300098464B46DB689946E368DB19013B1B7807 +:101A400008931B020343236100208EE72369002BC8 +:101A5000C0D0069A079B8021521BB34109068B42D6 +:101A600002D30122104B5242002104910131039113 +:101A7000494601914146200002970091FFF7B6FECA +:101A8000BCE700F06FFA2A00330012184B418021A6 +:101A900009068B42E8D30122034B5242E4E7C046D9 +:101AA000101D0020FFFFFF0FFFFFFF7F10B5144C3C +:101AB0006368002B04D00A211248FFF729FE10BDED +:101AC0002300114A1021206800F092FB032000F04F +:101AD0003DFA032000F042FB03200C4900F090FA8D +:101AE000FFF738FB0A4B9C4603232375D0231B06C4 +:101AF0001B6860446375074B80006060DC60DAE758 +:101B0000F40E00202C1D002089170010ED18001085 +:101B100040000034101D002000487047F40E0020E3 +:101B2000F0B557464E464546DE46E0B585B00193D2 +:101B300010AB1B780600039300239A469846009248 +:101B40007268EFF3108B72B61368002BFCD0BFF3F2 +:101B50005F8F3568AC7B002C00D16EE067002B688E +:101B60003F19033FDB195A78AA73002A00D1EA73A0 +:101B7000484AA118B26809015218009801991060EA +:101B800051600E9991600F99D16042469A705A70D7 +:101B90001A706B7B9946002B00D16BE022006B68BA +:101BA0004946A86898474B465B004B442A68033B6C +:101BB000002856D04846D719B870D118D35C002BEE +:101BC00000D07B704B460C706B734C4553D0F36860 +:101BD0001B19013B18787368BFF35F8F42461A6088 +:101BE0008BF310885346002B08D10002204305B028 +:101BF000F0BCBB46B246A946A046F0BD039B002BF5 +:101C000046D00E9B00200F99984703000B433FD00E +:101C100004000D1E1ADA009A019B121BAB410092C0 +:101C2000019380221206934204D301231A4C5B4293 +:101C300000930194039B9A4682E77368BFF35F8F1A +:101C40001C608BF3108801204042D0E700F08AF935 +:101C50008022001969411206009001919142E9D356 +:101C6000E3E7D3189C70D119D25D002A00D05A70D6 +:101C70004B460B706C73307D009A019B00F006FAA6 +:101C800082460028A3D02100306800F017FC9EE7B0 +:101C90000020ACE7FFFFFF0FFFFFFF7F407D704795 +:101CA000F0B504000D0006267642F717C646361931 +:101CB0006F4100B584B08F4214D811D000F052F9B2 +:101CC00032003B00121A8B41002B15DC002B3ED05A +:101CD0002000290000F084F904B080BCB846F0BDB3 +:101CE0008642EBD90026002700F03CF932003B0089 +:101CF000121A8B41002BE9DD002302930193154B4F +:101D00003200009314483B00FFF70AFF0028DFDB96 +:101D100000239846BC46114A114F7B6A9C4504D863 +:101D2000B96A8E42D4D99C45D2D11168EFF31080A4 +:101D300072B60B68002BFCD0BFF35F8F1368BFF344 +:101D40005F8F4146196080F3108820BFE5E7002AC5 +:101D5000BED0D1E7BD170010F40E00202C1D0020CE +:101D60000040054070B504000D0000F0FBF8802332 +:101D7000001969411B06994202D3012002494042E1 +:101D8000FFF78EFF70BDC046FFFFFF7F70B50600F6 +:101D900000F0E8F8FA2204000D00002330000021D2 +:101DA000920003F077F98023001969411B069942DC +:101DB00002D3012002494042FFF772FF70BDC046C6 +:101DC000FFFFFF7FF0B5EFF30583CE46474680B5B2 +:101DD00005000C0085B0002B12D02A4A0020536A5F +:101DE000A34203D3926A0130AA4204D305B0C0BC17 +:101DF000B946B046F0BD1B1B5A1E9341D8B2F5E759 +:101E0000214E02930193214B0200009330000B00FE +:101E1000FFF786FE031EE0DD20BF7168EFF3108739 +:101E200072B60A68002AFCD0BFF35F8FDAB294461C +:101E3000FF2230681A40417B61450FD00168894616 +:101E40005100884649469044414403398978002925 +:101E500004D13269934209D1316107E0F1681B0A6C +:101E60008A18013A1278DBB29A4207D07368BFF33E +:101E70005F8F00221A6087F31088AEE7614600F09A +:101E80001DFBF3E700400540F40E0020BD170010D5 +:101E9000F0B5EFF30582D6464F4646461000C0B572 +:101EA0001038EFF3108872B6214C2368002BFCD059 +:101EB000BFF35F8F0123190081401E4D1F0069632E +:101EC000AA461D4D29601D4D2E78AC463500C540F3 +:101ED0002F402B4215D053465F6A194B8500EB58B3 +:101EE0009F4218D36246174B8E43EB581670BFF3D0 +:101EF0005F8F0022226088F31088002B06D098475D +:101F000004E0BFF35F8F276088F31088E0BCBA4617 +:101F1000B146A846F0BD0C4B92009C466244136843 +:101F20001360BFF35F8F0023236088F31088EDE711 +:101F3000280100D0004005403C700540691D00208C +:101F4000381D002034170020D03F054010B5034B4A +:101F500001001800024AFFF77FF810BD641D002041 +:101F6000D07C0010034B596A0A00986A596A8A4269 +:101F7000FAD170470040054070B504000D00174AC3 +:101F8000536A1900966A536A8B42FAD130001900DD +:101F900024184D41AB4216D813D0104B2A005B6A6F +:101FA0009D4203D90D494B6A9342FCD3934207D11A +:101FB0000A4A02E0516A994202D1916AA142F9D3D8 +:101FC00070BDA642E9D9054B5B6A1C005A1CEFD0D4 +:101FD000012201246442E5175242E3E70040054034 +:101FE000064A536A9942FCD807D1044B02E05A6A68 +:101FF000914202D19A6A8242F9D37047004005406B +:1020000070B504000D00EFF3108672B61A4A13681B +:10201000002BFCD0BFF35F8F002D1BD02000FFF7FB +:10202000E7F8164981420AD02000FFF7E9F80121BC +:102030002000FFF7ADF80123A340114A1360114BB4 +:10204000A400E550BFF35F8F00220B4B1A6086F3AC +:10205000108870BD0121A1400A4BA200D5500A4B47 +:1020600020001A788A4305491A70FFF7EDF900211C +:102070002000FFF78DF8E5E7280100D0911E001041 +:102080003860054034170020691D0020F0B54F4628 +:10209000D6464646C0B507002B4C616A0D00A66ABD +:1020A000616AA942FAD18B4208D805D00120E0BC70 +:1020B000BA46B146A846F0BDB242F7D9EFF3108A4E +:1020C00072B6224801680029FCD0BFF35F8F01255A +:1020D000BD401F491C4C8846097889462943C9B22E +:1020E0008C46414660460870391D890065630A5177 +:1020F0001849B8004350216A0020294219D0616A6A +:102100000800A66A616A8142FAD18B4219D801D1CE +:10211000B24216D8CC450BD00B4B1F221D625D631B +:1021200001233A4093400C4A136043464A461A70D2 +:102130000120BFF35F8F0022044B1A608AF31088DE +:10214000B5E70020F5E7C04600400540280100D073 +:10215000691D0020381D002080E200E0EFF3108CA4 +:1021600072B60A490B68002BFCD0BFF35F8F0123C6 +:102170008340074A0748136202789A430270BFF30C +:102180005F8F00230B608CF310887047280100D00C +:1021900000400540691D002070B506000D001400C8 +:1021A00000291DD0002A12D0736880689847620009 +:1021B0006B0012195B193168033A033B002808D001 +:1021C0008A189570C818CB5C002B0BD104702800BE +:1021D00070BDCB189C7088188A5C002A05D10570E8 +:1021E0002000F5E753700470F1E75A700570F7E7C7 +:1021F00010B583600023CCB2437301334260047393 +:102200008373C4730068421C012C05D90133DBB20F +:10221000137003329C42F9D1FF230B405A00D318AC +:10222000C01800230338437010BDC04670B50500C8 +:102230000C1E07D0630001681B19033BCB185A78AA +:10224000002A01D1200070BD500080180338091801 +:1022500000204E784870210058702800FFF79CFF3E +:10226000310004002800FFF7E1FF0600002C20D019 +:102270000028E7D0320021006B68A86898477200F8 +:10228000630092191B192968033A033B002808D000 +:102290008A189470C818CB5C002B00D0537006705D +:1022A000D0E7CB189E7088188A5C002A00D05A703C +:1022B00004703400C6E7C046F0B557464546DE46D2 +:1022C0004E46E0B50D006F0001687F19033F040022 +:1022D000C85D83B00192CA19002850D043001B1872 +:1022E000033BCB185E78B446002E1AD1019E002E17 +:1022F00042D0E67B002E04D073009B19CB18033B21 +:102300005D70A37B002B00D1A573E57300282FD14E +:102310000023537003B0F0BCBB46B246A946A046AA +:10232000F0BD72006244033A8A1851788846002151 +:10233000517089465970320001002000FFF72CFFD0 +:1023400043468246002B07D05B0021684344033B91 +:10235000CB185A78002A16D1424651462000FFF782 +:102360001BFF2168019BCA19002BC2D10028CFD0C6 +:1023700043001B18033BCB1800219970C8E7019B51 +:10238000002BB6D1C4E750008018033809184878EC +:10239000834648464870587041462000FFF7FCFECF +:1023A000594680462000FFF741FF414602002000C9 +:1023B000FFF7F2FE8046CFE7F0B557464546DE46CA +:1023C0004E46E0B583B00191457B04006F00006884 +:1023D0007F19033FC15DC219002952D04B005B1821 +:1023E000033BC3185E78B446002E1CD1019E002E1C +:1023F00044D0E67B002E04D073009B19C318033B26 +:102400005D70A37B002B00D1A573E573002931D14A +:10241000002328005370617303B0F0BCBB46B24682 +:10242000A946A046F0BD72006244033A8218507873 +:102430008046002050708146587032002000FFF71F +:10244000ABFE43468246002B07D05B002168434425 +:10245000033BCB185A78002A17D142465146200038 +:10246000FFF79AFE019B01002068C219002BC0D122 +:102470000029CDD04B005B18033BC3180020987097 +:10248000C6E7019B002BB4D1C2E750008018033887 +:1024900009184878834648464870587041462000DD +:1024A000FFF77AFE594680462000FFF7BFFE4146FF +:1024B00002002000FFF770FE8046CEE770B50500F1 +:1024C00000292CD0437B8B422ED04C00006864182E +:1024D000033C0419A278002A21D053009B18033B27 +:1024E000C25CC6188A4202D11BE0002A08D0530001 +:1024F0009B18033BC3185A788A42F6D162785A7007 +:10250000002301222800A3706370FFF7D5FE697BCA +:1025100002002800FFF740FE6873012000E0002061 +:1025200070BD63783370EBE701221900FFF7C4FE3A +:10253000F2E7C046F8B5CE464746040080B506200F +:102540000D0000F021FA061E53D0534B5349E318F7 +:102550005A1E93418022120494465B429B0D504ABE +:102560009B05634413604F4A136018008A689043C8 +:10257000FBD1494B4C4AE31859424B4180215B0047 +:1025800049000620995200F0FFF92900C00001F02F +:1025900069FFC30932D14022012190466162A362E2 +:1025A000266BF30736D427008025E36A00232C37F7 +:1025B0006D013D432B600620266300F0E5F941469E +:1025C000800001F04FFF236B06009846DB073BD4E9 +:1025D0006023E26A5A400E3313402B604346236364 +:1025E000802310229B013B431A60304B236303235B +:1025F000A3643000C0BCB946B046F8BD2C4A934233 +:102600003FD900232B492C4A6162A362266B904676 +:10261000F307C8D52200C02330329B011343234A5D +:1026200006201A60656AA36AAD01ED1800F0ACF9E6 +:10263000224901F017FFAD020100280001F012FF4E +:102640000021FFF799FCAEE72200C02330329B0146 +:102650001343164A06201A60636AA26A9B019946D0 +:10266000914400F091F94B4614499B02994601F0C0 +:10267000F9FE0100484601F0F5FE0021FFF77CFC61 +:10268000A6E77F22990188460240013252081900CC +:102690009044130082E7C0460080FCBF00C00040A9 +:1026A00000E0004000F00040481D00200103000051 +:1026B000FEFF0000FFFF0000C0FF3F004E0E0000C5 +:1026C00010B50C2082B000F0B7F9FEF7BDFC002871 +:1026D00010D08B4B8B488B498B4A1860596098609F +:1026E000D960186159619861D961186259625A625A +:1026F00002B010BD854CA06700F0F4F90122844BB4 +:102700001A60636C012BFCD10322824B1A607F4A52 +:10271000936B012BFCD1013301217F4A7F48009349 +:10272000043300F037F905237D4A009301217D48E9 +:1027300000F030F97C4B5A68FF2A02D88022520000 +:102740005A608022734B6E4C12011A602169002975 +:1027500007D0606901F086FE013043001B18033B7F +:10276000FDD2E022704B714819680A4002600222D3 +:102770001968514001320A40042102609A681142EE +:10278000FCD080216A4A09011160802252005A60FF +:10279000684B2361684B5968FF2900D85A600322AF +:1027A00001215B4B1A60644A93681942FCD0E02314 +:1027B0001068034061480360126803234A40022105 +:1027C00013405D4A036093681942FCD080215C4B42 +:1027D0000901196080215B4B4900516063615A4BCC +:1027E0005A68FF2A00D859608022584B12011A609B +:1027F000E169002907D0606901F034FE013043002F +:102800001B18033BFDD2E0234F4A11680B4050498F +:102810000B6080214F4B090119608021394B490021 +:102820005160E3614C4B5A68FF2A00D859608022FE +:102830004A4B12011A60216A002907D0606901F031 +:1028400011FE013043001B18033BFDD2E023424A36 +:1028500011680B4042490B608021424B090119600D +:1028600080235B0053608022264BD20223623E4BC2 +:102870005968914200D25A6080223C4B12011A6082 +:10288000616A002907D0606901F0ECFD0130430066 +:102890001B18033BFDD2E023334A11680B40344937 +:1028A0000B608021334B090119608023DB025360E8 +:1028B000154B6362304B5A68FF2A02D880225200BF +:1028C0005A6080222D4B12011A60A169002907D09D +:1028D000606901F0C7FD013043001B18033BFDD2C6 +:1028E000E023254A11680B4025490B608021254BC8 +:1028F0000901196080235B005360124BA361F7E666 +:10290000C00F0020006CDC021BB7000000800040FC +:102910003CB0004030B00040002F685900800240B9 +:10292000008C864700C0024030800040309000405C +:1029300030A00040001BB7003C8000403C900040AD +:102940003CA00040405973075480004054B0004000 +:102950005490004054A000406080004060B00040AF +:102960006090004060A000406C8000406CB000406F +:102970006C9000406CA000404880004048B000408F +:102980004890004048A00040014B8000C05870476C +:10299000C00F0020F8B5040022481E0017000D00EB +:1029A00001F060FD0100380001F05CFD069B36047B +:1029B0001B031E432368002B22DB1B4B1B49E31820 +:1029C0005A1E93418022920194465B421B0B184A87 +:1029D0001B0363441360174A13601F008A68974300 +:1029E000FBD1C022231D92011A4321232560A06040 +:1029F00013602368002BFCDA0823E6601360F8BD3F +:102A00003F2322681340AB42D7D1A3681B051B0D9F +:102A10008342D2D1EE22E368D2021340B342CCD13A +:102A2000EDE7C046001BB7000040FDBF00C00040FE +:102A300000E0004000F000408023024A9B00034376 +:102A4000D36270470080054010B580241C4BE4051C +:102A50001C6000281AD001231A4C18431A4BDC6161 +:102A60001A4C44401C62596298628021144BC9057B +:102A70001960174817490860E021C9041960002A45 +:102A800007D18022144B12061A6010BD0E4BD8617C +:102A9000EBE753019B1A9B009A18802312015B04F9 +:102AA0009A4209D213000D490B60074B5A608022ED +:102AB000094BD2051A60E8E7094B1A00F3E7C04654 +:102AC00000B00540D3C007B0008005402D3FF84F4F +:102AD000FCFF01000820014000A00540D01C0020A0 +:102AE000FFFFFF00AA23064A1B0113602F2305499D +:102AF000D360054B19605368002BFCDA7047C04661 +:102B00000040024000B0FA00006002402C4B2D4A09 +:102B100070B51A602C4A2D4B2D491A6014008B6831 +:102B20009C43FBD12B4D2C4EB54208D2013E761B67 +:102B3000B60808CD984723000134B342F9D1FFF716 +:102B4000BFFD264A214B1A60214A9368DB43DB0113 +:102B5000DD09002BF9D14022214B224C224E9A67ED +:102B60005A671A67DA66B44208D223682000002B3D +:102B700020D00834FEF7E2FDB442F6D31B4C1C4EC5 +:102B8000C022B168200002F0F5FAB460FEF7D4FA72 +:102B9000FEF796FDFEF78AFF164C174EB44208D298 +:102BA000013E361BB60808CC98472B0001359E42E3 +:102BB000F9D170BD0834FEF7B3FDB442D5D3DDE7DB +:102BC00000E00040BFCDFBFEFE7F3C0000F0004077 +:102BD00000C00040A00F0020B00F0020FFFFFF0149 +:102BE00000F00140980F0020A00F002000000020FE +:102BF00000ED00E0B00F0020BC0F002000BEFDE79C +:102C000010B5FFF7FBFFC0460FB400B5084883B00E +:102C100002F07EFB049B002B07D005A91800019150 +:102C200001F0A6FB034802F073FB0120FFF7E6FF6B +:102C3000F47C0010047D001010B50148FFF7E4FF9C +:102C4000087D00107047C046F8B55746DE464E4630 +:102C50004546E0B599460A9B07009A460D9B884673 +:102C600093460B9C9B073BD10C9B9C423DD21E1B69 +:102C70000B9415000C005E442A004B4601352100E0 +:102C80002020B847B542F7D1A0460B9C002C20D09D +:102C9000454636195346321B013C185D29004B4608 +:102CA000B847002CF6D12B00350098460D9B9B07AA +:102CB0000FD55B46EC1A0C9BA3420AD946469846B0 +:102CC0002A004B46310020200134B84701354445E5 +:102CD000F6D32800F0BCBB46B246A946A046F8BDD4 +:102CE00016001500002CD3D1E0E71600002CCFD140 +:102CF0001500EEE7F0B54F464646D646C0B584B05F +:102D000098460EAB1B7894469946129B0D9C109FDB +:102D1000119E9A0725D4002E65D1BC4221D20122F2 +:102D20001A409246202C00D1E9E00C9A551E302220 +:102D300002E0202C00D17BE001342A55A742F8D8CC +:102D40005246002A0DD0B4420BD20C9A551E3022A6 +:102D5000202C02D171E0202C2DD001342A55B44210 +:102D6000F9D1DA063CD55A052ED4002C28D10F9A79 +:102D7000102A00D1B6E0022A00D1BCE030220C9C1F +:102D8000227001244A46002A65D15A0700D499E0EE +:102D90002B220C9D2A55013403930C9B6246009311 +:102DA000029643460194FFF74FFF04B0E0BCBA46D9 +:102DB000B146A846F0BD2024DA06EDD55A0503D465 +:102DC000A74266D0B44264D00F9A102A71D0022A6A +:102DD00057D0202CE0D02200013430250C9FBD5468 +:102DE000202CD9D0CEE7012215001D40AA461A4258 +:102DF00036D04A46002A4AD10C321A4247D1BC4248 +:102E0000A1D2202C91D1202E17D82024DA06C3D5A8 +:102E10005A051BD4202F01D0202ED5D11F220F9D63 +:102E2000102D6FD0022DD8D162250C9FBD54D0E754 +:102E30005246002A79D0202EBDD92024DA06ABD5FF +:102E40005A0503D4202FE9D0202EE7D00F9A102A5C +:102E5000A2D12024A0E72D220C9D2A5501349BE706 +:102E6000BC4200D37DE7202C00D05EE7DA06F0D527 +:102E70005A05EED4202F62D0202EEAD134001F2232 +:102E8000CDE7202C00D187E722000134CCE7013EBA +:102E9000B5E7621E012CC2D10F9A102A00D06AE752 +:102EA0009A063BD558220C9C2270283A6270022464 +:102EB00068E79A060ED4202CCBD078220C9D2A5598 +:102EC000013486E71A0700D466E720220C9D2A55B4 +:102ED000013461E7202CBCD058250C9A12191570CA +:102EE000013476E79A0608D558220C9C22703022CD +:102EF0006270022446E76032F7E77822F5E7002A9D +:102F000083D1B3E7A21E013C9D0603D478250C9F14 +:102F1000BD5460E758250C9FBD545CE778220C9C9B +:102F20002270483A627002242CE7DA0600D433E7B4 +:102F30005A058BD4202F00D044E71F226FE73C00B6 +:102F40001F226CE710B5002800D110BD02F094F9E3 +:102F5000FBE7C0460B0010B5002802D049681B688B +:102F6000984710BDF0B557464E464546DE46E0B59B +:102F700099B08246894690460893229A239B100076 +:102F8000190001F030FD002800D0CDE022982399EF +:102F90000122D94B524201F021FD002800D0C3E0AC +:102FA000229823990122D54B524201F009FD0028B5 +:102FB00000D0B9E0229823990022002301F000FDFF +:102FC000002800D0F1E1229E239F8023269ADB0077 +:102FD0001A400D92269A1A4201D106232493802387 +:102FE000269A1B011A403B0093460996334300D0B2 +:102FF000B3E0002A00D0C2E1002300240A930B941E +:10300000002304250993259B0024AB4200D95C1BB7 +:103010000223269A1A400C92269A134203D06B423E +:103020006B415B421C40099B002B07D00A9A0B9B0B +:103030003000390001F063FC06000F00229823994C +:103040000022002301F0BCFC002803D080210906E7 +:103050007B181F00269AAA4B009601971340089EE2 +:103060000493249B039402934246330049465046FE +:1030700000F0AAF90400002D67D02020269A4946C6 +:10308000024013005A4253415B42621C18400A92AC +:10309000330022004530D047099A6F1ED317D41849 +:1030A0005C40D30F9B46002501E0202D13D008AAD9 +:1030B00094461F23200063440A2101355E1901F064 +:1030C000D1F93031317020000A2101F0CBF926000E +:1030D0000400092EE9D805230693002304930A333C +:1030E00003935B46089E029310AB0A9A00934946ED +:1030F0003300504605970195FFF7FCFD0C9A04003C +:10310000002A22D04246851A259AAA421DD9B046E5 +:103110005746160022004346494620200135B8474D +:103120000134AE42F6D810E0269B42460493259B1C +:1031300049460393249B50460293229B239C009371 +:103140000194089B00F040F90400200019B0F0BC85 +:10315000BB46B246A946A046F0BD6A4B78009C46E5 +:10316000400D604401F052FC674A684B01F0E5FBFA +:10317000674A684B01F0BAFB674A3B031B0B1A43D3 +:1031800004000D0009981100644B002201F0A5FB1A +:10319000634A644B01F0D1FB02000B0020002900C0 +:1031A00001F0A4FB01F04AFC099001F02FFC5E4AFB +:1031B0005E4B04000D0001F0C0FB00225C4B01F0EF +:1031C00095FB01F03BFC5B4A5B4B29000C90200017 +:1031D00001F0B3FB04000C980D0001F017FC574AF6 +:1031E000574B01F0AAFB02000B002000290001F060 +:1031F00074FB04000D0002000B000A940B9501F013 +:103200009CFB04000D000A980B9902000B0001F0D2 +:103210006DFB00220E900F914A4B2000290001F017 +:103220006EFB0022484B01F061FB02000B00200006 +:10323000290001F064FB0022444B01F057FB02001F +:103240000B002000290001F05AFB0A9A0B9B0D008D +:1032500080210400C905002001F03FFB02000B00A3 +:103260002000290001F042FB02000B000E980F998C +:1032700001F045FB0022284B01F038FB344B0C9C3D +:103280009C4664442305002201F057FB04000D0016 +:1032900002000B00300039000A940B9501F090FBFE +:1032A00000285DD123002A00C625099963318D428B +:1032B000AD4159466D420435002900D1A3E61343C0 +:1032C00063D030003900234A234B01F07FFB0028F4 +:1032D00007D0002230003900204B01F071FB00289C +:1032E00053D1249B002B00D18DE60D9B5A1E934198 +:1032F000249AD31A249386E6FFFFEF7FFFFFEFFFA8 +:10330000FFF7FFFF01FCFFFFFB799F501344D33F02 +:10331000B3C8608B288AC63F0000F03F0000F83F2A +:1033200061436F63A787D23F71A379094F930A4026 +:103330000000E03F1655B5BBB16B0240EF39FAFE15 +:10334000422EE63F00002C400000244000001840C0 +:10335000FF0300002D431CEBE2361A3F80842E4110 +:10336000099B0022013B09932000164B290001F024 +:10337000C6FA0A00010003000A910B9294E70023A9 +:1033800000240A930B9400230993249A099B9A42E0 +:1033900014DDD31A013B24938023269ADB001A43C1 +:1033A00000230025269209932DE6802212069446DA +:1033B000229B1E00239B63441F0006E600232493E8 +:1033C000EAE7C04600002440F0B54546DE464E46DA +:1033D0005746E0B595B08B46904699461E9A1F9B7E +:1033E0000A9019001000209D01F0FDFA002800D07D +:1033F000B0E11E981F990122C74B524201F0E0FA3A +:10340000002800D037E11E981F990122C34B524279 +:1034100001F0E4FA002800D0A7E01E981F990022CE +:10342000BF4B01F0DBFA002800D088E01E981F99FE +:103430000022BC4B01F0C4FA002800D07FE01E98A7 +:103440001F990022002301F0BBFA002800D0FAE007 +:1034500000230B938023229C229ADB001C401A42FB +:1034600000D102E1092D00D87CE106A98C462C0090 +:10347000172200233021093C62440133D154EF1A52 +:10348000202B00D132E1A342F7D10022A44B0692B7 +:1034900007931E981F9901F0D1FA050001F0B6FAC2 +:1034A00002000B001E981F9901F017FA069A079B5D +:1034B00001F043FA0890099101F0E4FA060001F0E6 +:1034C000A1FA02000B000898099901F006FA0022FF +:1034D000954B0890099101F081FA002800D1D2E0C3 +:1034E0000136300001F08EFA069A079B01F06EFA61 +:1034F000002801D000260135AA46002F00D098E010 +:10350000280001F083FA02000B001E981F9901F0B9 +:10351000E4F9854B002206000F0001F051FA0CABD4 +:103520009A46002845D10022300039007E4B01F038 +:1035300055FA00283DD1EB073BD5013539E0229BF8 +:1035400042460493219B594603930A981E9B1F9C55 +:103550000295009301944B46FFF704FD15B0F0BCB3 +:10356000BB46B246A946A046F0BD229B5B0767D486 +:1035700003226E4B229901920391219902910093AB +:1035800042464B4659460A98FFF75EFBE6E706AA15 +:1035900094461723280063440A2101341E1900F0C1 +:1035A00039FF3031280031700A2100F033FF051E49 +:1035B00076D0202CEBD10323229A1340012B1DD16E +:1035C000219B002B1AD00B9B002B00D0BBE0229A32 +:1035D0000C33134200D0B6E0219BA34200D887E011 +:1035E00006AB9C4617223023624404E02199013443 +:1035F00013558C4259D0202CF8D12024229B0194C1 +:103600000393219B02935346B9E706AA94461723D6 +:103610000A216344300001341D1900F023FF3031CA +:10362000297030000A21013F00F01CFF092E46D905 +:103630000600202CE9D155460CAB20249A46B8E769 +:1036400004223B4B96E71E9A1F9B0020002101F0AD +:1036500044F901230B938023229C229ADB001E90C5 +:103660001F911C401A4200D0FCE60022314B062775 +:10367000069207930DE7229B0393219B0293042359 +:1036800001932D4B7BE7002208980999264B01F006 +:1036900097F9002800D02FE7002E4FD101362BE7F5 +:1036A0000323229A1340012B66D0202CA6D00B9B1B +:1036B000002B1FD02D235246135501349EE755464B +:1036C000202CB9D030233A19002F08D0172006A992 +:1036D000013409180B55202CAED09442F6D10CAB16 +:1036E0009A462E2352461355013462E72024CCE635 +:1036F000202C83D0229B5B0708D4229B1B0700D47D +:103700007CE7202352461355013477E72B2352469A +:103710001355013472E7C046FFFFEFFFFFFFEF7F55 +:1037200065CDCD4165CDCDC10000E03F1C7D0010D1 +:10373000147D001080842E41247D0010F30700D4F6 +:10374000DAE60136D8E6219B013B2193A34200D95A +:1037500046E7AAE7229B0393219B0293032301934D +:10376000074B0CE7074BEA009B185C681B682F00AF +:103770000693079400248CE6219B002B95D022E72A +:10378000207D0010D87F0010F0B55746DE464E462B +:103790004546E0B5A5B01F002E9B91460D93CA4A41 +:1037A000CA4B82468B461A60002900D129E20023C9 +:1037B00038789846002800D12BE2C54B44460C933C +:1037C000C44B55464E460E930AE0631C98462200B1 +:1037D00033005946A84744463878002800D187E08E +:1037E00001372528F1D108239A46043B9946023B2C +:1037F0009846013B00229C460B943878791C0300C4 +:10380000203BDBB2102B03D80C9C9B00E3589F4657 +:103810000300303B0B9C0B92092B3AD900239846AE +:103820002A2800D1DDE000239A462E284BD0030041 +:10383000683BDBB2122B1ED80E9A9B00D3589F46D2 +:1038400063460F001A43D8E743460F001A43D4E7F4 +:103850004B460F001A43D0E710230F001A43CCE762 +:1038600053460F001A43C8E780235B000B9A787811 +:103870001A430B9201310F0067284FD82428A4D98E +:103880000300253BDBB2422B9FD893499B00CB58CA +:103890009F46002398460B9B47469C4600E001311B +:1038A000BB00DB195B001F180878303F0300303B7A +:1038B000092BF4D963460B930023B8469A460F00B0 +:1038C00001312E28B3D180200B9AC00002430B9205 +:1038D00030225242944678780B0084446246092A8A +:1038E00000D8AAE12A2800D1B9E10F0001319EE7F2 +:1038F000A046AA46B146C84503D301235B424B44C8 +:1039000098464B46424659460020D047200025B0F5 +:10391000F0BCBB46B246A946A046F0BD01006939DD +:10392000C9B20F2900D950E701238B409C466B4B4D +:10393000994663464A4613400F9362464B461A42E5 +:1039400000D068E10A2956D0072900D03DE70D9B39 +:1039500002CB9846002900D092E10B9B10211A005F +:103960008A43100011310843814680201A00C000AC +:103970000240110003421CD114AB9C461F220F23AE +:1039800062440D959C4615000F9B0B9402E0202B82 +:103990000CD0110064460C4020003730092C00D8B0 +:1039A00007380133E8540A090F29F0D80B9C0D9D04 +:1039B0000F934B4608220693534605920832039212 +:1039C000002204930F9B029201931CAB22000093F0 +:1039D000594633002800FFF78DF9434604000D9344 +:1039E000FAE60D9B04CB9046002A79DB78780D939C +:1039F0000F00013117E70D9B02CB14930B789C4607 +:103A000018005346002B00D134E1002815D053464E +:103A1000013B013399460D940B9C89444A460B00A7 +:103A2000A14601E0934203D05C780133002CF9D128 +:103A30004A465B1A0D9C0B920F938023DB0099463C +:103A40000B9A13400D934B461A4204D00F9B5345DB +:103A500001D953460F93022399460B9A13400B93B7 +:103A60004B46134200D1F5E16346002B00D1D6E16D +:103A70000D9B002B00D182E10B1BD14631009A46F1 +:103A80003B00A1442E005F464D4622009B468946DE +:103A900009E04B463900541CB0475346185D0028D6 +:103AA00000D192E122009542F3D14B465A46A946F5 +:103AB000BB46350017001E004C460B9B002B00D068 +:103AC000ADE1149B0D9387E689370010CC1C0020D4 +:103AD000387E00107C7E0010C87E001041900000EF +:103AE0000B9A283802430B9242465242787890460D +:103AF0000F000D93013196E678786C2800D15DE1D6 +:103B000080230B9A5B001A430B920131B3E68023AA +:103B10009B00ABE67878682800D148E180230B9AB7 +:103B200001311A430B92A6E6672800D1B2E047287C +:103B300000D11AE1452800D11CE10B9A072104921B +:103B400042460D9B0392073352468B431900029263 +:103B50000CC92800009201930D91220033005946B0 +:103B6000FFF700FA040037E6462800D18DE00B9AF3 +:103B70000721049242460D9B0392073352468B4322 +:103B8000190002920CC92800009201930D912200A5 +:103B900033005946FFF718FC04001DE6631C9846E5 +:103BA0002200330059462520A847444614E60D9BC1 +:103BB00004330F93631C99460B9B9A0700D40AE1C8 +:103BC0000D9B2200187859463300A84743464444C9 +:103BD000012B00D86FE1B0462E0025004C46B946B7 +:103BE0005F4622004346013439002020B047AC42F2 +:103BF000F7D12C00BB4635004F4646460F9B0D9330 +:103C0000EAE5D64B38789A4600239846002800D03B +:103C1000D3E500246FE66F2842D000D8FDE11023E1 +:103C2000782800D19BE00B9A9A430B920A239C467A +:103C3000002314930A330F9338E057460B9AB900C8 +:103C4000C919490001330F181878303F0100303985 +:103C50000929F4D9BA460B921F00591CE7E50D9BC0 +:103C6000B87804CB0237D143C9170A4092460D9366 +:103C7000791CDCE5002800D1DFE602235B42C8E6C0 +:103C800021200B9A0243914676E620230B9A1A4391 +:103C90000B926CE780230B9A1B011A430B924CE7A3 +:103CA00008239C460023149308330F930B9880231A +:103CB0000200DB001A4011000200184200D080E030 +:103CC0000C239A431000802302009B001A400B92A1 +:103CD000184200D0F1E0802302005B001A409146B8 +:103CE0000D9A04321492184200D0C3E2430600D564 +:103CF000D7E0030600D421E30D9B1B880993002B1A +:103D000000D02DE110339843002900D128E1002391 +:103D1000994643460593534604930F9B069003939D +:103D2000002302934B4601931CAB2200009359469B +:103D300033002800FEF7DEFF0400C2E6582809D051 +:103D4000622800D0E3E202239C460023149302334E +:103D50000F93ABE720230B9A1A430B92103B9C4620 +:103D60000023149310330F93A0E780230B9A1B01B9 +:103D70001A430B9220230B9A1A430B92DDE60B1B7E +:103D80009A460F9B99463B0037005E469B462200B1 +:103D90003B003100A84753460134185D0028F6D196 +:103DA0004B460F935B46B3463E001F0085E6C0239B +:103DB0000B9AB8781A430B92F91C5CE5C0239B0060 +:103DC000F6E70D239A4310007DE75B463500BB46BE +:103DD0004E461F0071E64346012B66D9631E4344DD +:103DE00032002E001D003B00A2465F4691469B46D6 +:103DF00022004B46013439002020B047AC42F7D1B5 +:103E00005B463500BB464E46A14654461F000D9BFF +:103E10004A461878594633004444A847EEE60F9BBB +:103E2000A146984500D84CE64444E41AB0462E001A +:103E300025004C46B9465F4622004346013439000E +:103E40002020B047AC42F7D12C00BB4635004F468E +:103E5000464636E60F98804500D873E24346E2189E +:103E6000131A32002E001D003B0091465F469B4610 +:103E70000F9122004B46013439002020B047AC425C +:103E8000F7D15B46BB461F0043460F9901330F93A2 +:103E90000B7835009C464E466046002800D0E7E58A +:103EA0000FE60D9B1B78099329E70D9B22001878DC +:103EB00059463300A8474C46A0E60D9AFA3BFF3B13 +:103EC00007329A430133994691444B460D93136848 +:103ED000526815921A4306D110329043002209927B +:103EE000002900D083E06122810600D54122D2B2B0 +:103EF0000A9214AA91460A9A00210A3A0B92424663 +:103F00001792524618925A46B24609911E001F3126 +:103F1000149B4944BB4616941A950024674698465C +:103F20008946159D19901B920AE03032D2B24B4659 +:103F300001341A55A8454CD0202C4CD006000D0059 +:103F40003A0000233000290000F0CAFAD2B2092A50 +:103F5000EBD90B9B9C466244D2B2E8E7452C00109B +:103F60006123820600D54123DBB20A3B0B93434613 +:103F700014A91F228C46159353466244B2460D94F1 +:103F800017974C468046A9461700099D0F9E169329 +:103F900008E03033DBB201343B55B5420ED3202C60 +:103FA0000CD005003100280000F05CFACBB20929E2 +:103FB000EFD90B9A94466344DBB2ECE7159B40467D +:103FC0009846169B4D465646A1469A460D9C179F0D +:103FD0009FE6B742B0D9179B56469846189B5F4656 +:103FE0009A461B9B09949B46169C19981A9D43461A +:103FF0000593534604930F9B06900393002302936B +:10400000099B01931CAB2200009359463300280002 +:10401000FEF770FE0400FFF7DFFB10230B9A9A43B4 +:104020000F92692800D091E10B9980230A00DB00F0 +:104030001A4010000A00194203D0112118008A43C7 +:104040000F920F9A802311009B0019408C461A4250 +:104050005BD1802311005B00194089460D99043122 +:104060000B911A4200D0B2E013005B0600D4EDE0E1 +:104070000D9B1B781A00D90F0D91002B00D1A3E0E6 +:10408000100014AA944642461F23159252466344D8 +:10409000A846BA464D461494B14604001F00169235 +:1040A00001E0202D0FD020000A2100F0DBF90135BE +:1040B0007E193031317020000A2100F0D3F926003A +:1040C0000400092EEDD8159B4E46A9464546984654 +:1040D000169B57469A46149C0F9B0693434605939E +:1040E000534604930A2303930D9B02934B4601937B +:1040F0001CAB22000093594633002800FEF7FAFD5E +:104100000B9B04000D93FFF767FB07220D9B073302 +:104110009343013294469C4462460D920CCBD90FD6 +:104120000B911100194300D19BE0D9171391129103 +:104130005140109113995940119110981199129A68 +:10414000139B801A99411090119114AA94464246EB +:104150000023159252469946169232001F3363444B +:10416000A8464E46BA4614941F00109C119D9146D5 +:1041700001E0202E10D0200029000A22002300F0A8 +:10418000AFF9013630322B00BA550D002200040081 +:10419000002BEED1092AECD8159B109411954546B9 +:1041A00098464B46169AB14657461E009246149CB6 +:1041B0000F9B069343460593534604930A230393A8 +:1041C0000B9B02934B461CE7002885D159E70D9BBA +:1041D0001B68DA0F1100002B00D1A6E0DA1798183F +:1041E000504014AA91461F2342464B44A8460D94C2 +:1041F000169704006546B1461F001491159201E020 +:10420000202D0FD020000A2100F02CF901357E1955 +:104210003031317020000A2100F024F9260004001A +:10422000092EEDD8159BAC4645469846149B4E4644 +:1042300019000D9C169F0F9B029106934346059310 +:10424000534604930A230393634650E713001B0667 +:104250006ED50D9B00229B5ED9175A184A4092B228 +:1042600009E7002399460028A2D1002200231092DA +:1042700011936AE70D9B1B689946002B03D11033FD +:104280009843002938D16123820600D54123DBB24F +:104290000A3B0D9343461693534614A91F228C469E +:1042A00017932B0062444D46B246159418978046EA +:1042B000170099460B9C0F9E08E03033DBB20134A7 +:1042C0003B55B5420ED3202C0CD005003100280000 +:1042D00000F0C8F8CBB20929EFD90D9A944663448F +:1042E000DBB2ECE7169B40469846179B56464D4678 +:1042F0009A460B94189F159C434605935346049386 +:104300000F9B06900393002302930B9B0BE50B99E5 +:1043100080230A00DB001A4010000A00194200D076 +:104320008BE610239A430F928BE6002883D158E73F +:104330000D9B1B68D9175A184A409CE60D9B1B68B9 +:104340000993DCE4030001330F93A5E50B926DE4C0 +:1043500000B585B00391012102900093034813003A +:104360004A4202A9FFF710FA05B000BD552F001010 +:1043700010B5094A0300146884B0002C08D001224B +:1043800000910648524203A9A047012004B010BD85 +:1043900000F0BEFF0020F9E7CC1C0020452F0010E4 +:1043A00001480421014B1847200F0020D143001081 +:1043B000142310B50100188804331B88984710BDDA +:1043C000162310B50100188802331B88984710BDCA +:1043D000F8B54746CE4680B50F1E19D0142399462E +:1043E000043304000025012698464B4618884346AE +:1043F00021681B88984701C4431E984101354042FB +:104400000640AF42F1D13000C0BCB946B046F8BD5D +:104410000126F8E7124A936F9B0815D29066D16681 +:10442000002905D0FFE7FFE7FFE7516F106F7047E6 +:1044300004B580210906C2175140002800D0C843A6 +:1044400003F0B6FB002104BDF0B5146E556E576F36 +:10445000166FFFF7E3FF1466556657671667F0BDE2 +:10446000000000D0114A936F9B0813D2106651666A +:10447000002905D0FFE7FFE7FFE7516F106F704796 +:1044800004B5002801D00020C04303F091FB0021B7 +:1044900004BDC046F0B5146E556E576F166FFFF72A +:1044A000E5FF1466556657671667F0BD000000D03B +:1044B00094464A4A926F9208624601D228E0C0466A +:1044C000F0B5464E346E756E776F366F00F020F89B +:1044D0009446424A14665566576716676246F0BDB1 +:1044E00094463E4A926F9208624601D254E0C0461A +:1044F000F0B53A4E346E756E776F366F00F04CF84B +:104500009446364A14665566576716676246F0BD8C +:10451000002B24DB11D000293EDA00B5C94340420C +:1045200000D1013100F038F8C943404200D10131D7 +:10453000DB43524200D1013300BD002AEBD10028F9 +:1045400001D1002905D00020C90FC90701D1C043FE +:10455000410800B503F024FB0022002300BD00B594 +:1045600000290ADBDB43524200D1013300F014F88A +:10457000C943404200D1013100BDC943404200D18E +:104580000131DB43524200D1013300F005F8DB4337 +:10459000524200D1013300BD002923D1002B18D194 +:1045A000002A0CD0BC460D4F38667A6600210023E5 +:1045B000FFE7FFE7FFE77A6F386F6746704700282D +:1045C00001D00748010000B503F0EAFA00220023F9 +:1045D00000BD02000B00002000217047000000D049 +:1045E000FFFFFFFF002B00D0BFE0130C28D1002AF3 +:1045F000E7D080B4114F39667A66FFE7FFE730B441 +:10460000040C7B6F396F1B0423433B667A66FFE71C +:10461000FFE7FFE7C04684B27B6F3D6F1B04234377 +:104620003B667A66FFE7FFE7C04600232C042D0CAB +:104630007A6F386F00196941B0BC7047000000D034 +:10464000F0B594460025140E01D112020835140F5E +:1046500001D112010435940F01D192000235D40F1B +:1046600001D152000135D40B0134254F7C66254C15 +:104670003C660E0C93B2FFE7FFE7FFE73C6F664333 +:10468000360C7703BE467343DF0B5B04C01AB94197 +:10469000130C7343DB18C91ACE086643360CB644B4 +:1046A00093B273431F0F1B01C01AB941130C73431C +:1046B0001F0B1B05C01AB941860D8F023E4366438E +:1046C000360C092D24DB520A7243801A7703460AFE +:1046D0006643360C16235B1BDE40DF40BF19644681 +:1046E0006643821B7046043506330100D940A8405A +:1046F000C01900D30131A24206D20023F0BD000050 +:10470000000000D0FFFFFFFF121B0130F3D3F1E7E1 +:1047100009277F1BFE406446A2B27243801A00D272 +:104720000139220C7243130C1204821A99410B00B6 +:104730007046043513370100F940A840801900D3B2 +:104740000131002B02D1A2420AD2F0BD013000D3C8 +:104750000131121BFAD2013BF8D1A24200D2F0BDC6 +:10476000013000D30131121BF7E7F0B51C0C00D06B +:1047700080E00CB400251C0A04D11B02160E334342 +:10478000120208351C0B04D11B01160F3343120112 +:1047900004359C0B04D19B00960F334392000235E5 +:1047A000DC0B02D192185B4101351C009718644163 +:1047B0000134464F7C66464C3C660E0CFFE7FFE733 +:1047C000FFE7C0463C6F6643360C7703BE4697B2A0 +:1047D0007743C01B00D20139C01B00D201399FB200 +:1047E0007743C91BC91B170C77437E04FF0B801B43 +:1047F000B941CE086643360C0C2D33DBB644120BA0 +:104800001F053A431B0B97B27743C01B00D20139F7 +:104810009FB27743C91B170C77433E043F0C801BA4 +:10482000B941860D8F023E43664329277F1BFE4018 +:104830000C3D7746AF40BF1930BCA2B2ABB2724359 +:104840007343801A9941220C7243130C1204801A8C +:10485000994102000B000137001BA941F9D2781ED3 +:104860000021F0BD0C277F1BFE4077467F0BAF4039 +:10487000FF19E0E700245D1C07D0144F7D66396600 +:10488000FFE7FFE7FFE7FFE73C6F95B29EB26543A6 +:104890006643401BB141150C1E0C6543664336044C +:1048A0002F0C3E432D04401BB141994204D202001B +:1048B0000B0020000021F0BD01D19042F7D3801AF7 +:1048C000994101349942F2D3F6E70000000000D08C +:1048D000FFFFFFFF48404140484018B41B4B5B6856 +:1048E000FC46019308BD04DF674B001018B4174B5A +:1048F0001B68FC46019308BD00DF714B0010944615 +:10490000134A926F920809D2624618B40F4BDB68C3 +:10491000FC46019308BD0CDF294E00100C4AF0B58F +:10492000146E556E576F166F6246FFF7EEFF084A1A +:104930001466556657671667F0BD18B4034B9B683D +:10494000FC46019308BD08DFCD4C0010F01000209C +:10495000000000D0FFB550404240504059404B400D +:10496000594000E0FFB5154F4C00640D03D0BC4228 +:1049700004D10C0314D80020090D09055C00640D56 +:1049800003D0BC4204D11C030AD800221B0D1B0516 +:1049900001264B4009D44B4003D58B4200D18242C3 +:1049A000FFBD9942FCD19042FFBD0B43DB1803438E +:1049B0001343F5D0C9434918FFBD0000FF070000AD +:1049C00000B5FFF7CFFF804100BDC04600B5FFF73F +:1049D000C1FF01D9002000BD012000BD00B5FFF7D7 +:1049E000B9FF804100BD012040054A00121804D8DB +:1049F0005A00121801D8002070470120704700208B +:104A0000704700000021002805D17047C1174840B9 +:104A1000401AFAD0C90713B5064B1B6898470CBC5F +:104A2000441CA2401005120B0349091B0905194338 +:104A3000114310BD281D00201F04000010B54C00BC +:104A4000620D8023D218DB00D21A5B057E2A10DDAE +:104A50009E3A13DACC170903490819435242D14050 +:104A6000640001341532202A05DAD040084360433F +:104A700010BD002010BD0846604310BDC80FC0180F +:104A8000013810BD18B4044B5B6AFC46019308BDA5 +:104A900024DFD94F00100000F0100020132370B560 +:104AA0001D78012D15D010DD1D48FFF789FC1D4C28 +:104AB00001008022200000F05DFB022D2DD01A485D +:104AC000FFF776FC194B186070BD194B154CA364A9 +:104AD000F5E7174B134C23606360A360E360236129 +:104AE0006361A361E36123626362A362E3622363A0 +:104AF0006363A363E36323646364A364E364236580 +:104B00006365A365E36523666366A366E36623675F +:104B10006367A367E367A364D1E7054BA364CEE7AC +:104B200053440000F01000204C330000281D0020EA +:104B3000354B001007B5604601880A0A0230DF2AAB +:104B4000FAD1C9B2820804D3028840880004104315 +:104B500000E00068014A5050039007BDF0100020AB +:104B60000FB403BC0CBCF0B50124E407634000E0C3 +:104B7000F0B50C0DCF0F661E3605891B640503D3F7 +:104B8000C943404200D30131640D03D0661CF60ACC +:104B900007D0E41B00207F00791C89078912803C24 +:104BA00024031D0DDF0F6E1E36059B1B6D0503D301 +:104BB000DB43524200D301336D0D03D06E1CF60A65 +:104BC00007D0ED1B00227F007B1C9B079B12803DC2 +:104BD0002D032F1B661B58D4A446202E46DA2037FF +:104BE0001400BC401D00BD40F24033412A438018F0 +:104BF0005941CB0F05D0C943C04300226442504104 +:104C0000514162464D0D28D10D0D07D100281FD00E +:104C1000241940414941013A0D0DF9D0640006D3F1 +:104C2000013000D30131002C01D140084000013A8D +:104C30000BD4941CE40A04D112051144DB07194477 +:104C4000F0BDD907204B194300E0D9070020F0BD83 +:104C50000029DDD1002CDBD1F0BD0132C6074008B0 +:104C6000CD0728434908002EE1D0D9E73C2E29DAA8 +:104C7000203E40371400BC4000D00124F2401443D1 +:104C80001A00BB401C43D317ACE7AC46202F08DA10 +:104C900020360400B4400D00B540F84039412843A7 +:104CA000A5E73C2F0CDA203F40360400B44000D08A +:104CB0000124F84004430800B1400C43C117EAE75F +:104CC00010001900002494E70000F07FF0B50C0DEF +:104CD000661E3605891BE60A6405640D02D0651C54 +:104CE000ED0A04D0002001210905803C2403A446DC +:104CF0001C0D671E3F05DB1BE70A6405640D02D02F +:104D0000651CED0A04D0002201231B05803C24030E +:104D10007740644497B484B296B27443070C7E43E0 +:104D2000150C6F4380B26843361802D3012000048B +:104D30003F183004350C00197D41844688B29AB280 +:104D400050430C0C62431F0C7C438EB27E4392197D +:104D500002D301263604A4191604170C361867412D +:104D600001BC81B29AB25143040C62431B0C5C43F8 +:104D700080B25843121802D30120000424181004F2 +:104D8000130C401863412D185E410020474106BCBA +:104D900088B293B258430C0C6343120C544389B24B +:104DA00051435B1802D301210904641819041A0C39 +:104DB000091862416D1856410020474118BCF9029C +:104DC000720D1143F0026A0D1043ED020A0D03D17A +:104DD0006D1940414941013B124E9B1B7600B34285 +:104DE0000ED26D0007D3013000267141664635436F +:104DF00001D1400840001B05C918E4072144F0BD5B +:104E00000BDA013306D1013004D101314F0D01D04D +:104E10004908F2E7E1070020F0BD01363105002026 +:104E2000EBE70000FF030000F0B51C0D671E3F0517 +:104E3000DB1BE70A6405640D02D0661CF60A04D089 +:104E4000002201231B05803C2403D0252D060026CB +:104E5000F6432E661E096E66CE0FF619B44649005B +:104E60004F0D02D07E1CF60A03D000200021403FE7 +:104E70003F033E1BB600B444013F7F05C91B4908F0 +:104E80002E6F013676089C02950D25437543ED1370 +:104E90007543AD1301356D10F603761B0CB4CC02CF +:104EA000450D2C43A2B2B3B25A43270C7B43350CB9 +:104EB0006F43A4B26C431B1902D3012424043F198D +:104EC0001C041D0CA4187D4124196D41009A91B257 +:104ED000ACB26143170C7C432B0C5F4392B25A4334 +:104EE000A41802D301221204BF182204230C521862 +:104EF0007B41019C6C431B19520ED9010A434401AA +:104F0000A01A81B2B2B2514303145A43360C734310 +:104F100087B27743D617D21900277E4136049B19F2 +:104F20001704160C7F185E417316ED18F301002666 +:104F300080337541A90F06D16400690AE8055B0A50 +:104F4000184309D22FE00422944480337541A90A02 +:104F5000A8059B0A184326D3404149412404009ADE +:104F6000019B0D005543641B4343E41A95B286B27E +:104F70007543170C7E43030C5F4392B25A43B61835 +:104F800002D301221204BF183204330C52197B41A0 +:104F900052429C41002C02D4002201305141400871 +:104FA000CA071043490802B06246D7079210084B5F +:104FB000D218084B9A4203D212058918C919F0BDBC +:104FC0000020002A01DC3900F0BD01331905F5E7A6 +:104FD000FD030000FE070000002200B5203200F0B3 +:104FE00004F8080000BD000000220B150AD410B51B +:104FF000944600F031F81414013400DA0021CB1784 +:10500000144C20470020002170476244343A0CD4ED +:105010000C2A07DA04009140904052422032D440DA +:10502000214310BDD843D94310BD203207D40C46CC +:105030009440524220321141D040204310BD08001C +:10504000C917203203D452422032104110BD18003B +:10505000190010BD0B5000100A0DCC0F531E1B057C +:10506000C91A520503D3C943404200D30131520D3E +:1050700003D0531CDB0A07D0121B00206400611C04 +:1050800089078912803A1203014BD21A7047000037 +:10509000FF03000051434343C9188C46110C83B2EF +:1050A0004B4310B4040C614392B280B2504362434C +:1050B0001C041B0C001910BC59411304120CC0181D +:1050C0005141614470470000132310B512481C7809 +:1050D000FFF776F90100012C0AD003DD80220F488A +:1050E00000F048F80E48FFF763F90E4B186010BD4A +:1050F0000A4C5422200000F03DF80B4B6365A36579 +:10510000E36523666366A366E36623676367A36755 +:10511000E3672362E361E5E753460000F0110020F6 +:105120004C330000281D00202D51001007B56046AB +:1051300001880A0A0230DF2AFAD1C9B2820804D3F0 +:10514000028840880004104300E00068014A505083 +:10515000039007BDF011002001480421014B1847BE +:10516000300F0020D1430010014B1B68184700008E +:10517000300F0020014B5B6818470000300F002003 +:10518000F0B5C64600B5437D07000D001600002BA4 +:1051900038D0002A2EDD00216A1E90466A5C037D0D +:1051A0004C1C00200A2A0CD0A64216D043461B5D98 +:1051B00021000D3B5A4253416A5CDBB24C1C0A2A67 +:1051C000F2D1002BF0D1884217DB022110483B6856 +:1051D0009847A64207D02000E8E7864203DD311A4F +:1051E0003B6828189847AD19013D2B780D3B5A4272 +:1051F00053413B7580BCB846F0BD091A3B6828187E +:105200009847E2E70368110028009847F2E7C04694 +:105210004C800010F0B5C6460B6806000C0000B5C7 +:10522000802B06D05A1C2260E418267180BCB84638 +:10523000F0BD0F4B1D68002D16D00B1D98460D4F6D +:1052400002E02D69002D0FD02B68002BF9D03B68B0 +:10525000002B01D0AB42F4D1280041462268FFF771 +:105260008FFF2D69002DEFD101220023DBE7C0461F +:10527000C0180020C8180020F0B5CE46474680B5BB +:1052800083B06B460600DD1D2870FCF76BFE002323 +:105290001A4A12184B41802109068B4202D301227F +:1052A000174B524217490800884602F0B1FC164BD2 +:1052B00081461C68002C14D0144F02E02469002C95 +:1052C0000FD02368002BF9D03B68002B01D0A342FC +:1052D000F4D1200001222900FFF752FF2469002C9D +:1052E000EFD14B46002B05D1300003B0C0BCB9460E +:1052F000B046F0BD404602F04BFCF5E740420F00DF +:10530000FFFFFF7F980F0020C0180020C818002062 +:10531000F0B5DE4657464E464546E0B585B0070037 +:1053200002F0FCFB0600FCF71DFE00232B4A1218BE +:105330004B41802109068B4202D30122284B524265 +:10534000284908008B4602F063FC274B01901C683B +:105350009A46002C3BD0254B984602ABDD1D0A2314 +:10536000994602E02469002C17D02368002BF9D05D +:1053700043461B68002B01D09C42F3D12000320031 +:105380003900FFF7FDFE4B462000012229002B705B +:10539000FFF7F6FE2469002CE7D1019B002B18D102 +:1053A00053461C68002C06D06368002B0BD098472E +:1053B0002469002CF8D1300005B0F0BCBB46B246E1 +:1053C000A946A046F0BD2469002CEDD1F3E70028E2 +:1053D000F1D0584602F0DCFBE2E7C04640420F0045 +:1053E000FFFFFF7F980F0020C0180020C818002082 +:1053F0000A4A1368002B05D10CE01A001B69103211 +:10540000002B07D09842F8D1002902D1036913601C +:10541000016170470029FCD01060FAE7C018002035 +:10542000F0B5CE46474680B5A3B004000D00FCF7AA +:1054300099FD0023294A12184B41802109068B420D +:1054400002D30122264B5242264F380002F0E0FBE5 +:1054500000230600019322002B00234801A9FEF738 +:1054600077FF019B8046002B14D1204B1C68002C39 +:1054700006D06368002B0BD098472469002CF8D124 +:10548000002E25D1404623B0C0BCB946B046F0BD81 +:105490002469ECE7154B1D689946002D1CD0144C6F +:1054A00002E02D69002D0FD02B68002BF9D0236866 +:1054B000002B01D0AB42F4D12800019A02A9FFF7DA +:1054C0005FFE2D69002DEFD14B4601951C68CEE79C +:1054D000380002F05DFBD5E70195D1E740420F00AF +:1054E000FFFFFF7F980F002015520010C01800200A +:1054F000C81800200FB400B583B004A901C90191F8 +:10550000FFF78EFF03B008BC04B0184710B500F0D9 +:10551000CDF800F0C7FA012010BDC046F0B5002953 +:1055200015DD0E4B0D271A680D4B0E4CD3185D423E +:105530006B41451820215B001E5F0478A64207D00E +:1055400093691942FCD101301460A842F5D1F0BD35 +:1055500093691942FCD11760F2E7C0464C1D002048 +:105560000080FCBF481D0020214B70B504000D1EBB +:105570001E682CDD002010211E4B013C1A68936927 +:10558000194215D1013093691942FCD11368235493 +:105590008542F4D1002E09D0502338219363536BF8 +:1055A0003432194080235B011343196028000DE059 +:1055B000002E09D0502338219363536B34321940A5 +:1055C00080235B011A43116000280ED070BD002EAD +:1055D0000BD050223821074B1B689A635A6B343327 +:1055E0001140802252011343196003204042EDE72D +:1055F000441800204C1D0020064B10B51B68002BE2 +:1056000006D00021044A12689163044A1068984742 +:1056100010BDC046441800204C1D00204C1800202E +:105620001D4BF0B51A68C64698461C4B0E00D318A1 +:1056300059424B411A4F14331C00050000B53B681A +:10564000002807D0002B11D0164B3D601E6080BC97 +:10565000B846F0BD002BF7D0906300212000FBF787 +:1056600097FD20001049FBF7EFFEEDE720000E4903 +:10567000FBF7C6FD01212000FBF78AFD43465022BF +:1056800038211B689A635A6B3433114080225201CF +:1056900013431960D8E7C0464C1D00200080FCBFB2 +:1056A000441800204C180020F95500100C4B10B580 +:1056B0001B780C4B0C4C1B780C4B022100202360F8 +:1056C000FBF78CFC02210120FBF788FCE12120681C +:1056D0004902FCF72FFF01210548FFF789FE10BDA5 +:1056E000CC810010C88100104C1D002000400340F8 +:1056F000400F00207047C0460022014B1A707047CF +:10570000661D00204B790020FF2B0BD18B79002BDD +:1057100008D1CB79012B05D1082A03D9024B8A780D +:1057200009301A707047C046661D0020012070477E +:1057300070B5012901D0012070BD1349537910794A +:1057400009781B02034300209942F5D15378012BBD +:1057500008D0022BF0D1002064220021FDF774F95B +:105760000120E9E79478D278050012021443D205AB +:1057700002D5620A93401D000448FEF719FE7F21FE +:105780000300214028009847661D00205542000074 +:105790000123037000487047648000104B780A783A +:1057A0001B0213438A7810B512041A43CB781B06E8 +:1057B00013439622D200934200D010BD0348FEF757 +:1057C000F7FD0021030008009847C046554200003D +:1057D000024B1860024B19607047C0464818002001 +:1057E0005018002010B5024B1878FBF7E3FC10BDF1 +:1057F000671D0020114B70B51A68002A1AD0EFF30C +:10580000108172B610680028FCD0BFF35F8F0020B3 +:105810000B4A596010701B68BFF35F8F186081F3EB +:10582000108800240025074B1878FBF7C3FC2900DB +:10583000200070BDFA240025A400F4E7081D002014 +:10584000681D0020671D002070B5040000200E00B8 +:1058500001F0E8FA002836D0002001F0FBFA002819 +:1058600031D0FCF77FFB0023184A12184B418021EE +:1058700009068B4216D2164D280002F0C9F90028FD +:1058800021D0002001F0CEFA00280FD10120002104 +:10589000404200F0C1FC03246442280002F078F981 +:1058A000200070BD01220B4B5242E4E7002001F0C2 +:1058B000D1FA0028EAD021003200002001F0D6FA07 +:1058C000041EEAD1E7E703246442E9E740420F00FF +:1058D000301D0020FFFFFF7FF8B5DE46574680B53C +:1058E00005000C00FCF73EFB0023374A12184B4121 +:1058F000802109068B4202D30122344B52423449A3 +:1059000008008A4602F084F9002803D1C0BCBB46D7 +:10591000B246F8BD002001F085FA00284AD00026E2 +:10592000002C43DD2B4B9B4614E0A919002001F00D +:1059300011FB070001200021404200F06DFC002017 +:1059400001F0CCFAFCF70EFB224BF61918605960F7 +:10595000B4422BDD002001F017FBA71B0200B84268 +:1059600000DD3A00002AE0D101200021404200F091 +:1059700053FC002001F0B2FA002001F053FA002895 +:1059800014D0002001F000FB0028E1D1FCF7EAFA76 +:105990005B460F001A685B68002184460E481218A7 +:1059A0004B419F4202D8D3D19445D1D9504602F001 +:1059B000EFF8ABE700200021064B18605960504615 +:1059C00002F0E6F8A2E7C04640420F00FFFFFF7F6B +:1059D000301D0020E810002020A1070010B5244C45 +:1059E00084B00021200002F0EBF800281CD1214BEC +:1059F0001A68002A16D0EFF3108172B610680028DA +:105A0000FCD0BFF35F8F01241B48596002781B68EC +:105A1000D2B20470BFF35F8F0020186081F310884A +:105A2000002A0AD004B010BD01200021404200F03D +:105A3000F3FB200002F0ACF8F4E7FCF76DF804008B +:105A4000FCF790FAFA220023920012184B418021B1 +:105A500009068B4202D30122084B524201210291D6 +:105A600000210191064920000091FCF759F8D9E77F +:105A7000301D0020081D0020681D0020FFFFFF7F53 +:105A8000F5570010054B10B51868002804D0044BDA +:105A90000022196801F036F810BDC04648180020F1 +:105AA00050180020D02310B51B0684B01C68FCF7EA +:105AB00033F8FCF7F3F8A04202D0002004B010BD88 +:105AC000274B1B7801F042FC2648FBF729FE0120FA +:105AD000FBF708FEFF23244C244920701840FBF7F5 +:105AE0008FFB20780121FBF753FB0520FBF76AFBB6 +:105AF000002827D1FCF710F80400FCF733FAFA224B +:105B00000023920012184B41802109068B4202D3D8 +:105B10000122174B524201210291002101911549A6 +:105B200020000091FBF7FCFF08220400002112482E +:105B3000FFF71AFB002CC0DB10480121FFF758FCCF +:105B40000120BBE700220E490520FBF783FBFBF792 +:105B500001FB094B01001800FBF70CFEECE7C04607 +:105B6000D0810010301D0020671D0020DD5900107D +:105B7000FFFFFF7FF5570010081D0020580F002081 +:105B8000E557001000487047F48000100048704747 +:105B9000A080001010B5040017480378002B20D017 +:105BA000002C06D1154B16484380063BFF3B038073 +:105BB00010BD052C19D8134BA400E058124901233D +:105BC000013804E001330A800231142B0FD0C25C8B +:105BD000002AF7D1C022DBB25B00920008481343D1 +:105BE000E5E7112100F01AF8DAE70020E0E7CA2320 +:105BF00003489B00DBE7C046501D0020090400005D +:105C000098180020888000109A18002010B50248CB +:105C100000F0D8F810BDC046201D002030B54B1E46 +:105C2000012900D1A7E0664A11780D092C00303413 +:105C30009F2900D9A2E00470012B00D1BEE00F2102 +:105C4000147821400C003034092900D998E04470C0 +:105C5000022B00D1B2E054782509290030319F2C65 +:105C600000D990E08170032B00D1A7E00F212140E3 +:105C70000C003034092900D987E0C470042B00D10E +:105C80009CE094782509290030319F2C00D97FE0D1 +:105C90000171052B00D191E00F2121400C0030341F +:105CA000092900D976E04471062B00D186E0D4782A +:105CB0002509290030319F2C00D96EE08171072B16 +:105CC00000D17BE00F2121400C003034092966D837 +:105CD000C471082B00D171E01479250929003031F5 +:105CE0009F2C5FD80172092B68D00F2121400C0036 +:105CF0003034092958D844720A2B5FD054792509C9 +:105D0000290030319F2C52D881720B2B56D00F2195 +:105D100021400C00303409294BD8C4720C2B4DD0D3 +:105D200094792509290030319F2C00D9073101735E +:105D30000D2B43D00F2121400C003034092901D90B +:105D400037310C0044730E2B38D0D1790C09220066 +:105D500030329F2900D9073282730F2B2ED00F22A9 +:105D60000A4011003731092A01D830321100C173BD +:105D7000102B23D010300023037030BD07345AE7B6 +:105D800037310C0063E707316CE737310C0074E7FB +:105D900007317DE737310C0085E707318EE7373172 +:105DA0000C0095E707319DE737310C00A3E7073179 +:105DB000AAE737310C00C4720C2BB1D1C018DAE756 +:105DC000201D002010B588B004000D220021684677 +:105DD000FFF7CAF90D22002104A8FFF7C5F94B23EC +:105DE0006A466846137004A90D2201F0C9FE152108 +:105DF000082220006944FFF7BDF908B010BDC04675 +:105E000010B501210520FBF7C3F910BD10B5002224 +:105E10000021024800F058F910BDC046EC180020DF +:105E20008022024B5202DA647047C04600201150B3 +:105E3000F0B5C64600B5060000F020F90C231B4D56 +:105E4000FF22AB6705201A49FBF704FA4023984666 +:105E5000184C402200212000FFF786F94346012715 +:105E6000238321210023144A6770A26013606354C6 +:105E70005F31618441462187053963540F4A1049D7 +:105E80006360E260A1620B606362E26201F0D0FED7 +:105E900080239B052F64EB6490230A4A3000EA506C +:105EA000FFF7BEFF80BCB846F0BDC04600001150F1 +:105EB000A1040020CC1800208400105000011050D4 +:105EC0008000105010D001000B785B0602D14B7897 +:105ED000052B00D070478A78014B1A60FAE7C0465C +:105EE00000001150F0B5C64600B5CC7888780A7924 +:105EF0004B797F21A40701401B02C50913434F00C2 +:105F0000A20F1400324E7A195201B218907001207B +:105F10006840507000205B055B0DD0701383D47611 +:105F20008046CA00012D33D02A4884468801624445 +:105F30008446B4446046826040461060002933D0F5 +:105F4000254AC90090466246414451603F223F3392 +:105F50009343022C00D15B0020487A19016852015A +:105F6000B218D1601E4ACB18036051405A408023BA +:105F700088465B019A4228D84346A4061C438023E6 +:105F80007F197F01F61972681B062343136011E025 +:105F900014488446880162448446B4446046826260 +:105FA00040461060002909D100236D0175196B600E +:105FB0000D4BEB60012080BCB846F0BD084AC9001B +:105FC0009046624641445162C0E7FCF735FED3E794 +:105FD000CC1800208400105004001050EC1C00204D +:105FE00000001050800010500001105010B501F05A +:105FF0001FFE10BD10B57F200C0020404000E409BA +:10600000110000191A00034B4001C01800F05CF8A1 +:10601000012010BDCC1800207F23180010B50840C7 +:10602000CA090B4203D107497D3B9B1A8B6640008E +:1060300080188022044B40010021C018120101F099 +:10604000FFFD10BD00201150CC1800207F2213004E +:1060500010B50B400A4200D110BDC9095B005B18A6 +:1060600004485B01C018002300220349C37001F0FB +:10607000E7FDF1E7CC180020FFF7FFFF80220D4B72 +:10608000520410B51A600C4B0C491A6010008B6852 +:106090009843FBD10A4C9C2200212000FFF764F8B2 +:1060A0008022002152010748FFF75EF80923636749 +:1060B00010BDC04600E0004000F0004000C00040BD +:1060C0000000115000001050002310B5C3820133AE +:1060D000828283760161040001F07AFD002804D0F9 +:1060E00080219023074A8902D150200001F0B0FDA1 +:1060F000002802D00123237710BD200001F090FD7D +:10610000FAE7C04600201150024B5878431E9841D0 +:10611000C0B2704718160020024B18784007C00F15 +:106120007047C04618160020034B1878FF38431EEE +:106130009841C0B27047C046940F0020F8B5CE46D3 +:10614000474680B52A4E05003378FF2B01D0012049 +:106150003DE0532200212748FFF706F8264C200097 +:10616000FBF7DEFA254B1C60254C2000143CFBF7A6 +:10617000F3FA200001F0CCFB224B234F1C60234B91 +:106180009846002F1ED01800FFF702FB204B186026 +:1061900043461B781F4A00249146002F14D04A46DC +:1061A000A3421AD89047434601341B78E4B2A34275 +:1061B000F3D228003570FFF73BFE2800FFF720FEE2 +:1061C000012004E01B78E5E7002C04D00020C0BCCF +:1061D000B946B046F8BD0F4AE4E70D4A63001268BD +:1061E0001B19DB00D318002BF0D01A68DAE7C04681 +:1061F000940F002018160020D01500206C160020E7 +:106200008C0F00207016002091570010611D002097 +:10621000F0120020A16F0010F0B5DE4657464E4642 +:106220004546E0B591B001F097F8002800D1FCE0B8 +:10623000C34BC44E9946C44B0DAC0293C34B9B4613 +:106240004B46019335686A69EFF3108172B61368A3 +:10625000002BFCD0BFF35F8FA9612800210001F063 +:1062600085F96A69AB69BFF35F8F0021116083F321 +:106270001088002800D1D8E06378082BE2D8019A72 +:106280009B00D3589F466368002BDBD0A0689847DB +:10629000D8E77F202179AC4D08404300CA09EB18AC +:1062A0009B181D0001273035EA78BA43EA70EA7876 +:1062B0000337BA43EA70002800D1F2E0A44FDB7C38 +:1062C000002F06D0A34A1278934200D2F1E09B1A25 +:1062D000DBB2002B00D0A8E09F4DA3686279207844 +:1062E000A847AFE70122984D01202B7804211343E2 +:1062F0002B703323EA5C8243EA54EA5C8A43EA5413 +:106300000133EA5C8243EA54EA5C00208A43EA549F +:1063100023789A4600F0F8FC602223791A40602A1C +:1063200000D1B5E0402A00D1AFE0DB06DB0E012B47 +:1063300000D1D3E0022B00D120E1002B00D0A7E058 +:10634000202A00D153E1002A00D0A1E06379092B73 +:1063500000D99DE0814A9B00D3589F46029B1B7841 +:10636000DB0700D46EE77E4B002B00D16AE700E02C +:1063700000BF67E7744D2B78DB0700D462E7794BE9 +:10638000002B00D15EE728780007C00F00E000BFB7 +:1063900058E7002523786E4F9A466E4B98461B7837 +:1063A000002F49D05A46AB4263D8504690474346E7 +:1063B00001351B78EDB2AB42F2D2634D532200217E +:1063C0002800FEF7D1FE1022FF21E81CFEF7CCFECC +:1063D00028002022FF211330FEF7C6FE2EE0002504 +:1063E00023785B4F9A465B4B98461B78002F2ED044 +:1063F0005A469D4233D350469047434601351B7859 +:10640000EDB2AB42F2D2504D532200212800FEF7EC +:10641000ABFE1022FF21E81CFEF7A6FE280020227A +:10642000FF211330FEF7A0FE14E011B0F0BCBB4614 +:10643000B246A946A046F0BD002D38D000F05AFC67 +:10644000494B002B00D1FDE600E000BFFAE6002D2D +:1064500019D03D4D00F04EFC2379AB70F2E6434A73 +:106460006B0012685B19DB00D318002BF1D05A685F +:10647000C1E73E4A6B0012685B19DB00D318002BA2 +:10648000DCD05A6891E7314AB5E7394800281AD17B +:1064900020780021FFF7C0FD80212078FFF7BCFDA8 +:1064A000D0E6A3686279207800F042FCCAE6274A69 +:1064B0007BE72E4A58001268C318DB00D318002B64 +:1064C000B3D01D6909E700F01FFC012150460EAA58 +:1064D00000E000BF002800D0B4E6D9E7237A0F2BF4 +:1064E000D6D81B4FEB18DB78002F06D0194A12784C +:1064F000934200D29CE09B1ADBB2002BC8D11D480E +:106500001D4D00F001FC01215046EB680EAA984792 +:10651000002800D096E66022150023791D401A421B +:10652000B6D163790A3B012BB2D800F0EDFB637959 +:106530000A2B00D17DE150460EA900F06FFB81E6E9 +:106540000881001070160020181600201D70001021 +:1065500091570010611D0020117200102C81001055 +:10656000000000000000000000000000F012002009 +:10657000000000002D710010948100107023217A1A +:106580000B4285D1C80984460F330B405B00E818E5 +:106590006044C07CB14F8046002F07D0B0480078DF +:1065A000804550D34746381AC0B28046404600283E +:1065B0003AD1002A00D0F5E0AA4A90466779022035 +:1065C0003A008243012A00D1F0E0002F00D05FE7BB +:1065D000EB1863443033DB780CAA9B07DB0F0232E5 +:1065E0001380504602230EA900F02EFB2AE6237AE0 +:1065F0000F2B00D94CE7994FEB18DB78002F06D012 +:10660000974A1278934200D2F3E09B1ADBB2002B38 +:1066100000D03DE79448934D00F076FB01215046B1 +:10662000EB680EAA984755E79046002AC6D02FE798 +:106630008E4A59001568CB18DB00ED18002D00D1EB +:1066400026E7E8685DE7474688487F0000684744DA +:106650008046FF00B844002AB0D04346002B00D14A +:1066600016E7D86800F050FB434601215046DB682E +:106670000EAA98472EE7A37903931A006B789A42E3 +:1066800007D06B78002B00D058E1039B002B00D083 +:10669000F8E0039B50460EA96B7000F0BFFAD1E5FD +:1066A0006B780CAA02321370504601230EA900F039 +:1066B000CBFAC7E5E3881A0AD8B20F2A00D9E7E671 +:1066C0006B499300CB589F460EA800F023FB504621 +:1066D000A179FFF79BFB02222B7813432B70B1E5C6 +:1066E000E388012B00D0D3E608222B785046934351 +:1066F0000EA92B7000F092FAA4E5022029780CABC9 +:106700009A1C8B068908DB0F01400B4368E7E3887E +:10671000012B00D0BCE608222B78504613430EA96B +:106720002B7000F07BFA8DE5524B002B00D1AFE6C9 +:1067300000E000BF021E00D1AAE6D37891781B02C8 +:106740000B4350460EA900F07FFAC3E64A4B002BDC +:1067500000D19DE600E000BF021E00D198E6504641 +:1067600013780EA900F070FAB4E62189FFF712FA47 +:10677000021EF4D18CE6022A00D12DE13F4B002B02 +:1067800000D185E600E000BF0200002A00D17FE6CC +:10679000D3E7FFF7F7F9122302000EA9504600F0E5 +:1067A00053FA97E62F4B304898465BE7E288002A79 +:1067B00009D1334A1078012F26D0EF1867443037BB +:1067C000FB789B073ED54346002B00D13AE5D868BD +:1067D00000F09AFA43460121DB680EAA504698471A +:1067E000002000F091FA3423EB5CDB0700D529E5AB +:1067F000A1E61E4A59001568CB18DB00ED18002DE4 +:1068000000D145E6E86807E730229146EB1863447B +:1068100099444B46DB789B07D5D5FFF717FC4B46D1 +:106820000222DB7893434A46D370D378BB43D370BC +:10683000C9E70CAB9A1C504601230EA9157000F055 +:1068400003FAFFE4FFF7E8FB0222FB78134301227F +:10685000FB70FB781343FB70B5E7C04691570010FF +:10686000611D0020948100102D710010F012002095 +:106870005481001000000000000000000000000033 +:10688000940F0020581EC0B2FFF780F9002800D1F5 +:10689000FEE543780793022B00D0F9E50121C27988 +:1068A000B146931152110B400A4012015B01134390 +:1068B0002A782F318A4313432B700923984680444A +:1068C0004746A846C37882781B021343C318049333 +:1068D0005C4B0993049BBB4200D881E07B7801228A +:1068E0000B2B02D13B78FA78FF187B78042B23D14D +:1068F0000025049B0B92DB1B9BB20593524B19782E +:106900000693524B0A93524B08930A9B002B52D08A +:10691000099B089E8D4245D339005046059A9847F9 +:106920008446082802D9059A824262D2069B013524 +:106930001978EDB2A942E8D24E46A9E55046FFF7D4 +:1069400055FB00229146434AAB7805922A004D46FA +:10695000914604933C4B3D4F98461B78002F1BD02B +:10696000059A9D422CD350469047434601351B78EB +:10697000EDB2AB42F2D24D46532200212800FEF781 +:10698000F3FB1022FF213448FEF7EEFB2022FF210B +:106990003248FEF7E9FB02E0002D1BD04D46049B78 +:1069A000AB7072E618232E4A6B431668F618002E59 +:1069B000C2D0B368B0E7002DBED1224B244EABE766 +:1069C000274A6B0012685B19DB00D318002BE5D057 +:1069D0005A68C8E71F4AC6E7FFF7D8F80200D4E6AE +:1069E000204B45464E46002B00D152E600E000BF4A +:1069F0004FE60B9A012A1FD00021464609E0BB78DA +:106A0000CB18DBB2F318D878FF2895D10131DD70AF +:106A1000C9B29142F3D1B04666462B00390032002C +:106A20000E4800F01FFDB446069B67441B78AB423E +:106A300000D34FE74E462BE5024BB1689942DBD1BC +:106A4000079AD9E749700010611D00209157001086 +:106A5000948100101D7000101B1600202B160020C2 +:106A6000F012002000000000F8B557464E46DE4602 +:106A700045460C00E0B516001F00002A3CD01F4B15 +:106A800000259A46702399461D4B9B4617E05B46AE +:106A90002000997800F0A8FC00281FD02100404673 +:106AA000FFF720FA002819D0A378DA09012A1CD0B0 +:106AB0000A9A013513702378E418B5421CDA63781A +:106AC000052B0BD1E3789B079B0FBB4206D15346A6 +:106AD0004A461B789846A3781A42D8D00020F0BCCA +:106AE000BB46B246A946A046F8BD0B9A01351370C5 +:106AF0002378E418B542E2DB0120F0E7940F002090 +:106B000018160020802310B51B0184B001930E4B92 +:106B100002901C6803916269EFF3108372B61168EA +:106B20000029FCD0BFF35F8FA361200001A900F012 +:106B3000DFFD6269A369BFF35F8F0021116083F3FA +:106B4000108804B010BDC04670160020702270B5C9 +:106B5000094B0C001D788B781A4201D0002070BDC3 +:106B6000064B2000997800F03FFC0028F6D0210069 +:106B70002800FFF7B7F9F2E7940F0020181600205D +:106B80000B007F2010B51840DB0933334000044A66 +:106B9000C018044B1168C01800F0E2FB10BDC046DD +:106BA0006C160020181600200B007F2010B518402E +:106BB000DB0933334000044AC018044B1168C01885 +:106BC00000F0F6FB10BDC0466C1600201816002021 +:106BD00070B57F240F480C4064000419CD09641976 +:106BE0003034E078C00701D5002070BD0126E5787B +:106BF000094835430078E570FFF7FCF90028F4D127 +:106C00000122E3789343E370E37803329343E37024 +:106C1000EAE7C04618160020940F002070B5094C12 +:106C20000600082220000D00FEF7A4FA00238021B0 +:106C3000E360A3602B783000994300220023FFF724 +:106C4000C7FF70BDBC150020F8B5CE46474690463C +:106C5000264E80B58146082230000D001F00FEF749 +:106C600089FA4346B3600023F381EC79AB792402BF +:106C70001C43231CBC4200D93B1C9FB2B381002C97 +:106C80000ED0002F18D04346002B2CD03B1C402F99 +:106C90001BD89FB233787F2B1CD80021144A0FE0F9 +:106CA00080212B780022994348460023FFF790FF6C +:106CB000C0BCB946B046F8BD7F2300223178994365 +:106CC0003B004846FFF784FFF2E740239FB233784A +:106CD0007F2BE2D9064C3A0041462000FEF74AFAE3 +:106CE00080212200ECE70020E2E7C046BC1500202E +:106CF000D815002010B5142200210248FEF734FAFE +:106D000010BDC046BC150020014B18617047C0463D +:106D1000BC15002010B5054C010008222000FEF72C +:106D200029FA0023A360E36010BDC046BC15002013 +:106D300070B5394C1D0023780600DA09C9098A426A +:106D400013D00020002D00D070BD344B002B03D099 +:106D500021003000FFF7B8F82369002B03D0220090 +:106D60000321300098470120EEE7A0687F2B05D86B +:106D7000002834D02A002A49FEF7FCF9E289A168EC +:106D80005219E38892B24919E281A160934214D06A +:106D90003F2D12D9A389981A051C80B240282AD801 +:106DA0002078ADB27F2828D800219A4232D01C4AE0 +:106DB0002B003000FFF70CFFC6E72369002B05D03E +:106DC000220002213000984700280AD08021237831 +:106DD0000022994330000023FFF7FAFEB4E70020B9 +:106DE000B2E700213000FFF717F930008021FFF7EC +:106DF00013F90120A8E74025D2E79A4207D0084CB2 +:106E00002A002000FEF7B6F980212200D0E7802179 +:106E10000022CDE70022CBE7BC150020C95E0010A0 +:106E2000D815002010B50400FFF76EF9002801D135 +:106E3000002010BDFFF770F90028F9D1B2229200AE +:106E40006243034B01309B181B791840F1E7C046A1 +:106E5000F4120020B2239B00434310B502481818D7 +:106E600000F050FB10BDC04604130020F0B5B22561 +:106E7000AD0045432C00C646174F1034E41900B549 +:106E8000200092B200F0C0FB0600200000F058FB8A +:106E90003F2803D8300080BCB846F0BD7B190020E5 +:106EA000D9789846FFF76CFE0028F3D0200000F058 +:106EB00047FB3F280AD992239B00EA184346D21980 +:106EC000D97800204023FFF783FEE3E74346002004 +:106ED000D978FFF769FEDDE7F4120020F8B5040069 +:106EE000FFF712F9002801D10020F8BDFFF714F9CF +:106EF0000028F9D1B2239B005C432500144E2435B1 +:106F0000AD19280000F0FEFA0028EDD03719002056 +:106F1000B978FFF735FE0028E6D0A2239B009C46F7 +:106F20006444A41921002800402200F06DFBB978C8 +:106F3000051E08D0030022000020FFF749FE0028AC +:106F4000D2D02800D1E70020FFF72EFECCE7C046C4 +:106F5000F412002070B5B224A4004443094B05008C +:106F6000E418200092B200F017FC0600200000F0A8 +:106F7000C9FA3F2801D8300070BD2800FFF7AEFFE6 +:106F8000F9E7C04618130020B2239B00434310B515 +:106F90000248181800F0D4FA10BDC046181300209B +:106FA000B222F0B51B4C83B0002120009200FEF706 +:106FB000DBF8FF236371184B80260025E38001274F +:106FC0000823210020007600237332002781383106 +:106FD0000095073B103000F05FFA210020003931A6 +:106FE0003200FF3101230097243000F055FA8E2340 +:106FF0009B00E6183000FAF793FB90239B00266273 +:10700000E6183000E561FAF78BFB2663656303B091 +:10701000F0BDC046F412002000C2FFFF10B5094CBD +:10702000052200212000FEF79FF8200024341030B4 +:1070300000F06EFC200000F06BFC0121200000F04D +:1070400087FC10BDF4120020F0B54B79060083B028 +:10705000022B02D18B79022B03D00025280003B02C +:10706000F0BD2F4FBB78002BF7D18B7809253B70F3 +:107070000C780C196378242B0BD1082A02D81FE056 +:10708000AA421DD32378E4185D196378ADB2242B8E +:10709000F6D0052B31D0042B12D163790A2B0FD1F6 +:1070A000204B277801930133009302220223300002 +:1070B000E119FFF7D9FC0028CFD00E35ED19ADB29C +:1070C000194C200000F03CFA3F28C7D92600103E9A +:1070D0000020F178FFF754FD0028BFD0200000F019 +:1070E0002FFA3F2817D98E239B00E218F93BF1783D +:1070F000FF3B0020FFF76CFDB0E721003000FFF7F9 +:1071000025FD0028A9D0A3787B7023785D19E418A9 +:107110006378ADB2BFE7F1780020FFF745FD9DE74A +:10712000F4120020F612002004130020F8B56023AA +:1071300014001278050013400020202B12D12F4A92 +:107140006379277916781B023B439E420AD1637804 +:10715000222B1AD007D8202B3CD0212B02D1012979 +:1071600030D00120F8BD232BFCD101293FD00329C9 +:10717000F7D1234B002BF4D0E178A378090200204B +:10718000194300E000BF0120ECE701292FD00329BB +:10719000E7D101252E00A378E478023924021C43AC +:1071A0001471264024321000714000F0D1FB154BC1 +:1071B000002BD6D06208002031002A4000E000BF3A +:1071C0000120CFE70723210028000F4AFFF73CFDED +:1071D0000120C7E70129F5D00329C2D10B4B002BB1 +:1071E000BFD00020911DFEF7D9FA0120BAE7210097 +:1071F0002800FFF713FD0120B4E7C046F412002079 +:107200000000000000000000FA1200209D5700104E +:10721000F8B545465746DE464E46E0B5464D1F009A +:10722000EA7880460C00AB788A4246D000208B4238 +:107230001AD0F0BCBB46B246A946A046F8BD3F4BAB +:10724000002B04D0484600F073F900286CD0484663 +:1072500000F076F93F2807D94E46103E0020F1781D +:10726000FFF78EFC002851D1AB78A34201D001205A +:10727000DFE7334B002B02D0002000E000BF0020EE +:10728000FFF72CFE0028F2D12E4C200000F03AF936 +:107290000028ECD1002FEAD0BF06E8D1243C4046BC +:1072A000A178FFF76DFC0028E1D0002300224046C2 +:1072B000A178FFF78DFC0120BBE792239B00EE181D +:1072C00010239B46AB4431005846BAB200F064FA32 +:1072D0001D4BD946002BB2D06B79FF2BAFD0002FBE +:1072E000ADD0F219924603E00136B245A7D06B79D2 +:1072F00032789A42F8D1484600F01AF90028F3D1C2 +:107300004B46103B597900E000BFEDE7484600F0DE +:1073100017F93F280BD98E2292004023F1784A4476 +:107320000020FFF755FC9FE7FEF7ACFB8FE7F178F5 +:107330000020FFF739FC97E7F4120020855A00106F +:1073400000000000181300200000000010B500200D +:10735000FEF7F4FE10BDC04610B5FEF7E5FE10BD09 +:10736000037870B5DB0704000E00DD0F002B17D18A +:1073700003785B0701D5280070BD01213000494228 +:1073800000F02EFC2378DB07DD0F002B0AD12378D9 +:107390005B0708D40422237801251343237002E0FD +:1073A0000025E8E70025300000F0F2FBE3E7C046E7 +:1073B00070B50C00012106004942200000F010FCCD +:1073C00033785B07DD0F002B04DB200000F0E0FBCF +:1073D000280070BD3378DB0704D40422337893434C +:1073E0003370F2E70025F0E7437902791B0213437B +:1073F000C2785B0592075B0D920F022A1DD0032A0B +:107400000CD00020012A08D102394A425141124AC7 +:107410009446614499424041C0B2704702394A1EC5 +:1074200091410E4A494211408022D20094460020E8 +:10743000614499424041C0B2EFE7022905D00020E3 +:1074400040229A424041C0B2E7E7054A98184342B9 +:107450005841C0B2E1E7C046FF03000040FCFFFF17 +:1074600000FEFFFF8A1870B5914207D27F264C7844 +:10747000052C04D00C7809198A42F8D870BD340064 +:107480008D782C4064000419ED0963550C780919B6 +:107490008A42ECD8F2E7C046F0B5C64600B5040013 +:1074A00006A805788020884617001E000002824248 +:1074B00026D8E068002803D00121494200F090FB63 +:1074C0002069002803D00121494200F089FB43468E +:1074D000236073045B0CED031D430023E0686381AC +:1074E000A780E5802381002801D000F051FB2069AE +:1074F000002801D000F04CFB012080BCB846F0BD54 +:107500000020FAE710B5048941898288A3B288B2C5 +:107510008C4207D31B1A9BB2101C9A4200D9181C2C +:1075200080B210BD5100091A5B189BB2F4E7C04647 +:1075300003894089181A43425841C0B27047C04677 +:1075400010B5048941898288A3B288B28C4207D3DE +:107550001B1A9BB200209A4201D9D21A90B210BDD8 +:107560005100091A5B189BB2F4E7C04670B50400DD +:1075700000690E00002803D00121494200F030FBD1 +:1075800025896089A288A9B283B285422CD3CD1AFD +:10759000ADB2002D2ED0AA4208D2914230D3891A22 +:1075A0008BB263819A4203D89B1A9BB29A42FBD951 +:1075B000E28821685204520C53433000C918FDF789 +:1075C000D9FD63890125591C89B2A2888B4213D940 +:1075D00000215200891A89B220696181002801D0F6 +:1075E00000F0D6FA280070BD5500ED1A4D19ADB265 +:1075F000002DD0D1618989B252009142ECDBE9E7DC +:1076000089188BB26381CDE7F0B546464F46D64622 +:10761000C0B50600006989469046002803D00121C4 +:10762000494200F0DDFA31897289B5888BB294B293 +:10763000914254D31F1BBFB2002F4AD0BD4205D286 +:10764000AB4251D25B199CB22F0074814346B845BE +:107650003DD89FB2A54203D8641BA4B2A542FBD972 +:10766000F28831685204520C904662432B1B9BB245 +:10767000891842469F4225D953439BB21A00484677 +:107680009A46FDF777FD434648467D1B64195C43E7 +:1076900031685044A2B2FDF76DFD7189B588CB19F0 +:1076A0009BB26A00994216D99B1A9BB230697381CA +:1076B000002801D000F06CFA3800E0BCBA46B146B0 +:1076C000A846F0BD48467A43FDF754FDE5E73B1C6C +:1076D000BFE773899BB26A009342E7DBE4E76F0080 +:1076E0003F1BDF19BFB2A7E75B1B9CB2ACE7C046EC +:1076F000F8B50400C0680E00002803D001214942FB +:1077000000F06EFA258920896189A288ADB283B222 +:107710008FB2884229D3DB1B9BB29A4209D8E77902 +:10772000FF0906D1E068002801D000F031FA3800E6 +:10773000F8BD95421ED32B009B1A9BB29342FBD2FD +:10774000E28820685204520C53433100C018FDF700 +:1077500011FD6B1C9BB2A2889D4218D900235200D8 +:107760009B1A9BB201272381DCE75100C91B5B18E0 +:107770009BB2D2E72B00E28820685204520C53439C +:107780003100C018FDF7F6FC0135A288ABB25200FB +:107790009342E7DBE4E7C046F0B557464546DE4690 +:1077A0004E46E0B5140005000F0083B0002A75D0E6 +:1077B000C068002803D00121494200F011FA2E8947 +:1077C000E9796A89AB88B6B292B2C90945D19642C5 +:1077D00000D36DE059008A1AB21892B2002189468E +:1077E0009A4234D29A1A111C92B2A24200D9211C98 +:1077F0008AB29146EA885204520C90464A46B21820 +:1078000092B292464A46D21A92B2934634009E42AF +:1078100003D3E41AA4B29C42FBD2424662432868D6 +:107820001B1B9BB2801842464B4554D34B46390034 +:107830005A43FDF79FFCAB885B00B24501D39A45E4 +:1078400003DB5246D31A9BB29A4653462B81E86813 +:10785000002825D000F09CF922E0E9884904490C71 +:1078600088469C4227D2964247D3B11A89B28C46A9 +:107870005800E11A89B28B4661460919814208DB3A +:10788000D11889B20E1BB6B28A46B2423BD9361A1B +:10789000B6B2A21992B29246A146B7E70023994622 +:1078A000484603B0F0BCBB46B246A946A046F0BD70 +:1078B000B21A92B292E700218946002BC7D0414606 +:1078C000E41A4C431600D118002289B28A46994620 +:1078D00093463F199AE753439BB21A0039005C4420 +:1078E0000193FDF747FC414622004A43019B28686B +:1078F00092B2F918FDF73EFC9DE75800811A711805 +:1079000089B28C46B5E7A146B04200DD7EE7BEE70E +:1079100010B50400C068002803D00121494200F0DE +:107920005FF92069002803D00121494200F058F98D +:107930000023E06863812381002801D000F028F94A +:107940002069002801D000F023F9012010BDC046B5 +:1079500070B50400C0680D00002803D00121494221 +:1079600000F03EF92069002803D00121494200F0CF +:1079700037F97F21E379ED011940E0682943E1718E +:10798000002801D000F004F92069002801D000F09F +:10799000FFF8012070BDC046F0B54E4681464D4A05 +:1079A00045464A44531E9A418023DE4657465B02B1 +:1079B0009C46E0B5484B120462441A60474B0D00E8 +:1079C000474983B01A6010008B689843FBD10620AA +:1079D000FAF7DAFF4B465A6802231A400192042252 +:1079E0004A449346C0225946920111430B608A468D +:1079F0008021804649008C4641460220A846EF0D72 +:107A00006E02AB0DAA02009104E0009CA5425ED874 +:107A1000604553D0010015001C00023092197B41D3 +:107A2000002CF2D0009B454698465B468024AB462E +:107A30000D000E02761A640000932700013C002C12 +:107A400040D031004046FCF70DFD761B8345F4D253 +:107A5000009B29009B466F4324024B4619611B681B +:107A60004A465C40FF231B021C4080235B011343FA +:107A7000802259460198920111431C6008604846D3 +:107A800055464468022028604D462E6807256E4002 +:107A9000C83535401D604B4624331A430323044048 +:107AA0000C601360086039004046FCF7DBFC03B053 +:107AB000F0BCBB46B246A946A046F0BD4546010013 +:107AC000A046B2E7009B29009B462F00C5E745462C +:107AD000A046AAE70040FCBF00E0004000F00040E4 +:107AE00000C00040C0230221021D9B011A43116007 +:107AF00002002432134303221A60064B9C46604462 +:107B0000431E984180235B029C460004024B604464 +:107B1000186070470040FCBF00E0004010B58307CC +:107B20000AD00300032102E001330B4205D01A788A +:107B3000002AF9D1181A10BD030019680C4A0D4C1F +:107B40008A188A4322420FD15968094A04338A1895 +:107B50008A43224208D15968054A04338A188A4365 +:107B60002242F1D000E001331A78002AFBD1E1E78C +:107B7000FFFEFEFE80808080F8B5C0460000000059 +:107B800001B40248844601BC604700BFC90200201E +:107B900001B40248844601BC604700BF2D020020AA +:107BA00001B40248844601BC604700BF350E002086 +:107BB00001B40248844601BC604700BF350E002076 +:107BC00001B40248844601BC604700BFC1000020E8 +:107BD00001B40248844601BC604700BFB1090020DF +:107BE00001B40248844601BC604700BF9D010020EB +:107BF00001B40248844601BC604700BFE90D002083 +:107C000001B40248844601BC604700BF750D0020E6 +:107C100001B40248844601BC604700BF0101002056 +:107C200001B40248844601BC604700BF4D0B0020F0 +:107C300001B40248844601BC604700BF89030020AC +:107C400001B40248844601BC604700BFF50A002029 +:107C500001B40248844601BC604700BFD909002036 +:107C600056616C7565206174202558206973202544 +:107C7000580A00000000000048656C6C6F2C204220 +:107C800049545321205472616E736D697474696E26 +:107C9000672025640A0000004E6F207370696E6CC7 +:107CA0006F636B732061726520617661696C6162DC +:107CB0006C6500004E6F20757365722049525173D8 +:107CC0002061726520617661696C61626C6500009B +:107CD000486172647761726520616C61726D202504 +:107CE0006420616C726561647920636C61696D65A3 +:107CF000640000000A2A2A2A2050414E4943202AC3 +:107D00002A2A0A000A000000486172642061737325 +:107D100065727400666E692B00000000666E690073 +:107D20006E616E00666E692D0000000052656C6524 +:107D300061736500626F6F74325F7732357130380E +:107D400030000000312E352E310000007069636F65 +:107D50000000000074657374000000004E6F762010 +:107D6000203720323032330055415254207374642E +:107D7000696E000055415254207374646F7574002D +:107D80005541525420737464696E202F20737464BB +:107D90006F75740055534220737464696E202F20F0 +:107DA0007374646F757400005261737062657272EF +:107DB00079205069000000005069636F00000000E6 +:107DC000426F617264204344430000005265736552 +:107DD00074000000556E68616E646C6564204952E1 +:107DE0005120307825780A0065702025642025739D +:107DF0002077617320616C726561647920617661BE +:107E0000696C61626C65000043616E277420636F6A +:107E10006E74696E75652078666572206F6E206974 +:107E20006E61637469766520657020256420257312 +:107E3000000000006F7574006038001010380010EA +:107E4000103800105838001010380010103800108A +:107E500010380010103800101038001010380010C2 +:107E6000103800105038001010380010483800103A +:107E7000103800101038001040380010143B00106B +:107E8000763800100E3B001076380010F83A0010DB +:107E900076380010763800107638001076380010EA +:107EA00076380010763800107638001068380010E8 +:107EB00076380010763800107638001076380010CA +:107EC00076380010683800109C3B0010CA3700104C +:107ED000CA370010CA370010CA370010CA3700105E +:107EE000CA370010CA370010CA370010CA3700104E +:107EF000CA370010CA370010CA370010CA3700103E +:107F0000CA370010CA370010CA370010CA3700102D +:107F1000CA370010CA370010CA370010CA3700101D +:107F2000CA370010CA370010CA370010CA3700100D +:107F3000CA370010CA370010CA370010CA370010FD +:107F4000CA370010CA370010283B0010683B0010E9 +:107F5000283B0010CA370010CA370010CA3700107B +:107F6000CA370010CA370010CA370010CA370010CD +:107F7000CA370010CA370010CA370010CA370010BD +:107F8000CA370010CA370010CA370010CA370010AD +:107F9000CA3700103C3D0010CA370010CA37001025 +:107FA000CA370010CA370010CA370010CA3700108D +:107FB000CA370010CA370010CA3700103C3D001005 +:107FC000AE3B00103C3D0010283B0010683B001009 +:107FD000283B001000000000000000000000F03FFF +:107FE0000000000000002440000000000000594094 +:107FF0000000000000408F40000000000088C340E7 +:1080000000000000006AF8400000000080842E415B +:1080100000000000D01263410000000084D79741A7 +:108020000000000065CDCD4106005250D3F07542EE +:108030002C7D001006005250E182887F347D0010B4 +:1080400006005250BBFF3CB64C7D00100D0A0000EC +:108050000600525053B4F4A1807D00100800525025 +:1080600092000000F5560010F95600100557001058 +:10807000315700102D57001000000000060052502C +:1080800053B4F4A1947D001000000000A87D0010FE +:10809000B87D0010501D0020C07D0010CC7D001068 +:1080A00009025400030100807D080B000202020057 +:1080B000000904000001020200040524002001055B +:1080C00024010001042402020524060001070581A1 +:1080D0000308001009040100020A0000000705025D +:1080E000024000000705820240000009040200006F +:1080F000FF00010512010002EF0201408A2E0A0072 +:10810000000101020301000044620010DE63001060 +:108110009263001044620010746300105C630010EE +:10812000E46200109262001086620010FA6600108D +:10813000E0660010906400100E670010906400105C +:10814000C8660010B466001090640010A0660010AD +:108150007666001090640010926700107667001039 +:108160006A67001090640010906400104C67001063 +:108170007667001090640010906400109064001006 +:1081800090640010906400109064001090640010DF +:1081900028670010A16F00101D70001049700010BA +:0C81A0002D710010117200100000000092 +:1081AC0028800010348000108802001040800010DD +:1081BC0094020010A0020010AC0200105C800010B1 +:0881CC00508000107C800010BF +:1081D40003000068EFF3108C72B60268002AFCD02A +:1081E400BFF35F8F04229A56002A04DB002900D0D3 +:1081F4000A60002004E0D0220120120612681A71DD +:108204001B68BFF35F8F00221A608CF310887047DD +:10821400F0B5C646150000B504001E000268EFF371 +:10822400108172B61368002BFCD0BFF35F8F042358 +:10823400E356002B2DDB2268BFF35F8F0020106014 +:1082440081F31088D0221206127852B290469A42D4 +:1082540003D1002080BCB846F0BD00270BE02368A2 +:10826400BFF35F8F1F6081F310882800310000F096 +:1082740073FE0028EDD12268EFF3108172B6136803 +:10828400002BFCD0BFF35F8F23797F2BE7D94346C4 +:1082940002E0D0231B061B6823712368BFF35F8FA2 +:1082A40000221A6081F310880120D3E7F0B5C64696 +:1082B40000B50D00040000F05FFEFA2206000F0076 +:1082C400002328000021920000F06EFE802336185F +:1082D4004F411B069F4202D30126174F7642D023FB +:1082E4001B061B68002598460BE02368BFF35F8FCD +:1082F4001D6081F310883000390000F02DFE002845 +:1083040018D12268EFF3108172B61368002BFCD0E9 +:10831400BFF35F8F23797F2BE7D94346237123680B +:10832400BFF35F8F00221A6081F31088012080BCA4 +:10833400B846F0BD0020FAE7FFFFFF7F0268EFF3C5 +:10834400108172B61368002BFCD0BFF35F8FFF233C +:1083540003710368BFF35F8F00221A6081F31088F2 +:1083640040BF704710B5084C2378002B0AD18023F6 +:10837400064807495B051A68C25004338B42FAD198 +:108384000123237010BDC046631D00204417001054 +:108394000001001010B5014B984710BD451700208F +:1083A400034B1A68C0239B009343024A136070472F +:1083B4000C8001400C900140054B1A6880239B00FF +:1083C4005340C02292001340024A13607047C046D3 +:1083D4000C8001400C9001401423F0B5D6464F4662 +:1083E40046469A46814618880433C0B598460E001E +:1083F4001B882649140098475346070018884346AB +:1084040023491B8898475346050018884346214949 +:108414001B8898478046FFF7A5FFB847A847FFF792 +:10842400CBFF221E20D0C02108270220490511E0DD +:10843400002C14D0131B0D2B20D9002D0AD023009F +:10844400002A05D00B6E013A337013000136234322 +:10845400002B09D03D008B6A1D401842E8D1002D45 +:10846400EDD123001343F5D1FFF79AFFC047FFF77F +:1084740091FFE0BCBA46B146A846F0BD4B461B7816 +:10848400013C0B6601239C46E144E8E749460000B1 +:1084940045580000464300000022154B10B59A6071 +:1084A400DA601A615A619A61DA611A625A629A62EE +:1084B400DA621A635A639A63DA631A645A649A64CE +:1084C400DA641A655A659A65DA651A665A669A66AE +:1084D400DA661A675A679A67DA67F03292000021FF +:1084E400044800F051FD044B044A1A6010BDC04614 +:1084F400000010500C190020EC1C002080011050CA +:10850400F0B557464E464546DE46E0B5254B0025B8 +:108514009F6D012687B0002F23D0234B994601235A +:108524009B46224B984601E0202D1AD032002C00A5 +:108534000135B2463A40EDB27600002AF4D04B46FB +:1085440052469A655B46640864002B40E418640153 +:108554004444200000F0B8FB002809D153469F434F +:10856400E2D107B0F0BCBB46B246A946A046F0BD76 +:10857400E28AA37802A80192002106220630009321 +:1085840000F002FDE02302A9DB008B80009B019A2E +:108594000B7203A80121059200F0BEFB200000F03D +:1085A4002BFBDBE70000115000301150CC180020E9 +:1085B4009823C84AF0B5D55880232C009B02102676 +:1085C40085B01C401D427AD0C34BC44C9A6AC44B3C +:1085D40000261A603B23E35C022B00D1DFE07B23FF +:1085E400E35C022B00D1B9E1BB23E35C022B00D195 +:1085F400A9E1FB23E35C022B00D199E13C23FF3387 +:10860400E35C022B00D158E17C23FF33E35C022BB3 +:1086140000D145E1BC23FF33E35C022B00D132E1FE +:10862400FC23FF33E35C022B00D11FE1AD4BE35C81 +:10863400022B00D10EE1AC4BE35C022B00D1FDE038 +:10864400AA4BE35C022B00D1ECE0A94BE35C022BC8 +:1086540000D1DBE0A74BE35C022B00D1CAE0A64BC0 +:10866400E35C022B00D1ABE0A44BE35C022B00D112 +:108674007FE1A34BE35C022B00D196E1002E08D1ED +:10868400A04B1B78002B04D180219F4A9033890290 +:10869400D150904B0A229C6C6B460021981D00F02F +:1086A40073FCC023640501AE9B00640D338030006D +:1086B40002940121802400F02FFB944EA402EB06C7 +:1086C40069D480235B021D4214D0012223211C4360 +:1086D400824B5A54DA70C0238D4ADB00019302ABFB +:1086E40003CA03C3012101A800F016FB8022864BB4 +:1086F40092021A6580235B011D4233D18023DB0182 +:108704001D421CD180231B021D4204D1AC4200D067 +:10871400C8E105B0F0BD1C436B460A220021981D38 +:1087240000F032FCA02301AEDB00338001213000D5 +:1087340000F0F2FA8022744B12011A65E6E71C433A +:108744006B460A220021981D00F01EFC802301AE16 +:10875400DB0033800121300000F0DEFA10226A4B86 +:108764001A65CFE700221C435A4B01AE1A60FFF78B +:1087740093FE6B460A220021981D00F005FC80231D +:108784005B0033800121300000F0C6FA80225E4B8A +:1087940012031A65B2E7FFF7B3FE340091E73833EA +:1087A400E65C002E00D11AE70233E25C002A00D115 +:1087B40015E7200000222030E25400F04FFA0EE7C3 +:1087C400544BE75C002F00D14EE70233E25C002AF1 +:1087D40000D060E1494BE35C022B00D1DBE0484B65 +:1087E400E35C022B00D054E74B4BE35C002B00D03E +:1087F400E0E04EE7494BE75C002F00D12FE702335E +:10880400E25C002A00D03EE13E0028E7444BE75CEE +:10881400002F00D11EE70233E25C002A00D02AE1D7 +:108824003E0017E73F4BE75C002F00D10DE7023312 +:10883400E25C002A00D016E13E0006E73A4BE75C12 +:10884400002F00D1FCE60233E25C002A00D002E1F2 +:108854003E00F5E6354BE75C002F00D1EBE6023332 +:10886400E25C002A00D0EEE03E00E4E6F933FF3398 +:10887400E75C002F00D1D9E60233E25C002A00D085 +:10888400D8E03E00D2E6B933FF33E75C002F00D1D5 +:10889400C6E60233E25C002A00D0C2E03E00BFE636 +:1088A4007933FF33E75C002F00D1B3E60233E25C97 +:1088B400002A00D0ACE03E00ACE63933FF33E75C7D +:1088C400002F00D1A0E60233E25C002A00D096E03B +:1088D4003E0099E60000115000400540CC180020ED +:1088E400C41800203B0200007B020000BB02000011 +:1088F400FB0200003B0300007B030000BB030000FD +:10890400FB030000621D0020003011501000020023 +:10891400000010507A030000FA0300003A0300003C +:10892400FA020000BA0200007A0200003A020000D3 +:10893400F833E75C002F00D160E60233E25C002AE2 +:1089440055D13E005AE6B833E75C002F00D150E61B +:108954000233E25C002A42D13E004AE67833E75C07 +:10896400002F00D140E60233E25C002A2FD13E0002 +:108974003AE64F4BE35C002B00D17AE6EF239B00F1 +:10898400E25C002A00D12AE70022E2541C3BE018F2 +:1089940000F064F923E7464BE35C002BEED1454B32 +:1089A400E35C022B00D074E63E00434BE35C002BF7 +:1089B40000D163E6FF239B00E25C002A00D168E655 +:1089C4000022E2541C3BE01800F048F961E6200064 +:1089D40000226030E2543E0000F040F904E620003A +:1089E4000022A030E2543E0000F038F901E62000F5 +:1089F4000022E030E2543E0000F030F9FEE52000B1 +:108A040000222130FF30E2543E0000F027F9FBE55C +:108A1400200000226130FF30E2543E0000F01EF9D5 +:108A2400F8E520000022A130FF30E2543E0000F0BF +:108A340015F9F5E520000022E130FF30E2543E0054 +:108A440000F00CF9F2E50022E2541C3BE01800F0BF +:108A540005F93E00EFE50022E2541C3BE01800F06B +:108A6400FDF83E00ECE50022E2541C3BE01800F067 +:108A7400F5F83E00E9E50022E2541C3BE01800F062 +:108A8400EDF83E00E6E50022E2541C3BE01800F05D +:108A9400E5F83E00E3E50022E2541C3BE01800F058 +:108AA400DDF897E621000548694000F075FAC046F4 +:108AB400BA030000FB030000FA030000D47D001099 +:108AC400084A0300126C0020920703D49A78D20952 +:108AD400012A00D07047D87E023843425841C0B2C0 +:108AE400F8E7C0460000115010B5FFF7E9FF002871 +:108AF4000CD00749074B8C46074A9B6A12686344AB +:108B04009B1A0020C6229A424041C0B210BDC04602 +:108B1400E0FCFFFF00400540C4180020F8B5028BBC +:108B2400838A04000F00161C9A4200D91E1CE278A6 +:108B340080211500681E8541B6B2C90031436D031A +:108B44000D4301214A409B1BE27062789BB2A382D1 +:108B5400002A09D0002B02D18023DB011D43002F02 +:108B640000D02D042800F8BDE068BB01C018320015 +:108B7400216900F0F9F923699B19236180231B0201 +:108B84001D43A38AE6E7C046836870B504001D68E8 +:108B9400002900D02D0C6378AD05AD0D002B09D153 +:108BA400E38AEB18E382238BAB4201D90023A3822F +:108BB400280070BDE368890159182A00206900F073 +:108BC400D3F9E38AEB18E38223695B192361EAE7AB +:108BD40010B50400836800211B68FFF7D5FF6368A4 +:108BE4001B685B0002D5238B834200D010BD01219A +:108BF4002000FFF7C9FFF9E700238376436103618F +:108C04007047C04610B58368002901D01C68214014 +:108C1400002A11D08024E400114322420CD01A68A7 +:108C240022420BD10A4A0A401A60FFE7FFE7FFE736 +:108C3400FFE7FFE7FFE78368196010BD81787F20B5 +:108C4400CA09044B92000140D258034800F0A4F929 +:108C5400FFFBFFFF700F0020E87D0010436870B534 +:108C6400002180251E680400FFF758FF134B6D0197 +:108C74001B6C05439B070FD5A3785B060FD0104BE5 +:108C84001E4080239B05334362680021136020004B +:108C94002A00FFF7B7FF70BDA378DB09EFD0A38AE2 +:108CA400002BECD001212000FFF738FFA023054A58 +:108CB400DB05324005431343E6E7C046000011508C +:108CC400FFFFFFAFFFFFFFDF70B5857E0400002DBF +:108CD40014D0FFF77DFFA38A002B01D1280070BDBB +:108CE4002000FFF701FF002803D00123002523778C +:108CF400F4E72000FFF7B2FF0025EFE781787F203B +:108D0400CA09034B92000140D258024800F044F9CA +:108D1400700F0020087E0010F0B5C64600B54378F9 +:108D2400050084B0042B00D178E047D8022B00D191 +:108D340086E0032B56D14E4F4E4A002490463B7892 +:108D44004D4E03E00134E4B29C4216D8002EF9D013 +:108D54009C42F7D24146620009681219D2008A186F +:108D6400002AEFD05269002AECD06968287890472D +:108D740001343B78E4B29C42E8D9404B1A7852075C +:108D840048D504211A788A431A706B460A220021B6 +:108D9400981D00F0F9F86A462B7813710523537176 +:108DA400374B1C686269EFF3108172B61368002BAD +:108DB400FCD0BFF35F8FA16101A920E0052B11D185 +:108DC4002E4B1A78D20725D504211A788A431A70B3 +:108DD4002B4B1C686269EFF3108172B61368002B89 +:108DE40009D1FBE7264B1C686269EFF3108172B668 +:108DF4001368002BFCD0BFF35F8FA1612900200012 +:108E040000F0A2F86269A369BFF35F8F00211160CB +:108E140083F3108804B080BCB846F0BD174B1A78B1 +:108E2400D207F7D504211A780A431A70144B1C6828 +:108E34006269EFF3108172B61368002BDBD1FBE794 +:108E440001200E4A1178814311701178994300234F +:108E540011700421537013788B431370084B1C68F2 +:108E64006269EFF3108172B61368002BC3D1FBE77C +:108E7400611D0020F01200209157001018160020E8 +:108E840070160020F0B506001C0018001D00042315 +:108E9400CE4647469C46023B994680B500281CD0E6 +:108EA400002C07D1002D18D06346F7683B4218D137 +:108EB400002CF9D088464B46F7683B4218D027006F +:108EC4000837AF4214D943461F78013CB7600131DB +:108ED4002700002DE8D1002FE2D1C0BCB946B0462E +:108EE400F0BDB768013D17702F0001322743F2E748 +:108EF400002DE0D0D8E7C04630B50400101E0AD0DB +:108F04000A000D180221E3681942FCD013780132DB +:108F1400A3609542F7D1E3685B0704D50421A368F5 +:108F2400E3681942FBD11021E3681942FCD1E368DC +:108F34005B0704D50421A368E3681942FBD101232C +:108F4400236230BD7047C04601B40248844601BC68 +:108F5400604700BFF176001001B40248844601BCAA +:108F6400604700BFC51D001001B40248844601BC1F +:108F7400604700BF7551001001B40248844601BC2B +:108F8400604700BF651F001001B40248844601BC5D +:108F9400604700BF6951001001B40248844601BC17 +:108FA400604700BF092C001001B40248844601BC8C +:108FB400604700BF95500010100000000000000042 +:108FC400000001000000000000000000000002009A +:108FD400000000000000000000000300000000008A +:108FE400000000000000FF000000000001B5486818 +:108FF40001318E460047704609380149884701BD52 +:109004000D1600100C0F002000000000E80F0020D7 +:10901400581800200000000000000000681800201C +:10902400000000000000000010000000000000002C +:10903400503300004C33000054330000523300001E +:109044004D5300004D4300005334000043340000EE +:109054001D55001000000000695500102156001035 +:109064000000000000010000D958001000000000BA +:1090740049580010D1570010000000000001000002 +:10908400347E0010707D00107416002010000C0057 +:1090940000000000000000000000000000000000CC +:1090A40000000000FF0000000000000000000000BD +:1090B40059510010A14300109D4A0010C9500010DE +:0C90C400E5020010B10300100D5C00106C :04000005100001E9FD :00000001FF diff --git a/Code/BITS/BITSv5/test/build/test.uf2 b/Code/BITS/BITSv5/test/build/test.uf2 index 0537b82882c32dc70d51a9ef13f71c364bcb6d78..7dbddded068e5b2f5714d740ef73cde3a16032a0 100644 GIT binary patch delta 12677 zcmbU{3s_Xux@+wj1{fZ00da&G+%p>i0hO0ZYBtW`<}qaCBQ>qSM-5^&J~AqjQOO9+ zkY$EwC$q;f@OFu$(={ow$FYu`GnjR?(nDHe*<+uw24)84{%iIOv+103zwchYZ?X1T z>wm9*{p(+AjlEuJe^1${!FygE=f!vr8OQuxb#yCY&u)Efh)MAEC}-B5g`RGNxD%rg z=V(MMLQ0Mn-!}{2w7{ROFuX`9zSNHj5eoYO^+K1U8*tX@5Eqq!*l-16aVBCH--eJ1 z%`ausRyaXG(*L@;@=^wIO8!uH6H~ zZ}aZ_TGS%0yausi=VyW-+#+;$?r0AYUHy&}#36C>5ay?;Hm=ZFu)al5@Y<4PrZNGE zS6zr#5Qbn9mWzne5IQqdPx~(p##zQD?-$}MaW^*$YYWn?6H$>6B7V@XuQoz`vL74t zh~dj>0r-*|r@A=4+KzB8Z+oBui(Ze5`%?w9MVCi8wYTpq2xpA`+c+vj z*oE|%!=l}T4L4M-wEo4I07CrO*DauKMXk}+sYHB*@&KN&vI6m8=(+Ms<ju4X&(I7C&QD7Im%&6<51B zWb5h{>~%>9m>9**4}?%Kp$f5)5ytM0(Q3qe*b%N&nAH*H7*(u!TRSF_NpK8_Qb!D% zrAlyc`?XK=*pOElVM8jj^|DX=*Q_YD#kdVj76%4c0+&wwy|^yY&Y2iE*5e_r+?OnxqB)kvqS_v z1&i%&haMZISB9%BR=3X_MnNh5I)DsQElP3SfKr^|S|jY>9eQHJ26P-Z1|eUwX87c4 z@XO_JF>R$nvw%`1!zC9@vEe*wE^0Uqq`5&dT&>T&0+zeaJ<@VPXN$M&H-(&+%oGP^ z+SC^dJz?kQ{|JBoXy~{0Nid_}dqrQg1-I@IsEL>NMMBR~>Ym@eF!if%yC zH`)7N&iU_iUT@G-qJy4dFZgB>il|Dwf2-H~&ih`k(X((|)qMzwoe|nlw7p%CebeWI ze5K%+5V3wYkCRK*&!}XwC#fQARn`=kx+J64G|*!}Z(7HJfm(fw@n%<*P$^ur;a1Em zvgz_Gg`PFg7m}mMzGwq4tA%+qxgufc)qyvym^)}h`nBL%-?``<<@@I7UEdrj+QqJ= z9q|*pF2wV1N~_PeFi0nb1I%p{eta^Rnrz_YHA6Dci$ZXv8sGCWhSr}tl9x} za+NS&P`sS5u@F`}GOR6t)di~-^Lk_g)p7^s!2iSjZQw`Gf*;Y{>5Bmek5kht6IDyC zvr&&R+Bgc_l&?i1Trev1bpr=R}mpoO%Gy3r|8t0*BBvl9W>>B~|XXtrS|A(z zqE*RLSvo!W(DpiC9I^<-!bL6nxk6uTQq~%1=gmWiPeb9w;U$Q8onH>k5oqs*!D3h} zKU|2{U-K^(Whla41wsmjuIlaW;8PR!Yh!rmPG-QXCaM1YN`9=rN)bAebk0?@!SH1E@t{?dQBG0Nf9=CVUr7rDz z7lnDkTw$@$+xaMLaoZmZK|6�%SQbeIf1Qi8qA~;bq|v>^f~Wi*U`xv|ZHVTEi}g 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 QX@RB0fFG3_mcJMEKQ)9H@&Et; diff --git a/Code/BITS/BITSv5/test/test.c b/Code/BITS/BITSv5/test/test.c deleted file mode 100644 index 93fd3427..00000000 --- a/Code/BITS/BITSv5/test/test.c +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include - -#include "hardware/flash.h" -#include "hardware/gpio.h" -#include "pico/binary_info.h" -#include "pico/stdlib.h" - -// Define the correct flash size for BITSv5 (16MB) -#undef PICO_FLASH_SIZE_BYTES -#define PICO_FLASH_SIZE_BYTES (16 * 1024 * 1024) - -// Flash-based address of the last sector -#define FLASH_TARGET_OFFSET (PICO_FLASH_SIZE_BYTES - FLASH_SECTOR_SIZE) - -// For the functionality of a BITSv5 board -// NOT FLIGHT CODE -int main() { - stdio_init_all(); - - // set init GPIO0 and set as output - gpio_init(0); - gpio_set_dir(0, GPIO_OUT); - - int *p, addr, value; - - // Compute the memory-mapped address, remembering to include the offset - // for RAM (XIP_BASE) - addr = XIP_BASE + FLASH_TARGET_OFFSET; - p = (int *)addr; // Place an int pointer at our memory-mapped address - - while (true) { - value = *p; // Store the value at this address for later use - - printf("Value at %X is %X\n", p, value); - printf("Hello, BITS!\n"); - gpio_put(0, true); - sleep_ms(1000); - gpio_put(0, false); - sleep_ms(1000); - p++; - } -} \ No newline at end of file diff --git a/Code/BITS/BITSv5/test/test.cpp b/Code/BITS/BITSv5/test/test.cpp new file mode 100644 index 00000000..8d6ece69 --- /dev/null +++ b/Code/BITS/BITSv5/test/test.cpp @@ -0,0 +1,87 @@ +#include +#include +#include + +#include "SX126x.h" +#include "hardware/flash.h" +#include "hardware/gpio.h" +#include "pico/binary_info.h" +#include "pico/stdlib.h" + +#define RF_FREQUENCY 433000000 // Hz center frequency +#define TX_OUTPUT_POWER 22 // dBm tx output power +#define LORA_BANDWIDTH \ + 4 // bandwidth=125khz 0:250kHZ,1:125kHZ,2:62kHZ,3:20kHZ.... look for radio + // line 392 +#define LORA_SPREADING_FACTOR 7 // spreading factor=11 [SF5..SF12] +#define LORA_CODINGRATE \ + 1 // [1: 4/5, + // 2: 4/6, + // 3: 4/7, + // 4: 4/8] + +#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx +#define LORA_SYMBOL_TIMEOUT 0 // Symbols +#define LORA_FIX_LENGTH_PAYLOAD_ON false // variable data payload +#define LORA_IQ_INVERSION_ON false +#define LORA_PAYLOADLENGTH \ + 0 // 0: variable receive length + // 1..255 payloadlength + +SX126x lora(25, // Port-Pin Output: SPI select + 23, // Port-Pin Output: Reset + 11, // Port-Pin Input: Busy + 10 // Port-Pin Input: Interrupt DIO1 +); + +// Define the correct flash size for BITSv5 (16MB) +#undef PICO_FLASH_SIZE_BYTES +#define PICO_FLASH_SIZE_BYTES (16 * 1024 * 1024) + +// Flash-based address of the last sector +#define FLASH_TARGET_OFFSET (PICO_FLASH_SIZE_BYTES - FLASH_SECTOR_SIZE) + +// For the functionality of a BITSv5 board +// NOT FLIGHT CODE +int main() { + stdio_init_all(); + + // set init GPIO0 and set as output + gpio_init(0); + gpio_set_dir(0, GPIO_OUT); + + int *p, addr, value; + + // Compute the memory-mapped address, remembering to include the offset + // for RAM (XIP_BASE) + addr = XIP_BASE + FLASH_TARGET_OFFSET; + p = (int *)addr; // Place an int pointer at our memory-mapped address + + lora.begin( + SX126X_PACKET_TYPE_LORA, // LoRa or FSK, FSK currently not supported + 433000000, // frequency in Hz + -3); // tx power in dBm + + lora.LoRaConfig(LORA_SPREADING_FACTOR, LORA_BANDWIDTH, LORA_CODINGRATE, + LORA_PREAMBLE_LENGTH, LORA_PAYLOADLENGTH, + false, // crcOn + false); // invertIrq + + uint8_t i; + + while (true) { + value = *p; // Store the value at this address for later use + + printf("Value at %X is %X\n", p, value); + printf("Hello, BITS! Transmitting %d\n", i); + + lora.Send(&i, 1, SX126x_TXMODE_SYNC); + i++; + + gpio_put(0, true); + sleep_ms(1000); + gpio_put(0, false); + sleep_ms(1000); + p++; + } +} \ No newline at end of file