From f39371538f31dcedc978a24178987c787ad65d62 Mon Sep 17 00:00:00 2001 From: Theo Hill Date: Wed, 10 Jul 2024 02:22:08 -0700 Subject: [PATCH] Prune legacy code -150k loc. Moving from OreSat0 to OreSat0.5 saw significant hardware changes that until this point hadn't been reflected in this repo. This commit removes support for the no longer used hardware, including old boards, drivers for no longer used devices, and STM32F4/L4 microcontrollers entirely. Of note: - The archive is gone. Its contents, like the rest of the removals here can be accessed in git history. - The C3 is now Linux based. Removing the old project means we can drop our custom ChibiOS patches, and also external dependencies on littlefs and OpenCCSDS. - I tried to keep modified files to a minimum but do note sensors.h, can_hw.h, and the app_adcs Makefile. --- .github/workflows/tests.yaml | 18 - .gitmodules | 6 - CONTRIBUTING.md | 3 - Makefile | 2 - README.md | 4 - boards/BATTERY_V1/board.c | 267 - boards/BATTERY_V1/board.h | 973 --- boards/BATTERY_V1/board.mk | 9 - boards/BATTERY_V1/gdboocd.cmd | 2 - boards/BATTERY_V1/oocd.cfg | 9 - boards/BATTERY_V2/board.c | 266 - boards/BATTERY_V2/board.h | 973 --- boards/BATTERY_V2/board.mk | 9 - boards/BATTERY_V2/gdboocd.cmd | 2 - boards/BATTERY_V2/oocd.cfg | 9 - boards/BOARD_TEMPLATE_F4/board.c | 267 - boards/BOARD_TEMPLATE_F4/board.h | 1197 --- boards/BOARD_TEMPLATE_F4/board.mk | 9 - boards/BOARD_TEMPLATE_F4/gdboocd.cmd | 2 - boards/BOARD_TEMPLATE_F4/oocd.cfg | 9 - boards/BOARD_TEMPLATE_L4/board.c | 282 - boards/BOARD_TEMPLATE_L4/board.h | 1452 ---- boards/BOARD_TEMPLATE_L4/board.mk | 9 - boards/BOARD_TEMPLATE_L4/gdboocd.cmd | 2 - boards/BOARD_TEMPLATE_L4/oocd.cfg | 9 - boards/ORESAT_ACS_V4/board.c | 267 - boards/ORESAT_ACS_V4/board.h | 967 --- boards/ORESAT_ACS_V4/board.mk | 9 - boards/ORESAT_ACS_V4/gdboocd.cmd | 2 - boards/ORESAT_ACS_V4/oocd.cfg | 9 - boards/ORESAT_C3_V1/board.c | 267 - boards/ORESAT_C3_V1/board.h | 1346 ---- boards/ORESAT_C3_V1/board.mk | 9 - boards/ORESAT_C3_V1/gdboocd.cmd | 2 - boards/ORESAT_C3_V1/oocd.cfg | 9 - boards/ORESAT_C3_V3/board.c | 267 - boards/ORESAT_C3_V3/board.h | 1217 --- boards/ORESAT_C3_V3/board.mk | 9 - boards/ORESAT_C3_V3/gdboocd.cmd | 2 - boards/ORESAT_C3_V3/oocd.cfg | 9 - boards/ORESAT_C3_V4/board.c | 267 - boards/ORESAT_C3_V4/board.h | 1355 ---- boards/ORESAT_C3_V4/board.mk | 9 - boards/ORESAT_C3_V4/gdboocd.cmd | 2 - boards/ORESAT_C3_V4/oocd.cfg | 9 - boards/ORESAT_C3_V5/board.c | 267 - boards/ORESAT_C3_V5/board.h | 1355 ---- boards/ORESAT_C3_V5/board.mk | 9 - boards/ORESAT_C3_V5/gdboocd.cmd | 2 - boards/ORESAT_C3_V5/oocd.cfg | 9 - boards/ORESAT_RWB_V1_1/board.c | 267 - boards/ORESAT_RWB_V1_1/board.h | 927 --- boards/ORESAT_RWB_V1_1/board.mk | 9 - boards/ORESAT_RWB_V1_1/gdboocd.cmd | 2 - boards/ORESAT_RWB_V1_1/oocd.cfg | 9 - boards/ORESAT_RWB_V3/board.c | 267 - boards/ORESAT_RWB_V3/board.h | 925 --- boards/ORESAT_RWB_V3/board.mk | 9 - boards/ORESAT_RWB_V3/gdboocd.cmd | 2 - boards/ORESAT_RWB_V3/oocd.cfg | 9 - boards/ORESAT_RWB_V4/board.c | 282 - boards/ORESAT_RWB_V4/board.h | 1466 ---- boards/ORESAT_RWB_V4/board.mk | 9 - boards/ORESAT_RWB_V4/gdboocd.cmd | 2 - boards/ORESAT_RWB_V4/oocd.cfg | 9 - boards/PROTOCARD_V1_1/board.c | 267 - boards/PROTOCARD_V1_1/board.h | 934 --- boards/PROTOCARD_V1_1/board.mk | 9 - boards/PROTOCARD_V1_1/gdboocd.cmd | 2 - boards/PROTOCARD_V1_1/oocd.cfg | 9 - boards/PROTOCARD_V2/board.c | 267 - boards/PROTOCARD_V2/board.h | 934 --- boards/PROTOCARD_V2/board.mk | 9 - boards/PROTOCARD_V2/gdboocd.cmd | 2 - boards/PROTOCARD_V2/oocd.cfg | 9 - boards/PROTOCARD_V3/board.c | 267 - boards/PROTOCARD_V3/board.h | 958 --- boards/PROTOCARD_V3/board.mk | 9 - boards/PROTOCARD_V3/gdboocd.cmd | 2 - boards/PROTOCARD_V3/oocd.cfg | 9 - boards/README.md | 0 boards/SOLAR_V1/board.c | 267 - boards/SOLAR_V1/board.h | 926 --- boards/SOLAR_V1/board.mk | 9 - boards/SOLAR_V1/gdboocd.cmd | 2 - boards/SOLAR_V1/oocd.cfg | 9 - boards/SOLAR_V2/board.c | 267 - boards/SOLAR_V2/board.h | 961 --- boards/SOLAR_V2/board.mk | 9 - boards/SOLAR_V2/gdboocd.cmd | 2 - boards/SOLAR_V2/oocd.cfg | 9 - boards/SOLAR_V3/board.c | 267 - boards/SOLAR_V3/board.h | 962 --- boards/SOLAR_V3/board.mk | 9 - boards/SOLAR_V3/gdboocd.cmd | 2 - boards/SOLAR_V3/oocd.cfg | 9 - boards/SOLAR_V4/board.c | 267 - boards/SOLAR_V4/board.h | 961 --- boards/SOLAR_V4/board.mk | 9 - boards/SOLAR_V4/gdboocd.cmd | 2 - boards/SOLAR_V4/oocd.cfg | 9 - boards/ST_NUCLEO144_F439ZI/board.c | 267 - boards/ST_NUCLEO144_F439ZI/board.h | 1201 --- boards/ST_NUCLEO144_F439ZI/board.mk | 9 - boards/ST_NUCLEO144_F439ZI/gdboocd.cmd | 2 - boards/ST_NUCLEO144_F439ZI/oocd.cfg | 9 - boards/ST_NUCLEO32_F042K6/board.c | 267 - boards/ST_NUCLEO32_F042K6/board.h | 966 --- boards/ST_NUCLEO32_F042K6/board.mk | 9 - boards/ST_NUCLEO32_F042K6/gdboocd.cmd | 2 - boards/ST_NUCLEO32_F042K6/oocd.cfg | 9 - boards/ST_NUCLEO64_F446RE/board.c | 267 - boards/ST_NUCLEO64_F446RE/board.h | 1344 ---- boards/ST_NUCLEO64_F446RE/board.mk | 9 - boards/ST_NUCLEO64_F446RE/gdboocd.cmd | 2 - boards/ST_NUCLEO64_F446RE/oocd.cfg | 9 - boards/ST_NUCLEO64_L452RE_P/board.c | 282 - boards/ST_NUCLEO64_L452RE_P/board.h | 1555 ---- boards/ST_NUCLEO64_L452RE_P/board.mk | 9 - boards/ST_NUCLEO64_L452RE_P/gdboocd.cmd | 2 - boards/ST_NUCLEO64_L452RE_P/oocd.cfg | 9 - common/README.md | 1 - common/aprs.c | 35 - common/aprs.mk | 10 - common/ax25.c | 56 - common/ax5043.c | 1365 ---- common/ax5043.mk | 9 - common/bootloader.mk | 7 - common/can_bootloader.c | 942 --- common/can_hw.c | 3 - common/fram.c | 297 - common/fram.mk | 9 - common/fs.c | 1333 ---- common/fs.mk | 16 - common/include/README.md | 1 - common/include/aprs.h | 58 - common/include/ax25.h | 166 - common/include/ax5043.h | 2923 -------- common/include/can_bootloader.h | 86 - common/include/can_hw.h | 6 - common/include/fram.h | 201 - common/include/fs.h | 191 - common/include/lfs_util_custom.h | 222 - common/include/max580x.h | 310 - common/include/max7310.h | 283 - common/include/mmc5883ma.h | 426 -- common/include/morse.h | 24 - common/include/node_mgr.h | 29 - common/include/opd.h | 72 - common/include/oresat_f0.h | 2 +- common/include/radio.h | 88 - common/include/rtc.h | 71 - common/include/sensors.h | 46 - common/include/si41xx.h | 390 - common/lfs_util.c | 26 - common/max580x.c | 369 - common/max580x.mk | 9 - common/max7310.c | 368 - common/max7310.mk | 9 - common/mmc5883ma.c | 353 - common/mmc5883ma.mk | 9 - common/morse.c | 169 - common/node_mgr.c | 133 - common/node_mgr.mk | 12 - common/opd.c | 312 - common/opd.mk | 12 - common/radio.c | 121 - common/radio.mk | 17 - common/rtc.c | 291 - common/rtc.mk | 12 - common/si41xx.c | 482 -- common/si41xx.mk | 9 - ext/OpenCCSDS | 1 - ext/littlefs | 1 - ld/STM32F439xI.ld | 86 - ld/STM32F446xE.ld | 86 - ld/STM32L452xE.ld | 85 - profiles/oresat_battery.xpd | 318 - profiles/oresat_node.xpd | 6537 ----------------- profiles/oresat_solar.xpd | 271 - src/archive/app_acs_bldc_f0/Makefile | 205 - src/archive/app_acs_bldc_f0/README.md | 17 - src/archive/app_acs_bldc_f0/cfg/chconf.h | 714 -- src/archive/app_acs_bldc_f0/cfg/halconf.h | 531 -- src/archive/app_acs_bldc_f0/cfg/mcuconf.h | 187 - src/archive/app_acs_bldc_f0/main.c | 86 - .../app_acs_bldc_f0/scratch/acs_sinlut.c | 255 - .../app_acs_bldc_f0/scratch/acs_sinlut.h | 56 - src/archive/app_acs_bldc_f0/source/README.md | 5 - src/archive/app_acs_bldc_f0/source/acs_bldc.c | 221 - src/archive/app_acs_bldc_f0/source/acs_bldc.h | 43 - src/archive/app_acs_bldc_f4/Makefile | 205 - src/archive/app_acs_bldc_f4/README.md | 17 - src/archive/app_acs_bldc_f4/cfg/chconf.h | 714 -- src/archive/app_acs_bldc_f4/cfg/halconf.h | 531 -- src/archive/app_acs_bldc_f4/cfg/mcuconf.h | 361 - src/archive/app_acs_bldc_f4/main.c | 91 - src/archive/app_acs_bldc_f4/source/README.md | 5 - src/archive/app_acs_bldc_f4/source/acs_bldc.c | 149 - src/archive/app_acs_bldc_f4/source/acs_bldc.h | 53 - src/archive/app_acs_bldc_f4/source/thread1.c | 16 - src/archive/app_acs_bldc_f4/source/thread1.h | 11 - src/archive/app_ax5043_HDLC_rx/Makefile | 237 - src/archive/app_ax5043_HDLC_rx/README.md | 5 - src/archive/app_ax5043_HDLC_rx/conf/chconf.h | 714 -- src/archive/app_ax5043_HDLC_rx/conf/halconf.h | 517 -- src/archive/app_ax5043_HDLC_rx/conf/mcuconf.h | 361 - src/archive/app_ax5043_HDLC_rx/main.c | 222 - .../app_ax5043_HDLC_rx/source/README.md | 7 - .../app_ax5043_HDLC_rx/source/ax5043.c | 1273 ---- .../app_ax5043_HDLC_rx/source/ax5043.h | 732 -- src/archive/app_ax5043_HDLC_tx/Makefile | 237 - src/archive/app_ax5043_HDLC_tx/README.md | 5 - .../axradiolab_435.5_100.xml | 287 - .../axradiolab_437.5_50.xml | 287 - .../app_ax5043_HDLC_tx/axradiolab_g3ruh.xml | 287 - src/archive/app_ax5043_HDLC_tx/conf/chconf.h | 714 -- src/archive/app_ax5043_HDLC_tx/conf/halconf.h | 517 -- src/archive/app_ax5043_HDLC_tx/conf/mcuconf.h | 361 - src/archive/app_ax5043_HDLC_tx/main.c | 294 - .../app_ax5043_HDLC_tx/source/README.md | 7 - .../app_ax5043_HDLC_tx/source/ax5043.c | 1273 ---- .../app_ax5043_HDLC_tx/source/ax5043.h | 732 -- src/archive/app_ax5043_driver/Makefile | 208 - src/archive/app_ax5043_driver/README.md | 5 - .../Supporting_Py/ax5043_config_str.txt | 280 - .../Supporting_Py/xml_to_csv.py | 36 - .../app_ax5043_driver/cfg/CO_driver_custom.h | 26 - src/archive/app_ax5043_driver/cfg/chconf.h | 763 -- src/archive/app_ax5043_driver/cfg/halconf.h | 531 -- src/archive/app_ax5043_driver/cfg/mcuconf.h | 361 - src/archive/app_ax5043_driver/main.c | 54 - src/archive/app_ax5043_driver/main_ax25_rx.c | 416 -- src/archive/app_ax5043_driver/main_ax25_tx.c | 409 -- src/archive/app_ax5043_driver/main_cw.c | 405 - src/archive/app_ax5043_driver/main_engr_rx.c | 415 -- src/archive/app_ax5043_driver/main_engr_tx.c | 409 -- .../app_ax5043_driver/source/README.md | 7 - src/archive/app_ax5043_driver/source/ax5043.c | 1065 --- src/archive/app_ax5043_driver/source/ax5043.h | 732 -- src/archive/app_ax5043_engr_rx/Makefile | 237 - src/archive/app_ax5043_engr_rx/README.md | 5 - src/archive/app_ax5043_engr_rx/conf/chconf.h | 714 -- src/archive/app_ax5043_engr_rx/conf/halconf.h | 517 -- src/archive/app_ax5043_engr_rx/conf/mcuconf.h | 361 - src/archive/app_ax5043_engr_rx/main.c | 207 - .../app_ax5043_engr_rx/source/README.md | 7 - .../app_ax5043_engr_rx/source/ax5043.c | 1175 --- .../app_ax5043_engr_rx/source/ax5043.h | 732 -- src/archive/app_ax5043_engr_tx/Makefile | 237 - src/archive/app_ax5043_engr_tx/README.md | 5 - src/archive/app_ax5043_engr_tx/conf/chconf.h | 714 -- src/archive/app_ax5043_engr_tx/conf/halconf.h | 517 -- src/archive/app_ax5043_engr_tx/conf/mcuconf.h | 361 - src/archive/app_ax5043_engr_tx/main.c | 204 - .../app_ax5043_engr_tx/source/README.md | 7 - .../app_ax5043_engr_tx/source/ax5043.c | 1171 --- .../app_ax5043_engr_tx/source/ax5043.h | 732 -- src/archive/app_ax5043_engr_tx_clean/Makefile | 237 - .../app_ax5043_engr_tx_clean/README.md | 5 - .../app_ax5043_engr_tx_clean/conf/chconf.h | 714 -- .../app_ax5043_engr_tx_clean/conf/halconf.h | 517 -- .../app_ax5043_engr_tx_clean/conf/mcuconf.h | 361 - src/archive/app_ax5043_engr_tx_clean/main.c | 205 - .../app_ax5043_engr_tx_clean/source/README.md | 7 - .../source/ax5043_common.c | 326 - .../source/ax5043_common.h | 712 -- .../source/ax5043_engr.c | 849 --- .../source/ax5043_engr.h | 34 - .../app_ax5043_engr_tx_full_duplex/Makefile | 237 - .../app_ax5043_engr_tx_full_duplex/README.md | 5 - .../conf/chconf.h | 714 -- .../conf/halconf.h | 517 -- .../conf/mcuconf.h | 361 - .../app_ax5043_engr_tx_full_duplex/main.c | 242 - .../source/README.md | 7 - .../source/ax5043_common.c | 323 - .../source/ax5043_common.h | 712 -- .../source/ax5043_engr_f1.c | 845 --- .../source/ax5043_engr_f1.h | 34 - .../source/ax5043_engr_f2.c | 844 --- .../source/ax5043_engr_f2.h | 34 - .../app_ax5043_g3ruh_ax25_aprs_tx/Makefile | 237 - .../app_ax5043_g3ruh_ax25_aprs_tx/README.md | 7 - .../conf/chconf.h | 714 -- .../conf/halconf.h | 517 -- .../conf/mcuconf.h | 361 - .../app_ax5043_g3ruh_ax25_aprs_tx/main.c | 296 - .../source/README.md | 7 - .../source/ax5043.c | 1187 --- .../source/ax5043.h | 730 -- src/archive/app_ax5043_morse_tx/Makefile | 237 - src/archive/app_ax5043_morse_tx/README.md | 5 - src/archive/app_ax5043_morse_tx/conf/chconf.h | 714 -- .../app_ax5043_morse_tx/conf/halconf.h | 517 -- .../app_ax5043_morse_tx/conf/mcuconf.h | 361 - src/archive/app_ax5043_morse_tx/main.c | 330 - .../app_ax5043_morse_tx/source/README.md | 7 - .../app_ax5043_morse_tx/source/ax5043.c | 1179 --- .../app_ax5043_morse_tx/source/ax5043.h | 730 -- .../app_ax5043_morse_tx/source/morse.c | 183 - .../app_ax5043_morse_tx/source/morse.h | 27 - src/archive/app_can_updater/Makefile | 207 - src/archive/app_can_updater/cfg/chconf.h | 756 -- src/archive/app_can_updater/cfg/halconf.h | 531 -- src/archive/app_can_updater/cfg/mcuconf.h | 352 - src/archive/app_can_updater/main.c | 234 - .../app_can_updater/source/firmware_blob.h | 3625 --------- src/archive/app_oresat_acs-0.1/Makefile | 205 - src/archive/app_oresat_acs-0.1/README.md | 17 - src/archive/app_oresat_acs-0.1/cfg/chconf.h | 714 -- src/archive/app_oresat_acs-0.1/cfg/halconf.h | 531 -- src/archive/app_oresat_acs-0.1/cfg/mcuconf.h | 187 - src/archive/app_oresat_acs-0.1/main.c | 103 - .../app_oresat_acs-0.1/source/README.md | 5 - src/archive/app_oresat_acs-0.1/source/acs.c | 495 -- src/archive/app_oresat_acs-0.1/source/acs.h | 101 - .../app_oresat_acs-0.1/source/acs_lut.h | 54 - src/archive/app_oresat_acs-1.0/Makefile | 205 - src/archive/app_oresat_acs-1.0/README.md | 24 - src/archive/app_oresat_acs-1.0/caniface.sh | 3 - src/archive/app_oresat_acs-1.0/cfg/chconf.h | 714 -- src/archive/app_oresat_acs-1.0/cfg/halconf.h | 531 -- src/archive/app_oresat_acs-1.0/cfg/mcuconf.h | 187 - src/archive/app_oresat_acs-1.0/main.c | 89 - .../app_oresat_acs-1.0/source/README.md | 5 - src/archive/app_oresat_acs-1.0/source/acs.c | 429 -- src/archive/app_oresat_acs-1.0/source/acs.h | 176 - src/archive/app_oresat_acs-1.0/source/bldc.c | 263 - src/archive/app_oresat_acs-1.0/source/bldc.h | 167 - .../app_oresat_acs-1.0/source/magnetorquer.c | 98 - .../app_oresat_acs-1.0/source/magnetorquer.h | 62 - .../app_oresat_acs-1.0/source/saddle_lut.h | 19 - .../app_oresat_acs-1.0/source/sin_lut.h | 54 - src/archive/app_oresat_acs-2.0/Makefile | 205 - src/archive/app_oresat_acs-2.0/README.md | 17 - src/archive/app_oresat_acs-2.0/cfg/chconf.h | 714 -- src/archive/app_oresat_acs-2.0/cfg/halconf.h | 531 -- src/archive/app_oresat_acs-2.0/cfg/mcuconf.h | 361 - src/archive/app_oresat_acs-2.0/main.c | 77 - .../app_oresat_acs-2.0/source/README.md | 5 - .../app_oresat_acs-2.0/source/thread1.c | 16 - .../app_oresat_acs-2.0/source/thread1.h | 11 - src/archive/app_protodemo/Makefile | 205 - src/archive/app_protodemo/README.md | 17 - src/archive/app_protodemo/cfg/chconf.h | 714 -- src/archive/app_protodemo/cfg/halconf.h | 531 -- src/archive/app_protodemo/cfg/mcuconf.h | 187 - src/archive/app_protodemo/main.c | 77 - src/archive/app_protodemo/source/README.md | 5 - src/archive/app_radio/Makefile | 206 - src/archive/app_radio/README.md | 5 - src/archive/app_radio/cfg/CO_driver_custom.h | 32 - src/archive/app_radio/cfg/chconf.h | 763 -- src/archive/app_radio/cfg/halconf.h | 531 -- src/archive/app_radio/cfg/mcuconf.h | 361 - src/archive/app_radio/cfg/shellconf.h | 9 - src/archive/app_radio/main.c | 427 -- src/archive/app_radio/morse.c | 188 - src/archive/app_radio/morse.h | 28 - src/archive/app_radio/radio.c | 356 - src/archive/app_radio/radio.h | 26 - src/archive/app_radio/source/README.md | 7 - src/archive/app_radio/source/ax5043.c | 1088 --- src/archive/app_radio/source/ax5043.h | 741 -- src/archive/app_si41xx/.gitignore | 1 - src/archive/app_si41xx/Makefile | 238 - src/archive/app_si41xx/Operating-Guide.docx | Bin 973561 -> 0 bytes src/archive/app_si41xx/Operating-Guide.pdf | Bin 624217 -> 0 bytes src/archive/app_si41xx/README.md | 109 - src/archive/app_si41xx/Si4133-notes.txt | 85 - src/archive/app_si41xx/conf/chconf.h | 714 -- src/archive/app_si41xx/conf/halconf.h | 517 -- src/archive/app_si41xx/conf/mcuconf.h | 361 - src/archive/app_si41xx/main.c | 335 - src/archive/app_si41xx/source/README.md | 7 - src/archive/app_si41xx/source/si41xx.c | 62 - src/archive/app_si41xx/source/si41xx.h | 45 - src/archive/app_solardemo/Makefile | 205 - src/archive/app_solardemo/cfg/chconf.h | 714 -- src/archive/app_solardemo/cfg/halconf.h | 531 -- src/archive/app_solardemo/cfg/mcuconf.h | 187 - src/archive/app_solardemo/main.c | 96 - src/archive/app_solardemo/source/README.md | 5 - src/archive/app_solardemo/source/demo.c | 66 - src/archive/app_solardemo/source/demo.h | 14 - src/archive/app_solardemo/source/ltc2990.c | 139 - src/archive/app_solardemo/source/ltc2990.h | 98 - src/archive/app_solardemo/source/solar_v1.c | 76 - src/archive/app_solardemo/source/solar_v1.h | 37 - .../app_solardemo/source/util_numbers.c | 65 - .../app_solardemo/source/util_numbers.h | 33 - src/f0/app_adcs/Makefile | 1 - src/f4/README.md | 49 - src/f4/app_blinky/Makefile | 205 - src/f4/app_blinky/README.md | 87 - src/f4/app_blinky/cfg/chconf.h | 763 -- src/f4/app_blinky/cfg/halconf.h | 531 -- src/f4/app_blinky/cfg/mcuconf.h | 361 - src/f4/app_blinky/main.c | 44 - src/f4/app_cantest/Makefile | 223 - src/f4/app_cantest/README.md | 18 - src/f4/app_cantest/cfg/CO_driver_custom.h | 25 - src/f4/app_cantest/cfg/chconf.h | 763 -- src/f4/app_cantest/cfg/halconf.h | 531 -- src/f4/app_cantest/cfg/mcuconf.h | 361 - src/f4/app_cantest/cfg/shellconf.h | 9 - src/f4/app_cantest/main.c | 116 - src/f4/app_cantest/source/README.md | 5 - src/f4/app_cantest/source/cmd.c | 51 - src/f4/app_cantest/source/cmd.h | 11 - src/f4/app_cantest/source/test_bootloader.c | 32 - src/f4/app_cantest/source/test_bootloader.h | 17 - src/f4/app_cantest/source/test_lfs.c | 206 - src/f4/app_cantest/source/test_lfs.h | 16 - src/f4/app_cantest/source/test_time.c | 68 - src/f4/app_cantest/source/test_time.h | 16 - src/f4/app_control/Makefile | 225 - src/f4/app_control/README.md | 18 - src/f4/app_control/cfg/CO_driver_custom.h | 25 - src/f4/app_control/cfg/chconf.h | 763 -- src/f4/app_control/cfg/halconf.h | 531 -- src/f4/app_control/cfg/mcuconf.h | 373 - src/f4/app_control/cfg/shellconf.h | 9 - src/f4/app_control/main.c | 179 - src/f4/app_control/source/README.md | 5 - src/f4/app_control/source/beacon.c | 365 - src/f4/app_control/source/beacon.h | 39 - src/f4/app_control/source/c3.c | 337 - src/f4/app_control/source/c3.h | 49 - src/f4/app_control/source/cmd.c | 137 - src/f4/app_control/source/cmd.h | 50 - src/f4/app_control/source/comms.c | 739 -- src/f4/app_control/source/comms.h | 37 - src/f4/app_control/source/deployer.c | 25 - src/f4/app_control/source/deployer.h | 16 - src/f4/app_control/source/file_xfr.c | 29 - src/f4/app_control/source/file_xfr.h | 22 - src/f4/app_control/source/fw.c | 188 - src/f4/app_control/source/fw.h | 32 - src/f4/app_control/source/hmac.c | 76 - src/f4/app_control/source/hmac.h | 10 - src/f4/app_control/source/persist.c | 94 - src/f4/app_control/source/persist.h | 21 - src/f4/app_control/source/test/cli.c | 174 - src/f4/app_control/source/test/cli.h | 10 - src/f4/app_control/source/test/test_canopen.c | 128 - src/f4/app_control/source/test/test_canopen.h | 17 - src/f4/app_control/source/test/test_comms.c | 398 - src/f4/app_control/source/test/test_comms.h | 17 - src/f4/app_control/source/test/test_crc.c | 123 - src/f4/app_control/source/test/test_crc.h | 16 - src/f4/app_control/source/test/test_deploy.c | 36 - src/f4/app_control/source/test/test_deploy.h | 16 - src/f4/app_control/source/test/test_fram.c | 54 - src/f4/app_control/source/test/test_fram.h | 17 - src/f4/app_control/source/test/test_fw.c | 194 - src/f4/app_control/source/test/test_fw.h | 16 - src/f4/app_control/source/test/test_hmac.c | 323 - src/f4/app_control/source/test/test_hmac.h | 16 - src/f4/app_control/source/test/test_lfs.c | 221 - src/f4/app_control/source/test/test_lfs.h | 16 - src/f4/app_control/source/test/test_mmc.c | 198 - src/f4/app_control/source/test/test_mmc.h | 16 - src/f4/app_control/source/test/test_opd.c | 203 - src/f4/app_control/source/test/test_opd.h | 17 - src/f4/app_control/source/test/test_persist.c | 60 - src/f4/app_control/source/test/test_persist.h | 16 - src/f4/app_control/source/test/test_radio.c | 461 -- src/f4/app_control/source/test/test_radio.h | 20 - src/f4/app_control/source/test/test_time.c | 68 - src/f4/app_control/source/test/test_time.h | 16 - src/f4/app_control/source/wdt.c | 21 - src/f4/app_control/source/wdt.h | 11 - src/f4/app_control/stm32f42x_43x_efl.patch | 263 - src/f4/app_control/stm32f439_hmacsha256.patch | 332 - src/f4/app_devboard/Makefile | 217 - src/f4/app_devboard/README.md | 12 - src/f4/app_devboard/cfg/CO_driver_custom.h | 20 - src/f4/app_devboard/cfg/chconf.h | 763 -- src/f4/app_devboard/cfg/halconf.h | 531 -- src/f4/app_devboard/cfg/mcuconf.h | 361 - src/f4/app_devboard/main.c | 63 - src/f4/app_devboard/source/README.md | 5 - src/f4/app_devboard/source/blink.c | 18 - src/f4/app_devboard/source/blink.h | 11 - src/l4/README.md | 49 - src/l4/app_blinky/Makefile | 202 - src/l4/app_blinky/README.md | 87 - src/l4/app_blinky/cfg/chconf.h | 763 -- src/l4/app_blinky/cfg/halconf.h | 531 -- src/l4/app_blinky/cfg/mcuconf.h | 312 - src/l4/app_blinky/main.c | 42 - src/l4/app_devboard/Makefile | 217 - src/l4/app_devboard/README.md | 12 - src/l4/app_devboard/cfg/CO_driver_custom.h | 13 - src/l4/app_devboard/cfg/chconf.h | 763 -- src/l4/app_devboard/cfg/halconf.h | 531 -- src/l4/app_devboard/cfg/mcuconf.h | 312 - src/l4/app_devboard/main.c | 63 - src/l4/app_devboard/od/app.eds | 4863 ------------ src/l4/app_devboard/source/README.md | 5 - src/l4/app_devboard/source/blink.c | 18 - src/l4/app_devboard/source/blink.h | 11 - src/l4/app_devboard_cpp/Makefile | 217 - src/l4/app_devboard_cpp/README.md | 12 - .../app_devboard_cpp/cfg/CO_driver_custom.h | 13 - src/l4/app_devboard_cpp/cfg/chconf.h | 763 -- src/l4/app_devboard_cpp/cfg/halconf.h | 531 -- src/l4/app_devboard_cpp/cfg/mcuconf.h | 312 - src/l4/app_devboard_cpp/main.cpp | 63 - src/l4/app_devboard_cpp/od/app.eds | 4863 ------------ src/l4/app_devboard_cpp/source/README.md | 5 - src/l4/app_devboard_cpp/source/blink.cpp | 18 - src/l4/app_devboard_cpp/source/blink.h | 11 - 515 files changed, 1 insertion(+), 151387 deletions(-) delete mode 100644 boards/BATTERY_V1/board.c delete mode 100644 boards/BATTERY_V1/board.h delete mode 100644 boards/BATTERY_V1/board.mk delete mode 100644 boards/BATTERY_V1/gdboocd.cmd delete mode 100644 boards/BATTERY_V1/oocd.cfg delete mode 100644 boards/BATTERY_V2/board.c delete mode 100644 boards/BATTERY_V2/board.h delete mode 100644 boards/BATTERY_V2/board.mk delete mode 100644 boards/BATTERY_V2/gdboocd.cmd delete mode 100644 boards/BATTERY_V2/oocd.cfg delete mode 100644 boards/BOARD_TEMPLATE_F4/board.c delete mode 100644 boards/BOARD_TEMPLATE_F4/board.h delete mode 100644 boards/BOARD_TEMPLATE_F4/board.mk delete mode 100644 boards/BOARD_TEMPLATE_F4/gdboocd.cmd delete mode 100644 boards/BOARD_TEMPLATE_F4/oocd.cfg delete mode 100644 boards/BOARD_TEMPLATE_L4/board.c delete mode 100644 boards/BOARD_TEMPLATE_L4/board.h delete mode 100644 boards/BOARD_TEMPLATE_L4/board.mk delete mode 100644 boards/BOARD_TEMPLATE_L4/gdboocd.cmd delete mode 100644 boards/BOARD_TEMPLATE_L4/oocd.cfg delete mode 100644 boards/ORESAT_ACS_V4/board.c delete mode 100644 boards/ORESAT_ACS_V4/board.h delete mode 100644 boards/ORESAT_ACS_V4/board.mk delete mode 100644 boards/ORESAT_ACS_V4/gdboocd.cmd delete mode 100644 boards/ORESAT_ACS_V4/oocd.cfg delete mode 100644 boards/ORESAT_C3_V1/board.c delete mode 100644 boards/ORESAT_C3_V1/board.h delete mode 100644 boards/ORESAT_C3_V1/board.mk delete mode 100644 boards/ORESAT_C3_V1/gdboocd.cmd delete mode 100644 boards/ORESAT_C3_V1/oocd.cfg delete mode 100644 boards/ORESAT_C3_V3/board.c delete mode 100644 boards/ORESAT_C3_V3/board.h delete mode 100644 boards/ORESAT_C3_V3/board.mk delete mode 100644 boards/ORESAT_C3_V3/gdboocd.cmd delete mode 100644 boards/ORESAT_C3_V3/oocd.cfg delete mode 100644 boards/ORESAT_C3_V4/board.c delete mode 100644 boards/ORESAT_C3_V4/board.h delete mode 100644 boards/ORESAT_C3_V4/board.mk delete mode 100644 boards/ORESAT_C3_V4/gdboocd.cmd delete mode 100644 boards/ORESAT_C3_V4/oocd.cfg delete mode 100644 boards/ORESAT_C3_V5/board.c delete mode 100644 boards/ORESAT_C3_V5/board.h delete mode 100644 boards/ORESAT_C3_V5/board.mk delete mode 100644 boards/ORESAT_C3_V5/gdboocd.cmd delete mode 100644 boards/ORESAT_C3_V5/oocd.cfg delete mode 100644 boards/ORESAT_RWB_V1_1/board.c delete mode 100644 boards/ORESAT_RWB_V1_1/board.h delete mode 100644 boards/ORESAT_RWB_V1_1/board.mk delete mode 100644 boards/ORESAT_RWB_V1_1/gdboocd.cmd delete mode 100644 boards/ORESAT_RWB_V1_1/oocd.cfg delete mode 100644 boards/ORESAT_RWB_V3/board.c delete mode 100644 boards/ORESAT_RWB_V3/board.h delete mode 100644 boards/ORESAT_RWB_V3/board.mk delete mode 100644 boards/ORESAT_RWB_V3/gdboocd.cmd delete mode 100644 boards/ORESAT_RWB_V3/oocd.cfg delete mode 100644 boards/ORESAT_RWB_V4/board.c delete mode 100644 boards/ORESAT_RWB_V4/board.h delete mode 100644 boards/ORESAT_RWB_V4/board.mk delete mode 100644 boards/ORESAT_RWB_V4/gdboocd.cmd delete mode 100644 boards/ORESAT_RWB_V4/oocd.cfg delete mode 100644 boards/PROTOCARD_V1_1/board.c delete mode 100644 boards/PROTOCARD_V1_1/board.h delete mode 100644 boards/PROTOCARD_V1_1/board.mk delete mode 100644 boards/PROTOCARD_V1_1/gdboocd.cmd delete mode 100644 boards/PROTOCARD_V1_1/oocd.cfg delete mode 100644 boards/PROTOCARD_V2/board.c delete mode 100644 boards/PROTOCARD_V2/board.h delete mode 100644 boards/PROTOCARD_V2/board.mk delete mode 100644 boards/PROTOCARD_V2/gdboocd.cmd delete mode 100644 boards/PROTOCARD_V2/oocd.cfg delete mode 100644 boards/PROTOCARD_V3/board.c delete mode 100644 boards/PROTOCARD_V3/board.h delete mode 100644 boards/PROTOCARD_V3/board.mk delete mode 100644 boards/PROTOCARD_V3/gdboocd.cmd delete mode 100644 boards/PROTOCARD_V3/oocd.cfg delete mode 100644 boards/README.md delete mode 100644 boards/SOLAR_V1/board.c delete mode 100644 boards/SOLAR_V1/board.h delete mode 100644 boards/SOLAR_V1/board.mk delete mode 100644 boards/SOLAR_V1/gdboocd.cmd delete mode 100644 boards/SOLAR_V1/oocd.cfg delete mode 100644 boards/SOLAR_V2/board.c delete mode 100644 boards/SOLAR_V2/board.h delete mode 100644 boards/SOLAR_V2/board.mk delete mode 100644 boards/SOLAR_V2/gdboocd.cmd delete mode 100644 boards/SOLAR_V2/oocd.cfg delete mode 100644 boards/SOLAR_V3/board.c delete mode 100644 boards/SOLAR_V3/board.h delete mode 100644 boards/SOLAR_V3/board.mk delete mode 100644 boards/SOLAR_V3/gdboocd.cmd delete mode 100644 boards/SOLAR_V3/oocd.cfg delete mode 100644 boards/SOLAR_V4/board.c delete mode 100644 boards/SOLAR_V4/board.h delete mode 100644 boards/SOLAR_V4/board.mk delete mode 100644 boards/SOLAR_V4/gdboocd.cmd delete mode 100644 boards/SOLAR_V4/oocd.cfg delete mode 100644 boards/ST_NUCLEO144_F439ZI/board.c delete mode 100644 boards/ST_NUCLEO144_F439ZI/board.h delete mode 100644 boards/ST_NUCLEO144_F439ZI/board.mk delete mode 100644 boards/ST_NUCLEO144_F439ZI/gdboocd.cmd delete mode 100644 boards/ST_NUCLEO144_F439ZI/oocd.cfg delete mode 100644 boards/ST_NUCLEO32_F042K6/board.c delete mode 100644 boards/ST_NUCLEO32_F042K6/board.h delete mode 100644 boards/ST_NUCLEO32_F042K6/board.mk delete mode 100644 boards/ST_NUCLEO32_F042K6/gdboocd.cmd delete mode 100644 boards/ST_NUCLEO32_F042K6/oocd.cfg delete mode 100644 boards/ST_NUCLEO64_F446RE/board.c delete mode 100644 boards/ST_NUCLEO64_F446RE/board.h delete mode 100644 boards/ST_NUCLEO64_F446RE/board.mk delete mode 100644 boards/ST_NUCLEO64_F446RE/gdboocd.cmd delete mode 100644 boards/ST_NUCLEO64_F446RE/oocd.cfg delete mode 100644 boards/ST_NUCLEO64_L452RE_P/board.c delete mode 100644 boards/ST_NUCLEO64_L452RE_P/board.h delete mode 100644 boards/ST_NUCLEO64_L452RE_P/board.mk delete mode 100644 boards/ST_NUCLEO64_L452RE_P/gdboocd.cmd delete mode 100644 boards/ST_NUCLEO64_L452RE_P/oocd.cfg delete mode 100644 common/README.md delete mode 100644 common/aprs.c delete mode 100644 common/aprs.mk delete mode 100644 common/ax25.c delete mode 100644 common/ax5043.c delete mode 100644 common/ax5043.mk delete mode 100644 common/bootloader.mk delete mode 100644 common/can_bootloader.c delete mode 100644 common/can_hw.c delete mode 100644 common/fram.c delete mode 100644 common/fram.mk delete mode 100644 common/fs.c delete mode 100644 common/fs.mk delete mode 100644 common/include/README.md delete mode 100644 common/include/aprs.h delete mode 100644 common/include/ax25.h delete mode 100644 common/include/ax5043.h delete mode 100644 common/include/can_bootloader.h delete mode 100644 common/include/fram.h delete mode 100644 common/include/fs.h delete mode 100644 common/include/lfs_util_custom.h delete mode 100644 common/include/max580x.h delete mode 100644 common/include/max7310.h delete mode 100644 common/include/mmc5883ma.h delete mode 100644 common/include/morse.h delete mode 100644 common/include/node_mgr.h delete mode 100644 common/include/opd.h delete mode 100644 common/include/radio.h delete mode 100644 common/include/rtc.h delete mode 100644 common/include/si41xx.h delete mode 100644 common/lfs_util.c delete mode 100644 common/max580x.c delete mode 100644 common/max580x.mk delete mode 100644 common/max7310.c delete mode 100644 common/max7310.mk delete mode 100644 common/mmc5883ma.c delete mode 100644 common/mmc5883ma.mk delete mode 100644 common/morse.c delete mode 100644 common/node_mgr.c delete mode 100644 common/node_mgr.mk delete mode 100644 common/opd.c delete mode 100644 common/opd.mk delete mode 100644 common/radio.c delete mode 100644 common/radio.mk delete mode 100644 common/rtc.c delete mode 100644 common/rtc.mk delete mode 100644 common/si41xx.c delete mode 100644 common/si41xx.mk delete mode 160000 ext/OpenCCSDS delete mode 160000 ext/littlefs delete mode 100644 ld/STM32F439xI.ld delete mode 100644 ld/STM32F446xE.ld delete mode 100644 ld/STM32L452xE.ld delete mode 100644 profiles/oresat_battery.xpd delete mode 100644 profiles/oresat_node.xpd delete mode 100644 profiles/oresat_solar.xpd delete mode 100644 src/archive/app_acs_bldc_f0/Makefile delete mode 100644 src/archive/app_acs_bldc_f0/README.md delete mode 100644 src/archive/app_acs_bldc_f0/cfg/chconf.h delete mode 100644 src/archive/app_acs_bldc_f0/cfg/halconf.h delete mode 100644 src/archive/app_acs_bldc_f0/cfg/mcuconf.h delete mode 100644 src/archive/app_acs_bldc_f0/main.c delete mode 100644 src/archive/app_acs_bldc_f0/scratch/acs_sinlut.c delete mode 100644 src/archive/app_acs_bldc_f0/scratch/acs_sinlut.h delete mode 100644 src/archive/app_acs_bldc_f0/source/README.md delete mode 100644 src/archive/app_acs_bldc_f0/source/acs_bldc.c delete mode 100644 src/archive/app_acs_bldc_f0/source/acs_bldc.h delete mode 100644 src/archive/app_acs_bldc_f4/Makefile delete mode 100644 src/archive/app_acs_bldc_f4/README.md delete mode 100644 src/archive/app_acs_bldc_f4/cfg/chconf.h delete mode 100644 src/archive/app_acs_bldc_f4/cfg/halconf.h delete mode 100644 src/archive/app_acs_bldc_f4/cfg/mcuconf.h delete mode 100644 src/archive/app_acs_bldc_f4/main.c delete mode 100644 src/archive/app_acs_bldc_f4/source/README.md delete mode 100644 src/archive/app_acs_bldc_f4/source/acs_bldc.c delete mode 100644 src/archive/app_acs_bldc_f4/source/acs_bldc.h delete mode 100644 src/archive/app_acs_bldc_f4/source/thread1.c delete mode 100644 src/archive/app_acs_bldc_f4/source/thread1.h delete mode 100644 src/archive/app_ax5043_HDLC_rx/Makefile delete mode 100644 src/archive/app_ax5043_HDLC_rx/README.md delete mode 100644 src/archive/app_ax5043_HDLC_rx/conf/chconf.h delete mode 100644 src/archive/app_ax5043_HDLC_rx/conf/halconf.h delete mode 100644 src/archive/app_ax5043_HDLC_rx/conf/mcuconf.h delete mode 100644 src/archive/app_ax5043_HDLC_rx/main.c delete mode 100644 src/archive/app_ax5043_HDLC_rx/source/README.md delete mode 100644 src/archive/app_ax5043_HDLC_rx/source/ax5043.c delete mode 100644 src/archive/app_ax5043_HDLC_rx/source/ax5043.h delete mode 100644 src/archive/app_ax5043_HDLC_tx/Makefile delete mode 100644 src/archive/app_ax5043_HDLC_tx/README.md delete mode 100755 src/archive/app_ax5043_HDLC_tx/axradiolab_435.5_100.xml delete mode 100755 src/archive/app_ax5043_HDLC_tx/axradiolab_437.5_50.xml delete mode 100755 src/archive/app_ax5043_HDLC_tx/axradiolab_g3ruh.xml delete mode 100644 src/archive/app_ax5043_HDLC_tx/conf/chconf.h delete mode 100644 src/archive/app_ax5043_HDLC_tx/conf/halconf.h delete mode 100644 src/archive/app_ax5043_HDLC_tx/conf/mcuconf.h delete mode 100644 src/archive/app_ax5043_HDLC_tx/main.c delete mode 100644 src/archive/app_ax5043_HDLC_tx/source/README.md delete mode 100644 src/archive/app_ax5043_HDLC_tx/source/ax5043.c delete mode 100644 src/archive/app_ax5043_HDLC_tx/source/ax5043.h delete mode 100644 src/archive/app_ax5043_driver/Makefile delete mode 100644 src/archive/app_ax5043_driver/README.md delete mode 100644 src/archive/app_ax5043_driver/Supporting_Py/ax5043_config_str.txt delete mode 100644 src/archive/app_ax5043_driver/Supporting_Py/xml_to_csv.py delete mode 100644 src/archive/app_ax5043_driver/cfg/CO_driver_custom.h delete mode 100644 src/archive/app_ax5043_driver/cfg/chconf.h delete mode 100644 src/archive/app_ax5043_driver/cfg/halconf.h delete mode 100644 src/archive/app_ax5043_driver/cfg/mcuconf.h delete mode 100644 src/archive/app_ax5043_driver/main.c delete mode 100644 src/archive/app_ax5043_driver/main_ax25_rx.c delete mode 100644 src/archive/app_ax5043_driver/main_ax25_tx.c delete mode 100644 src/archive/app_ax5043_driver/main_cw.c delete mode 100644 src/archive/app_ax5043_driver/main_engr_rx.c delete mode 100644 src/archive/app_ax5043_driver/main_engr_tx.c delete mode 100644 src/archive/app_ax5043_driver/source/README.md delete mode 100644 src/archive/app_ax5043_driver/source/ax5043.c delete mode 100644 src/archive/app_ax5043_driver/source/ax5043.h delete mode 100644 src/archive/app_ax5043_engr_rx/Makefile delete mode 100644 src/archive/app_ax5043_engr_rx/README.md delete mode 100644 src/archive/app_ax5043_engr_rx/conf/chconf.h delete mode 100644 src/archive/app_ax5043_engr_rx/conf/halconf.h delete mode 100644 src/archive/app_ax5043_engr_rx/conf/mcuconf.h delete mode 100644 src/archive/app_ax5043_engr_rx/main.c delete mode 100644 src/archive/app_ax5043_engr_rx/source/README.md delete mode 100644 src/archive/app_ax5043_engr_rx/source/ax5043.c delete mode 100644 src/archive/app_ax5043_engr_rx/source/ax5043.h delete mode 100644 src/archive/app_ax5043_engr_tx/Makefile delete mode 100644 src/archive/app_ax5043_engr_tx/README.md delete mode 100644 src/archive/app_ax5043_engr_tx/conf/chconf.h delete mode 100644 src/archive/app_ax5043_engr_tx/conf/halconf.h delete mode 100644 src/archive/app_ax5043_engr_tx/conf/mcuconf.h delete mode 100644 src/archive/app_ax5043_engr_tx/main.c delete mode 100644 src/archive/app_ax5043_engr_tx/source/README.md delete mode 100644 src/archive/app_ax5043_engr_tx/source/ax5043.c delete mode 100644 src/archive/app_ax5043_engr_tx/source/ax5043.h delete mode 100644 src/archive/app_ax5043_engr_tx_clean/Makefile delete mode 100644 src/archive/app_ax5043_engr_tx_clean/README.md delete mode 100644 src/archive/app_ax5043_engr_tx_clean/conf/chconf.h delete mode 100644 src/archive/app_ax5043_engr_tx_clean/conf/halconf.h delete mode 100644 src/archive/app_ax5043_engr_tx_clean/conf/mcuconf.h delete mode 100644 src/archive/app_ax5043_engr_tx_clean/main.c delete mode 100644 src/archive/app_ax5043_engr_tx_clean/source/README.md delete mode 100644 src/archive/app_ax5043_engr_tx_clean/source/ax5043_common.c delete mode 100644 src/archive/app_ax5043_engr_tx_clean/source/ax5043_common.h delete mode 100644 src/archive/app_ax5043_engr_tx_clean/source/ax5043_engr.c delete mode 100644 src/archive/app_ax5043_engr_tx_clean/source/ax5043_engr.h delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/Makefile delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/README.md delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/conf/chconf.h delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/conf/halconf.h delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/conf/mcuconf.h delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/main.c delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/source/README.md delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_common.c delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_common.h delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f1.c delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f1.h delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f2.c delete mode 100644 src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f2.h delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/Makefile delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/README.md delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/chconf.h delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/halconf.h delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/mcuconf.h delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/main.c delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/README.md delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/ax5043.c delete mode 100644 src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/ax5043.h delete mode 100644 src/archive/app_ax5043_morse_tx/Makefile delete mode 100644 src/archive/app_ax5043_morse_tx/README.md delete mode 100644 src/archive/app_ax5043_morse_tx/conf/chconf.h delete mode 100644 src/archive/app_ax5043_morse_tx/conf/halconf.h delete mode 100644 src/archive/app_ax5043_morse_tx/conf/mcuconf.h delete mode 100644 src/archive/app_ax5043_morse_tx/main.c delete mode 100644 src/archive/app_ax5043_morse_tx/source/README.md delete mode 100644 src/archive/app_ax5043_morse_tx/source/ax5043.c delete mode 100644 src/archive/app_ax5043_morse_tx/source/ax5043.h delete mode 100755 src/archive/app_ax5043_morse_tx/source/morse.c delete mode 100755 src/archive/app_ax5043_morse_tx/source/morse.h delete mode 100644 src/archive/app_can_updater/Makefile delete mode 100644 src/archive/app_can_updater/cfg/chconf.h delete mode 100644 src/archive/app_can_updater/cfg/halconf.h delete mode 100644 src/archive/app_can_updater/cfg/mcuconf.h delete mode 100644 src/archive/app_can_updater/main.c delete mode 100644 src/archive/app_can_updater/source/firmware_blob.h delete mode 100644 src/archive/app_oresat_acs-0.1/Makefile delete mode 100644 src/archive/app_oresat_acs-0.1/README.md delete mode 100644 src/archive/app_oresat_acs-0.1/cfg/chconf.h delete mode 100644 src/archive/app_oresat_acs-0.1/cfg/halconf.h delete mode 100644 src/archive/app_oresat_acs-0.1/cfg/mcuconf.h delete mode 100644 src/archive/app_oresat_acs-0.1/main.c delete mode 100644 src/archive/app_oresat_acs-0.1/source/README.md delete mode 100644 src/archive/app_oresat_acs-0.1/source/acs.c delete mode 100644 src/archive/app_oresat_acs-0.1/source/acs.h delete mode 100644 src/archive/app_oresat_acs-0.1/source/acs_lut.h delete mode 100644 src/archive/app_oresat_acs-1.0/Makefile delete mode 100644 src/archive/app_oresat_acs-1.0/README.md delete mode 100755 src/archive/app_oresat_acs-1.0/caniface.sh delete mode 100644 src/archive/app_oresat_acs-1.0/cfg/chconf.h delete mode 100644 src/archive/app_oresat_acs-1.0/cfg/halconf.h delete mode 100644 src/archive/app_oresat_acs-1.0/cfg/mcuconf.h delete mode 100644 src/archive/app_oresat_acs-1.0/main.c delete mode 100644 src/archive/app_oresat_acs-1.0/source/README.md delete mode 100644 src/archive/app_oresat_acs-1.0/source/acs.c delete mode 100644 src/archive/app_oresat_acs-1.0/source/acs.h delete mode 100644 src/archive/app_oresat_acs-1.0/source/bldc.c delete mode 100644 src/archive/app_oresat_acs-1.0/source/bldc.h delete mode 100644 src/archive/app_oresat_acs-1.0/source/magnetorquer.c delete mode 100644 src/archive/app_oresat_acs-1.0/source/magnetorquer.h delete mode 100644 src/archive/app_oresat_acs-1.0/source/saddle_lut.h delete mode 100644 src/archive/app_oresat_acs-1.0/source/sin_lut.h delete mode 100644 src/archive/app_oresat_acs-2.0/Makefile delete mode 100644 src/archive/app_oresat_acs-2.0/README.md delete mode 100644 src/archive/app_oresat_acs-2.0/cfg/chconf.h delete mode 100644 src/archive/app_oresat_acs-2.0/cfg/halconf.h delete mode 100644 src/archive/app_oresat_acs-2.0/cfg/mcuconf.h delete mode 100644 src/archive/app_oresat_acs-2.0/main.c delete mode 100644 src/archive/app_oresat_acs-2.0/source/README.md delete mode 100644 src/archive/app_oresat_acs-2.0/source/thread1.c delete mode 100644 src/archive/app_oresat_acs-2.0/source/thread1.h delete mode 100644 src/archive/app_protodemo/Makefile delete mode 100644 src/archive/app_protodemo/README.md delete mode 100644 src/archive/app_protodemo/cfg/chconf.h delete mode 100644 src/archive/app_protodemo/cfg/halconf.h delete mode 100644 src/archive/app_protodemo/cfg/mcuconf.h delete mode 100644 src/archive/app_protodemo/main.c delete mode 100644 src/archive/app_protodemo/source/README.md delete mode 100644 src/archive/app_radio/Makefile delete mode 100644 src/archive/app_radio/README.md delete mode 100644 src/archive/app_radio/cfg/CO_driver_custom.h delete mode 100644 src/archive/app_radio/cfg/chconf.h delete mode 100644 src/archive/app_radio/cfg/halconf.h delete mode 100644 src/archive/app_radio/cfg/mcuconf.h delete mode 100644 src/archive/app_radio/cfg/shellconf.h delete mode 100644 src/archive/app_radio/main.c delete mode 100644 src/archive/app_radio/morse.c delete mode 100644 src/archive/app_radio/morse.h delete mode 100644 src/archive/app_radio/radio.c delete mode 100644 src/archive/app_radio/radio.h delete mode 100644 src/archive/app_radio/source/README.md delete mode 100644 src/archive/app_radio/source/ax5043.c delete mode 100644 src/archive/app_radio/source/ax5043.h delete mode 100644 src/archive/app_si41xx/.gitignore delete mode 100644 src/archive/app_si41xx/Makefile delete mode 100644 src/archive/app_si41xx/Operating-Guide.docx delete mode 100644 src/archive/app_si41xx/Operating-Guide.pdf delete mode 100644 src/archive/app_si41xx/README.md delete mode 100644 src/archive/app_si41xx/Si4133-notes.txt delete mode 100644 src/archive/app_si41xx/conf/chconf.h delete mode 100644 src/archive/app_si41xx/conf/halconf.h delete mode 100644 src/archive/app_si41xx/conf/mcuconf.h delete mode 100644 src/archive/app_si41xx/main.c delete mode 100644 src/archive/app_si41xx/source/README.md delete mode 100644 src/archive/app_si41xx/source/si41xx.c delete mode 100644 src/archive/app_si41xx/source/si41xx.h delete mode 100644 src/archive/app_solardemo/Makefile delete mode 100644 src/archive/app_solardemo/cfg/chconf.h delete mode 100644 src/archive/app_solardemo/cfg/halconf.h delete mode 100644 src/archive/app_solardemo/cfg/mcuconf.h delete mode 100644 src/archive/app_solardemo/main.c delete mode 100644 src/archive/app_solardemo/source/README.md delete mode 100644 src/archive/app_solardemo/source/demo.c delete mode 100644 src/archive/app_solardemo/source/demo.h delete mode 100644 src/archive/app_solardemo/source/ltc2990.c delete mode 100644 src/archive/app_solardemo/source/ltc2990.h delete mode 100644 src/archive/app_solardemo/source/solar_v1.c delete mode 100644 src/archive/app_solardemo/source/solar_v1.h delete mode 100644 src/archive/app_solardemo/source/util_numbers.c delete mode 100644 src/archive/app_solardemo/source/util_numbers.h delete mode 100644 src/f4/README.md delete mode 100644 src/f4/app_blinky/Makefile delete mode 100644 src/f4/app_blinky/README.md delete mode 100644 src/f4/app_blinky/cfg/chconf.h delete mode 100644 src/f4/app_blinky/cfg/halconf.h delete mode 100644 src/f4/app_blinky/cfg/mcuconf.h delete mode 100644 src/f4/app_blinky/main.c delete mode 100644 src/f4/app_cantest/Makefile delete mode 100644 src/f4/app_cantest/README.md delete mode 100644 src/f4/app_cantest/cfg/CO_driver_custom.h delete mode 100644 src/f4/app_cantest/cfg/chconf.h delete mode 100644 src/f4/app_cantest/cfg/halconf.h delete mode 100644 src/f4/app_cantest/cfg/mcuconf.h delete mode 100644 src/f4/app_cantest/cfg/shellconf.h delete mode 100644 src/f4/app_cantest/main.c delete mode 100644 src/f4/app_cantest/source/README.md delete mode 100644 src/f4/app_cantest/source/cmd.c delete mode 100644 src/f4/app_cantest/source/cmd.h delete mode 100644 src/f4/app_cantest/source/test_bootloader.c delete mode 100644 src/f4/app_cantest/source/test_bootloader.h delete mode 100644 src/f4/app_cantest/source/test_lfs.c delete mode 100644 src/f4/app_cantest/source/test_lfs.h delete mode 100644 src/f4/app_cantest/source/test_time.c delete mode 100644 src/f4/app_cantest/source/test_time.h delete mode 100644 src/f4/app_control/Makefile delete mode 100644 src/f4/app_control/README.md delete mode 100644 src/f4/app_control/cfg/CO_driver_custom.h delete mode 100644 src/f4/app_control/cfg/chconf.h delete mode 100644 src/f4/app_control/cfg/halconf.h delete mode 100644 src/f4/app_control/cfg/mcuconf.h delete mode 100644 src/f4/app_control/cfg/shellconf.h delete mode 100644 src/f4/app_control/main.c delete mode 100644 src/f4/app_control/source/README.md delete mode 100644 src/f4/app_control/source/beacon.c delete mode 100644 src/f4/app_control/source/beacon.h delete mode 100644 src/f4/app_control/source/c3.c delete mode 100644 src/f4/app_control/source/c3.h delete mode 100644 src/f4/app_control/source/cmd.c delete mode 100644 src/f4/app_control/source/cmd.h delete mode 100644 src/f4/app_control/source/comms.c delete mode 100644 src/f4/app_control/source/comms.h delete mode 100644 src/f4/app_control/source/deployer.c delete mode 100644 src/f4/app_control/source/deployer.h delete mode 100644 src/f4/app_control/source/file_xfr.c delete mode 100644 src/f4/app_control/source/file_xfr.h delete mode 100644 src/f4/app_control/source/fw.c delete mode 100644 src/f4/app_control/source/fw.h delete mode 100644 src/f4/app_control/source/hmac.c delete mode 100644 src/f4/app_control/source/hmac.h delete mode 100644 src/f4/app_control/source/persist.c delete mode 100644 src/f4/app_control/source/persist.h delete mode 100644 src/f4/app_control/source/test/cli.c delete mode 100644 src/f4/app_control/source/test/cli.h delete mode 100644 src/f4/app_control/source/test/test_canopen.c delete mode 100644 src/f4/app_control/source/test/test_canopen.h delete mode 100644 src/f4/app_control/source/test/test_comms.c delete mode 100644 src/f4/app_control/source/test/test_comms.h delete mode 100644 src/f4/app_control/source/test/test_crc.c delete mode 100644 src/f4/app_control/source/test/test_crc.h delete mode 100644 src/f4/app_control/source/test/test_deploy.c delete mode 100644 src/f4/app_control/source/test/test_deploy.h delete mode 100644 src/f4/app_control/source/test/test_fram.c delete mode 100644 src/f4/app_control/source/test/test_fram.h delete mode 100644 src/f4/app_control/source/test/test_fw.c delete mode 100644 src/f4/app_control/source/test/test_fw.h delete mode 100644 src/f4/app_control/source/test/test_hmac.c delete mode 100644 src/f4/app_control/source/test/test_hmac.h delete mode 100644 src/f4/app_control/source/test/test_lfs.c delete mode 100644 src/f4/app_control/source/test/test_lfs.h delete mode 100644 src/f4/app_control/source/test/test_mmc.c delete mode 100644 src/f4/app_control/source/test/test_mmc.h delete mode 100644 src/f4/app_control/source/test/test_opd.c delete mode 100644 src/f4/app_control/source/test/test_opd.h delete mode 100644 src/f4/app_control/source/test/test_persist.c delete mode 100644 src/f4/app_control/source/test/test_persist.h delete mode 100644 src/f4/app_control/source/test/test_radio.c delete mode 100644 src/f4/app_control/source/test/test_radio.h delete mode 100644 src/f4/app_control/source/test/test_time.c delete mode 100644 src/f4/app_control/source/test/test_time.h delete mode 100644 src/f4/app_control/source/wdt.c delete mode 100644 src/f4/app_control/source/wdt.h delete mode 100644 src/f4/app_control/stm32f42x_43x_efl.patch delete mode 100644 src/f4/app_control/stm32f439_hmacsha256.patch delete mode 100644 src/f4/app_devboard/Makefile delete mode 100644 src/f4/app_devboard/README.md delete mode 100644 src/f4/app_devboard/cfg/CO_driver_custom.h delete mode 100644 src/f4/app_devboard/cfg/chconf.h delete mode 100644 src/f4/app_devboard/cfg/halconf.h delete mode 100644 src/f4/app_devboard/cfg/mcuconf.h delete mode 100644 src/f4/app_devboard/main.c delete mode 100644 src/f4/app_devboard/source/README.md delete mode 100644 src/f4/app_devboard/source/blink.c delete mode 100644 src/f4/app_devboard/source/blink.h delete mode 100644 src/l4/README.md delete mode 100644 src/l4/app_blinky/Makefile delete mode 100644 src/l4/app_blinky/README.md delete mode 100644 src/l4/app_blinky/cfg/chconf.h delete mode 100644 src/l4/app_blinky/cfg/halconf.h delete mode 100644 src/l4/app_blinky/cfg/mcuconf.h delete mode 100644 src/l4/app_blinky/main.c delete mode 100644 src/l4/app_devboard/Makefile delete mode 100644 src/l4/app_devboard/README.md delete mode 100644 src/l4/app_devboard/cfg/CO_driver_custom.h delete mode 100644 src/l4/app_devboard/cfg/chconf.h delete mode 100644 src/l4/app_devboard/cfg/halconf.h delete mode 100644 src/l4/app_devboard/cfg/mcuconf.h delete mode 100644 src/l4/app_devboard/main.c delete mode 100644 src/l4/app_devboard/od/app.eds delete mode 100644 src/l4/app_devboard/source/README.md delete mode 100644 src/l4/app_devboard/source/blink.c delete mode 100644 src/l4/app_devboard/source/blink.h delete mode 100644 src/l4/app_devboard_cpp/Makefile delete mode 100644 src/l4/app_devboard_cpp/README.md delete mode 100644 src/l4/app_devboard_cpp/cfg/CO_driver_custom.h delete mode 100644 src/l4/app_devboard_cpp/cfg/chconf.h delete mode 100644 src/l4/app_devboard_cpp/cfg/halconf.h delete mode 100644 src/l4/app_devboard_cpp/cfg/mcuconf.h delete mode 100644 src/l4/app_devboard_cpp/main.cpp delete mode 100644 src/l4/app_devboard_cpp/od/app.eds delete mode 100644 src/l4/app_devboard_cpp/source/README.md delete mode 100644 src/l4/app_devboard_cpp/source/blink.cpp delete mode 100644 src/l4/app_devboard_cpp/source/blink.h diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 8b4a95b4..de67d3dd 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -34,13 +34,6 @@ jobs: sudo apt update sudo apt install -y gcc-arm-none-eabi srecord xxd - - name: Apply C3 patches - working-directory: - ext/ChibiOS - run: | - patch -p0 < ../../src/f4/app_control/stm32f42x_43x_efl.patch - patch -p1 < ../../src/f4/app_control/stm32f439_hmacsha256.patch - - name: Compile f0 apps run: | make -C src/f0/app_battery @@ -49,14 +42,3 @@ jobs: make -C src/f0/app_devboard make -C src/f0/app_adcs make -C src/f0/app_solar - - - name: Compile f4 apps - run: | - make -C src/f4/app_blinky - make -C src/f4/app_cantest - - - name: Compile l4 apps - run: | - make -C src/l4/app_blinky - make -C src/l4/app_devboard - make -C src/l4/app_devboard_cpp diff --git a/.gitmodules b/.gitmodules index e4692aa3..71c14e5e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,9 +4,3 @@ [submodule "ext/CANopenNode"] path = ext/CANopenNode url = https://github.com/CANopenNode/CANopenNode.git -[submodule "ext/littlefs"] - path = ext/littlefs - url = https://github.com/littlefs-project/littlefs -[submodule "ext/OpenCCSDS"] - path = ext/OpenCCSDS - url = https://github.com/oresat/OpenCCSDS.git diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4f281455..a6cca803 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,9 +30,6 @@ Join one of our meetings. Meetings can be found in [Our Calendar](https://calend Here are links to some of our supported development boards. * [NUCLEO-F091RC](https://www.mouser.com/ProductDetail/STMicroelectronics/NUCLEO-F091RC?qs=CE9ecZDhCK0jcTHFYd%2Fi5g%3D%3D#.YoAe6h4MCag.link) - * [NUCLEO-F446RE](https://www.mouser.com/ProductDetail/STMicroelectronics/NUCLEO-F446RE?qs=PRtH0mD6DWYnuBoPSlbRCA%3D%3D) - * [NUCLEO-L452RE](https://www.mouser.com/ProductDetail/STMicroelectronics/NUCLEO-L452RE?qs=zwwtnr6GuIyXyX5dw%2FgKaw%3D%3D) - * [NUCLEO-F439ZI](https://www.mouser.com/ProductDetail/STMicroelectronics/NUCLEO-F439ZI?qs=w%2Fv1CP2dgqohyY3gLxBfCw%3D%3D) Be sure to test with [app_blinky](https://github.com/oresat/oresat-firmware#test-your-toolchain)! diff --git a/Makefile b/Makefile index 9ce68802..e3b14219 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,6 @@ TOPTARGETS := all clean SUBDIRS := $(wildcard src/f0/*/.) -SUBDIRS += $(wildcard src/l4/*/.) -SUBDIRS += $(wildcard src/f4/*/.) $(TOPTARGETS): $(SUBDIRS) $(SUBDIRS): diff --git a/README.md b/README.md index c741ebcc..8a18d3ce 100644 --- a/README.md +++ b/README.md @@ -97,8 +97,6 @@ for details on how to do this on a per-system basis. #### Test your toolchain To test that your build system works correctly, it's recommended that you build one of the `app_blinky` applications and write it to a dev board successfully. Here are the links for the various versions of the app with further documentation: * [NUCLEO64_STM32F091RC](src/f0/app_blinky) -* [NUCLEO144 STM32F439ZI](src/f4/app_blinky) -* [NUCLEO64 STM32L452RE](src/l4/app_blinky) ### Creating an app Once you have a working toolchain in place, the next step is to copy an existing @@ -107,8 +105,6 @@ supported MCUs for OreSat are listed below, and link to the relevant folders and #### Supported MCUs * [STM32F091xC](src/f0) -* [STM32F439Zx](src/f4) -* [STM32L452RE](src/l4) ## Subsystems ### ACS (Attitude Control System) diff --git a/boards/BATTERY_V1/board.c b/boards/BATTERY_V1/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/BATTERY_V1/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/BATTERY_V1/board.h b/boards/BATTERY_V1/board.h deleted file mode 100644 index ed06e434..00000000 --- a/boards/BATTERY_V1/board.h +++ /dev/null @@ -1,973 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Battery V1 Board Configuration - * PART: STM32F091CC - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_BATTERY_V1 -#define BOARD_NAME "Battery v1.x" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F091xC - -/* - * IO pins assignments. - */ -#define GPIOA_LED 0U -#define GPIOA_DCHG_STAT_PK1 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_CHG_DIS_PK1 4U -#define GPIOA_DCHG_DIS_PK1 5U -#define GPIOA_FASTCHG_PK1 6U -#define GPIOA_CHG_STAT_PK1 7U -#define GPIOA_POUTPROT 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_CHG_DIS_PK2 0U -#define GPIOB_DCHG_DIS_PK2 1U -#define GPIOB_FASTCHG_PK2 2U -#define GPIOB_PIN3 3U -#define GPIOB_ALERT_PK2 4U -#define GPIOB_ALERT_PK1 5U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_CHG_STAT_PK2 10U -#define GPIOB_DCHG_STAT_PK2 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_MOARPWR 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_BOOT0 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_PIN1 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 0U) -#define LINE_DCHG_STAT_PK1 PAL_LINE(GPIOA, 1U) -#define LINE_CHG_DIS_PK1 PAL_LINE(GPIOA, 4U) -#define LINE_DCHG_DIS_PK1 PAL_LINE(GPIOA, 5U) -#define LINE_FASTCHG_PK1 PAL_LINE(GPIOA, 6U) -#define LINE_CHG_STAT_PK1 PAL_LINE(GPIOA, 7U) -#define LINE_CAN_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN_SHDN PAL_LINE(GPIOA, 10U) -#define LINE_CHG_DIS_PK2 PAL_LINE(GPIOB, 0U) -#define LINE_DCHG_DIS_PK2 PAL_LINE(GPIOB, 1U) -#define LINE_FASTCHG_PK2 PAL_LINE(GPIOB, 2U) -#define LINE_ALERT_PK2 PAL_LINE(GPIOB, 4U) -#define LINE_ALERT_PK1 PAL_LINE(GPIOB, 5U) -#define LINE_CHG_STAT_PK2 PAL_LINE(GPIOB, 10U) -#define LINE_DCHG_STAT_PK2 PAL_LINE(GPIOB, 11U) -#define LINE_MOARPWR PAL_LINE(GPIOB, 14U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - LED (output pushpull). - * PA1 - DCHG_STAT_PK1 (input). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - CHG_DIS_PK1 (output pushpull maximum). - * PA5 - DCHG_DIS_PK1 (output pushpull maximum). - * PA6 - FASTCHG_PK1 (output pushpull maximum). - * PA7 - CHG_STAT_PK1 (input). - * PA8 - POUTPROT (analog). - * PA9 - CAN_SILENT (output pushpull maximum). - * PA10 - CAN_SHDN (output pushpull maximum). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_LED) | \ - PIN_MODE_INPUT(GPIOA_DCHG_STAT_PK1) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_OUTPUT(GPIOA_CHG_DIS_PK1) | \ - PIN_MODE_OUTPUT(GPIOA_DCHG_DIS_PK1) | \ - PIN_MODE_OUTPUT(GPIOA_FASTCHG_PK1) | \ - PIN_MODE_INPUT(GPIOA_CHG_STAT_PK1) | \ - PIN_MODE_ANALOG(GPIOA_POUTPROT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_LED) | \ - PIN_OTYPE_PUSHPULL(GPIOA_DCHG_STAT_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CHG_DIS_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_DCHG_DIS_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_FASTCHG_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_CHG_STAT_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_POUTPROT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_LED) | \ - PIN_OSPEED_HIGH(GPIOA_DCHG_STAT_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CHG_DIS_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_DCHG_DIS_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_FASTCHG_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_CHG_STAT_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_POUTPROT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLDOWN(GPIOA_LED) | \ - PIN_PUPDR_PULLDOWN(GPIOA_DCHG_STAT_PK1) |\ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CHG_DIS_PK1) |\ - PIN_PUPDR_PULLDOWN(GPIOA_DCHG_DIS_PK1) |\ - PIN_PUPDR_PULLDOWN(GPIOA_FASTCHG_PK1) |\ - PIN_PUPDR_PULLDOWN(GPIOA_CHG_STAT_PK1) |\ - PIN_PUPDR_FLOATING(GPIOA_POUTPROT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_LOW(GPIOA_LED) | \ - PIN_ODR_LOW(GPIOA_DCHG_STAT_PK1) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_LOW(GPIOA_CHG_DIS_PK1) | \ - PIN_ODR_LOW(GPIOA_DCHG_DIS_PK1) | \ - PIN_ODR_LOW(GPIOA_FASTCHG_PK1) | \ - PIN_ODR_HIGH(GPIOA_CHG_STAT_PK1) | \ - PIN_ODR_HIGH(GPIOA_POUTPROT) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_LED, 0U) | \ - PIN_AFIO_AF(GPIOA_DCHG_STAT_PK1, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_CHG_DIS_PK1, 0U) | \ - PIN_AFIO_AF(GPIOA_DCHG_DIS_PK1, 0U) | \ - PIN_AFIO_AF(GPIOA_FASTCHG_PK1, 0U) | \ - PIN_AFIO_AF(GPIOA_CHG_STAT_PK1, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_POUTPROT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - CHG_DIS_PK2 (output pushpull maximum). - * PB1 - DCHG_DIS_PK2 (output pushpull maximum). - * PB2 - FASTCHG_PK2 (output pushpull maximum). - * PB3 - PIN3 (analog). - * PB4 - ALERT_PK2 (input). - * PB5 - ALERT_PK1 (input). - * PB6 - I2C1_SCL (alternate 1). - * PB7 - I2C1_SDA (alternate 1). - * PB8 - PIN8 (analog). - * PB9 - PIN9 (analog). - * PB10 - CHG_STAT_PK2 (input). - * PB11 - DCHG_STAT_PK2 (input). - * PB12 - PIN12 (analog). - * PB13 - PIN13 (analog). - * PB14 - MOARPWR (output pushpull maximum). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_OUTPUT(GPIOB_CHG_DIS_PK2) | \ - PIN_MODE_OUTPUT(GPIOB_DCHG_DIS_PK2) | \ - PIN_MODE_OUTPUT(GPIOB_FASTCHG_PK2) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_INPUT(GPIOB_ALERT_PK2) | \ - PIN_MODE_INPUT(GPIOB_ALERT_PK1) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ANALOG(GPIOB_PIN8) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_CHG_STAT_PK2) | \ - PIN_MODE_INPUT(GPIOB_DCHG_STAT_PK2) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_ANALOG(GPIOB_PIN13) | \ - PIN_MODE_OUTPUT(GPIOB_MOARPWR) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_CHG_DIS_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_DCHG_DIS_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_FASTCHG_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_ALERT_PK2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_ALERT_PK1) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CHG_STAT_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_DCHG_STAT_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MOARPWR) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_CHG_DIS_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_DCHG_DIS_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_FASTCHG_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_ALERT_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_ALERT_PK1) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_CHG_STAT_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_DCHG_STAT_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_MOARPWR) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_CHG_DIS_PK2) |\ - PIN_PUPDR_PULLDOWN(GPIOB_DCHG_DIS_PK2) |\ - PIN_PUPDR_PULLDOWN(GPIOB_FASTCHG_PK2) |\ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_ALERT_PK2) | \ - PIN_PUPDR_FLOATING(GPIOB_ALERT_PK1) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_CHG_STAT_PK2) |\ - PIN_PUPDR_FLOATING(GPIOB_DCHG_STAT_PK2) |\ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN13) | \ - PIN_PUPDR_PULLDOWN(GPIOB_MOARPWR) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_LOW(GPIOB_CHG_DIS_PK2) | \ - PIN_ODR_LOW(GPIOB_DCHG_DIS_PK2) | \ - PIN_ODR_LOW(GPIOB_FASTCHG_PK2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_ALERT_PK2) | \ - PIN_ODR_HIGH(GPIOB_ALERT_PK1) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_CHG_STAT_PK2) | \ - PIN_ODR_HIGH(GPIOB_DCHG_STAT_PK2) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_MOARPWR) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_CHG_DIS_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_DCHG_DIS_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_FASTCHG_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_ALERT_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_ALERT_PK1, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_CHG_STAT_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_DCHG_STAT_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_MOARPWR, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - PIN14 (analog). - * PC15 - PIN15 (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_PIN14) | \ - PIN_MODE_ANALOG(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (analog). - * PF1 - OSC_OUT (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - BOOT0 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOF_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_BOOT0) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_BOOT0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_BOOT0) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/BATTERY_V1/board.mk b/boards/BATTERY_V1/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/BATTERY_V1/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/BATTERY_V1/gdboocd.cmd b/boards/BATTERY_V1/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/BATTERY_V1/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/BATTERY_V1/oocd.cfg b/boards/BATTERY_V1/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/BATTERY_V1/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/BATTERY_V2/board.c b/boards/BATTERY_V2/board.c deleted file mode 100644 index 9427402d..00000000 --- a/boards/BATTERY_V2/board.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/BATTERY_V2/board.h b/boards/BATTERY_V2/board.h deleted file mode 100644 index 8dd7af61..00000000 --- a/boards/BATTERY_V2/board.h +++ /dev/null @@ -1,973 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Battery V1 Board Configuration - * PART: STM32F091CC - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_BATTERY_V2 -#define BOARD_NAME "Battery v2.x" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F091xC - -/* - * IO pins assignments. - */ -#define GPIOA_LED 0U -#define GPIOA_DCHG_STAT_PK1 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_CHG_DIS_PK1 4U -#define GPIOA_DCHG_DIS_PK1 5U -#define GPIOA_PIN6 6U -#define GPIOA_CHG_STAT_PK1 7U -#define GPIOA_POUTPROT 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_CHG_DIS_PK2 0U -#define GPIOB_DCHG_DIS_PK2 1U -#define GPIOB_PIN2 2U -#define GPIOB_PIN3 3U -#define GPIOB_ALERT_PK2 4U -#define GPIOB_ALERT_PK1 5U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_CHG_STAT_PK2 10U -#define GPIOB_DCHG_STAT_PK2 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_MOARPWR 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_HEATER_ON_1 14U -#define GPIOC_HEATER_ON_2 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_BOOT0 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_PIN1 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 0U) -#define LINE_DCHG_STAT_PK1 PAL_LINE(GPIOA, 1U) -#define LINE_CHG_DIS_PK1 PAL_LINE(GPIOA, 4U) -#define LINE_DCHG_DIS_PK1 PAL_LINE(GPIOA, 5U) -#define LINE_CHG_STAT_PK1 PAL_LINE(GPIOA, 7U) -#define LINE_CAN_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN_SHDN PAL_LINE(GPIOA, 10U) -#define LINE_CHG_DIS_PK2 PAL_LINE(GPIOB, 0U) -#define LINE_DCHG_DIS_PK2 PAL_LINE(GPIOB, 1U) -#define LINE_ALERT_PK2 PAL_LINE(GPIOB, 4U) -#define LINE_ALERT_PK1 PAL_LINE(GPIOB, 5U) -#define LINE_CHG_STAT_PK2 PAL_LINE(GPIOB, 10U) -#define LINE_DCHG_STAT_PK2 PAL_LINE(GPIOB, 11U) -#define LINE_MOARPWR PAL_LINE(GPIOB, 14U) -#define LINE_HEATER_ON_1 PAL_LINE(GPIOC, 14U) -#define LINE_HEATER_ON_2 PAL_LINE(GPIOC, 15U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - LED (output pushpull). - * PA1 - DCHG_STAT_PK1 (input). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - CHG_DIS_PK1 (output pushpull maximum). - * PA5 - DCHG_DIS_PK1 (output pushpull maximum). - * PA6 - PIN6 (output pushpull maximum). - * PA7 - CHG_STAT_PK1 (input). - * PA8 - POUTPROT (analog). - * PA9 - CAN_SILENT (output pushpull maximum). - * PA10 - CAN_SHDN (output pushpull maximum). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_LED) | \ - PIN_MODE_INPUT(GPIOA_DCHG_STAT_PK1) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_OUTPUT(GPIOA_CHG_DIS_PK1) | \ - PIN_MODE_OUTPUT(GPIOA_DCHG_DIS_PK1) | \ - PIN_MODE_OUTPUT(GPIOA_PIN6) | \ - PIN_MODE_INPUT(GPIOA_CHG_STAT_PK1) | \ - PIN_MODE_ANALOG(GPIOA_POUTPROT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_LED) | \ - PIN_OTYPE_PUSHPULL(GPIOA_DCHG_STAT_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CHG_DIS_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_DCHG_DIS_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CHG_STAT_PK1) |\ - PIN_OTYPE_PUSHPULL(GPIOA_POUTPROT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_LED) | \ - PIN_OSPEED_HIGH(GPIOA_DCHG_STAT_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CHG_DIS_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_DCHG_DIS_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_PIN6) | \ - PIN_OSPEED_HIGH(GPIOA_CHG_STAT_PK1) | \ - PIN_OSPEED_HIGH(GPIOA_POUTPROT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLDOWN(GPIOA_LED) | \ - PIN_PUPDR_PULLDOWN(GPIOA_DCHG_STAT_PK1) |\ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CHG_DIS_PK1) |\ - PIN_PUPDR_PULLDOWN(GPIOA_DCHG_DIS_PK1) |\ - PIN_PUPDR_PULLDOWN(GPIOA_PIN6) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CHG_STAT_PK1) |\ - PIN_PUPDR_FLOATING(GPIOA_POUTPROT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_LOW(GPIOA_LED) | \ - PIN_ODR_LOW(GPIOA_DCHG_STAT_PK1) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_LOW(GPIOA_CHG_DIS_PK1) | \ - PIN_ODR_LOW(GPIOA_DCHG_DIS_PK1) | \ - PIN_ODR_LOW(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_CHG_STAT_PK1) | \ - PIN_ODR_HIGH(GPIOA_POUTPROT) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_LED, 0U) | \ - PIN_AFIO_AF(GPIOA_DCHG_STAT_PK1, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_CHG_DIS_PK1, 0U) | \ - PIN_AFIO_AF(GPIOA_DCHG_DIS_PK1, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOA_CHG_STAT_PK1, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_POUTPROT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - CHG_DIS_PK2 (output pushpull maximum). - * PB1 - DCHG_DIS_PK2 (output pushpull maximum). - * PB2 - PIN2 (output pushpull maximum). - * PB3 - PIN3 (analog). - * PB4 - ALERT_PK2 (input). - * PB5 - ALERT_PK1 (input). - * PB6 - I2C1_SCL (alternate 1). - * PB7 - I2C1_SDA (alternate 1). - * PB8 - PIN8 (analog). - * PB9 - PIN9 (analog). - * PB10 - CHG_STAT_PK2 (input). - * PB11 - DCHG_STAT_PK2 (input). - * PB12 - PIN12 (analog). - * PB13 - PIN13 (analog). - * PB14 - MOARPWR (output pushpull maximum). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_OUTPUT(GPIOB_CHG_DIS_PK2) | \ - PIN_MODE_OUTPUT(GPIOB_DCHG_DIS_PK2) | \ - PIN_MODE_OUTPUT(GPIOB_PIN2) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_INPUT(GPIOB_ALERT_PK2) | \ - PIN_MODE_INPUT(GPIOB_ALERT_PK1) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ANALOG(GPIOB_PIN8) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_CHG_STAT_PK2) | \ - PIN_MODE_INPUT(GPIOB_DCHG_STAT_PK2) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_ANALOG(GPIOB_PIN13) | \ - PIN_MODE_OUTPUT(GPIOB_MOARPWR) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_CHG_DIS_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_DCHG_DIS_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_ALERT_PK2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_ALERT_PK1) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CHG_STAT_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_DCHG_STAT_PK2) |\ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MOARPWR) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_CHG_DIS_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_DCHG_DIS_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_ALERT_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_ALERT_PK1) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_CHG_STAT_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_DCHG_STAT_PK2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_MOARPWR) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_CHG_DIS_PK2) |\ - PIN_PUPDR_PULLDOWN(GPIOB_DCHG_DIS_PK2) |\ - PIN_PUPDR_PULLDOWN(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_ALERT_PK2) | \ - PIN_PUPDR_FLOATING(GPIOB_ALERT_PK1) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_CHG_STAT_PK2) |\ - PIN_PUPDR_FLOATING(GPIOB_DCHG_STAT_PK2) |\ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN13) | \ - PIN_PUPDR_PULLDOWN(GPIOB_MOARPWR) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_LOW(GPIOB_CHG_DIS_PK2) | \ - PIN_ODR_LOW(GPIOB_DCHG_DIS_PK2) | \ - PIN_ODR_LOW(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_ALERT_PK2) | \ - PIN_ODR_HIGH(GPIOB_ALERT_PK1) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_CHG_STAT_PK2) | \ - PIN_ODR_HIGH(GPIOB_DCHG_STAT_PK2) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_MOARPWR) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_CHG_DIS_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_DCHG_DIS_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_ALERT_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_ALERT_PK1, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_CHG_STAT_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_DCHG_STAT_PK2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_MOARPWR, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - HEATER_ON_1 (output pushpull maximum). - * PC15 - HEATER_ON_2 (output pushpull maximum). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_OUTPUT(GPIOC_HEATER_ON_1) | \ - PIN_MODE_OUTPUT(GPIOC_HEATER_ON_2)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_HEATER_ON_1) |\ - PIN_OTYPE_PUSHPULL(GPIOC_HEATER_ON_2)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_HEATER_ON_1) | \ - PIN_OSPEED_HIGH(GPIOC_HEATER_ON_2)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_HEATER_ON_1) |\ - PIN_PUPDR_FLOATING(GPIOC_HEATER_ON_2)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_LOW(GPIOC_HEATER_ON_1) | \ - PIN_ODR_LOW(GPIOC_HEATER_ON_2)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_HEATER_ON_1, 0U) | \ - PIN_AFIO_AF(GPIOC_HEATER_ON_2, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (analog). - * PF1 - OSC_OUT (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - BOOT0 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOF_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_BOOT0) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_BOOT0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_BOOT0) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/BATTERY_V2/board.mk b/boards/BATTERY_V2/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/BATTERY_V2/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/BATTERY_V2/gdboocd.cmd b/boards/BATTERY_V2/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/BATTERY_V2/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/BATTERY_V2/oocd.cfg b/boards/BATTERY_V2/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/BATTERY_V2/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/BOARD_TEMPLATE_F4/board.c b/boards/BOARD_TEMPLATE_F4/board.c deleted file mode 100644 index 5f49a349..00000000 --- a/boards/BOARD_TEMPLATE_F4/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB1(STM32_GPIO_EN_MASK); - rccEnableAHB1(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/BOARD_TEMPLATE_F4/board.h b/boards/BOARD_TEMPLATE_F4/board.h deleted file mode 100644 index ab66e6aa..00000000 --- a/boards/BOARD_TEMPLATE_F4/board.h +++ /dev/null @@ -1,1197 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Board description - * PART: PART_NUM - * PACKAGE: PACKAGE - */ - -/* - * Board identifier. - */ -#define BOARD_TEMPLATE_F4 -#define BOARD_NAME "Board name" - -/* - * Board oscillators-related settings. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 32768U -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* #define STM32_HSE_BYPASS */ - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300U - -/* - * MCU type as defined in the ST header. - */ -#define STM32F446xx - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_PIN1 1U -#define GPIOA_PIN2 2U -#define GPIOA_PIN3 3U -#define GPIOA_PIN4 4U -#define GPIOA_PIN5 5U -#define GPIOA_PIN6 6U -#define GPIOA_PIN7 7U -#define GPIOA_PIN8 8U -#define GPIOA_PIN9 9U -#define GPIOA_PIN10 10U -#define GPIOA_PIN11 11U -#define GPIOA_PIN12 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_PIN3 3U -#define GPIOB_PIN4 4U -#define GPIOB_PIN5 5U -#define GPIOB_PIN6 6U -#define GPIOB_PIN7 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_OSC32_IN 14U -#define GPIOC_OSC32_OUT 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_OSC_IN 0U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -//#define LINE_PIN0 PAL_LINE(GPIOA, 0U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - PIN0 (analog). - * PA1 - PIN1 (analog). - * PA2 - PIN2 (analog). - * PA3 - PIN3 (analog). - * PA4 - PIN4 (analog). - * PA5 - PIN5 (analog). - * PA6 - PIN6 (analog). - * PA7 - PIN7 (analog). - * PA8 - PIN8 (analog). - * PA9 - PIN9 (analog). - * PA10 - PIN10 (analog). - * PA11 - PIN11 (analog). - * PA12 - PIN12 (analog). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_PIN0) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ANALOG(GPIOA_PIN2) | \ - PIN_MODE_ANALOG(GPIOA_PIN3) | \ - PIN_MODE_ANALOG(GPIOA_PIN4) | \ - PIN_MODE_ANALOG(GPIOA_PIN5) | \ - PIN_MODE_ANALOG(GPIOA_PIN6) | \ - PIN_MODE_ANALOG(GPIOA_PIN7) | \ - PIN_MODE_ANALOG(GPIOA_PIN8) | \ - PIN_MODE_ANALOG(GPIOA_PIN9) | \ - PIN_MODE_ANALOG(GPIOA_PIN10) | \ - PIN_MODE_ANALOG(GPIOA_PIN11) | \ - PIN_MODE_ANALOG(GPIOA_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_PIN0) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_PIN2) | \ - PIN_OSPEED_HIGH(GPIOA_PIN3) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_PIN5) | \ - PIN_OSPEED_HIGH(GPIOA_PIN6) | \ - PIN_OSPEED_HIGH(GPIOA_PIN7) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_PIN9) | \ - PIN_OSPEED_HIGH(GPIOA_PIN10) | \ - PIN_OSPEED_HIGH(GPIOA_PIN11) | \ - PIN_OSPEED_HIGH(GPIOA_PIN12) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_PIN7) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_HIGH(GPIOA_PIN9) | \ - PIN_ODR_HIGH(GPIOA_PIN10) | \ - PIN_ODR_HIGH(GPIOA_PIN11) | \ - PIN_ODR_HIGH(GPIOA_PIN12) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN7, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - PIN1 (analog). - * PB2 - PIN2 (analog). - * PB3 - PIN3 (analog). - * PB4 - PIN4 (analog). - * PB5 - PIN5 (analog). - * PB6 - PIN6 (analog). - * PB7 - PIN7 (analog). - * PB8 - PIN8 (analog). - * PB9 - PIN9 (analog). - * PB10 - PIN10 (analog). - * PB11 - PIN11 (analog). - * PB12 - PIN12 (analog). - * PB13 - PIN13 (analog). - * PB14 - PIN14 (analog). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN2) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_ANALOG(GPIOB_PIN4) | \ - PIN_MODE_ANALOG(GPIOB_PIN5) | \ - PIN_MODE_ANALOG(GPIOB_PIN6) | \ - PIN_MODE_ANALOG(GPIOB_PIN7) | \ - PIN_MODE_ANALOG(GPIOB_PIN8) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_ANALOG(GPIOB_PIN10) | \ - PIN_MODE_ANALOG(GPIOB_PIN11) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_ANALOG(GPIOB_PIN13) | \ - PIN_MODE_ANALOG(GPIOB_PIN14) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN4) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_PIN6) | \ - PIN_OSPEED_HIGH(GPIOB_PIN7) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_PIN6) | \ - PIN_ODR_HIGH(GPIOB_PIN7) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN7, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 5U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 5U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 5U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 5U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - OSC32_IN (analog). - * PC15 - OSC32_OUT (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_IN) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (analog). - * PF1 - PIN1 (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_PIN0) | \ - PIN_MODE_ANALOG(GPIOF_PIN1) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOG_MODER (PIN_MODE_ANALOG(GPIOG_PIN0) | \ - PIN_MODE_ANALOG(GPIOG_PIN1) | \ - PIN_MODE_ANALOG(GPIOG_PIN2) | \ - PIN_MODE_ANALOG(GPIOG_PIN3) | \ - PIN_MODE_ANALOG(GPIOG_PIN4) | \ - PIN_MODE_ANALOG(GPIOG_PIN5) | \ - PIN_MODE_ANALOG(GPIOG_PIN6) | \ - PIN_MODE_ANALOG(GPIOG_PIN7) | \ - PIN_MODE_ANALOG(GPIOG_PIN8) | \ - PIN_MODE_ANALOG(GPIOG_PIN9) | \ - PIN_MODE_ANALOG(GPIOG_PIN10) | \ - PIN_MODE_ANALOG(GPIOG_PIN11) | \ - PIN_MODE_ANALOG(GPIOG_PIN12) | \ - PIN_MODE_ANALOG(GPIOG_PIN13) | \ - PIN_MODE_ANALOG(GPIOG_PIN14) | \ - PIN_MODE_ANALOG(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (analog). - * PH1 - OSC_OUT (analog). - * PH2 - PIN2 (analog). - * PH3 - PIN3 (analog). - * PH4 - PIN4 (analog). - * PH5 - PIN5 (analog). - * PH6 - PIN6 (analog). - * PH7 - PIN7 (analog). - * PH8 - PIN8 (analog). - * PH9 - PIN9 (analog). - * PH10 - PIN10 (analog). - * PH11 - PIN11 (analog). - * PH12 - PIN12 (analog). - * PH13 - PIN13 (analog). - * PH14 - PIN14 (analog). - * PH15 - PIN15 (analog). - */ -#define VAL_GPIOH_MODER (PIN_MODE_ANALOG(GPIOH_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOH_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOH_PIN2) | \ - PIN_MODE_ANALOG(GPIOH_PIN3) | \ - PIN_MODE_ANALOG(GPIOH_PIN4) | \ - PIN_MODE_ANALOG(GPIOH_PIN5) | \ - PIN_MODE_ANALOG(GPIOH_PIN6) | \ - PIN_MODE_ANALOG(GPIOH_PIN7) | \ - PIN_MODE_ANALOG(GPIOH_PIN8) | \ - PIN_MODE_ANALOG(GPIOH_PIN9) | \ - PIN_MODE_ANALOG(GPIOH_PIN10) | \ - PIN_MODE_ANALOG(GPIOH_PIN11) | \ - PIN_MODE_ANALOG(GPIOH_PIN12) | \ - PIN_MODE_ANALOG(GPIOH_PIN13) | \ - PIN_MODE_ANALOG(GPIOH_PIN14) | \ - PIN_MODE_ANALOG(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/BOARD_TEMPLATE_F4/board.mk b/boards/BOARD_TEMPLATE_F4/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/BOARD_TEMPLATE_F4/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/BOARD_TEMPLATE_F4/gdboocd.cmd b/boards/BOARD_TEMPLATE_F4/gdboocd.cmd deleted file mode 100644 index ac017d4e..00000000 --- a/boards/BOARD_TEMPLATE_F4/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/BOARD_TEMPLATE_F4/oocd.cfg b/boards/BOARD_TEMPLATE_F4/oocd.cfg deleted file mode 100644 index d44f8d8f..00000000 --- a/boards/BOARD_TEMPLATE_F4/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f4x.cfg] - diff --git a/boards/BOARD_TEMPLATE_L4/board.c b/boards/BOARD_TEMPLATE_L4/board.c deleted file mode 100644 index 274c5b8c..00000000 --- a/boards/BOARD_TEMPLATE_L4/board.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; - uint32_t ascr; - uint32_t lockr; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH, VAL_GPIOA_ASCR, - VAL_GPIOA_LOCKR}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH, VAL_GPIOB_ASCR, - VAL_GPIOB_LOCKR}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH, VAL_GPIOC_ASCR, - VAL_GPIOC_LOCKR}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH, VAL_GPIOD_ASCR, - VAL_GPIOD_LOCKR}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH, VAL_GPIOE_ASCR, - VAL_GPIOE_LOCKR}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH, VAL_GPIOF_ASCR, - VAL_GPIOF_LOCKR}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH, VAL_GPIOG_ASCR, - VAL_GPIOG_LOCKR}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH, VAL_GPIOH_ASCR, - VAL_GPIOH_LOCKR}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH, VAL_GPIOI_ASCR, - VAL_GPIOI_LOCKR}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH, VAL_GPIOJ_ASCR, - VAL_GPIOJ_LOCKR}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH, VAL_GPIOK_ASCR, - VAL_GPIOK_LOCKR} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->ASCR = config->ascr; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; - gpiop->LOCKR = config->lockr; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB2(STM32_GPIO_EN_MASK); - rccEnableAHB2(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/BOARD_TEMPLATE_L4/board.h b/boards/BOARD_TEMPLATE_L4/board.h deleted file mode 100644 index 9790b81b..00000000 --- a/boards/BOARD_TEMPLATE_L4/board.h +++ /dev/null @@ -1,1452 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Board description - * PART: PART_NUM - * PACKAGE: PACKAGE - */ - -/* - * Board identifier. - */ -#define BOARD_TEMPLATE_L4 -#define BOARD_NAME "Board name" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32L452xx - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_PIN1 1U -#define GPIOA_PIN2 2U -#define GPIOA_PIN3 3U -#define GPIOA_PIN4 4U -#define GPIOA_PIN5 5U -#define GPIOA_PIN6 6U -#define GPIOA_PIN7 7U -#define GPIOA_PIN8 8U -#define GPIOA_PIN9 9U -#define GPIOA_PIN10 10U -#define GPIOA_PIN11 11U -#define GPIOA_PIN12 12U -#define GPIOA_PIN13 13U -#define GPIOA_PIN14 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_PIN3 3U -#define GPIOB_PIN4 4U -#define GPIOB_PIN5 5U -#define GPIOB_PIN6 6U -#define GPIOB_PIN7 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_PIN1 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -//#define LINE_PIN0 PAL_LINE(GPIOA, 0U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) -#define PIN_ASCR_DISABLED(n) (0U << (n)) -#define PIN_ASCR_ENABLED(n) (1U << (n)) -#define PIN_LOCKR_DISABLED(n) (0U << (n)) -#define PIN_LOCKR_ENABLED(n) (1U << (n)) - -/* - * GPIOA setup: - * - * PA0 - PIN0 (analog). - * PA1 - PIN1 (analog). - * PA2 - PIN2 (analog). - * PA3 - PIN3 (analog). - * PA4 - PIN4 (analog). - * PA5 - PIN5 (analog). - * PA6 - PIN6 (analog). - * PA7 - PIN7 (analog). - * PA8 - PIN8 (analog). - * PA9 - PIN9 (analog). - * PA10 - PIN10 (analog). - * PA11 - PIN11 (analog). - * PA12 - PIN12 (analog). - * PA13 - PIN13 (analog). - * PA14 - PIN14 (analog). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_PIN0) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ANALOG(GPIOA_PIN2) | \ - PIN_MODE_ANALOG(GPIOA_PIN3) | \ - PIN_MODE_ANALOG(GPIOA_PIN4) | \ - PIN_MODE_ANALOG(GPIOA_PIN5) | \ - PIN_MODE_ANALOG(GPIOA_PIN6) | \ - PIN_MODE_ANALOG(GPIOA_PIN7) | \ - PIN_MODE_ANALOG(GPIOA_PIN8) | \ - PIN_MODE_ANALOG(GPIOA_PIN9) | \ - PIN_MODE_ANALOG(GPIOA_PIN10) | \ - PIN_MODE_ANALOG(GPIOA_PIN11) | \ - PIN_MODE_ANALOG(GPIOA_PIN12) | \ - PIN_MODE_ANALOG(GPIOA_PIN13) | \ - PIN_MODE_ANALOG(GPIOA_PIN14) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_PIN0) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_PIN2) | \ - PIN_OSPEED_HIGH(GPIOA_PIN3) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_PIN5) | \ - PIN_OSPEED_HIGH(GPIOA_PIN6) | \ - PIN_OSPEED_HIGH(GPIOA_PIN7) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_PIN9) | \ - PIN_OSPEED_HIGH(GPIOA_PIN10) | \ - PIN_OSPEED_HIGH(GPIOA_PIN11) | \ - PIN_OSPEED_HIGH(GPIOA_PIN12) | \ - PIN_OSPEED_HIGH(GPIOA_PIN13) | \ - PIN_OSPEED_HIGH(GPIOA_PIN14) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_PIN7) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_HIGH(GPIOA_PIN9) | \ - PIN_ODR_HIGH(GPIOA_PIN10) | \ - PIN_ODR_HIGH(GPIOA_PIN11) | \ - PIN_ODR_HIGH(GPIOA_PIN12) | \ - PIN_ODR_HIGH(GPIOA_PIN13) | \ - PIN_ODR_HIGH(GPIOA_PIN14) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN7, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) -#define VAL_GPIOA_ASCR (PIN_ASCR_DISABLED(GPIOA_PIN0) | \ - PIN_ASCR_DISABLED(GPIOA_PIN1) | \ - PIN_ASCR_DISABLED(GPIOA_PIN2) | \ - PIN_ASCR_DISABLED(GPIOA_PIN3) | \ - PIN_ASCR_DISABLED(GPIOA_PIN4) | \ - PIN_ASCR_DISABLED(GPIOA_PIN5) | \ - PIN_ASCR_DISABLED(GPIOA_PIN6) | \ - PIN_ASCR_DISABLED(GPIOA_PIN7) | \ - PIN_ASCR_DISABLED(GPIOA_PIN8) | \ - PIN_ASCR_DISABLED(GPIOA_PIN9) | \ - PIN_ASCR_DISABLED(GPIOA_PIN10) | \ - PIN_ASCR_DISABLED(GPIOA_PIN11) | \ - PIN_ASCR_DISABLED(GPIOA_PIN12) | \ - PIN_ASCR_DISABLED(GPIOA_PIN13) | \ - PIN_ASCR_DISABLED(GPIOA_PIN14) | \ - PIN_ASCR_DISABLED(GPIOA_PIN15)) -#define VAL_GPIOA_LOCKR (PIN_LOCKR_DISABLED(GPIOA_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN15)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - PIN1 (analog). - * PB2 - PIN2 (analog). - * PB3 - PIN3 (analog). - * PB4 - PIN4 (analog). - * PB5 - PIN5 (analog). - * PB6 - PIN6 (analog). - * PB7 - PIN7 (analog). - * PB8 - PIN8 (analog). - * PB9 - PIN9 (analog). - * PB10 - PIN10 (analog). - * PB11 - PIN11 (analog). - * PB12 - PIN12 (analog). - * PB13 - PIN13 (analog). - * PB14 - PIN14 (analog). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN2) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_ANALOG(GPIOB_PIN4) | \ - PIN_MODE_ANALOG(GPIOB_PIN5) | \ - PIN_MODE_ANALOG(GPIOB_PIN6) | \ - PIN_MODE_ANALOG(GPIOB_PIN7) | \ - PIN_MODE_ANALOG(GPIOB_PIN8) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_ANALOG(GPIOB_PIN10) | \ - PIN_MODE_ANALOG(GPIOB_PIN11) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_ANALOG(GPIOB_PIN13) | \ - PIN_MODE_ANALOG(GPIOB_PIN14) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN4) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_PIN6) | \ - PIN_OSPEED_HIGH(GPIOB_PIN7) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_PIN6) | \ - PIN_ODR_HIGH(GPIOB_PIN7) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN7, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) -#define VAL_GPIOB_ASCR (PIN_ASCR_DISABLED(GPIOB_PIN0) | \ - PIN_ASCR_DISABLED(GPIOB_PIN1) | \ - PIN_ASCR_DISABLED(GPIOB_PIN2) | \ - PIN_ASCR_DISABLED(GPIOB_PIN3) | \ - PIN_ASCR_DISABLED(GPIOB_PIN4) | \ - PIN_ASCR_DISABLED(GPIOB_PIN5) | \ - PIN_ASCR_DISABLED(GPIOB_PIN6) | \ - PIN_ASCR_DISABLED(GPIOB_PIN7) | \ - PIN_ASCR_DISABLED(GPIOB_PIN8) | \ - PIN_ASCR_DISABLED(GPIOB_PIN9) | \ - PIN_ASCR_DISABLED(GPIOB_PIN10) | \ - PIN_ASCR_DISABLED(GPIOB_PIN11) | \ - PIN_ASCR_DISABLED(GPIOB_PIN12) | \ - PIN_ASCR_DISABLED(GPIOB_PIN13) | \ - PIN_ASCR_DISABLED(GPIOB_PIN14) | \ - PIN_ASCR_DISABLED(GPIOB_PIN15)) -#define VAL_GPIOB_LOCKR (PIN_LOCKR_DISABLED(GPIOB_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN15)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - PIN14 (analog). - * PC15 - PIN15 (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_PIN14) | \ - PIN_MODE_ANALOG(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) -#define VAL_GPIOC_ASCR (PIN_ASCR_DISABLED(GPIOC_PIN0) | \ - PIN_ASCR_DISABLED(GPIOC_PIN1) | \ - PIN_ASCR_DISABLED(GPIOC_PIN2) | \ - PIN_ASCR_DISABLED(GPIOC_PIN3) | \ - PIN_ASCR_DISABLED(GPIOC_PIN4) | \ - PIN_ASCR_DISABLED(GPIOC_PIN5) | \ - PIN_ASCR_DISABLED(GPIOC_PIN6) | \ - PIN_ASCR_DISABLED(GPIOC_PIN7) | \ - PIN_ASCR_DISABLED(GPIOC_PIN8) | \ - PIN_ASCR_DISABLED(GPIOC_PIN9) | \ - PIN_ASCR_DISABLED(GPIOC_PIN10) | \ - PIN_ASCR_DISABLED(GPIOC_PIN11) | \ - PIN_ASCR_DISABLED(GPIOC_PIN12) | \ - PIN_ASCR_DISABLED(GPIOC_PIN13) | \ - PIN_ASCR_DISABLED(GPIOC_PIN14) | \ - PIN_ASCR_DISABLED(GPIOC_PIN15)) -#define VAL_GPIOC_LOCKR (PIN_LOCKR_DISABLED(GPIOC_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN15)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) -#define VAL_GPIOD_ASCR (PIN_ASCR_DISABLED(GPIOD_PIN0) | \ - PIN_ASCR_DISABLED(GPIOD_PIN1) | \ - PIN_ASCR_DISABLED(GPIOD_PIN2) | \ - PIN_ASCR_DISABLED(GPIOD_PIN3) | \ - PIN_ASCR_DISABLED(GPIOD_PIN4) | \ - PIN_ASCR_DISABLED(GPIOD_PIN5) | \ - PIN_ASCR_DISABLED(GPIOD_PIN6) | \ - PIN_ASCR_DISABLED(GPIOD_PIN7) | \ - PIN_ASCR_DISABLED(GPIOD_PIN8) | \ - PIN_ASCR_DISABLED(GPIOD_PIN9) | \ - PIN_ASCR_DISABLED(GPIOD_PIN10) | \ - PIN_ASCR_DISABLED(GPIOD_PIN11) | \ - PIN_ASCR_DISABLED(GPIOD_PIN12) | \ - PIN_ASCR_DISABLED(GPIOD_PIN13) | \ - PIN_ASCR_DISABLED(GPIOD_PIN14) | \ - PIN_ASCR_DISABLED(GPIOD_PIN15)) -#define VAL_GPIOD_LOCKR (PIN_LOCKR_DISABLED(GPIOD_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN15)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) -#define VAL_GPIOE_ASCR (PIN_ASCR_DISABLED(GPIOE_PIN0) | \ - PIN_ASCR_DISABLED(GPIOE_PIN1) | \ - PIN_ASCR_DISABLED(GPIOE_PIN2) | \ - PIN_ASCR_DISABLED(GPIOE_PIN3) | \ - PIN_ASCR_DISABLED(GPIOE_PIN4) | \ - PIN_ASCR_DISABLED(GPIOE_PIN5) | \ - PIN_ASCR_DISABLED(GPIOE_PIN6) | \ - PIN_ASCR_DISABLED(GPIOE_PIN7) | \ - PIN_ASCR_DISABLED(GPIOE_PIN8) | \ - PIN_ASCR_DISABLED(GPIOE_PIN9) | \ - PIN_ASCR_DISABLED(GPIOE_PIN10) | \ - PIN_ASCR_DISABLED(GPIOE_PIN11) | \ - PIN_ASCR_DISABLED(GPIOE_PIN12) | \ - PIN_ASCR_DISABLED(GPIOE_PIN13) | \ - PIN_ASCR_DISABLED(GPIOE_PIN14) | \ - PIN_ASCR_DISABLED(GPIOE_PIN15)) -#define VAL_GPIOE_LOCKR (PIN_LOCKR_DISABLED(GPIOE_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN15)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (analog). - * PF1 - PIN1 (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_PIN0) | \ - PIN_MODE_ANALOG(GPIOF_PIN1) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) -#define VAL_GPIOF_ASCR (PIN_ASCR_DISABLED(GPIOF_PIN0) | \ - PIN_ASCR_DISABLED(GPIOF_PIN1) | \ - PIN_ASCR_DISABLED(GPIOF_PIN2) | \ - PIN_ASCR_DISABLED(GPIOF_PIN3) | \ - PIN_ASCR_DISABLED(GPIOF_PIN4) | \ - PIN_ASCR_DISABLED(GPIOF_PIN5) | \ - PIN_ASCR_DISABLED(GPIOF_PIN6) | \ - PIN_ASCR_DISABLED(GPIOF_PIN7) | \ - PIN_ASCR_DISABLED(GPIOF_PIN8) | \ - PIN_ASCR_DISABLED(GPIOF_PIN9) | \ - PIN_ASCR_DISABLED(GPIOF_PIN10) | \ - PIN_ASCR_DISABLED(GPIOF_PIN11) | \ - PIN_ASCR_DISABLED(GPIOF_PIN12) | \ - PIN_ASCR_DISABLED(GPIOF_PIN13) | \ - PIN_ASCR_DISABLED(GPIOF_PIN14) | \ - PIN_ASCR_DISABLED(GPIOF_PIN15)) -#define VAL_GPIOF_LOCKR (PIN_LOCKR_DISABLED(GPIOF_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN15)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOG_MODER (PIN_MODE_ANALOG(GPIOG_PIN0) | \ - PIN_MODE_ANALOG(GPIOG_PIN1) | \ - PIN_MODE_ANALOG(GPIOG_PIN2) | \ - PIN_MODE_ANALOG(GPIOG_PIN3) | \ - PIN_MODE_ANALOG(GPIOG_PIN4) | \ - PIN_MODE_ANALOG(GPIOG_PIN5) | \ - PIN_MODE_ANALOG(GPIOG_PIN6) | \ - PIN_MODE_ANALOG(GPIOG_PIN7) | \ - PIN_MODE_ANALOG(GPIOG_PIN8) | \ - PIN_MODE_ANALOG(GPIOG_PIN9) | \ - PIN_MODE_ANALOG(GPIOG_PIN10) | \ - PIN_MODE_ANALOG(GPIOG_PIN11) | \ - PIN_MODE_ANALOG(GPIOG_PIN12) | \ - PIN_MODE_ANALOG(GPIOG_PIN13) | \ - PIN_MODE_ANALOG(GPIOG_PIN14) | \ - PIN_MODE_ANALOG(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) -#define VAL_GPIOG_ASCR (PIN_ASCR_DISABLED(GPIOG_PIN0) | \ - PIN_ASCR_DISABLED(GPIOG_PIN1) | \ - PIN_ASCR_DISABLED(GPIOG_PIN2) | \ - PIN_ASCR_DISABLED(GPIOG_PIN3) | \ - PIN_ASCR_DISABLED(GPIOG_PIN4) | \ - PIN_ASCR_DISABLED(GPIOG_PIN5) | \ - PIN_ASCR_DISABLED(GPIOG_PIN6) | \ - PIN_ASCR_DISABLED(GPIOG_PIN7) | \ - PIN_ASCR_DISABLED(GPIOG_PIN8) | \ - PIN_ASCR_DISABLED(GPIOG_PIN9) | \ - PIN_ASCR_DISABLED(GPIOG_PIN10) | \ - PIN_ASCR_DISABLED(GPIOG_PIN11) | \ - PIN_ASCR_DISABLED(GPIOG_PIN12) | \ - PIN_ASCR_DISABLED(GPIOG_PIN13) | \ - PIN_ASCR_DISABLED(GPIOG_PIN14) | \ - PIN_ASCR_DISABLED(GPIOG_PIN15)) -#define VAL_GPIOG_LOCKR (PIN_LOCKR_DISABLED(GPIOG_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN15)) - -/* - * GPIOH setup: - * - * PH0 - PIN0 (analog). - * PH1 - PIN1 (analog). - * PH2 - PIN2 (analog). - * PH3 - PIN3 (analog). - * PH4 - PIN4 (analog). - * PH5 - PIN5 (analog). - * PH6 - PIN6 (analog). - * PH7 - PIN7 (analog). - * PH8 - PIN8 (analog). - * PH9 - PIN9 (analog). - * PH10 - PIN10 (analog). - * PH11 - PIN11 (analog). - * PH12 - PIN12 (analog). - * PH13 - PIN13 (analog). - * PH14 - PIN14 (analog). - * PH15 - PIN15 (analog). - */ -#define VAL_GPIOH_MODER (PIN_MODE_ANALOG(GPIOH_PIN0) | \ - PIN_MODE_ANALOG(GPIOH_PIN1) | \ - PIN_MODE_ANALOG(GPIOH_PIN2) | \ - PIN_MODE_ANALOG(GPIOH_PIN3) | \ - PIN_MODE_ANALOG(GPIOH_PIN4) | \ - PIN_MODE_ANALOG(GPIOH_PIN5) | \ - PIN_MODE_ANALOG(GPIOH_PIN6) | \ - PIN_MODE_ANALOG(GPIOH_PIN7) | \ - PIN_MODE_ANALOG(GPIOH_PIN8) | \ - PIN_MODE_ANALOG(GPIOH_PIN9) | \ - PIN_MODE_ANALOG(GPIOH_PIN10) | \ - PIN_MODE_ANALOG(GPIOH_PIN11) | \ - PIN_MODE_ANALOG(GPIOH_PIN12) | \ - PIN_MODE_ANALOG(GPIOH_PIN13) | \ - PIN_MODE_ANALOG(GPIOH_PIN14) | \ - PIN_MODE_ANALOG(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_PIN0) | \ - PIN_OSPEED_HIGH(GPIOH_PIN1) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | \ - PIN_ODR_HIGH(GPIOH_PIN1) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) -#define VAL_GPIOH_ASCR (PIN_ASCR_DISABLED(GPIOH_PIN0) | \ - PIN_ASCR_DISABLED(GPIOH_PIN1) | \ - PIN_ASCR_DISABLED(GPIOH_PIN2) | \ - PIN_ASCR_DISABLED(GPIOH_PIN3) | \ - PIN_ASCR_DISABLED(GPIOH_PIN4) | \ - PIN_ASCR_DISABLED(GPIOH_PIN5) | \ - PIN_ASCR_DISABLED(GPIOH_PIN6) | \ - PIN_ASCR_DISABLED(GPIOH_PIN7) | \ - PIN_ASCR_DISABLED(GPIOH_PIN8) | \ - PIN_ASCR_DISABLED(GPIOH_PIN9) | \ - PIN_ASCR_DISABLED(GPIOH_PIN10) | \ - PIN_ASCR_DISABLED(GPIOH_PIN11) | \ - PIN_ASCR_DISABLED(GPIOH_PIN12) | \ - PIN_ASCR_DISABLED(GPIOH_PIN13) | \ - PIN_ASCR_DISABLED(GPIOH_PIN14) | \ - PIN_ASCR_DISABLED(GPIOH_PIN15)) -#define VAL_GPIOH_LOCKR (PIN_LOCKR_DISABLED(GPIOH_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN15)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/BOARD_TEMPLATE_L4/board.mk b/boards/BOARD_TEMPLATE_L4/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/BOARD_TEMPLATE_L4/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/BOARD_TEMPLATE_L4/gdboocd.cmd b/boards/BOARD_TEMPLATE_L4/gdboocd.cmd deleted file mode 100644 index d386b739..00000000 --- a/boards/BOARD_TEMPLATE_L4/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32l4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/BOARD_TEMPLATE_L4/oocd.cfg b/boards/BOARD_TEMPLATE_L4/oocd.cfg deleted file mode 100644 index 7f81f2b4..00000000 --- a/boards/BOARD_TEMPLATE_L4/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32l4x.cfg] - diff --git a/boards/ORESAT_ACS_V4/board.c b/boards/ORESAT_ACS_V4/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/ORESAT_ACS_V4/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ORESAT_ACS_V4/board.h b/boards/ORESAT_ACS_V4/board.h deleted file mode 100644 index cb918c1e..00000000 --- a/boards/ORESAT_ACS_V4/board.h +++ /dev/null @@ -1,967 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * OreSat ACS V4 Board Configuration - * PART: STM32F091CC - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_ORESAT_ACS_V4 -#define BOARD_NAME "OreSat ACS v4.x" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F091xC - -/* - * IO pins assignments. - */ -#define GPIOA_LED 0U -#define GPIOA_PIN1 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_PIN4 4U -#define GPIOA_PIN5 5U -#define GPIOA_PIN6 6U -#define GPIOA_PIN7 7U -#define GPIOA_POUTPROT 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_MAG_FAULT 3U -#define GPIOB_MAG_EN 4U -#define GPIOB_MAG_READY 5U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_IMU_INT1 12U -#define GPIOB_IMU_INT2 13U -#define GPIOB_IMU_INT4 14U -#define GPIOB_IMU_INT3 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_BOOT0 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_PIN1 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 0U) -#define LINE_CAN_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN_SHDN PAL_LINE(GPIOA, 10U) -#define LINE_MAG_FAULT PAL_LINE(GPIOB, 3U) -#define LINE_MAG_EN PAL_LINE(GPIOB, 4U) -#define LINE_MAG_READY PAL_LINE(GPIOB, 5U) -#define LINE_IMU_INT1 PAL_LINE(GPIOB, 12U) -#define LINE_IMU_INT2 PAL_LINE(GPIOB, 13U) -#define LINE_IMU_INT4 PAL_LINE(GPIOB, 14U) -#define LINE_IMU_INT3 PAL_LINE(GPIOB, 15U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - LED (output pushpull). - * PA1 - PIN1 (analog). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - PIN4 (analog). - * PA5 - PIN5 (analog). - * PA6 - PIN6 (analog). - * PA7 - PIN7 (analog). - * PA8 - POUTPROT (analog). - * PA9 - CAN_SILENT (output pulldown). - * PA10 - CAN_SHDN (output pulldown). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_LED) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_ANALOG(GPIOA_PIN4) | \ - PIN_MODE_ANALOG(GPIOA_PIN5) | \ - PIN_MODE_ANALOG(GPIOA_PIN6) | \ - PIN_MODE_ANALOG(GPIOA_PIN7) | \ - PIN_MODE_ANALOG(GPIOA_POUTPROT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_LED) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOA_POUTPROT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_LED) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_PIN5) | \ - PIN_OSPEED_HIGH(GPIOA_PIN6) | \ - PIN_OSPEED_HIGH(GPIOA_PIN7) | \ - PIN_OSPEED_HIGH(GPIOA_POUTPROT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLDOWN(GPIOA_LED) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOA_POUTPROT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_LOW(GPIOA_LED) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_PIN7) | \ - PIN_ODR_HIGH(GPIOA_POUTPROT) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_LED, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN7, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_POUTPROT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - PIN1 (analog). - * PB2 - PIN2 (analog). - * PB3 - MAG_FAULT (input). - * PB4 - MAG_EN (output). - * PB5 - MAG_READY (input). - * PB6 - I2C1_SCL (alternate 1). - * PB7 - I2C1_SDA (alternate 1). - * PB8 - PIN8 (analog). - * PB9 - PIN9 (analog). - * PB10 - PIN10 (analog). - * PB11 - PIN11 (analog). - * PB12 - IMU_INT1 (input). - * PB13 - IMU_INT2 (input). - * PB14 - IMU_INT4 (input). - * PB15 - IMU_INT3 (input). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN2) | \ - PIN_MODE_INPUT(GPIOB_MAG_FAULT) | \ - PIN_MODE_OUTPUT(GPIOB_MAG_EN) | \ - PIN_MODE_INPUT(GPIOB_MAG_READY) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ANALOG(GPIOB_PIN8) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_ANALOG(GPIOB_PIN10) | \ - PIN_MODE_ANALOG(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_IMU_INT1) | \ - PIN_MODE_INPUT(GPIOB_IMU_INT2) | \ - PIN_MODE_INPUT(GPIOB_IMU_INT4) | \ - PIN_MODE_INPUT(GPIOB_IMU_INT3)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MAG_FAULT) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MAG_EN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MAG_READY) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_IMU_INT1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_IMU_INT2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_IMU_INT4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_IMU_INT3)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_MAG_FAULT) | \ - PIN_OSPEED_HIGH(GPIOB_MAG_EN) | \ - PIN_OSPEED_HIGH(GPIOB_MAG_READY) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_IMU_INT1) | \ - PIN_OSPEED_HIGH(GPIOB_IMU_INT2) | \ - PIN_OSPEED_HIGH(GPIOB_IMU_INT4) | \ - PIN_OSPEED_HIGH(GPIOB_IMU_INT3)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_MAG_FAULT) | \ - PIN_PUPDR_FLOATING(GPIOB_MAG_EN) | \ - PIN_PUPDR_FLOATING(GPIOB_MAG_READY) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_IMU_INT1) | \ - PIN_PUPDR_FLOATING(GPIOB_IMU_INT2) | \ - PIN_PUPDR_FLOATING(GPIOB_IMU_INT4) | \ - PIN_PUPDR_FLOATING(GPIOB_IMU_INT3)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_MAG_FAULT) | \ - PIN_ODR_HIGH(GPIOB_MAG_EN) | \ - PIN_ODR_HIGH(GPIOB_MAG_READY) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_IMU_INT1) | \ - PIN_ODR_HIGH(GPIOB_IMU_INT2) | \ - PIN_ODR_HIGH(GPIOB_IMU_INT4) | \ - PIN_ODR_HIGH(GPIOB_IMU_INT3)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_MAG_FAULT, 0U) | \ - PIN_AFIO_AF(GPIOB_MAG_EN, 0U) | \ - PIN_AFIO_AF(GPIOB_MAG_READY, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_IMU_INT1, 0U) | \ - PIN_AFIO_AF(GPIOB_IMU_INT2, 0U) | \ - PIN_AFIO_AF(GPIOB_IMU_INT4, 0U) | \ - PIN_AFIO_AF(GPIOB_IMU_INT3, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - PIN14 (analog). - * PC15 - PIN15 (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_PIN14) | \ - PIN_MODE_ANALOG(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (analog). - * PF1 - OSC_OUT (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - BOOT0 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOF_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_BOOT0) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_BOOT0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_BOOT0) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ORESAT_ACS_V4/board.mk b/boards/ORESAT_ACS_V4/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ORESAT_ACS_V4/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ORESAT_ACS_V4/gdboocd.cmd b/boards/ORESAT_ACS_V4/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/ORESAT_ACS_V4/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ORESAT_ACS_V4/oocd.cfg b/boards/ORESAT_ACS_V4/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/ORESAT_ACS_V4/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/ORESAT_C3_V1/board.c b/boards/ORESAT_C3_V1/board.c deleted file mode 100644 index 5f49a349..00000000 --- a/boards/ORESAT_C3_V1/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB1(STM32_GPIO_EN_MASK); - rccEnableAHB1(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ORESAT_C3_V1/board.h b/boards/ORESAT_C3_V1/board.h deleted file mode 100644 index 0062bd99..00000000 --- a/boards/ORESAT_C3_V1/board.h +++ /dev/null @@ -1,1346 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * OreSat C3 Prototype Board - * PART: STM32F446RE - * PACKAGE: QFP64 - */ - -/* - * Board identifier. - */ -#define ORESAT_C3_V1 -#define BOARD_NAME "OreSat C3 v1" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300U - -/* #define STM32_HSE_BYPASS */ - -/* - * Board voltages. - * Required for performance limits calculation. - */ -/* #define STM32_VDD 300U */ - -/* - * MCU type as defined in the ST header. - */ -#define STM32F446xx - -/* - * IO pins assignments. - */ -#define GPIOA_WDT 0U -#define GPIOA_PIN1 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_RADIO1_IRQ 4U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_SPI1_MOSI 7U -#define GPIOA_RADIO2_IRQ 8U -#define GPIOA_CAN1_SILENT 9U -#define GPIOA_CAN1_SHDN 10U -#define GPIOA_CAN1_RX 11U -#define GPIOA_CAN1_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_CB_IOUT 0U -#define GPIOB_OPD_ISET 1U -#define GPIOB_OPD_ENABLE 2U -#define GPIOB_OPD_FAULT 3U -#define GPIOB_CAN2_SHDN 4U -#define GPIOB_CAN2_RX 5U -#define GPIOB_CAN2_TX 6U -#define GPIOB_CAN2_SILENT 7U -#define GPIOB_I2C1_SCL 8U -#define GPIOB_I2C1_SDA 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_SPI2_SCK 13U -#define GPIOB_SPI2_MISO 14U -#define GPIOB_SPI2_MOSI 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_RADIO1_CS 6U -#define GPIOC_RADIO2_CS 7U -#define GPIOC_SDIO_D0 8U -#define GPIOC_SDIO_D1 9U -#define GPIOC_SDIO_D2 10U -#define GPIOC_SDIO_D3 11U -#define GPIOC_SDIO_CK 12U -#define GPIOC_MMC_PWR 13U -#define GPIOC_OSC32_IN 14U -#define GPIOC_OSC32_OUT 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_SDIO_CMD 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_OSC_IN 0U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -#define GPIOI_PIN0 0U -#define GPIOI_PIN1 1U -#define GPIOI_PIN2 2U -#define GPIOI_PIN3 3U -#define GPIOI_PIN4 4U -#define GPIOI_PIN5 5U -#define GPIOI_PIN6 6U -#define GPIOI_PIN7 7U -#define GPIOI_PIN8 8U -#define GPIOI_PIN9 9U -#define GPIOI_PIN10 10U -#define GPIOI_PIN11 11U -#define GPIOI_PIN12 12U -#define GPIOI_PIN13 13U -#define GPIOI_PIN14 14U -#define GPIOI_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_WDT PAL_LINE(GPIOA, 0U) -#define LINE_CAN1_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN1_SHDN PAL_LINE(GPIOA, 10U) -#define LINE_OPD_ENABLE PAL_LINE(GPIOB, 2U) -#define LINE_CAN2_SHDN PAL_LINE(GPIOB, 4U) -#define LINE_CAN2_SILENT PAL_LINE(GPIOB, 7U) -#define LINE_RADIO1_CS PAL_LINE(GPIOC, 6U) -#define LINE_RADIO2_CS PAL_LINE(GPIOC, 7U) -#define LINE_MMC_PWR PAL_LINE(GPIOC, 13U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - WDT (output pushpull maximum). - * PA1 - PIN1 (input pullup). - * PA2 - USART2_TX (alternate 7). - * PA3 - USART2_RX (alternate 7). - * PA4 - RADIO1_IRQ (input pullup). - * PA5 - SPI1_SCK (alternate 5). - * PA6 - SPI1_MISO (alternate 5). - * PA7 - SPI1_MOSI (alternate 5). - * PA8 - RADIO2_IRQ (input pullup). - * PA9 - CAN1_SILENT (output pushpull maximum). - * PA10 - CAN1_SHDN (output pushpull maximum). - * PA11 - CAN1_RX (alternate 9). - * PA12 - CAN1_TX (alternate 9). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (input pullup). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_WDT) | \ - PIN_MODE_INPUT(GPIOA_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_INPUT(GPIOA_RADIO1_IRQ) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_INPUT(GPIOA_RADIO2_IRQ) | \ - PIN_MODE_OUTPUT(GPIOA_CAN1_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN1_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_INPUT(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_WDT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_RADIO1_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_RADIO2_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_SILENT) |\ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_WDT) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_RADIO1_IRQ) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOA_RADIO2_IRQ) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLUP(GPIOA_WDT) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_RADIO1_IRQ) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_MOSI) | \ - PIN_PUPDR_PULLUP(GPIOA_RADIO2_IRQ) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN1_SILENT) |\ - PIN_PUPDR_PULLDOWN(GPIOA_CAN1_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN1_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN1_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_WDT) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_RADIO1_IRQ) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_ODR_HIGH(GPIOA_RADIO2_IRQ) | \ - PIN_ODR_LOW(GPIOA_CAN1_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN1_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN1_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN1_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_WDT, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 7U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 7U) | \ - PIN_AFIO_AF(GPIOA_RADIO1_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 5U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_RADIO2_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_RX, 9U) | \ - PIN_AFIO_AF(GPIOA_CAN1_TX, 9U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - CB_IOUT (analog). - * PB1 - OPD_ISET (analog). - * PB2 - OPD_ENABLE (output pushpull maximum). - * PB3 - OPD_FAULT (input pullup). - * PB4 - CAN2_SHDN (output pushpull maximum). - * PB5 - CAN2_RX (alternate 9). - * PB6 - CAN2_TX (alternate 9). - * PB7 - CAN2_SILENT (output pushpull maximum). - * PB8 - I2C1_SCL (alternate 4). - * PB9 - I2C1_SDA (alternate 4). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - SPI2_SCK (alternate 5). - * PB14 - SPI2_MISO (alternate 5). - * PB15 - SPI2_MOSI (alternate 5). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_CB_IOUT) | \ - PIN_MODE_ANALOG(GPIOB_OPD_ISET) | \ - PIN_MODE_OUTPUT(GPIOB_OPD_ENABLE) | \ - PIN_MODE_INPUT(GPIOB_OPD_FAULT) | \ - PIN_MODE_OUTPUT(GPIOB_CAN2_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_RX) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_TX) | \ - PIN_MODE_OUTPUT(GPIOB_CAN2_SILENT) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_CB_IOUT) | \ - PIN_OTYPE_PUSHPULL(GPIOB_OPD_ISET) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_OPD_ENABLE) |\ - PIN_OTYPE_PUSHPULL(GPIOB_OPD_FAULT) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_SILENT) |\ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_CB_IOUT) | \ - PIN_OSPEED_HIGH(GPIOB_OPD_ISET) | \ - PIN_OSPEED_HIGH(GPIOB_OPD_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOB_OPD_FAULT) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_SHDN) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_RX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_TX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_SILENT) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_SPI2_SCK) | \ - PIN_OSPEED_HIGH(GPIOB_SPI2_MISO) | \ - PIN_OSPEED_HIGH(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_CB_IOUT) | \ - PIN_PUPDR_FLOATING(GPIOB_OPD_ISET) | \ - PIN_PUPDR_PULLUP(GPIOB_OPD_ENABLE) | \ - PIN_PUPDR_PULLUP(GPIOB_OPD_FAULT) | \ - PIN_PUPDR_PULLDOWN(GPIOB_CAN2_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOB_CAN2_RX) | \ - PIN_PUPDR_PULLUP(GPIOB_CAN2_TX) | \ - PIN_PUPDR_PULLDOWN(GPIOB_CAN2_SILENT) |\ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI2_SCK) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI2_MISO) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_CB_IOUT) | \ - PIN_ODR_HIGH(GPIOB_OPD_ISET) | \ - PIN_ODR_HIGH(GPIOB_OPD_ENABLE) | \ - PIN_ODR_HIGH(GPIOB_OPD_FAULT) | \ - PIN_ODR_LOW(GPIOB_CAN2_SHDN) | \ - PIN_ODR_HIGH(GPIOB_CAN2_RX) | \ - PIN_ODR_HIGH(GPIOB_CAN2_TX) | \ - PIN_ODR_LOW(GPIOB_CAN2_SILENT) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \ - PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \ - PIN_ODR_HIGH(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_CB_IOUT, 0U) | \ - PIN_AFIO_AF(GPIOB_OPD_ISET, 0U) | \ - PIN_AFIO_AF(GPIOB_OPD_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOB_OPD_FAULT, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_RX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_TX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_SILENT, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_I2C1_SCL, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 4U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_SPI2_SCK, 5U) | \ - PIN_AFIO_AF(GPIOB_SPI2_MISO, 5U) | \ - PIN_AFIO_AF(GPIOB_SPI2_MOSI, 5U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - RADIO1_CS (output pushpull maximum). - * PC7 - RADIO2_CS (output pushpull maximum). - * PC8 - SDIO_D0 (alternate 12). - * PC9 - SDIO_D1 (alternate 12). - * PC10 - SDIO_D2 (alternate 12). - * PC11 - SDIO_D3 (alternate 12). - * PC12 - SDIO_CK (alternate 12). - * PC13 - MMC_PWR (output pushpull maximum). - * PC14 - OSC32_IN (input floating). - * PC15 - OSC32_OUT (input floating). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_OUTPUT(GPIOC_RADIO1_CS) | \ - PIN_MODE_OUTPUT(GPIOC_RADIO2_CS) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D0) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D1) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D2) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D3) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_CK) | \ - PIN_MODE_OUTPUT(GPIOC_MMC_PWR) | \ - PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ - PIN_MODE_INPUT(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_RADIO1_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOC_RADIO2_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_CK) | \ - PIN_OTYPE_PUSHPULL(GPIOC_MMC_PWR) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_RADIO1_CS) | \ - PIN_OSPEED_HIGH(GPIOC_RADIO2_CS) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D0) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D1) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D2) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D3) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_CK) | \ - PIN_OSPEED_HIGH(GPIOC_MMC_PWR) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_RADIO1_CS) | \ - PIN_PUPDR_PULLUP(GPIOC_RADIO2_CS) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_D0) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_D1) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_D2) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_D3) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_CK) | \ - PIN_PUPDR_PULLUP(GPIOC_MMC_PWR) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_RADIO1_CS) | \ - PIN_ODR_HIGH(GPIOC_RADIO2_CS) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D0) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D1) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D2) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D3) | \ - PIN_ODR_HIGH(GPIOC_SDIO_CK) | \ - PIN_ODR_HIGH(GPIOC_MMC_PWR) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_RADIO1_CS, 0U) | \ - PIN_AFIO_AF(GPIOC_RADIO2_CS, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_SDIO_D0, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D1, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D2, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D3, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_CK, 12U) | \ - PIN_AFIO_AF(GPIOC_MMC_PWR, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - SDIO_CMD (alternate 12). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOD_SDIO_CMD) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_SDIO_CMD) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_SDIO_CMD) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_SDIO_CMD) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_SDIO_CMD) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_SDIO_CMD, 12U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (input pullup). - * PF1 - PIN1 (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_PIN0) | \ - PIN_MODE_INPUT(GPIOF_PIN1) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (input pullup). - * PG1 - PIN1 (input pullup). - * PG2 - PIN2 (input pullup). - * PG3 - PIN3 (input pullup). - * PG4 - PIN4 (input pullup). - * PG5 - PIN5 (input pullup). - * PG6 - PIN6 (input pullup). - * PG7 - PIN7 (input pullup). - * PG8 - PIN8 (input pullup). - * PG9 - PIN9 (input pullup). - * PG10 - PIN10 (input pullup). - * PG11 - PIN11 (input pullup). - * PG12 - PIN12 (input pullup). - * PG13 - PIN13 (input pullup). - * PG14 - PIN14 (input pullup). - * PG15 - PIN15 (input pullup). - */ -#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ - PIN_MODE_INPUT(GPIOG_PIN1) | \ - PIN_MODE_INPUT(GPIOG_PIN2) | \ - PIN_MODE_INPUT(GPIOG_PIN3) | \ - PIN_MODE_INPUT(GPIOG_PIN4) | \ - PIN_MODE_INPUT(GPIOG_PIN5) | \ - PIN_MODE_INPUT(GPIOG_PIN6) | \ - PIN_MODE_INPUT(GPIOG_PIN7) | \ - PIN_MODE_INPUT(GPIOG_PIN8) | \ - PIN_MODE_INPUT(GPIOG_PIN9) | \ - PIN_MODE_INPUT(GPIOG_PIN10) | \ - PIN_MODE_INPUT(GPIOG_PIN11) | \ - PIN_MODE_INPUT(GPIOG_PIN12) | \ - PIN_MODE_INPUT(GPIOG_PIN13) | \ - PIN_MODE_INPUT(GPIOG_PIN14) | \ - PIN_MODE_INPUT(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (input floating). - * PH1 - OSC_OUT (input floating). - * PH2 - PIN2 (input pullup). - * PH3 - PIN3 (input pullup). - * PH4 - PIN4 (input pullup). - * PH5 - PIN5 (input pullup). - * PH6 - PIN6 (input pullup). - * PH7 - PIN7 (input pullup). - * PH8 - PIN8 (input pullup). - * PH9 - PIN9 (input pullup). - * PH10 - PIN10 (input pullup). - * PH11 - PIN11 (input pullup). - * PH12 - PIN12 (input pullup). - * PH13 - PIN13 (input pullup). - * PH14 - PIN14 (input pullup). - * PH15 - PIN15 (input pullup). - */ -#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_OSC_IN) | \ - PIN_MODE_INPUT(GPIOH_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOH_PIN2) | \ - PIN_MODE_INPUT(GPIOH_PIN3) | \ - PIN_MODE_INPUT(GPIOH_PIN4) | \ - PIN_MODE_INPUT(GPIOH_PIN5) | \ - PIN_MODE_INPUT(GPIOH_PIN6) | \ - PIN_MODE_INPUT(GPIOH_PIN7) | \ - PIN_MODE_INPUT(GPIOH_PIN8) | \ - PIN_MODE_INPUT(GPIOH_PIN9) | \ - PIN_MODE_INPUT(GPIOH_PIN10) | \ - PIN_MODE_INPUT(GPIOH_PIN11) | \ - PIN_MODE_INPUT(GPIOH_PIN12) | \ - PIN_MODE_INPUT(GPIOH_PIN13) | \ - PIN_MODE_INPUT(GPIOH_PIN14) | \ - PIN_MODE_INPUT(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) - -/* - * GPIOI setup: - * - * PI0 - PIN0 (input pullup). - * PI1 - PIN1 (input pullup). - * PI2 - PIN2 (input pullup). - * PI3 - PIN3 (input pullup). - * PI4 - PIN4 (input pullup). - * PI5 - PIN5 (input pullup). - * PI6 - PIN6 (input pullup). - * PI7 - PIN7 (input pullup). - * PI8 - PIN8 (input pullup). - * PI9 - PIN9 (input pullup). - * PI10 - PIN10 (input pullup). - * PI11 - PIN11 (input pullup). - * PI12 - PIN12 (input pullup). - * PI13 - PIN13 (input pullup). - * PI14 - PIN14 (input pullup). - * PI15 - PIN15 (input pullup). - */ -#define VAL_GPIOI_MODER (PIN_MODE_INPUT(GPIOI_PIN0) | \ - PIN_MODE_INPUT(GPIOI_PIN1) | \ - PIN_MODE_INPUT(GPIOI_PIN2) | \ - PIN_MODE_INPUT(GPIOI_PIN3) | \ - PIN_MODE_INPUT(GPIOI_PIN4) | \ - PIN_MODE_INPUT(GPIOI_PIN5) | \ - PIN_MODE_INPUT(GPIOI_PIN6) | \ - PIN_MODE_INPUT(GPIOI_PIN7) | \ - PIN_MODE_INPUT(GPIOI_PIN8) | \ - PIN_MODE_INPUT(GPIOI_PIN9) | \ - PIN_MODE_INPUT(GPIOI_PIN10) | \ - PIN_MODE_INPUT(GPIOI_PIN11) | \ - PIN_MODE_INPUT(GPIOI_PIN12) | \ - PIN_MODE_INPUT(GPIOI_PIN13) | \ - PIN_MODE_INPUT(GPIOI_PIN14) | \ - PIN_MODE_INPUT(GPIOI_PIN15)) -#define VAL_GPIOI_OTYPER (PIN_OTYPE_PUSHPULL(GPIOI_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN15)) -#define VAL_GPIOI_OSPEEDR (PIN_OSPEED_HIGH(GPIOI_PIN0) | \ - PIN_OSPEED_HIGH(GPIOI_PIN1) | \ - PIN_OSPEED_HIGH(GPIOI_PIN2) | \ - PIN_OSPEED_HIGH(GPIOI_PIN3) | \ - PIN_OSPEED_HIGH(GPIOI_PIN4) | \ - PIN_OSPEED_HIGH(GPIOI_PIN5) | \ - PIN_OSPEED_HIGH(GPIOI_PIN6) | \ - PIN_OSPEED_HIGH(GPIOI_PIN7) | \ - PIN_OSPEED_HIGH(GPIOI_PIN8) | \ - PIN_OSPEED_HIGH(GPIOI_PIN9) | \ - PIN_OSPEED_HIGH(GPIOI_PIN10) | \ - PIN_OSPEED_HIGH(GPIOI_PIN11) | \ - PIN_OSPEED_HIGH(GPIOI_PIN12) | \ - PIN_OSPEED_HIGH(GPIOI_PIN13) | \ - PIN_OSPEED_HIGH(GPIOI_PIN14) | \ - PIN_OSPEED_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_PUPDR (PIN_PUPDR_PULLUP(GPIOI_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN15)) -#define VAL_GPIOI_ODR (PIN_ODR_HIGH(GPIOI_PIN0) | \ - PIN_ODR_HIGH(GPIOI_PIN1) | \ - PIN_ODR_HIGH(GPIOI_PIN2) | \ - PIN_ODR_HIGH(GPIOI_PIN3) | \ - PIN_ODR_HIGH(GPIOI_PIN4) | \ - PIN_ODR_HIGH(GPIOI_PIN5) | \ - PIN_ODR_HIGH(GPIOI_PIN6) | \ - PIN_ODR_HIGH(GPIOI_PIN7) | \ - PIN_ODR_HIGH(GPIOI_PIN8) | \ - PIN_ODR_HIGH(GPIOI_PIN9) | \ - PIN_ODR_HIGH(GPIOI_PIN10) | \ - PIN_ODR_HIGH(GPIOI_PIN11) | \ - PIN_ODR_HIGH(GPIOI_PIN12) | \ - PIN_ODR_HIGH(GPIOI_PIN13) | \ - PIN_ODR_HIGH(GPIOI_PIN14) | \ - PIN_ODR_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_AFRL (PIN_AFIO_AF(GPIOI_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN7, 0U)) -#define VAL_GPIOI_AFRH (PIN_AFIO_AF(GPIOI_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ORESAT_C3_V1/board.mk b/boards/ORESAT_C3_V1/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ORESAT_C3_V1/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ORESAT_C3_V1/gdboocd.cmd b/boards/ORESAT_C3_V1/gdboocd.cmd deleted file mode 100644 index ac017d4e..00000000 --- a/boards/ORESAT_C3_V1/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ORESAT_C3_V1/oocd.cfg b/boards/ORESAT_C3_V1/oocd.cfg deleted file mode 100644 index d44f8d8f..00000000 --- a/boards/ORESAT_C3_V1/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f4x.cfg] - diff --git a/boards/ORESAT_C3_V3/board.c b/boards/ORESAT_C3_V3/board.c deleted file mode 100644 index 5f49a349..00000000 --- a/boards/ORESAT_C3_V3/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB1(STM32_GPIO_EN_MASK); - rccEnableAHB1(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ORESAT_C3_V3/board.h b/boards/ORESAT_C3_V3/board.h deleted file mode 100644 index b107e0a8..00000000 --- a/boards/ORESAT_C3_V3/board.h +++ /dev/null @@ -1,1217 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * OreSat C3 Prototype Board - * PART: STM32F446VE - * PACKAGE: LQFP100 - */ - -/* - * Board identifier. - */ -#define ORESAT_C3_V3 -#define BOARD_NAME "OreSat C3 v3" - -/* - * Board oscillators-related settings. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 32768U -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* #define STM32_HSE_BYPASS */ - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300U - -/* - * MCU type as defined in the ST header. - */ -#define STM32F446xx - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_PIN1 1U -#define GPIOA_PIN2 2U -#define GPIOA_PIN3 3U -#define GPIOA_PIN4 4U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_SPI1_MOSI 7U -#define GPIOA_PIN8 8U -#define GPIOA_CAN1_SILENT 9U -#define GPIOA_CAN1_SHDN 10U -#define GPIOA_CAN1_RX 11U -#define GPIOA_CAN1_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_SDIO_D1 0U -#define GPIOB_SDIO_D2 1U -#define GPIOB_SDIO_CK 2U -#define GPIOB_SWO 3U -#define GPIOB_CAN2_SHDN 4U -#define GPIOB_CAN2_RX 5U -#define GPIOB_CAN2_TX 6U -#define GPIOB_CAN2_SILENT 7U -#define GPIOB_I2C1_SCL 8U -#define GPIOB_I2C1_SDA 9U -#define GPIOB_USART3_TX 10U -#define GPIOB_PIN11 11U -#define GPIOB_LO_SEN 12U -#define GPIOB_LO_SCLK 13U -#define GPIOB_LO_SDATA 14U -#define GPIOB_LO_PLL 15U - -#define GPIOC_VERIFY_TURN 0U -#define GPIOC_VERIFY_HELI 1U -#define GPIOC_CB_IOUT 2U -#define GPIOC_OPD_ISET 3U -#define GPIOC_PA_FWD 4U -#define GPIOC_PA_REV 5U -#define GPIOC_LBAND_CS 6U -#define GPIOC_UHF_CS 7U -#define GPIOC_SDIO_D0 8U -#define GPIOC_UHF_IRQ 9U -#define GPIOC_OPD_FAULT 10U -#define GPIOC_SDIO_D3 11U -#define GPIOC_TEST_TURN 12U -#define GPIOC_PIN13 13U -#define GPIOC_OSC32_IN 14U -#define GPIOC_OSC32_OUT 15U - -#define GPIOD_FIRE_HELI_1 0U -#define GPIOD_FIRE_TURN_1 1U -#define GPIOD_SDIO_CMD 2U -#define GPIOD_TEST_HELI 3U -#define GPIOD_UHF_ENABLE 4U -#define GPIOD_OPD_ENABLE 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_LBAND_IRQ 8U -#define GPIOD_USART3_RX 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_WDT 1U -#define GPIOE_FIRE_TURN_2 2U -#define GPIOE_FIRE_HELI_2 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_MMC_PWR 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_OSC_IN 0U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_SPI1_MISO PAL_LINE(GPIOA, 6U) -#define LINE_CAN1_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN1_SHDN PAL_LINE(GPIOA, 10U) -#define LINE_CAN2_SHDN PAL_LINE(GPIOB, 4U) -#define LINE_CAN2_SILENT PAL_LINE(GPIOB, 7U) -#define LINE_LO_SEN PAL_LINE(GPIOB, 12U) -#define LINE_LO_SCLK PAL_LINE(GPIOB, 13U) -#define LINE_LO_SDATA PAL_LINE(GPIOB, 14U) -#define LINE_LO_PLL PAL_LINE(GPIOB, 15U) -#define LINE_LBAND_CS PAL_LINE(GPIOC, 6U) -#define LINE_UHF_CS PAL_LINE(GPIOC, 7U) -#define LINE_UHF_IRQ PAL_LINE(GPIOC, 9U) -#define LINE_FIRE_HELI_1 PAL_LINE(GPIOD, 0U) -#define LINE_FIRE_TURN_1 PAL_LINE(GPIOD, 1U) -#define LINE_UHF_ENABLE PAL_LINE(GPIOD, 4U) -#define LINE_OPD_ENABLE PAL_LINE(GPIOD, 5U) -#define LINE_LBAND_IRQ PAL_LINE(GPIOD, 8U) -#define LINE_WDT PAL_LINE(GPIOE, 1U) -#define LINE_FIRE_TURN_2 PAL_LINE(GPIOE, 2U) -#define LINE_FIRE_HELI_2 PAL_LINE(GPIOE, 3U) -#define LINE_MMC_PWR PAL_LINE(GPIOE, 7U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - PIN0 (analog). - * PA1 - PIN1 (analog). - * PA2 - PIN2 (analog). - * PA3 - PIN3 (analog). - * PA4 - PIN4 (analog). - * PA5 - SPI1_SCK (alternate 5). - * PA6 - SPI1_MISO (alternate 5). - * PA7 - SPI1_MOSI (alternate 5). - * PA8 - PIN8 (analog). - * PA9 - CAN1_SILENT (output pushpull). - * PA10 - CAN1_SHDN (output pushpull). - * PA11 - CAN1_RX (alternate 9). - * PA12 - CAN1_TX (alternate 9). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_PIN0) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ANALOG(GPIOA_PIN2) | \ - PIN_MODE_ANALOG(GPIOA_PIN3) | \ - PIN_MODE_ANALOG(GPIOA_PIN4) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_ANALOG(GPIOA_PIN8) | \ - PIN_MODE_OUTPUT(GPIOA_CAN1_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN1_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_SILENT) |\ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_PIN0) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_PIN2) | \ - PIN_OSPEED_HIGH(GPIOA_PIN3) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_MOSI) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_SILENT) |\ - PIN_PUPDR_FLOATING(GPIOA_CAN1_SHDN) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_RX) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_LOW(GPIOA_CAN1_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN1_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN1_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN1_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 5U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_RX, 9U) | \ - PIN_AFIO_AF(GPIOA_CAN1_TX, 9U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - SDIO_D1 (alternate 12). - * PB1 - SDIO_D2 (alternate 12). - * PB2 - SDIO_CK (alternate 12). - * PB3 - SWO (alternate 0). - * PB4 - CAN2_SHDN (output pushpull). - * PB5 - CAN2_RX (alternate 9). - * PB6 - CAN2_TX (alternate 9). - * PB7 - CAN2_SILENT (output pushpull). - * PB8 - I2C1_SCL (alternate 4). - * PB9 - I2C1_SDA (alternate 4). - * PB10 - USART3_TX (alternate 7). - * PB11 - PIN11 (NC) (analog). - * PB12 - LO_SEN (output pushpull). - * PB13 - LO_SCLK (output pushpull). - * PB14 - LO_SDATA (output pushpull). - * PB15 - LO_PLL (input). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ALTERNATE(GPIOB_SDIO_D1) | \ - PIN_MODE_ALTERNATE(GPIOB_SDIO_D2) | \ - PIN_MODE_ALTERNATE(GPIOB_SDIO_CK) | \ - PIN_MODE_ALTERNATE(GPIOB_SWO) | \ - PIN_MODE_ANALOG(GPIOB_CAN2_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_RX) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_TX) | \ - PIN_MODE_ANALOG(GPIOB_CAN2_SILENT) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ALTERNATE(GPIOB_USART3_TX) | \ - PIN_MODE_ANALOG(GPIOB_PIN11) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SEN) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SCLK) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SDATA) | \ - PIN_MODE_INPUT(GPIOB_LO_PLL)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_SDIO_D1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SDIO_D2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SDIO_CK) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SWO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_SILENT) |\ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_USART3_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SEN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SDATA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_PLL)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_SDIO_D1) | \ - PIN_OSPEED_HIGH(GPIOB_SDIO_D2) | \ - PIN_OSPEED_HIGH(GPIOB_SDIO_CK) | \ - PIN_OSPEED_HIGH(GPIOB_SWO) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_SHDN) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_RX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_TX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_SILENT) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_USART3_TX) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SEN) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SCLK) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SDATA) | \ - PIN_OSPEED_HIGH(GPIOB_LO_PLL)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_SDIO_D1) | \ - PIN_PUPDR_FLOATING(GPIOB_SDIO_D2) | \ - PIN_PUPDR_FLOATING(GPIOB_SDIO_CK) | \ - PIN_PUPDR_FLOATING(GPIOB_SWO) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_SHDN) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_RX) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_TX) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_SILENT) |\ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_USART3_TX) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SEN) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SCLK) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SDATA) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_PLL)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_SDIO_D1) | \ - PIN_ODR_HIGH(GPIOB_SDIO_D2) | \ - PIN_ODR_HIGH(GPIOB_SDIO_CK) | \ - PIN_ODR_HIGH(GPIOB_SWO) | \ - PIN_ODR_LOW(GPIOB_CAN2_SHDN) | \ - PIN_ODR_HIGH(GPIOB_CAN2_RX) | \ - PIN_ODR_HIGH(GPIOB_CAN2_TX) | \ - PIN_ODR_LOW(GPIOB_CAN2_SILENT) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_USART3_TX) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_LO_SEN) | \ - PIN_ODR_HIGH(GPIOB_LO_SCLK) | \ - PIN_ODR_HIGH(GPIOB_LO_SDATA) | \ - PIN_ODR_HIGH(GPIOB_LO_PLL)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_SDIO_D1, 12U) | \ - PIN_AFIO_AF(GPIOB_SDIO_D2, 12U) | \ - PIN_AFIO_AF(GPIOB_SDIO_CK, 12U) | \ - PIN_AFIO_AF(GPIOB_SWO, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_RX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_TX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_SILENT, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_I2C1_SCL, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 4U) | \ - PIN_AFIO_AF(GPIOB_USART3_TX, 7U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_LO_SEN, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_SCLK, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_SDATA, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_PLL, 5U)) - -/* - * GPIOC setup: - * - * PC0 - VERIFY_TURN (analog). - * PC1 - VERIFY_HELI (analog). - * PC2 - CB_IOUT (analog). - * PC3 - OPD_ISET (analog). - * PC4 - PA_FWD (analog). - * PC5 - PA_REV (analog). - * PC6 - LBAND_CS (output pushpull). - * PC7 - UHF_CS (output pushpull). - * PC8 - SDIO_D0 (alternate 12). - * PC9 - UHF_IRQ (input). - * PC10 - OPD_FAULT (input). - * PC11 - SDIO_D3 (alternate 12). - * PC12 - TEST_TURN (analog). - * PC13 - PIN13 (analog). - * PC14 - OSC32_IN (analog). - * PC15 - OSC32_OUT (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_VERIFY_TURN) | \ - PIN_MODE_ANALOG(GPIOC_VERIFY_HELI) | \ - PIN_MODE_ANALOG(GPIOC_CB_IOUT) | \ - PIN_MODE_ANALOG(GPIOC_OPD_ISET) | \ - PIN_MODE_ANALOG(GPIOC_PA_FWD) | \ - PIN_MODE_ANALOG(GPIOC_PA_REV) | \ - PIN_MODE_OUTPUT(GPIOC_LBAND_CS) | \ - PIN_MODE_OUTPUT(GPIOC_UHF_CS) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D0) | \ - PIN_MODE_INPUT(GPIOC_UHF_IRQ) | \ - PIN_MODE_INPUT(GPIOC_OPD_FAULT) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D3) | \ - PIN_MODE_ANALOG(GPIOC_TEST_TURN) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_IN) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_VERIFY_TURN) |\ - PIN_OTYPE_PUSHPULL(GPIOC_VERIFY_HELI) |\ - PIN_OTYPE_PUSHPULL(GPIOC_CB_IOUT) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OPD_ISET) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PA_FWD) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PA_REV) | \ - PIN_OTYPE_PUSHPULL(GPIOC_LBAND_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOC_UHF_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_UHF_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OPD_FAULT) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_TEST_TURN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_VERIFY_TURN) | \ - PIN_OSPEED_HIGH(GPIOC_VERIFY_HELI) | \ - PIN_OSPEED_HIGH(GPIOC_CB_IOUT) | \ - PIN_OSPEED_HIGH(GPIOC_OPD_ISET) | \ - PIN_OSPEED_HIGH(GPIOC_PA_FWD) | \ - PIN_OSPEED_HIGH(GPIOC_PA_REV) | \ - PIN_OSPEED_HIGH(GPIOC_LBAND_CS) | \ - PIN_OSPEED_HIGH(GPIOC_UHF_CS) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D0) | \ - PIN_OSPEED_HIGH(GPIOC_UHF_IRQ) | \ - PIN_OSPEED_HIGH(GPIOC_OPD_FAULT) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D3) | \ - PIN_OSPEED_HIGH(GPIOC_TEST_TURN) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_VERIFY_TURN) |\ - PIN_PUPDR_FLOATING(GPIOC_VERIFY_HELI) |\ - PIN_PUPDR_FLOATING(GPIOC_CB_IOUT) | \ - PIN_PUPDR_FLOATING(GPIOC_OPD_ISET) | \ - PIN_PUPDR_FLOATING(GPIOC_PA_FWD) | \ - PIN_PUPDR_FLOATING(GPIOC_PA_REV) | \ - PIN_PUPDR_FLOATING(GPIOC_LBAND_CS) | \ - PIN_PUPDR_FLOATING(GPIOC_UHF_CS) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D0) | \ - PIN_PUPDR_FLOATING(GPIOC_UHF_IRQ) | \ - PIN_PUPDR_FLOATING(GPIOC_OPD_FAULT) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D3) | \ - PIN_PUPDR_FLOATING(GPIOC_TEST_TURN) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_VERIFY_TURN) | \ - PIN_ODR_HIGH(GPIOC_VERIFY_HELI) | \ - PIN_ODR_HIGH(GPIOC_CB_IOUT) | \ - PIN_ODR_HIGH(GPIOC_OPD_ISET) | \ - PIN_ODR_HIGH(GPIOC_PA_FWD) | \ - PIN_ODR_HIGH(GPIOC_PA_REV) | \ - PIN_ODR_HIGH(GPIOC_LBAND_CS) | \ - PIN_ODR_HIGH(GPIOC_UHF_CS) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D0) | \ - PIN_ODR_HIGH(GPIOC_UHF_IRQ) | \ - PIN_ODR_HIGH(GPIOC_OPD_FAULT) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D3) | \ - PIN_ODR_HIGH(GPIOC_TEST_TURN) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_VERIFY_TURN, 0U) | \ - PIN_AFIO_AF(GPIOC_VERIFY_HELI, 0U) | \ - PIN_AFIO_AF(GPIOC_CB_IOUT, 0U) | \ - PIN_AFIO_AF(GPIOC_OPD_ISET, 0U) | \ - PIN_AFIO_AF(GPIOC_PA_FWD, 0U) | \ - PIN_AFIO_AF(GPIOC_PA_REV, 0U) | \ - PIN_AFIO_AF(GPIOC_LBAND_CS, 0U) | \ - PIN_AFIO_AF(GPIOC_UHF_CS, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_SDIO_D0, 12U) | \ - PIN_AFIO_AF(GPIOC_UHF_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOC_OPD_FAULT, 0U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D3, 12U) | \ - PIN_AFIO_AF(GPIOC_TEST_TURN, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U)) - -/* - * GPIOD setup: - * - * PD0 - FIRE_HELI_1 (output pushpull). - * PD1 - FIRE_TURN_1 (output pushpull). - * PD2 - SDIO_CMD (alternate 12). - * PD3 - TEST_HELI (analog). - * PD4 - UHF_ENABLE (output pushpull). - * PD5 - OPD_ENABLE (output pushpull). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - LBAND_IRQ (input). - * PD9 - USART3_RX (alternate 7). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_OUTPUT(GPIOD_FIRE_HELI_1) | \ - PIN_MODE_OUTPUT(GPIOD_FIRE_TURN_1) | \ - PIN_MODE_ALTERNATE(GPIOD_SDIO_CMD) | \ - PIN_MODE_ANALOG(GPIOD_TEST_HELI) | \ - PIN_MODE_OUTPUT(GPIOD_UHF_ENABLE) | \ - PIN_MODE_OUTPUT(GPIOD_OPD_ENABLE) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_LBAND_IRQ) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_RX) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_FIRE_HELI_1) |\ - PIN_OTYPE_PUSHPULL(GPIOD_FIRE_TURN_1) |\ - PIN_OTYPE_PUSHPULL(GPIOD_SDIO_CMD) | \ - PIN_OTYPE_PUSHPULL(GPIOD_TEST_HELI) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOD_OPD_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LBAND_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOD_USART3_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_FIRE_HELI_1) | \ - PIN_OSPEED_HIGH(GPIOD_FIRE_TURN_1) | \ - PIN_OSPEED_HIGH(GPIOD_SDIO_CMD) | \ - PIN_OSPEED_HIGH(GPIOD_TEST_HELI) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOD_OPD_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_LBAND_IRQ) | \ - PIN_OSPEED_HIGH(GPIOD_USART3_RX) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_FIRE_HELI_1) |\ - PIN_PUPDR_FLOATING(GPIOD_FIRE_TURN_1) |\ - PIN_PUPDR_FLOATING(GPIOD_SDIO_CMD) | \ - PIN_PUPDR_FLOATING(GPIOD_TEST_HELI) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOD_OPD_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_LBAND_IRQ) | \ - PIN_PUPDR_FLOATING(GPIOD_USART3_RX) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_LOW(GPIOD_FIRE_HELI_1) | \ - PIN_ODR_LOW(GPIOD_FIRE_TURN_1) | \ - PIN_ODR_HIGH(GPIOD_SDIO_CMD) | \ - PIN_ODR_HIGH(GPIOD_TEST_HELI) | \ - PIN_ODR_HIGH(GPIOD_UHF_ENABLE) | \ - PIN_ODR_HIGH(GPIOD_OPD_ENABLE) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_LBAND_IRQ) | \ - PIN_ODR_HIGH(GPIOD_USART3_RX) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_FIRE_HELI_1, 0U) | \ - PIN_AFIO_AF(GPIOD_FIRE_TURN_1, 0U) | \ - PIN_AFIO_AF(GPIOD_SDIO_CMD, 12U) | \ - PIN_AFIO_AF(GPIOD_TEST_HELI, 0U) | \ - PIN_AFIO_AF(GPIOD_UHF_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOD_OPD_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_LBAND_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOD_USART3_RX, 7U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - WDT (output pushpull). - * PE2 - FIRE_TURN_2 (output pushpull). - * PE3 - FIRE_HELI_2 (output pushpull). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - MMC_PWR (output pushpull). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_OUTPUT(GPIOE_WDT) | \ - PIN_MODE_OUTPUT(GPIOE_FIRE_TURN_2) | \ - PIN_MODE_OUTPUT(GPIOE_FIRE_HELI_2) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_OUTPUT(GPIOE_MMC_PWR) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_WDT) | \ - PIN_OTYPE_PUSHPULL(GPIOE_FIRE_TURN_2) |\ - PIN_OTYPE_PUSHPULL(GPIOE_FIRE_HELI_2) |\ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_MMC_PWR) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_WDT) | \ - PIN_OSPEED_HIGH(GPIOE_FIRE_TURN_2) | \ - PIN_OSPEED_HIGH(GPIOE_FIRE_HELI_2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_MMC_PWR) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_WDT) | \ - PIN_PUPDR_FLOATING(GPIOE_FIRE_TURN_2) |\ - PIN_PUPDR_FLOATING(GPIOE_FIRE_HELI_2) |\ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_MMC_PWR) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_LOW(GPIOE_WDT) | \ - PIN_ODR_LOW(GPIOE_FIRE_TURN_2) | \ - PIN_ODR_LOW(GPIOE_FIRE_HELI_2) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_MMC_PWR) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_WDT, 0U) | \ - PIN_AFIO_AF(GPIOE_FIRE_TURN_2, 0U) | \ - PIN_AFIO_AF(GPIOE_FIRE_HELI_2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_MMC_PWR, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (analog). - * PF1 - PIN1 (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_PIN0) | \ - PIN_MODE_ANALOG(GPIOF_PIN1) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOG_MODER (PIN_MODE_ANALOG(GPIOG_PIN0) | \ - PIN_MODE_ANALOG(GPIOG_PIN1) | \ - PIN_MODE_ANALOG(GPIOG_PIN2) | \ - PIN_MODE_ANALOG(GPIOG_PIN3) | \ - PIN_MODE_ANALOG(GPIOG_PIN4) | \ - PIN_MODE_ANALOG(GPIOG_PIN5) | \ - PIN_MODE_ANALOG(GPIOG_PIN6) | \ - PIN_MODE_ANALOG(GPIOG_PIN7) | \ - PIN_MODE_ANALOG(GPIOG_PIN8) | \ - PIN_MODE_ANALOG(GPIOG_PIN9) | \ - PIN_MODE_ANALOG(GPIOG_PIN10) | \ - PIN_MODE_ANALOG(GPIOG_PIN11) | \ - PIN_MODE_ANALOG(GPIOG_PIN12) | \ - PIN_MODE_ANALOG(GPIOG_PIN13) | \ - PIN_MODE_ANALOG(GPIOG_PIN14) | \ - PIN_MODE_ANALOG(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (analog). - * PH1 - OSC_OUT (analog). - * PH2 - PIN2 (analog). - * PH3 - PIN3 (analog). - * PH4 - PIN4 (analog). - * PH5 - PIN5 (analog). - * PH6 - PIN6 (analog). - * PH7 - PIN7 (analog). - * PH8 - PIN8 (analog). - * PH9 - PIN9 (analog). - * PH10 - PIN10 (analog). - * PH11 - PIN11 (analog). - * PH12 - PIN12 (analog). - * PH13 - PIN13 (analog). - * PH14 - PIN14 (analog). - * PH15 - PIN15 (analog). - */ -#define VAL_GPIOH_MODER (PIN_MODE_ANALOG(GPIOH_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOH_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOH_PIN2) | \ - PIN_MODE_ANALOG(GPIOH_PIN3) | \ - PIN_MODE_ANALOG(GPIOH_PIN4) | \ - PIN_MODE_ANALOG(GPIOH_PIN5) | \ - PIN_MODE_ANALOG(GPIOH_PIN6) | \ - PIN_MODE_ANALOG(GPIOH_PIN7) | \ - PIN_MODE_ANALOG(GPIOH_PIN8) | \ - PIN_MODE_ANALOG(GPIOH_PIN9) | \ - PIN_MODE_ANALOG(GPIOH_PIN10) | \ - PIN_MODE_ANALOG(GPIOH_PIN11) | \ - PIN_MODE_ANALOG(GPIOH_PIN12) | \ - PIN_MODE_ANALOG(GPIOH_PIN13) | \ - PIN_MODE_ANALOG(GPIOH_PIN14) | \ - PIN_MODE_ANALOG(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ORESAT_C3_V3/board.mk b/boards/ORESAT_C3_V3/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ORESAT_C3_V3/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ORESAT_C3_V3/gdboocd.cmd b/boards/ORESAT_C3_V3/gdboocd.cmd deleted file mode 100644 index ac017d4e..00000000 --- a/boards/ORESAT_C3_V3/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ORESAT_C3_V3/oocd.cfg b/boards/ORESAT_C3_V3/oocd.cfg deleted file mode 100644 index d44f8d8f..00000000 --- a/boards/ORESAT_C3_V3/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f4x.cfg] - diff --git a/boards/ORESAT_C3_V4/board.c b/boards/ORESAT_C3_V4/board.c deleted file mode 100644 index 5f49a349..00000000 --- a/boards/ORESAT_C3_V4/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB1(STM32_GPIO_EN_MASK); - rccEnableAHB1(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ORESAT_C3_V4/board.h b/boards/ORESAT_C3_V4/board.h deleted file mode 100644 index 41da5a8b..00000000 --- a/boards/ORESAT_C3_V4/board.h +++ /dev/null @@ -1,1355 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * OreSat C3 Prototype Board - * PART: STM32F439VI - * PACKAGE: LQFP100 - */ - -/* - * Board identifier. - */ -#define ORESAT_C3_V4 -#define BOARD_NAME "OreSat C3 v4" - -/* - * Board oscillators-related settings. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 32768U -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300U - -/* - * MCU type as defined in the ST header. - */ -#define STM32F439xx - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_PIN1 1U -#define GPIOA_PIN2 2U -#define GPIOA_PIN3 3U -#define GPIOA_PA_THERM 4U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_SPI1_MOSI 7U -#define GPIOA_I2C_PWROFF 8U -#define GPIOA_CAN1_SILENT 9U -#define GPIOA_CAN1_SHDN 10U -#define GPIOA_CAN1_RX 11U -#define GPIOA_CAN1_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN3 2U -#define GPIOB_SWO 3U -#define GPIOB_CAN2_SHDN 4U -#define GPIOB_CAN2_RX 5U -#define GPIOB_CAN2_TX 6U -#define GPIOB_CAN2_SILENT 7U -#define GPIOB_I2C1_SCL 8U -#define GPIOB_I2C1_SDA 9U -#define GPIOB_I2C2_SCL 10U -#define GPIOB_I2C2_SDA 11U -#define GPIOB_LO_SEN 12U -#define GPIOB_LO_SCLK 13U -#define GPIOB_LO_SDATA 14U -#define GPIOB_LO_PLL 15U - -#define GPIOC_VERIFY_TURN 0U -#define GPIOC_VERIFY_HELI 1U -#define GPIOC_CB_IOUT 2U -#define GPIOC_OPD_ISET 3U -#define GPIOC_PA_FWD 4U -#define GPIOC_PA_REV 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_SDIO_D0 8U -#define GPIOC_SDIO_D1 9U -#define GPIOC_SDIO_D2 10U -#define GPIOC_SDIO_D3 11U -#define GPIOC_SDIO_CK 12U -#define GPIOC_PIN13 13U -#define GPIOC_OSC32_IN 14U -#define GPIOC_OSC32_OUT 15U - -#define GPIOD_FIRE_HELI_1 0U -#define GPIOD_FIRE_TURN_1 1U -#define GPIOD_SDIO_CMD 2U -#define GPIOD_TEST_HELI 3U -#define GPIOD_UHF_ENABLE 4U -#define GPIOD_OPD_ENABLE 5U -#define GPIOD_TEST_TURN 6U -#define GPIOD_UHF_FLT 7U -#define GPIOD_USART3_TX 8U -#define GPIOD_USART3_RX 9U -#define GPIOD_UHF_IRQ 10U -#define GPIOD_UHF_CS 11U -#define GPIOD_LBAND_IRQ 12U -#define GPIOD_LBAND_CS 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_OPD_FAULT 0U -#define GPIOE_WDT 1U -#define GPIOE_FIRE_TURN_2 2U -#define GPIOE_FIRE_HELI_2 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_MMC_PWR 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_TOT_OUT 11U -#define GPIOE_PIN12 12U -#define GPIOE_LNA_ENABLE 13U -#define GPIOE_PA_ENABLE 14U -#define GPIOE_TOT_CLEAR 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_OSC_IN 0U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -#define GPIOI_PIN0 0U -#define GPIOI_PIN1 1U -#define GPIOI_PIN2 2U -#define GPIOI_PIN3 3U -#define GPIOI_PIN4 4U -#define GPIOI_PIN5 5U -#define GPIOI_PIN6 6U -#define GPIOI_PIN7 7U -#define GPIOI_PIN8 8U -#define GPIOI_PIN9 9U -#define GPIOI_PIN10 10U -#define GPIOI_PIN11 11U -#define GPIOI_PIN12 12U -#define GPIOI_PIN13 13U -#define GPIOI_PIN14 14U -#define GPIOI_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_SPI1_MISO PAL_LINE(GPIOA, 6U) -#define LINE_I2C_PWROFF PAL_LINE(GPIOA, 8U) -#define LINE_CAN1_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN1_SHDN PAL_LINE(GPIOA, 10U) -#define LINE_CAN2_SHDN PAL_LINE(GPIOB, 4U) -#define LINE_CAN2_SILENT PAL_LINE(GPIOB, 7U) -#define LINE_LO_SEN PAL_LINE(GPIOB, 12U) -#define LINE_LO_SCLK PAL_LINE(GPIOB, 13U) -#define LINE_LO_SDATA PAL_LINE(GPIOB, 14U) -#define LINE_LO_PLL PAL_LINE(GPIOB, 15U) -#define LINE_FIRE_HELI_1 PAL_LINE(GPIOD, 0U) -#define LINE_FIRE_TURN_1 PAL_LINE(GPIOD, 1U) -#define LINE_UHF_ENABLE PAL_LINE(GPIOD, 4U) -#define LINE_OPD_ENABLE PAL_LINE(GPIOD, 5U) -#define LINE_UHF_IRQ PAL_LINE(GPIOD, 10U) -#define LINE_UHF_CS PAL_LINE(GPIOD, 11U) -#define LINE_LBAND_IRQ PAL_LINE(GPIOD, 12U) -#define LINE_LBAND_CS PAL_LINE(GPIOD, 13U) -#define LINE_OPD_FAULT PAL_LINE(GPIOE, 0U) -#define LINE_WDT PAL_LINE(GPIOE, 1U) -#define LINE_FIRE_TURN_2 PAL_LINE(GPIOE, 2U) -#define LINE_FIRE_HELI_2 PAL_LINE(GPIOE, 3U) -#define LINE_MMC_PWR PAL_LINE(GPIOE, 7U) -#define LINE_TOT_OUT PAL_LINE(GPIOE, 11U) -#define LINE_LNA_ENABLE PAL_LINE(GPIOE, 13U) -#define LINE_PA_ENABLE PAL_LINE(GPIOE, 14U) -#define LINE_TOT_CLEAR PAL_LINE(GPIOE, 15U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - PIN0 (analog). - * PA1 - PIN1 (analog). - * PA2 - PIN2 (analog). - * PA3 - PIN3 (analog). - * PA4 - PA_THERM (analog). - * PA5 - SPI1_SCK (alternate 5). - * PA6 - SPI1_MISO (alternate 5). - * PA7 - SPI1_MOSI (alternate 5). - * PA8 - I2C_PWROFF (output pushpull). - * PA9 - CAN1_SILENT (output pushpull). - * PA10 - CAN1_SHDN (output pushpull). - * PA11 - CAN1_RX (alternate 9). - * PA12 - CAN1_TX (alternate 9). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_PIN0) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ANALOG(GPIOA_PIN2) | \ - PIN_MODE_ANALOG(GPIOA_PIN3) | \ - PIN_MODE_ANALOG(GPIOA_PA_THERM) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_OUTPUT(GPIOA_I2C_PWROFF) | \ - PIN_MODE_OUTPUT(GPIOA_CAN1_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN1_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PA_THERM) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_I2C_PWROFF) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_SILENT) |\ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_PIN0) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_PIN2) | \ - PIN_OSPEED_HIGH(GPIOA_PIN3) | \ - PIN_OSPEED_HIGH(GPIOA_PA_THERM) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOA_I2C_PWROFF) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOA_PA_THERM) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_MOSI) | \ - PIN_PUPDR_FLOATING(GPIOA_I2C_PWROFF) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_SILENT) |\ - PIN_PUPDR_FLOATING(GPIOA_CAN1_SHDN) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_RX) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PA_THERM) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_ODR_LOW(GPIOA_I2C_PWROFF) | \ - PIN_ODR_LOW(GPIOA_CAN1_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN1_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN1_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN1_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOA_PA_THERM, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 5U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_I2C_PWROFF, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_RX, 9U) | \ - PIN_AFIO_AF(GPIOA_CAN1_TX, 9U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - PIN1 (analog). - * PB2 - PIN3 (analog). - * PB3 - SWO (alternate 0). - * PB4 - CAN2_SHDN (output pushpull). - * PB5 - CAN2_RX (alternate 9). - * PB6 - CAN2_TX (alternate 9). - * PB7 - CAN2_SILENT (output pushpull). - * PB8 - I2C1_SCL (alternate 4). - * PB9 - I2C1_SDA (alternate 4). - * PB10 - I2C2_SCL (alternate 4). - * PB11 - I2C2_SDA (alternate 4). - * PB12 - LO_SEN (output pushpull). - * PB13 - LO_SCLK (output pushpull). - * PB14 - LO_SDATA (output pushpull). - * PB15 - LO_PLL (input). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_ALTERNATE(GPIOB_SWO) | \ - PIN_MODE_ANALOG(GPIOB_CAN2_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_RX) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_TX) | \ - PIN_MODE_ANALOG(GPIOB_CAN2_SILENT) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SDA) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SEN) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SCLK) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SDATA) | \ - PIN_MODE_INPUT(GPIOB_LO_PLL)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SWO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_SILENT) |\ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SEN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SDATA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_PLL)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_SWO) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_SHDN) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_RX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_TX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_SILENT) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_I2C2_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C2_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SEN) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SCLK) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SDATA) | \ - PIN_OSPEED_HIGH(GPIOB_LO_PLL)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_SWO) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_SHDN) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_RX) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_TX) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_SILENT) |\ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C2_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C2_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SEN) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SCLK) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SDATA) | \ - PIN_PUPDR_PULLUP(GPIOB_LO_PLL)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_SWO) | \ - PIN_ODR_LOW(GPIOB_CAN2_SHDN) | \ - PIN_ODR_HIGH(GPIOB_CAN2_RX) | \ - PIN_ODR_HIGH(GPIOB_CAN2_TX) | \ - PIN_ODR_LOW(GPIOB_CAN2_SILENT) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_I2C2_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C2_SDA) | \ - PIN_ODR_HIGH(GPIOB_LO_SEN) | \ - PIN_ODR_HIGH(GPIOB_LO_SCLK) | \ - PIN_ODR_HIGH(GPIOB_LO_SDATA) | \ - PIN_ODR_HIGH(GPIOB_LO_PLL)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_SWO, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_RX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_TX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_SILENT, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_I2C1_SCL, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C2_SCL, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C2_SDA, 4U) | \ - PIN_AFIO_AF(GPIOB_LO_SEN, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_SCLK, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_SDATA, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_PLL, 5U)) - -/* - * GPIOC setup: - * - * PC0 - VERIFY_TURN (analog). - * PC1 - VERIFY_HELI (analog). - * PC2 - CB_IOUT (analog). - * PC3 - OPD_ISET (analog). - * PC4 - PA_FWD (analog). - * PC5 - PA_REV (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - SDIO_D0 (alternate 12). - * PC9 - SDIO_D1 (alternate 12). - * PC10 - SDIO_D2 (alternate 12). - * PC11 - SDIO_D3 (alternate 12). - * PC12 - SDIO_CK (alternate 12). - * PC13 - PIN13 (analog). - * PC14 - OSC32_IN (analog). - * PC15 - OSC32_OUT (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_VERIFY_TURN) | \ - PIN_MODE_ANALOG(GPIOC_VERIFY_HELI) | \ - PIN_MODE_ANALOG(GPIOC_CB_IOUT) | \ - PIN_MODE_ANALOG(GPIOC_OPD_ISET) | \ - PIN_MODE_ANALOG(GPIOC_PA_FWD) | \ - PIN_MODE_ANALOG(GPIOC_PA_REV) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D0) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D1) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D2) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D3) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_CK) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_IN) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_VERIFY_TURN) |\ - PIN_OTYPE_PUSHPULL(GPIOC_VERIFY_HELI) |\ - PIN_OTYPE_PUSHPULL(GPIOC_CB_IOUT) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OPD_ISET) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PA_FWD) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PA_REV) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_CK) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_VERIFY_TURN) | \ - PIN_OSPEED_HIGH(GPIOC_VERIFY_HELI) | \ - PIN_OSPEED_HIGH(GPIOC_CB_IOUT) | \ - PIN_OSPEED_HIGH(GPIOC_OPD_ISET) | \ - PIN_OSPEED_HIGH(GPIOC_PA_FWD) | \ - PIN_OSPEED_HIGH(GPIOC_PA_REV) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D0) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D1) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D2) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D3) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_CK) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_VERIFY_TURN) |\ - PIN_PUPDR_FLOATING(GPIOC_VERIFY_HELI) |\ - PIN_PUPDR_FLOATING(GPIOC_CB_IOUT) | \ - PIN_PUPDR_FLOATING(GPIOC_OPD_ISET) | \ - PIN_PUPDR_FLOATING(GPIOC_PA_FWD) | \ - PIN_PUPDR_FLOATING(GPIOC_PA_REV) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D0) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D1) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D2) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D3) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_CK) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_VERIFY_TURN) | \ - PIN_ODR_HIGH(GPIOC_VERIFY_HELI) | \ - PIN_ODR_HIGH(GPIOC_CB_IOUT) | \ - PIN_ODR_HIGH(GPIOC_OPD_ISET) | \ - PIN_ODR_HIGH(GPIOC_PA_FWD) | \ - PIN_ODR_HIGH(GPIOC_PA_REV) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D0) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D1) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D2) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D3) | \ - PIN_ODR_HIGH(GPIOC_SDIO_CK) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_VERIFY_TURN, 0U) | \ - PIN_AFIO_AF(GPIOC_VERIFY_HELI, 0U) | \ - PIN_AFIO_AF(GPIOC_CB_IOUT, 0U) | \ - PIN_AFIO_AF(GPIOC_OPD_ISET, 0U) | \ - PIN_AFIO_AF(GPIOC_PA_FWD, 0U) | \ - PIN_AFIO_AF(GPIOC_PA_REV, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_SDIO_D0, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D1, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D2, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D3, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_CK, 12U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U)) - -/* - * GPIOD setup: - * - * PD0 - FIRE_HELI_1 (output pushpull). - * PD1 - FIRE_TURN_1 (output pushpull). - * PD2 - SDIO_CMD (alternate 12). - * PD3 - TEST_HELI (analog). - * PD4 - UHF_ENABLE (output pushpull). - * PD5 - OPD_ENABLE (output pushpull). - * PD6 - TEST_TURN (analog). - * PD7 - UHF_FLT (analog). - * PD8 - USART3_TX (alternate 7). - * PD9 - USART3_RX (alternate 7). - * PD10 - UHF_IRQ (input). - * PD11 - UHF_CS (output). - * PD12 - LBAND_IRQ (input). - * PD13 - LBAND_CS (output). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_OUTPUT(GPIOD_FIRE_HELI_1) | \ - PIN_MODE_OUTPUT(GPIOD_FIRE_TURN_1) | \ - PIN_MODE_ALTERNATE(GPIOD_SDIO_CMD) | \ - PIN_MODE_ANALOG(GPIOD_TEST_HELI) | \ - PIN_MODE_OUTPUT(GPIOD_UHF_ENABLE) | \ - PIN_MODE_OUTPUT(GPIOD_OPD_ENABLE) | \ - PIN_MODE_ANALOG(GPIOD_TEST_TURN) | \ - PIN_MODE_ANALOG(GPIOD_UHF_FLT) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_TX) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_RX) | \ - PIN_MODE_INPUT(GPIOD_UHF_IRQ) | \ - PIN_MODE_OUTPUT(GPIOD_UHF_CS) | \ - PIN_MODE_INPUT(GPIOD_LBAND_IRQ) | \ - PIN_MODE_OUTPUT(GPIOD_LBAND_CS) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_FIRE_HELI_1) |\ - PIN_OTYPE_PUSHPULL(GPIOD_FIRE_TURN_1) |\ - PIN_OTYPE_PUSHPULL(GPIOD_SDIO_CMD) | \ - PIN_OTYPE_PUSHPULL(GPIOD_TEST_HELI) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOD_OPD_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOD_TEST_TURN) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_FLT) | \ - PIN_OTYPE_PUSHPULL(GPIOD_USART3_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOD_USART3_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LBAND_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LBAND_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_FIRE_HELI_1) | \ - PIN_OSPEED_HIGH(GPIOD_FIRE_TURN_1) | \ - PIN_OSPEED_HIGH(GPIOD_SDIO_CMD) | \ - PIN_OSPEED_HIGH(GPIOD_TEST_HELI) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOD_OPD_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOD_TEST_TURN) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_FLT) | \ - PIN_OSPEED_HIGH(GPIOD_USART3_TX) | \ - PIN_OSPEED_HIGH(GPIOD_USART3_RX) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_IRQ) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_CS) | \ - PIN_OSPEED_HIGH(GPIOD_LBAND_IRQ) | \ - PIN_OSPEED_HIGH(GPIOD_LBAND_CS) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_FIRE_HELI_1) |\ - PIN_PUPDR_FLOATING(GPIOD_FIRE_TURN_1) |\ - PIN_PUPDR_FLOATING(GPIOD_SDIO_CMD) | \ - PIN_PUPDR_FLOATING(GPIOD_TEST_HELI) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOD_OPD_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOD_TEST_TURN) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_FLT) | \ - PIN_PUPDR_FLOATING(GPIOD_USART3_TX) | \ - PIN_PUPDR_FLOATING(GPIOD_USART3_RX) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_IRQ) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_CS) | \ - PIN_PUPDR_FLOATING(GPIOD_LBAND_IRQ) | \ - PIN_PUPDR_FLOATING(GPIOD_LBAND_CS) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_LOW(GPIOD_FIRE_HELI_1) | \ - PIN_ODR_LOW(GPIOD_FIRE_TURN_1) | \ - PIN_ODR_HIGH(GPIOD_SDIO_CMD) | \ - PIN_ODR_HIGH(GPIOD_TEST_HELI) | \ - PIN_ODR_HIGH(GPIOD_UHF_ENABLE) | \ - PIN_ODR_HIGH(GPIOD_OPD_ENABLE) | \ - PIN_ODR_HIGH(GPIOD_TEST_TURN) | \ - PIN_ODR_HIGH(GPIOD_UHF_FLT) | \ - PIN_ODR_HIGH(GPIOD_USART3_TX) | \ - PIN_ODR_HIGH(GPIOD_USART3_RX) | \ - PIN_ODR_HIGH(GPIOD_UHF_IRQ) | \ - PIN_ODR_HIGH(GPIOD_UHF_CS) | \ - PIN_ODR_HIGH(GPIOD_LBAND_IRQ) | \ - PIN_ODR_HIGH(GPIOD_LBAND_CS) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_FIRE_HELI_1, 0U) | \ - PIN_AFIO_AF(GPIOD_FIRE_TURN_1, 0U) | \ - PIN_AFIO_AF(GPIOD_SDIO_CMD, 12U) | \ - PIN_AFIO_AF(GPIOD_TEST_HELI, 0U) | \ - PIN_AFIO_AF(GPIOD_UHF_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOD_OPD_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOD_TEST_TURN, 0U) | \ - PIN_AFIO_AF(GPIOD_UHF_FLT, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_USART3_TX, 7U) | \ - PIN_AFIO_AF(GPIOD_USART3_RX, 7U) | \ - PIN_AFIO_AF(GPIOD_UHF_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOD_UHF_CS, 0U) | \ - PIN_AFIO_AF(GPIOD_LBAND_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOD_LBAND_CS, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - OPD_FAULT (input). - * PE1 - WDT (output pushpull). - * PE2 - FIRE_TURN_2 (output pushpull). - * PE3 - FIRE_HELI_2 (output pushpull). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - MMC_PWR (output pushpull). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - TOT_OUT (input). - * PE12 - PIN12 (analog). - * PE13 - LNA_ENABLE (output pushpull). - * PE14 - PA_ENABLE (output pushpull). - * PE15 - TOT_CLEAR (output pushpull). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_OPD_FAULT) | \ - PIN_MODE_OUTPUT(GPIOE_WDT) | \ - PIN_MODE_OUTPUT(GPIOE_FIRE_TURN_2) | \ - PIN_MODE_OUTPUT(GPIOE_FIRE_HELI_2) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_OUTPUT(GPIOE_MMC_PWR) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_TOT_OUT) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_OUTPUT(GPIOE_LNA_ENABLE) | \ - PIN_MODE_OUTPUT(GPIOE_PA_ENABLE) | \ - PIN_MODE_OUTPUT(GPIOE_TOT_CLEAR)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_OPD_FAULT) | \ - PIN_OTYPE_PUSHPULL(GPIOE_WDT) | \ - PIN_OTYPE_PUSHPULL(GPIOE_FIRE_TURN_2) |\ - PIN_OTYPE_PUSHPULL(GPIOE_FIRE_HELI_2) |\ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_MMC_PWR) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_TOT_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_LNA_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PA_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOE_TOT_CLEAR)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_OPD_FAULT) | \ - PIN_OSPEED_HIGH(GPIOE_WDT) | \ - PIN_OSPEED_HIGH(GPIOE_FIRE_TURN_2) | \ - PIN_OSPEED_HIGH(GPIOE_FIRE_HELI_2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_MMC_PWR) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_TOT_OUT) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_LNA_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOE_PA_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOE_TOT_CLEAR)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_OPD_FAULT) | \ - PIN_PUPDR_FLOATING(GPIOE_WDT) | \ - PIN_PUPDR_FLOATING(GPIOE_FIRE_TURN_2) |\ - PIN_PUPDR_FLOATING(GPIOE_FIRE_HELI_2) |\ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_MMC_PWR) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_TOT_OUT) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_LNA_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOE_PA_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOE_TOT_CLEAR)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_OPD_FAULT) | \ - PIN_ODR_LOW(GPIOE_WDT) | \ - PIN_ODR_LOW(GPIOE_FIRE_TURN_2) | \ - PIN_ODR_LOW(GPIOE_FIRE_HELI_2) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_MMC_PWR) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_TOT_OUT) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_LNA_ENABLE) | \ - PIN_ODR_LOW(GPIOE_PA_ENABLE) | \ - PIN_ODR_LOW(GPIOE_TOT_CLEAR)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_OPD_FAULT, 0U) | \ - PIN_AFIO_AF(GPIOE_WDT, 0U) | \ - PIN_AFIO_AF(GPIOE_FIRE_TURN_2, 0U) | \ - PIN_AFIO_AF(GPIOE_FIRE_HELI_2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_MMC_PWR, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_TOT_OUT, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_LNA_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOE_PA_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOE_TOT_CLEAR, 0U)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (analog). - * PF1 - PIN1 (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_PIN0) | \ - PIN_MODE_ANALOG(GPIOF_PIN1) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOG_MODER (PIN_MODE_ANALOG(GPIOG_PIN0) | \ - PIN_MODE_ANALOG(GPIOG_PIN1) | \ - PIN_MODE_ANALOG(GPIOG_PIN2) | \ - PIN_MODE_ANALOG(GPIOG_PIN3) | \ - PIN_MODE_ANALOG(GPIOG_PIN4) | \ - PIN_MODE_ANALOG(GPIOG_PIN5) | \ - PIN_MODE_ANALOG(GPIOG_PIN6) | \ - PIN_MODE_ANALOG(GPIOG_PIN7) | \ - PIN_MODE_ANALOG(GPIOG_PIN8) | \ - PIN_MODE_ANALOG(GPIOG_PIN9) | \ - PIN_MODE_ANALOG(GPIOG_PIN10) | \ - PIN_MODE_ANALOG(GPIOG_PIN11) | \ - PIN_MODE_ANALOG(GPIOG_PIN12) | \ - PIN_MODE_ANALOG(GPIOG_PIN13) | \ - PIN_MODE_ANALOG(GPIOG_PIN14) | \ - PIN_MODE_ANALOG(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (analog). - * PH1 - OSC_OUT (analog). - * PH2 - PIN2 (analog). - * PH3 - PIN3 (analog). - * PH4 - PIN4 (analog). - * PH5 - PIN5 (analog). - * PH6 - PIN6 (analog). - * PH7 - PIN7 (analog). - * PH8 - PIN8 (analog). - * PH9 - PIN9 (analog). - * PH10 - PIN10 (analog). - * PH11 - PIN11 (analog). - * PH12 - PIN12 (analog). - * PH13 - PIN13 (analog). - * PH14 - PIN14 (analog). - * PH15 - PIN15 (analog). - */ -#define VAL_GPIOH_MODER (PIN_MODE_ANALOG(GPIOH_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOH_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOH_PIN2) | \ - PIN_MODE_ANALOG(GPIOH_PIN3) | \ - PIN_MODE_ANALOG(GPIOH_PIN4) | \ - PIN_MODE_ANALOG(GPIOH_PIN5) | \ - PIN_MODE_ANALOG(GPIOH_PIN6) | \ - PIN_MODE_ANALOG(GPIOH_PIN7) | \ - PIN_MODE_ANALOG(GPIOH_PIN8) | \ - PIN_MODE_ANALOG(GPIOH_PIN9) | \ - PIN_MODE_ANALOG(GPIOH_PIN10) | \ - PIN_MODE_ANALOG(GPIOH_PIN11) | \ - PIN_MODE_ANALOG(GPIOH_PIN12) | \ - PIN_MODE_ANALOG(GPIOH_PIN13) | \ - PIN_MODE_ANALOG(GPIOH_PIN14) | \ - PIN_MODE_ANALOG(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) - -/* - * GPIOI setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOI_MODER (PIN_MODE_ANALOG(GPIOI_PIN0) | \ - PIN_MODE_ANALOG(GPIOI_PIN1) | \ - PIN_MODE_ANALOG(GPIOI_PIN2) | \ - PIN_MODE_ANALOG(GPIOI_PIN3) | \ - PIN_MODE_ANALOG(GPIOI_PIN4) | \ - PIN_MODE_ANALOG(GPIOI_PIN5) | \ - PIN_MODE_ANALOG(GPIOI_PIN6) | \ - PIN_MODE_ANALOG(GPIOI_PIN7) | \ - PIN_MODE_ANALOG(GPIOI_PIN8) | \ - PIN_MODE_ANALOG(GPIOI_PIN9) | \ - PIN_MODE_ANALOG(GPIOI_PIN10) | \ - PIN_MODE_ANALOG(GPIOI_PIN11) | \ - PIN_MODE_ANALOG(GPIOI_PIN12) | \ - PIN_MODE_ANALOG(GPIOI_PIN13) | \ - PIN_MODE_ANALOG(GPIOI_PIN14) | \ - PIN_MODE_ANALOG(GPIOI_PIN15)) -#define VAL_GPIOI_OTYPER (PIN_OTYPE_PUSHPULL(GPIOI_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN15)) -#define VAL_GPIOI_OSPEEDR (PIN_OSPEED_HIGH(GPIOI_PIN0) | \ - PIN_OSPEED_HIGH(GPIOI_PIN1) | \ - PIN_OSPEED_HIGH(GPIOI_PIN2) | \ - PIN_OSPEED_HIGH(GPIOI_PIN3) | \ - PIN_OSPEED_HIGH(GPIOI_PIN4) | \ - PIN_OSPEED_HIGH(GPIOI_PIN5) | \ - PIN_OSPEED_HIGH(GPIOI_PIN6) | \ - PIN_OSPEED_HIGH(GPIOI_PIN7) | \ - PIN_OSPEED_HIGH(GPIOI_PIN8) | \ - PIN_OSPEED_HIGH(GPIOI_PIN9) | \ - PIN_OSPEED_HIGH(GPIOI_PIN10) | \ - PIN_OSPEED_HIGH(GPIOI_PIN11) | \ - PIN_OSPEED_HIGH(GPIOI_PIN12) | \ - PIN_OSPEED_HIGH(GPIOI_PIN13) | \ - PIN_OSPEED_HIGH(GPIOI_PIN14) | \ - PIN_OSPEED_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_PUPDR (PIN_PUPDR_FLOATING(GPIOI_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN15)) -#define VAL_GPIOI_ODR (PIN_ODR_HIGH(GPIOI_PIN0) | \ - PIN_ODR_HIGH(GPIOI_PIN1) | \ - PIN_ODR_HIGH(GPIOI_PIN2) | \ - PIN_ODR_HIGH(GPIOI_PIN3) | \ - PIN_ODR_HIGH(GPIOI_PIN4) | \ - PIN_ODR_HIGH(GPIOI_PIN5) | \ - PIN_ODR_HIGH(GPIOI_PIN6) | \ - PIN_ODR_HIGH(GPIOI_PIN7) | \ - PIN_ODR_HIGH(GPIOI_PIN8) | \ - PIN_ODR_HIGH(GPIOI_PIN9) | \ - PIN_ODR_HIGH(GPIOI_PIN10) | \ - PIN_ODR_HIGH(GPIOI_PIN11) | \ - PIN_ODR_HIGH(GPIOI_PIN12) | \ - PIN_ODR_HIGH(GPIOI_PIN13) | \ - PIN_ODR_HIGH(GPIOI_PIN14) | \ - PIN_ODR_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_AFRL (PIN_AFIO_AF(GPIOI_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN7, 0U)) -#define VAL_GPIOI_AFRH (PIN_AFIO_AF(GPIOI_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ORESAT_C3_V4/board.mk b/boards/ORESAT_C3_V4/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ORESAT_C3_V4/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ORESAT_C3_V4/gdboocd.cmd b/boards/ORESAT_C3_V4/gdboocd.cmd deleted file mode 100644 index ac017d4e..00000000 --- a/boards/ORESAT_C3_V4/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ORESAT_C3_V4/oocd.cfg b/boards/ORESAT_C3_V4/oocd.cfg deleted file mode 100644 index d44f8d8f..00000000 --- a/boards/ORESAT_C3_V4/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f4x.cfg] - diff --git a/boards/ORESAT_C3_V5/board.c b/boards/ORESAT_C3_V5/board.c deleted file mode 100644 index 5f49a349..00000000 --- a/boards/ORESAT_C3_V5/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB1(STM32_GPIO_EN_MASK); - rccEnableAHB1(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ORESAT_C3_V5/board.h b/boards/ORESAT_C3_V5/board.h deleted file mode 100644 index c2d476e3..00000000 --- a/boards/ORESAT_C3_V5/board.h +++ /dev/null @@ -1,1355 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * OreSat C3 Prototype Board - * PART: STM32F439VI - * PACKAGE: LQFP100 - */ - -/* - * Board identifier. - */ -#define ORESAT_C3_V5 -#define BOARD_NAME "OreSat C3 v5" - -/* - * Board oscillators-related settings. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 32768U -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300U - -/* - * MCU type as defined in the ST header. - */ -#define STM32F439xx - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_PIN1 1U -#define GPIOA_PIN2 2U -#define GPIOA_PIN3 3U -#define GPIOA_PA_THERM 4U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_SPI1_MOSI 7U -#define GPIOA_I2C_PWROFF 8U -#define GPIOA_CAN1_SILENT 9U -#define GPIOA_CAN1_SHDN 10U -#define GPIOA_CAN1_RX 11U -#define GPIOA_CAN1_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN3 2U -#define GPIOB_SWO 3U -#define GPIOB_CAN2_SHDN 4U -#define GPIOB_CAN2_RX 5U -#define GPIOB_CAN2_TX 6U -#define GPIOB_CAN2_SILENT 7U -#define GPIOB_I2C1_SCL 8U -#define GPIOB_I2C1_SDA 9U -#define GPIOB_I2C2_SCL 10U -#define GPIOB_I2C2_SDA 11U -#define GPIOB_LO_SEN 12U -#define GPIOB_LO_SCLK 13U -#define GPIOB_LO_SDATA 14U -#define GPIOB_LO_PLL 15U - -#define GPIOC_VERIFY_TURN 0U -#define GPIOC_VERIFY_HELI 1U -#define GPIOC_CB_IOUT 2U -#define GPIOC_OPD_ISET 3U -#define GPIOC_RF_FWD 4U -#define GPIOC_RF_REV 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_SDIO_D0 8U -#define GPIOC_SDIO_D1 9U -#define GPIOC_SDIO_D2 10U -#define GPIOC_SDIO_D3 11U -#define GPIOC_SDIO_CK 12U -#define GPIOC_PIN13 13U -#define GPIOC_OSC32_IN 14U -#define GPIOC_OSC32_OUT 15U - -#define GPIOD_FIRE_HELI_1 0U -#define GPIOD_FIRE_TURN_1 1U -#define GPIOD_SDIO_CMD 2U -#define GPIOD_TEST_HELI 3U -#define GPIOD_UHF_ENABLE 4U -#define GPIOD_OPD_ENABLE 5U -#define GPIOD_TEST_TURN 6U -#define GPIOD_UHF_FLT 7U -#define GPIOD_USART3_TX 8U -#define GPIOD_USART3_RX 9U -#define GPIOD_UHF_IRQ 10U -#define GPIOD_UHF_CS 11U -#define GPIOD_LBAND_IRQ 12U -#define GPIOD_LBAND_CS 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_OPD_FAULT 0U -#define GPIOE_WDT 1U -#define GPIOE_FIRE_TURN_2 2U -#define GPIOE_FIRE_HELI_2 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_MMC_PWR 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_TOT_STATE 11U -#define GPIOE_PIN12 12U -#define GPIOE_LNA_ENABLE 13U -#define GPIOE_PA_ENABLE 14U -#define GPIOE_TOT_RESET 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_OSC_IN 0U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -#define GPIOI_PIN0 0U -#define GPIOI_PIN1 1U -#define GPIOI_PIN2 2U -#define GPIOI_PIN3 3U -#define GPIOI_PIN4 4U -#define GPIOI_PIN5 5U -#define GPIOI_PIN6 6U -#define GPIOI_PIN7 7U -#define GPIOI_PIN8 8U -#define GPIOI_PIN9 9U -#define GPIOI_PIN10 10U -#define GPIOI_PIN11 11U -#define GPIOI_PIN12 12U -#define GPIOI_PIN13 13U -#define GPIOI_PIN14 14U -#define GPIOI_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_SPI1_MISO PAL_LINE(GPIOA, 6U) -#define LINE_I2C_PWROFF PAL_LINE(GPIOA, 8U) -#define LINE_CAN1_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN1_SHDN PAL_LINE(GPIOA, 10U) -#define LINE_CAN2_SHDN PAL_LINE(GPIOB, 4U) -#define LINE_CAN2_SILENT PAL_LINE(GPIOB, 7U) -#define LINE_LO_SEN PAL_LINE(GPIOB, 12U) -#define LINE_LO_SCLK PAL_LINE(GPIOB, 13U) -#define LINE_LO_SDATA PAL_LINE(GPIOB, 14U) -#define LINE_LO_PLL PAL_LINE(GPIOB, 15U) -#define LINE_FIRE_HELI_1 PAL_LINE(GPIOD, 0U) -#define LINE_FIRE_TURN_1 PAL_LINE(GPIOD, 1U) -#define LINE_UHF_ENABLE PAL_LINE(GPIOD, 4U) -#define LINE_OPD_ENABLE PAL_LINE(GPIOD, 5U) -#define LINE_UHF_IRQ PAL_LINE(GPIOD, 10U) -#define LINE_UHF_CS PAL_LINE(GPIOD, 11U) -#define LINE_LBAND_IRQ PAL_LINE(GPIOD, 12U) -#define LINE_LBAND_CS PAL_LINE(GPIOD, 13U) -#define LINE_OPD_FAULT PAL_LINE(GPIOE, 0U) -#define LINE_WDT PAL_LINE(GPIOE, 1U) -#define LINE_FIRE_TURN_2 PAL_LINE(GPIOE, 2U) -#define LINE_FIRE_HELI_2 PAL_LINE(GPIOE, 3U) -#define LINE_MMC_PWR PAL_LINE(GPIOE, 7U) -#define LINE_TOT_STATE PAL_LINE(GPIOE, 11U) -#define LINE_LNA_ENABLE PAL_LINE(GPIOE, 13U) -#define LINE_PA_ENABLE PAL_LINE(GPIOE, 14U) -#define LINE_TOT_RESET PAL_LINE(GPIOE, 15U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - PIN0 (analog). - * PA1 - PIN1 (analog). - * PA2 - PIN2 (analog). - * PA3 - PIN3 (analog). - * PA4 - PA_THERM (analog). - * PA5 - SPI1_SCK (alternate 5). - * PA6 - SPI1_MISO (alternate 5). - * PA7 - SPI1_MOSI (alternate 5). - * PA8 - I2C_PWROFF (output pushpull). - * PA9 - CAN1_SILENT (output pushpull). - * PA10 - CAN1_SHDN (output pushpull). - * PA11 - CAN1_RX (alternate 9). - * PA12 - CAN1_TX (alternate 9). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_PIN0) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ANALOG(GPIOA_PIN2) | \ - PIN_MODE_ANALOG(GPIOA_PIN3) | \ - PIN_MODE_ANALOG(GPIOA_PA_THERM) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_OUTPUT(GPIOA_I2C_PWROFF) | \ - PIN_MODE_OUTPUT(GPIOA_CAN1_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN1_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PA_THERM) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_I2C_PWROFF) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_SILENT) |\ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_PIN0) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_PIN2) | \ - PIN_OSPEED_HIGH(GPIOA_PIN3) | \ - PIN_OSPEED_HIGH(GPIOA_PA_THERM) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOA_I2C_PWROFF) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOA_PA_THERM) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_MOSI) | \ - PIN_PUPDR_FLOATING(GPIOA_I2C_PWROFF) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_SILENT) |\ - PIN_PUPDR_FLOATING(GPIOA_CAN1_SHDN) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_RX) | \ - PIN_PUPDR_FLOATING(GPIOA_CAN1_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PA_THERM) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_ODR_LOW(GPIOA_I2C_PWROFF) | \ - PIN_ODR_LOW(GPIOA_CAN1_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN1_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN1_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN1_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOA_PA_THERM, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 5U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_I2C_PWROFF, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_RX, 9U) | \ - PIN_AFIO_AF(GPIOA_CAN1_TX, 9U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - PIN1 (analog). - * PB2 - PIN3 (analog). - * PB3 - SWO (alternate 0). - * PB4 - CAN2_SHDN (output pushpull). - * PB5 - CAN2_RX (alternate 9). - * PB6 - CAN2_TX (alternate 9). - * PB7 - CAN2_SILENT (output pushpull). - * PB8 - I2C1_SCL (alternate 4). - * PB9 - I2C1_SDA (alternate 4). - * PB10 - I2C2_SCL (alternate 4). - * PB11 - I2C2_SDA (alternate 4). - * PB12 - LO_SEN (output pushpull). - * PB13 - LO_SCLK (output pushpull). - * PB14 - LO_SDATA (output pushpull). - * PB15 - LO_PLL (input). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_ALTERNATE(GPIOB_SWO) | \ - PIN_MODE_ANALOG(GPIOB_CAN2_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_RX) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_TX) | \ - PIN_MODE_ANALOG(GPIOB_CAN2_SILENT) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SDA) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SEN) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SCLK) | \ - PIN_MODE_OUTPUT(GPIOB_LO_SDATA) | \ - PIN_MODE_INPUT(GPIOB_LO_PLL)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SWO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_SILENT) |\ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SEN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_SDATA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LO_PLL)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_SWO) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_SHDN) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_RX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_TX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_SILENT) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_I2C2_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C2_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SEN) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SCLK) | \ - PIN_OSPEED_HIGH(GPIOB_LO_SDATA) | \ - PIN_OSPEED_HIGH(GPIOB_LO_PLL)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_SWO) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_SHDN) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_RX) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_TX) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN2_SILENT) |\ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C2_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C2_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SEN) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SCLK) | \ - PIN_PUPDR_FLOATING(GPIOB_LO_SDATA) | \ - PIN_PUPDR_PULLUP(GPIOB_LO_PLL)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_SWO) | \ - PIN_ODR_LOW(GPIOB_CAN2_SHDN) | \ - PIN_ODR_HIGH(GPIOB_CAN2_RX) | \ - PIN_ODR_HIGH(GPIOB_CAN2_TX) | \ - PIN_ODR_LOW(GPIOB_CAN2_SILENT) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_I2C2_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C2_SDA) | \ - PIN_ODR_HIGH(GPIOB_LO_SEN) | \ - PIN_ODR_HIGH(GPIOB_LO_SCLK) | \ - PIN_ODR_HIGH(GPIOB_LO_SDATA) | \ - PIN_ODR_HIGH(GPIOB_LO_PLL)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_SWO, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_RX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_TX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_SILENT, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_I2C1_SCL, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C2_SCL, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C2_SDA, 4U) | \ - PIN_AFIO_AF(GPIOB_LO_SEN, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_SCLK, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_SDATA, 5U) | \ - PIN_AFIO_AF(GPIOB_LO_PLL, 5U)) - -/* - * GPIOC setup: - * - * PC0 - VERIFY_TURN (analog). - * PC1 - VERIFY_HELI (analog). - * PC2 - CB_IOUT (analog). - * PC3 - OPD_ISET (analog). - * PC4 - RF_FWD (analog). - * PC5 - RF_REV (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - SDIO_D0 (alternate 12). - * PC9 - SDIO_D1 (alternate 12). - * PC10 - SDIO_D2 (alternate 12). - * PC11 - SDIO_D3 (alternate 12). - * PC12 - SDIO_CK (alternate 12). - * PC13 - PIN13 (analog). - * PC14 - OSC32_IN (analog). - * PC15 - OSC32_OUT (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_VERIFY_TURN) | \ - PIN_MODE_ANALOG(GPIOC_VERIFY_HELI) | \ - PIN_MODE_ANALOG(GPIOC_CB_IOUT) | \ - PIN_MODE_ANALOG(GPIOC_OPD_ISET) | \ - PIN_MODE_ANALOG(GPIOC_RF_FWD) | \ - PIN_MODE_ANALOG(GPIOC_RF_REV) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D0) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D1) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D2) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D3) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_CK) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_IN) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_VERIFY_TURN) |\ - PIN_OTYPE_PUSHPULL(GPIOC_VERIFY_HELI) |\ - PIN_OTYPE_PUSHPULL(GPIOC_CB_IOUT) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OPD_ISET) | \ - PIN_OTYPE_PUSHPULL(GPIOC_RF_FWD) | \ - PIN_OTYPE_PUSHPULL(GPIOC_RF_REV) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_CK) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_VERIFY_TURN) | \ - PIN_OSPEED_HIGH(GPIOC_VERIFY_HELI) | \ - PIN_OSPEED_HIGH(GPIOC_CB_IOUT) | \ - PIN_OSPEED_HIGH(GPIOC_OPD_ISET) | \ - PIN_OSPEED_HIGH(GPIOC_RF_FWD) | \ - PIN_OSPEED_HIGH(GPIOC_RF_REV) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D0) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D1) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D2) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D3) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_CK) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_VERIFY_TURN) |\ - PIN_PUPDR_FLOATING(GPIOC_VERIFY_HELI) |\ - PIN_PUPDR_FLOATING(GPIOC_CB_IOUT) | \ - PIN_PUPDR_FLOATING(GPIOC_OPD_ISET) | \ - PIN_PUPDR_FLOATING(GPIOC_RF_FWD) | \ - PIN_PUPDR_FLOATING(GPIOC_RF_REV) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D0) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D1) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D2) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_D3) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIO_CK) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_VERIFY_TURN) | \ - PIN_ODR_HIGH(GPIOC_VERIFY_HELI) | \ - PIN_ODR_HIGH(GPIOC_CB_IOUT) | \ - PIN_ODR_HIGH(GPIOC_OPD_ISET) | \ - PIN_ODR_HIGH(GPIOC_RF_FWD) | \ - PIN_ODR_HIGH(GPIOC_RF_REV) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D0) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D1) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D2) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D3) | \ - PIN_ODR_HIGH(GPIOC_SDIO_CK) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_VERIFY_TURN, 0U) | \ - PIN_AFIO_AF(GPIOC_VERIFY_HELI, 0U) | \ - PIN_AFIO_AF(GPIOC_CB_IOUT, 0U) | \ - PIN_AFIO_AF(GPIOC_OPD_ISET, 0U) | \ - PIN_AFIO_AF(GPIOC_RF_FWD, 0U) | \ - PIN_AFIO_AF(GPIOC_RF_REV, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_SDIO_D0, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D1, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D2, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D3, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_CK, 12U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U)) - -/* - * GPIOD setup: - * - * PD0 - FIRE_HELI_1 (output pushpull). - * PD1 - FIRE_TURN_1 (output pushpull). - * PD2 - SDIO_CMD (alternate 12). - * PD3 - TEST_HELI (analog). - * PD4 - UHF_ENABLE (output pushpull). - * PD5 - OPD_ENABLE (output pushpull). - * PD6 - TEST_TURN (analog). - * PD7 - UHF_FLT (analog). - * PD8 - USART3_TX (alternate 7). - * PD9 - USART3_RX (alternate 7). - * PD10 - UHF_IRQ (input). - * PD11 - UHF_CS (output). - * PD12 - LBAND_IRQ (input). - * PD13 - LBAND_CS (output). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_OUTPUT(GPIOD_FIRE_HELI_1) | \ - PIN_MODE_OUTPUT(GPIOD_FIRE_TURN_1) | \ - PIN_MODE_ALTERNATE(GPIOD_SDIO_CMD) | \ - PIN_MODE_ANALOG(GPIOD_TEST_HELI) | \ - PIN_MODE_OUTPUT(GPIOD_UHF_ENABLE) | \ - PIN_MODE_OUTPUT(GPIOD_OPD_ENABLE) | \ - PIN_MODE_ANALOG(GPIOD_TEST_TURN) | \ - PIN_MODE_ANALOG(GPIOD_UHF_FLT) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_TX) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_RX) | \ - PIN_MODE_INPUT(GPIOD_UHF_IRQ) | \ - PIN_MODE_OUTPUT(GPIOD_UHF_CS) | \ - PIN_MODE_INPUT(GPIOD_LBAND_IRQ) | \ - PIN_MODE_OUTPUT(GPIOD_LBAND_CS) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_FIRE_HELI_1) |\ - PIN_OTYPE_PUSHPULL(GPIOD_FIRE_TURN_1) |\ - PIN_OTYPE_PUSHPULL(GPIOD_SDIO_CMD) | \ - PIN_OTYPE_PUSHPULL(GPIOD_TEST_HELI) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOD_OPD_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOD_TEST_TURN) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_FLT) | \ - PIN_OTYPE_PUSHPULL(GPIOD_USART3_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOD_USART3_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOD_UHF_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LBAND_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LBAND_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_FIRE_HELI_1) | \ - PIN_OSPEED_HIGH(GPIOD_FIRE_TURN_1) | \ - PIN_OSPEED_HIGH(GPIOD_SDIO_CMD) | \ - PIN_OSPEED_HIGH(GPIOD_TEST_HELI) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOD_OPD_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOD_TEST_TURN) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_FLT) | \ - PIN_OSPEED_HIGH(GPIOD_USART3_TX) | \ - PIN_OSPEED_HIGH(GPIOD_USART3_RX) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_IRQ) | \ - PIN_OSPEED_HIGH(GPIOD_UHF_CS) | \ - PIN_OSPEED_HIGH(GPIOD_LBAND_IRQ) | \ - PIN_OSPEED_HIGH(GPIOD_LBAND_CS) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_FIRE_HELI_1) |\ - PIN_PUPDR_FLOATING(GPIOD_FIRE_TURN_1) |\ - PIN_PUPDR_FLOATING(GPIOD_SDIO_CMD) | \ - PIN_PUPDR_FLOATING(GPIOD_TEST_HELI) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOD_OPD_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOD_TEST_TURN) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_FLT) | \ - PIN_PUPDR_FLOATING(GPIOD_USART3_TX) | \ - PIN_PUPDR_FLOATING(GPIOD_USART3_RX) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_IRQ) | \ - PIN_PUPDR_FLOATING(GPIOD_UHF_CS) | \ - PIN_PUPDR_FLOATING(GPIOD_LBAND_IRQ) | \ - PIN_PUPDR_FLOATING(GPIOD_LBAND_CS) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_LOW(GPIOD_FIRE_HELI_1) | \ - PIN_ODR_LOW(GPIOD_FIRE_TURN_1) | \ - PIN_ODR_HIGH(GPIOD_SDIO_CMD) | \ - PIN_ODR_HIGH(GPIOD_TEST_HELI) | \ - PIN_ODR_HIGH(GPIOD_UHF_ENABLE) | \ - PIN_ODR_HIGH(GPIOD_OPD_ENABLE) | \ - PIN_ODR_HIGH(GPIOD_TEST_TURN) | \ - PIN_ODR_HIGH(GPIOD_UHF_FLT) | \ - PIN_ODR_HIGH(GPIOD_USART3_TX) | \ - PIN_ODR_HIGH(GPIOD_USART3_RX) | \ - PIN_ODR_HIGH(GPIOD_UHF_IRQ) | \ - PIN_ODR_HIGH(GPIOD_UHF_CS) | \ - PIN_ODR_HIGH(GPIOD_LBAND_IRQ) | \ - PIN_ODR_HIGH(GPIOD_LBAND_CS) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_FIRE_HELI_1, 0U) | \ - PIN_AFIO_AF(GPIOD_FIRE_TURN_1, 0U) | \ - PIN_AFIO_AF(GPIOD_SDIO_CMD, 12U) | \ - PIN_AFIO_AF(GPIOD_TEST_HELI, 0U) | \ - PIN_AFIO_AF(GPIOD_UHF_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOD_OPD_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOD_TEST_TURN, 0U) | \ - PIN_AFIO_AF(GPIOD_UHF_FLT, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_USART3_TX, 7U) | \ - PIN_AFIO_AF(GPIOD_USART3_RX, 7U) | \ - PIN_AFIO_AF(GPIOD_UHF_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOD_UHF_CS, 0U) | \ - PIN_AFIO_AF(GPIOD_LBAND_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOD_LBAND_CS, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - OPD_FAULT (input). - * PE1 - WDT (output pushpull). - * PE2 - FIRE_TURN_2 (output pushpull). - * PE3 - FIRE_HELI_2 (output pushpull). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - MMC_PWR (output pushpull). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - TOT_STATE (input). - * PE12 - PIN12 (analog). - * PE13 - LNA_ENABLE (output pushpull). - * PE14 - PA_ENABLE (output pushpull). - * PE15 - TOT_RESET (output pushpull). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_OPD_FAULT) | \ - PIN_MODE_OUTPUT(GPIOE_WDT) | \ - PIN_MODE_OUTPUT(GPIOE_FIRE_TURN_2) | \ - PIN_MODE_OUTPUT(GPIOE_FIRE_HELI_2) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_OUTPUT(GPIOE_MMC_PWR) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_TOT_STATE) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_OUTPUT(GPIOE_LNA_ENABLE) | \ - PIN_MODE_OUTPUT(GPIOE_PA_ENABLE) | \ - PIN_MODE_OUTPUT(GPIOE_TOT_RESET)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_OPD_FAULT) | \ - PIN_OTYPE_PUSHPULL(GPIOE_WDT) | \ - PIN_OTYPE_PUSHPULL(GPIOE_FIRE_TURN_2) |\ - PIN_OTYPE_PUSHPULL(GPIOE_FIRE_HELI_2) |\ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_MMC_PWR) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_TOT_STATE) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_LNA_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PA_ENABLE) | \ - PIN_OTYPE_PUSHPULL(GPIOE_TOT_RESET)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_OPD_FAULT) | \ - PIN_OSPEED_HIGH(GPIOE_WDT) | \ - PIN_OSPEED_HIGH(GPIOE_FIRE_TURN_2) | \ - PIN_OSPEED_HIGH(GPIOE_FIRE_HELI_2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_MMC_PWR) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_TOT_STATE) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_LNA_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOE_PA_ENABLE) | \ - PIN_OSPEED_HIGH(GPIOE_TOT_RESET)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_OPD_FAULT) | \ - PIN_PUPDR_FLOATING(GPIOE_WDT) | \ - PIN_PUPDR_FLOATING(GPIOE_FIRE_TURN_2) |\ - PIN_PUPDR_FLOATING(GPIOE_FIRE_HELI_2) |\ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_MMC_PWR) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_TOT_STATE) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_LNA_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOE_PA_ENABLE) | \ - PIN_PUPDR_FLOATING(GPIOE_TOT_RESET)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_OPD_FAULT) | \ - PIN_ODR_LOW(GPIOE_WDT) | \ - PIN_ODR_LOW(GPIOE_FIRE_TURN_2) | \ - PIN_ODR_LOW(GPIOE_FIRE_HELI_2) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_MMC_PWR) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_TOT_STATE) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_LOW(GPIOE_LNA_ENABLE) | \ - PIN_ODR_HIGH(GPIOE_PA_ENABLE) | \ - PIN_ODR_LOW(GPIOE_TOT_RESET)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_OPD_FAULT, 0U) | \ - PIN_AFIO_AF(GPIOE_WDT, 0U) | \ - PIN_AFIO_AF(GPIOE_FIRE_TURN_2, 0U) | \ - PIN_AFIO_AF(GPIOE_FIRE_HELI_2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_MMC_PWR, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_TOT_STATE, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_LNA_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOE_PA_ENABLE, 0U) | \ - PIN_AFIO_AF(GPIOE_TOT_RESET, 0U)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (analog). - * PF1 - PIN1 (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_PIN0) | \ - PIN_MODE_ANALOG(GPIOF_PIN1) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOG_MODER (PIN_MODE_ANALOG(GPIOG_PIN0) | \ - PIN_MODE_ANALOG(GPIOG_PIN1) | \ - PIN_MODE_ANALOG(GPIOG_PIN2) | \ - PIN_MODE_ANALOG(GPIOG_PIN3) | \ - PIN_MODE_ANALOG(GPIOG_PIN4) | \ - PIN_MODE_ANALOG(GPIOG_PIN5) | \ - PIN_MODE_ANALOG(GPIOG_PIN6) | \ - PIN_MODE_ANALOG(GPIOG_PIN7) | \ - PIN_MODE_ANALOG(GPIOG_PIN8) | \ - PIN_MODE_ANALOG(GPIOG_PIN9) | \ - PIN_MODE_ANALOG(GPIOG_PIN10) | \ - PIN_MODE_ANALOG(GPIOG_PIN11) | \ - PIN_MODE_ANALOG(GPIOG_PIN12) | \ - PIN_MODE_ANALOG(GPIOG_PIN13) | \ - PIN_MODE_ANALOG(GPIOG_PIN14) | \ - PIN_MODE_ANALOG(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (analog). - * PH1 - OSC_OUT (analog). - * PH2 - PIN2 (analog). - * PH3 - PIN3 (analog). - * PH4 - PIN4 (analog). - * PH5 - PIN5 (analog). - * PH6 - PIN6 (analog). - * PH7 - PIN7 (analog). - * PH8 - PIN8 (analog). - * PH9 - PIN9 (analog). - * PH10 - PIN10 (analog). - * PH11 - PIN11 (analog). - * PH12 - PIN12 (analog). - * PH13 - PIN13 (analog). - * PH14 - PIN14 (analog). - * PH15 - PIN15 (analog). - */ -#define VAL_GPIOH_MODER (PIN_MODE_ANALOG(GPIOH_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOH_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOH_PIN2) | \ - PIN_MODE_ANALOG(GPIOH_PIN3) | \ - PIN_MODE_ANALOG(GPIOH_PIN4) | \ - PIN_MODE_ANALOG(GPIOH_PIN5) | \ - PIN_MODE_ANALOG(GPIOH_PIN6) | \ - PIN_MODE_ANALOG(GPIOH_PIN7) | \ - PIN_MODE_ANALOG(GPIOH_PIN8) | \ - PIN_MODE_ANALOG(GPIOH_PIN9) | \ - PIN_MODE_ANALOG(GPIOH_PIN10) | \ - PIN_MODE_ANALOG(GPIOH_PIN11) | \ - PIN_MODE_ANALOG(GPIOH_PIN12) | \ - PIN_MODE_ANALOG(GPIOH_PIN13) | \ - PIN_MODE_ANALOG(GPIOH_PIN14) | \ - PIN_MODE_ANALOG(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) - -/* - * GPIOI setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOI_MODER (PIN_MODE_ANALOG(GPIOI_PIN0) | \ - PIN_MODE_ANALOG(GPIOI_PIN1) | \ - PIN_MODE_ANALOG(GPIOI_PIN2) | \ - PIN_MODE_ANALOG(GPIOI_PIN3) | \ - PIN_MODE_ANALOG(GPIOI_PIN4) | \ - PIN_MODE_ANALOG(GPIOI_PIN5) | \ - PIN_MODE_ANALOG(GPIOI_PIN6) | \ - PIN_MODE_ANALOG(GPIOI_PIN7) | \ - PIN_MODE_ANALOG(GPIOI_PIN8) | \ - PIN_MODE_ANALOG(GPIOI_PIN9) | \ - PIN_MODE_ANALOG(GPIOI_PIN10) | \ - PIN_MODE_ANALOG(GPIOI_PIN11) | \ - PIN_MODE_ANALOG(GPIOI_PIN12) | \ - PIN_MODE_ANALOG(GPIOI_PIN13) | \ - PIN_MODE_ANALOG(GPIOI_PIN14) | \ - PIN_MODE_ANALOG(GPIOI_PIN15)) -#define VAL_GPIOI_OTYPER (PIN_OTYPE_PUSHPULL(GPIOI_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN15)) -#define VAL_GPIOI_OSPEEDR (PIN_OSPEED_HIGH(GPIOI_PIN0) | \ - PIN_OSPEED_HIGH(GPIOI_PIN1) | \ - PIN_OSPEED_HIGH(GPIOI_PIN2) | \ - PIN_OSPEED_HIGH(GPIOI_PIN3) | \ - PIN_OSPEED_HIGH(GPIOI_PIN4) | \ - PIN_OSPEED_HIGH(GPIOI_PIN5) | \ - PIN_OSPEED_HIGH(GPIOI_PIN6) | \ - PIN_OSPEED_HIGH(GPIOI_PIN7) | \ - PIN_OSPEED_HIGH(GPIOI_PIN8) | \ - PIN_OSPEED_HIGH(GPIOI_PIN9) | \ - PIN_OSPEED_HIGH(GPIOI_PIN10) | \ - PIN_OSPEED_HIGH(GPIOI_PIN11) | \ - PIN_OSPEED_HIGH(GPIOI_PIN12) | \ - PIN_OSPEED_HIGH(GPIOI_PIN13) | \ - PIN_OSPEED_HIGH(GPIOI_PIN14) | \ - PIN_OSPEED_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_PUPDR (PIN_PUPDR_FLOATING(GPIOI_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN15)) -#define VAL_GPIOI_ODR (PIN_ODR_HIGH(GPIOI_PIN0) | \ - PIN_ODR_HIGH(GPIOI_PIN1) | \ - PIN_ODR_HIGH(GPIOI_PIN2) | \ - PIN_ODR_HIGH(GPIOI_PIN3) | \ - PIN_ODR_HIGH(GPIOI_PIN4) | \ - PIN_ODR_HIGH(GPIOI_PIN5) | \ - PIN_ODR_HIGH(GPIOI_PIN6) | \ - PIN_ODR_HIGH(GPIOI_PIN7) | \ - PIN_ODR_HIGH(GPIOI_PIN8) | \ - PIN_ODR_HIGH(GPIOI_PIN9) | \ - PIN_ODR_HIGH(GPIOI_PIN10) | \ - PIN_ODR_HIGH(GPIOI_PIN11) | \ - PIN_ODR_HIGH(GPIOI_PIN12) | \ - PIN_ODR_HIGH(GPIOI_PIN13) | \ - PIN_ODR_HIGH(GPIOI_PIN14) | \ - PIN_ODR_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_AFRL (PIN_AFIO_AF(GPIOI_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN7, 0U)) -#define VAL_GPIOI_AFRH (PIN_AFIO_AF(GPIOI_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ORESAT_C3_V5/board.mk b/boards/ORESAT_C3_V5/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ORESAT_C3_V5/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ORESAT_C3_V5/gdboocd.cmd b/boards/ORESAT_C3_V5/gdboocd.cmd deleted file mode 100644 index ac017d4e..00000000 --- a/boards/ORESAT_C3_V5/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ORESAT_C3_V5/oocd.cfg b/boards/ORESAT_C3_V5/oocd.cfg deleted file mode 100644 index d44f8d8f..00000000 --- a/boards/ORESAT_C3_V5/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f4x.cfg] - diff --git a/boards/ORESAT_RWB_V1_1/board.c b/boards/ORESAT_RWB_V1_1/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/ORESAT_RWB_V1_1/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ORESAT_RWB_V1_1/board.h b/boards/ORESAT_RWB_V1_1/board.h deleted file mode 100644 index ada36699..00000000 --- a/boards/ORESAT_RWB_V1_1/board.h +++ /dev/null @@ -1,927 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * ACS V1.1 STM32F042K6 Board Configuration - * PART: STM32F042K6T6 - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_ORESAT_RWB_V1_1 -#define BOARD_NAME "Oresat RWB V1.1" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#define STM32_HSECLK 16000000U - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 0U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_CURR_FDB_MAG 0U -#define GPIOA_CURR_FDB_BLDC 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_FAULT_BLDC 4U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_CAN_SILENT 6U -#define GPIOA_TIM1_CH1N 7U -#define GPIOA_TIM1_CH1 8U -#define GPIOA_TIM1_CH2 9U -#define GPIOA_TIM1_CH3 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U -#define GPIOA_SPI1_NSS 15U - -#define GPIOB_TIM1_CH2N 0U -#define GPIOB_TIM1_CH3N 1U -#define GPIOB_PIN2 2U -#define GPIOB_EN_MAG 3U -#define GPIOB_SPI1_MISO 4U -#define GPIOB_PIN5 5U -#define GPIOB_EN_BLDC 6U -#define GPIOB_FAULT_MAG 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_SPI1_NSS PAL_LINE(GPIOA, 15U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - CURR_FDB_MAG (analog). - * PA1 - CURR_FDB_BLDC (analog). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - FAULT_BLDC (input pullup). - * PA5 - SPI1_SCK (alternate 0). - * PA6 - CAN_SILENT (output pulldown). - * PA7 - TIM1_CH1N (alternate 2). - * PA8 - TIM1_CH1 (alternate 2). - * PA9 - TIM1_CH2 (alternate 2). - * PA10 - TIM1_CH3 (alternate 2). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - SPI1_NSS (output pushpull maximum). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_CURR_FDB_MAG) | \ - PIN_MODE_ANALOG(GPIOA_CURR_FDB_BLDC) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_INPUT(GPIOA_FAULT_BLDC) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH1) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH1N) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH2) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH3) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_OUTPUT(GPIOA_SPI1_NSS)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_CURR_FDB_MAG) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CURR_FDB_BLDC) |\ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_FAULT_BLDC) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH1N) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_NSS)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_CURR_FDB_MAG) | \ - PIN_OSPEED_HIGH(GPIOA_CURR_FDB_BLDC) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_FAULT_BLDC) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH1N) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH1) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH2) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH3) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_NSS)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_CURR_FDB_MAG) | \ - PIN_PUPDR_FLOATING(GPIOA_CURR_FDB_BLDC) |\ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_FAULT_BLDC) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH1N) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH1) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH2) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH3) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_NSS)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_CURR_FDB_MAG) | \ - PIN_ODR_HIGH(GPIOA_CURR_FDB_BLDC) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_FAULT_BLDC) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH1N) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH1) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH2) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH3) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_NSS)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_CURR_FDB_MAG, 0U) | \ - PIN_AFIO_AF(GPIOA_CURR_FDB_BLDC, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_FAULT_BLDC, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH1N, 2U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_TIM1_CH1, 2U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH2, 2U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH3, 2U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_NSS, 0U)) - -/* - * GPIOB setup: - * - * PB0 - TIM1_CH2N (alternate 2). - * PB1 - TIM1_CH3N (alternate 2). - * PB2 - NA (input pullup). - * PB3 - EN_MAG (output pushpull maximum). - * PB4 - SPI1_MISO (alternate 0). - * PB5 - PIN5 (input pullup). - * PB6 - EN_BLDC (output pushpull maximum) - * PB7 - FAULT_MAG (input pullup). - * PB8 - PIN8_BOOT0 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ALTERNATE(GPIOB_TIM1_CH2N) | \ - PIN_MODE_ALTERNATE(GPIOB_TIM1_CH3N) | \ - PIN_MODE_INPUT(GPIOB_PIN2) | \ - PIN_MODE_OUTPUT(GPIOB_EN_MAG) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI1_MISO) | \ - PIN_MODE_INPUT(GPIOB_PIN5) | \ - PIN_MODE_OUTPUT(GPIOB_EN_BLDC) | \ - PIN_MODE_INPUT(GPIOB_FAULT_MAG) | \ - PIN_MODE_INPUT(GPIOB_PIN8) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_TIM1_CH2N) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TIM1_CH3N) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_EN_MAG) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_EN_BLDC) | \ - PIN_OTYPE_PUSHPULL(GPIOB_FAULT_MAG) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_TIM1_CH2N) | \ - PIN_OSPEED_HIGH(GPIOB_TIM1_CH3N) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_EN_MAG) | \ - PIN_OSPEED_HIGH(GPIOB_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_EN_BLDC) | \ - PIN_OSPEED_HIGH(GPIOB_FAULT_MAG) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_TIM1_CH2N) | \ - PIN_PUPDR_PULLUP(GPIOB_TIM1_CH3N) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOB_EN_MAG) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI1_MISO) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOB_EN_BLDC) | \ - PIN_PUPDR_PULLUP(GPIOB_FAULT_MAG) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_TIM1_CH2N) | \ - PIN_ODR_HIGH(GPIOB_TIM1_CH3N) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_EN_MAG) | \ - PIN_ODR_HIGH(GPIOB_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_EN_BLDC) | \ - PIN_ODR_HIGH(GPIOB_FAULT_MAG) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_TIM1_CH2N, 2U) | \ - PIN_AFIO_AF(GPIOB_TIM1_CH3N, 2U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_EN_MAG, 0U) | \ - PIN_AFIO_AF(GPIOB_SPI1_MISO, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_EN_BLDC, 0U) | \ - PIN_AFIO_AF(GPIOB_FAULT_MAG, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - PIN14 (input pullup). - * PC15 - PIN15 (input pullup). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_PIN14) | \ - PIN_MODE_INPUT(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (input pullup). - * PF1 - OSC_OUT (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \ - PIN_MODE_INPUT(GPIOF_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_OSC_IN) | \ - PIN_PUPDR_PULLUP(GPIOF_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ORESAT_RWB_V1_1/board.mk b/boards/ORESAT_RWB_V1_1/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ORESAT_RWB_V1_1/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ORESAT_RWB_V1_1/gdboocd.cmd b/boards/ORESAT_RWB_V1_1/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/ORESAT_RWB_V1_1/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ORESAT_RWB_V1_1/oocd.cfg b/boards/ORESAT_RWB_V1_1/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/ORESAT_RWB_V1_1/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/ORESAT_RWB_V3/board.c b/boards/ORESAT_RWB_V3/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/ORESAT_RWB_V3/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ORESAT_RWB_V3/board.h b/boards/ORESAT_RWB_V3/board.h deleted file mode 100644 index a3d7c88f..00000000 --- a/boards/ORESAT_RWB_V3/board.h +++ /dev/null @@ -1,925 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * ACS V3 STM32F042K6 Board Configuration - * PART: STM32F042K6T6 - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_ORESAT_RWB_V3 -#define BOARD_NAME "Oresat RWB V3" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_CURR_FDB_MAG 0U -#define GPIOA_CURR_FDB_BLDC 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_FAULT_BLDC 4U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_PA6 6U -#define GPIOA_SPI1_NSS 6U -#define GPIOA_TIM1_CH1N 7U -#define GPIOA_TIM1_CH1 8U -#define GPIOA_TIM1_CH2 9U -#define GPIOA_TIM1_CH3 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_CAN_SILENT 15U - -#define GPIOB_TIM1_CH2N 0U -#define GPIOB_TIM1_CH3N 1U -#define GPIOB_PIN2 2U -#define GPIOB_EN_MAG 3U -#define GPIOB_SPI1_MISO 4U -#define GPIOB_PIN5 5U -#define GPIOB_EN_BLDC 6U -#define GPIOB_FAULT_MAG 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_SPI1_NSS PAL_LINE(GPIOA, 6U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - CURR_FDB_MAG (analog). - * PA1 - CURR_FDB_BLDC (analog). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - FAULT_BLDC (input pullup). - * PA5 - SPI1_SCK (alternate 0). - * PA6 - SPI1_NSS (output pushpull maximum). - * PA7 - TIM1_CH1N (alternate 2). - * PA8 - TIM1_CH1 (alternate 2). - * PA9 - TIM1_CH2 (alternate 2). - * PA10 - TIM1_CH3 (alternate 2). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - CAN_SILENT (output pulldown). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_CURR_FDB_MAG) | \ - PIN_MODE_ANALOG(GPIOA_CURR_FDB_BLDC) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_INPUT(GPIOA_FAULT_BLDC) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_OUTPUT(GPIOA_SPI1_NSS) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH1) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH1N) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH2) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH3) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_CURR_FDB_MAG) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CURR_FDB_BLDC) |\ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_FAULT_BLDC) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_NSS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH1N) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_CURR_FDB_MAG) | \ - PIN_OSPEED_HIGH(GPIOA_CURR_FDB_BLDC) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_FAULT_BLDC) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_NSS) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH1N) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH1) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH2) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH3) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_CURR_FDB_MAG) | \ - PIN_PUPDR_FLOATING(GPIOA_CURR_FDB_BLDC) |\ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_FAULT_BLDC) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_NSS) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH1N) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH1) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH2) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH3) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_CURR_FDB_MAG) | \ - PIN_ODR_HIGH(GPIOA_CURR_FDB_BLDC) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_FAULT_BLDC) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_NSS) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH1N) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH1) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH2) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH3) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_CURR_FDB_MAG, 0U) | \ - PIN_AFIO_AF(GPIOA_CURR_FDB_BLDC, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_FAULT_BLDC, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_NSS, 0U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH1N, 2U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_TIM1_CH1, 2U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH2, 2U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH3, 2U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U)) - -/* - * GPIOB setup: - * - * PB0 - TIM1_CH2N (alternate 2). - * PB1 - TIM1_CH3N (alternate 2). - * PB2 - NA (input pullup). - * PB3 - EN_MAG (output pushpull maximum). - * PB4 - SPI1_MISO (alternate 0). - * PB5 - PIN5 (input pullup). - * PB6 - EN_BLDC (output pushpull maximum) - * PB7 - FAULT_MAG (input pullup). - * PB8 - PIN8_BOOT0 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ALTERNATE(GPIOB_TIM1_CH2N) | \ - PIN_MODE_ALTERNATE(GPIOB_TIM1_CH3N) | \ - PIN_MODE_INPUT(GPIOB_PIN2) | \ - PIN_MODE_OUTPUT(GPIOB_EN_MAG) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI1_MISO) | \ - PIN_MODE_INPUT(GPIOB_PIN5) | \ - PIN_MODE_OUTPUT(GPIOB_EN_BLDC) | \ - PIN_MODE_INPUT(GPIOB_FAULT_MAG) | \ - PIN_MODE_INPUT(GPIOB_PIN8) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_TIM1_CH2N) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TIM1_CH3N) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_EN_MAG) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_EN_BLDC) | \ - PIN_OTYPE_PUSHPULL(GPIOB_FAULT_MAG) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_TIM1_CH2N) | \ - PIN_OSPEED_HIGH(GPIOB_TIM1_CH3N) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_EN_MAG) | \ - PIN_OSPEED_HIGH(GPIOB_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_EN_BLDC) | \ - PIN_OSPEED_HIGH(GPIOB_FAULT_MAG) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_TIM1_CH2N) | \ - PIN_PUPDR_PULLUP(GPIOB_TIM1_CH3N) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOB_EN_MAG) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI1_MISO) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOB_EN_BLDC) | \ - PIN_PUPDR_PULLUP(GPIOB_FAULT_MAG) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_TIM1_CH2N) | \ - PIN_ODR_HIGH(GPIOB_TIM1_CH3N) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_EN_MAG) | \ - PIN_ODR_HIGH(GPIOB_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_EN_BLDC) | \ - PIN_ODR_HIGH(GPIOB_FAULT_MAG) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_TIM1_CH2N, 2U) | \ - PIN_AFIO_AF(GPIOB_TIM1_CH3N, 2U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_EN_MAG, 0U) | \ - PIN_AFIO_AF(GPIOB_SPI1_MISO, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_EN_BLDC, 0U) | \ - PIN_AFIO_AF(GPIOB_FAULT_MAG, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - PIN14 (input pullup). - * PC15 - PIN15 (input pullup). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_PIN14) | \ - PIN_MODE_INPUT(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (input pullup). - * PF1 - OSC_OUT (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \ - PIN_MODE_INPUT(GPIOF_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_OSC_IN) | \ - PIN_PUPDR_PULLUP(GPIOF_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ORESAT_RWB_V3/board.mk b/boards/ORESAT_RWB_V3/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ORESAT_RWB_V3/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ORESAT_RWB_V3/gdboocd.cmd b/boards/ORESAT_RWB_V3/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/ORESAT_RWB_V3/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ORESAT_RWB_V3/oocd.cfg b/boards/ORESAT_RWB_V3/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/ORESAT_RWB_V3/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/ORESAT_RWB_V4/board.c b/boards/ORESAT_RWB_V4/board.c deleted file mode 100644 index 274c5b8c..00000000 --- a/boards/ORESAT_RWB_V4/board.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; - uint32_t ascr; - uint32_t lockr; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH, VAL_GPIOA_ASCR, - VAL_GPIOA_LOCKR}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH, VAL_GPIOB_ASCR, - VAL_GPIOB_LOCKR}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH, VAL_GPIOC_ASCR, - VAL_GPIOC_LOCKR}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH, VAL_GPIOD_ASCR, - VAL_GPIOD_LOCKR}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH, VAL_GPIOE_ASCR, - VAL_GPIOE_LOCKR}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH, VAL_GPIOF_ASCR, - VAL_GPIOF_LOCKR}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH, VAL_GPIOG_ASCR, - VAL_GPIOG_LOCKR}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH, VAL_GPIOH_ASCR, - VAL_GPIOH_LOCKR}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH, VAL_GPIOI_ASCR, - VAL_GPIOI_LOCKR}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH, VAL_GPIOJ_ASCR, - VAL_GPIOJ_LOCKR}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH, VAL_GPIOK_ASCR, - VAL_GPIOK_LOCKR} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->ASCR = config->ascr; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; - gpiop->LOCKR = config->lockr; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB2(STM32_GPIO_EN_MASK); - rccEnableAHB2(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ORESAT_RWB_V4/board.h b/boards/ORESAT_RWB_V4/board.h deleted file mode 100644 index fc1f0fb1..00000000 --- a/boards/ORESAT_RWB_V4/board.h +++ /dev/null @@ -1,1466 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * ACS V4.x STM32L452CE Board Configuration - * PART: STM32L452CEU3 - * PACKAGE: UFQFPN48 - */ - -/* - * Board identifier. - */ -#define BOARD_ORESAT_RWB_V4 -#define BOARD_NAME "OreSat RWB V4.x" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32L452xx - -/* - * IO pins assignments. - */ -#define GPIOA_MAG_CURR_FDB 0U -#define GPIOA_BLDC_CURR_FDB 1U -#define GPIOA_LPUART1_TX 2U -#define GPIOA_LPUART1_RX 3U -#define GPIOA_SPI1_CS 4U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_PIN7 7U -#define GPIOA_BLDC_INUL 8U -#define GPIOA_TIM1_CH1 8U -#define GPIOA_BLDC_INVL 9U -#define GPIOA_TIM1_CH2 9U -#define GPIOA_BLDC_INWL 10U -#define GPIOA_TIM1_CH3 10U -#define GPIOA_BLDC_FAULT 11U -#define GPIOA_BLDC_EN 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_MAG_PWM 15U - -#define GPIOB_PIN0 0U -#define GPIOB_DEBUG_2 1U -#define GPIOB_DEBUG_1 2U -#define GPIOB_MAG_DIR 3U -#define GPIOB_CAN_SILENT 4U -#define GPIOB_CAN1_RX 5U -#define GPIOB_CAN1_TX 6U -#define GPIOB_MAG_STBY 7U -#define GPIOB_MAG_FAULT 8U -#define GPIOB_MAG_EN 9U -#define GPIOB_I2C2_SCL 10U -#define GPIOB_I2C2_SDA 11U -#define GPIOB_BLDC_STBY 12U -#define GPIOB_BLDC_INUH 13U -#define GPIOB_TIM1_CH1N 13U -#define GPIOB_BLDC_INVH 14U -#define GPIOB_TIM1_CH2N 14U -#define GPIOB_BLDC_INWH 15U -#define GPIOB_TIM1_CH3N 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_OSC_IN 0U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_BOOT0 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_SPI1_CS PAL_LINE(GPIOA, 4U) -#define LINE_BLDC_EN PAL_LINE(GPIOA, 12U) -#define LINE_DEBUG_2 PAL_LINE(GPIOB, 1U) -#define LINE_DEBUG_1 PAL_LINE(GPIOB, 2U) -#define LINE_MAG_DIR PAL_LINE(GPIOB, 3U) -#define LINE_CAN_SILENT PAL_LINE(GPIOB, 4U) -#define LINE_MAG_STBY PAL_LINE(GPIOB, 7U) -#define LINE_MAG_EN PAL_LINE(GPIOB, 9U) -#define LINE_BLDC_STBY PAL_LINE(GPIOB, 12U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) -#define PIN_ASCR_DISABLED(n) (0U << (n)) -#define PIN_ASCR_ENABLED(n) (1U << (n)) -#define PIN_LOCKR_DISABLED(n) (0U << (n)) -#define PIN_LOCKR_ENABLED(n) (1U << (n)) - -/* - * GPIOA setup: - * - * PA0 - MAG_CURR_FDB (analog). - * PA1 - BLDC_CURR_FDB (analog). - * PA2 - LPUART1_TX (alternate 8). - * PA3 - LPUART1_RX (alternate 8). - * PA4 - SPI1_CS (output pushpull maximum). - * PA5 - SPI1_SCK (alternate 5). - * PA6 - SPI1_MISO (alternate 5). - * PA7 - PIN7 (analog). - * PA8 - BLDC_INUL TIM1_CH1 (alternate 1). - * PA9 - BLDC_INVL TIM1_CH2 (alternate 1). - * PA10 - BLDC_INWL TIM1_CH3 (alternate 1). - * PA11 - BLDC_FAULT (analog). - * PA12 - BLDC_EN (output pushpull maximum). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - MAG_PWM (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_MAG_CURR_FDB) | \ - PIN_MODE_ANALOG(GPIOA_BLDC_CURR_FDB) | \ - PIN_MODE_ALTERNATE(GPIOA_LPUART1_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_LPUART1_RX) | \ - PIN_MODE_OUTPUT(GPIOA_SPI1_CS) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ANALOG(GPIOA_PIN7) | \ - PIN_MODE_ALTERNATE(GPIOA_BLDC_INUL) | \ - PIN_MODE_ALTERNATE(GPIOA_BLDC_INVL) | \ - PIN_MODE_ALTERNATE(GPIOA_BLDC_INWL) | \ - PIN_MODE_ANALOG(GPIOA_BLDC_FAULT) | \ - PIN_MODE_OUTPUT(GPIOA_BLDC_EN) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_MAG_PWM)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_MAG_CURR_FDB) | \ - PIN_OTYPE_PUSHPULL(GPIOA_BLDC_CURR_FDB) | \ - PIN_OTYPE_PUSHPULL(GPIOA_LPUART1_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_LPUART1_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOA_BLDC_INUL) | \ - PIN_OTYPE_PUSHPULL(GPIOA_BLDC_INVL) | \ - PIN_OTYPE_PUSHPULL(GPIOA_BLDC_INWL) | \ - PIN_OTYPE_PUSHPULL(GPIOA_BLDC_FAULT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_BLDC_EN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_MAG_PWM)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_MAG_CURR_FDB) | \ - PIN_OSPEED_HIGH(GPIOA_BLDC_CURR_FDB) | \ - PIN_OSPEED_HIGH(GPIOA_LPUART1_TX) | \ - PIN_OSPEED_HIGH(GPIOA_LPUART1_RX) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_CS) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_PIN7) | \ - PIN_OSPEED_HIGH(GPIOA_BLDC_INUL) | \ - PIN_OSPEED_HIGH(GPIOA_BLDC_INVL) | \ - PIN_OSPEED_HIGH(GPIOA_BLDC_INWL) | \ - PIN_OSPEED_HIGH(GPIOA_BLDC_FAULT) | \ - PIN_OSPEED_HIGH(GPIOA_BLDC_EN) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_MAG_PWM)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_MAG_CURR_FDB) | \ - PIN_PUPDR_FLOATING(GPIOA_BLDC_CURR_FDB) | \ - PIN_PUPDR_FLOATING(GPIOA_LPUART1_TX) | \ - PIN_PUPDR_FLOATING(GPIOA_LPUART1_RX) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_CS) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOA_BLDC_INUL) | \ - PIN_PUPDR_FLOATING(GPIOA_BLDC_INVL) | \ - PIN_PUPDR_FLOATING(GPIOA_BLDC_INWL) | \ - PIN_PUPDR_FLOATING(GPIOA_BLDC_FAULT) | \ - PIN_PUPDR_FLOATING(GPIOA_BLDC_EN) | \ - PIN_PUPDR_FLOATING(GPIOA_SWDIO) | \ - PIN_PUPDR_FLOATING(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_MAG_PWM)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_MAG_CURR_FDB) | \ - PIN_ODR_HIGH(GPIOA_BLDC_CURR_FDB) | \ - PIN_ODR_HIGH(GPIOA_LPUART1_TX) | \ - PIN_ODR_HIGH(GPIOA_LPUART1_RX) | \ - PIN_ODR_LOW(GPIOA_SPI1_CS) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_PIN7) | \ - PIN_ODR_HIGH(GPIOA_BLDC_INUL) | \ - PIN_ODR_HIGH(GPIOA_BLDC_INVL) | \ - PIN_ODR_HIGH(GPIOA_BLDC_INWL) | \ - PIN_ODR_HIGH(GPIOA_BLDC_FAULT) | \ - PIN_ODR_LOW(GPIOA_BLDC_EN) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_MAG_PWM)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_MAG_CURR_FDB, 0U) | \ - PIN_AFIO_AF(GPIOA_BLDC_CURR_FDB, 0U) | \ - PIN_AFIO_AF(GPIOA_LPUART1_TX, 8U) | \ - PIN_AFIO_AF(GPIOA_LPUART1_RX, 8U) | \ - PIN_AFIO_AF(GPIOA_SPI1_CS, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 5U) | \ - PIN_AFIO_AF(GPIOA_PIN7, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_BLDC_INUL, 1U) | \ - PIN_AFIO_AF(GPIOA_BLDC_INVL, 1U) | \ - PIN_AFIO_AF(GPIOA_BLDC_INWL, 1U) | \ - PIN_AFIO_AF(GPIOA_BLDC_FAULT, 0U) | \ - PIN_AFIO_AF(GPIOA_BLDC_EN, 0U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_MAG_PWM, 0U)) -#define VAL_GPIOA_ASCR (PIN_ASCR_DISABLED(GPIOA_MAG_CURR_FDB) | \ - PIN_ASCR_DISABLED(GPIOA_BLDC_CURR_FDB) | \ - PIN_ASCR_DISABLED(GPIOA_LPUART1_TX) | \ - PIN_ASCR_DISABLED(GPIOA_LPUART1_RX) | \ - PIN_ASCR_DISABLED(GPIOA_SPI1_CS) | \ - PIN_ASCR_DISABLED(GPIOA_SPI1_SCK) | \ - PIN_ASCR_DISABLED(GPIOA_SPI1_MISO) | \ - PIN_ASCR_DISABLED(GPIOA_PIN7) | \ - PIN_ASCR_DISABLED(GPIOA_BLDC_INUL) | \ - PIN_ASCR_DISABLED(GPIOA_BLDC_INVL) | \ - PIN_ASCR_DISABLED(GPIOA_BLDC_INWL) | \ - PIN_ASCR_DISABLED(GPIOA_BLDC_FAULT) | \ - PIN_ASCR_DISABLED(GPIOA_BLDC_EN) | \ - PIN_ASCR_DISABLED(GPIOA_SWDIO) | \ - PIN_ASCR_DISABLED(GPIOA_SWCLK) | \ - PIN_ASCR_DISABLED(GPIOA_MAG_PWM)) -#define VAL_GPIOA_LOCKR (PIN_LOCKR_DISABLED(GPIOA_MAG_CURR_FDB) | \ - PIN_LOCKR_DISABLED(GPIOA_BLDC_CURR_FDB) | \ - PIN_LOCKR_DISABLED(GPIOA_LPUART1_TX) | \ - PIN_LOCKR_DISABLED(GPIOA_LPUART1_RX) | \ - PIN_LOCKR_DISABLED(GPIOA_SPI1_CS) | \ - PIN_LOCKR_DISABLED(GPIOA_SPI1_SCK) | \ - PIN_LOCKR_DISABLED(GPIOA_SPI1_MISO) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOA_BLDC_INUL) | \ - PIN_LOCKR_DISABLED(GPIOA_BLDC_INVL) | \ - PIN_LOCKR_DISABLED(GPIOA_BLDC_INWL) | \ - PIN_LOCKR_DISABLED(GPIOA_BLDC_FAULT) | \ - PIN_LOCKR_DISABLED(GPIOA_BLDC_EN) | \ - PIN_LOCKR_DISABLED(GPIOA_SWDIO) | \ - PIN_LOCKR_DISABLED(GPIOA_SWCLK) | \ - PIN_LOCKR_DISABLED(GPIOA_MAG_PWM)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - DEBUG_2 (output pushpull maximum). - * PB2 - DEBUG_1 (output pushpull maximum). - * PB3 - MAG_DIR (output pushpull maximum). - * PB4 - CAN_SILENT (output pushpull maximum). - * PB5 - CAN1_RX (alternate 3). - * PB6 - CAN1_TX (alternate 8). - * PB7 - MAG_STBY (output pushpull maximum). - * PB8 - MAG_FAULT (analog). - * PB9 - MAG_EN (output pushpull maximum). - * PB10 - I2C2_SCL (altenrate 4). - * PB11 - I2C2_SDA (altenrate 4). - * PB12 - BLDC_STBY (output pushpull maximum). - * PB13 - BLDC_INUH TIM1_CH1N (alternate 1). - * PB14 - BLDC_INVH TIM1_CH2N (alternate 1). - * PB15 - BLDC_INWH TIM1_CH3N (alternate 1). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_OUTPUT(GPIOB_DEBUG_2) | \ - PIN_MODE_OUTPUT(GPIOB_DEBUG_1) | \ - PIN_MODE_OUTPUT(GPIOB_MAG_DIR) | \ - PIN_MODE_OUTPUT(GPIOB_CAN_SILENT) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN1_RX) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN1_TX) | \ - PIN_MODE_OUTPUT(GPIOB_MAG_STBY) | \ - PIN_MODE_ANALOG(GPIOB_MAG_FAULT) | \ - PIN_MODE_OUTPUT(GPIOB_MAG_EN) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SDA) | \ - PIN_MODE_OUTPUT(GPIOB_BLDC_STBY) | \ - PIN_MODE_ALTERNATE(GPIOB_BLDC_INUH) | \ - PIN_MODE_ALTERNATE(GPIOB_BLDC_INVH) | \ - PIN_MODE_ALTERNATE(GPIOB_BLDC_INWH)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_DEBUG_2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_DEBUG_1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MAG_DIR) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN1_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN1_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MAG_STBY) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MAG_FAULT) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MAG_EN) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_BLDC_INUH) | \ - PIN_OTYPE_PUSHPULL(GPIOB_BLDC_STBY) | \ - PIN_OTYPE_PUSHPULL(GPIOB_BLDC_INVH) | \ - PIN_OTYPE_PUSHPULL(GPIOB_BLDC_INWH)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_DEBUG_2) | \ - PIN_OSPEED_HIGH(GPIOB_DEBUG_1) | \ - PIN_OSPEED_HIGH(GPIOB_MAG_DIR) | \ - PIN_OSPEED_HIGH(GPIOB_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOB_CAN1_RX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN1_TX) | \ - PIN_OSPEED_HIGH(GPIOB_MAG_STBY) | \ - PIN_OSPEED_HIGH(GPIOB_MAG_FAULT) | \ - PIN_OSPEED_HIGH(GPIOB_MAG_EN) | \ - PIN_OSPEED_HIGH(GPIOB_I2C2_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C2_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_BLDC_STBY) | \ - PIN_OSPEED_HIGH(GPIOB_BLDC_INUH) | \ - PIN_OSPEED_HIGH(GPIOB_BLDC_INVH) | \ - PIN_OSPEED_HIGH(GPIOB_BLDC_INWH)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_DEBUG_2) | \ - PIN_PUPDR_FLOATING(GPIOB_DEBUG_1) | \ - PIN_PUPDR_FLOATING(GPIOB_MAG_DIR) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN_SILENT) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN1_RX) | \ - PIN_PUPDR_FLOATING(GPIOB_CAN1_TX) | \ - PIN_PUPDR_FLOATING(GPIOB_MAG_STBY) | \ - PIN_PUPDR_FLOATING(GPIOB_MAG_FAULT) | \ - PIN_PUPDR_FLOATING(GPIOB_MAG_EN) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C2_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C2_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_BLDC_STBY) | \ - PIN_PUPDR_FLOATING(GPIOB_BLDC_INUH) | \ - PIN_PUPDR_FLOATING(GPIOB_BLDC_INVH) | \ - PIN_PUPDR_FLOATING(GPIOB_BLDC_INWH)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_LOW(GPIOB_DEBUG_2) | \ - PIN_ODR_LOW(GPIOB_DEBUG_1) | \ - PIN_ODR_LOW(GPIOB_MAG_DIR) | \ - PIN_ODR_LOW(GPIOB_CAN_SILENT) | \ - PIN_ODR_HIGH(GPIOB_CAN1_RX) | \ - PIN_ODR_HIGH(GPIOB_CAN1_TX) | \ - PIN_ODR_LOW(GPIOB_MAG_STBY) | \ - PIN_ODR_HIGH(GPIOB_MAG_FAULT) | \ - PIN_ODR_LOW(GPIOB_MAG_EN) | \ - PIN_ODR_HIGH(GPIOB_I2C2_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C2_SDA) | \ - PIN_ODR_LOW(GPIOB_BLDC_STBY) | \ - PIN_ODR_HIGH(GPIOB_BLDC_INUH) | \ - PIN_ODR_HIGH(GPIOB_BLDC_INVH) | \ - PIN_ODR_HIGH(GPIOB_BLDC_INWH)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_DEBUG_2, 0U) | \ - PIN_AFIO_AF(GPIOB_DEBUG_2, 0U) | \ - PIN_AFIO_AF(GPIOB_MAG_DIR, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN1_RX, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN1_TX, 0U) | \ - PIN_AFIO_AF(GPIOB_MAG_STBY, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_MAG_FAULT, 0U) | \ - PIN_AFIO_AF(GPIOB_MAG_EN, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C2_SCL, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C2_SDA, 4U) | \ - PIN_AFIO_AF(GPIOB_BLDC_STBY, 0U) | \ - PIN_AFIO_AF(GPIOB_BLDC_INUH, 1U) | \ - PIN_AFIO_AF(GPIOB_BLDC_INVH, 1U) | \ - PIN_AFIO_AF(GPIOB_BLDC_INWH, 1U)) -#define VAL_GPIOB_ASCR (PIN_ASCR_DISABLED(GPIOB_PIN0) | \ - PIN_ASCR_DISABLED(GPIOB_DEBUG_2) | \ - PIN_ASCR_DISABLED(GPIOB_DEBUG_1) | \ - PIN_ASCR_DISABLED(GPIOB_MAG_DIR) | \ - PIN_ASCR_DISABLED(GPIOB_CAN_SILENT) | \ - PIN_ASCR_DISABLED(GPIOB_CAN1_RX) | \ - PIN_ASCR_DISABLED(GPIOB_CAN1_TX) | \ - PIN_ASCR_DISABLED(GPIOB_MAG_STBY) | \ - PIN_ASCR_DISABLED(GPIOB_MAG_FAULT) | \ - PIN_ASCR_DISABLED(GPIOB_MAG_EN) | \ - PIN_ASCR_DISABLED(GPIOB_I2C2_SCL) | \ - PIN_ASCR_DISABLED(GPIOB_I2C2_SDA) | \ - PIN_ASCR_DISABLED(GPIOB_BLDC_STBY) | \ - PIN_ASCR_DISABLED(GPIOB_BLDC_INUH) | \ - PIN_ASCR_DISABLED(GPIOB_BLDC_INVH) | \ - PIN_ASCR_DISABLED(GPIOB_BLDC_INWH)) -#define VAL_GPIOB_LOCKR (PIN_LOCKR_DISABLED(GPIOB_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOB_DEBUG_2) | \ - PIN_LOCKR_DISABLED(GPIOB_DEBUG_1) | \ - PIN_LOCKR_DISABLED(GPIOB_MAG_DIR) | \ - PIN_LOCKR_DISABLED(GPIOB_CAN_SILENT) | \ - PIN_LOCKR_DISABLED(GPIOB_CAN1_RX) | \ - PIN_LOCKR_DISABLED(GPIOB_CAN1_TX) | \ - PIN_LOCKR_DISABLED(GPIOB_MAG_STBY) | \ - PIN_LOCKR_DISABLED(GPIOB_MAG_FAULT) | \ - PIN_LOCKR_DISABLED(GPIOB_MAG_EN) | \ - PIN_LOCKR_DISABLED(GPIOB_I2C2_SCL) | \ - PIN_LOCKR_DISABLED(GPIOB_I2C2_SDA) | \ - PIN_LOCKR_DISABLED(GPIOB_BLDC_STBY) | \ - PIN_LOCKR_DISABLED(GPIOB_BLDC_INUH) | \ - PIN_LOCKR_DISABLED(GPIOB_BLDC_INVH) | \ - PIN_LOCKR_DISABLED(GPIOB_BLDC_INWH)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - PIN14 (analog). - * PC15 - PIN15 (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_PIN14) | \ - PIN_MODE_ANALOG(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) -#define VAL_GPIOC_ASCR (PIN_ASCR_DISABLED(GPIOC_PIN0) | \ - PIN_ASCR_DISABLED(GPIOC_PIN1) | \ - PIN_ASCR_DISABLED(GPIOC_PIN2) | \ - PIN_ASCR_DISABLED(GPIOC_PIN3) | \ - PIN_ASCR_DISABLED(GPIOC_PIN4) | \ - PIN_ASCR_DISABLED(GPIOC_PIN5) | \ - PIN_ASCR_DISABLED(GPIOC_PIN6) | \ - PIN_ASCR_DISABLED(GPIOC_PIN7) | \ - PIN_ASCR_DISABLED(GPIOC_PIN8) | \ - PIN_ASCR_DISABLED(GPIOC_PIN9) | \ - PIN_ASCR_DISABLED(GPIOC_PIN10) | \ - PIN_ASCR_DISABLED(GPIOC_PIN11) | \ - PIN_ASCR_DISABLED(GPIOC_PIN12) | \ - PIN_ASCR_DISABLED(GPIOC_PIN13) | \ - PIN_ASCR_DISABLED(GPIOC_PIN14) | \ - PIN_ASCR_DISABLED(GPIOC_PIN15)) -#define VAL_GPIOC_LOCKR (PIN_LOCKR_DISABLED(GPIOC_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN15)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) -#define VAL_GPIOD_ASCR (PIN_ASCR_DISABLED(GPIOD_PIN0) | \ - PIN_ASCR_DISABLED(GPIOD_PIN1) | \ - PIN_ASCR_DISABLED(GPIOD_PIN2) | \ - PIN_ASCR_DISABLED(GPIOD_PIN3) | \ - PIN_ASCR_DISABLED(GPIOD_PIN4) | \ - PIN_ASCR_DISABLED(GPIOD_PIN5) | \ - PIN_ASCR_DISABLED(GPIOD_PIN6) | \ - PIN_ASCR_DISABLED(GPIOD_PIN7) | \ - PIN_ASCR_DISABLED(GPIOD_PIN8) | \ - PIN_ASCR_DISABLED(GPIOD_PIN9) | \ - PIN_ASCR_DISABLED(GPIOD_PIN10) | \ - PIN_ASCR_DISABLED(GPIOD_PIN11) | \ - PIN_ASCR_DISABLED(GPIOD_PIN12) | \ - PIN_ASCR_DISABLED(GPIOD_PIN13) | \ - PIN_ASCR_DISABLED(GPIOD_PIN14) | \ - PIN_ASCR_DISABLED(GPIOD_PIN15)) -#define VAL_GPIOD_LOCKR (PIN_LOCKR_DISABLED(GPIOD_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN15)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) -#define VAL_GPIOE_ASCR (PIN_ASCR_DISABLED(GPIOE_PIN0) | \ - PIN_ASCR_DISABLED(GPIOE_PIN1) | \ - PIN_ASCR_DISABLED(GPIOE_PIN2) | \ - PIN_ASCR_DISABLED(GPIOE_PIN3) | \ - PIN_ASCR_DISABLED(GPIOE_PIN4) | \ - PIN_ASCR_DISABLED(GPIOE_PIN5) | \ - PIN_ASCR_DISABLED(GPIOE_PIN6) | \ - PIN_ASCR_DISABLED(GPIOE_PIN7) | \ - PIN_ASCR_DISABLED(GPIOE_PIN8) | \ - PIN_ASCR_DISABLED(GPIOE_PIN9) | \ - PIN_ASCR_DISABLED(GPIOE_PIN10) | \ - PIN_ASCR_DISABLED(GPIOE_PIN11) | \ - PIN_ASCR_DISABLED(GPIOE_PIN12) | \ - PIN_ASCR_DISABLED(GPIOE_PIN13) | \ - PIN_ASCR_DISABLED(GPIOE_PIN14) | \ - PIN_ASCR_DISABLED(GPIOE_PIN15)) -#define VAL_GPIOE_LOCKR (PIN_LOCKR_DISABLED(GPIOE_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN15)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (analog). - * PF1 - PIN1 (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_PIN0) | \ - PIN_MODE_ANALOG(GPIOF_PIN1) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) -#define VAL_GPIOF_ASCR (PIN_ASCR_DISABLED(GPIOF_PIN0) | \ - PIN_ASCR_DISABLED(GPIOF_PIN1) | \ - PIN_ASCR_DISABLED(GPIOF_PIN2) | \ - PIN_ASCR_DISABLED(GPIOF_PIN3) | \ - PIN_ASCR_DISABLED(GPIOF_PIN4) | \ - PIN_ASCR_DISABLED(GPIOF_PIN5) | \ - PIN_ASCR_DISABLED(GPIOF_PIN6) | \ - PIN_ASCR_DISABLED(GPIOF_PIN7) | \ - PIN_ASCR_DISABLED(GPIOF_PIN8) | \ - PIN_ASCR_DISABLED(GPIOF_PIN9) | \ - PIN_ASCR_DISABLED(GPIOF_PIN10) | \ - PIN_ASCR_DISABLED(GPIOF_PIN11) | \ - PIN_ASCR_DISABLED(GPIOF_PIN12) | \ - PIN_ASCR_DISABLED(GPIOF_PIN13) | \ - PIN_ASCR_DISABLED(GPIOF_PIN14) | \ - PIN_ASCR_DISABLED(GPIOF_PIN15)) -#define VAL_GPIOF_LOCKR (PIN_LOCKR_DISABLED(GPIOF_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN15)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOG_MODER (PIN_MODE_ANALOG(GPIOG_PIN0) | \ - PIN_MODE_ANALOG(GPIOG_PIN1) | \ - PIN_MODE_ANALOG(GPIOG_PIN2) | \ - PIN_MODE_ANALOG(GPIOG_PIN3) | \ - PIN_MODE_ANALOG(GPIOG_PIN4) | \ - PIN_MODE_ANALOG(GPIOG_PIN5) | \ - PIN_MODE_ANALOG(GPIOG_PIN6) | \ - PIN_MODE_ANALOG(GPIOG_PIN7) | \ - PIN_MODE_ANALOG(GPIOG_PIN8) | \ - PIN_MODE_ANALOG(GPIOG_PIN9) | \ - PIN_MODE_ANALOG(GPIOG_PIN10) | \ - PIN_MODE_ANALOG(GPIOG_PIN11) | \ - PIN_MODE_ANALOG(GPIOG_PIN12) | \ - PIN_MODE_ANALOG(GPIOG_PIN13) | \ - PIN_MODE_ANALOG(GPIOG_PIN14) | \ - PIN_MODE_ANALOG(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) -#define VAL_GPIOG_ASCR (PIN_ASCR_DISABLED(GPIOG_PIN0) | \ - PIN_ASCR_DISABLED(GPIOG_PIN1) | \ - PIN_ASCR_DISABLED(GPIOG_PIN2) | \ - PIN_ASCR_DISABLED(GPIOG_PIN3) | \ - PIN_ASCR_DISABLED(GPIOG_PIN4) | \ - PIN_ASCR_DISABLED(GPIOG_PIN5) | \ - PIN_ASCR_DISABLED(GPIOG_PIN6) | \ - PIN_ASCR_DISABLED(GPIOG_PIN7) | \ - PIN_ASCR_DISABLED(GPIOG_PIN8) | \ - PIN_ASCR_DISABLED(GPIOG_PIN9) | \ - PIN_ASCR_DISABLED(GPIOG_PIN10) | \ - PIN_ASCR_DISABLED(GPIOG_PIN11) | \ - PIN_ASCR_DISABLED(GPIOG_PIN12) | \ - PIN_ASCR_DISABLED(GPIOG_PIN13) | \ - PIN_ASCR_DISABLED(GPIOG_PIN14) | \ - PIN_ASCR_DISABLED(GPIOG_PIN15)) -#define VAL_GPIOG_LOCKR (PIN_LOCKR_DISABLED(GPIOG_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN15)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (analog). - * PH1 - OSC_OUT (analog). - * PH2 - PIN2 (analog). - * PH3 - BOOT0 (analog). - * PH4 - PIN4 (analog). - * PH5 - PIN5 (analog). - * PH6 - PIN6 (analog). - * PH7 - PIN7 (analog). - * PH8 - PIN8 (analog). - * PH9 - PIN9 (analog). - * PH10 - PIN10 (analog). - * PH11 - PIN11 (analog). - * PH12 - PIN12 (analog). - * PH13 - PIN13 (analog). - * PH14 - PIN14 (analog). - * PH15 - PIN15 (analog). - */ -#define VAL_GPIOH_MODER (PIN_MODE_ANALOG(GPIOH_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOH_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOH_PIN2) | \ - PIN_MODE_ANALOG(GPIOH_BOOT0) | \ - PIN_MODE_ANALOG(GPIOH_PIN4) | \ - PIN_MODE_ANALOG(GPIOH_PIN5) | \ - PIN_MODE_ANALOG(GPIOH_PIN6) | \ - PIN_MODE_ANALOG(GPIOH_PIN7) | \ - PIN_MODE_ANALOG(GPIOH_PIN8) | \ - PIN_MODE_ANALOG(GPIOH_PIN9) | \ - PIN_MODE_ANALOG(GPIOH_PIN10) | \ - PIN_MODE_ANALOG(GPIOH_PIN11) | \ - PIN_MODE_ANALOG(GPIOH_PIN12) | \ - PIN_MODE_ANALOG(GPIOH_PIN13) | \ - PIN_MODE_ANALOG(GPIOH_PIN14) | \ - PIN_MODE_ANALOG(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_BOOT0) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_BOOT0) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) -#define VAL_GPIOH_ASCR (PIN_ASCR_DISABLED(GPIOH_OSC_IN) | \ - PIN_ASCR_DISABLED(GPIOH_OSC_OUT) | \ - PIN_ASCR_DISABLED(GPIOH_PIN2) | \ - PIN_ASCR_DISABLED(GPIOH_BOOT0) | \ - PIN_ASCR_DISABLED(GPIOH_PIN4) | \ - PIN_ASCR_DISABLED(GPIOH_PIN5) | \ - PIN_ASCR_DISABLED(GPIOH_PIN6) | \ - PIN_ASCR_DISABLED(GPIOH_PIN7) | \ - PIN_ASCR_DISABLED(GPIOH_PIN8) | \ - PIN_ASCR_DISABLED(GPIOH_PIN9) | \ - PIN_ASCR_DISABLED(GPIOH_PIN10) | \ - PIN_ASCR_DISABLED(GPIOH_PIN11) | \ - PIN_ASCR_DISABLED(GPIOH_PIN12) | \ - PIN_ASCR_DISABLED(GPIOH_PIN13) | \ - PIN_ASCR_DISABLED(GPIOH_PIN14) | \ - PIN_ASCR_DISABLED(GPIOH_PIN15)) -#define VAL_GPIOH_LOCKR (PIN_LOCKR_DISABLED(GPIOH_OSC_IN) | \ - PIN_LOCKR_DISABLED(GPIOH_OSC_OUT) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOH_BOOT0) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN15)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ORESAT_RWB_V4/board.mk b/boards/ORESAT_RWB_V4/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ORESAT_RWB_V4/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ORESAT_RWB_V4/gdboocd.cmd b/boards/ORESAT_RWB_V4/gdboocd.cmd deleted file mode 100644 index d386b739..00000000 --- a/boards/ORESAT_RWB_V4/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32l4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ORESAT_RWB_V4/oocd.cfg b/boards/ORESAT_RWB_V4/oocd.cfg deleted file mode 100644 index 7f81f2b4..00000000 --- a/boards/ORESAT_RWB_V4/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32l4x.cfg] - diff --git a/boards/PROTOCARD_V1_1/board.c b/boards/PROTOCARD_V1_1/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/PROTOCARD_V1_1/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/PROTOCARD_V1_1/board.h b/boards/PROTOCARD_V1_1/board.h deleted file mode 100644 index cffc2809..00000000 --- a/boards/PROTOCARD_V1_1/board.h +++ /dev/null @@ -1,934 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Protocard V1.1 Board Configuration - * PART: STM32F042K6T6 - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_PROTOCARD_V1_1 -#define BOARD_NAME "Protocard V1.1" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#define STM32_HSECLK 16000000U - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 0U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_LED 0U -#define GPIOA_PIN1 1U -#define GPIOA_PIN2 2U -#define GPIOA_USART2_TX 2U -#define GPIOA_PIN3 3U -#define GPIOA_USART2_RX 3U -#define GPIOA_PIN4 4U -#define GPIOA_PIN5 5U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_PIN6 6U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_PIN7 7U -#define GPIOA_SPI1_MOSI 7U -#define GPIOA_PIN8 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_PIN3 3U -#define GPIOB_PIN4 4U -#define GPIOB_PIN5 5U -#define GPIOB_PIN6 6U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_PIN7 7U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 0U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - LED (output pushpull). - * PA1 - PIN1 (input pullup). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - PIN4 (input pullup). - * PA5 - SPI1_SCK (alternate 0). - * PA6 - SPI1_MISO (alternate 0). - * PA7 - SPI1_MOSI (alternate 0). - * PA8 - PIN8 (input pullup). - * PA9 - CAN_SILENT (output pulldown). - * PA10 - CAN_SHDN (output pulldown). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (input pullup). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_LED) | \ - PIN_MODE_INPUT(GPIOA_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_INPUT(GPIOA_PIN4) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_INPUT(GPIOA_PIN8) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_INPUT(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_LED) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_LED) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_LED) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_MOSI) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLUP(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_LOW(GPIOA_LED) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_LED, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (input pullup). - * PB1 - PIN1 (input pullup). - * PB2 - NC (input pullup). - * PB3 - PIN3 (input pullup). - * PB4 - PIN4 (input pullup). - * PB5 - PIN5 (input pullup). - * PB6 - I2C1_SCL (alternate 1) - * PB7 - I2C1_SDA (alternate 1). - * PB8 - PIN8_BOOT0 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ - PIN_MODE_INPUT(GPIOB_PIN1) | \ - PIN_MODE_INPUT(GPIOB_PIN2) | \ - PIN_MODE_INPUT(GPIOB_PIN3) | \ - PIN_MODE_INPUT(GPIOB_PIN4) | \ - PIN_MODE_INPUT(GPIOB_PIN5) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_INPUT(GPIOB_PIN8) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN4) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - PIN14 (input pullup). - * PC15 - PIN15 (input pullup). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_PIN14) | \ - PIN_MODE_INPUT(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (input pullup). - * PF1 - OSC_OUT (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \ - PIN_MODE_INPUT(GPIOF_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_OSC_IN) | \ - PIN_PUPDR_PULLUP(GPIOF_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/PROTOCARD_V1_1/board.mk b/boards/PROTOCARD_V1_1/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/PROTOCARD_V1_1/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/PROTOCARD_V1_1/gdboocd.cmd b/boards/PROTOCARD_V1_1/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/PROTOCARD_V1_1/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/PROTOCARD_V1_1/oocd.cfg b/boards/PROTOCARD_V1_1/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/PROTOCARD_V1_1/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/PROTOCARD_V2/board.c b/boards/PROTOCARD_V2/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/PROTOCARD_V2/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/PROTOCARD_V2/board.h b/boards/PROTOCARD_V2/board.h deleted file mode 100644 index ec954e88..00000000 --- a/boards/PROTOCARD_V2/board.h +++ /dev/null @@ -1,934 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Protocard V2 Board Configuration - * PART: STM32F042K6T6 - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_PROTOCARD_V2 -#define BOARD_NAME "Protocard V2" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#define STM32_HSECLK 16000000U - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 0U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_LED 0U -#define GPIOA_PIN1 1U -#define GPIOA_PIN2 2U -#define GPIOA_USART2_TX 2U -#define GPIOA_PIN3 3U -#define GPIOA_USART2_RX 3U -#define GPIOA_PIN4 4U -#define GPIOA_PIN5 5U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_PIN6 6U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_PIN7 7U -#define GPIOA_SPI1_MOSI 7U -#define GPIOA_PIN8 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_PIN3 3U -#define GPIOB_PIN4 4U -#define GPIOB_PIN5 5U -#define GPIOB_PIN6 6U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_PIN7 7U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 0U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - LED (output pushpull). - * PA1 - PIN1 (input pullup). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - PIN4 (input pullup). - * PA5 - SPI1_SCK (alternate 0). - * PA6 - SPI1_MISO (alternate 0). - * PA7 - SPI1_MOSI (alternate 0). - * PA8 - PIN8 (input pullup). - * PA9 - CAN_SILENT (output pulldown). - * PA10 - CAN_SHDN (output pulldown). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (input pullup). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_LED) | \ - PIN_MODE_INPUT(GPIOA_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_INPUT(GPIOA_PIN4) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_INPUT(GPIOA_PIN8) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_INPUT(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_LED) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_LED) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_LED) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_MOSI) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLUP(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_LOW(GPIOA_LED) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_LED, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (input pullup). - * PB1 - PIN1 (input pullup). - * PB2 - NC (input pullup). - * PB3 - PIN3 (input pullup). - * PB4 - PIN4 (input pullup). - * PB5 - PIN5 (input pullup). - * PB6 - I2C1_SCL (alternate 1) - * PB7 - I2C1_SDA (alternate 1). - * PB8 - PIN8_BOOT0 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ - PIN_MODE_INPUT(GPIOB_PIN1) | \ - PIN_MODE_INPUT(GPIOB_PIN2) | \ - PIN_MODE_INPUT(GPIOB_PIN3) | \ - PIN_MODE_INPUT(GPIOB_PIN4) | \ - PIN_MODE_INPUT(GPIOB_PIN5) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_INPUT(GPIOB_PIN8) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN4) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - PIN14 (input pullup). - * PC15 - PIN15 (input pullup). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_PIN14) | \ - PIN_MODE_INPUT(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (input pullup). - * PF1 - OSC_OUT (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \ - PIN_MODE_INPUT(GPIOF_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_OSC_IN) | \ - PIN_PUPDR_PULLUP(GPIOF_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/PROTOCARD_V2/board.mk b/boards/PROTOCARD_V2/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/PROTOCARD_V2/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/PROTOCARD_V2/gdboocd.cmd b/boards/PROTOCARD_V2/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/PROTOCARD_V2/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/PROTOCARD_V2/oocd.cfg b/boards/PROTOCARD_V2/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/PROTOCARD_V2/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/PROTOCARD_V3/board.c b/boards/PROTOCARD_V3/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/PROTOCARD_V3/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/PROTOCARD_V3/board.h b/boards/PROTOCARD_V3/board.h deleted file mode 100644 index 107015f0..00000000 --- a/boards/PROTOCARD_V3/board.h +++ /dev/null @@ -1,958 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Protocard V3 Board Configuration - * PART: STM32F042K6T6 - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_PROTOCARD_V3 -#define BOARD_NAME "Protocard v3.x" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_LED 0U -#define GPIOA_PIN1 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_PIN4 4U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_SPI1_MOSI 7U -#define GPIOA_PIN8 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_PIN3 3U -#define GPIOB_PIN4 4U -#define GPIOB_PIN5 5U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_BOOT0 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_PIN1 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 0U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - LED (output pushpull). - * PA1 - PIN1 (analog). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - PIN4 (analog). - * PA5 - SPI1_SCK (alternate 0). - * PA6 - SPI1_MISO (alternate 0). - * PA7 - SPI1_MOSI (alternate 0). - * PA8 - PIN8 (analog). - * PA9 - CAN_SILENT (output pulldown). - * PA10 - CAN_SHDN (output pulldown). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_LED) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_ANALOG(GPIOA_PIN4) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_INPUT(GPIOA_PIN8) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_LED) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_LED) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLDOWN(GPIOA_LED) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN4) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SPI1_MOSI) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN8) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_LOW(GPIOA_LED) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_LED, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - PIN1 (analog). - * PB2 - NC (analog). - * PB3 - PIN3 (analog). - * PB4 - PIN4 (analog). - * PB5 - PIN5 (analog). - * PB6 - I2C1_SCL (alternate 1) - * PB7 - I2C1_SDA (alternate 1). - * PB8 - BOOT0 (analog). - * PB9 - PIN9 (analog). - * PB10 - PIN10 (analog). - * PB11 - PIN11 (analog). - * PB12 - PIN12 (analog). - * PB13 - PIN13 (analog). - * PB14 - PIN14 (analog). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN2) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_ANALOG(GPIOB_PIN4) | \ - PIN_MODE_ANALOG(GPIOB_PIN5) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ANALOG(GPIOB_BOOT0) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_ANALOG(GPIOB_PIN10) | \ - PIN_MODE_ANALOG(GPIOB_PIN11) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_ANALOG(GPIOB_PIN13) | \ - PIN_MODE_ANALOG(GPIOB_PIN14) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN4) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_BOOT0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_BOOT0) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - PIN14 (analog). - * PC15 - PIN15 (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_PIN14) | \ - PIN_MODE_ANALOG(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (analog). - * PF1 - OSC_OUT (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOF_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/PROTOCARD_V3/board.mk b/boards/PROTOCARD_V3/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/PROTOCARD_V3/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/PROTOCARD_V3/gdboocd.cmd b/boards/PROTOCARD_V3/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/PROTOCARD_V3/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/PROTOCARD_V3/oocd.cfg b/boards/PROTOCARD_V3/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/PROTOCARD_V3/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/README.md b/boards/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/boards/SOLAR_V1/board.c b/boards/SOLAR_V1/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/SOLAR_V1/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/SOLAR_V1/board.h b/boards/SOLAR_V1/board.h deleted file mode 100644 index bd2a8603..00000000 --- a/boards/SOLAR_V1/board.h +++ /dev/null @@ -1,926 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Setup for Oresat Solar V1 STM32F042K6 board. - * PART: STM32F042K6T6 - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_ORSAT_SOLAR_V1 -#define BOARD_NAME "Oresat solar v1" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#define STM32_HSECLK 16000000U - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 0U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0_NC 0U -#define GPIOA_PIN1_NC 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_DEBUG 4U -#define GPIOA_TP9 5U -#define GPIOA_TP10 6U -#define GPIOA_TP11 7U -#define GPIOA_PIN8_NC 8U -#define GPIOA_CAN_LSTN 9U -#define GPIOA_CAN_EN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15_NC 15U - -#define GPIOB_PIN0_NC 0U -#define GPIOB_PIN1_NC 1U -#define GPIOB_PIN2_NA 2U -#define GPIOB_TP12 3U -#define GPIOB_TP13 4U -#define GPIOB_PIN5_NC 5U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8_BOOT0 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -/* - * IO lines assignments. - */ -//#define LINE_PIN0 PAL_LINE(GPIOA, 0U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - NC (output pulldown). - * PA1 - NC (output pulldown). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - DEBUG (output pullup). - * PA5 - TP9 (output pullup). - * PA6 - TP10 (output pullup). - * PA7 - TP11 (output pullup). - * PA8 - NC (output pulldown). - * PA9 - CAN_LSTN (output pulldown). - * PA10 - CAN_EN (output pulldown). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - NC (output pulldown). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_PIN0_NC) | \ - PIN_MODE_OUTPUT(GPIOA_PIN1_NC) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_OUTPUT(GPIOA_DEBUG) | \ - PIN_MODE_OUTPUT(GPIOA_TP9) | \ - PIN_MODE_OUTPUT(GPIOA_TP10) | \ - PIN_MODE_OUTPUT(GPIOA_TP11) | \ - PIN_MODE_OUTPUT(GPIOA_PIN8_NC) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_LSTN) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_EN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_OUTPUT(GPIOA_PIN15_NC)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_OPENDRAIN(GPIOA_PIN0_NC) | \ - PIN_OTYPE_OPENDRAIN(GPIOA_PIN1_NC) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_DEBUG) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TP9) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TP10) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TP11) | \ - PIN_OTYPE_OPENDRAIN(GPIOA_PIN8_NC) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_LSTN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_EN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_OPENDRAIN(GPIOA_PIN15_NC)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_PIN0_NC) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1_NC) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_DEBUG) | \ - PIN_OSPEED_HIGH(GPIOA_TP9) | \ - PIN_OSPEED_HIGH(GPIOA_TP10) | \ - PIN_OSPEED_HIGH(GPIOA_TP11) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8_NC) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_LSTN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_EN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15_NC)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLDOWN(GPIOA_PIN0_NC) | \ - PIN_PUPDR_PULLDOWN(GPIOA_PIN1_NC) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLDOWN(GPIOA_DEBUG) | \ - PIN_PUPDR_PULLUP(GPIOA_TP9) | \ - PIN_PUPDR_PULLUP(GPIOA_TP10) | \ - PIN_PUPDR_PULLUP(GPIOA_TP11) | \ - PIN_PUPDR_PULLDOWN(GPIOA_PIN8_NC) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_LSTN) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_EN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLDOWN(GPIOA_PIN15_NC)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0_NC) | \ - PIN_ODR_HIGH(GPIOA_PIN1_NC) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_DEBUG) | \ - PIN_ODR_HIGH(GPIOA_TP9) | \ - PIN_ODR_HIGH(GPIOA_TP10) | \ - PIN_ODR_HIGH(GPIOA_TP11) | \ - PIN_ODR_HIGH(GPIOA_PIN8_NC) | \ - PIN_ODR_LOW(GPIOA_CAN_LSTN) | \ - PIN_ODR_LOW(GPIOA_CAN_EN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15_NC)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0_NC, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1_NC, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_DEBUG, 0U) | \ - PIN_AFIO_AF(GPIOA_TP9, 0U) | \ - PIN_AFIO_AF(GPIOA_TP10, 0U) | \ - PIN_AFIO_AF(GPIOA_TP11, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8_NC, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_LSTN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_EN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15_NC, 0U)) - -/* - * GPIOB setup: - * - * PB0 - NC (output pulldown). - * PB1 - NC (output pulldown). - * PB2 - NA (input pullup). - * PB3 - TP12 (output pullup) - * PB4 - TP13 (output pullup). - * PB5 - NC (output pulldown). - * PB6 - I2C1_SCL (alternate 1) - * PB7 - I2C1_SDA (alternate 1). - * PB8 - NC BOOT0 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_OUTPUT(GPIOB_PIN0_NC) | \ - PIN_MODE_OUTPUT(GPIOB_PIN1_NC) | \ - PIN_MODE_INPUT(GPIOB_PIN2_NA) | \ - PIN_MODE_OUTPUT(GPIOB_TP12) | \ - PIN_MODE_OUTPUT(GPIOB_TP13) | \ - PIN_MODE_OUTPUT(GPIOB_PIN5_NC) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_INPUT(GPIOB_PIN8_BOOT0) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_OPENDRAIN(GPIOB_PIN0_NC) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1_NC) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2_NA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TP12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TP13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5_NC) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0_NC) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1_NC) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2_NA) | \ - PIN_OSPEED_HIGH(GPIOB_TP12) | \ - PIN_OSPEED_HIGH(GPIOB_TP13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5_NC) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_PIN0_NC) | \ - PIN_PUPDR_PULLDOWN(GPIOB_PIN1_NC) | \ - PIN_PUPDR_PULLDOWN(GPIOB_PIN2_NA) | \ - PIN_PUPDR_PULLUP(GPIOB_TP12) | \ - PIN_PUPDR_PULLUP(GPIOB_TP13) | \ - PIN_PUPDR_PULLDOWN(GPIOB_PIN5_NC) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_PULLDOWN(GPIOB_PIN8_BOOT0) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0_NC) | \ - PIN_ODR_HIGH(GPIOB_PIN1_NC) | \ - PIN_ODR_HIGH(GPIOB_PIN2_NA) | \ - PIN_ODR_HIGH(GPIOB_TP12) | \ - PIN_ODR_HIGH(GPIOB_TP13) | \ - PIN_ODR_HIGH(GPIOB_PIN5_NC) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN8_BOOT0) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0_NC, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1_NC, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2_NA, 0U) | \ - PIN_AFIO_AF(GPIOB_TP12, 0U) | \ - PIN_AFIO_AF(GPIOB_TP13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5_NC, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - PIN14 (input pullup). - * PC15 - PIN15 (input pullup). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_PIN14) | \ - PIN_MODE_INPUT(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (input pullup). - * PF1 - OSC_OUT (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \ - PIN_MODE_INPUT(GPIOF_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_OSC_IN) | \ - PIN_PUPDR_PULLUP(GPIOF_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/SOLAR_V1/board.mk b/boards/SOLAR_V1/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/SOLAR_V1/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/SOLAR_V1/gdboocd.cmd b/boards/SOLAR_V1/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/SOLAR_V1/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/SOLAR_V1/oocd.cfg b/boards/SOLAR_V1/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/SOLAR_V1/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/SOLAR_V2/board.c b/boards/SOLAR_V2/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/SOLAR_V2/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/SOLAR_V2/board.h b/boards/SOLAR_V2/board.h deleted file mode 100644 index c1893830..00000000 --- a/boards/SOLAR_V2/board.h +++ /dev/null @@ -1,961 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Setup for Oresat Solar V2 STM32F042K6 board. - * PART: STM32F042K6T6 - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_ORSAT_SOLAR_V2 -#define BOARD_NAME "Oresat Solar v2" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#define STM32_HSECLK 16000000U - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 0U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_SHDN_STM 0U -#define GPIOA_ZSPM-NFLT 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_DEBUG 4U -#define GPIOA_TP9 5U -#define GPIOA_TP10 6U -#define GPIOA_TP11 7U -#define GPIOA_PIN8_NC 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15_NC 15U - -#define GPIOB_PIN0_NC 0U -#define GPIOB_PIN1_NC 1U -#define GPIOB_PIN2_NA 2U -#define GPIOB_TP12 3U -#define GPIOB_TP13 4U -#define GPIOB_PIN5_NC 5U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8_BOOT0 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_PIN1 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 4U) -#define LINE_DEBUG PAL_LINE(GPIOA, 4U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - SHDN_STM (output floating). - * PA1 - ZSPM-NFLT (input pullup). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - DEBUG (output pulldown). - * PA5 - TP9 (output pullup). - * PA6 - TP10 (output pullup). - * PA7 - TP11 (output pullup). - * PA8 - NC (output pulldown). - * PA9 - CAN_SILENT (output pulldown). - * PA10 - CAN_SHDN (output pulldown). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - NC (output pulldown). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_SHDN_STM) | \ - PIN_MODE_INPUT(GPIOA_ZSPM-NFLT) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_OUTPUT(GPIOA_DEBUG) | \ - PIN_MODE_OUTPUT(GPIOA_TP9) | \ - PIN_MODE_OUTPUT(GPIOA_TP10) | \ - PIN_MODE_OUTPUT(GPIOA_TP11) | \ - PIN_MODE_OUTPUT(GPIOA_PIN8_NC) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_OUTPUT(GPIOA_PIN15_NC)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_OPENDRAIN(GPIOA_SHDN_STM) | \ - PIN_OTYPE_PUSHPULL(GPIOA_ZSPM-NFLT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_DEBUG) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TP9) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TP10) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TP11) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8_NC) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15_NC)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_SHDN_STM) | \ - PIN_OSPEED_HIGH(GPIOA_ZSPM-NFLT) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_DEBUG) | \ - PIN_OSPEED_HIGH(GPIOA_TP9) | \ - PIN_OSPEED_HIGH(GPIOA_TP10) | \ - PIN_OSPEED_HIGH(GPIOA_TP11) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8_NC) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15_NC)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_SHDN_STM) | \ - PIN_PUPDR_PULLUP(GPIOA_ZSPM-NFLT) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLDOWN(GPIOA_DEBUG) | \ - PIN_PUPDR_PULLUP(GPIOA_TP9) | \ - PIN_PUPDR_PULLUP(GPIOA_TP10) | \ - PIN_PUPDR_PULLUP(GPIOA_TP11) | \ - PIN_PUPDR_PULLDOWN(GPIOA_PIN8_NC) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLDOWN(GPIOA_PIN15_NC)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_SHDN_STM) | \ - PIN_ODR_HIGH(GPIOA_ZSPM-NFLT) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_LOW(GPIOA_DEBUG) | \ - PIN_ODR_HIGH(GPIOA_TP9) | \ - PIN_ODR_HIGH(GPIOA_TP10) | \ - PIN_ODR_HIGH(GPIOA_TP11) | \ - PIN_ODR_HIGH(GPIOA_PIN8_NC) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15_NC)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_SHDN_STM, 0U) | \ - PIN_AFIO_AF(GPIOA_ZSPM-NFLT, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_DEBUG, 0U) | \ - PIN_AFIO_AF(GPIOA_TP9, 0U) | \ - PIN_AFIO_AF(GPIOA_TP10, 0U) | \ - PIN_AFIO_AF(GPIOA_TP11, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8_NC, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15_NC, 0U)) - -/* - * GPIOB setup: - * - * PB0 - NC (output pulldown). - * PB1 - NC (output pulldown). - * PB2 - NA (input pullup). - * PB3 - TP12 (output pullup) - * PB4 - TP13 (output pullup). - * PB5 - NC (output pulldown). - * PB6 - I2C1_SCL (alternate 1) - * PB7 - I2C1_SDA (alternate 1). - * PB8 - NC BOOT0 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_OUTPUT(GPIOB_PIN0_NC) | \ - PIN_MODE_OUTPUT(GPIOB_PIN1_NC) | \ - PIN_MODE_INPUT(GPIOB_PIN2_NA) | \ - PIN_MODE_OUTPUT(GPIOB_TP12) | \ - PIN_MODE_OUTPUT(GPIOB_TP13) | \ - PIN_MODE_OUTPUT(GPIOB_PIN5_NC) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_INPUT(GPIOB_PIN8_BOOT0) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_OPENDRAIN(GPIOB_PIN0_NC) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1_NC) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2_NA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TP12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TP13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5_NC) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0_NC) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1_NC) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2_NA) | \ - PIN_OSPEED_HIGH(GPIOB_TP12) | \ - PIN_OSPEED_HIGH(GPIOB_TP13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5_NC) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLDOWN(GPIOB_PIN0_NC) | \ - PIN_PUPDR_PULLDOWN(GPIOB_PIN1_NC) | \ - PIN_PUPDR_PULLDOWN(GPIOB_PIN2_NA) | \ - PIN_PUPDR_PULLUP(GPIOB_TP12) | \ - PIN_PUPDR_PULLUP(GPIOB_TP13) | \ - PIN_PUPDR_PULLDOWN(GPIOB_PIN5_NC) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_PULLDOWN(GPIOB_PIN8_BOOT0) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0_NC) | \ - PIN_ODR_HIGH(GPIOB_PIN1_NC) | \ - PIN_ODR_HIGH(GPIOB_PIN2_NA) | \ - PIN_ODR_HIGH(GPIOB_TP12) | \ - PIN_ODR_HIGH(GPIOB_TP13) | \ - PIN_ODR_HIGH(GPIOB_PIN5_NC) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN8_BOOT0) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0_NC, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1_NC, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2_NA, 0U) | \ - PIN_AFIO_AF(GPIOB_TP12, 0U) | \ - PIN_AFIO_AF(GPIOB_TP13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5_NC, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - PIN14 (input pullup). - * PC15 - PIN15 (input pullup). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_PIN14) | \ - PIN_MODE_INPUT(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (input pullup). - * PF1 - OSC_OUT (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \ - PIN_MODE_INPUT(GPIOF_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_OSC_IN) | \ - PIN_PUPDR_PULLUP(GPIOF_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/SOLAR_V2/board.mk b/boards/SOLAR_V2/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/SOLAR_V2/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/SOLAR_V2/gdboocd.cmd b/boards/SOLAR_V2/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/SOLAR_V2/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/SOLAR_V2/oocd.cfg b/boards/SOLAR_V2/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/SOLAR_V2/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/SOLAR_V3/board.c b/boards/SOLAR_V3/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/SOLAR_V3/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/SOLAR_V3/board.h b/boards/SOLAR_V3/board.h deleted file mode 100644 index bd45c36a..00000000 --- a/boards/SOLAR_V3/board.h +++ /dev/null @@ -1,962 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Setup for Oresat Solar V3 STM32F042K6 board. - * PART: STM32F042K6T6 - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_ORSAT_SOLAR_V3 -#define BOARD_NAME "Oresat Solar v3.x" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_SHDN_STM 0U -#define GPIOA_PIN1 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_DEBUG 4U -#define GPIOA_OUTPUT_EN 5U -#define GPIOA_ALERT 6U -#define GPIOA_TP11 7U -#define GPIOA_PIN8 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_TP12 3U -#define GPIOB_TP13 4U -#define GPIOB_PIN5 5U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_BOOT0 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_PIN1 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 4U) -#define LINE_DEBUG PAL_LINE(GPIOA, 4U) -#define LINE_OUTPUT_EN PAL_LINE(GPIOA, 5U) -#define LINE_CAN_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN_SHDN PAL_LINE(GPIOA, 10U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - SHDN_STM (analog). - * PA1 - PIN1 NOT CONNECTED (analog). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - DEBUG (output pulldown). - * PA5 - OUTPUT_EN (output pushpull). - * PA6 - ALERT (input). - * PA7 - TP11 (analog). - * PA8 - PIN8 NOT CONNECTED (analog). - * PA9 - CAN_SILENT (output pulldown). - * PA10 - CAN_SHDN (output pulldown). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 NOT CONNECTED (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_SHDN_STM) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_OUTPUT(GPIOA_DEBUG) | \ - PIN_MODE_OUTPUT(GPIOA_OUTPUT_EN) | \ - PIN_MODE_INPUT(GPIOA_ALERT) | \ - PIN_MODE_ANALOG(GPIOA_TP11) | \ - PIN_MODE_ANALOG(GPIOA_PIN8) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_SHDN_STM) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_DEBUG) | \ - PIN_OTYPE_PUSHPULL(GPIOA_OUTPUT_EN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_ALERT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TP11) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_SHDN_STM) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_DEBUG) | \ - PIN_OSPEED_HIGH(GPIOA_OUTPUT_EN) | \ - PIN_OSPEED_HIGH(GPIOA_ALERT) | \ - PIN_OSPEED_HIGH(GPIOA_TP11) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_SHDN_STM) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLDOWN(GPIOA_DEBUG) | \ - PIN_PUPDR_FLOATING(GPIOA_OUTPUT_EN) | \ - PIN_PUPDR_FLOATING(GPIOA_ALERT) | \ - PIN_PUPDR_FLOATING(GPIOA_TP11) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN8) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_SHDN_STM) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_LOW(GPIOA_DEBUG) | \ - PIN_ODR_LOW(GPIOA_OUTPUT_EN) | \ - PIN_ODR_HIGH(GPIOA_ALERT) | \ - PIN_ODR_HIGH(GPIOA_TP11) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_SHDN_STM, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_DEBUG, 0U) | \ - PIN_AFIO_AF(GPIOA_OUTPUT_EN, 0U) | \ - PIN_AFIO_AF(GPIOA_ALERT, 0U) | \ - PIN_AFIO_AF(GPIOA_TP11, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 NOT CONNECTED (analog). - * PB1 - PIN1 NOT CONNECTED (analog). - * PB2 - PIN2 NOT APPLICABLE (analog). - * PB3 - PIN3 (analog). - * PB4 - PIN4 (analog). - * PB5 - PIN5 NOT CONNECTED (analog). - * PB6 - I2C1_SCL (alternate 1) - * PB7 - I2C1_SDA (alternate 1). - * PB8 - BOOT0 (analog). - * PB9 - PIN9 (analog). - * PB10 - PIN10 (analog). - * PB11 - PIN11 (analog). - * PB12 - PIN12 (analog). - * PB13 - PIN13 (analog). - * PB14 - PIN14 (analog). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN2) | \ - PIN_MODE_ANALOG(GPIOB_TP12) | \ - PIN_MODE_ANALOG(GPIOB_TP13) | \ - PIN_MODE_ANALOG(GPIOB_PIN5) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ANALOG(GPIOB_BOOT0) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_ANALOG(GPIOB_PIN10) | \ - PIN_MODE_ANALOG(GPIOB_PIN11) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_ANALOG(GPIOB_PIN13) | \ - PIN_MODE_ANALOG(GPIOB_PIN14) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TP12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TP13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_TP12) | \ - PIN_OSPEED_HIGH(GPIOB_TP13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_TP12) | \ - PIN_PUPDR_FLOATING(GPIOB_TP13) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_BOOT0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_TP12) | \ - PIN_ODR_HIGH(GPIOB_TP13) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_BOOT0) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_TP12, 0U) | \ - PIN_AFIO_AF(GPIOB_TP13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - PIN14 (analog). - * PC15 - PIN15 (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_PIN14) | \ - PIN_MODE_ANALOG(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (analog). - * PF1 - OSC_OUT (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOF_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/SOLAR_V3/board.mk b/boards/SOLAR_V3/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/SOLAR_V3/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/SOLAR_V3/gdboocd.cmd b/boards/SOLAR_V3/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/SOLAR_V3/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/SOLAR_V3/oocd.cfg b/boards/SOLAR_V3/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/SOLAR_V3/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/SOLAR_V4/board.c b/boards/SOLAR_V4/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/SOLAR_V4/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/SOLAR_V4/board.h b/boards/SOLAR_V4/board.h deleted file mode 100644 index 714974d4..00000000 --- a/boards/SOLAR_V4/board.h +++ /dev/null @@ -1,961 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Oresat Solar V4 STM32F091CC board. - * PART: STM32F091CC - * PACKAGE: LQFP32 - */ - -/* - * Board identifier. - */ -#define BOARD_ORSAT_SOLAR_V4 -#define BOARD_NAME "Oresat Solar v4.x" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 16000000U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F091xC - -/* - * IO pins assignments. - */ -#define GPIOA_LED 0U -#define GPIOA_LT1618_EN 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_IADJ 4U -#define GPIOA_PIN5 5U -#define GPIOA_PIN6 6U -#define GPIOA_PIN7 7U -#define GPIOA_PIN8 8U -#define GPIOA_CAN_SILENT 9U -#define GPIOA_CAN_SHDN 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_PIN3 3U -#define GPIOB_PIN4 4U -#define GPIOB_PIN5 5U -#define GPIOB_PIN6 6U -#define GPIOB_PIN7 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_I2C2_SCL 10U -#define GPIOB_I2C2_SDA 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_OSC_IN 0U -#define GPIOF_OSC_OUT 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_BOOT0 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_PIN1 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LED PAL_LINE(GPIOA, 0U) -#define LINE_LT1618_EN PAL_LINE(GPIOA, 1U) -#define LINE_CAN_SILENT PAL_LINE(GPIOA, 9U) -#define LINE_CAN_SHDN PAL_LINE(GPIOA, 10U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - LED (output pushpull). - * PA1 - LT1618_EN (output pushpull). - * PA2 - USART2_TX (alternate 1). - * PA3 - USART2_RX (alternate 1). - * PA4 - IADJ (analog). - * PA5 - PIN5 (analog). - * PA6 - PIN6 (analog). - * PA7 - PIN7 (analog). - * PA8 - PIN8 (analog). - * PA9 - CAN_SILENT (output pulldown). - * PA10 - CAN_SHDN (output pulldown). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_LED) | \ - PIN_MODE_OUTPUT(GPIOA_LT1618_EN) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_ANALOG(GPIOA_IADJ) | \ - PIN_MODE_ANALOG(GPIOA_PIN5) | \ - PIN_MODE_ANALOG(GPIOA_PIN6) | \ - PIN_MODE_ANALOG(GPIOA_PIN7) | \ - PIN_MODE_ANALOG(GPIOA_PIN8) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SILENT) | \ - PIN_MODE_OUTPUT(GPIOA_CAN_SHDN) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_LED) | \ - PIN_OTYPE_PUSHPULL(GPIOA_LT1618_EN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_IADJ) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SILENT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_SHDN) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_LED) | \ - PIN_OSPEED_HIGH(GPIOA_LT1618_EN) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_IADJ) | \ - PIN_OSPEED_HIGH(GPIOA_PIN5) | \ - PIN_OSPEED_HIGH(GPIOA_PIN6) | \ - PIN_OSPEED_HIGH(GPIOA_PIN7) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SILENT) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_SHDN) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLDOWN(GPIOA_LED) | \ - PIN_PUPDR_PULLDOWN(GPIOA_LT1618_EN) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_USART2_RX) | \ - PIN_PUPDR_FLOATING(GPIOA_IADJ) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN8) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SILENT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_CAN_SHDN) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_LOW(GPIOA_LED) | \ - PIN_ODR_LOW(GPIOA_LT1618_EN) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_IADJ) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_PIN7) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_LOW(GPIOA_CAN_SILENT) | \ - PIN_ODR_LOW(GPIOA_CAN_SHDN) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_LED, 0U) | \ - PIN_AFIO_AF(GPIOA_LT1618_EN, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 1U) | \ - PIN_AFIO_AF(GPIOA_IADJ, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN7, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SILENT, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_SHDN, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - PIN1 (analog). - * PB2 - PIN2 (analog). - * PB3 - PIN3 (analog). - * PB4 - PIN4 (analog). - * PB5 - PIN5 (analog). - * PB6 - PIN6 (analog). - * PB7 - PIN7 (analog). - * PB8 - PIN8 (analog). - * PB9 - PIN9 (analog). - * PB10 - I2C2_SCL (alternate 1). - * PB11 - I2C2_SDA (alternate 1). - * PB12 - PIN12 (analog). - * PB13 - PIN13 (analog). - * PB14 - PIN14 (analog). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN2) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_ANALOG(GPIOB_PIN4) | \ - PIN_MODE_ANALOG(GPIOB_PIN5) | \ - PIN_MODE_ANALOG(GPIOB_PIN6) | \ - PIN_MODE_ANALOG(GPIOB_PIN7) | \ - PIN_MODE_ANALOG(GPIOB_PIN8) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SDA) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_ANALOG(GPIOB_PIN13) | \ - PIN_MODE_ANALOG(GPIOB_PIN14) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN4) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_PIN6) | \ - PIN_OSPEED_HIGH(GPIOB_PIN7) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_I2C2_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C2_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C2_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C2_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_PIN6) | \ - PIN_ODR_HIGH(GPIOB_PIN7) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_I2C2_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C2_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN7, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C2_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C2_SDA, 1U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 (analog). - * PC14 - PIN14 (analog). - * PC15 - PIN15 (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_ANALOG(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_PIN14) | \ - PIN_MODE_ANALOG(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (analog). - * PF1 - OSC_OUT (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - BOOT0 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOF_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_BOOT0) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_BOOT0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOF_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_BOOT0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_BOOT0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_BOOT0) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_BOOT0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/SOLAR_V4/board.mk b/boards/SOLAR_V4/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/SOLAR_V4/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/SOLAR_V4/gdboocd.cmd b/boards/SOLAR_V4/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/SOLAR_V4/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/SOLAR_V4/oocd.cfg b/boards/SOLAR_V4/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/SOLAR_V4/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/ST_NUCLEO144_F439ZI/board.c b/boards/ST_NUCLEO144_F439ZI/board.c deleted file mode 100644 index 47713668..00000000 --- a/boards/ST_NUCLEO144_F439ZI/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -// #if STM32_HAS_GPIOI || defined(__DOXYGEN__) -// gpio_setup_t PIData; -// #endif -// #if STM32_HAS_GPIOJ || defined(__DOXYGEN__) -// gpio_setup_t PJData; -// #endif -// #if STM32_HAS_GPIOK || defined(__DOXYGEN__) -// gpio_setup_t PKData; -// #endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -// #if STM32_HAS_GPIOI -// {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, -// VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -// #endif -// #if STM32_HAS_GPIOJ -// {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, -// VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -// #endif -// #if STM32_HAS_GPIOK -// {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, -// VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -// #endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB1(STM32_GPIO_EN_MASK); - rccEnableAHB1(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -// #if STM32_HAS_GPIOI -// gpio_init(GPIOI, &gpio_default_config.PIData); -// #endif -// #if STM32_HAS_GPIOJ -// gpio_init(GPIOJ, &gpio_default_config.PJData); -// #endif -// #if STM32_HAS_GPIOK -// gpio_init(GPIOK, &gpio_default_config.PKData); -// #endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ST_NUCLEO144_F439ZI/board.h b/boards/ST_NUCLEO144_F439ZI/board.h deleted file mode 100644 index cb9a4818..00000000 --- a/boards/ST_NUCLEO144_F439ZI/board.h +++ /dev/null @@ -1,1201 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Board description - * PART: PART_NUM - * PACKAGE: PACKAGE - */ - -/* - * Board identifier. - */ -#define BOARD_ST_NUCLEO144_F439ZI -#define BOARD_NAME "STMicroelectronics STM32 Nucleo144-F439ZI" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 8000000U -#endif - -#define STM32_HSE_BYPASS - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300U - -/* - * MCU type as defined in the ST header. - */ -#define STM32F439xx - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_RMII_REF_CLK 1U -#define GPIOA_RMII_MDIO 2U -#define GPIOA_PIN3 3U -#define GPIOA_PIN4 4U -#define GPIOA_PIN5 5U -#define GPIOA_PIN6 6U -#define GPIOA_RMII_CRS_DV 7U -#define GPIOA_PIN8 8U -#define GPIOA_USB_VBUS 9U -#define GPIOA_USB_ID 10U -#define GPIOA_USB_DM 11U -#define GPIOA_USB_DP 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_LD1 0U -#define GPIOB_PIN1 1U -#define GPIOB_BOOT1 2U -#define GPIOB_SWO 3U -#define GPIOB_PIN4 4U -#define GPIOB_PIN5 5U -#define GPIOB_PIN6 6U -#define GPIOB_LD2 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_RMII_TXD1 13U -#define GPIOB_LD3 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_RMII_MDC 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_RMII_RXD0 4U -#define GPIOC_RMII_RXD1 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_USR_BUT 13U -#define GPIOC_OSC32_IN 14U -#define GPIOC_OSC32_OUT 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_USART3_TX 8U -#define GPIOD_USART3_RX 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_USB_GPIO_OUT 6U -#define GPIOG_USB_GPIO_IN 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_RMII_TX_EN 11U -#define GPIOG_PIN12 12U -#define GPIOG_RMII_TXD0 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_OSC_IN 0U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_LD1 PAL_LINE(GPIOB, 0U) -#define LINE_LD2 PAL_LINE(GPIOB, 7U) -#define LINE_LED PAL_LINE(GPIOB, 14U) -#define LINE_BUTTON PAL_LINE(GPIOC, 13U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - PIN0 (analog). - * PA1 - RMII_REF_CLK (alternate 11). - * PA2 - RMII_MDIO (alternate 11). - * PA3 - PIN3 (analog). - * PA4 - PIN4 (analog). - * PA5 - PIN5 (analog). - * PA6 - PIN6 (analog). - * PA7 - RMII_CRS_DV (alternate 11). - * PA8 - PIN8 (analog). - * PA9 - USB_VBUS (analog). - * PA10 - USB_ID (alternate 10). - * PA11 - USB_DM (alternate 10). - * PA12 - USB_DP (alternate 10). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_PIN0) | \ - PIN_MODE_ALTERNATE(GPIOA_RMII_REF_CLK) | \ - PIN_MODE_ALTERNATE(GPIOA_RMII_MDIO) | \ - PIN_MODE_ANALOG(GPIOA_PIN3) | \ - PIN_MODE_ANALOG(GPIOA_PIN4) | \ - PIN_MODE_ANALOG(GPIOA_PIN5) | \ - PIN_MODE_ANALOG(GPIOA_PIN6) | \ - PIN_MODE_ALTERNATE(GPIOA_RMII_CRS_DV) | \ - PIN_MODE_ANALOG(GPIOA_PIN8) | \ - PIN_MODE_ANALOG(GPIOA_USB_VBUS) | \ - PIN_MODE_ALTERNATE(GPIOA_USB_ID) | \ - PIN_MODE_ALTERNATE(GPIOA_USB_DM) | \ - PIN_MODE_ALTERNATE(GPIOA_USB_DP) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOA_RMII_REF_CLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_RMII_MDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_RMII_CRS_DV) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USB_VBUS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USB_ID) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_PIN0) | \ - PIN_OSPEED_HIGH(GPIOA_RMII_REF_CLK) | \ - PIN_OSPEED_HIGH(GPIOA_RMII_MDIO) | \ - PIN_OSPEED_HIGH(GPIOA_PIN3) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_PIN5) | \ - PIN_OSPEED_HIGH(GPIOA_PIN6) | \ - PIN_OSPEED_HIGH(GPIOA_RMII_CRS_DV) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_USB_VBUS) | \ - PIN_OSPEED_HIGH(GPIOA_USB_ID) | \ - PIN_OSPEED_HIGH(GPIOA_USB_DM) | \ - PIN_OSPEED_HIGH(GPIOA_USB_DP) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOA_RMII_REF_CLK) | \ - PIN_PUPDR_FLOATING(GPIOA_RMII_MDIO) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOA_RMII_CRS_DV) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOA_USB_VBUS) | \ - PIN_PUPDR_FLOATING(GPIOA_USB_ID) | \ - PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \ - PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ - PIN_ODR_HIGH(GPIOA_RMII_REF_CLK) | \ - PIN_ODR_HIGH(GPIOA_RMII_MDIO) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_RMII_CRS_DV) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_HIGH(GPIOA_USB_VBUS) | \ - PIN_ODR_HIGH(GPIOA_USB_ID) | \ - PIN_ODR_HIGH(GPIOA_USB_DM) | \ - PIN_ODR_HIGH(GPIOA_USB_DP) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOA_RMII_REF_CLK, 11U) | \ - PIN_AFIO_AF(GPIOA_RMII_MDIO, 11U) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOA_RMII_CRS_DV, 11U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_USB_VBUS, 0U) | \ - PIN_AFIO_AF(GPIOA_USB_ID, 10U) | \ - PIN_AFIO_AF(GPIOA_USB_DM, 10U) | \ - PIN_AFIO_AF(GPIOA_USB_DP, 10U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - LD1 (output). - * PB1 - PIN1 (analog). - * PB2 - BOOT1 (alternate 0). - * PB3 - SWO (alternate 0). - * PB4 - PIN4 (analog). - * PB5 - PIN5 (analog). - * PB6 - PIN6 (analog). - * PB7 - LD2 (output). - * PB8 - PIN8 (analog). - * PB9 - PIN9 (analog). - * PB10 - PIN10 (analog). - * PB11 - PIN11 (analog). - * PB12 - PIN12 (analog). - * PB13 - RMII_TXD1 (alternate 11). - * PB14 - LD3 (output). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_OUTPUT(GPIOB_LD1) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOB_BOOT1) | \ - PIN_MODE_ALTERNATE(GPIOB_SWO) | \ - PIN_MODE_ANALOG(GPIOB_PIN4) | \ - PIN_MODE_ANALOG(GPIOB_PIN5) | \ - PIN_MODE_ANALOG(GPIOB_PIN6) | \ - PIN_MODE_OUTPUT(GPIOB_LD2) | \ - PIN_MODE_ANALOG(GPIOB_PIN8) | \ - PIN_MODE_ANALOG(GPIOB_PIN9) | \ - PIN_MODE_ANALOG(GPIOB_PIN10) | \ - PIN_MODE_ANALOG(GPIOB_PIN11) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOB_RMII_TXD1) | \ - PIN_MODE_OUTPUT(GPIOB_LD3) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_LD1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_BOOT1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SWO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LD2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_RMII_TXD1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LD3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_LD1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_BOOT1) | \ - PIN_OSPEED_HIGH(GPIOB_SWO) | \ - PIN_OSPEED_HIGH(GPIOB_PIN4) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_PIN6) | \ - PIN_OSPEED_HIGH(GPIOB_LD2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_RMII_TXD1) | \ - PIN_OSPEED_HIGH(GPIOB_LD3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_LD1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_BOOT1) | \ - PIN_PUPDR_FLOATING(GPIOB_SWO) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOB_LD2) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_RMII_TXD1) | \ - PIN_PUPDR_FLOATING(GPIOB_LD3) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_LOW(GPIOB_LD1) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_BOOT1) | \ - PIN_ODR_HIGH(GPIOB_SWO) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_PIN6) | \ - PIN_ODR_LOW(GPIOB_LD2) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_RMII_TXD1) | \ - PIN_ODR_LOW(GPIOB_LD3) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_LD1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_BOOT1, 0U) | \ - PIN_AFIO_AF(GPIOB_SWO, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOB_LD2, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_RMII_TXD1, 11U) | \ - PIN_AFIO_AF(GPIOB_LD3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - RMII_MDC (alternate 11). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - RMII_RXD0 (alternate 11). - * PC5 - RMII_RXD1 (alternate 11). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - USR_BUT (input). - * PC14 - OSC32_IN (analog). - * PC15 - OSC32_OUT (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ALTERNATE(GPIOC_RMII_MDC) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ALTERNATE(GPIOC_RMII_RXD0) | \ - PIN_MODE_ALTERNATE(GPIOC_RMII_RXD1) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_USR_BUT) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_IN) | \ - PIN_MODE_ANALOG(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_RMII_MDC) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_RMII_RXD0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_RMII_RXD1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_USR_BUT) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_RMII_MDC) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_RMII_RXD0) | \ - PIN_OSPEED_HIGH(GPIOC_RMII_RXD1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_USR_BUT) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_RMII_MDC) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_RMII_RXD0) | \ - PIN_PUPDR_FLOATING(GPIOC_RMII_RXD1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_USR_BUT) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_RMII_MDC) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_RMII_RXD0) | \ - PIN_ODR_HIGH(GPIOC_RMII_RXD1) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_LOW(GPIOC_USR_BUT) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_RMII_MDC, 11U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_RMII_RXD0, 11U) | \ - PIN_AFIO_AF(GPIOC_RMII_RXD1, 11U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_USR_BUT, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - USART3_TX (alternate 7). - * PD9 - USART3_RX (alternate 7). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_TX) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_RX) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_USART3_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOD_USART3_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_USART3_TX) | \ - PIN_OSPEED_HIGH(GPIOD_USART3_RX) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_USART3_TX) | \ - PIN_PUPDR_FLOATING(GPIOD_USART3_RX) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_USART3_TX) | \ - PIN_ODR_HIGH(GPIOD_USART3_RX) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_USART3_TX, 7U) | \ - PIN_AFIO_AF(GPIOD_USART3_RX, 7U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (analog). - * PF1 - PIN1 (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_PIN0) | \ - PIN_MODE_ANALOG(GPIOF_PIN1) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - GPIO_OUT (output). - * PG7 - GPIO_IN (input). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - RMII_TX_EN (alternate 11). - * PG12 - PIN12 (analog). - * PG13 - RMII_TXD0 (alternate 11). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOG_MODER (PIN_MODE_ANALOG(GPIOG_PIN0) | \ - PIN_MODE_ANALOG(GPIOG_PIN1) | \ - PIN_MODE_ANALOG(GPIOG_PIN2) | \ - PIN_MODE_ANALOG(GPIOG_PIN3) | \ - PIN_MODE_ANALOG(GPIOG_PIN4) | \ - PIN_MODE_ANALOG(GPIOG_PIN5) | \ - PIN_MODE_OUTPUT(GPIOG_USB_GPIO_OUT) | \ - PIN_MODE_INPUT(GPIOG_USB_GPIO_IN) | \ - PIN_MODE_ANALOG(GPIOG_PIN8) | \ - PIN_MODE_ANALOG(GPIOG_PIN9) | \ - PIN_MODE_ANALOG(GPIOG_PIN10) | \ - PIN_MODE_ALTERNATE(GPIOG_RMII_TX_EN) | \ - PIN_MODE_ANALOG(GPIOG_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOG_RMII_TXD0) | \ - PIN_MODE_ANALOG(GPIOG_PIN14) | \ - PIN_MODE_ANALOG(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_USB_GPIO_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOG_USB_GPIO_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_RMII_TX_EN) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_RMII_TXD0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_USB_GPIO_OUT) | \ - PIN_OSPEED_HIGH(GPIOG_USB_GPIO_IN) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_RMII_TX_EN) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_RMII_TXD0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_USB_GPIO_OUT) | \ - PIN_PUPDR_FLOATING(GPIOG_USB_GPIO_IN) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_RMII_TX_EN) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_RMII_TXD0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_LOW(GPIOG_USB_GPIO_OUT) | \ - PIN_ODR_HIGH(GPIOG_USB_GPIO_IN) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_RMII_TX_EN) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_RMII_TXD0) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_USB_GPIO_OUT, 0U) | \ - PIN_AFIO_AF(GPIOG_USB_GPIO_IN, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_RMII_TX_EN, 11U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_RMII_TXD0, 11U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (analog). - * PH1 - OSC_OUT (analog). - * PH2 - PIN2 (analog). - * PH3 - PIN3 (analog). - * PH4 - PIN4 (analog). - * PH5 - PIN5 (analog). - * PH6 - PIN6 (analog). - * PH7 - PIN7 (analog). - * PH8 - PIN8 (analog). - * PH9 - PIN9 (analog). - * PH10 - PIN10 (analog). - * PH11 - PIN11 (analog). - * PH12 - PIN12 (analog). - * PH13 - PIN13 (analog). - * PH14 - PIN14 (analog). - * PH15 - PIN15 (analog). - */ -#define VAL_GPIOH_MODER (PIN_MODE_ANALOG(GPIOH_OSC_IN) | \ - PIN_MODE_ANALOG(GPIOH_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOH_PIN2) | \ - PIN_MODE_ANALOG(GPIOH_PIN3) | \ - PIN_MODE_ANALOG(GPIOH_PIN4) | \ - PIN_MODE_ANALOG(GPIOH_PIN5) | \ - PIN_MODE_ANALOG(GPIOH_PIN6) | \ - PIN_MODE_ANALOG(GPIOH_PIN7) | \ - PIN_MODE_ANALOG(GPIOH_PIN8) | \ - PIN_MODE_ANALOG(GPIOH_PIN9) | \ - PIN_MODE_ANALOG(GPIOH_PIN10) | \ - PIN_MODE_ANALOG(GPIOH_PIN11) | \ - PIN_MODE_ANALOG(GPIOH_PIN12) | \ - PIN_MODE_ANALOG(GPIOH_PIN13) | \ - PIN_MODE_ANALOG(GPIOH_PIN14) | \ - PIN_MODE_ANALOG(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ST_NUCLEO144_F439ZI/board.mk b/boards/ST_NUCLEO144_F439ZI/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ST_NUCLEO144_F439ZI/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ST_NUCLEO144_F439ZI/gdboocd.cmd b/boards/ST_NUCLEO144_F439ZI/gdboocd.cmd deleted file mode 100644 index ac017d4e..00000000 --- a/boards/ST_NUCLEO144_F439ZI/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ST_NUCLEO144_F439ZI/oocd.cfg b/boards/ST_NUCLEO144_F439ZI/oocd.cfg deleted file mode 100644 index d44f8d8f..00000000 --- a/boards/ST_NUCLEO144_F439ZI/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f4x.cfg] - diff --git a/boards/ST_NUCLEO32_F042K6/board.c b/boards/ST_NUCLEO32_F042K6/board.c deleted file mode 100644 index e9075159..00000000 --- a/boards/ST_NUCLEO32_F042K6/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB(STM32_GPIO_EN_MASK); - rccEnableAHB(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ST_NUCLEO32_F042K6/board.h b/boards/ST_NUCLEO32_F042K6/board.h deleted file mode 100644 index ddffebf2..00000000 --- a/boards/ST_NUCLEO32_F042K6/board.h +++ /dev/null @@ -1,966 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Setup for STMicroelectronics STM32 Nucleo32-F042K6 board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_NUCLEO32_F042K6 -#define BOARD_NAME "STMicroelectronics STM32 Nucleo32-F042K6" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - * NOTE: HSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 0U -#endif - -/* - * MCU type as defined in the ST header. - */ -#define STM32F042x6 - -/* - * IO pins assignments. - */ -#define GPIOA_ARD_A0 0U -#define GPIOA_ARD_A1 1U -#define GPIOA_VCP_TX 2U -#define GPIOA_ARD_A2 3U -#define GPIOA_ARD_A3 4U -#define GPIOA_SPI1_NSS 4U -#define GPIOA_ARD_A4 5U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_ARD_A5 6U -#define GPIOA_ARD_A6 7U -#define GPIOA_TIM1_CH1N 7U -#define GPIOA_ARD_D9 8U -#define GPIOA_TIM1_CH1 8U -#define GPIOA_ARD_D1 9U -#define GPIOA_TIM1_CH2 9U -#define GPIOA_ARD_D0 10U -#define GPIOA_TIM1_CH3 10U -#define GPIOA_CAN_RX 11U -#define GPIOA_CAN_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_VCP_RX 15U - -#define GPIOB_ARD_D3 0U -#define GPIOB_TIM1_CH2N 0U -#define GPIOB_ARD_D6 1U -#define GPIOB_TIM1_CH3N 1U -#define GPIOB_PIN2 2U -#define GPIOB_ARD_D13 3U -#define GPIOB_LED 3U -#define GPIOB_ARD_D12 4U -#define GPIOB_SPI1_MISO 4U -#define GPIOB_ARD_D11 5U -#define GPIOB_SPI1_MOSI 5U -#define GPIOB_ARD_D5 6U -#define GPIOB_ARD_A5_ALT 6U -#define GPIOB_I2C1_SCL 6U -#define GPIOB_ARD_D4 7U -#define GPIOB_ARD_A4_ALT 7U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_PIN14 14U -#define GPIOB_PIN15 15U - -#define GPIOC_PIN0 0U -#define GPIOC_PIN1 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_PIN14 14U -#define GPIOC_PIN15 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_ARD_D7 0U -#define GPIOF_ARD_D8 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_ARD_A0 PAL_LINE(GPIOA, 0U) -#define LINE_ARD_A1 PAL_LINE(GPIOA, 1U) -#define LINE_VCP_TX PAL_LINE(GPIOA, 2U) -#define LINE_ARD_A2 PAL_LINE(GPIOA, 3U) -#define LINE_ARD_A3 PAL_LINE(GPIOA, 4U) -#define LINE_SPI1_NSS PAL_LINE(GPIOA, 4U) -#define LINE_ARD_A4 PAL_LINE(GPIOA, 5U) -#define LINE_ARD_A5 PAL_LINE(GPIOA, 6U) -#define LINE_ARD_A6 PAL_LINE(GPIOA, 7U) -#define LINE_ARD_D9 PAL_LINE(GPIOA, 8U) -#define LINE_ARD_D1 PAL_LINE(GPIOA, 9U) -#define LINE_ARD_D0 PAL_LINE(GPIOA, 10U) -#define LINE_CAN_RX PAL_LINE(GPIOA, 11U) -#define LINE_CAN_TX PAL_LINE(GPIOA, 12U) -#define LINE_SWDIO PAL_LINE(GPIOA, 13U) -#define LINE_SWCLK PAL_LINE(GPIOA, 14U) -#define LINE_VCP_RX PAL_LINE(GPIOA, 15U) -#define LINE_ARD_D3 PAL_LINE(GPIOB, 0U) -#define LINE_ARD_D6 PAL_LINE(GPIOB, 1U) -#define LINE_ARD_D13 PAL_LINE(GPIOB, 3U) -#define LINE_LED PAL_LINE(GPIOB, 3U) -#define LINE_ARD_D12 PAL_LINE(GPIOB, 4U) -#define LINE_ARD_D11 PAL_LINE(GPIOB, 5U) -#define LINE_ARD_D5 PAL_LINE(GPIOB, 6U) -#define LINE_ARD_A5_ALT PAL_LINE(GPIOB, 6U) -#define LINE_ARD_D4 PAL_LINE(GPIOB, 7U) -#define LINE_ARD_A4_ALT PAL_LINE(GPIOB, 7U) -#define LINE_ARD_D7 PAL_LINE(GPIOF, 0U) -#define LINE_ARD_D8 PAL_LINE(GPIOF, 1U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - ARD_A0 (input pullup). - * PA1 - ARD_A1 (input pullup). - * PA2 - VCP_TX (alternate 1). - * PA3 - ARD_A2 (input pullup). - * PA4 - SPI1_NSS (output pushpull maximum). - * PA5 - SPI1_SCK (input floating). - * PA6 - ARD_A5 (input pullup). - * PA7 - TIM1_CH1N (alternate 2). - * PA8 - TIM1_CH1 (alternate 2). - * PA9 - TIM1_CH2 (alternate 2). - * PA10 - TIM1_CH3 (alternate 2). - * PA11 - CAN_RX (alternate 4). - * PA12 - CAN_TX (alternate 4). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - VCP_RX (alternate 1). - */ -#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_ARD_A0) | \ - PIN_MODE_INPUT(GPIOA_ARD_A1) | \ - PIN_MODE_ALTERNATE(GPIOA_VCP_TX) | \ - PIN_MODE_INPUT(GPIOA_ARD_A2) | \ - PIN_MODE_OUTPUT(GPIOA_SPI1_NSS) | \ - PIN_MODE_INPUT(GPIOA_SPI1_SCK) | \ - PIN_MODE_INPUT(GPIOA_ARD_A5) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH1) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH1N) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH2) | \ - PIN_MODE_ALTERNATE(GPIOA_TIM1_CH3) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ALTERNATE(GPIOA_VCP_RX)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_ARD_A0) | \ - PIN_OTYPE_PUSHPULL(GPIOA_ARD_A1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_VCP_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_ARD_A2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_NSS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_ARD_A5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH1N) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_TIM1_CH3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_VCP_RX)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_ARD_A0) | \ - PIN_OSPEED_HIGH(GPIOA_ARD_A1) | \ - PIN_OSPEED_LOW(GPIOA_VCP_TX) | \ - PIN_OSPEED_HIGH(GPIOA_ARD_A2) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_NSS) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_ARD_A5) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH1N) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH1) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH2) | \ - PIN_OSPEED_HIGH(GPIOA_TIM1_CH3) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_VCP_RX)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLUP(GPIOA_ARD_A0) | \ - PIN_PUPDR_PULLUP(GPIOA_ARD_A1) | \ - PIN_PUPDR_FLOATING(GPIOA_VCP_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_ARD_A2) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_NSS) | \ - PIN_PUPDR_FLOATING(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_PULLUP(GPIOA_ARD_A5) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH1N) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH1) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH2) | \ - PIN_PUPDR_PULLUP(GPIOA_TIM1_CH3) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_VCP_RX)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_ARD_A0) | \ - PIN_ODR_HIGH(GPIOA_ARD_A1) | \ - PIN_ODR_HIGH(GPIOA_VCP_TX) | \ - PIN_ODR_HIGH(GPIOA_ARD_A2) | \ - PIN_ODR_HIGH(GPIOA_SPI1_NSS) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_ARD_A5) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH1N) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH1) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH2) | \ - PIN_ODR_HIGH(GPIOA_TIM1_CH3) | \ - PIN_ODR_HIGH(GPIOA_CAN_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_VCP_RX)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_ARD_A0, 0U) | \ - PIN_AFIO_AF(GPIOA_ARD_A1, 0U) | \ - PIN_AFIO_AF(GPIOA_VCP_TX, 1U) | \ - PIN_AFIO_AF(GPIOA_ARD_A2, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_NSS, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 0U) | \ - PIN_AFIO_AF(GPIOA_ARD_A5, 0U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH1N, 2U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_TIM1_CH1, 2U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH2, 2U) | \ - PIN_AFIO_AF(GPIOA_TIM1_CH3, 2U) | \ - PIN_AFIO_AF(GPIOA_CAN_RX, 4U) | \ - PIN_AFIO_AF(GPIOA_CAN_TX, 4U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_VCP_RX, 1U)) - -/* - * GPIOB setup: - * - * PB0 - TIM1_CH2N (alternate 2). - * PB1 - TIM1_CH3N (alternate 2). - * PB2 - PIN2 (input pullup). - * PB3 - ARD_D13 LED (output pushpull maximum). - * PB4 - SPI1_MISO (alternate 0). - * PB5 - SPI1_MOSI (alternate 0). - * PB6 - I2C1_SCL (alternate 1) - * PB7 - I2C1_SDA (alternate 1). - * PB8 - PIN8 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ALTERNATE(GPIOB_TIM1_CH2N) | \ - PIN_MODE_ALTERNATE(GPIOB_TIM1_CH3N) | \ - PIN_MODE_INPUT(GPIOB_PIN2) | \ - PIN_MODE_OUTPUT(GPIOB_ARD_D13) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI1_MOSI) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_INPUT(GPIOB_PIN8) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_TIM1_CH2N) | \ - PIN_OTYPE_PUSHPULL(GPIOB_TIM1_CH3N) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_ARD_D13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI1_MOSI) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_TIM1_CH2N) | \ - PIN_OSPEED_HIGH(GPIOB_TIM1_CH3N) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_ARD_D13) | \ - PIN_OSPEED_HIGH(GPIOB_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOB_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_TIM1_CH2N) | \ - PIN_PUPDR_PULLUP(GPIOB_TIM1_CH3N) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_ARD_D13) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI1_MISO) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI1_MOSI) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_TIM1_CH2N) | \ - PIN_ODR_HIGH(GPIOB_TIM1_CH3N) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_LOW(GPIOB_ARD_D13) | \ - PIN_ODR_HIGH(GPIOB_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOB_SPI1_MOSI) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_TIM1_CH2N, 2U) | \ - PIN_AFIO_AF(GPIOB_TIM1_CH3N, 2U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_ARD_D13, 0U) | \ - PIN_AFIO_AF(GPIOB_SPI1_MISO, 0U) | \ - PIN_AFIO_AF(GPIOB_SPI1_MOSI, 0U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SCL, 1U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 1U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - PIN14 (input pullup). - * PC15 - PIN15 (input pullup). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_PIN14) | \ - PIN_MODE_INPUT(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - ARD_D7 (input pullup). - * PF1 - ARD_D8 (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_ARD_D7) | \ - PIN_MODE_INPUT(GPIOF_ARD_D8) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_ARD_D7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_ARD_D8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_ARD_D7) | \ - PIN_OSPEED_HIGH(GPIOF_ARD_D8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_ARD_D7) | \ - PIN_PUPDR_PULLUP(GPIOF_ARD_D8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_ARD_D7) | \ - PIN_ODR_HIGH(GPIOF_ARD_D8) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_ARD_D7, 0U) | \ - PIN_AFIO_AF(GPIOF_ARD_D8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ST_NUCLEO32_F042K6/board.mk b/boards/ST_NUCLEO32_F042K6/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ST_NUCLEO32_F042K6/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ST_NUCLEO32_F042K6/gdboocd.cmd b/boards/ST_NUCLEO32_F042K6/gdboocd.cmd deleted file mode 100644 index 2fea8ebd..00000000 --- a/boards/ST_NUCLEO32_F042K6/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f0x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ST_NUCLEO32_F042K6/oocd.cfg b/boards/ST_NUCLEO32_F042K6/oocd.cfg deleted file mode 100644 index 46967e82..00000000 --- a/boards/ST_NUCLEO32_F042K6/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f0x.cfg] - diff --git a/boards/ST_NUCLEO64_F446RE/board.c b/boards/ST_NUCLEO64_F446RE/board.c deleted file mode 100644 index 5f49a349..00000000 --- a/boards/ST_NUCLEO64_F446RE/board.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB1(STM32_GPIO_EN_MASK); - rccEnableAHB1(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ST_NUCLEO64_F446RE/board.h b/boards/ST_NUCLEO64_F446RE/board.h deleted file mode 100644 index 6e3dfecf..00000000 --- a/boards/ST_NUCLEO64_F446RE/board.h +++ /dev/null @@ -1,1344 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Setup for STMicroelectronics STM32 Nucleo64-F446RE board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_NUCLEO64_F446RE -#define BOARD_NAME "STMicroelectronics STM32 Nucleo64-F446RE" - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0U -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 8000000U -#endif - -#define STM32_HSE_BYPASS - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300U - -/* - * MCU type as defined in the ST header. - */ -#define STM32F446xx - -/* - * IO pins assignments. - */ -#define GPIOA_AX1_IRQ 0U -#define GPIOA_AX2_IRQ 1U -#define GPIOA_USART2_TX 2U -#define GPIOA_USART2_RX 3U -#define GPIOA_ARD_A2 4U -#define GPIOA_LED 5U -#define GPIOA_SPI1_SCK 5U -#define GPIOA_SPI1_MISO 6U -#define GPIOA_SPI1_MOSI 7U -#define GPIOA_AX1_CS 8U -#define GPIOA_AX2_CS 9U -#define GPIOA_ARD_D2 10U -#define GPIOA_CAN1_RX 11U -#define GPIOA_CAN1_TX 12U -#define GPIOA_SWDIO 13U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U - -#define GPIOB_ARD_A3 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_SWO 3U -#define GPIOB_ARD_D5 4U -#define GPIOB_CAN2_RX 5U -#define GPIOB_CAN2_TX 6U -#define GPIOB_PIN7 7U -#define GPIOB_I2C1_SCL 8U -#define GPIOB_I2C1_SDA 9U -#define GPIOB_MMC_CS 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_SPI2_SCK 13U -#define GPIOB_SPI2_MISO 14U -#define GPIOB_SPI2_MOSI 15U - -#define GPIOC_ARD_A5 0U -#define GPIOC_ARD_A4 1U -#define GPIOC_PIN2 2U -#define GPIOC_PIN3 3U -#define GPIOC_PIN4 4U -#define GPIOC_SDIO_CD 5U -#define GPIOC_SDIO_WP 6U -#define GPIOC_ARD_D9 7U -#define GPIOC_SDIO_D0 8U -#define GPIOC_SDIO_D1 9U -#define GPIOC_SDIO_D2 10U -#define GPIOC_SDIO_D3 11U -#define GPIOC_SDIO_CK 12U -#define GPIOC_BUTTON 13U -#define GPIOC_OSC32_IN 14U -#define GPIOC_OSC32_OUT 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_SDIO_CMD 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_OSC_IN 0U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -#define GPIOI_PIN0 0U -#define GPIOI_PIN1 1U -#define GPIOI_PIN2 2U -#define GPIOI_PIN3 3U -#define GPIOI_PIN4 4U -#define GPIOI_PIN5 5U -#define GPIOI_PIN6 6U -#define GPIOI_PIN7 7U -#define GPIOI_PIN8 8U -#define GPIOI_PIN9 9U -#define GPIOI_PIN10 10U -#define GPIOI_PIN11 11U -#define GPIOI_PIN12 12U -#define GPIOI_PIN13 13U -#define GPIOI_PIN14 14U -#define GPIOI_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_AX1_IRQ PAL_LINE(GPIOA, 0U) -#define LINE_AX2_IRQ PAL_LINE(GPIOA, 1U) -#define LINE_ARD_A2 PAL_LINE(GPIOA, 4U) -#define LINE_LED PAL_LINE(GPIOA, 5U) -#define LINE_AX1_CS PAL_LINE(GPIOA, 8U) -#define LINE_AX2_CS PAL_LINE(GPIOA, 9U) -#define LINE_ARD_D2 PAL_LINE(GPIOA, 10U) -#define LINE_ARD_A3 PAL_LINE(GPIOB, 0U) -#define LINE_ARD_D5 PAL_LINE(GPIOB, 4U) -#define LINE_MMC_CS PAL_LINE(GPIOB, 10U) -#define LINE_ARD_A5 PAL_LINE(GPIOC, 0U) -#define LINE_ARD_A4 PAL_LINE(GPIOC, 1U) -#define LINE_ARD_D9 PAL_LINE(GPIOC, 7U) -#define LINE_BUTTON PAL_LINE(GPIOC, 13U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) - -/* - * GPIOA setup: - * - * PA0 - AX1_IRQ (input pullup). - * PA1 - AX2_IRQ (input pullup). - * PA2 - USART2_TX (alternate 7). - * PA3 - USART2_RX (alternate 7). - * PA4 - ARD_A2 (input pullup). - * PA5 - SPI1_SCK (alternate 5). - * PA6 - SPI1_MISO (alternate 5). - * PA7 - SPI1_MOSI (alternate 5). - * PA8 - AX1_CS (output pushpull maximum). - * PA9 - AX2_CS (output pushpull maximum). - * PA10 - ARD_D2 (input pullup). - * PA11 - CAN1_RX (alternate 9). - * PA12 - CAN1_TX (alternate 9). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (input pullup). - */ -#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_AX1_IRQ) | \ - PIN_MODE_INPUT(GPIOA_AX2_IRQ) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_INPUT(GPIOA_ARD_A2) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_OUTPUT(GPIOA_AX1_CS) | \ - PIN_MODE_OUTPUT(GPIOA_AX2_CS) | \ - PIN_MODE_INPUT(GPIOA_ARD_D2) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_CAN1_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_INPUT(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_AX1_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOA_AX2_IRQ) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_USART2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_ARD_A2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPI1_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_AX1_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_AX2_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_ARD_D2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_CAN1_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_AX1_IRQ) | \ - PIN_OSPEED_HIGH(GPIOA_AX2_IRQ) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_TX) | \ - PIN_OSPEED_HIGH(GPIOA_USART2_RX) | \ - PIN_OSPEED_HIGH(GPIOA_ARD_A2) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_SCK) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MISO) | \ - PIN_OSPEED_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_OSPEED_HIGH(GPIOA_AX1_CS) | \ - PIN_OSPEED_HIGH(GPIOA_AX2_CS) | \ - PIN_OSPEED_HIGH(GPIOA_ARD_D2) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_RX) | \ - PIN_OSPEED_HIGH(GPIOA_CAN1_TX) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLUP(GPIOA_AX1_IRQ) | \ - PIN_PUPDR_PULLUP(GPIOA_AX2_IRQ) | \ - PIN_PUPDR_FLOATING(GPIOA_USART2_TX) | \ - PIN_PUPDR_FLOATING(GPIOA_USART2_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_ARD_A2) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_SCK) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_MISO) | \ - PIN_PUPDR_PULLUP(GPIOA_SPI1_MOSI) | \ - PIN_PUPDR_PULLUP(GPIOA_AX1_CS) | \ - PIN_PUPDR_PULLUP(GPIOA_AX2_CS) | \ - PIN_PUPDR_PULLUP(GPIOA_ARD_D2) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN1_RX) | \ - PIN_PUPDR_PULLUP(GPIOA_CAN1_TX) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_AX1_IRQ) | \ - PIN_ODR_HIGH(GPIOA_AX2_IRQ) | \ - PIN_ODR_HIGH(GPIOA_USART2_TX) | \ - PIN_ODR_HIGH(GPIOA_USART2_RX) | \ - PIN_ODR_HIGH(GPIOA_ARD_A2) | \ - PIN_ODR_HIGH(GPIOA_SPI1_SCK) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MISO) | \ - PIN_ODR_HIGH(GPIOA_SPI1_MOSI) | \ - PIN_ODR_HIGH(GPIOA_AX1_CS) | \ - PIN_ODR_HIGH(GPIOA_AX2_CS) | \ - PIN_ODR_HIGH(GPIOA_ARD_D2) | \ - PIN_ODR_HIGH(GPIOA_CAN1_RX) | \ - PIN_ODR_HIGH(GPIOA_CAN1_TX) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_AX1_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOA_AX2_IRQ, 0U) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 7U) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 7U) | \ - PIN_AFIO_AF(GPIOA_ARD_A2, 0U) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 5U) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 5U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_AX1_CS, 0U) | \ - PIN_AFIO_AF(GPIOA_AX2_CS, 0U) | \ - PIN_AFIO_AF(GPIOA_ARD_D2, 0U) | \ - PIN_AFIO_AF(GPIOA_CAN1_RX, 9U) | \ - PIN_AFIO_AF(GPIOA_CAN1_TX, 9U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) - -/* - * GPIOB setup: - * - * PB0 - ARD_A3 (input pullup). - * PB1 - PIN1 (input pullup). - * PB2 - PIN2 (input pullup). - * PB3 - SWO (alternate 0). - * PB4 - ARD_D5 (input pullup). - * PB5 - CAN2_RX (alternate 9). - * PB6 - CAN2_TX (alternate 9). - * PB7 - PIN7 (input pullup). - * PB8 - I2C1_SCL (alternate 4). - * PB9 - I2C1_SDA (alternate 4). - * PB10 - MMC_CS (output pushpull maximum). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - SPI2_SCK (alternate 5). - * PB14 - SPI2_MISO (alternate 5). - * PB15 - SPI2_MOSI (alternate 5). - */ -#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_ARD_A3) | \ - PIN_MODE_INPUT(GPIOB_PIN1) | \ - PIN_MODE_INPUT(GPIOB_PIN2) | \ - PIN_MODE_ALTERNATE(GPIOB_SWO) | \ - PIN_MODE_INPUT(GPIOB_ARD_D5) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_RX) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN2_TX) | \ - PIN_MODE_INPUT(GPIOB_PIN7) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_OUTPUT(GPIOB_MMC_CS) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_ARD_A3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SWO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_ARD_D5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CAN2_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_MMC_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_ARD_A3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_SWO) | \ - PIN_OSPEED_HIGH(GPIOB_ARD_D5) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_RX) | \ - PIN_OSPEED_HIGH(GPIOB_CAN2_TX) | \ - PIN_OSPEED_HIGH(GPIOB_PIN7) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_HIGH(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_HIGH(GPIOB_MMC_CS) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_SPI2_SCK) | \ - PIN_OSPEED_HIGH(GPIOB_SPI2_MISO) | \ - PIN_OSPEED_HIGH(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_ARD_A3) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOB_SWO) | \ - PIN_PUPDR_PULLUP(GPIOB_ARD_D5) | \ - PIN_PUPDR_PULLUP(GPIOB_CAN2_RX) | \ - PIN_PUPDR_PULLUP(GPIOB_CAN2_TX) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_PULLUP(GPIOB_MMC_CS) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI2_SCK) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI2_MISO) | \ - PIN_PUPDR_PULLUP(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_ARD_A3) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_SWO) | \ - PIN_ODR_HIGH(GPIOB_ARD_D5) | \ - PIN_ODR_HIGH(GPIOB_CAN2_RX) | \ - PIN_ODR_HIGH(GPIOB_CAN2_TX) | \ - PIN_ODR_HIGH(GPIOB_PIN7) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_MMC_CS) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \ - PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \ - PIN_ODR_HIGH(GPIOB_SPI2_MOSI)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_ARD_A3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_SWO, 0U) | \ - PIN_AFIO_AF(GPIOB_ARD_D5, 0U) | \ - PIN_AFIO_AF(GPIOB_CAN2_RX, 9U) | \ - PIN_AFIO_AF(GPIOB_CAN2_TX, 9U) | \ - PIN_AFIO_AF(GPIOB_PIN7, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_I2C1_SCL, 4U) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 4U) | \ - PIN_AFIO_AF(GPIOB_MMC_CS, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_SPI2_SCK, 5U) | \ - PIN_AFIO_AF(GPIOB_SPI2_MISO, 5U) | \ - PIN_AFIO_AF(GPIOB_SPI2_MOSI, 5U)) - -/* - * GPIOC setup: - * - * PC0 - ARD_A5 (input pullup). - * PC1 - ARD_A4 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - SDIO_CD (input pullup). - * PC6 - SDIO_WP (input pullup). - * PC7 - ARD_D9 (input pullup). - * PC8 - SDIO_D0 (alternate 12). - * PC9 - SDIO_D1 (alternate 12). - * PC10 - SDIO_D2 (alternate 12). - * PC11 - SDIO_D3 (alternate 12). - * PC12 - SDIO_CK (alternate 12). - * PC13 - BUTTON (input floating). - * PC14 - OSC32_IN (input floating). - * PC15 - OSC32_OUT (input floating). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_ARD_A5) | \ - PIN_MODE_INPUT(GPIOC_ARD_A4) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_SDIO_CD) | \ - PIN_MODE_INPUT(GPIOC_SDIO_WP) | \ - PIN_MODE_INPUT(GPIOC_ARD_D9) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D0) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D1) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D2) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D3) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_CK) | \ - PIN_MODE_INPUT(GPIOC_BUTTON) | \ - PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ - PIN_MODE_INPUT(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_ARD_A5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_ARD_A4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_CD) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_WP) | \ - PIN_OTYPE_PUSHPULL(GPIOC_ARD_D9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_D3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIO_CK) | \ - PIN_OTYPE_PUSHPULL(GPIOC_BUTTON) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_ARD_A5) | \ - PIN_OSPEED_HIGH(GPIOC_ARD_A4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_CD) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_WP) | \ - PIN_OSPEED_HIGH(GPIOC_ARD_D9) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D0) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D1) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D2) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_D3) | \ - PIN_OSPEED_HIGH(GPIOC_SDIO_CK) | \ - PIN_OSPEED_HIGH(GPIOC_BUTTON) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \ - PIN_OSPEED_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_ARD_A5) | \ - PIN_PUPDR_PULLUP(GPIOC_ARD_A4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_CD) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_WP) | \ - PIN_PUPDR_PULLUP(GPIOC_ARD_D9) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_D0) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_D1) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_D2) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_D3) | \ - PIN_PUPDR_PULLUP(GPIOC_SDIO_CK) | \ - PIN_PUPDR_FLOATING(GPIOC_BUTTON) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_ARD_A5) | \ - PIN_ODR_HIGH(GPIOC_ARD_A4) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_SDIO_CD) | \ - PIN_ODR_HIGH(GPIOC_SDIO_WP) | \ - PIN_ODR_HIGH(GPIOC_ARD_D9) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D0) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D1) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D2) | \ - PIN_ODR_HIGH(GPIOC_SDIO_D3) | \ - PIN_ODR_HIGH(GPIOC_SDIO_CK) | \ - PIN_ODR_HIGH(GPIOC_BUTTON) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_ARD_A5, 0U) | \ - PIN_AFIO_AF(GPIOC_ARD_A4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_SDIO_CD, 0U) | \ - PIN_AFIO_AF(GPIOC_SDIO_WP, 0U) | \ - PIN_AFIO_AF(GPIOC_ARD_D9, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_SDIO_D0, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D1, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D2, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_D3, 12U) | \ - PIN_AFIO_AF(GPIOC_SDIO_CK, 12U) | \ - PIN_AFIO_AF(GPIOC_BUTTON, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - SDIO_CMD (alternate 12). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOD_SDIO_CMD) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_SDIO_CMD) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_SDIO_CMD) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_SDIO_CMD) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_SDIO_CMD) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_SDIO_CMD, 12U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (input pullup). - * PF1 - PIN1 (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_PIN0) | \ - PIN_MODE_INPUT(GPIOF_PIN1) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (input pullup). - * PG1 - PIN1 (input pullup). - * PG2 - PIN2 (input pullup). - * PG3 - PIN3 (input pullup). - * PG4 - PIN4 (input pullup). - * PG5 - PIN5 (input pullup). - * PG6 - PIN6 (input pullup). - * PG7 - PIN7 (input pullup). - * PG8 - PIN8 (input pullup). - * PG9 - PIN9 (input pullup). - * PG10 - PIN10 (input pullup). - * PG11 - PIN11 (input pullup). - * PG12 - PIN12 (input pullup). - * PG13 - PIN13 (input pullup). - * PG14 - PIN14 (input pullup). - * PG15 - PIN15 (input pullup). - */ -#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ - PIN_MODE_INPUT(GPIOG_PIN1) | \ - PIN_MODE_INPUT(GPIOG_PIN2) | \ - PIN_MODE_INPUT(GPIOG_PIN3) | \ - PIN_MODE_INPUT(GPIOG_PIN4) | \ - PIN_MODE_INPUT(GPIOG_PIN5) | \ - PIN_MODE_INPUT(GPIOG_PIN6) | \ - PIN_MODE_INPUT(GPIOG_PIN7) | \ - PIN_MODE_INPUT(GPIOG_PIN8) | \ - PIN_MODE_INPUT(GPIOG_PIN9) | \ - PIN_MODE_INPUT(GPIOG_PIN10) | \ - PIN_MODE_INPUT(GPIOG_PIN11) | \ - PIN_MODE_INPUT(GPIOG_PIN12) | \ - PIN_MODE_INPUT(GPIOG_PIN13) | \ - PIN_MODE_INPUT(GPIOG_PIN14) | \ - PIN_MODE_INPUT(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (input floating). - * PH1 - OSC_OUT (input floating). - * PH2 - PIN2 (input pullup). - * PH3 - PIN3 (input pullup). - * PH4 - PIN4 (input pullup). - * PH5 - PIN5 (input pullup). - * PH6 - PIN6 (input pullup). - * PH7 - PIN7 (input pullup). - * PH8 - PIN8 (input pullup). - * PH9 - PIN9 (input pullup). - * PH10 - PIN10 (input pullup). - * PH11 - PIN11 (input pullup). - * PH12 - PIN12 (input pullup). - * PH13 - PIN13 (input pullup). - * PH14 - PIN14 (input pullup). - * PH15 - PIN15 (input pullup). - */ -#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_OSC_IN) | \ - PIN_MODE_INPUT(GPIOH_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOH_PIN2) | \ - PIN_MODE_INPUT(GPIOH_PIN3) | \ - PIN_MODE_INPUT(GPIOH_PIN4) | \ - PIN_MODE_INPUT(GPIOH_PIN5) | \ - PIN_MODE_INPUT(GPIOH_PIN6) | \ - PIN_MODE_INPUT(GPIOH_PIN7) | \ - PIN_MODE_INPUT(GPIOH_PIN8) | \ - PIN_MODE_INPUT(GPIOH_PIN9) | \ - PIN_MODE_INPUT(GPIOH_PIN10) | \ - PIN_MODE_INPUT(GPIOH_PIN11) | \ - PIN_MODE_INPUT(GPIOH_PIN12) | \ - PIN_MODE_INPUT(GPIOH_PIN13) | \ - PIN_MODE_INPUT(GPIOH_PIN14) | \ - PIN_MODE_INPUT(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) - -/* - * GPIOI setup: - * - * PI0 - PIN0 (input pullup). - * PI1 - PIN1 (input pullup). - * PI2 - PIN2 (input pullup). - * PI3 - PIN3 (input pullup). - * PI4 - PIN4 (input pullup). - * PI5 - PIN5 (input pullup). - * PI6 - PIN6 (input pullup). - * PI7 - PIN7 (input pullup). - * PI8 - PIN8 (input pullup). - * PI9 - PIN9 (input pullup). - * PI10 - PIN10 (input pullup). - * PI11 - PIN11 (input pullup). - * PI12 - PIN12 (input pullup). - * PI13 - PIN13 (input pullup). - * PI14 - PIN14 (input pullup). - * PI15 - PIN15 (input pullup). - */ -#define VAL_GPIOI_MODER (PIN_MODE_INPUT(GPIOI_PIN0) | \ - PIN_MODE_INPUT(GPIOI_PIN1) | \ - PIN_MODE_INPUT(GPIOI_PIN2) | \ - PIN_MODE_INPUT(GPIOI_PIN3) | \ - PIN_MODE_INPUT(GPIOI_PIN4) | \ - PIN_MODE_INPUT(GPIOI_PIN5) | \ - PIN_MODE_INPUT(GPIOI_PIN6) | \ - PIN_MODE_INPUT(GPIOI_PIN7) | \ - PIN_MODE_INPUT(GPIOI_PIN8) | \ - PIN_MODE_INPUT(GPIOI_PIN9) | \ - PIN_MODE_INPUT(GPIOI_PIN10) | \ - PIN_MODE_INPUT(GPIOI_PIN11) | \ - PIN_MODE_INPUT(GPIOI_PIN12) | \ - PIN_MODE_INPUT(GPIOI_PIN13) | \ - PIN_MODE_INPUT(GPIOI_PIN14) | \ - PIN_MODE_INPUT(GPIOI_PIN15)) -#define VAL_GPIOI_OTYPER (PIN_OTYPE_PUSHPULL(GPIOI_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN15)) -#define VAL_GPIOI_OSPEEDR (PIN_OSPEED_HIGH(GPIOI_PIN0) | \ - PIN_OSPEED_HIGH(GPIOI_PIN1) | \ - PIN_OSPEED_HIGH(GPIOI_PIN2) | \ - PIN_OSPEED_HIGH(GPIOI_PIN3) | \ - PIN_OSPEED_HIGH(GPIOI_PIN4) | \ - PIN_OSPEED_HIGH(GPIOI_PIN5) | \ - PIN_OSPEED_HIGH(GPIOI_PIN6) | \ - PIN_OSPEED_HIGH(GPIOI_PIN7) | \ - PIN_OSPEED_HIGH(GPIOI_PIN8) | \ - PIN_OSPEED_HIGH(GPIOI_PIN9) | \ - PIN_OSPEED_HIGH(GPIOI_PIN10) | \ - PIN_OSPEED_HIGH(GPIOI_PIN11) | \ - PIN_OSPEED_HIGH(GPIOI_PIN12) | \ - PIN_OSPEED_HIGH(GPIOI_PIN13) | \ - PIN_OSPEED_HIGH(GPIOI_PIN14) | \ - PIN_OSPEED_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_PUPDR (PIN_PUPDR_PULLUP(GPIOI_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN15)) -#define VAL_GPIOI_ODR (PIN_ODR_HIGH(GPIOI_PIN0) | \ - PIN_ODR_HIGH(GPIOI_PIN1) | \ - PIN_ODR_HIGH(GPIOI_PIN2) | \ - PIN_ODR_HIGH(GPIOI_PIN3) | \ - PIN_ODR_HIGH(GPIOI_PIN4) | \ - PIN_ODR_HIGH(GPIOI_PIN5) | \ - PIN_ODR_HIGH(GPIOI_PIN6) | \ - PIN_ODR_HIGH(GPIOI_PIN7) | \ - PIN_ODR_HIGH(GPIOI_PIN8) | \ - PIN_ODR_HIGH(GPIOI_PIN9) | \ - PIN_ODR_HIGH(GPIOI_PIN10) | \ - PIN_ODR_HIGH(GPIOI_PIN11) | \ - PIN_ODR_HIGH(GPIOI_PIN12) | \ - PIN_ODR_HIGH(GPIOI_PIN13) | \ - PIN_ODR_HIGH(GPIOI_PIN14) | \ - PIN_ODR_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_AFRL (PIN_AFIO_AF(GPIOI_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN7, 0U)) -#define VAL_GPIOI_AFRH (PIN_AFIO_AF(GPIOI_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOI_PIN15, 0U)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ST_NUCLEO64_F446RE/board.mk b/boards/ST_NUCLEO64_F446RE/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ST_NUCLEO64_F446RE/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ST_NUCLEO64_F446RE/gdboocd.cmd b/boards/ST_NUCLEO64_F446RE/gdboocd.cmd deleted file mode 100644 index ac017d4e..00000000 --- a/boards/ST_NUCLEO64_F446RE/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32f4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ST_NUCLEO64_F446RE/oocd.cfg b/boards/ST_NUCLEO64_F446RE/oocd.cfg deleted file mode 100644 index d44f8d8f..00000000 --- a/boards/ST_NUCLEO64_F446RE/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32f4x.cfg] - diff --git a/boards/ST_NUCLEO64_L452RE_P/board.c b/boards/ST_NUCLEO64_L452RE_P/board.c deleted file mode 100644 index 274c5b8c..00000000 --- a/boards/ST_NUCLEO64_L452RE_P/board.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#include "hal.h" -#include "stm32_gpio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief Type of STM32 GPIO port setup. - */ -typedef struct { - uint32_t moder; - uint32_t otyper; - uint32_t ospeedr; - uint32_t pupdr; - uint32_t odr; - uint32_t afrl; - uint32_t afrh; - uint32_t ascr; - uint32_t lockr; -} gpio_setup_t; - -/** - * @brief Type of STM32 GPIO initialization data. - */ -typedef struct { -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) - gpio_setup_t PAData; -#endif -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) - gpio_setup_t PBData; -#endif -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) - gpio_setup_t PCData; -#endif -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) - gpio_setup_t PDData; -#endif -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) - gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) - gpio_setup_t PIData; -#endif -#if STM32_HAS_GPIOJ || defined(__DOXYGEN__) - gpio_setup_t PJData; -#endif -#if STM32_HAS_GPIOK || defined(__DOXYGEN__) - gpio_setup_t PKData; -#endif -} gpio_config_t; - -/** - * @brief STM32 GPIO static initialization data. - */ -static const gpio_config_t gpio_default_config = { -#if STM32_HAS_GPIOA - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH, VAL_GPIOA_ASCR, - VAL_GPIOA_LOCKR}, -#endif -#if STM32_HAS_GPIOB - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH, VAL_GPIOB_ASCR, - VAL_GPIOB_LOCKR}, -#endif -#if STM32_HAS_GPIOC - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH, VAL_GPIOC_ASCR, - VAL_GPIOC_LOCKR}, -#endif -#if STM32_HAS_GPIOD - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH, VAL_GPIOD_ASCR, - VAL_GPIOD_LOCKR}, -#endif -#if STM32_HAS_GPIOE - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH, VAL_GPIOE_ASCR, - VAL_GPIOE_LOCKR}, -#endif -#if STM32_HAS_GPIOF - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH, VAL_GPIOF_ASCR, - VAL_GPIOF_LOCKR}, -#endif -#if STM32_HAS_GPIOG - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH, VAL_GPIOG_ASCR, - VAL_GPIOG_LOCKR}, -#endif -#if STM32_HAS_GPIOH - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH, VAL_GPIOH_ASCR, - VAL_GPIOH_LOCKR}, -#endif -#if STM32_HAS_GPIOI - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH, VAL_GPIOI_ASCR, - VAL_GPIOI_LOCKR}, -#endif -#if STM32_HAS_GPIOJ - {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, - VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH, VAL_GPIOJ_ASCR, - VAL_GPIOJ_LOCKR}, -#endif -#if STM32_HAS_GPIOK - {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, - VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH, VAL_GPIOK_ASCR, - VAL_GPIOK_LOCKR} -#endif -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->ASCR = config->ascr; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; - gpiop->LOCKR = config->lockr; -} - -static void stm32_gpio_init(void) { - - /* Enabling GPIO-related clocks, the mask comes from the - registry header file.*/ - rccResetAHB2(STM32_GPIO_EN_MASK); - rccEnableAHB2(STM32_GPIO_EN_MASK, true); - - /* Initializing all the defined GPIO ports.*/ -#if STM32_HAS_GPIOA - gpio_init(GPIOA, &gpio_default_config.PAData); -#endif -#if STM32_HAS_GPIOB - gpio_init(GPIOB, &gpio_default_config.PBData); -#endif -#if STM32_HAS_GPIOC - gpio_init(GPIOC, &gpio_default_config.PCData); -#endif -#if STM32_HAS_GPIOD - gpio_init(GPIOD, &gpio_default_config.PDData); -#endif -#if STM32_HAS_GPIOE - gpio_init(GPIOE, &gpio_default_config.PEData); -#endif -#if STM32_HAS_GPIOF - gpio_init(GPIOF, &gpio_default_config.PFData); -#endif -#if STM32_HAS_GPIOG - gpio_init(GPIOG, &gpio_default_config.PGData); -#endif -#if STM32_HAS_GPIOH - gpio_init(GPIOH, &gpio_default_config.PHData); -#endif -#if STM32_HAS_GPIOI - gpio_init(GPIOI, &gpio_default_config.PIData); -#endif -#if STM32_HAS_GPIOJ - gpio_init(GPIOJ, &gpio_default_config.PJData); -#endif -#if STM32_HAS_GPIOK - gpio_init(GPIOK, &gpio_default_config.PKData); -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Early initialization code. - * @details GPIO ports and system clocks are initialized before everything - * else. - */ -void __early_init(void) { - - stm32_gpio_init(); - stm32_clock_init(); - rccEnableCRC(true); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief SDC card write protection detection. - */ -bool sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return true; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return false; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { - -} diff --git a/boards/ST_NUCLEO64_L452RE_P/board.h b/boards/ST_NUCLEO64_L452RE_P/board.h deleted file mode 100644 index 088bd258..00000000 --- a/boards/ST_NUCLEO64_L452RE_P/board.h +++ /dev/null @@ -1,1555 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * This file has been automatically generated using ChibiStudio board - * generator plugin. Do not edit manually. - */ - -#ifndef BOARD_H -#define BOARD_H - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * Setup for STMicroelectronics STM32 Nucleo64-L452RE-P board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_NUCLEO64_L452RE_P -#define BOARD_NAME "STMicroelectronics STM32 Nucleo64-L452RE-P" - -/* - * Board oscillators-related settings. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 32768U -#endif - -#define STM32_LSEDRV (3U << 3U) - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 8000000U -#endif - -#define STM32_HSE_BYPASS - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300U - -/* - * MCU type as defined in the ST header. - */ -#define STM32L452xx - -/* - * IO pins assignments. - */ -#define GPIOA_PIN0 0U -#define GPIOA_ARD_A0 0U -#define GPIOA_ADC1_IN5 0U -#define GPIOA_PIN1 1U -#define GPIOA_ARD_A1 1U -#define GPIOA_ADC1_IN6 1U -#define GPIOA_PIN2 2U -#define GPIOA_STLINK_TX 2U -#define GPIOA_LPUART1_TX 2U -#define GPIOA_PIN3 3U -#define GPIOA_STLINK_RX 3U -#define GPIOA_LPUART1_RX 3U -#define GPIOA_PIN4 4U -#define GPIOA_SMPS_EN 4U -#define GPIOA_PIN5 5U -#define GPIOA_SMPS_V1 5U -#define GPIOA_PIN6 6U -#define GPIOA_SMPS_PG 6U -#define GPIOA_PIN7 7U -#define GPIOA_SMPS_SW 7U -#define GPIOA_PIN8 8U -#define GPIOA_ARD_D9 8U -#define GPIOA_TIM1_CH1 8U -#define GPIOA_PIN9 9U -#define GPIOA_ARD_D1_TX 9U -#define GPIOA_UART1_TX 9U -#define GPIOA_PIN10 10U -#define GPIOA_ARD_D0_RX 10U -#define GPIOA_UART1_RX 10U -#define GPIOA_PIN11 11U -#define GPIOA_ARD_D10 11U -#define GPIOA_TIM1_CH4 11U -#define GPIOA_PIN12 12U -#define GPIOA_ARD_D2 12U -#define GPIOA_PIN13 13U -#define GPIOA_SWDIO 13U -#define GPIOA_PIN14 14U -#define GPIOA_SWCLK 14U -#define GPIOA_PIN15 15U -#define GPIOA_ARD_D5 15U -#define GPIOA_TIM2_CH1 15U - -#define GPIOB_PIN0 0U -#define GPIOB_PIN1 1U -#define GPIOB_PIN2 2U -#define GPIOB_PIN3 3U -#define GPIOB_ARD_D3 3U -#define GPIOB_TIM2_CH2 3U -#define GPIOB_PIN4 4U -#define GPIOB_PIN5 5U -#define GPIOB_ARD_D4 5U -#define GPIOB_PIN6 6U -#define GPIOB_ARD_D8 6U -#define GPIOB_PIN7 7U -#define GPIOB_ARD_D14 7U -#define GPIOB_I2C1_SDA 7U -#define GPIOB_PIN8 8U -#define GPIOB_ARD_D15 8U -#define GPIOB_I2C1_SCL 8U -#define GPIOB_PIN9 9U -#define GPIOB_PIN10 10U -#define GPIOB_ARD_D6 10U -#define GPIOB_TIM2_CH3 10U -#define GPIOB_PIN11 11U -#define GPIOB_PIN12 12U -#define GPIOB_PIN13 13U -#define GPIOB_ARD_D13 13U -#define GPIOB_SPI2_SCK 13U -#define GPIOB_LED 13U -#define GPIOB_PIN14 14U -#define GPIOB_ARD_D12 14U -#define GPIOB_SPI2_MISO 14U -#define GPIOB_PIN15 15U -#define GPIOB_ARD_D11 15U -#define GPIOB_SPI2_MOSI 15U -#define GPIOB_TIM15_CH2 15U - -#define GPIOC_PIN0 0U -#define GPIOC_ARD_A5 0U -#define GPIOC_ADC1_IN1 0U -#define GPIOC_I2C3_SCL 0U -#define GPIOC_PIN1 1U -#define GPIOC_ARD_A4 1U -#define GPIOC_ADC1_IN2 1U -#define GPIOC_I2C3_SDA 1U -#define GPIOC_PIN2 2U -#define GPIOC_ARD_A3 2U -#define GPIOC_ADC1_IN3 2U -#define GPIOC_PIN3 3U -#define GPIOC_ARD_A2 3U -#define GPIOC_ADC1_IN4 3U -#define GPIOC_PIN4 4U -#define GPIOC_PIN5 5U -#define GPIOC_PIN6 6U -#define GPIOC_PIN7 7U -#define GPIOC_ARD_D7 7U -#define GPIOC_PIN8 8U -#define GPIOC_PIN9 9U -#define GPIOC_PIN10 10U -#define GPIOC_PIN11 11U -#define GPIOC_PIN12 12U -#define GPIOC_PIN13 13U -#define GPIOC_BUTTON 13U -#define GPIOC_PIN14 14U -#define GPIOC_OSC32_IN 14U -#define GPIOC_PIN15 15U -#define GPIOC_OSC32_OUT 15U - -#define GPIOD_PIN0 0U -#define GPIOD_PIN1 1U -#define GPIOD_PIN2 2U -#define GPIOD_PIN3 3U -#define GPIOD_PIN4 4U -#define GPIOD_PIN5 5U -#define GPIOD_PIN6 6U -#define GPIOD_PIN7 7U -#define GPIOD_PIN8 8U -#define GPIOD_PIN9 9U -#define GPIOD_PIN10 10U -#define GPIOD_PIN11 11U -#define GPIOD_PIN12 12U -#define GPIOD_PIN13 13U -#define GPIOD_PIN14 14U -#define GPIOD_PIN15 15U - -#define GPIOE_PIN0 0U -#define GPIOE_PIN1 1U -#define GPIOE_PIN2 2U -#define GPIOE_PIN3 3U -#define GPIOE_PIN4 4U -#define GPIOE_PIN5 5U -#define GPIOE_PIN6 6U -#define GPIOE_PIN7 7U -#define GPIOE_PIN8 8U -#define GPIOE_PIN9 9U -#define GPIOE_PIN10 10U -#define GPIOE_PIN11 11U -#define GPIOE_PIN12 12U -#define GPIOE_PIN13 13U -#define GPIOE_PIN14 14U -#define GPIOE_PIN15 15U - -#define GPIOF_PIN0 0U -#define GPIOF_PIN1 1U -#define GPIOF_PIN2 2U -#define GPIOF_PIN3 3U -#define GPIOF_PIN4 4U -#define GPIOF_PIN5 5U -#define GPIOF_PIN6 6U -#define GPIOF_PIN7 7U -#define GPIOF_PIN8 8U -#define GPIOF_PIN9 9U -#define GPIOF_PIN10 10U -#define GPIOF_PIN11 11U -#define GPIOF_PIN12 12U -#define GPIOF_PIN13 13U -#define GPIOF_PIN14 14U -#define GPIOF_PIN15 15U - -#define GPIOG_PIN0 0U -#define GPIOG_PIN1 1U -#define GPIOG_PIN2 2U -#define GPIOG_PIN3 3U -#define GPIOG_PIN4 4U -#define GPIOG_PIN5 5U -#define GPIOG_PIN6 6U -#define GPIOG_PIN7 7U -#define GPIOG_PIN8 8U -#define GPIOG_PIN9 9U -#define GPIOG_PIN10 10U -#define GPIOG_PIN11 11U -#define GPIOG_PIN12 12U -#define GPIOG_PIN13 13U -#define GPIOG_PIN14 14U -#define GPIOG_PIN15 15U - -#define GPIOH_PIN0 0U -#define GPIOH_OSC_IN 0U -#define GPIOH_PIN1 1U -#define GPIOH_OSC_OUT 1U -#define GPIOH_PIN2 2U -#define GPIOH_PIN3 3U -#define GPIOH_PIN4 4U -#define GPIOH_PIN5 5U -#define GPIOH_PIN6 6U -#define GPIOH_PIN7 7U -#define GPIOH_PIN8 8U -#define GPIOH_PIN9 9U -#define GPIOH_PIN10 10U -#define GPIOH_PIN11 11U -#define GPIOH_PIN12 12U -#define GPIOH_PIN13 13U -#define GPIOH_PIN14 14U -#define GPIOH_PIN15 15U - -/* - * IO lines assignments. - */ -#define LINE_ARD_A0 PAL_LINE(GPIOA, 0U) -#define LINE_ADC1_IN5 PAL_LINE(GPIOA, 0U) -#define LINE_ARD_A1 PAL_LINE(GPIOA, 1U) -#define LINE_ADC1_IN6 PAL_LINE(GPIOA, 1U) -#define LINE_STLINK_TX PAL_LINE(GPIOA, 2U) -#define LINE_STLINK_RX PAL_LINE(GPIOA, 3U) -#define LINE_SMPS_EN PAL_LINE(GPIOA, 4U) -#define LINE_SMPS_V1 PAL_LINE(GPIOA, 5U) -#define LINE_SMPS_PG PAL_LINE(GPIOA, 6U) -#define LINE_SMPS_SW PAL_LINE(GPIOA, 7U) -#define LINE_ARD_D9 PAL_LINE(GPIOA, 8U) -#define LINE_ARD_D1_TX PAL_LINE(GPIOA, 9U) -#define LINE_ARD_D0_RX PAL_LINE(GPIOA, 10U) -#define LINE_ARD_D10 PAL_LINE(GPIOA, 11U) -#define LINE_ARD_D2 PAL_LINE(GPIOA, 12U) -#define LINE_ARD_D5 PAL_LINE(GPIOA, 15U) -#define LINE_ARD_D3 PAL_LINE(GPIOB, 3U) -#define LINE_ARD_D4 PAL_LINE(GPIOB, 5U) -#define LINE_ARD_D8 PAL_LINE(GPIOB, 6U) -#define LINE_ARD_D14 PAL_LINE(GPIOB, 7U) -#define LINE_ARD_D15 PAL_LINE(GPIOB, 8U) -#define LINE_ARD_D6 PAL_LINE(GPIOB, 10U) -#define LINE_ARD_D13 PAL_LINE(GPIOB, 13U) -#define LINE_LED PAL_LINE(GPIOB, 13U) -#define LINE_ARD_D12 PAL_LINE(GPIOB, 14U) -#define LINE_ARD_D11 PAL_LINE(GPIOB, 15U) -#define LINE_ARD_A5 PAL_LINE(GPIOC, 0U) -#define LINE_ADC1_IN1 PAL_LINE(GPIOC, 0U) -#define LINE_ARD_A4 PAL_LINE(GPIOC, 1U) -#define LINE_ADC1_IN2 PAL_LINE(GPIOC, 1U) -#define LINE_ARD_A3 PAL_LINE(GPIOC, 2U) -#define LINE_ADC1_IN3 PAL_LINE(GPIOC, 2U) -#define LINE_ARD_A2 PAL_LINE(GPIOC, 3U) -#define LINE_ADC1_IN4 PAL_LINE(GPIOC, 3U) -#define LINE_ARD_D7 PAL_LINE(GPIOC, 7U) -#define LINE_BUTTON PAL_LINE(GPIOC, 13U) -#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U) -#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U) -#define LINE_OSC_IN PAL_LINE(GPIOH, 0U) -#define LINE_OSC_OUT PAL_LINE(GPIOH, 1U) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) -#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) -#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) -#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) -#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) -#define PIN_ASCR_DISABLED(n) (0U << (n)) -#define PIN_ASCR_ENABLED(n) (1U << (n)) -#define PIN_LOCKR_DISABLED(n) (0U << (n)) -#define PIN_LOCKR_ENABLED(n) (1U << (n)) - -/* - * GPIOA setup: - * - * PA0 - PIN0 (analog). - * PA1 - PIN1 (analog). - * PA2 - PIN2 STLINK_TX (alternate 8). - * PA3 - PIN3 STLINK_RX (alternate 8). - * PA4 - PIN4 (analog). - * PA5 - PIN5 (analog). - * PA6 - PIN6 (analog). - * PA7 - PIN7 (analog). - * PA8 - PIN8 (analog). - * PA9 - PIN9 (analog). - * PA10 - PIN10 (analog). - * PA11 - PIN11 (analog). - * PA12 - PIN12 (analog). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (analog). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(GPIOA_PIN0) | \ - PIN_MODE_ANALOG(GPIOA_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOA_PIN2) | \ - PIN_MODE_ALTERNATE(GPIOA_PIN3) | \ - PIN_MODE_ANALOG(GPIOA_PIN4) | \ - PIN_MODE_ANALOG(GPIOA_PIN5) | \ - PIN_MODE_ANALOG(GPIOA_PIN6) | \ - PIN_MODE_ANALOG(GPIOA_PIN7) | \ - PIN_MODE_ANALOG(GPIOA_PIN8) | \ - PIN_MODE_ANALOG(GPIOA_PIN9) | \ - PIN_MODE_ANALOG(GPIOA_PIN10) | \ - PIN_MODE_ANALOG(GPIOA_PIN11) | \ - PIN_MODE_ANALOG(GPIOA_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ANALOG(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_HIGH(GPIOA_PIN0) | \ - PIN_OSPEED_HIGH(GPIOA_PIN1) | \ - PIN_OSPEED_MEDIUM(GPIOA_PIN2) | \ - PIN_OSPEED_MEDIUM(GPIOA_PIN3) | \ - PIN_OSPEED_HIGH(GPIOA_PIN4) | \ - PIN_OSPEED_HIGH(GPIOA_PIN5) | \ - PIN_OSPEED_HIGH(GPIOA_PIN6) | \ - PIN_OSPEED_HIGH(GPIOA_PIN7) | \ - PIN_OSPEED_HIGH(GPIOA_PIN8) | \ - PIN_OSPEED_HIGH(GPIOA_PIN9) | \ - PIN_OSPEED_HIGH(GPIOA_PIN10) | \ - PIN_OSPEED_HIGH(GPIOA_PIN11) | \ - PIN_OSPEED_HIGH(GPIOA_PIN12) | \ - PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ - PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ - PIN_OSPEED_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_FLOATING(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_PIN7) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_HIGH(GPIOA_PIN9) | \ - PIN_ODR_HIGH(GPIOA_PIN10) | \ - PIN_ODR_HIGH(GPIOA_PIN11) | \ - PIN_ODR_HIGH(GPIOA_PIN12) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN2, 8U) | \ - PIN_AFIO_AF(GPIOA_PIN3, 8U) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN7, 0U)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0U)) -#define VAL_GPIOA_ASCR (PIN_ASCR_DISABLED(GPIOA_PIN0) | \ - PIN_ASCR_DISABLED(GPIOA_PIN1) | \ - PIN_ASCR_DISABLED(GPIOA_PIN2) | \ - PIN_ASCR_DISABLED(GPIOA_PIN3) | \ - PIN_ASCR_DISABLED(GPIOA_PIN4) | \ - PIN_ASCR_DISABLED(GPIOA_PIN5) | \ - PIN_ASCR_DISABLED(GPIOA_PIN6) | \ - PIN_ASCR_DISABLED(GPIOA_PIN7) | \ - PIN_ASCR_DISABLED(GPIOA_PIN8) | \ - PIN_ASCR_DISABLED(GPIOA_PIN9) | \ - PIN_ASCR_DISABLED(GPIOA_PIN10) | \ - PIN_ASCR_DISABLED(GPIOA_PIN11) | \ - PIN_ASCR_DISABLED(GPIOA_PIN12) | \ - PIN_ASCR_DISABLED(GPIOA_SWDIO) | \ - PIN_ASCR_DISABLED(GPIOA_SWCLK) | \ - PIN_ASCR_DISABLED(GPIOA_PIN15)) -#define VAL_GPIOA_LOCKR (PIN_LOCKR_DISABLED(GPIOA_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOA_SWDIO) | \ - PIN_LOCKR_DISABLED(GPIOA_SWCLK) | \ - PIN_LOCKR_DISABLED(GPIOA_PIN15)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (analog). - * PB1 - PIN1 (analog). - * PB2 - PIN2 (analog). - * PB3 - PIN3 (analog). - * PB4 - PIN4 (analog). - * PB5 - PIN5 (analog). - * PB6 - PIN6 (analog). - * PB7 - PIN7 (analog). - * PB8 - PIN8 (alternate 9). - * PB9 - PIN9 (alternate 9). - * PB10 - PIN10 (analog). - * PB11 - PIN11 (analog). - * PB12 - PIN12 (analog). - * PB13 - PIN13 LED (output pushpull maximum). - * PB14 - PIN14 (analog). - * PB15 - PIN15 (analog). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ANALOG(GPIOB_PIN0) | \ - PIN_MODE_ANALOG(GPIOB_PIN1) | \ - PIN_MODE_ANALOG(GPIOB_PIN2) | \ - PIN_MODE_ANALOG(GPIOB_PIN3) | \ - PIN_MODE_ANALOG(GPIOB_PIN4) | \ - PIN_MODE_ANALOG(GPIOB_PIN5) | \ - PIN_MODE_ANALOG(GPIOB_PIN6) | \ - PIN_MODE_ANALOG(GPIOB_PIN7) | \ - PIN_MODE_ALTERNATE(GPIOB_PIN8) | \ - PIN_MODE_ALTERNATE(GPIOB_PIN9) | \ - PIN_MODE_ANALOG(GPIOB_PIN10) | \ - PIN_MODE_ANALOG(GPIOB_PIN11) | \ - PIN_MODE_ANALOG(GPIOB_PIN12) | \ - PIN_MODE_OUTPUT(GPIOB_PIN13) | \ - PIN_MODE_ANALOG(GPIOB_PIN14) | \ - PIN_MODE_ANALOG(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_HIGH(GPIOB_PIN0) | \ - PIN_OSPEED_HIGH(GPIOB_PIN1) | \ - PIN_OSPEED_HIGH(GPIOB_PIN2) | \ - PIN_OSPEED_HIGH(GPIOB_PIN3) | \ - PIN_OSPEED_HIGH(GPIOB_PIN4) | \ - PIN_OSPEED_HIGH(GPIOB_PIN5) | \ - PIN_OSPEED_HIGH(GPIOB_PIN6) | \ - PIN_OSPEED_HIGH(GPIOB_PIN7) | \ - PIN_OSPEED_HIGH(GPIOB_PIN8) | \ - PIN_OSPEED_HIGH(GPIOB_PIN9) | \ - PIN_OSPEED_HIGH(GPIOB_PIN10) | \ - PIN_OSPEED_HIGH(GPIOB_PIN11) | \ - PIN_OSPEED_HIGH(GPIOB_PIN12) | \ - PIN_OSPEED_HIGH(GPIOB_PIN13) | \ - PIN_OSPEED_HIGH(GPIOB_PIN14) | \ - PIN_OSPEED_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_PIN6) | \ - PIN_ODR_HIGH(GPIOB_PIN7) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_LOW(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN7, 0U)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 9U) | \ - PIN_AFIO_AF(GPIOB_PIN9, 9U) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0U)) -#define VAL_GPIOB_ASCR (PIN_ASCR_DISABLED(GPIOB_PIN0) | \ - PIN_ASCR_DISABLED(GPIOB_PIN1) | \ - PIN_ASCR_DISABLED(GPIOB_PIN2) | \ - PIN_ASCR_DISABLED(GPIOB_PIN3) | \ - PIN_ASCR_DISABLED(GPIOB_PIN4) | \ - PIN_ASCR_DISABLED(GPIOB_PIN5) | \ - PIN_ASCR_DISABLED(GPIOB_PIN6) | \ - PIN_ASCR_DISABLED(GPIOB_PIN7) | \ - PIN_ASCR_DISABLED(GPIOB_PIN8) | \ - PIN_ASCR_DISABLED(GPIOB_PIN9) | \ - PIN_ASCR_DISABLED(GPIOB_PIN10) | \ - PIN_ASCR_DISABLED(GPIOB_PIN11) | \ - PIN_ASCR_DISABLED(GPIOB_PIN12) | \ - PIN_ASCR_DISABLED(GPIOB_PIN13) | \ - PIN_ASCR_DISABLED(GPIOB_PIN14) | \ - PIN_ASCR_DISABLED(GPIOB_PIN15)) -#define VAL_GPIOB_LOCKR (PIN_LOCKR_DISABLED(GPIOB_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOB_PIN15)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (analog). - * PC1 - PIN1 (analog). - * PC2 - PIN2 (analog). - * PC3 - PIN3 (analog). - * PC4 - PIN4 (analog). - * PC5 - PIN5 (analog). - * PC6 - PIN6 (analog). - * PC7 - PIN7 (analog). - * PC8 - PIN8 (analog). - * PC9 - PIN9 (analog). - * PC10 - PIN10 (analog). - * PC11 - PIN11 (analog). - * PC12 - PIN12 (analog). - * PC13 - PIN13 BUTTON (input floating). - * PC14 - PIN14 (analog). - * PC15 - PIN15 (analog). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_PIN0) | \ - PIN_MODE_ANALOG(GPIOC_PIN1) | \ - PIN_MODE_ANALOG(GPIOC_PIN2) | \ - PIN_MODE_ANALOG(GPIOC_PIN3) | \ - PIN_MODE_ANALOG(GPIOC_PIN4) | \ - PIN_MODE_ANALOG(GPIOC_PIN5) | \ - PIN_MODE_ANALOG(GPIOC_PIN6) | \ - PIN_MODE_ANALOG(GPIOC_PIN7) | \ - PIN_MODE_ANALOG(GPIOC_PIN8) | \ - PIN_MODE_ANALOG(GPIOC_PIN9) | \ - PIN_MODE_ANALOG(GPIOC_PIN10) | \ - PIN_MODE_ANALOG(GPIOC_PIN11) | \ - PIN_MODE_ANALOG(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_ANALOG(GPIOC_PIN14) | \ - PIN_MODE_ANALOG(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ - PIN_OSPEED_HIGH(GPIOC_PIN1) | \ - PIN_OSPEED_HIGH(GPIOC_PIN2) | \ - PIN_OSPEED_HIGH(GPIOC_PIN3) | \ - PIN_OSPEED_HIGH(GPIOC_PIN4) | \ - PIN_OSPEED_HIGH(GPIOC_PIN5) | \ - PIN_OSPEED_HIGH(GPIOC_PIN6) | \ - PIN_OSPEED_HIGH(GPIOC_PIN7) | \ - PIN_OSPEED_HIGH(GPIOC_PIN8) | \ - PIN_OSPEED_HIGH(GPIOC_PIN9) | \ - PIN_OSPEED_HIGH(GPIOC_PIN10) | \ - PIN_OSPEED_HIGH(GPIOC_PIN11) | \ - PIN_OSPEED_HIGH(GPIOC_PIN12) | \ - PIN_OSPEED_HIGH(GPIOC_PIN13) | \ - PIN_OSPEED_HIGH(GPIOC_PIN14) | \ - PIN_OSPEED_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0U)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0U)) -#define VAL_GPIOC_ASCR (PIN_ASCR_DISABLED(GPIOC_PIN0) | \ - PIN_ASCR_DISABLED(GPIOC_PIN1) | \ - PIN_ASCR_DISABLED(GPIOC_PIN2) | \ - PIN_ASCR_DISABLED(GPIOC_PIN3) | \ - PIN_ASCR_DISABLED(GPIOC_PIN4) | \ - PIN_ASCR_DISABLED(GPIOC_PIN5) | \ - PIN_ASCR_DISABLED(GPIOC_PIN6) | \ - PIN_ASCR_DISABLED(GPIOC_PIN7) | \ - PIN_ASCR_DISABLED(GPIOC_PIN8) | \ - PIN_ASCR_DISABLED(GPIOC_PIN9) | \ - PIN_ASCR_DISABLED(GPIOC_PIN10) | \ - PIN_ASCR_DISABLED(GPIOC_PIN11) | \ - PIN_ASCR_DISABLED(GPIOC_PIN12) | \ - PIN_ASCR_DISABLED(GPIOC_PIN13) | \ - PIN_ASCR_DISABLED(GPIOC_PIN14) | \ - PIN_ASCR_DISABLED(GPIOC_PIN15)) -#define VAL_GPIOC_LOCKR (PIN_LOCKR_DISABLED(GPIOC_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOC_PIN15)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (analog). - * PD1 - PIN1 (analog). - * PD2 - PIN2 (analog). - * PD3 - PIN3 (analog). - * PD4 - PIN4 (analog). - * PD5 - PIN5 (analog). - * PD6 - PIN6 (analog). - * PD7 - PIN7 (analog). - * PD8 - PIN8 (analog). - * PD9 - PIN9 (analog). - * PD10 - PIN10 (analog). - * PD11 - PIN11 (analog). - * PD12 - PIN12 (analog). - * PD13 - PIN13 (analog). - * PD14 - PIN14 (analog). - * PD15 - PIN15 (analog). - */ -#define VAL_GPIOD_MODER (PIN_MODE_ANALOG(GPIOD_PIN0) | \ - PIN_MODE_ANALOG(GPIOD_PIN1) | \ - PIN_MODE_ANALOG(GPIOD_PIN2) | \ - PIN_MODE_ANALOG(GPIOD_PIN3) | \ - PIN_MODE_ANALOG(GPIOD_PIN4) | \ - PIN_MODE_ANALOG(GPIOD_PIN5) | \ - PIN_MODE_ANALOG(GPIOD_PIN6) | \ - PIN_MODE_ANALOG(GPIOD_PIN7) | \ - PIN_MODE_ANALOG(GPIOD_PIN8) | \ - PIN_MODE_ANALOG(GPIOD_PIN9) | \ - PIN_MODE_ANALOG(GPIOD_PIN10) | \ - PIN_MODE_ANALOG(GPIOD_PIN11) | \ - PIN_MODE_ANALOG(GPIOD_PIN12) | \ - PIN_MODE_ANALOG(GPIOD_PIN13) | \ - PIN_MODE_ANALOG(GPIOD_PIN14) | \ - PIN_MODE_ANALOG(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ - PIN_OSPEED_HIGH(GPIOD_PIN1) | \ - PIN_OSPEED_HIGH(GPIOD_PIN2) | \ - PIN_OSPEED_HIGH(GPIOD_PIN3) | \ - PIN_OSPEED_HIGH(GPIOD_PIN4) | \ - PIN_OSPEED_HIGH(GPIOD_PIN5) | \ - PIN_OSPEED_HIGH(GPIOD_PIN6) | \ - PIN_OSPEED_HIGH(GPIOD_PIN7) | \ - PIN_OSPEED_HIGH(GPIOD_PIN8) | \ - PIN_OSPEED_HIGH(GPIOD_PIN9) | \ - PIN_OSPEED_HIGH(GPIOD_PIN10) | \ - PIN_OSPEED_HIGH(GPIOD_PIN11) | \ - PIN_OSPEED_HIGH(GPIOD_PIN12) | \ - PIN_OSPEED_HIGH(GPIOD_PIN13) | \ - PIN_OSPEED_HIGH(GPIOD_PIN14) | \ - PIN_OSPEED_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_FLOATING(GPIOD_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0U)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0U)) -#define VAL_GPIOD_ASCR (PIN_ASCR_DISABLED(GPIOD_PIN0) | \ - PIN_ASCR_DISABLED(GPIOD_PIN1) | \ - PIN_ASCR_DISABLED(GPIOD_PIN2) | \ - PIN_ASCR_DISABLED(GPIOD_PIN3) | \ - PIN_ASCR_DISABLED(GPIOD_PIN4) | \ - PIN_ASCR_DISABLED(GPIOD_PIN5) | \ - PIN_ASCR_DISABLED(GPIOD_PIN6) | \ - PIN_ASCR_DISABLED(GPIOD_PIN7) | \ - PIN_ASCR_DISABLED(GPIOD_PIN8) | \ - PIN_ASCR_DISABLED(GPIOD_PIN9) | \ - PIN_ASCR_DISABLED(GPIOD_PIN10) | \ - PIN_ASCR_DISABLED(GPIOD_PIN11) | \ - PIN_ASCR_DISABLED(GPIOD_PIN12) | \ - PIN_ASCR_DISABLED(GPIOD_PIN13) | \ - PIN_ASCR_DISABLED(GPIOD_PIN14) | \ - PIN_ASCR_DISABLED(GPIOD_PIN15)) -#define VAL_GPIOD_LOCKR (PIN_LOCKR_DISABLED(GPIOD_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOD_PIN15)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (analog). - * PE1 - PIN1 (analog). - * PE2 - PIN2 (analog). - * PE3 - PIN3 (analog). - * PE4 - PIN4 (analog). - * PE5 - PIN5 (analog). - * PE6 - PIN6 (analog). - * PE7 - PIN7 (analog). - * PE8 - PIN8 (analog). - * PE9 - PIN9 (analog). - * PE10 - PIN10 (analog). - * PE11 - PIN11 (analog). - * PE12 - PIN12 (analog). - * PE13 - PIN13 (analog). - * PE14 - PIN14 (analog). - * PE15 - PIN15 (analog). - */ -#define VAL_GPIOE_MODER (PIN_MODE_ANALOG(GPIOE_PIN0) | \ - PIN_MODE_ANALOG(GPIOE_PIN1) | \ - PIN_MODE_ANALOG(GPIOE_PIN2) | \ - PIN_MODE_ANALOG(GPIOE_PIN3) | \ - PIN_MODE_ANALOG(GPIOE_PIN4) | \ - PIN_MODE_ANALOG(GPIOE_PIN5) | \ - PIN_MODE_ANALOG(GPIOE_PIN6) | \ - PIN_MODE_ANALOG(GPIOE_PIN7) | \ - PIN_MODE_ANALOG(GPIOE_PIN8) | \ - PIN_MODE_ANALOG(GPIOE_PIN9) | \ - PIN_MODE_ANALOG(GPIOE_PIN10) | \ - PIN_MODE_ANALOG(GPIOE_PIN11) | \ - PIN_MODE_ANALOG(GPIOE_PIN12) | \ - PIN_MODE_ANALOG(GPIOE_PIN13) | \ - PIN_MODE_ANALOG(GPIOE_PIN14) | \ - PIN_MODE_ANALOG(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ - PIN_OSPEED_HIGH(GPIOE_PIN1) | \ - PIN_OSPEED_HIGH(GPIOE_PIN2) | \ - PIN_OSPEED_HIGH(GPIOE_PIN3) | \ - PIN_OSPEED_HIGH(GPIOE_PIN4) | \ - PIN_OSPEED_HIGH(GPIOE_PIN5) | \ - PIN_OSPEED_HIGH(GPIOE_PIN6) | \ - PIN_OSPEED_HIGH(GPIOE_PIN7) | \ - PIN_OSPEED_HIGH(GPIOE_PIN8) | \ - PIN_OSPEED_HIGH(GPIOE_PIN9) | \ - PIN_OSPEED_HIGH(GPIOE_PIN10) | \ - PIN_OSPEED_HIGH(GPIOE_PIN11) | \ - PIN_OSPEED_HIGH(GPIOE_PIN12) | \ - PIN_OSPEED_HIGH(GPIOE_PIN13) | \ - PIN_OSPEED_HIGH(GPIOE_PIN14) | \ - PIN_OSPEED_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0U)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0U)) -#define VAL_GPIOE_ASCR (PIN_ASCR_DISABLED(GPIOE_PIN0) | \ - PIN_ASCR_DISABLED(GPIOE_PIN1) | \ - PIN_ASCR_DISABLED(GPIOE_PIN2) | \ - PIN_ASCR_DISABLED(GPIOE_PIN3) | \ - PIN_ASCR_DISABLED(GPIOE_PIN4) | \ - PIN_ASCR_DISABLED(GPIOE_PIN5) | \ - PIN_ASCR_DISABLED(GPIOE_PIN6) | \ - PIN_ASCR_DISABLED(GPIOE_PIN7) | \ - PIN_ASCR_DISABLED(GPIOE_PIN8) | \ - PIN_ASCR_DISABLED(GPIOE_PIN9) | \ - PIN_ASCR_DISABLED(GPIOE_PIN10) | \ - PIN_ASCR_DISABLED(GPIOE_PIN11) | \ - PIN_ASCR_DISABLED(GPIOE_PIN12) | \ - PIN_ASCR_DISABLED(GPIOE_PIN13) | \ - PIN_ASCR_DISABLED(GPIOE_PIN14) | \ - PIN_ASCR_DISABLED(GPIOE_PIN15)) -#define VAL_GPIOE_LOCKR (PIN_LOCKR_DISABLED(GPIOE_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOE_PIN15)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (analog). - * PF1 - PIN1 (analog). - * PF2 - PIN2 (analog). - * PF3 - PIN3 (analog). - * PF4 - PIN4 (analog). - * PF5 - PIN5 (analog). - * PF6 - PIN6 (analog). - * PF7 - PIN7 (analog). - * PF8 - PIN8 (analog). - * PF9 - PIN9 (analog). - * PF10 - PIN10 (analog). - * PF11 - PIN11 (analog). - * PF12 - PIN12 (analog). - * PF13 - PIN13 (analog). - * PF14 - PIN14 (analog). - * PF15 - PIN15 (analog). - */ -#define VAL_GPIOF_MODER (PIN_MODE_ANALOG(GPIOF_PIN0) | \ - PIN_MODE_ANALOG(GPIOF_PIN1) | \ - PIN_MODE_ANALOG(GPIOF_PIN2) | \ - PIN_MODE_ANALOG(GPIOF_PIN3) | \ - PIN_MODE_ANALOG(GPIOF_PIN4) | \ - PIN_MODE_ANALOG(GPIOF_PIN5) | \ - PIN_MODE_ANALOG(GPIOF_PIN6) | \ - PIN_MODE_ANALOG(GPIOF_PIN7) | \ - PIN_MODE_ANALOG(GPIOF_PIN8) | \ - PIN_MODE_ANALOG(GPIOF_PIN9) | \ - PIN_MODE_ANALOG(GPIOF_PIN10) | \ - PIN_MODE_ANALOG(GPIOF_PIN11) | \ - PIN_MODE_ANALOG(GPIOF_PIN12) | \ - PIN_MODE_ANALOG(GPIOF_PIN13) | \ - PIN_MODE_ANALOG(GPIOF_PIN14) | \ - PIN_MODE_ANALOG(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_PIN0) | \ - PIN_OSPEED_HIGH(GPIOF_PIN1) | \ - PIN_OSPEED_HIGH(GPIOF_PIN2) | \ - PIN_OSPEED_HIGH(GPIOF_PIN3) | \ - PIN_OSPEED_HIGH(GPIOF_PIN4) | \ - PIN_OSPEED_HIGH(GPIOF_PIN5) | \ - PIN_OSPEED_HIGH(GPIOF_PIN6) | \ - PIN_OSPEED_HIGH(GPIOF_PIN7) | \ - PIN_OSPEED_HIGH(GPIOF_PIN8) | \ - PIN_OSPEED_HIGH(GPIOF_PIN9) | \ - PIN_OSPEED_HIGH(GPIOF_PIN10) | \ - PIN_OSPEED_HIGH(GPIOF_PIN11) | \ - PIN_OSPEED_HIGH(GPIOF_PIN12) | \ - PIN_OSPEED_HIGH(GPIOF_PIN13) | \ - PIN_OSPEED_HIGH(GPIOF_PIN14) | \ - PIN_OSPEED_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0U)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0U)) -#define VAL_GPIOF_ASCR (PIN_ASCR_DISABLED(GPIOF_PIN0) | \ - PIN_ASCR_DISABLED(GPIOF_PIN1) | \ - PIN_ASCR_DISABLED(GPIOF_PIN2) | \ - PIN_ASCR_DISABLED(GPIOF_PIN3) | \ - PIN_ASCR_DISABLED(GPIOF_PIN4) | \ - PIN_ASCR_DISABLED(GPIOF_PIN5) | \ - PIN_ASCR_DISABLED(GPIOF_PIN6) | \ - PIN_ASCR_DISABLED(GPIOF_PIN7) | \ - PIN_ASCR_DISABLED(GPIOF_PIN8) | \ - PIN_ASCR_DISABLED(GPIOF_PIN9) | \ - PIN_ASCR_DISABLED(GPIOF_PIN10) | \ - PIN_ASCR_DISABLED(GPIOF_PIN11) | \ - PIN_ASCR_DISABLED(GPIOF_PIN12) | \ - PIN_ASCR_DISABLED(GPIOF_PIN13) | \ - PIN_ASCR_DISABLED(GPIOF_PIN14) | \ - PIN_ASCR_DISABLED(GPIOF_PIN15)) -#define VAL_GPIOF_LOCKR (PIN_LOCKR_DISABLED(GPIOF_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOF_PIN15)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (analog). - * PG1 - PIN1 (analog). - * PG2 - PIN2 (analog). - * PG3 - PIN3 (analog). - * PG4 - PIN4 (analog). - * PG5 - PIN5 (analog). - * PG6 - PIN6 (analog). - * PG7 - PIN7 (analog). - * PG8 - PIN8 (analog). - * PG9 - PIN9 (analog). - * PG10 - PIN10 (analog). - * PG11 - PIN11 (analog). - * PG12 - PIN12 (analog). - * PG13 - PIN13 (analog). - * PG14 - PIN14 (analog). - * PG15 - PIN15 (analog). - */ -#define VAL_GPIOG_MODER (PIN_MODE_ANALOG(GPIOG_PIN0) | \ - PIN_MODE_ANALOG(GPIOG_PIN1) | \ - PIN_MODE_ANALOG(GPIOG_PIN2) | \ - PIN_MODE_ANALOG(GPIOG_PIN3) | \ - PIN_MODE_ANALOG(GPIOG_PIN4) | \ - PIN_MODE_ANALOG(GPIOG_PIN5) | \ - PIN_MODE_ANALOG(GPIOG_PIN6) | \ - PIN_MODE_ANALOG(GPIOG_PIN7) | \ - PIN_MODE_ANALOG(GPIOG_PIN8) | \ - PIN_MODE_ANALOG(GPIOG_PIN9) | \ - PIN_MODE_ANALOG(GPIOG_PIN10) | \ - PIN_MODE_ANALOG(GPIOG_PIN11) | \ - PIN_MODE_ANALOG(GPIOG_PIN12) | \ - PIN_MODE_ANALOG(GPIOG_PIN13) | \ - PIN_MODE_ANALOG(GPIOG_PIN14) | \ - PIN_MODE_ANALOG(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_HIGH(GPIOG_PIN0) | \ - PIN_OSPEED_HIGH(GPIOG_PIN1) | \ - PIN_OSPEED_HIGH(GPIOG_PIN2) | \ - PIN_OSPEED_HIGH(GPIOG_PIN3) | \ - PIN_OSPEED_HIGH(GPIOG_PIN4) | \ - PIN_OSPEED_HIGH(GPIOG_PIN5) | \ - PIN_OSPEED_HIGH(GPIOG_PIN6) | \ - PIN_OSPEED_HIGH(GPIOG_PIN7) | \ - PIN_OSPEED_HIGH(GPIOG_PIN8) | \ - PIN_OSPEED_HIGH(GPIOG_PIN9) | \ - PIN_OSPEED_HIGH(GPIOG_PIN10) | \ - PIN_OSPEED_HIGH(GPIOG_PIN11) | \ - PIN_OSPEED_HIGH(GPIOG_PIN12) | \ - PIN_OSPEED_HIGH(GPIOG_PIN13) | \ - PIN_OSPEED_HIGH(GPIOG_PIN14) | \ - PIN_OSPEED_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0U)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0U)) -#define VAL_GPIOG_ASCR (PIN_ASCR_DISABLED(GPIOG_PIN0) | \ - PIN_ASCR_DISABLED(GPIOG_PIN1) | \ - PIN_ASCR_DISABLED(GPIOG_PIN2) | \ - PIN_ASCR_DISABLED(GPIOG_PIN3) | \ - PIN_ASCR_DISABLED(GPIOG_PIN4) | \ - PIN_ASCR_DISABLED(GPIOG_PIN5) | \ - PIN_ASCR_DISABLED(GPIOG_PIN6) | \ - PIN_ASCR_DISABLED(GPIOG_PIN7) | \ - PIN_ASCR_DISABLED(GPIOG_PIN8) | \ - PIN_ASCR_DISABLED(GPIOG_PIN9) | \ - PIN_ASCR_DISABLED(GPIOG_PIN10) | \ - PIN_ASCR_DISABLED(GPIOG_PIN11) | \ - PIN_ASCR_DISABLED(GPIOG_PIN12) | \ - PIN_ASCR_DISABLED(GPIOG_PIN13) | \ - PIN_ASCR_DISABLED(GPIOG_PIN14) | \ - PIN_ASCR_DISABLED(GPIOG_PIN15)) -#define VAL_GPIOG_LOCKR (PIN_LOCKR_DISABLED(GPIOG_PIN0) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN1) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOG_PIN15)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (input floating). - * PH1 - OSC_OUT (input floating). - * PH2 - PIN2 (analog). - * PH3 - PIN3 (analog). - * PH4 - PIN4 (analog). - * PH5 - PIN5 (analog). - * PH6 - PIN6 (analog). - * PH7 - PIN7 (analog). - * PH8 - PIN8 (analog). - * PH9 - PIN9 (analog). - * PH10 - PIN10 (analog). - * PH11 - PIN11 (analog). - * PH12 - PIN12 (analog). - * PH13 - PIN13 (analog). - * PH14 - PIN14 (analog). - * PH15 - PIN15 (analog). - */ -#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_OSC_IN) | \ - PIN_MODE_INPUT(GPIOH_OSC_OUT) | \ - PIN_MODE_ANALOG(GPIOH_PIN2) | \ - PIN_MODE_ANALOG(GPIOH_PIN3) | \ - PIN_MODE_ANALOG(GPIOH_PIN4) | \ - PIN_MODE_ANALOG(GPIOH_PIN5) | \ - PIN_MODE_ANALOG(GPIOH_PIN6) | \ - PIN_MODE_ANALOG(GPIOH_PIN7) | \ - PIN_MODE_ANALOG(GPIOH_PIN8) | \ - PIN_MODE_ANALOG(GPIOH_PIN9) | \ - PIN_MODE_ANALOG(GPIOH_PIN10) | \ - PIN_MODE_ANALOG(GPIOH_PIN11) | \ - PIN_MODE_ANALOG(GPIOH_PIN12) | \ - PIN_MODE_ANALOG(GPIOH_PIN13) | \ - PIN_MODE_ANALOG(GPIOH_PIN14) | \ - PIN_MODE_ANALOG(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_HIGH(GPIOH_OSC_IN) | \ - PIN_OSPEED_HIGH(GPIOH_OSC_OUT) | \ - PIN_OSPEED_HIGH(GPIOH_PIN2) | \ - PIN_OSPEED_HIGH(GPIOH_PIN3) | \ - PIN_OSPEED_HIGH(GPIOH_PIN4) | \ - PIN_OSPEED_HIGH(GPIOH_PIN5) | \ - PIN_OSPEED_HIGH(GPIOH_PIN6) | \ - PIN_OSPEED_HIGH(GPIOH_PIN7) | \ - PIN_OSPEED_HIGH(GPIOH_PIN8) | \ - PIN_OSPEED_HIGH(GPIOH_PIN9) | \ - PIN_OSPEED_HIGH(GPIOH_PIN10) | \ - PIN_OSPEED_HIGH(GPIOH_PIN11) | \ - PIN_OSPEED_HIGH(GPIOH_PIN12) | \ - PIN_OSPEED_HIGH(GPIOH_PIN13) | \ - PIN_OSPEED_HIGH(GPIOH_PIN14) | \ - PIN_OSPEED_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0U) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0U)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0U) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0U)) -#define VAL_GPIOH_ASCR (PIN_ASCR_DISABLED(GPIOH_OSC_IN) | \ - PIN_ASCR_DISABLED(GPIOH_OSC_OUT) | \ - PIN_ASCR_DISABLED(GPIOH_PIN2) | \ - PIN_ASCR_DISABLED(GPIOH_PIN3) | \ - PIN_ASCR_DISABLED(GPIOH_PIN4) | \ - PIN_ASCR_DISABLED(GPIOH_PIN5) | \ - PIN_ASCR_DISABLED(GPIOH_PIN6) | \ - PIN_ASCR_DISABLED(GPIOH_PIN7) | \ - PIN_ASCR_DISABLED(GPIOH_PIN8) | \ - PIN_ASCR_DISABLED(GPIOH_PIN9) | \ - PIN_ASCR_DISABLED(GPIOH_PIN10) | \ - PIN_ASCR_DISABLED(GPIOH_PIN11) | \ - PIN_ASCR_DISABLED(GPIOH_PIN12) | \ - PIN_ASCR_DISABLED(GPIOH_PIN13) | \ - PIN_ASCR_DISABLED(GPIOH_PIN14) | \ - PIN_ASCR_DISABLED(GPIOH_PIN15)) -#define VAL_GPIOH_LOCKR (PIN_LOCKR_DISABLED(GPIOH_OSC_IN) | \ - PIN_LOCKR_DISABLED(GPIOH_OSC_OUT) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN2) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN3) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN4) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN5) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN6) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN7) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN8) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN9) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN10) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN11) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN12) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN13) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN14) | \ - PIN_LOCKR_DISABLED(GPIOH_PIN15)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* BOARD_H */ diff --git a/boards/ST_NUCLEO64_L452RE_P/board.mk b/boards/ST_NUCLEO64_L452RE_P/board.mk deleted file mode 100644 index 60673b37..00000000 --- a/boards/ST_NUCLEO64_L452RE_P/board.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(BOARDDIR)/board.c - -# Required include directories -BOARDINC = $(BOARDDIR) - -# Shared variables -ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) diff --git a/boards/ST_NUCLEO64_L452RE_P/gdboocd.cmd b/boards/ST_NUCLEO64_L452RE_P/gdboocd.cmd deleted file mode 100644 index d386b739..00000000 --- a/boards/ST_NUCLEO64_L452RE_P/gdboocd.cmd +++ /dev/null @@ -1,2 +0,0 @@ -monitor stm32l4x.cpu configure -rtos chibios -monitor reset halt diff --git a/boards/ST_NUCLEO64_L452RE_P/oocd.cfg b/boards/ST_NUCLEO64_L452RE_P/oocd.cfg deleted file mode 100644 index 7f81f2b4..00000000 --- a/boards/ST_NUCLEO64_L452RE_P/oocd.cfg +++ /dev/null @@ -1,9 +0,0 @@ -# -# -# for use with STLINK V2 SWD programmer -# - -source [find interface/stlink.cfg] -transport select hla_swd -source [find target/stm32l4x.cfg] - diff --git a/common/README.md b/common/README.md deleted file mode 100644 index d710707b..00000000 --- a/common/README.md +++ /dev/null @@ -1 +0,0 @@ -# Common Source Files and Libraries diff --git a/common/aprs.c b/common/aprs.c deleted file mode 100644 index a2044e17..00000000 --- a/common/aprs.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @file aprs.c - * @brief Automatic Packet Reporting System (APRS) support library. - * - * @addtogroup APRS - * @{ - */ -#include -#include "aprs.h" - -/*===========================================================================*/ -/* Local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Local variables and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Interface implementation. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Exported functions. */ -/*===========================================================================*/ - -/** @} */ diff --git a/common/aprs.mk b/common/aprs.mk deleted file mode 100644 index a40ba389..00000000 --- a/common/aprs.mk +++ /dev/null @@ -1,10 +0,0 @@ -# List of all the APRS protocol files. -APRSSRC := $(PROJ_SRC)/ax25.c \ - $(PROJ_SRC)/aprs.c - -# Required include directories -APRSINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(APRSSRC) -ALLINC += $(APRSINC) diff --git a/common/ax25.c b/common/ax25.c deleted file mode 100644 index 063cb0f5..00000000 --- a/common/ax25.c +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file ax25.c - * @brief AX.25 protocol support library. - * - * @addtogroup AX25 - * @{ - */ -#include -#include "ax25.h" - -/*===========================================================================*/ -/* Local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Local variables and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Interface implementation. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Exported functions. */ -/*===========================================================================*/ - -void *ax25_sdu(fb_t *fb, const void *arg) -{ - const ax25_link_t *link = arg; - ax25_hdr_t *mac_hdr; - - mac_hdr = fb_push(fb, sizeof(ax25_hdr_t)); - if (mac_hdr != NULL) { - for (int i = 0; i < 6; i++) { - /* Shift characters and convert NULL's to spaces */ - mac_hdr->dest[i] = (link->dest[i] != 0 ? link->dest[i] << 1 : 0x20 << 1); - mac_hdr->src[i] = (link->src[i] != 0 ? link->src[i] << 1 : 0x20 << 1); - } - mac_hdr->dest_ssid = AX25_SSID(link->dest_ssid); - mac_hdr->src_ssid = AX25_SSID(link->src_ssid) | AX25_SSID_EXT; - mac_hdr->control = link->control; - mac_hdr->sid = link->sid; - } - - return mac_hdr; -} - -/** @} */ diff --git a/common/ax5043.c b/common/ax5043.c deleted file mode 100644 index bafadb3e..00000000 --- a/common/ax5043.c +++ /dev/null @@ -1,1365 +0,0 @@ -/** - * @file ax5043.c - * @brief AX5043 Radio. - * - * @addtogroup AX5043 - * @{ - */ -#include -#include "ch.h" -#include "hal.h" -#include "ax5043.h" -#include "radio.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/** - * @brief ChibiOS Event masks for AX5043. - */ -#define AX5043_EVENT_IRQ EVENT_MASK(0) -#define AX5043_EVENT_TERMINATE EVENT_MASK(1) - -/** - * @brief ChibiOS Event masks for AX5043. - */ -#define AX5043_FIFO_SIZE 256U - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ -typedef union __attribute__((packed)) { - struct { - union { - uint16_t reg; - uint16_t status; - }; - uint8_t data[AX5043_FIFO_SIZE]; - }; - uint8_t buf[AX5043_FIFO_SIZE + sizeof(uint16_t)]; -} spibuf_t; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -#if (AX5043_USE_SPI) || defined(__DOXYGEN__) -/** - * @brief Perform a long (16-bit address) exchange with AX5043 using SPI. - * @note Can be called with NULL values for txbuf and/or rxbuf. - * @note A maximum of 256 bytes can be transferred at a time using this function. - * @pre The SPI interface must be initialized, the driver started, and the device selected. - * - * @param[in] spip SPI Configuration - * @param[in] reg Register address - * @param[in] write Indicates Read/Write bit - * @param[in] txbuf Buffer to send data from - * @param[out] rxbuf Buffer to return data in - * @param[in] n Number of bytes to exchange - * - * @return AX5043 status bits - * @notapi - */ -ax5043_status_t ax5043SPIExchange(SPIDriver *spip, uint16_t reg, bool write, const void *txbuf, void *rxbuf, size_t n) { - spibuf_t sendbuf; - spibuf_t recvbuf; - - /* Ensure we don't exceed 256 bytes of data */ - n = (n < AX5043_FIFO_SIZE ? n : AX5043_FIFO_SIZE); - - /* Set the register address to perform the transaction with */ - sendbuf.reg = __REVSH((reg & 0x0FFFU) | 0x7000U | (write << 15)); - - /* Copy the TX data to the sending buffer */ - if (txbuf != NULL) { - memcpy(sendbuf.data, txbuf, n); - } else { - memset(sendbuf.data, 0, n); - } - - /* Perform the exchange */ - /* We always receive because we need the status bits */ - spiExchange(spip, n + sizeof(uint16_t), sendbuf.buf, recvbuf.buf); - - /* Copy the RX data to provided buffer */ - if (rxbuf != NULL) { - memcpy(rxbuf, recvbuf.data, n); - } - - return __REVSH(recvbuf.status); -} -#endif /* AX5043_USE_SPI */ - -/** - * @brief Interrupt handler for AX5043 IRQ signals. - * - * @param[in] arg Pointer to the @p AX5043Driver object - * - * @notapi - */ -void ax5043IRQHandler(void *arg) { - AX5043Driver *devp = arg; - - osalDbgCheck(devp != NULL && devp->irq_worker != NULL); - - chSysLockFromISR(); - chEvtSignalI(devp->irq_worker, AX5043_EVENT_IRQ); - chSysUnlockFromISR(); -} - -/** - * @brief Interrupt worker thread for AX5043 IRQ signals. - * @details Broadcasts IRQ signals and handles error conditions. - * - * @param[in] arg Pointer to the @p AX5043Driver object - * - * @notapi - */ -THD_FUNCTION(irq_worker, arg) { - AX5043Driver *devp = arg; - eventmask_t irq = 0; - - osalDbgCheck(devp != NULL); - - ax5043WriteU16(devp, AX5043_REG_IRQMASK, 0x0000U); - - while (!chThdShouldTerminateX()) { - chEvtWaitAny(AX5043_EVENT_IRQ | AX5043_EVENT_TERMINATE); - - /* Retrieve the pending interrupt requests */ - irq = ax5043ReadU16(devp, AX5043_REG_IRQREQUEST); - - /* Signal waiting thread with pending interrupts */ - chEvtBroadcastFlags(&devp->irq_event, irq); - } - chThdExit(MSG_OK); -} - -/** - * @brief Waits for the specified interrupts to occur - * - * @return Event mask - * @notapi - */ -eventmask_t ax5043WaitIRQ(AX5043Driver *devp, uint16_t irq, sysinterval_t timeout) { - event_listener_t el; - eventmask_t event; - uint16_t regval; - - osalDbgCheck(devp != NULL && devp->config != NULL); - - /* Register on the interrupt with the specified IRQ signals */ - chEvtRegisterMaskWithFlags(&devp->irq_event, &el, AX5043_EVENT_IRQ, irq); - - /* Enable the interrupt source */ - regval = ax5043ReadU16(devp, AX5043_REG_IRQMASK); - regval |= irq; - ax5043WriteU16(devp, AX5043_REG_IRQMASK, regval); - - /* Wait for the interrupt to occur */ - event = chEvtWaitAnyTimeout(AX5043_EVENT_IRQ | AX5043_EVENT_TERMINATE, timeout); - - /* Retrieve interrupt request value and unregister from interrupt */ - regval = chEvtGetAndClearFlags(&el); - chEvtUnregister(&devp->irq_event, &el); - - /* Disable the interrupt */ - regval &= ~irq; - ax5043WriteU16(devp, AX5043_REG_IRQMASK, regval); - return event; -} - -/** - * @brief RX worker thread for handling AX5043 receive data. - * - * @param[in] arg Pointer to the @p AX5043Driver object - * - * @notapi - */ -THD_FUNCTION(rx_worker, arg) { - AX5043Driver *devp = arg; - objects_fifo_t *fifo = devp->config->fifo; - fb_t *fb = NULL; - uint8_t buf[AX5043_FIFO_SIZE]; - ax5043_rx_chunk_t *chunkp = (ax5043_rx_chunk_t*)buf; - uint8_t header; - size_t length, data_len; - uint8_t *pos; - - osalDbgCheck(devp != NULL); - - while (!chThdShouldTerminateX()) { - - /* Wait for FIFO data */ - if (ax5043WaitIRQ(devp, AX5043_IRQ_FIFONOTEMPTY, TIME_INFINITE) & AX5043_EVENT_TERMINATE) { - continue; - } - - /* Get chunk header from FIFO */ - ax5043Exchange(devp, AX5043_REG_FIFODATA, false, NULL, &header, 1); - - /* Determine chunk length */ - length = _FLD2VAL(AX5043_FIFOCHUNK_SIZE, header); - if (length == AX5043_CHUNKSIZE_VAR) { - ax5043Exchange(devp, AX5043_REG_FIFODATA, false, NULL, &length, 1); - } - - /* Get chunk */ - ax5043Exchange(devp, AX5043_REG_FIFODATA, false, NULL, buf, length); - - /* Process chunk */ - switch (_FLD2VAL(AX5043_FIFOCHUNK_CMD, header)) { - case AX5043_CHUNKCMD_DATA: - data_len = length - sizeof(ax5043_chunk_data_t); - /* TODO: Handle error flags */ - /* Start of new packet */ - if (chunkp->data.flags & AX5043_CHUNK_DATARX_PKTSTART) { - /* Acquire frame buffer object if needed */ - if (fb != NULL) { - fb_free(fb, fifo); - fb = NULL; - } - while (fb == NULL) { - fb = fb_alloc(FB_MAX_LEN, fifo); - } - fb->phy_rx = devp; - fb->phy_arg = (void*)devp->config->phy_arg; - } - - osalDbgAssert(fb != NULL, "rx_worker(), NULL frame buffer object"); - pos = fb_put(fb, data_len); - if (pos != NULL) { - /* Copy packet data */ - memcpy(pos, chunkp->data.data, data_len); - } else { - /* Length exceeds maximum frame buffer length, abort receive */ - uint8_t reg = ax5043ReadU8(devp, AX5043_REG_FRAMING); - reg |= AX5043_FRAMING_FABORT; - ax5043WriteU8(devp, AX5043_REG_FRAMING, reg); - fb_free(fb, fifo); - fb = NULL; - } - - /* End of packet */ - if (chunkp->data.flags & AX5043_CHUNK_DATARX_PKTEND) { - if (fb != NULL) { - pdu_send(fb, fifo); - fb = NULL; - } - } - break; - case AX5043_CHUNKCMD_TIMER: - devp->timer = __REV(chunkp->timer.timer << 8); - break; - case AX5043_CHUNKCMD_RSSI: - devp->rssi = chunkp->rssi.rssi; - break; - case AX5043_CHUNKCMD_FREQOFFS: - devp->freq_off = __REV(chunkp->freqoffs.freqoffs << 8); - break; - case AX5043_CHUNKCMD_RFFREQOFFS: - devp->rf_freq_off = __REV(chunkp->rffreqoffs.rffreqoffs << 8); - break; - case AX5043_CHUNKCMD_DATARATE: - devp->datarate = __REV(chunkp->datarate.datarate << 8); - break; - case AX5043_CHUNKCMD_ANTRSSI: - if (length == 2) { - devp->ant0rssi = chunkp->antrssi2.rssi; - devp->bgndnoise = chunkp->antrssi2.bgndnoise; - } else if (length == 3) { - devp->ant0rssi = chunkp->antrssi3.ant0rssi; - devp->ant1rssi = chunkp->antrssi3.ant1rssi; - devp->bgndnoise = chunkp->antrssi3.bgndnoise; - } - break; - default: - break; - } - } - - if (fb != NULL) { - fb_free(fb, fifo); - fb = NULL; - } - chThdExit(MSG_OK); -} - -/** - * @brief Sets powermode register of AX5043. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] pwrmode Power mode register value. - * - * @return Most significant status bits (S14...S8) - * @notapi - */ -ax5043_status_t ax5043SetPWRMode(AX5043Driver *devp, uint8_t pwrmode) { - uint8_t regval = 0; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043SetPWRMode(), invalid state"); - - ax5043Exchange(devp, AX5043_REG_PWRMODE, false, NULL, ®val, 1); - regval &= ~AX5043_PWRMODE; - regval |= _VAL2FLD(AX5043_PWRMODE, pwrmode); - return ax5043Exchange(devp, AX5043_REG_PWRMODE, true, ®val, NULL, 1); -} - -/** - * @brief Resets the AX5043 device into POWERDOWN state. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * - * @return AX5043 status bits - * @notapi - */ -ax5043_status_t ax5043Reset(AX5043Driver *devp) { - ax5043_status_t status = 0; - uint8_t regval = 0; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043Reset(), invalid state"); - - devp->error = AX5043_ERR_NOERROR; - - /* Reset the chip through powermode register */ - regval = AX5043_PWRMODE_RESET; - ax5043WriteU8(devp, AX5043_REG_PWRMODE, regval); - - /* Write to PWRMODE: XOEN, REFEN and POWERDOWN mode. Clear RST bit. - Page 33 in programming manual */ - regval = AX5043_PWRMODE_REFEN | AX5043_PWRMODE_XOEN | AX5043_PWRMODE_POWERDOWN; - ax5043WriteU8(devp, AX5043_REG_PWRMODE, regval); - - /* Verify functionality with SCRATCH register */ - regval = 0xAA; - ax5043Exchange(devp, AX5043_REG_SCRATCH, true, ®val, NULL, 1); - regval = 0x55; - status = ax5043Exchange(devp, AX5043_REG_SCRATCH, true, ®val, ®val, 1); - if (regval != 0xAA) { - devp->error = AX5043_ERR_NOT_CONNECTED; - devp->state = AX5043_STOP; - return status; - } - status = ax5043Exchange(devp, AX5043_REG_SCRATCH, true, NULL, ®val, 1); - if (regval != 0x55) { - devp->error = AX5043_ERR_NOT_CONNECTED; - devp->state = AX5043_STOP; - return status; - } - - devp->state = AX5043_RESET; - return status; -} - -/** - * @brief Sets RFDIV related registers. - * - * @param[in] freq Frequency - * - * @notapi - */ -void ax5043SetRFDIV(AX5043Driver *devp, uint32_t freq) { - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043SetRFDIV(), invalid state"); - osalDbgAssert((freq >= AX5043_RFDIV_DIV1_MIN && freq <= AX5043_RFDIV_DIV1_MAX) || - (freq >= AX5043_RFDIV_DIV2_MIN && freq <= AX5043_RFDIV_DIV2_MAX), - "ax5043SetRFDIV(), frequency out of bounds"); - - uint8_t pllvcodiv = ax5043ReadU8(devp, AX5043_REG_PLLVCODIV); - if (freq >= AX5043_RFDIV_DIV1_MIN && freq <= AX5043_RFDIV_DIV1_MAX) { - pllvcodiv &= ~AX5043_PLLVCODIV_RFDIV; - } else { - pllvcodiv |= AX5043_PLLVCODIV_RFDIV; - } - ax5043WriteU8(devp, AX5043_REG_PLLVCODIV, pllvcodiv); - ax5043WriteU8(devp, AX5043_REG_0xF34, (pllvcodiv & AX5043_PLLVCODIV_RFDIV ? AX5043_0xF34_RFDIV : AX5043_0xF34_NORFDIV)); -} - -/*===========================================================================*/ -/* Interface implementation. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes an instance of AX5043Driver object. - * - * @param[out] devp Pointer to the @p AX5043Driver object - * - * @init - */ -void ax5043ObjectInit(AX5043Driver *devp) { - devp->config = NULL; - - chMtxObjectInit(&devp->tx_lock); - - devp->irq_worker = NULL; - chEvtObjectInit(&devp->irq_event); - - devp->rx_worker = NULL; - - devp->preamble = NULL; - devp->postamble = NULL; - - devp->state = AX5043_STOP; -} - -/** - * @brief Configures and activates the AX5043 Radio Driver. - * - * @param[in] devp Pointer to the @p AX5043Driver object - * @param[in] config Pointer to the @p AX5043Config object - * - * @api - */ -void ax5043Start(AX5043Driver *devp, const AX5043Config *config) { - osalDbgCheck((devp != NULL) && (config != NULL)); - osalDbgAssert((devp->state != AX5043_UNINIT), - "ax5043Start(), invalid state"); - - devp->config = config; - devp->error = AX5043_ERR_NOERROR; - devp->profile = config->profile; - devp->preamble = config->preamble; - devp->preamble_len = config->preamble_len; - devp->postamble = config->postamble; - devp->postamble_len = config->postamble_len; - - devp->vcora = 0; - devp->vcorb = 0; - devp->timer = 0; - devp->datarate = 0; - devp->freq_off = 0; - devp->rf_freq_off = 0; - devp->rssi = 0; - devp->ant0rssi = 0; - devp->ant1rssi = 0; - devp->bgndnoise = 0; - -#if AX5043_USE_SPI -#if AX5043_SHARED_SPI - spiAcquireBus(config->spip); -#endif /* AX5043_SHARED_SPI */ - - /* Start the SPI interface for the device */ - spiStart(config->spip, config->spicfg); - -#if AX5043_SHARED_SPI - spiReleaseBus(config->spip); -#endif /* AX5043_SHARED_SPI */ -#endif /* AX5043_USE_SPI */ - - /* Reset device into POWERDOWN state */ - devp->status = ax5043Reset(devp); - if (devp->error != AX5043_ERR_NOERROR) { - return; - } - - /* Register interrupt handler for device and start worker */ - if (devp->irq_worker == NULL) { - devp->irq_worker = chThdCreateFromHeap(NULL, THD_WORKING_AREA_SIZE(0x400), "ax5043_irq_worker", HIGHPRIO, irq_worker, devp); - palSetLineCallback(config->irq, ax5043IRQHandler, devp); - palEnableLineEvent(config->irq, PAL_EVENT_MODE_RISING_EDGE); - } - - /* Transition to ready state */ - devp->state = AX5043_READY; - - /* Apply initial profile provided by user */ - if (config->profile) { - ax5043SetProfile(devp, config->profile); - } - -} - -/** - * @brief Deactivates the AX5043 Radio Driver. - * - * @param[in] devp Pointer to the @p AX5043Driver object - * - * @api - */ -void ax5043Stop(AX5043Driver *devp) { - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), - "ax5043Stop(), invalid state"); - - if (devp->state != AX5043_STOP) { - /* Power down device */ - ax5043SetPWRMode(devp, AX5043_PWRMODE_POWERDOWN); - - /* Disable the interrupt handler and worker thread */ - palDisableLineEvent(devp->config->irq); - palSetLineCallback(devp->config->irq, NULL, NULL); - chThdTerminate(devp->irq_worker); - chEvtSignal(devp->irq_worker, AX5043_EVENT_TERMINATE); - chThdWait(devp->irq_worker); - devp->irq_worker = NULL; - -#if AX5043_USE_SPI -#if AX5043_SHARED_SPI - spiAcquireBus(devp->config->spip); - spiStart(devp->config->spip, devp->config->spicfg); -#endif /* AX5043_SHARED_SPI */ - - /* Stop the SPI interface for the device */ - spiStop(devp->config->spip); - -#if AX5043_SHARED_SPI - spiReleaseBus(devp->config->spip); -#endif /* AX5043_SHARED_SPI */ -#endif /* AX5043_USE_SPI */ - } - - /* Transition to stop state */ - devp->state = AX5043_STOP; -} - -/** - * @brief Puts AX5043 into idle mode. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * - * @api - */ -void ax5043Idle(AX5043Driver *devp) { - osalDbgCheck(devp != NULL); - osalDbgAssert(((devp->state == AX5043_READY) || - (devp->state == AX5043_RX) || - (devp->state == AX5043_WOR) || - (devp->state == AX5043_TX)), "ax5043Idle(), invalid state"); - - if (devp->state != AX5043_READY) { - devp->error = AX5043_ERR_NOERROR; - - if (devp->rx_worker) { - chThdTerminate(devp->rx_worker); - chEvtSignal(devp->rx_worker, AX5043_EVENT_TERMINATE); - chThdWait(devp->rx_worker); - devp->rx_worker = NULL; - } - - ax5043SetPWRMode(devp, AX5043_PWRMODE_POWERDOWN); - - devp->state = AX5043_READY; - } -} - -/** - * @brief Puts AX5043 into receive or wake-on-radio mode. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] chan_b Use channel B if true. - * @param[in] wor Enable Wake-On-Radio mode. - * - * @api - */ -void ax5043RX(AX5043Driver *devp, bool chan_b, bool wor) { - osalDbgCheck(devp != NULL); - osalDbgAssert(((devp->state == AX5043_READY) || - (devp->state == AX5043_RX) || - (devp->state == AX5043_WOR) || - (devp->state == AX5043_TX)), "ax5043RX(), invalid state"); - - bool cur_chan = ax5043ReadU8(devp, AX5043_REG_PLLLOOP) & AX5043_PLLLOOP_FREQSEL; - - if ((!wor && devp->state != AX5043_RX) || (wor && devp->state != AX5043_WOR) || chan_b != cur_chan) { - devp->error = AX5043_ERR_NOERROR; - - /* Enter idle state first */ - ax5043Idle(devp); - - /* Set the channel */ - uint32_t freq; - uint8_t pllloop = ax5043ReadU8(devp, AX5043_REG_PLLLOOP); - if (chan_b) { - freq = AX5043_REG_TO_FREQ(ax5043ReadU32(devp, AX5043_REG_FREQB), devp->config->xtal_freq); - pllloop |= AX5043_PLLLOOP_FREQSEL; - } else { - freq = AX5043_REG_TO_FREQ(ax5043ReadU32(devp, AX5043_REG_FREQA), devp->config->xtal_freq); - pllloop &= ~AX5043_PLLLOOP_FREQSEL; - } - ax5043WriteU8(devp, AX5043_REG_PLLLOOP, pllloop); - ax5043SetRFDIV(devp, freq); - - /* Activate synthesizer to lock PLL */ - ax5043SetPWRMode(devp, AX5043_PWRMODE_RX_SYNTH); - chThdSleepMicroseconds(1); - if (!(ax5043GetStatus(devp) & AX5043_STATUS_PLL_LOCK)) { - ax5043SetPWRMode(devp, AX5043_PWRMODE_POWERDOWN); - devp->error = AX5043_ERR_LOCKLOST; - return; - } - /* Clear FIFO and set threshold */ - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, AX5043_FIFOCMD_CLEAR_FIFODAT); - ax5043WriteU16(devp, AX5043_REG_FIFOTHRESH, 0); - - /* Activate RX or WOR */ - if (wor) { - ax5043SetPWRMode(devp, AX5043_PWRMODE_RX_WOR); - devp->state = AX5043_WOR; - } else { - ax5043SetPWRMode(devp, AX5043_PWRMODE_RX_FULL); - devp->state = AX5043_RX; - } - - /* Start the FIFO worker */ - devp->rx_worker = chThdCreateFromHeap(NULL, THD_WORKING_AREA_SIZE(0x400), "ax5043_rx_worker", HIGHPRIO-1, rx_worker, devp); - } -} - -/** - * @brief Puts AX5043 into transmit mode and transmits a packet. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] buf Transmit buffer. - * @param[in] len Initial length provided in the buffer. - * @param[in] total_len Total length of data to be transmitted. - * @param[in] tx_cb Optional transmit buffer fill callback. - * @param[in] tx_cb_arg Optional transmit buffer fill callback argument. - * @param[in] chan_b Use channel B if true. - * - * @api - */ -void ax5043TX(AX5043Driver *devp, const ax5043_profile_t *profile, const void *buf, size_t len, size_t total_len, ax5043_tx_cb_t tx_cb, void *tx_cb_arg, bool chan_b) { - const ax5043_profile_t *prev_profile; - ax5043_state_t prev_state; - bool prev_chan; - - osalDbgCheck(devp != NULL && buf != NULL); - osalDbgAssert(((devp->state == AX5043_READY) || - (devp->state == AX5043_RX) || - (devp->state == AX5043_WOR) || - (devp->state == AX5043_TX)), "ax5043TX(), invalid state"); - osalDbgAssert(total_len != 0, "ax5043TX(), invalid total length"); - osalDbgAssert(tx_cb != NULL || len == total_len, - "ax5043TX(), no callback when len != total_len"); - - chMtxLock(&devp->tx_lock); - devp->error = AX5043_ERR_NOERROR; - - /* Record previous state and enter idle state */ - prev_state = devp->state; - prev_chan = ax5043ReadU8(devp, AX5043_REG_PLLLOOP) & AX5043_PLLLOOP_FREQSEL; - ax5043Idle(devp); - - /* Set TX profile */ - if (profile != NULL) { - prev_profile = ax5043GetProfile(devp); - ax5043SetProfile(devp, profile); - } - - /* Set Frequency Selection */ - uint32_t freq; - uint8_t pllloop = ax5043ReadU8(devp, AX5043_REG_PLLLOOP); - if (chan_b) { - freq = AX5043_REG_TO_FREQ(ax5043ReadU32(devp, AX5043_REG_FREQB), devp->config->xtal_freq); - pllloop |= AX5043_PLLLOOP_FREQSEL; - } else { - freq = AX5043_REG_TO_FREQ(ax5043ReadU32(devp, AX5043_REG_FREQA), devp->config->xtal_freq); - pllloop &= ~AX5043_PLLLOOP_FREQSEL; - } - ax5043WriteU8(devp, AX5043_REG_PLLLOOP, pllloop); - ax5043SetRFDIV(devp, freq); - - /* Activate synthesizer to lock PLL */ - /* TODO: Can we base this on an interrupt instead of a delay? */ - ax5043SetPWRMode(devp, AX5043_PWRMODE_TX_SYNTH); - chThdSleepMicroseconds(1); - if (!(ax5043GetStatus(devp) & AX5043_STATUS_PLL_LOCK)) { - ax5043SetPWRMode(devp, AX5043_PWRMODE_POWERDOWN); - devp->error = AX5043_ERR_LOCKLOST; - return; - } - /* Clear FIFO */ - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, AX5043_FIFOCMD_CLEAR_FIFODAT); - - /* Activate TX */ - ax5043SetPWRMode(devp, AX5043_PWRMODE_TX_FULL); - devp->state = AX5043_TX; - - /* Write preamble if provided */ - if (devp->preamble) { - ax5043WriteU16(devp, AX5043_REG_FIFOTHRESH, devp->preamble_len); - ax5043WaitIRQ(devp, AX5043_IRQ_FIFOTHRFREE, TIME_INFINITE); - - /* Write preamble to FIFO */ - ax5043Exchange(devp, AX5043_REG_FIFODATA, true, devp->preamble, NULL, devp->preamble_len); - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, AX5043_FIFOCMD_COMMIT); - } - - size_t transferred = 0; - size_t offset = 0; - ax5043WriteU16(devp, AX5043_REG_FIFOTHRESH, AX5043_FIFO_WRITE_LEN); - while (transferred < total_len) { - ax5043_chunk_data_tx_t data; - size_t write_len; - - /* Refill buffer if needed */ - if (len == 0 && tx_cb) { - len = tx_cb(tx_cb_arg); - offset = 0; - osalDbgAssert(len != 0, - "ax5043TX(), callback returned zero length"); - osalDbgAssert(transferred + len <= total_len, - "ax5043TX(), callback returned length exceeding total length"); - } - - /* Determine length of data chunk write */ - write_len = AX5043_FIFO_WRITE_LEN - sizeof(data); - if (len < write_len) { - write_len = len; - } - - /* Prepare chunk */ - data.header = AX5043_CHUNKCMD_DATA | _VAL2FLD(AX5043_FIFOCHUNK_SIZE, AX5043_CHUNKSIZE_VAR); - data.length = write_len + 1; - data.flags = 0; - if (transferred == 0) { - data.flags |= AX5043_CHUNK_DATATX_PKTSTART; - } - if (transferred + write_len == total_len) { - data.flags |= AX5043_CHUNK_DATATX_PKTEND; - } - - /* Once there's enough free space, write the data chunk and commit */ - ax5043WaitIRQ(devp, AX5043_IRQ_FIFOTHRFREE, TIME_INFINITE); - ax5043Exchange(devp, AX5043_REG_FIFODATA, true, (uint8_t*)(&data), NULL, sizeof(data)); - ax5043Exchange(devp, AX5043_REG_FIFODATA, true, &((uint8_t*)buf)[offset], NULL, write_len); - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, AX5043_FIFOCMD_COMMIT); - - len -= write_len; - offset += write_len; - transferred += write_len; - } - - /* Write postamble if provided */ - if (devp->postamble) { - ax5043WriteU16(devp, AX5043_REG_FIFOTHRESH, devp->postamble_len); - ax5043WaitIRQ(devp, AX5043_IRQ_FIFOTHRFREE, TIME_INFINITE); - - /* Write postamble to FIFO */ - ax5043Exchange(devp, AX5043_REG_FIFODATA, true, devp->postamble, NULL, devp->postamble_len); - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, AX5043_FIFOCMD_COMMIT); - } - - ax5043WriteU16(devp, AX5043_REG_RADIOEVENTMASK, AX5043_RADIOEVENT_DONE); - ax5043WaitIRQ(devp, AX5043_IRQ_RADIOCTRL, TIME_INFINITE); - ax5043WriteU16(devp, AX5043_REG_RADIOEVENTMASK, 0x0000U); - ax5043ReadU16(devp, AX5043_REG_RADIOEVENTREQ); - - /* Return to original state */ - if (profile != NULL) { - ax5043SetProfile(devp, prev_profile); - } - switch (prev_state) { - case AX5043_RX: - ax5043RX(devp, prev_chan, false); - break; - case AX5043_WOR: - ax5043RX(devp, prev_chan, true); - break; - case AX5043_READY: - default: - ax5043Idle(devp); - } - chMtxUnlock(&devp->tx_lock); -} - -/** - * @brief Puts AX5043 into raw transmit mode. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] buf Transmit FIFO buffer. - * @param[in] len Initial length provided in the buffer. - * @param[in] total_len Total length of data to be transmitted. - * @param[in] tx_cb Optional transmit buffer fill callback. - * @param[in] tx_cb_arg Optional transmit buffer fill callback argument. - * @param[in] chan_b Use channel B if true. - * - * @api - */ -void ax5043TXRaw(AX5043Driver *devp, const ax5043_profile_t *profile, const void *buf, size_t len, size_t total_len, ax5043_tx_cb_t tx_cb, void *tx_cb_arg, bool chan_b) { - const ax5043_profile_t *prev_profile; - ax5043_state_t prev_state; - bool prev_chan; - - osalDbgCheck(devp != NULL && buf != NULL); - osalDbgAssert(((devp->state == AX5043_READY) || - (devp->state == AX5043_RX) || - (devp->state == AX5043_WOR) || - (devp->state == AX5043_TX)), "ax5043TXRaw(), invalid state"); - osalDbgAssert(total_len != 0, "ax5043TXRaw(), invalid total length"); - osalDbgAssert(tx_cb != NULL || len == total_len, - "ax5043TXRaw(), no callback when len != total_len"); - - chMtxLock(&devp->tx_lock); - devp->error = AX5043_ERR_NOERROR; - - /* Record previous state and enter idle state */ - prev_state = devp->state; - prev_chan = ax5043ReadU8(devp, AX5043_REG_PLLLOOP) & AX5043_PLLLOOP_FREQSEL; - ax5043Idle(devp); - - /* Set TX profile */ - if (profile != NULL) { - prev_profile = ax5043GetProfile(devp); - ax5043SetProfile(devp, profile); - } - - /* Set Frequency Selection */ - uint32_t freq; - uint8_t pllloop = ax5043ReadU8(devp, AX5043_REG_PLLLOOP); - if (chan_b) { - freq = AX5043_REG_TO_FREQ(ax5043ReadU32(devp, AX5043_REG_FREQB), devp->config->xtal_freq); - pllloop |= AX5043_PLLLOOP_FREQSEL; - } else { - freq = AX5043_REG_TO_FREQ(ax5043ReadU32(devp, AX5043_REG_FREQA), devp->config->xtal_freq); - pllloop &= ~AX5043_PLLLOOP_FREQSEL; - } - ax5043WriteU8(devp, AX5043_REG_PLLLOOP, pllloop); - ax5043SetRFDIV(devp, freq); - - /* Activate synthesizer to lock PLL */ - /* TODO: Can we base this on an interrupt instead of a delay? */ - ax5043SetPWRMode(devp, AX5043_PWRMODE_TX_SYNTH); - chThdSleepMicroseconds(1); - if (!(ax5043GetStatus(devp) & AX5043_STATUS_PLL_LOCK)) { - ax5043SetPWRMode(devp, AX5043_PWRMODE_POWERDOWN); - devp->error = AX5043_ERR_LOCKLOST; - return; - } - /* Clear FIFO */ - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, AX5043_FIFOCMD_CLEAR_FIFODAT); - - /* Activate TX */ - ax5043SetPWRMode(devp, AX5043_PWRMODE_TX_FULL); - devp->state = AX5043_TX; - - size_t transferred = 0; - size_t offset = 0; - ax5043WriteU16(devp, AX5043_REG_FIFOTHRESH, AX5043_FIFO_WRITE_LEN); - while (transferred < total_len) { - size_t write_len; - - /* Refill buffer if needed */ - if (len == 0 && tx_cb) { - len = tx_cb(tx_cb_arg); - offset = 0; - osalDbgAssert(len != 0, - "ax5043TX(), callback returned zero length"); - osalDbgAssert(transferred + len <= total_len, - "ax5043TX(), callback returned length exceeding total length"); - } - - /* Determine length of data chunk write */ - write_len = (len < AX5043_FIFO_WRITE_LEN ? len : AX5043_FIFO_WRITE_LEN); - - /* Once there's enough free space, write the data chunk and commit */ - ax5043WaitIRQ(devp, AX5043_IRQ_FIFOTHRFREE, TIME_INFINITE); - ax5043Exchange(devp, AX5043_REG_FIFODATA, true, &((uint8_t*)buf)[offset], NULL, write_len); - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, AX5043_FIFOCMD_COMMIT); - - len -= write_len; - offset += write_len; - transferred += write_len; - } - - ax5043WriteU16(devp, AX5043_REG_RADIOEVENTMASK, AX5043_RADIOEVENT_DONE); - ax5043WaitIRQ(devp, AX5043_IRQ_RADIOCTRL, TIME_INFINITE); - ax5043WriteU16(devp, AX5043_REG_RADIOEVENTMASK, 0x0000U); - ax5043ReadU16(devp, AX5043_REG_RADIOEVENTREQ); - - /* Return to original state */ - if (profile != NULL) { - ax5043SetProfile(devp, prev_profile); - } - switch (prev_state) { - case AX5043_RX: - ax5043RX(devp, prev_chan, false); - break; - case AX5043_WOR: - ax5043RX(devp, prev_chan, true); - break; - case AX5043_READY: - default: - ax5043Idle(devp); - } - chMtxUnlock(&devp->tx_lock); -} - -/** - * @brief Sets register values from a profile. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] profile Pointer to the @p ax5043_profile_t list of register values. - * - * @api - */ -void ax5043SetProfile(AX5043Driver *devp, const ax5043_profile_t *profile) { - ax5043_state_t prev_state; - bool prev_chan; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043SetProfile(), invalid state"); - - devp->profile = profile; - - /* Record previous state and enter idle state */ - prev_state = devp->state; - prev_chan = ax5043ReadU8(devp, AX5043_REG_PLLLOOP) & AX5043_PLLLOOP_FREQSEL; - ax5043Idle(devp); - - /* Set all profile values */ - for (const ax5043_profile_t *entry = profile; entry->reg; entry++) { - switch (entry->len) { - case 1: - ax5043WriteU8(devp, entry->reg, entry->val); - break; - case 2: - ax5043WriteU16(devp, entry->reg, entry->val); - break; - case 3: - ax5043WriteU24(devp, entry->reg, entry->val); - break; - case 4: - ax5043WriteU32(devp, entry->reg, entry->val); - break; - default: - break; - } - } - - /* Re-range frequencies in case they changed */ - ax5043SetFreq(devp, 0, devp->vcorb, true); - ax5043SetFreq(devp, 0, devp->vcora, false); - - /* Return to original state */ - switch (prev_state) { - case AX5043_RX: - ax5043RX(devp, prev_chan, false); - break; - case AX5043_WOR: - ax5043RX(devp, prev_chan, true); - break; - case AX5043_READY: - default: - ax5043Idle(devp); - } -} - -/** - * @brief Gets the currently active profile. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * - * @return Pointer to the current profile. - * @api - */ -const ax5043_profile_t *ax5043GetProfile(AX5043Driver *devp) { - return devp->profile; -} - -/** - * @brief Sets Carrier Frequency on an AX5043 device. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] freq Carrier frequency in Hz. If 0, ranges existing reg value. - * @param[in] vcor VCO Range value. Set to 0 if unknown. - * @param[in] chan_b Set channel B frequency if true, channel A otherwise. - * - * @return Corrected VCOR for given frequency. - * @api - */ -uint8_t ax5043SetFreq(AX5043Driver *devp, uint32_t freq, uint8_t vcor, bool chan_b) { - ax5043_state_t prev_state; - bool prev_chan; - - uint16_t freq_reg = (chan_b ? AX5043_REG_FREQB : AX5043_REG_FREQA); - uint16_t rng_reg = (chan_b ? AX5043_REG_PLLRANGINGB : AX5043_REG_PLLRANGINGA); - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043SetFreq(), invalid state"); - osalDbgAssert((freq >= AX5043_RFDIV_DIV1_MIN && freq <= AX5043_RFDIV_DIV1_MAX) || - (freq >= AX5043_RFDIV_DIV2_MIN && freq <= AX5043_RFDIV_DIV2_MAX) || - freq == 0, "ax5043SetFreq(), frequency out of bounds"); - - devp->error = AX5043_ERR_NOERROR; - - /* Record previous state and enter idle state */ - prev_state = devp->state; - prev_chan = ax5043ReadU8(devp, AX5043_REG_PLLLOOP) & AX5043_PLLLOOP_FREQSEL; - ax5043Idle(devp); - - /* If no VCOR specified, default to 8 */ - if (vcor == 0) { - vcor = 8; - } - - /* Enter Standby mode */ - ax5043SetPWRMode(devp, AX5043_PWRMODE_STANDBY); - - /* Wait for XTAL */ - ax5043WaitIRQ(devp, AX5043_IRQ_XTALREADY, TIME_INFINITE); - - /* Set frequencies - * We first find the GCD of the two frequencies in order to reduce them - * as much as possible before doing the calculations. - * NOTE: The programming manual recommends always setting bit 0 - * - * REG = f_carrier * 2^24 / f_xtal + 1/2 - * = (f_carrier * 2^25 + f_xtal) / (f_xtal * 2) - */ - - /* Set Frequency Selection */ - uint8_t pllloop = ax5043ReadU8(devp, AX5043_REG_PLLLOOP); - if (chan_b) { - pllloop |= AX5043_PLLLOOP_FREQSEL; - } else { - pllloop &= ~AX5043_PLLLOOP_FREQSEL; - } - ax5043WriteU8(devp, AX5043_REG_PLLLOOP, pllloop); - - /* Set the frequency and RFDIV if needed, and initiate ranging */ - if (freq) { - ax5043WriteU32(devp, freq_reg, AX5043_FREQ_TO_REG(freq, devp->config->xtal_freq)); - } else { - freq = AX5043_REG_TO_FREQ(ax5043ReadU32(devp, freq_reg), devp->config->xtal_freq); - } - ax5043SetRFDIV(devp, freq); - ax5043WriteU8(devp, rng_reg, _VAL2FLD(AX5043_PLLRANGING_VCOR, vcor) | AX5043_PLLRANGING_RNGSTART); - ax5043WaitIRQ(devp, AX5043_IRQ_PLLRNGDONE, TIME_INFINITE); - vcor = ax5043ReadU8(devp, rng_reg); - if (vcor & AX5043_PLLRANGING_RNGERR) { - devp->error = AX5043_ERR_RANGING; - } - vcor = _FLD2VAL(AX5043_PLLRANGING_VCOR, vcor); - if (chan_b) { - devp->vcorb = vcor; - } else { - devp->vcora = vcor; - } - - /* Return to original state */ - switch (prev_state) { - case AX5043_RX: - ax5043RX(devp, prev_chan, false); - break; - case AX5043_WOR: - ax5043RX(devp, prev_chan, true); - break; - case AX5043_READY: - default: - ax5043Idle(devp); - } - - return vcor; -} - -/** - * @brief Gets the current frequency. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * - * @return The frequency in Hz. - * @api - */ -uint32_t ax5043GetFreq(AX5043Driver *devp) { - bool chan = ax5043ReadU8(devp, AX5043_REG_PLLLOOP) & AX5043_PLLLOOP_FREQSEL; - uint16_t freq_reg = (chan ? AX5043_REG_FREQB : AX5043_REG_FREQA); - - return AX5043_REG_TO_FREQ(ax5043ReadU32(devp, freq_reg), devp->config->xtal_freq); -} - -/** - * @brief Sets Preamble pointer and length for AX5043 transmission operations. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] preamble Pointer to the preamble buffer. - * @param[in] len Length of the buffer. - * - * @api - */ -void ax5043SetPreamble(AX5043Driver *devp, const void *preamble, size_t len) { - osalDbgCheck(devp != NULL); - osalDbgAssert(len <= AX5043_FIFO_SIZE, "ax5043SetPreamble(), Preamble length exceeds max FIFO size"); - - devp->preamble = preamble; - devp->preamble_len = len; -} - -/** - * @brief Gets the currently active preamble. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * - * @return Pointer to the current preamble. - * @api - */ -const void *ax5043GetPreamble(AX5043Driver *devp) { - return devp->preamble; -} - -/** - * @brief Sets Postamble pointer and length for AX5043 transmission operations. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] postamble Pointer to the postamble buffer. - * @param[in] len Length of the buffer. - * - * @api - */ -void ax5043SetPostamble(AX5043Driver *devp, const void *postamble, size_t len) { - osalDbgCheck(devp != NULL); - osalDbgAssert(len <= AX5043_FIFO_SIZE, "ax5043SetPostamble(), Postamble length exceeds max FIFO size"); - - devp->postamble = postamble; - devp->postamble_len = len; -} - -/** - * @brief Gets the currently active postamble. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * - * @return Pointer to the current postamble. - * @api - */ -const void *ax5043GetPostamble(AX5043Driver *devp) { - return devp->postamble; -} - -/** - * @brief Perform a long (16-bit address) exchange with an AX5043 device. - * @note Can be called with NULL values for txbuf and/or rxbuf. - * @note A maximum of 256 bytes can be transferred at a time using this function. - * - * @param[in] devp Pointer to the @p AX5043Driver object - * @param[in] reg Register address - * @param[in] write Indicates Read/Write bit - * @param[in] txbuf Buffer to send data from - * @param[out] rxbuf Buffer to return data in - * @param[in] n Number of bytes to exchange - * - * @return AX5043 status bits - * @api - */ -ax5043_status_t ax5043Exchange(AX5043Driver *devp, uint16_t reg, bool write, const void *txbuf, void *rxbuf, size_t n) { - SPIDriver *spip = NULL; - ax5043_status_t status = 0; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043Exchange(), invalid state"); - -#if AX5043_USE_SPI - spip = devp->config->spip; -#if AX5043_SHARED_SPI - spiAcquireBus(spip); - spiStart(spip, devp->config->spicfg); -#endif /* AX5043_SHARED_SPI */ - - spiSelect(spip); - while (!palReadLine(devp->config->miso)); - status = ax5043SPIExchange(spip, reg, write, txbuf, rxbuf, n); - spiUnselect(spip); - -#if AX5043_SHARED_SPI - spiReleaseBus(spip); -#endif /* AX5043_SHARED_SPI */ -#endif /* AX5043_USE_SPI */ - - return status; -} - -/** - * @brief Gets the status of the AX5043 device. - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * - * @return AX5043 status bits - * @api - */ -ax5043_status_t ax5043GetStatus(AX5043Driver *devp) { - SPIDriver *spip = NULL; - ax5043_status_t status = 0; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043GetStatus(), invalid state"); - -#if AX5043_USE_SPI - spip = devp->config->spip; -#if AX5043_SHARED_SPI - spiAcquireBus(spip); - spiStart(spip, devp->config->spicfg); -#endif /* AX5043_SHARED_SPI */ - - spiSelect(spip); - while (!palReadLine(devp->config->miso)); - spiReceive(spip, 2, &status); - spiUnselect(spip); - -#if AX5043_SHARED_SPI - spiReleaseBus(spip); -#endif /* AX5043_SHARED_SPI */ -#endif /* AX5043_USE_SPI */ - - return __REVSH(status); -} - -/** - * @brief Read a uint8_t value from a register - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] reg Register address - * - * @return The value in the register - * @api - */ -uint8_t ax5043ReadU8(AX5043Driver *devp, uint16_t reg) { - uint8_t value; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043ReadU8(), invalid state"); - - ax5043Exchange(devp, reg, false, NULL, &value, 1); - - return value; -} - -/** - * @brief Read a uint16_t value from a register - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] reg Register address - * - * @return The value in the register - * @api - */ -uint16_t ax5043ReadU16(AX5043Driver *devp, uint16_t reg) { - uint16_t value; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043ReadU16(), invalid state"); - - ax5043Exchange(devp, reg, false, NULL, (uint8_t*)&value, 2); - - return __REVSH(value); -} - -/** - * @brief Read a uint32_t value from a 24-bit register - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] reg Register address - * - * @return The value in the register - * @api - */ -uint32_t ax5043ReadU24(AX5043Driver *devp, uint16_t reg) { - uint32_t value; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043ReadU32(), invalid state"); - - ax5043Exchange(devp, reg, false, NULL, (uint8_t*)&value, 3); - - return __REV(value << 8); -} - -/** - * @brief Read a uint32_t value from a register - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] reg Register address - * - * @return The value in the register - * @api - */ -uint32_t ax5043ReadU32(AX5043Driver *devp, uint16_t reg) { - uint32_t value; - - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043ReadU32(), invalid state"); - - ax5043Exchange(devp, reg, false, NULL, (uint8_t*)&value, 4); - - return __REV(value); -} - -/** - * @brief Write a uint8_t value to a register - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] reg Register address - * @param[in] value Register value - * - * @api - */ -void ax5043WriteU8(AX5043Driver *devp, uint16_t reg, uint8_t value) { - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043WriteU8(), invalid state"); - - ax5043Exchange(devp, reg, true, &value, NULL, 1); -} - -/** - * @brief Write a uint16_t value to a register - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] reg Register address - * @param[in] value Register value - * - * @api - */ -void ax5043WriteU16(AX5043Driver *devp, uint16_t reg, uint16_t value) { - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043WriteU8(), invalid state"); - - value = __REVSH(value); - ax5043Exchange(devp, reg, true, (uint8_t*)&value, NULL, 2); -} - -/** - * @brief Write a uint32_t value to a 24-bit register - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] reg Register address - * @param[in] value Register value - * - * @api - */ -void ax5043WriteU24(AX5043Driver *devp, uint16_t reg, uint32_t value) { - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043WriteU8(), invalid state"); - - value = __REV(value) >> 8; - ax5043Exchange(devp, reg, true, (uint8_t*)&value, NULL, 3); -} - -/** - * @brief Write a uint32_t value to a register - * - * @param[in] devp Pointer to the @p AX5043Driver object. - * @param[in] reg Register address - * @param[in] value Register value - * - * @api - */ -void ax5043WriteU32(AX5043Driver *devp, uint16_t reg, uint32_t value) { - osalDbgCheck(devp != NULL && devp->config != NULL); - osalDbgAssert((devp->state != AX5043_UNINIT), "ax5043WriteU32(), invalid state"); - - value = __REV(value); - ax5043Exchange(devp, reg, true, (uint8_t*)&value, NULL, 4); -} - -/** @} */ diff --git a/common/ax5043.mk b/common/ax5043.mk deleted file mode 100644 index ee385817..00000000 --- a/common/ax5043.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the AX5043 device files. -AX5043SRC := $(PROJ_SRC)/ax5043.c - -# Required include directories -AX5043INC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(AX5043SRC) -ALLINC += $(AX5043INC) diff --git a/common/bootloader.mk b/common/bootloader.mk deleted file mode 100644 index 17ca5faa..00000000 --- a/common/bootloader.mk +++ /dev/null @@ -1,7 +0,0 @@ -BOOTLOADERINC = $(PROJ_SRC)/include - -BOOTLOADERSRC = $(PROJ_SRC)/can_bootloader.c - -# Shared variables. -ALLCSRC += $(BOOTLOADERSRC) -ALLINC += $(BOOTLOADERINC) diff --git a/common/can_bootloader.c b/common/can_bootloader.c deleted file mode 100644 index 9561a802..00000000 --- a/common/can_bootloader.c +++ /dev/null @@ -1,942 +0,0 @@ -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "can_bootloader.h" -#include "string.h" -#include "oresat_f0.h" - -#define CAN_MAILBOX_TO_USE 2 - -#define DEFAULT_RETRY_LIMIT 3 - - -#define M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE 64 -uint8_t m0_firmware_temp_buffer[M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE]; - -#define STM32_BOOTLOADER_TEST_CODE 0 - -#if CAN_BOOTLOADER_ENABLE_SERIAL_DEBUG -#define can_bl_api_print_rx_frame(a, b, c, d) can_api_print_rx_frame(a, b, c, d) -#define can_bl_api_print_tx_frame(a, b, c, d) can_api_print_tx_frame(a, b, c, d) -#else -#define can_bl_api_print_rx_frame(a, b, c, d) -#define can_bl_api_print_tx_frame(a, b, c, d) -#endif - - -#define ORESAT_F0_FLASH_START_ADDRESS 0x08000000 -#define ORESAT_F0_FIRMWARE_CRC_ADDRESS 0x0800A7F4 -#define ORESAT_F0_FIRMWARE_CODE_ADDRESS 0x0800A804 - -/** - * Used to fully initialize a can_bootloader_config_t structure. - * - * @param *canp Pointer to can driver object - * @param *chp Pointer to debug output serial stream - * @param low_cpu_id Use for matching to the lower order 32 bits of the unique CPU id of a given M0 node. - * @param stm32_bootloader_mode Flag to indicate if the target is at stm32 CAN bootloader rather then an ORESAT bootloader (stm32 bootloader not currently supported) - * - * @return true on success, false otherwise. - */ -bool can_api_init_can_bootloader_config_t(can_bootloader_config_t *can_bl_config, CANDriver *canp, BaseSequentialStream *chp, const uint32_t low_cpu_id, const bool stm32_bootloader_mode, void *read_function_arg0) { - if (can_bl_config == NULL) { - return (false); - } - memset(can_bl_config, 0, sizeof(*can_bl_config)); - - can_bl_config->canp = canp; - can_bl_config->chp = chp; - can_bl_config->low_cpu_id = low_cpu_id; - can_bl_config->stm32_bootloader_mode = stm32_bootloader_mode; - can_bl_config->read_function_arg0 = read_function_arg0; - - return (true); -} - -/** - * Helper functino to - */ -void print_can_bootloader_config_t(BaseSequentialStream *chp, can_bootloader_config_t *can_bl_config) { - chprintf(chp, "can_bootloader_config_t:\r\n"); - chprintf(chp, " low_cpu_id: 0x%X\r\n", can_bl_config->low_cpu_id); - chprintf(chp, " stm32_bootloader_mode: %u\r\n", can_bl_config->stm32_bootloader_mode); - chprintf(chp, " read_fail_count: %u\r\n", can_bl_config->read_fail_count); - chprintf(chp, " write_fail_count: %u\r\n", can_bl_config->write_fail_count); - chprintf(chp, " erase_fail_count: %u\r\n", can_bl_config->erase_fail_count); - chprintf(chp, " verify_fail_count: %u\r\n", can_bl_config->verify_fail_count); - chprintf(chp, " ack_count: %u\r\n", can_bl_config->ack_count); - chprintf(chp, " nack_count: %u\r\n", can_bl_config->nack_count); - chprintf(chp, " unknown_count: %u\r\n", can_bl_config->unknown_count); - chprintf(chp, " can_tx_fail_count: %u\r\n", can_bl_config->can_tx_fail_count); - chprintf(chp, " initiate_connection_count: %u\r\n", can_bl_config->initiate_connection_count); - chprintf(chp, " connection_verify_fail: %u\r\n", can_bl_config->connection_verify_fail); - chprintf(chp, " update_duration_ms: %u\r\n", can_bl_config->update_duration_ms); -} - -void can_api_print_rx_frame(BaseSequentialStream *chp, CANRxFrame *msg, const char *pre_msg, const char *post_msg) { - chprintf(chp, "RX Frame: %s ", pre_msg); - - chprintf(chp, "SID = 0x%X ", msg->SID); - chprintf(chp, "DLC = %u ", msg->DLC); - chprintf(chp, "RTR = %u ", msg->RTR); - chprintf(chp, "IDE = %u ", msg->IDE); - - chprintf(chp, "[ "); - for(int i = 0; i < msg->DLC; i++ ) { - chprintf(chp, "0x%X ", msg->data8[i]); - } - chprintf(chp, "] "); - - chprintf(chp, "%s", post_msg); - chprintf(chp, "\r\n"); -} - - - - -void can_api_print_tx_frame(BaseSequentialStream *chp, CANTxFrame *msg, const char *pre_msg, const char *post_msg) { - chprintf(chp, "TX Frame: %s ", pre_msg); - - chprintf(chp, "SID = 0x%X ", msg->SID); - chprintf(chp, "DLC = %u ", msg->DLC); - chprintf(chp, "RTR = %u ", msg->RTR); - chprintf(chp, "IDE = %u ", msg->IDE); - - chprintf(chp, "[ "); - for(int i = 0; i < msg->DLC; i++ ) { - chprintf(chp, "0x%X ", msg->data8[i]); - } - chprintf(chp, "] "); - - chprintf(chp, "%s", post_msg); - chprintf(chp, "\r\n"); -} - - -msg_t can_api_receive2(can_bootloader_config_t *can_bl_config, CANRxFrame *msg, const uint32_t timeout_ms, const char *pre_msg, const char *post_msg) { - CANDriver *canp = can_bl_config->canp; - - msg_t r = canReceive(canp, CAN_MAILBOX_TO_USE, msg, TIME_MS2I(timeout_ms)); - if( r == MSG_OK ) { - can_bl_api_print_rx_frame(can_bl_config->chp, msg, pre_msg, post_msg); - } - return(r); -} - -msg_t can_api_receive(can_bootloader_config_t *can_bl_config, CANRxFrame *msg, const uint32_t timeout_ms) { - return(can_api_receive2(can_bl_config, msg, timeout_ms, "", "")); -} - -void can_api_purge_rx_buffer(can_bootloader_config_t *can_bl_config) { - CANRxFrame msg; - uint32_t timeout = 5; - if( can_bl_config->stm32_bootloader_mode ) { - timeout = 50; - } - - for(int i = 0; i < 3; i++ ) { - if( can_api_receive2(can_bl_config, &msg, timeout, "", "PURGED") != MSG_OK ) { - //break; - } - } -} - -msg_t can_api_transmit(can_bootloader_config_t *can_bl_config, CANTxFrame *msg, const uint32_t timeout_ms) { - CANDriver *canp = can_bl_config->canp; - - const msg_t r = canTransmit(canp, CAN_MAILBOX_TO_USE, msg, TIME_MS2I(timeout_ms)); - if( r == MSG_OK ) { - can_bl_api_print_tx_frame(can_bl_config->chp, msg, "", " - SUCCESS"); - } else { - can_bl_api_print_tx_frame(can_bl_config->chp, msg, "", " - FAIL"); - can_bl_config->can_tx_fail_count++; - } - return(r); -} - -#if STM32_BOOTLOADER_TEST_CODE -bool can_bootloader_tx_garbage_frame(can_bootloader_config_t *can_bl_config) { - if( ! can_bl_config->stm32_bootloader_mode ) { - return(true); - } - - CANTxFrame msg; - memset(&msg, 0, sizeof(msg)); - msg.SID = 0x99; - if( can_api_transmit(can_bl_config, &msg, 100) == MSG_OK ) { - return(true); - } - - return(false); -} -#endif - -/** - * Used to put the M0 bootloader or STM32 bootloader into actual bootloader mode such that the device can be flashed. - * - * @return true if the remote device was put into bootloader mode, false otherwise. - */ -bool can_bootloader_initiate(can_bootloader_config_t *can_bl_config, const uint32_t timeout_ms) { - BaseSequentialStream *chp = can_bl_config->chp; - - if( can_bl_config->stm32_bootloader_mode ) { - //Note: The STM32 bootloader expects the CAN peripheral bitrate to be configured to 125kbit. - const uint32_t rx_read_timeout_ms = 50; - const uint32_t max_retrys = timeout_ms / rx_read_timeout_ms; - - for(uint32_t retry_count = 0; retry_count < max_retrys; retry_count++ ) { - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = STM32_BOOTLOADER_CAN_ACK; - tx_msg.DLC = 8; - memset(&tx_msg.data8[0], 0x55, sizeof(tx_msg.data8)); - - msg_t r = can_api_transmit(can_bl_config, &tx_msg, 50); - - if( r == MSG_OK ) { - chprintf(chp, "Sent STM32 CAN bootloader initialization frame...\r\n"); - CANRxFrame msg; - memset(&msg, 0, sizeof(msg)); - r = can_api_receive(can_bl_config, &msg, rx_read_timeout_ms); - - if( r == MSG_OK ) { - chprintf(chp, "Got response from STM32 CAN bootloader...\r\n"); - can_bl_api_print_rx_frame(chp, &msg, "", ""); - if( msg.SID == STM32_BOOTLOADER_CAN_ACK ) { - chprintf(chp, "Successfully put remote STM32 devices into CAN bootloader mode!\r\n"); - //chThdSleepMilliseconds(5000); - return(true); - } - break; - - } else { - chprintf(chp, "No response from STM32 CAN bootloader...\r\n"); - } - - } else { - chprintf(chp, "Failed to send STM32 CAN bootloader initialization frame...\r\n"); - } - } - - } else { - CANRxFrame msg; - memset(&msg, 0, sizeof(msg)); - msg_t r = can_api_receive(can_bl_config, &msg, timeout_ms); - if( r == MSG_OK ) { - if( msg.SID == STM32_BOOTLOADER_CAN_ANNOUNCE && msg.DLC == 8 ) { - - if( msg.data8[0] == 0x01 && msg.data8[1] == 0x02 && msg.data8[2] == 0x03 && msg.data8[3] == 0x04 ) { - const uint32_t remote_low_cpu_id = (msg.data8[4] << 24) | (msg.data8[5] << 16) | (msg.data8[6] << 8) | (msg.data8[7] << 0); - chprintf(chp, "Remote CPU ID Low = 0x%X\r\n", remote_low_cpu_id); - - if( can_bl_config->low_cpu_id == 0 || remote_low_cpu_id == can_bl_config->low_cpu_id ) { - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = BOOTLOADER_EXPECTED_FIRST_FRAME_ID; - tx_msg.DLC = 8; - tx_msg.data8[0] = msg.data8[4]; - tx_msg.data8[1] = msg.data8[5]; - tx_msg.data8[2] = msg.data8[6]; - tx_msg.data8[3] = msg.data8[7]; - tx_msg.data8[4] = 0x01; - tx_msg.data8[5] = 0x02; - tx_msg.data8[6] = 0x03; - tx_msg.data8[7] = 0x04; - - r = can_api_transmit(can_bl_config, &tx_msg, 100); - if( r == MSG_OK ) { - chprintf(chp, "Successfully put remote node into bootloader mode...\r\n"); - can_bl_config->initiate_connection_count++; - return(true); - } - } else { - chprintf(chp, "Remote CPU ID did not match target CPU ID: 0x%X != 0x%X\r\n", can_bl_config->low_cpu_id, remote_low_cpu_id); - } - - } - } - } else { - chprintf(chp, "Failed to receive CAN frame to initiate CAN bootloader on a device...\r\n"); - } - } - return(false); -} - -/** - * Used to wait for an ACK or NACK from the remote bootloader. - * - * @param sid_match The command SID to for which we are expecting to read an ACK for. - * - * @return true if ACK for the given SID was received, false if a NACK or unknown frame was received. - */ -bool can_bootloader_wait_for_ack(can_bootloader_config_t *can_bl_config, const uint32_t sid_match) { - BaseSequentialStream *chp = can_bl_config->chp; - - CANRxFrame rx_msg; - memset(&rx_msg, 0, sizeof(rx_msg)); - - for(uint32_t retry_count = 0; retry_count < 3; retry_count++) { - msg_t r = can_api_receive2(can_bl_config, &rx_msg, 1000, "", "expecting ACK/NACK"); - if( r == MSG_OK ) { - if( rx_msg.SID == sid_match && rx_msg.data8[0] == STM32_BOOTLOADER_CAN_ACK ) { - can_bl_api_print_rx_frame(chp, &rx_msg, "", " - got ACK"); - can_bl_config->ack_count++; - return(true); - } else if( rx_msg.SID == sid_match && rx_msg.data8[0] == STM32_BOOTLOADER_CAN_NACK ) { - can_bl_api_print_rx_frame(chp, &rx_msg, "", " - got NACK"); - can_bl_config->nack_count++; - return(false); - } else { - can_bl_api_print_rx_frame(chp, &rx_msg, "", " - UNKNOWN"); - can_bl_config->unknown_count++; - } - - } else { - chprintf(chp, "Failed to get CAN frame while waiting for ACK/NACK for 0x%X\r\n", sid_match); - } - } - return(false); -} - -#if STM32_BOOTLOADER_TEST_CODE -bool can_bootloader_wait_for_ack_with_garbage(can_bootloader_config_t *can_bl_config, const uint32_t sid_match) { - if( can_bl_config->stm32_bootloader_mode ) { - for(int i = 0; i < 5; i++ ) { - if( can_bootloader_wait_for_ack(can_bl_config, sid_match) ) { - return(true); - } - can_bootloader_tx_garbage_frame(can_bl_config); - } - } else { - return(can_bootloader_wait_for_ack_with_garbage(can_bl_config, sid_match)); - } - - return(false); -} -#endif - -/** - * Reads data from a given address from the remote device that is in bootloader mode. - * - * @param memory_addres The base memory address to start reading data from - * @param num_bytes_to_read The number of bytes to read. - * @param *dest_buffer The destination buffer into which to store the data. - * @param dest_buffer_length The maximum length of the destination buffer. - * - * @return true If data was successfully read, false otherwise. - */ -bool can_bootloader_read_data(can_bootloader_config_t *can_bl_config, const uint32_t memory_address, const uint32_t num_bytes_to_read, uint8_t *dest_buffer, const uint32_t dest_buffer_length) { - BaseSequentialStream *chp = can_bl_config->chp; - - //can_api_purge_rx_buffer(canp, chp); - chprintf(chp, "can_bootloader_read_data(0x%X, %u)\r\n", memory_address, num_bytes_to_read); - - msg_t r = 0; - - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = ORESAT_BOOTLOADER_CAN_COMMAND_READ_MEMORY; - tx_msg.DLC = 5; - tx_msg.data8[0] = (memory_address >> 24) & 0xFF; - tx_msg.data8[1] = (memory_address >> 16) & 0xFF; - tx_msg.data8[2] = (memory_address >> 8) & 0xFF; - tx_msg.data8[3] = (memory_address >> 0) & 0xFF; - tx_msg.data8[4] = num_bytes_to_read - 1; - - if( (r = can_api_transmit(can_bl_config, &tx_msg, 100)) != MSG_OK ) { - return(false); - } - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_READ_MEMORY) ) { - return(false); - } - - uint32_t expected_frame_count = num_bytes_to_read / 8; - if( num_bytes_to_read % 8 > 0 ) { - expected_frame_count++; - } - - //chprintf(chp, "expected_frame_count = %u\r\n", expected_frame_count); - - uint32_t dest_buffer_index = 0; - for(uint32_t i = 0; i < expected_frame_count; i++) { - CANRxFrame rx_msg; - memset(&rx_msg, 0, sizeof(rx_msg)); - msg_t r = can_api_receive(can_bl_config, &rx_msg, 1000); - if( r == MSG_OK ) { - for(uint32_t j = 0; j < rx_msg.DLC && dest_buffer_index < dest_buffer_length && j < sizeof(rx_msg.data8); j++ ) { - dest_buffer[dest_buffer_index] = rx_msg.data8[j]; - dest_buffer_index++; - } - } - } - - //chprintf(chp, "final dest_buffer_index = %u\r\n", dest_buffer_index); - - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_READ_MEMORY) ) { - return(false); - } - -#if CAN_BOOTLOADER_ENABLE_SERIAL_DEBUG - chprintf(chp, "Successfully read memory from remote device...\r\n"); - for(uint32_t i = 0; i < dest_buffer_index; i++ ) { - chprintf(chp, " 0x%X", dest_buffer[i]); - } - chprintf(chp, "\r\n\r\n"); -#endif - - return(true); -} - -/** - * Erases a given page (sometimes also refered to as sector, depending on the device type) of flash on the remote device. - * - * @page_number The page number of flash to be erased. - * - * @return true on success, false otherwise. - */ -bool can_bootloader_erase_page(can_bootloader_config_t *can_bl_config, const uint32_t page_number) { - BaseSequentialStream *chp = can_bl_config->chp; - -#if CAN_BOOTLOADER_ENABLE_SERIAL_DEBUG - chprintf(chp, "\r\ncan_bootloader_erase_page(%u)\r\n", page_number); -#endif - msg_t r = 0; - - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = ORESAT_BOOTLOADER_CAN_COMMAND_ERASE; - tx_msg.DLC = 2; - tx_msg.data8[0] = 0; - tx_msg.data8[1] = page_number; - - - if( (r = can_api_transmit(can_bl_config, &tx_msg, 100)) != MSG_OK ) { - return(false); - } - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_ERASE) ) { - return(false); - } - - - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_ERASE) ) { - return(false); - } - - chprintf(chp, "Successfully erased page %u on remote device\r\n", page_number); - return(true); -} - -/** - * TODO document this - * - * @return true on success, false otherwise. - */ -bool can_bootloader_set_opt_data(can_bootloader_config_t *can_bl_config, const uint8_t data_0_value, const uint8_t data_1_value) { -#if CAN_BOOTLOADER_ENABLE_SERIAL_DEBUG - chprintf(can_bl_config->chp, "can_bootloader_set_opt_data(0x%X, 0x%X)\r\n", data_0_value, data_1_value); -#endif - msg_t r = 0; - - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = ORESAT_BOOTLOADER_CAN_COMMAND_SET_OPT_DATA; - tx_msg.DLC = 2; - tx_msg.data8[0] = data_0_value; - tx_msg.data8[1] = data_1_value; - - - if( (r = can_api_transmit(can_bl_config, &tx_msg, 100)) != MSG_OK ) { - return(false); - } - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_SET_OPT_DATA) ) { - return(false); - } - - - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_SET_OPT_DATA) ) { - return(false); - } - - chprintf(can_bl_config->chp, "Successfully set data 0 and data 1 on remote node to 0x%X and 0x%X\r\n", data_0_value, data_1_value); - return(true); -} - - - -/** - * Writes to flash memory on the remote device. - * - * @param memory_address Base memory address to start writing to. - * @param *src_buffer The data to be written to flash on the remote device. - * @param num_bytes The number of bytes to write - * - * @return true on success, false otherwise. - */ -bool can_bootloader_write_memory(can_bootloader_config_t *can_bl_config, const uint32_t memory_address, const uint8_t *src_buffer, const uint32_t num_bytes) { - BaseSequentialStream *chp = can_bl_config->chp; - - chprintf(chp, "can_bootloader_write_memory(., 0x%X, ., %u)\r\n", memory_address, num_bytes); - - msg_t r = 0; - - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_MEMORY; - tx_msg.DLC = 5; - tx_msg.data8[0] = (memory_address >> 24) & 0xFF; - tx_msg.data8[1] = (memory_address >> 16) & 0xFF; - tx_msg.data8[2] = (memory_address >> 8) & 0xFF; - tx_msg.data8[3] = (memory_address >> 0) & 0xFF; - tx_msg.data8[4] = num_bytes; - - - if( (r = can_api_transmit(can_bl_config, &tx_msg, 100)) != MSG_OK ) { - return(false); - } - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_MEMORY) ) { - chprintf(chp, "Failed waiting for ACK in can_bootloader_write_memory()\r\n"); - return(false); - } - - - uint32_t idx = 0; - while(1) { - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = CAN_BOOTLOADER_WRITE_MEMORY_RESPONSE_SID; - - while( idx < num_bytes && tx_msg.DLC < 8 ) { - tx_msg.data8[tx_msg.DLC] = src_buffer[idx]; - tx_msg.DLC++; - idx++; - } - - if( tx_msg.DLC > 0 ) { - if( (r = can_api_transmit(can_bl_config, &tx_msg, 100)) != MSG_OK ) { - return(false); - } - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_MEMORY) ) { - chprintf(chp, "Failed waiting for ACK in can_bootloader_write_memory() - 2\r\n"); - return(false); - } - } else { - break; - } - } - - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_MEMORY) ) { - chprintf(chp, "Failed waiting for ACK in can_bootloader_write_memory() - 3\r\n"); - return(false); - } - - //chprintf(chp, "Successfully wrote memory on remote device...\r\n"); - - return(true); -} - -/** - * Causes the remote device to start executing code from the given address. For M0 based bootloaders, this just causes a reset. - * - * @return true on success, false otherwise. - */ -bool can_bootloader_go(can_bootloader_config_t *can_bl_config, const uint32_t memory_address) { - msg_t r = 0; - - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = ORESAT_BOOTLOADER_CAN_COMMAND_GO; - tx_msg.DLC = 4; - tx_msg.data8[0] = (memory_address >> 24) & 0xFF; - tx_msg.data8[1] = (memory_address >> 16) & 0xFF; - tx_msg.data8[2] = (memory_address >> 8) & 0xFF; - tx_msg.data8[3] = (memory_address >> 0) & 0xFF; - - - if( (r = can_api_transmit(can_bl_config, &tx_msg, 100)) != MSG_OK ) { - return(false); - } - if( ! can_bootloader_wait_for_ack(can_bl_config, ORESAT_BOOTLOADER_CAN_COMMAND_GO) ) { - return(false); - } - - return(true); -} - -/** - * Function for development and testing of this API. - */ -#if 0 -bool can_bootloader_test(can_bootloader_config_t *can_bl_config) { - BaseSequentialStream *chp = can_bl_config->chp; - - if( ! can_bootloader_initiate(can_bl_config, 4000) ) { - chprintf(chp, "Failed to put node into bootloader mode...\r\n"); - return(false); - } - uint32_t test_memory_address = 0x800A000; - if( can_bl_config->stm32_bootloader_mode ) { - test_memory_address = 0x8000000; - } - - //bool can_bootloader_read_data(CANDriver *canp, const uint32_t memory_address, const uint32_t num_bytes_to_read, uint8_t *dest_buffer, const uint32_t dest_buffer_length, BaseSequentialStream *chp) { - static uint8_t temp_buffer[128]; - if( ! can_bootloader_read_data(can_bl_config, 0x8000000, 4, temp_buffer, sizeof(temp_buffer)) ) { - return(false); - } - - if( can_bl_config->stm32_bootloader_mode ) { - if( ! can_bootloader_erase_page(can_bl_config, 0) ) { - return(false); - } - } else { - if( ! can_bootloader_erase_page(can_bl_config, 20) ) { - return(false); - } - } - - if( ! can_bootloader_read_data(can_bl_config, 0x8000000, 4, temp_buffer, sizeof(temp_buffer)) ) { - return(false); - } - - temp_buffer[0] = 0x0D; - temp_buffer[1] = 0x0E; - temp_buffer[2] = 0x0A; - temp_buffer[3] = 0x0D; - temp_buffer[4] = 0x0B; - temp_buffer[5] = 0x0E; - temp_buffer[6] = 0x0E; - temp_buffer[7] = 0x0F; - if( ! can_bootloader_write_memory(can_bl_config, test_memory_address, temp_buffer, 4) ) { - return(false); - } - - if( ! can_bootloader_read_data(can_bl_config, 0x8000000, 4, temp_buffer, sizeof(temp_buffer)) ) { - return(false); - } - -#if 0 - if( ! can_bootloader_read_data(can_bl_config, test_memory_address, 16, temp_buffer, sizeof(temp_buffer)) ) { - return(false); - } - - if( ! can_bootloader_go(can_bl_config, test_memory_address) ) { - return(false); - } -#endif - - return(true); -} -#endif - -/** - * Used to validate communication to a remote bootloader device. - * - * @return true if the remote device is responding in bootloader mode, false otherwise. - */ -bool can_bootloader_check_communication(can_bootloader_config_t *can_bl_config) { - can_api_purge_rx_buffer(can_bl_config); - - uint8_t trash_buffer[8]; - - if( ! can_bootloader_read_data(can_bl_config, ORESAT_F0_FIRMWARE_CRC_ADDRESS, sizeof(trash_buffer), trash_buffer, sizeof(trash_buffer))) { - return(false); - } - - return(true); -} - -/** - * Verify and re-initiate the connection to the M0 cpu if it powered off mid process - */ -bool can_bootloader_verify_retry_connection(can_bootloader_config_t *can_bl_config) { - for(int i = 0; i < 5; i++ ) { - if( can_bootloader_check_communication(can_bl_config) ) { - return(true); - } else { - if( can_bootloader_initiate(can_bl_config, 15000) ) { - return(true); - } - } - } - - can_bl_config->connection_verify_fail++; - - return(false); -} - -/** - * Wrapped to deal with solar cards that power on and off at variable times. - */ -bool can_bootloader_erase_page_reliable(can_bootloader_config_t *can_bl_config, const uint32_t page_number) { - for (int i = 0; i < DEFAULT_RETRY_LIMIT; i++) { - if(can_bootloader_erase_page(can_bl_config, page_number)) { - return (true); - } - can_bl_config->erase_fail_count++; - - if( ! can_bootloader_verify_retry_connection(can_bl_config) ) { - return(false); - } - } - - return (false); -} - -/** - * Wrapped to deal with solar cards that power on and off at variable times. - */ -bool can_bootloader_write_memory_reliable(can_bootloader_config_t *can_bl_config, const uint32_t memory_address, const uint8_t *src_buffer, const uint32_t num_bytes) { - for (int i = 0; i < DEFAULT_RETRY_LIMIT; i++) { - if (can_bootloader_write_memory(can_bl_config, memory_address, src_buffer, num_bytes)) { - return (true); - } - can_bl_config->write_fail_count++; - if( ! can_bootloader_verify_retry_connection(can_bl_config) ) { - return(false); - } - } - - return (false); -} - -/** - * Wrapped to deal with solar cards that power on and off at variable times. - */ -bool can_bootloader_read_data_reliable(can_bootloader_config_t *can_bl_config, const uint32_t memory_address, const uint32_t num_bytes_to_read, uint8_t *dest_buffer, const uint32_t dest_buffer_length) { - for (int i = 0; i < DEFAULT_RETRY_LIMIT; i++) { - if(can_bootloader_read_data(can_bl_config, memory_address, num_bytes_to_read, dest_buffer, dest_buffer_length)) { - return(true); - } - can_bl_config->read_fail_count++; - - if( ! can_bootloader_verify_retry_connection(can_bl_config) ) { - return(false); - } - } - - return(false); -} - -/** - * Wrapped to deal with solar cards that power on and off at variable times. - */ -bool can_bootloader_verify_memory_reliable(can_bootloader_config_t *can_bl_config, const uint32_t base_memory_address, const uint8_t *src_buffer, const uint32_t num_bytes) -{ - BaseSequentialStream *chp = can_bl_config->chp; - - chprintf(chp, "Verifying %u bytes at address 0x%X\r\n", num_bytes, base_memory_address); - - uint8_t temp_buff[16]; - - uint32_t current_offset = 0; - //uint32_t current_offset2 = 0; - while(current_offset < num_bytes) { - if( ! can_bootloader_read_data_reliable(can_bl_config, base_memory_address + current_offset, sizeof(temp_buff), temp_buff, sizeof(temp_buff))) { - return(false); - } -#if 0 - for(uint32_t i = 0; i < sizeof(temp_buff) && current_offset2 < num_bytes; i++ ) { - chprintf(chp, "0x%X 0x%X\r\n", src_buffer[current_offset2], temp_buff[i]); - current_offset2++; - } -#endif - - for( uint32_t i = 0; i < sizeof(temp_buff) && current_offset < num_bytes; i++ ) { - if( src_buffer[current_offset] != temp_buff[i] ) { - chprintf(chp, "ERROR: Failed verification! 0x%X != 0x%X, %u, %u\r\n", src_buffer[current_offset], temp_buff[i], current_offset, i); - return(false); - } - - current_offset++; - } - } - - return(true); -} - -/** - * Writes a subsection of a firmware image to a remote node. - * - * @param *can_bl_config Configuration structure pointer for the bootloader update process. - * @param base_address Address from which to start the firmware update - * @param start_byte_offset Offset from which to start writing. - * @param total_firmware_length_bytes Number of bytes to write - * @param read_function_pointer Function pointer that will return chucks of data from a given offset and length to be written to the remote device. - * - * @return true upon success, false otherwise. - */ -bool oresat_firmware_update_m0_write_subsection(can_bootloader_config_t *can_bl_config, const uint32_t base_address, const uint32_t start_byte_offset, const uint32_t total_firmware_length_bytes, firmware_read_function_ptr_t read_function_pointer) { - - uint32_t current_file_offset = start_byte_offset;//0; - - while (current_file_offset < total_firmware_length_bytes) { - uint32_t bytes_to_write_to_flash = M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE; - if( (current_file_offset + bytes_to_write_to_flash) > total_firmware_length_bytes ) { - bytes_to_write_to_flash = total_firmware_length_bytes - current_file_offset; - if( bytes_to_write_to_flash > M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE ) { - bytes_to_write_to_flash = M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE; - } - } - - if( ! read_function_pointer(current_file_offset, m0_firmware_temp_buffer, bytes_to_write_to_flash, can_bl_config->read_function_arg0) ) { - chprintf(can_bl_config->chp, "failed oresat_firmware_update_m0_write_subsection()\r\n"); - return(false); - } - - if( ! can_bootloader_write_memory_reliable(can_bl_config, (base_address + current_file_offset), m0_firmware_temp_buffer, bytes_to_write_to_flash) ) { - chprintf(can_bl_config->chp, "failed can_bootloader_write_memory_reliable()\r\n"); - return(false); - } - - current_file_offset += bytes_to_write_to_flash; - } - - return(true); -} - - -/** - * Verifies a sub-section of the firmware image on the remote node. - * - * @param *can_bl_config Configuration structure pointer for the bootloader update process. - * @param base_address Address from which to start the firmware update - * @param start_byte_offset Offset from which to start writing. - * @param total_firmware_length_bytes Number of bytes to write - * @param read_function_pointer Function pointer that will return chucks of data from a given offset and length to be written to the remote device. - * - * @return true upon success, false otherwise. - */ -bool oresat_firmware_update_m0_verify_subsection(can_bootloader_config_t *can_bl_config, const uint32_t base_address, const uint32_t start_byte_offset, const uint32_t total_firmware_length_bytes, firmware_read_function_ptr_t read_function_pointer) { - uint32_t current_file_offset = start_byte_offset;//0; - - while (current_file_offset < total_firmware_length_bytes) { - uint32_t bytes_to_write_to_flash = M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE; - if( (current_file_offset + bytes_to_write_to_flash) > total_firmware_length_bytes ) { - bytes_to_write_to_flash = total_firmware_length_bytes - current_file_offset; - if( bytes_to_write_to_flash > M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE ) { - bytes_to_write_to_flash = M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE; - } - } - - if( ! read_function_pointer(current_file_offset, m0_firmware_temp_buffer, bytes_to_write_to_flash, can_bl_config->read_function_arg0) ) { - chprintf(can_bl_config->chp, "failed oresat_firmware_update_m0_write_subsection()\r\n"); - return(false); - } - - if( ! can_bootloader_verify_memory_reliable(can_bl_config, (base_address + current_file_offset), m0_firmware_temp_buffer, bytes_to_write_to_flash) ) { - chprintf(can_bl_config->chp, "failed can_bootloader_verify_memory_reliable()\r\n"); - return(false); - } - - current_file_offset += bytes_to_write_to_flash; - } - - return(true); -} - - - -/** - * Updates firmware on an M0 node - * - * @param *can_bl_config Configuration structure pointer for the bootloader update process. - * @param base_address Address from which to start the firmware update - * @param start_byte_offset Offset from which to start writing. - * @param total_firmware_length_bytes Number of bytes to write - * @param read_function_pointer Function pointer that will return chucks of data from a given offset and length to be written to the remote device. - * - * @return true upon success, false otherwise. - */ -bool oresat_firmware_update_m0(can_bootloader_config_t *can_bl_config, const uint32_t base_address, const uint32_t total_firmware_length_bytes, firmware_read_function_ptr_t read_function_pointer) { - const systime_t start_time = TIME_I2MS(chVTGetSystemTime()); - - BaseSequentialStream *chp = can_bl_config->chp; - - chprintf(chp, "Trying to put node into bootloader mode...\r\n"); - chThdSleepMilliseconds(10); - - // CAN FIFO 1 on the C3 Node will almost certainly have some cruft bootloader related can messages in it that need to be discarded - can_api_purge_rx_buffer(can_bl_config); - - if( ! can_bootloader_initiate(can_bl_config, 5000) ) { - chprintf(chp, "Failed to put node into bootloader mode...\r\n"); - return(false); - } else { - chprintf(chp, "Successfully put node into bootloader mode...\r\n"); - } - - - uint32_t temp_address = base_address; - while(temp_address <= (base_address + total_firmware_length_bytes) ) { - uint32_t page_number = (temp_address - ORESAT_F0_FLASH_START_ADDRESS) / ORESAT_F0_FLASH_PAGE_SIZE; - if( can_bl_config->stm32_bootloader_mode ) { - //proxy for STM32F407 CPU - page_number = 0; - } - - - if( ! can_bootloader_erase_page_reliable(can_bl_config, page_number) ) { - return(false); - } - - temp_address += ORESAT_F0_FLASH_PAGE_SIZE; - } - - - //Initially skip the meta-data portion so that if the node power cycle mid update, the bootloader will not try to CRC check the whole image - if( ! oresat_firmware_update_m0_write_subsection(can_bl_config, base_address, M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE, total_firmware_length_bytes, read_function_pointer) ) { - return(false); - } - - if( ! oresat_firmware_update_m0_verify_subsection(can_bl_config, base_address, M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE, total_firmware_length_bytes, read_function_pointer) ) { - return(false); - } - - //Write the CRC portion last - if( ! oresat_firmware_update_m0_write_subsection(can_bl_config, base_address, 0, M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE, read_function_pointer) ) { - return(false); - } - - if( ! oresat_firmware_update_m0_verify_subsection(can_bl_config, base_address, 0, M0_FIRMWARE_UPDATE_WRITE_CHUNK_SIZE, read_function_pointer) ) { - return(false); - } - - - can_bootloader_go(can_bl_config, ORESAT_F0_FIRMWARE_CODE_ADDRESS); - - can_bl_config->update_duration_ms = TIME_I2MS(chVTGetSystemTime()) - start_time; - - chprintf(chp, "\r\nSuccessfully wrote and verified firmware image to remote MCU device...\r\n\r\n"); - - return(true); -} - -/** - * Helper function for enum to string mapping - */ -const char* oresat_bootloader_can_command_t_to_str(const oresat_bootloader_can_command_t v) { - switch (v) { - case ORESAT_BOOTLOADER_CAN_COMMAND_GET: - return ("ORESAT_BOOTLOADER_CAN_COMMAND_GET"); - case ORESAT_BOOTLOADER_CAN_COMMAND_READ_MEMORY: - return ("ORESAT_BOOTLOADER_CAN_COMMAND_READ_MEMORY"); - case ORESAT_BOOTLOADER_CAN_COMMAND_GO: - return ("ORESAT_BOOTLOADER_CAN_COMMAND_GO"); - case ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_MEMORY: - return ("ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_MEMORY"); - case ORESAT_BOOTLOADER_CAN_COMMAND_ERASE: - return ("ORESAT_BOOTLOADER_CAN_COMMAND_ERASE"); - case ORESAT_BOOTLOADER_CAN_COMMAND_SET_OPT_DATA: - return("ORESAT_BOOTLOADER_CAN_COMMAND_SET_OPT_DATA"); - } - - if( v == STM32_BOOTLOADER_CAN_ACK ) { - return("ACK"); - } - if( v == STM32_BOOTLOADER_CAN_NACK ) { - return("NACK"); - } - - return ("???"); -} - - diff --git a/common/can_hw.c b/common/can_hw.c deleted file mode 100644 index a4c88e64..00000000 --- a/common/can_hw.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "can_hw.h" - - diff --git a/common/fram.c b/common/fram.c deleted file mode 100644 index 08d71663..00000000 --- a/common/fram.c +++ /dev/null @@ -1,297 +0,0 @@ -/** - * @file fram.c - * @brief FRAM Driver Implementation. - * - * @addtogroup FRAM - * @ingrup ORESAT - * @{ - */ - -#include -#include "hal.h" -#include "fram.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ -#define BLOCK_SIZE 512U - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ -FRAMDriver FRAMD1; - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -typedef union { - struct __attribute__((packed)) { - uint16_t addr; - uint8_t data[BLOCK_SIZE]; - }; - uint8_t buf[sizeof(uint16_t) + BLOCK_SIZE]; -} i2cbuf_t; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -#if (FRAM_USE_I2C) || defined(__DOXYGEN__) -/** - * @brief Reads F-RAM memory using I2C. - * @pre The I2C interface must be initialized and the driver started. - * - * @param[in] i2cp pointer to the I2C interface - * @param[in] saddr slave address without R bit - * @param[in] addr address - * @param[out] rxbuf pointer to an output buffer - * @param[in] n number of consecutive bytes to read - * @return the operation status. - * @notapi - */ -msg_t framI2CReadAddr(I2CDriver *i2cp, i2caddr_t saddr, uint16_t addr, uint8_t* rxbuf, size_t n) -{ - addr = __REVSH(addr); - return i2cMasterTransmitTimeout(i2cp, saddr, (uint8_t*)(&addr), sizeof(addr), rxbuf, n, TIME_INFINITE); -} - -/** - * @brief Writes F-RAM memory using I2C. - * @pre The I2C interface must be initialized and the driver started. - * - * @param[in] i2cp pointer to the I2C interface - * @param[in] saddr slave address without R bit - * @param[in] addr address - * @param[in] txbuf buffer containing data - * @param[in] n number of consecutive bytes to write - * @return the operation status. - * @notapi - */ -msg_t framI2CWriteAddr(I2CDriver *i2cp, i2caddr_t saddr, uint16_t addr, uint8_t *txbuf, size_t n) -{ - i2cbuf_t i2cbuf; - size_t size, offset = 0; - msg_t ret; - - while (n) { - size = (n < BLOCK_SIZE ? n : BLOCK_SIZE); - i2cbuf.addr = __REVSH(addr + offset); - memcpy(i2cbuf.data, &txbuf[offset], size); - ret = i2cMasterTransmitTimeout(i2cp, saddr, i2cbuf.buf, sizeof(addr) + n, NULL, 0, TIME_INFINITE); - offset += size; - n -= size; - } - - return ret; -} -#endif /* FRAM_USE_I2C */ - -/*==========================================================================*/ -/* Interface implementation. */ -/*==========================================================================*/ - -static const struct FRAMVMT vmt_device = { - (size_t)0, -}; - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes an instance. - * - * @param[out] devp pointer to the @p FRAMDriver object - * - * @init - */ -void framObjectInit(FRAMDriver *devp) -{ - devp->vmt = &vmt_device; - - devp->config = NULL; - - devp->state = FRAM_STOP; -} - -/** - * @brief Configures and activates FRAM Complex Driver peripheral. - * - * @param[in] devp pointer to the @p FRAMDriver object - * @param[in] config pointer to the @p FRAMConfig object - * - * @api - */ -void framStart(FRAMDriver *devp, const FRAMConfig *config) -{ - osalDbgCheck((devp != NULL) && (config != NULL)); - osalDbgAssert((devp->state == FRAM_STOP) || - (devp->state == FRAM_READY), - "framStart(), invalid state"); - - devp->config = config; - - /* Configuring common registers.*/ -#if FRAM_USE_I2C -#if FRAM_SHARED_I2C - i2cAcquireBus(config->i2cp); -#endif /* FRAM_SHARED_I2C */ - - i2cStart(config->i2cp, config->i2ccfg); - -#if FRAM_SHARED_I2C - i2cReleaseBus(config->i2cp); -#endif /* FRAM_SHARED_I2C */ -#endif /* FRAM_USE_I2C */ - devp->state = FRAM_READY; -} - -/** - * @brief Deactivates the FRAM Complex Driver peripheral. - * - * @param[in] devp pointer to the @p FRAMDriver object - * - * @api - */ -void framStop(FRAMDriver *devp) -{ - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == FRAM_STOP) || (devp->state == FRAM_READY), - "framStop(), invalid state"); - - if (devp->state == FRAM_READY) { -#if FRAM_USE_I2C -#if FRAM_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* FRAM_SHARED_I2C */ - - i2cStop(devp->config->i2cp); - -#if FRAM_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* FRAM_SHARED_I2C */ -#endif /* FRAM_USE_I2C */ - } - devp->state = FRAM_STOP; -} - -/** - * @brief Reads FRAM memory. - * - * @param[in] devp pointer to the @p FRAMDriver object - * @param[in] addr the address to start reading from - * @param[out] buf the buffer to read data into - * @param[in] n number of bytes to read - * - * @api - */ -void framRead(FRAMDriver *devp, uint16_t addr, void *buf, size_t n) -{ - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->state == FRAM_READY, - "framRead(), invalid state"); - -#if FRAM_USE_I2C -#if FRAM_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* FRAM_SHARED_I2C */ - - framI2CReadAddr(devp->config->i2cp, devp->config->saddr, addr, buf, n); - -#if FRAM_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* FRAM_SHARED_I2C */ -#endif /* FRAM_USE_I2C */ - return; -} - -/** - * @brief Writes FRAM memory. - * - * @param[in] devp pointer to the @p FRAMDriver object - * @param[in] addr the address to start writing to - * @param[out] buf the buffer to read data from - * @param[in] n number of bytes to write - * - * @api - */ -void framWrite(FRAMDriver *devp, uint16_t addr, void *buf, size_t n) -{ - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->state == FRAM_READY, - "framWrite(), invalid state"); - -#if FRAM_USE_I2C -#if FRAM_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* FRAM_SHARED_I2C */ - - framI2CWriteAddr(devp->config->i2cp, devp->config->saddr, addr, buf, n); - -#if FRAM_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* FRAM_SHARED_I2C */ -#endif /* FRAM_USE_I2C */ - return; -} - -/** - * @brief Erase FRAM memory. - * - * @param[in] devp pointer to the @p FRAMDriver object - * @param[in] addr the address to start erasing from - * @param[in] n number of bytes to erase - * - * @api - */ -void framErase(FRAMDriver *devp, uint16_t addr, size_t n) -{ - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->state == FRAM_READY, - "framErase(), invalid state"); - - uint8_t buf[BLOCK_SIZE] = {0}; - size_t len, offset = addr; - - while (n) { - len = (n < BLOCK_SIZE ? n : BLOCK_SIZE); - framWrite(devp, offset, buf, len); - offset += len; - n -= len; - } - - return; -} - -/** - * @brief Erase ALL FRAM memory. - * - * @param[in] devp pointer to the @p FRAMDriver object - * - * @api - */ -void framEraseAll(FRAMDriver *devp) -{ - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->state == FRAM_READY, - "framErase(), invalid state"); - - uint8_t buf[BLOCK_SIZE] = {0}; - size_t len, offset = 0, n = FRAM_SIZE; - - while (n) { - len = (n < BLOCK_SIZE ? n : BLOCK_SIZE); - framWrite(devp, offset, buf, len); - offset += len; - n -= len; - } - - return; -} - -/** @} */ - diff --git a/common/fram.mk b/common/fram.mk deleted file mode 100644 index 66985545..00000000 --- a/common/fram.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the FRAM device files. -FRAMSRC := $(PROJ_SRC)/fram.c - -# Required include directories -FRAMINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(FRAMSRC) -ALLINC += $(FRAMINC) diff --git a/common/fs.c b/common/fs.c deleted file mode 100644 index c8f49796..00000000 --- a/common/fs.c +++ /dev/null @@ -1,1333 +0,0 @@ -/** - * @file fs.c - * @brief Filesystem driver. - * - * @addtogroup Filesystem - * @ingrup ORESAT - * @{ - */ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "fs.h" -#include "crc.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -FSDriver FSD1; - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Locks a block device. - * - * @param[in] cfg Pointer to the LFS configuration - * - * @return Negative error code on failure - * @notapi - */ -int mmc_lock(const struct lfs_config *cfg) -{ - /* Sanity checks */ - osalDbgCheck(cfg != NULL); - - FSDriver *fsp = cfg->context; - - chMtxLock(&fsp->mutex); - - return LFS_ERR_OK; -} - -/** - * @brief Unlocks a block device. - * - * @param[in] cfg Pointer to the LFS configuration - * - * @return Negative error code on failure - * @notapi - */ -int mmc_unlock(const struct lfs_config *cfg) -{ - /* Sanity checks */ - osalDbgCheck(cfg != NULL); - - FSDriver *fsp = cfg->context; - - chMtxUnlock(&fsp->mutex); - - return LFS_ERR_OK; -} - -/** - * @brief Reads a block from SDC device. - * @pre The SDC interface must be initialized and the driver started. - * - * @param[in] cfg Pointer to the LFS configuration - * @param[in] block The block to read from - * @param[in] off The offset within the block - * @param[out] buffer Pointer to an output buffer - * @param[in] size Number of consecutive bytes to read - * - * @return Negative error code on failure - * @notapi - */ -int mmc_read(const struct lfs_config *cfg, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size) -{ - /* Sanity checks */ - osalDbgCheck(cfg != NULL && buffer != NULL); - - FSDriver *fsp = cfg->context; - SDCDriver *sdcp = fsp->config->sdcp; - uint8_t buf[cfg->block_size]; - - /* Sanity checks */ - chDbgCheck(off % cfg->read_size == 0); - chDbgCheck(size % cfg->read_size == 0); - chDbgCheck(off + size <= cfg->block_size); - chDbgCheck(block < cfg->block_count); - - /* Read data from block */ - if (blkRead(sdcp, block, buf, 1) != HAL_SUCCESS) { - return LFS_ERR_IO; - } - - /* Copy the requested data to the buffer */ - memcpy(buffer, &buf[off], size); - - return LFS_ERR_OK; -} - -/** - * @brief Programs a block of an SDC device. - * @pre The SDC interface must be initialized and the driver started. - * - * @param[in] cfg Pointer to the LFS configuration - * @param[in] block The block to program - * @param[in] off The offset within the block - * @param[in] buffer Pointer to an input buffer - * @param[in] size Number of consecutive bytes to program - * - * @return Negative error code on failure - * @notapi - */ -int mmc_prog(const struct lfs_config *cfg, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size) -{ - /* Sanity checks */ - osalDbgCheck(cfg != NULL && buffer != NULL); - - FSDriver *fsp = cfg->context; - SDCDriver *sdcp = fsp->config->sdcp; - uint8_t buf[cfg->block_size]; - - /* Sanity checks */ - chDbgCheck(off % cfg->read_size == 0); - chDbgCheck(size % cfg->read_size == 0); - chDbgCheck(off + size <= cfg->block_size); - chDbgCheck(block < cfg->block_count); - - /* Read the current data from the block */ - if (blkRead(sdcp, block, buf, 1) != HAL_SUCCESS) { - return LFS_ERR_IO; - } - - /* Check if existing block already has the data */ - size_t i; - for (i = 0; i < size; i++) { - if (buf[off + i] != ((uint8_t*)buffer)[i]) { - break; - } - } - if (i == size) { - return LFS_ERR_OK; - } - - /* Copy new data */ - memcpy(&buf[off], buffer, size); - - /* Write data to block */ - if (blkWrite(sdcp, block, buf, 1) != HAL_SUCCESS) { - return LFS_ERR_IO; - } - - return LFS_ERR_OK; -} - -/** - * @brief Erase a block of an SDC device. - * @pre The SDC interface must be initialized and the driver started. - * - * @param[in] cfg Pointer to the LFS configuration - * @param[in] block The block to read from - * - * @return Negative error code on failure - * @notapi - */ -int mmc_erase(const struct lfs_config *cfg, lfs_block_t block) -{ - /* Sanity checks */ - osalDbgCheck(cfg != NULL); - - FSDriver *fsp = cfg->context; - SDCDriver *sdcp = fsp->config->sdcp; - uint8_t buf[cfg->block_size]; - - /* Sanity checks */ - chDbgCheck(block < cfg->block_count); - - memset(buf, 0xFF, cfg->block_size); - - /* Write data to block */ - if (blkWrite(sdcp, block, buf, 1) != HAL_SUCCESS) { - return LFS_ERR_IO; - } - - return LFS_ERR_OK; -} - -/** - * @brief Sync an SDC device. - * @pre The SDC interface must be initialized and the driver started. - * - * @param[in] cfg Pointer to the LFS configuration - * - * @return Negative error code on failure - * @notapi - */ -int mmc_sync(const struct lfs_config *cfg) -{ - /* Sanity checks */ - osalDbgCheck(cfg != NULL); - - FSDriver *fsp = cfg->context; - SDCDriver *sdcp = fsp->config->sdcp; - - if (blkSync(sdcp) != HAL_SUCCESS) { - return LFS_ERR_IO; - } - - return LFS_ERR_OK; -} - -/** - * @brief Enable eMMC and connect. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @return Negative error code on failure - * @notapi - */ -int mmc_enable(FSDriver *fsp) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state == FS_ONLINE) || (fsp->state == FS_OFFLINE), - "mmc_enable(), invalid state"); - - BlockDeviceInfo bdinfo; - SDCDriver *sdcp = fsp->config->sdcp; - const SDCConfig *sdccfg = fsp->config->sdccfg; - - if (fsp->state == FS_OFFLINE) { - /* Enable power to eMMC */ - palClearLine(fsp->config->mmc_pwr); - - /* Initializes MMC SDC interface */ - sdcStart(sdcp, sdccfg); - - /* Connect to eMMC device */ - if (sdcConnect(sdcp)) { - sdcStop(sdcp); - palSetLine(fsp->config->mmc_pwr); - return LFS_ERR_IO; - } - - /* Clear error flags from connecting */ - sdcGetAndClearErrors(sdcp); - - /* Retrieve block information */ - blkGetInfo(sdcp, &bdinfo); - fsp->lfscfg.block_size = bdinfo.blk_size; - fsp->lfscfg.block_count = bdinfo.blk_num; - - /* Fetch info about eMMC device */ - _mmcsd_unpack_mmc_cid((MMCSDBlockDevice*)sdcp, &fsp->mmc_cid); - _mmcsd_unpack_csd_mmc((MMCSDBlockDevice*)sdcp, &fsp->mmc_csd); - - fsp->state = FS_ONLINE; - } - - return LFS_ERR_OK; -} - -/** - * @brief Disconnect and disable eMMC. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @return Negative error code on failure - * @notapi - */ -int mmc_disable(FSDriver *fsp) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state == FS_ONLINE) || (fsp->state == FS_OFFLINE), - "mmc_disable(), invalid state"); - - SDCDriver *sdcp = fsp->config->sdcp; - - if (fsp->state == FS_ONLINE) { - /* Disconnect from eMMC device and stop interface */ - sdcDisconnect(sdcp); - sdcStop(sdcp); - - /* Disable power to eMMC */ - palSetLine(fsp->config->mmc_pwr); - - fsp->state = FS_OFFLINE; - } - - return LFS_ERR_OK; -} - -/** - * @brief Operations to perform before accessing filesystem. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @return Negative error code on failure - * @notapi - */ -static inline int fs_access_start(FSDriver *fsp) -{ - if (fsp->state != FS_MOUNTED) { - return fs_mount(fsp, false); - } - return LFS_ERR_OK; -} - -/** - * @brief Operations to perform when done accessing filesystem. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @return Negative error code on failure - * @notapi - */ -static inline int fs_access_end(FSDriver *fsp) -{ - /* TODO: unmount if okay */ - (void)fsp; - return LFS_ERR_OK; -} - -/* TODO: Implement static buffers for files */ -void *fs_alloc_file(FSDriver *fsp) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - - void *file = NULL; - fsp->err = LFS_ERR_OK; - - file = chGuardedPoolAllocTimeout(&fsp->file_pool, TIME_IMMEDIATE); - if (file == NULL) { - fsp->err = LFS_ERR_NOMEM; - } - - return file; -} - -void fs_free_file(FSDriver *fsp, void *file) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - - chGuardedPoolFree(&fsp->file_pool, file); -} - -lfs_dir_t *fs_alloc_dir(FSDriver *fsp) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - - void *dir = NULL; - fsp->err = LFS_ERR_OK; - - dir = chGuardedPoolAllocTimeout(&fsp->dir_pool, TIME_IMMEDIATE); - if (dir == NULL) { - fsp->err = LFS_ERR_NOMEM; - } - - return dir; -} - -void fs_free_dir(FSDriver *fsp, lfs_dir_t *dir) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && dir != NULL); - - chGuardedPoolFree(&fsp->dir_pool, dir); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes an instance. - * - * @param[out] fsp Pointer to the @p FSDriver object - * - * @init - */ -void fs_init(FSDriver *fsp) -{ - fsp->config = NULL; - fsp->err = LFS_ERR_OK; - - /* Initialize lfscfg */ - fsp->lfscfg.context = NULL; - fsp->lfscfg.read = mmc_read; /* Read operation */ - fsp->lfscfg.prog = mmc_prog; /* Program oepration */ - fsp->lfscfg.erase = mmc_erase; /* Erase operation */ - fsp->lfscfg.sync = mmc_sync; /* Sync operation */ - fsp->lfscfg.lock = mmc_lock; /* Lock block device */ - fsp->lfscfg.unlock = mmc_unlock; /* Unlock block device */ - fsp->lfscfg.block_size = 0; - fsp->lfscfg.block_count = 0; - fsp->lfscfg.read_size = 16; /* TODO: Check these values */ - fsp->lfscfg.prog_size = 16; /* TODO: Check these values */ - fsp->lfscfg.block_cycles = -1; /* Disable LFS wear leveling */ - fsp->lfscfg.cache_size = FS_CACHE_SIZE; - fsp->lfscfg.lookahead_size = FS_LOOKAHEAD_SIZE; - fsp->lfscfg.read_buffer = fsp->read_buf; - fsp->lfscfg.prog_buffer = fsp->prog_buf; - fsp->lfscfg.lookahead_buffer= fsp->lookahead_buf; - fsp->lfscfg.name_max = 0; /* Default to LFS_NAME_MAX */ - fsp->lfscfg.file_max = 0; /* Default to LFS_FILE_MAX */ - fsp->lfscfg.attr_max = 0; /* Default to LFS_ATTR_MAX */ - fsp->lfscfg.metadata_max = 0; /* Default to block_size */ - - chMtxObjectInit(&fsp->mutex); - chGuardedPoolObjectInitAligned(&fsp->file_pool, sizeof(lfs_file_t), PORT_NATURAL_ALIGN); - chGuardedPoolLoadArray(&fsp->file_pool, fsp->file, FS_MAX_HANDLERS); - chGuardedPoolObjectInitAligned(&fsp->dir_pool, sizeof(lfs_dir_t), PORT_NATURAL_ALIGN); - chGuardedPoolLoadArray(&fsp->dir_pool, fsp->dir, FS_MAX_HANDLERS); - - fsp->state = FS_STOP; -} - -/** - * @brief Configures and activates Filesystem Driver. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] config Pointer to the @p FSConfig object - * - * @api - */ -void fs_start(FSDriver *fsp, const FSConfig *config) -{ - /* Sanity checks */ - osalDbgCheck((fsp != NULL) && (config != NULL)); - osalDbgAssert((fsp->state == FS_STOP) || (fsp->state == FS_OFFLINE), - "fs_start(), invalid state"); - - fsp->config = config; - fsp->lfscfg.context = fsp; - fsp->state = FS_OFFLINE; -} - -/** - * @brief Deactivates the Filesystem Driver. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @api - */ -void fs_stop(FSDriver *fsp) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state == FS_STOP) || (fsp->state == FS_OFFLINE), - "fs_stop(), invalid state"); - - fsp->state = FS_STOP; -} - -/** - * @brief Formats the filesystem. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @return Negative error code on failure - * @api - */ -int fs_format(FSDriver *fsp) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_format(), invalid state"); - - fs_state_t last_state; - fsp->err = LFS_ERR_OK; - last_state = fsp->state; - - /* Unmount volume if currently mounted */ - if (fsp->state == FS_MOUNTED) { - fsp->err = fs_unmount(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - } - - /* Enable eMMC if not already enabled */ - if (fsp->state == FS_OFFLINE) { - fsp->err = mmc_enable(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - } - - /* Format LFS file system */ - fsp->err = lfs_format(&fsp->lfs, &fsp->lfscfg); - if (fsp->err == LFS_ERR_OK) { - /* Restore state */ - if (last_state == FS_OFFLINE) { - fsp->err = mmc_disable(fsp); - } else if (last_state == FS_MOUNTED) { - fsp->err = fs_mount(fsp, false); - } - } - - return fsp->err; -} - -/** - * @brief Mounts the filesystem. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] format Format the volume if unable to mount - * - * @return Negative error code on failure - * @api - */ -int fs_mount(FSDriver *fsp, bool format) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_mount(), invalid state"); - - fsp->err = LFS_ERR_OK; - - /* Start eMMC if not already online */ - if (fsp->state == FS_OFFLINE) { - fsp->err = mmc_enable(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - } - - /* Mount LFS file system if not yet mounted */ - if (fsp->state == FS_ONLINE) { - fsp->err = lfs_mount(&fsp->lfs, &fsp->lfscfg); - if (fsp->err != LFS_ERR_OK && format == true) { - /* On failure, attempt format if allowed */ - fsp->err = lfs_format(&fsp->lfs, &fsp->lfscfg); - if (fsp->err == LFS_ERR_OK) { - fsp->err = lfs_mount(&fsp->lfs, &fsp->lfscfg); - } - } - fsp->state = FS_MOUNTED; - } - - return fsp->err; -} - -/** - * @brief Unmounts the filesystem. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @return Negative error code on failure - * @api - */ -int fs_unmount(FSDriver *fsp) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_unmount(), invalid state"); - - fsp->err = LFS_ERR_OK; - - /* Unmount LFS file system if mounted */ - if (fsp->state == FS_MOUNTED) { - fsp->err = lfs_unmount(&fsp->lfs); - fsp->state = FS_ONLINE; - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - } - - if (fsp->state == FS_ONLINE) { - fsp->err = mmc_disable(fsp); - } - - return fsp->err; -} - -/** - * @brief Removes a file or directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] path Pathname - * - * @return Negative error code on failure - * @api - */ -int fs_remove(FSDriver *fsp, const char *path) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_remove(), invalid state"); - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = lfs_remove(&fsp->lfs, path); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = fs_access_end(fsp); - return fsp->err; -} - -/** - * @brief Renames a file or directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] oldpath Old pathname - * @param[in] newpath New pathname - * - * @return Negative error code on failure - * @api - */ -int fs_rename(FSDriver *fsp, const char *oldpath, const char *newpath) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_remove(), invalid state"); - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = lfs_rename(&fsp->lfs, oldpath, newpath); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = fs_access_end(fsp); - return fsp->err; -} - -/** - * @brief Get info about a file or directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] path Pathname - * @param[out] info Info structure to fill out - * - * @return Negative error code on failure - * @api - */ -int fs_stat(FSDriver *fsp, const char *path, struct lfs_info *info) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_remove(), invalid state"); - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = lfs_stat(&fsp->lfs, path, info); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = fs_access_end(fsp); - return fsp->err; -} - -/** - * @brief Get attribute from file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] path Pathname - * @param[in] type Attribute type - * @param[out] buffer The buffer to write the attribute to - * @param[in] size Maximum size of buffer - * - * @return The size of the attribute in the filesyste - * or negative error code - * @api - */ -lfs_ssize_t fs_getattr(FSDriver *fsp, const char *path, uint8_t type, void *buffer, lfs_size_t size) -{ - lfs_ssize_t ret_size; - /* Sanity checks */ - osalDbgCheck(fsp != NULL && buffer != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_getattr(), invalid state"); - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - ret_size = lfs_getattr(&fsp->lfs, path, type, buffer, size); - if (ret_size < 0) { - fsp->err = ret_size; - return fsp->err; - } - - fsp->err = fs_access_end(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - return ret_size; -} - -/** - * @brief Set attribute on file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] path Pathname - * @param[in] type Attribute type - * @param[out] buffer The buffer to write the attribute to - * @param[in] size Maximum size of buffer - * - * @return Negative error code on failure - * @api - */ -int fs_setattr(FSDriver *fsp, const char *path, uint8_t type, const void *buffer, lfs_size_t size) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && buffer != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_getattr(), invalid state"); - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = lfs_setattr(&fsp->lfs, path, type, buffer, size); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = fs_access_end(fsp); - return fsp->err; -} - -/** - * @brief Remove attribute from file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] path Pathname - * @param[in] type Attribute type - * - * @return Negative error code on failure - * @api - */ -int fs_removeattr(FSDriver *fsp, const char *path, uint8_t type) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_getattr(), invalid state"); - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = lfs_removeattr(&fsp->lfs, path, type); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = fs_access_end(fsp); - return fsp->err; -} - -/** - * @brief Return filesystem size in blocks. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @return Filesystem size in blocks or negative error code on failure - * @api - */ -lfs_size_t fs_size(FSDriver *fsp) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_size(), invalid state"); - - lfs_ssize_t ret_size; - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - ret_size = lfs_fs_size(&fsp->lfs); - if (ret_size < 0) { - fsp->err = ret_size; - return ret_size; - } - - fsp->err = fs_access_end(fsp); - return ret_size; -} - -/** - * @brief Return filesystem utilization as percentage. - * - * @param[in] fsp Pointer to the @p FSDriver object - * - * @return Filesystem utilization percent or negative error code on failure - * @api - */ -uint8_t fs_usage(FSDriver *fsp) -{ - return fs_size(fsp) / fsp->lfscfg.block_count; -} - -/** - * @brief Opens a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] path Pathname of the file - * @param[in] flags Flags for opening the file - * - * @return File handler pointer - * @api - */ -lfs_file_t *file_open(FSDriver *fsp, const char *path, int flags) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "file_open(), invalid state"); - - lfs_file_t *file = NULL; - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return NULL; - } - - file = fs_alloc_file(fsp); - - if (file != NULL) { - fsp->err = lfs_file_open(&fsp->lfs, file, path, flags); - if (fsp->err != LFS_ERR_OK) { - fs_free_file(fsp, file); - file = NULL; - } - } - - return file; -} - -/** - * @brief Closes a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer to close - * - * @return Negative error code on failure - * @api - */ -int file_close(FSDriver *fsp, lfs_file_t *file) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_close(), invalid state"); - - fsp->err = LFS_ERR_OK; - - fsp->err = lfs_file_close(&fsp->lfs, file); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fs_free_file(fsp, file); - - fsp->err = fs_access_end(fsp); - return fsp->err; -} - -/** - * @brief Syncs a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * - * @return Negative error code on failure - * @api - */ -int file_sync(FSDriver *fsp, lfs_file_t *file) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_sync(), invalid state"); - - fsp->err = lfs_file_sync(&fsp->lfs, file); - - return fsp->err; -} - -/** - * @brief Reads from a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * @param[out] buffer Buffer to read into - * @param[in] size Maximum number of bytes to read - * - * @return Offset position or negative error code on failure - * @api - */ -lfs_ssize_t file_read(FSDriver *fsp, lfs_file_t *file, void *buffer, lfs_size_t size) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL && buffer != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_read(), invalid state"); - - lfs_ssize_t ret_size; - fsp->err = LFS_ERR_OK; - - ret_size = lfs_file_read(&fsp->lfs, file, buffer, size); - if (ret_size < 0) { - fsp->err = ret_size; - } - - return ret_size; -} - -/** - * @brief Writes to a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * @param[in] buffer Buffer to write from - * @param[in] size Maximum number of bytes to write - * - * @return Offset position or negative error code on failure - * @api - */ -lfs_ssize_t file_write(FSDriver *fsp, lfs_file_t *file, const void *buffer, lfs_size_t size) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL && buffer != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_read(), invalid state"); - - lfs_ssize_t ret_size; - fsp->err = LFS_ERR_OK; - - ret_size = lfs_file_write(&fsp->lfs, file, buffer, size); - if (ret_size < 0) { - fsp->err = ret_size; - } - - return ret_size; -} - -/** - * @brief Seeks in a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * @param[in] off Offset to seek to - * @param[in] whence Where to start offset at - * - * @return Offset position or negative error code on failure - * @api - */ -lfs_soff_t file_seek(FSDriver *fsp, lfs_file_t *file, lfs_soff_t off, int whence) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_seek(), invalid state"); - - lfs_soff_t ret_off; - fsp->err = LFS_ERR_OK; - - ret_off = lfs_file_seek(&fsp->lfs, file, off, whence); - if (ret_off < 0) { - fsp->err = ret_off; - } - - return ret_off; -} - -/** - * @brief Truncate a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * @param[in] size Size to truncate to - * - * @return Negative error code on failure - * @api - */ -int file_truncate(FSDriver *fsp, lfs_file_t *file, lfs_soff_t size) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_truncate(), invalid state"); - - fsp->err = lfs_file_truncate(&fsp->lfs, file, size); - - return fsp->err; -} - -/** - * @brief Return position in a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * - * @return Offset position or negative error code on failure - * @api - */ -lfs_soff_t file_tell(FSDriver *fsp, lfs_file_t *file) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_tell(), invalid state"); - - lfs_soff_t off; - fsp->err = LFS_ERR_OK; - - off = lfs_file_tell(&fsp->lfs, file); - if (off < 0) { - fsp->err = off; - } - - return off; -} - -/** - * @brief Set position to start of file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * - * @return Negative error code on failure - * @api - */ -int file_rewind(FSDriver *fsp, lfs_file_t *file) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_rewind(), invalid state"); - - fsp->err = lfs_file_rewind(&fsp->lfs, file); - - return fsp->err; -} - -/** - * @brief Return size of a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * - * @return Offset position or negative error code - * @api - */ -lfs_soff_t file_size(FSDriver *fsp, lfs_file_t *file) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_size(), invalid state"); - - lfs_soff_t off; - fsp->err = LFS_ERR_OK; - - off = lfs_file_size(&fsp->lfs, file); - if (off < 0) { - fsp->err = off; - } - - return off; -} - -/** - * @brief Return CRC32 of a file. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] file Open file pointer - * - * @return CRC32 of file - * @api - */ -uint32_t file_crc(FSDriver *fsp, lfs_file_t *file) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && file != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "file_crc(), invalid state"); - - lfs_ssize_t ret_size; - fsp->err = LFS_ERR_OK; - uint32_t crc = 0; - uint8_t buf[512]; - - while ((ret_size = file_read(fsp, file, buf, 512)) > 0) { - crc = crc32(buf, ret_size, crc); - } - if (ret_size < 0) { - fsp->err = ret_size; - } - - return crc; -} - -/** - * @brief Create a directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] path Pathname - * - * @return Negative error code on failure - * @api - */ -int fs_mkdir(FSDriver *fsp, const char *path) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "fs_mkdir(), invalid state"); - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = lfs_mkdir(&fsp->lfs, path); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fsp->err = fs_access_end(fsp); - return fsp->err; -} - -/** - * @brief Opens a directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] path Pathname of the directory - * - * @return Directory handler pointer - * @api - */ -lfs_dir_t *dir_open(FSDriver *fsp, const char *path) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL); - osalDbgAssert((fsp->state != FS_UNINIT) && (fsp->state != FS_STOP), - "dir_open(), invalid state"); - - lfs_dir_t *dir = NULL; - - fsp->err = fs_access_start(fsp); - if (fsp->err != LFS_ERR_OK) { - return NULL; - } - - dir = fs_alloc_dir(fsp); - - if (dir != NULL) { - fsp->err = lfs_dir_open(&fsp->lfs, dir, path); - if (fsp->err != LFS_ERR_OK) { - fs_free_dir(fsp, dir); - dir = NULL; - } - } - - return dir; -} - -/** - * @brief Closes a directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] dir Open directory pointer to close - * - * @return Negative error code on failure - * @api - */ -int dir_close(FSDriver *fsp, lfs_dir_t *dir) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && dir != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "dir_close(), invalid state"); - - fsp->err = LFS_ERR_OK; - - fsp->err = lfs_dir_close(&fsp->lfs, dir); - if (fsp->err != LFS_ERR_OK) { - return fsp->err; - } - - fs_free_dir(fsp, dir); - - fsp->err = fs_access_end(fsp); - return fsp->err; -} - -/** - * @brief Reads from a directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] dir Open directory pointer - * @param[out] info Info struct to read next entry into - * - * @return Positive value on success, 0 at end of directory - * or negative error code on failure - * @api - */ -int dir_read(FSDriver *fsp, lfs_dir_t *dir, struct lfs_info *info) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && dir != NULL && info != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "dir_read(), invalid state"); - - int ret; - fsp->err = LFS_ERR_OK; - - ret = lfs_dir_read(&fsp->lfs, dir, info); - if (ret < 0) { - fsp->err = ret; - } - - return ret; -} - -/** - * @brief Seeks in a directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] dir Open directory pointer - * @param[in] off Offset to seek to (as told by dir_tell) - * - * @return Negative error code on failure - * @api - */ -int dir_seek(FSDriver *fsp, lfs_dir_t *dir, lfs_soff_t off) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && dir != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "dir_seek(), invalid state"); - - fsp->err = lfs_dir_seek(&fsp->lfs, dir, off); - - return fsp->err; -} - -/** - * @brief Return position in a directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] dir Open directory pointer - * - * @return Offset position or negative error code on failure - * @api - */ -lfs_soff_t dir_tell(FSDriver *fsp, lfs_dir_t *dir) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && dir != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "dir_tell(), invalid state"); - - lfs_soff_t off; - fsp->err = LFS_ERR_OK; - - off = lfs_dir_tell(&fsp->lfs, dir); - if (off < 0) { - fsp->err = off; - } - - return off; -} - -/** - * @brief Set position to start of directory. - * - * @param[in] fsp Pointer to the @p FSDriver object - * @param[in] dir Open directory pointer - * - * @return Negative error code on failure - * @api - */ -int dir_rewind(FSDriver *fsp, lfs_dir_t *dir) -{ - /* Sanity checks */ - osalDbgCheck(fsp != NULL && dir != NULL); - osalDbgAssert(fsp->state == FS_MOUNTED, - "dir_rewind(), invalid state"); - - fsp->err = lfs_dir_rewind(&fsp->lfs, dir); - - return fsp->err; -} - -/** @} */ diff --git a/common/fs.mk b/common/fs.mk deleted file mode 100644 index bfdd156f..00000000 --- a/common/fs.mk +++ /dev/null @@ -1,16 +0,0 @@ -# Required libraries for filesystem - -LITTLEFS_SRC = $(PROJ_ROOT)/ext/littlefs - -# List of all littlefs sources -FSSRC := $(LITTLEFS_SRC)/lfs.c \ - $(PROJ_SRC)/lfs_util.c \ - $(PROJ_SRC)/fs.c - -# Required include directories -FSINC := $(PROJ_SRC)/include \ - $(LITTLEFS_SRC) - -# Shared variables -ALLCSRC += $(FSSRC) -ALLINC += $(FSINC) diff --git a/common/include/README.md b/common/include/README.md deleted file mode 100644 index 05f586f5..00000000 --- a/common/include/README.md +++ /dev/null @@ -1 +0,0 @@ -# Common Header Files diff --git a/common/include/aprs.h b/common/include/aprs.h deleted file mode 100644 index 5ec3fd7c..00000000 --- a/common/include/aprs.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file aprs.h - * @brief Automatic Packet Reporting System (APRS) support library. - * - * @addtogroup APRS - * @{ - */ -#ifndef _APRS_H_ -#define _APRS_H_ - -/*===========================================================================*/ -/* Constants. */ -/*===========================================================================*/ - - -/** - * @name Automatic Packet Reporting System (APRS) Packets - * @{ - */ -/** @} */ - -/*===========================================================================*/ -/* Pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Data structures and types. */ -/*===========================================================================*/ - -/** - * @name APRS data structure. - * @{ - */ -/** @} */ - -/*===========================================================================*/ -/* Macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _APRS_H_ */ - -/** @} */ diff --git a/common/include/ax25.h b/common/include/ax25.h deleted file mode 100644 index bccdd79f..00000000 --- a/common/include/ax25.h +++ /dev/null @@ -1,166 +0,0 @@ -/** - * @file ax25.h - * @brief AX.25 protocol support library. - * - * @addtogroup AX25 - * @{ - */ -#ifndef _AX25_H_ -#define _AX25_H_ - -#include "frame_buf.h" - -/*===========================================================================*/ -/* Constants. */ -/*===========================================================================*/ - -/** - * @brief AX.25 Frames - * @{ - */ -/** - * @name AX.25 address fields - * @{ - */ -#define AX25_ADDR_EXT_Pos (0U) -#define AX25_ADDR_EXT_Msk (0x1U << AX25_ADDR_EXT_Pos) -#define AX25_ADDR_EXT AX25_ADDR_EXT_Msk -#define AX25_ADDR_CHAR_Pos (1U) -#define AX25_ADDR_CHAR_Msk (0xFEU << AX25_ADDR_CHAR_Pos) -#define AX25_ADDR_CHAR AX25_ADDR_CHAR_Msk -/** @} */ - -/** - * @name AX.25 SSID fields - * @{ - */ -#define AX25_SSID_EXT_Pos (0U) -#define AX25_SSID_EXT_Msk (0x1U << AX25_SSID_EXT_Pos) -#define AX25_SSID_EXT AX25_SSID_EXT_Msk -#define AX25_SSID_VAL_Pos (1U) -#define AX25_SSID_VAL_Msk (0xFU << AX25_SSID_VAL_Pos) -#define AX25_SSID_VAL AX25_SSID_VAL_Msk -#define AX25_SSID_RESERVED_Pos (5U) -#define AX25_SSID_RESERVED_Msk (0x3U << AX25_SSID_RESERVED_Pos) -#define AX25_SSID_RESERVED AX25_SSID_RESERVED_Msk -#define AX25_SSID_CMD_RESP_Pos (7U) -#define AX25_SSID_CMD_RESP_Msk (0x1U << AX25_SSID_CMD_RESP_Pos) -#define AX25_SSID_CMD_RESP AX25_SSID_CMD_RESP_Msk -#define AX25_SSID(ssid) (((ssid << AX25_SSID_VAL_Pos) & AX25_SSID_VAL_Msk) | AX25_SSID_RESERVED) -/** @} */ - -/** - * @name AX.25 Control field - * @{ - */ -#define AX25_CTRL_IFRAME (0x00U) -#define AX25_CTRL_SFRAME (0x01U) -#define AX25_CTRL_UFRAME (0x03U) -#define AX25_CTRL_SEND_SEQ_Pos (1U) -#define AX25_CTRL_SEND_SEQ_Msk (0x7U << AX25_CTRL_SEND_SEQ_Pos) -#define AX25_CTRL_SEND_SEQ AX25_CTRL_SEND_SEQ_Msk -#define AX25_CTRL_SUP_Pos (2U) -#define AX25_CTRL_SUP_Msk (0x3U << AX25_CTRL_SUP_Pos) -#define AX25_CTRL_SUP AX25_CTRL_SUP_Msk -#define AX25_SUP_RR (0x0U) -#define AX25_SUP_RNR (0x1U) -#define AX25_SUP_REJ (0x2U) -#define AX25_SUP_SREJ (0x3U) -#define AX25_CTRL_U_FLD_Pos (2U) -#define AX25_CTRL_U_FLD_Msk (0x3BU << AX25_CTRL_U_FLD_Pos) -#define AX25_CTRL_U_FLD AX25_CTRL_U_FLD_Msk -#define AX25_UFRAME_UI (0x00U) -#define AX25_UFRAME_DM (0x03U) -#define AX25_UFRAME_SABM (0x0BU) -#define AX25_UFRAME_DISC (0x10U) -#define AX25_UFRAME_UA (0x18U) -#define AX25_UFRAME_SABME (0x1BU) -#define AX25_UFRAME_FRMR (0x21U) -#define AX25_UFRAME_XID (0x2BU) -#define AX25_UFRAME_TEST (0x38U) -#define AX25_CTRL_POLL_FINAL_Pos (4U) -#define AX25_CTRL_POLL_FINAL_Msk (0x1U << AX25_CTRL_POLL_FINAL_Pos) -#define AX25_CTRL_POLL_FINAL AX25_CTRL_POLL_FINAL_Msk -#define AX25_CTRL_RECV_SEQ_Pos (5U) -#define AX25_CTRL_RECV_SEQ_Msk (0x7U << AX25_CTRL_RECV_SEQ_Pos) -#define AX25_CTRL_RECV_SEQ AX25_CTRL_RECV_SEQ_Msk -/** @} */ - -/** - * @name AX.25 PID values - * @{ - */ -#define AX25_PID_NONE (0xF0U) -/** @} */ - -/** - * @name AX.25 Maximum values size - * @{ - */ -#define AX25_MAX_PAYLOAD_LEN (256U) -#define AX25_MAX_HDR_LEN (sizeof(ax25_hdr_t)) -#define AX25_MAX_FRAME_LEN (AX25_MAX_PAYLOAD_LEN + AX25_MAX_HDR_LEN) -/** @} */ - -/** @} */ - -/*===========================================================================*/ -/* Pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Data structures and types. */ -/*===========================================================================*/ - -/** - * @name AX.25 Link Descriptor - * @{ - */ -typedef struct { - const char *dest; - uint8_t dest_ssid; - const char *src; - uint8_t src_ssid; - uint8_t control; - uint8_t sid; -} ax25_link_t; -/** @} */ - -/** - * @name AX.25 frame data structure. - * @{ - */ -typedef struct __attribute__((packed)) { - char dest[6]; - uint8_t dest_ssid; - char src[6]; - uint8_t src_ssid; - uint8_t control; - uint8_t sid; -} ax25_hdr_t; -/** @} */ - -/*===========================================================================*/ -/* Macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -void *ax25_sdu(fb_t *fb, const void *arg); - -#ifdef __cplusplus -} -#endif - -#endif /* _AX25_H_ */ - -/** @} */ diff --git a/common/include/ax5043.h b/common/include/ax5043.h deleted file mode 100644 index 8aa4be44..00000000 --- a/common/include/ax5043.h +++ /dev/null @@ -1,2923 +0,0 @@ -/** - * @file ax5043.h - * @brief AX5043 Radio. - * - * @addtogroup AX5043 - * @{ - */ -#ifndef _AX5043_H_ -#define _AX5043_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Version Identification - * @{ - */ -/** - * @brief AX5043 Driver version string. - */ -#define AX5043_VERSION "1.0.0" - -/** - * @brief AX5043 Driver version major number. - */ -#define AX5043_MAJOR 1 - -/** - * @brief AX5043 Driver version minor number. - */ -#define AX5043_MINOR 0 - -/** - * @brief AX5043 Driver version patch number. - */ -#define AX5043_PATCH 0 -/** @} */ - -/** - * @name AX5043 Register Addresses - * @{ - */ -/* Revision and Interface Probing */ -#define AX5043_REG_REVISION 0x000U -#define AX5043_REG_SCRATCH 0x001U - -/* Operating Mode */ -#define AX5043_REG_PWRMODE 0x002U - -/* Voltage Regulator */ -#define AX5043_REG_POWSTAT 0x003U -#define AX5043_REG_POWSTICKYSTAT 0x004U -#define AX5043_REG_POWIRQMASK 0x005U - -/* Interrupt Control */ -#define AX5043_REG_IRQMASK 0x006U -#define AX5043_REG_IRQMASK1 0x006U -#define AX5043_REG_IRQMASK0 0x007U -#define AX5043_REG_RADIOEVENTMASK 0x008U -#define AX5043_REG_RADIOEVENTMASK1 0x008U -#define AX5043_REG_RADIOEVENTMASK0 0x009U -#define AX5043_REG_IRQINVERSION 0x00AU -#define AX5043_REG_IRQINVERSION1 0x00AU -#define AX5043_REG_IRQINVERSION0 0x00BU -#define AX5043_REG_IRQREQUEST 0x00CU -#define AX5043_REG_IRQREQUEST1 0x00CU -#define AX5043_REG_IRQREQUEST0 0x00DU -#define AX5043_REG_RADIOEVENTREQ 0x00EU -#define AX5043_REG_RADIOEVENTREQ1 0x00EU -#define AX5043_REG_RADIOEVENTREQ0 0x00FU - -/* Modulation and Framing */ -#define AX5043_REG_MODULATION 0x010U -#define AX5043_REG_ENCODING 0x011U -#define AX5043_REG_FRAMING 0x012U -#define AX5043_REG_CRCINIT 0x014U -#define AX5043_REG_CRCINIT3 0x014U -#define AX5043_REG_CRCINIT2 0x015U -#define AX5043_REG_CRCINIT1 0x016U -#define AX5043_REG_CRCINIT0 0x017U - -/* Forward Error Correction */ -#define AX5043_REG_FEC 0x018U -#define AX5043_REG_FECSYNC 0x019U -#define AX5043_REG_FECSTATUS 0x01AU - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01CU -#define AX5043_REG_XTALSTATUS 0x01DU - -/* Pin Configuration */ -#define AX5043_REG_PINSTATE 0x020U -#define AX5043_REG_PINFUNCSYSCLK 0x021U -#define AX5043_REG_PINFUNCDCLK 0x022U -#define AX5043_REG_PINFUNCDATA 0x023U -#define AX5043_REG_PINFUNCIRQ 0x024U -#define AX5043_REG_PINFUNCANTSEL 0x025U -#define AX5043_REG_PINFUNCPWRAMP 0x026U -#define AX5043_REG_PWRAMP 0x027U - -/* FIFO */ -#define AX5043_REG_FIFOSTAT 0x028U -#define AX5043_REG_FIFODATA 0x029U -#define AX5043_REG_FIFOCOUNT 0x02AU -#define AX5043_REG_FIFOCOUNT1 0x02AU -#define AX5043_REG_FIFOCOUNT0 0x02BU -#define AX5043_REG_FIFOFREE 0x02CU -#define AX5043_REG_FIFOFREE1 0x02CU -#define AX5043_REG_FIFOFREE0 0x02DU -#define AX5043_REG_FIFOTHRESH 0x02EU -#define AX5043_REG_FIFOTHRESH1 0x02EU -#define AX5043_REG_FIFOTHRESH0 0x02FU - -/* Synthesizer */ -#define AX5043_REG_PLLLOOP 0x030U -#define AX5043_REG_PLLCPI 0x031U -#define AX5043_REG_PLLVCODIV 0x032U -#define AX5043_REG_PLLRANGINGA 0x033U -#define AX5043_REG_FREQA 0x034U -#define AX5043_REG_FREQA3 0x034U -#define AX5043_REG_FREQA2 0x035U -#define AX5043_REG_FREQA1 0x036U -#define AX5043_REG_FREQA0 0x037U -#define AX5043_REG_PLLLOOPBOOST 0x038U -#define AX5043_REG_PLLCPIBOOST 0x039U -#define AX5043_REG_PLLRANGINGB 0x03BU -#define AX5043_REG_FREQB 0x03CU -#define AX5043_REG_FREQB3 0x03CU -#define AX5043_REG_FREQB2 0x03DU -#define AX5043_REG_FREQB1 0x03EU -#define AX5043_REG_FREQB0 0x03FU - -/* Signal Strength */ -#define AX5043_REG_RSSI 0x040U -#define AX5043_REG_BGNDRSSI 0x041U -#define AX5043_REG_DIVERSITY 0x042U -#define AX5043_REG_AGCCOUNTER 0x043U - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE 0x045U -#define AX5043_REG_TRKDATARATE2 0x045U -#define AX5043_REG_TRKDATARATE1 0x046U -#define AX5043_REG_TRKDATARATE0 0x047U -#define AX5043_REG_TRKAMPL 0x048U -#define AX5043_REG_TRKAMPL1 0x048U -#define AX5043_REG_TRKAMPL0 0x049U -#define AX5043_REG_TRKPHASE 0x04AU -#define AX5043_REG_TRKPHASE1 0x04AU -#define AX5043_REG_TRKPHASE0 0x04BU -#define AX5043_REG_TRKRFFREQ 0x04DU -#define AX5043_REG_TRKRFFREQ2 0x04DU -#define AX5043_REG_TRKRFFREQ1 0x04EU -#define AX5043_REG_TRKRFFREQ0 0x04FU -#define AX5043_REG_TRKFREQ 0x050U -#define AX5043_REG_TRKFREQ1 0x050U -#define AX5043_REG_TRKFREQ0 0x051U -#define AX5043_REG_TRKFSKDEMOD 0x052U -#define AX5043_REG_TRKFSKDEMOD1 0x052U -#define AX5043_REG_TRKFSKDEMOD0 0x053U - -/* Timers */ -#define AX5043_REG_TIMER 0x059U -#define AX5043_REG_TIMER2 0x059U -#define AX5043_REG_TIMER1 0x05AU -#define AX5043_REG_TIMER0 0x05BU - -/* Wakeup Timer */ -#define AX5043_REG_WAKEUPTIMER 0x068U -#define AX5043_REG_WAKEUPTIMER1 0x068U -#define AX5043_REG_WAKEUPTIMER0 0x069U -#define AX5043_REG_WAKEUP 0x06AU -#define AX5043_REG_WAKEUP1 0x06AU -#define AX5043_REG_WAKEUP0 0x06BU -#define AX5043_REG_WAKEUPFREQ 0x06CU -#define AX5043_REG_WAKEUPFREQ1 0x06CU -#define AX5043_REG_WAKEUPFREQ0 0x06DU -#define AX5043_REG_WAKEUPXOEARLY 0x06EU - -/* PHY Layer Parameters */ -/* Receiver Parameters */ -#define AX5043_REG_IFFREQ 0x100U -#define AX5043_REG_IFFREQ1 0x100U -#define AX5043_REG_IFFREQ0 0x101U -#define AX5043_REG_DECIMATION 0x102U -#define AX5043_REG_RXDATARATE 0x103U -#define AX5043_REG_RXDATARATE2 0x103U -#define AX5043_REG_RXDATARATE1 0x104U -#define AX5043_REG_RXDATARATE0 0x105U -#define AX5043_REG_MAXDROFFSET 0x106U -#define AX5043_REG_MAXDROFFSET2 0x106U -#define AX5043_REG_MAXDROFFSET1 0x107U -#define AX5043_REG_MAXDROFFSET0 0x108U -#define AX5043_REG_MAXRFOFFSET 0x109U -#define AX5043_REG_MAXRFOFFSET2 0x109U -#define AX5043_REG_MAXRFOFFSET1 0x10AU -#define AX5043_REG_MAXRFOFFSET0 0x10BU -#define AX5043_REG_FSKDMAX 0x10CU -#define AX5043_REG_FSKDMAX1 0x10CU -#define AX5043_REG_FSKDMAX0 0x10DU -#define AX5043_REG_FSKDMIN 0x10EU -#define AX5043_REG_FSKDMIN1 0x10EU -#define AX5043_REG_FSKDMIN0 0x10FU -#define AX5043_REG_AFSKSPACE 0x110U -#define AX5043_REG_AFSKSPACE1 0x110U -#define AX5043_REG_AFSKSPACE0 0x111U -#define AX5043_REG_AFSKMARK 0x112U -#define AX5043_REG_AFSKMARK1 0x112U -#define AX5043_REG_AFSKMARK0 0x113U -#define AX5043_REG_AFSKCTRL 0x114U -#define AX5043_REG_AMPLFILTER 0x115U -#define AX5043_REG_FREQUENCYLEAK 0x116U -#define AX5043_REG_RXPARAMSETS 0x117U -#define AX5043_REG_RXPARAMCURSET 0x118U - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120U -#define AX5043_REG_AGCTARGET0 0x121U -#define AX5043_REG_AGCAHYST0 0x122U -#define AX5043_REG_AGCMINMAX0 0x123U -#define AX5043_REG_TIMEGAIN0 0x124U -#define AX5043_REG_DRGAIN0 0x125U -#define AX5043_REG_PHASEGAIN0 0x126U -#define AX5043_REG_FREQGAINA0 0x127U -#define AX5043_REG_FREQGAINB0 0x128U -#define AX5043_REG_FREQGAINC0 0x129U -#define AX5043_REG_FREQGAIND0 0x12AU -#define AX5043_REG_AMPLGAIN0 0x12BU -#define AX5043_REG_FREQDEV0 0x12CU -#define AX5043_REG_FREQDEV10 0x12CU -#define AX5043_REG_FREQDEV00 0x12DU -#define AX5043_REG_FOURFSK0 0x12EU -#define AX5043_REG_BBOFFSRES0 0x12FU - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130U -#define AX5043_REG_AGCTARGET1 0x131U -#define AX5043_REG_AGCAHYST1 0x132U -#define AX5043_REG_AGCMINMAX1 0x133U -#define AX5043_REG_TIMEGAIN1 0x134U -#define AX5043_REG_DRGAIN1 0x135U -#define AX5043_REG_PHASEGAIN1 0x136U -#define AX5043_REG_FREQGAINA1 0x137U -#define AX5043_REG_FREQGAINB1 0x138U -#define AX5043_REG_FREQGAINC1 0x139U -#define AX5043_REG_FREQGAIND1 0x13AU -#define AX5043_REG_AMPLGAIN1 0x13BU -#define AX5043_REG_FREQDEV1 0x13CU -#define AX5043_REG_FREQDEV11 0x13CU -#define AX5043_REG_FREQDEV01 0x13DU -#define AX5043_REG_FOURFSK1 0x13EU -#define AX5043_REG_BBOFFSRES1 0x13FU - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140U -#define AX5043_REG_AGCTARGET2 0x141U -#define AX5043_REG_AGCAHYST2 0x142U -#define AX5043_REG_AGCMINMAX2 0x143U -#define AX5043_REG_TIMEGAIN2 0x144U -#define AX5043_REG_DRGAIN2 0x145U -#define AX5043_REG_PHASEGAIN2 0x146U -#define AX5043_REG_FREQGAINA2 0x147U -#define AX5043_REG_FREQGAINB2 0x148U -#define AX5043_REG_FREQGAINC2 0x149U -#define AX5043_REG_FREQGAIND2 0x14AU -#define AX5043_REG_AMPLGAIN2 0x14BU -#define AX5043_REG_FREQDEV2 0x14CU -#define AX5043_REG_FREQDEV12 0x14CU -#define AX5043_REG_FREQDEV02 0x14DU -#define AX5043_REG_FOURFSK2 0x14EU -#define AX5043_REG_BBOFFSRES2 0x14FU - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150U -#define AX5043_REG_AGCTARGET3 0x151U -#define AX5043_REG_AGCAHYST3 0x152U -#define AX5043_REG_AGCMINMAX3 0x153U -#define AX5043_REG_TIMEGAIN3 0x154U -#define AX5043_REG_DRGAIN3 0x155U -#define AX5043_REG_PHASEGAIN3 0x156U -#define AX5043_REG_FREQGAINA3 0x157U -#define AX5043_REG_FREQGAINB3 0x158U -#define AX5043_REG_FREQGAINC3 0x159U -#define AX5043_REG_FREQGAIND3 0x15AU -#define AX5043_REG_AMPLGAIN3 0x15BU -#define AX5043_REG_FREQDEV3 0x15CU -#define AX5043_REG_FREQDEV13 0x15CU -#define AX5043_REG_FREQDEV03 0x15DU -#define AX5043_REG_FOURFSK3 0x15EU -#define AX5043_REG_BBOFFSRES3 0x15FU - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160U -#define AX5043_REG_FSKDEV 0x161U -#define AX5043_REG_FSKDEV2 0x161U -#define AX5043_REG_FSKDEV1 0x162U -#define AX5043_REG_FSKDEV0 0x163U -#define AX5043_REG_MODCFGA 0x164U -#define AX5043_REG_TXRATE 0x165U -#define AX5043_REG_TXRATE2 0x165U -#define AX5043_REG_TXRATE1 0x166U -#define AX5043_REG_TXRATE0 0x167U -#define AX5043_REG_TXPWRCOEFFA 0x168U -#define AX5043_REG_TXPWRCOEFFA1 0x168U -#define AX5043_REG_TXPWRCOEFFA0 0x169U -#define AX5043_REG_TXPWRCOEFFB 0x16AU -#define AX5043_REG_TXPWRCOEFFB1 0x16AU -#define AX5043_REG_TXPWRCOEFFB0 0x16BU -#define AX5043_REG_TXPWRCOEFFC 0x16CU -#define AX5043_REG_TXPWRCOEFFC1 0x16CU -#define AX5043_REG_TXPWRCOEFFC0 0x16DU -#define AX5043_REG_TXPWRCOEFFD 0x16EU -#define AX5043_REG_TXPWRCOEFFD1 0x16EU -#define AX5043_REG_TXPWRCOEFFD0 0x16FU -#define AX5043_REG_TXPWRCOEFFE 0x170U -#define AX5043_REG_TXPWRCOEFFE1 0x170U -#define AX5043_REG_TXPWRCOEFFE0 0x171U - -/* PLL Parameters */ -#define AX5043_REG_PLLVCOI 0x180U -#define AX5043_REG_PLLVCOIR 0x181U -#define AX5043_REG_PLLLOCKDET 0x182U -#define AX5043_REG_PLLRNGCLK 0x183U - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184U - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188U -#define AX5043_REG_BBOFFSCAP 0x189U - -/* MAC Layer Parameters */ -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200U -#define AX5043_REG_PKTLENCFG 0x201U -#define AX5043_REG_PKTLENOFFSET 0x202U -#define AX5043_REG_PKTMAXLEN 0x203U -#define AX5043_REG_PKTADDR 0x204U -#define AX5043_REG_PKTADDR3 0x204U -#define AX5043_REG_PKTADDR2 0x205U -#define AX5043_REG_PKTADDR1 0x206U -#define AX5043_REG_PKTADDR0 0x207U -#define AX5043_REG_PKTADDRMASK 0x208U -#define AX5043_REG_PKTADDRMASK3 0x208U -#define AX5043_REG_PKTADDRMASK2 0x209U -#define AX5043_REG_PKTADDRMASK1 0x20AU -#define AX5043_REG_PKTADDRMASK0 0x20BU - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT 0x210U -#define AX5043_REG_MATCH0PAT3 0x210U -#define AX5043_REG_MATCH0PAT2 0x211U -#define AX5043_REG_MATCH0PAT1 0x212U -#define AX5043_REG_MATCH0PAT0 0x213U -#define AX5043_REG_MATCH0LEN 0x214U -#define AX5043_REG_MATCH0MIN 0x215U -#define AX5043_REG_MATCH0MAX 0x216U -#define AX5043_REG_MATCH1PAT 0x218U -#define AX5043_REG_MATCH1PAT1 0x218U -#define AX5043_REG_MATCH1PAT0 0x219U -#define AX5043_REG_MATCH1LEN 0x21CU -#define AX5043_REG_MATCH1MIN 0x21DU -#define AX5043_REG_MATCH1MAX 0x21EU - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220U -#define AX5043_REG_TMGTXSETTLE 0x221U -#define AX5043_REG_TMGRXBOOST 0x223U -#define AX5043_REG_TMGRXSETTLE 0x224U -#define AX5043_REG_TMGRXOFFSACQ 0x225U -#define AX5043_REG_TMGRXCOARSEAGC 0x226U -#define AX5043_REG_TMGRXAGC 0x227U -#define AX5043_REG_TMGRXRSSI 0x228U -#define AX5043_REG_TMGRXPREAMBLE1 0x229U -#define AX5043_REG_TMGRXPREAMBLE2 0x22AU -#define AX5043_REG_TMGRXPREAMBLE3 0x22BU -#define AX5043_REG_RSSIREFERENCE 0x22CU -#define AX5043_REG_RSSIABSTHR 0x22DU -#define AX5043_REG_BGNDRSSIGAIN 0x22EU -#define AX5043_REG_BGNDRSSITHR 0x22FU -#define AX5043_REG_PKTCHUNKSIZE 0x230U -#define AX5043_REG_PKTMISCFLAGS 0x231U -#define AX5043_REG_PKTSTOREFLAGS 0x232U -#define AX5043_REG_PKTACCEPTFLAGS 0x233U - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300U -#define AX5043_REG_GPADCPERIOD 0x301U -#define AX5043_REG_GPADC13VALUE 0x308U -#define AX5043_REG_GPADC13VALUE1 0x308U -#define AX5043_REG_GPADC13VALUE0 0x309U - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310U -#define AX5043_REG_LPOSCSTATUS 0x311U -#define AX5043_REG_LPOSCKFILT 0x312U -#define AX5043_REG_LPOSCKFILT1 0x312U -#define AX5043_REG_LPOSCKFILT0 0x313U -#define AX5043_REG_LPOSCREF 0x314U -#define AX5043_REG_LPOSCREF1 0x314U -#define AX5043_REG_LPOSCREF0 0x315U -#define AX5043_REG_LPOSCFREQ 0x316U -#define AX5043_REG_LPOSCFREQ1 0x316U -#define AX5043_REG_LPOSCFREQ0 0x317U -#define AX5043_REG_LPOSCPER 0x318U -#define AX5043_REG_LPOSCPER1 0x318U -#define AX5043_REG_LPOSCPER0 0x319U - -/* DAC */ -#define AX5043_REG_DACVALUE 0x330U -#define AX5043_REG_DACVALUE1 0x330U -#define AX5043_REG_DACVALUE0 0x331U -#define AX5043_REG_DACCONFIG 0x332U - -/* Performance Tuning Registers */ -#define AX5043_REG_0xF00 0xF00U -#define AX5043_REG_0xF08 0xF08U -#define AX5043_REG_POWCTRL1 0xF08U -#define AX5043_REG_0xF0C 0xF0CU -#define AX5043_REG_0xF0D 0xF0DU -#define AX5043_REG_REF 0xF0DU -#define AX5043_REG_0xF10 0xF10U -#define AX5043_REG_XTALOSC 0xF10U -#define AX5043_REG_0xF11 0xF11U -#define AX5043_REG_XTALAMPL 0xF11U -#define AX5043_REG_0xF18 0xF18U -#define AX5043_REG_0xF1C 0xF1CU -#define AX5043_REG_0xF21 0xF21U -#define AX5043_REG_0xF22 0xF22U -#define AX5043_REG_0xF23 0xF23U -#define AX5043_REG_0xF26 0xF26U -#define AX5043_REG_0xF30 0xF30U -#define AX5043_REG_0xF31 0xF31U -#define AX5043_REG_0xF32 0xF32U -#define AX5043_REG_0xF33 0xF33U -#define AX5043_REG_0xF34 0xF34U -#define AX5043_REG_0xF35 0xF35U -#define AX5043_REG_XTALDIV 0xF35U -#define AX5043_REG_0xF44 0xF44U -#define AX5043_REG_0xF72 0xF72U -/** @} */ - -/** - * @name AX5043 REVISION register - * @{ - */ -#define AX5043_REVISION_Pos (0U) -#define AX5043_REVISION_Msk (0xFFU << AX5043_REVISION_Pos) -#define AX5043_REVISION AX5043_REVISION_Msk -/** @} */ - -/** - * @name AX5043 SCRATCH register - * @{ - */ -#define AX5043_SCRATCH_Pos (0U) -#define AX5043_SCRATCH_Msk (0xFFU << AX5043_SCRATCH_Pos) -#define AX5043_SCRATCH AX5043_SCRATCH_Msk -/** @} */ - -/** - * @name AX5043 PWRMODE register fields - * @{ - */ -#define AX5043_PWRMODE_Pos (0U) -#define AX5043_PWRMODE_Msk (0xFU << AX5043_PWRMODE_Pos) -#define AX5043_PWRMODE AX5043_PWRMODE_Msk -#define AX5043_PWRMODE_POWERDOWN (0x0U) -#define AX5043_PWRMODE_DEEPSLEEP (0x1U) -#define AX5043_PWRMODE_STANDBY (0x5U) -#define AX5043_PWRMODE_FIFO_EN (0x7U) -#define AX5043_PWRMODE_RX_SYNTH (0x8U) -#define AX5043_PWRMODE_RX_FULL (0x9U) -#define AX5043_PWRMODE_RX_WOR (0xBU) -#define AX5043_PWRMODE_TX_SYNTH (0xCU) -#define AX5043_PWRMODE_TX_FULL (0xDU) -#define AX5043_PWRMODE_WDS_Pos (4U) -#define AX5043_PWRMODE_WDS_Msk (0x1U << AX5043_PWRMODE_WDS_Pos) -#define AX5043_PWRMODE_WDS AX5043_PWRMODE_WDS_Msk -#define AX5043_PWRMODE_REFEN_Pos (5U) -#define AX5043_PWRMODE_REFEN_Msk (0x1U << AX5043_PWRMODE_REFEN_Pos) -#define AX5043_PWRMODE_REFEN AX5043_PWRMODE_REFEN_Msk -#define AX5043_PWRMODE_XOEN_Pos (6U) -#define AX5043_PWRMODE_XOEN_Msk (0x1U << AX5043_PWRMODE_XOEN_Pos) -#define AX5043_PWRMODE_XOEN AX5043_PWRMODE_XOEN_Msk -#define AX5043_PWRMODE_RESET_Pos (7U) -#define AX5043_PWRMODE_RESET_Msk (0x1U << AX5043_PWRMODE_RESET_Pos) -#define AX5043_PWRMODE_RESET AX5043_PWRMODE_RESET_Msk -/** @} */ - -/** - * @name AX5043 POWSTAT/POWSTICKYSTAT/POWIRQMASK register fields - * @{ - */ -#define AX5043_POWIRQ_SVIO_Pos (0U) -#define AX5043_POWIRQ_SVIOgsk (0x1U << AX5043_POWIRQ_MSVIO_Pos) -#define AX5043_POWIRQ_SVIO AX5043_POWIRQgSVIO_Msk -#define AX5043_POWIRQ_SBEVMODEM_Pos (1U) -#define AX5043_POWIRQ_SBEVMODEMgsk (0x1U << AX5043_POWIRQ_MSBEVMODEM_Pos) -#define AX5043_POWIRQ_SBEVMODEM AX5043_POWIRQgSBEVMODEM_Msk -#define AX5043_POWIRQ_SBEVANA_Pos (2U) -#define AX5043_POWIRQ_SBEVANAgsk (0x1U << AX5043_POWIRQ_MSBEVANA_Pos) -#define AX5043_POWIRQ_SBEVANA AX5043_POWIRQgSBEVANA_Msk -#define AX5043_POWIRQ_SVMODEM_Pos (3U) -#define AX5043_POWIRQ_SVMODEMgsk (0x1U << AX5043_POWIRQ_MSVMODEM_Pos) -#define AX5043_POWIRQ_SVMODEM AX5043_POWIRQgSVMODEM_Msk -#define AX5043_POWIRQ_SVANA_Pos (4U) -#define AX5043_POWIRQ_SVANAgsk (0x1U << AX5043_POWIRQ_MSVANA_Pos) -#define AX5043_POWIRQ_SVANA AX5043_POWIRQgSVANA_Msk -#define AX5043_POWIRQ_SVREF_Pos (5U) -#define AX5043_POWIRQ_SVREFgsk (0x1U << AX5043_POWIRQ_MSVREF_Pos) -#define AX5043_POWIRQ_SVREF AX5043_POWIRQ_SMVREFgsk -#define AX5043_POWIRQ_SREF_Pos (6U) -#define AX5043_POWIRQ_SREFgsk (0x1U << AX5043_POWIRQ_MSREF_Pos) -#define AX5043_POWIRQ_SREF AX5043_POWIRQgSREF_Msk -#define AX5043_POWIRQ_PWRGOOD_Pos (7U) -#define AX5043_POWIRQ_PWRGOODgsk (0x1U << AX5043_POWIRQ_MPWRGOOD_Pos) -#define AX5043_POWIRQ_PWRGOOD AX5043_POWIRQgPWRGOOD_Msk -/** @} */ - -/** - * @name AX5043 IRQMASK/IRQINVERSION/IRQREQUEST register fields - * @{ - */ -#define AX5043_IRQ_FIFONOTEMPTY_Pos (0U) -#define AX5043_IRQ_FIFONOTEMPTY_Msk (0x1U << AX5043_IRQ_FIFONOTEMPTY_Pos) -#define AX5043_IRQ_FIFONOTEMPTY AX5043_IRQ_FIFONOTEMPTY_Msk -#define AX5043_IRQ_FIFONOTFULL_Pos (1U) -#define AX5043_IRQ_FIFONOTFULL_Msk (0x1U << AX5043_IRQ_FIFONOTFULL_Pos) -#define AX5043_IRQ_FIFONOTFULL AX5043_IRQ_FIFONOTFULL_Msk -#define AX5043_IRQ_FIFOTHRCNT_Pos (2U) -#define AX5043_IRQ_FIFOTHRCNT_Msk (0x1U << AX5043_IRQ_FIFOTHRCNT_Pos) -#define AX5043_IRQ_FIFOTHRCNT AX5043_IRQ_FIFOTHRCNT_Msk -#define AX5043_IRQ_FIFOTHRFREE_Pos (3U) -#define AX5043_IRQ_FIFOTHRFREE_Msk (0x1U << AX5043_IRQ_FIFOTHRFREE_Pos) -#define AX5043_IRQ_FIFOTHRFREE AX5043_IRQ_FIFOTHRFREE_Msk -#define AX5043_IRQ_FIFOERROR_Pos (4U) -#define AX5043_IRQ_FIFOERROR_Msk (0x1U << AX5043_IRQ_FIFOERROR_Pos) -#define AX5043_IRQ_FIFOERROR AX5043_IRQ_FIFOERROR_Msk -#define AX5043_IRQ_PLLUNLOCK_Pos (5U) -#define AX5043_IRQ_PLLUNLOCK_Msk (0x1U << AX5043_IRQ_PLLUNLOCK_Pos) -#define AX5043_IRQ_PLLUNLOCK AX5043_IRQ_PLLUNLOCK_Msk -#define AX5043_IRQ_RADIOCTRL_Pos (6U) -#define AX5043_IRQ_RADIOCTRL_Msk (0x1U << AX5043_IRQ_RADIOCTRL_Pos) -#define AX5043_IRQ_RADIOCTRL AX5043_IRQ_RADIOCTRL_Msk -#define AX5043_IRQ_POWER_Pos (7U) -#define AX5043_IRQ_POWER_Msk (0x1U << AX5043_IRQ_POWER_Pos) -#define AX5043_IRQ_POWER AX5043_IRQ_POWER_Msk -#define AX5043_IRQ_XTALREADY_Pos (8U) -#define AX5043_IRQ_XTALREADY_Msk (0x1U << AX5043_IRQ_XTALREADY_Pos) -#define AX5043_IRQ_XTALREADY AX5043_IRQ_XTALREADY_Msk -#define AX5043_IRQ_WAKEUPTIMER_Pos (9U) -#define AX5043_IRQ_WAKEUPTIMER_Msk (0x1U << AX5043_IRQ_WAKEUPTIMER_Pos) -#define AX5043_IRQ_WAKEUPTIMER AX5043_IRQ_WAKEUPTIMER_Msk -#define AX5043_IRQ_LPOSC_Pos (10U) -#define AX5043_IRQ_LPOSC_Msk (0x1U << AX5043_IRQ_LPOSC_Pos) -#define AX5043_IRQ_LPOSC AX5043_IRQ_LPOSC_Msk -#define AX5043_IRQ_GPADC_Pos (11U) -#define AX5043_IRQ_GPADC_Msk (0x1U << AX5043_IRQ_GPADC_Pos) -#define AX5043_IRQ_GPADC AX5043_IRQ_GPADC_Msk -#define AX5043_IRQ_PLLRNGDONE_Pos (12U) -#define AX5043_IRQ_PLLRNGDONE_Msk (0x1U << AX5043_IRQ_PLLRNGDONE_Pos) -#define AX5043_IRQ_PLLRNGDONE AX5043_IRQ_PLLRNGDONE_Msk -/** @} */ - -/** - * @name AX5043 RADIOEVENTMASK/RADIOEVENTREQ register fields - * @{ - */ -#define AX5043_RADIOEVENT_DONE_Pos (0U) -#define AX5043_RADIOEVENT_DONE_Msk (0x1U << AX5043_RADIOEVENT_DONE_Pos) -#define AX5043_RADIOEVENT_DONE AX5043_RADIOEVENT_DONE_Msk -#define AX5043_RADIOEVENT_SETTLED_Pos (1U) -#define AX5043_RADIOEVENT_SETTLED_Msk (0x1U << AX5043_RADIOEVENT_SETTLED_Pos) -#define AX5043_RADIOEVENT_SETTLED AX5043_RADIOEVENT_SETTLED_Msk -#define AX5043_RADIOEVENT_RADIOSTATECHG_Pos (2U) -#define AX5043_RADIOEVENT_RADIOSTATECHG_Msk (0x1U << AX5043_RADIOEVENT_RADIOSTATECHG_Pos) -#define AX5043_RADIOEVENT_RADIOSTATECHG AX5043_RADIOEVENT_RADIOSTATECHG_Msk -#define AX5043_RADIOEVENT_RXPARAMSETCHG_Pos (3U) -#define AX5043_RADIOEVENT_RXPARAMSETCHG_Msk (0x1U << AX5043_RADIOEVENT_RXPARAMSETCHG_Pos) -#define AX5043_RADIOEVENT_RXPARAMSETCHG AX5043_RADIOEVENT_RXPARAMSETCHG_Msk -#define AX5043_RADIOEVENT_FRAMECLK_Pos (4U) -#define AX5043_RADIOEVENT_FRAMECLK_Msk (0x1U << AX5043_RADIOEVENT_FRAMECLK_Pos) -#define AX5043_RADIOEVENT_FRAMECLK AX5043_RADIOEVENT_FRAMECLK_Msk -/** @} */ - -/** - * @name AX5043 MODULATION register fields - * @{ - */ -#define AX5043_MODULATION_Pos (0U) -#define AX5043_MODULATION_Msk (0xFU << AX5043_MODULATION_Pos) -#define AX5043_MODULATION AX5043_MODULATION_Msk -#define AX5043_MODULATION_ASK (0x0U) -#define AX5043_MODULATION_ASK_COHERENT (0x1U) -#define AX5043_MODULATION_PSK (0x4U) -#define AX5043_MODULATION_OQSK (0x6U) -#define AX5043_MODULATION_MSK (0x7U) -#define AX5043_MODULATION_FSK (0x8U) -#define AX5043_MODULATION_4FSK (0x9U) -#define AX5043_MODULATION_AFSK (0xAU) -#define AX5043_MODULATION_FM (0xBU) -#define AX5043_MODULATION_RXHALFSPEED_Pos (4U) -#define AX5043_MODULATION_RXHALFSPEED_Msk (0x1U << AX5043_MODULATION_RXHALFSPEED_Pos) -#define AX5043_MODULATION_RXHALFSPEED AX5043_MODULATION_RXHALFSPEED_Msk -/** @} */ - -/** - * @name AX5043 ENCODING register fields - * @{ - */ -#define AX5043_ENCODING_Pos (0U) -#define AX5043_ENCODING_Msk (0xFU << AX5043_ENCODING_Pos) -#define AX5043_ENCODING AX5043_ENCODING_Msk -#define AX5043_ENCODING_INV_Pos (0U) -#define AX5043_ENCODING_INV_Msk (0x1U << AX5043_ENCODING_INV_Pos) -#define AX5043_ENCODING_INV AX5043_ENCODING_INV_Msk -#define AX5043_ENCODING_DIFF_Pos (1U) -#define AX5043_ENCODING_DIFF_Msk (0x1U << AX5043_ENCODING_DIFF_Pos) -#define AX5043_ENCODING_DIFF AX5043_ENCODING_DIFF_Msk -#define AX5043_ENCODING_SCRAM_Pos (2U) -#define AX5043_ENCODING_SCRAM_Msk (0x1U << AX5043_ENCODING_SCRAM_Pos) -#define AX5043_ENCODING_SCRAM AX5043_ENCODING_SCRAM_Msk -#define AX5043_ENCODING_MANCH_Pos (3U) -#define AX5043_ENCODING_MANCH_Msk (0x1U << AX5043_ENCODING_MANCH_Pos) -#define AX5043_ENCODING_MANCH AX5043_ENCODING_MANCH_Msk -#define AX5043_ENCODING_NOSYNC_Pos (4U) -#define AX5043_ENCODING_NOSYNC_Msk (0x1U << AX5043_ENCODING_NOSYNC_Pos) -#define AX5043_ENCODING_NOSYNC AX5043_ENCODING_NOSYNC_Msk -/* Customary Encodings */ -#define AX5043_ENCODING_NRZ (0x0U) /* MANCH=0 SCRAM=0 DIFF=0 INV=0 */ -#define AX5043_ENCODING_NRZI (0x3U) /* MANCH=0 SCRAM=0 DIFF=1 INV=1 */ -#define AX5043_ENCODING_NRZ_SCRAM (0x4U) /* MANCH=0 SCRAM=1 DIFF=0 INV=0 */ -#define AX5043_ENCODING_NRZI_SCRAM (0x7U) /* MANCH=0 SCRAM=1 DIFF=1 INV=1 */ -#define AX5043_ENCODING_MANCHESTER (0x8U) /* MANCH=1 SCRAM=0 DIFF=0 INV=0 */ -#define AX5043_ENCODING_FM0 (0xAU) /* MANCH=1 SCRAM=0 DIFF=1 INV=0 */ -#define AX5043_ENCODING_FM1 (0xBU) /* MANCH=1 SCRAM=0 DIFF=1 INV=1 */ -/** @} */ - -/** - * @name AX5043 FRAMING register fields - * @{ - */ -#define AX5043_FRAMING_FABORT_Pos (0U) -#define AX5043_FRAMING_FABORT_Msk (0x1U << AX5043_FRAMING_FABORT_Pos) -#define AX5043_FRAMING_FABORT AX5043_FRAMING_FABORT_Msk -#define AX5043_FRAMING_FRMMODE_Pos (1U) -#define AX5043_FRAMING_FRMMODE_Msk (0x7U << AX5043_FRAMING_FRMMODE_Pos) -#define AX5043_FRAMING_FRMMODE AX5043_FRAMING_FRMMODE_Msk -#define AX5043_FRMMODE_RAW (0x0U) -#define AX5043_FRMMODE_RAW_SOFTBITS (0x1U) -#define AX5043_FRMMODE_HDLC (0x2U) -#define AX5043_FRMMODE_RAW_PATMATCH (0x3U) -#define AX5043_FRMMODE_WMBUS (0x4U) -#define AX5043_FRMMODE_WMBUS_4TO6 (0x5U) -#define AX5043_FRAMING_CRCMODE_Pos (4U) -#define AX5043_FRAMING_CRCMODE_Msk (0x7U << AX5043_FRAMING_CRCMODE_Pos) -#define AX5043_FRAMING_CRCMODE AX5043_FRAMING_CRCMODE_Msk -#define AX5043_CRCMODE_OFF (0x0U) -#define AX5043_CRCMODE_CCITT (0x1U) -#define AX5043_CRCMODE_CRC16 (0x2U) -#define AX5043_CRCMODE_DNP (0x3U) -#define AX5043_CRCMODE_CRC32 (0x6U) -#define AX5043_FRAMING_FRMRX_Pos (7U) -#define AX5043_FRAMING_FRMRX_Msk (0x1U << AX5043_FRAMING_FRMRX_Pos) -#define AX5043_FRAMING_FRMRX AX5043_FRAMING_FRMRX_Msk -/** @} */ - -/** - * @name AX5043 CRCINIT register fields - * @{ - */ -#define AX5043_CRCINIT_Pos (0U) -#define AX5043_CRCINIT_Msk (0xFFFFFFFFU << AX5043_CRCINIT_Pos) -#define AX5043_CRCINIT AX5043_CRCINIT_Msk -/** @} */ - -/** - * @name AX5043 FEC register fields - * @{ - */ -#define AX5043_FEC_FECENA_Pos (0U) -#define AX5043_FEC_FECENA_Msk (0x1U << AX5043_FEC_FECENA_Pos) -#define AX5043_FEC_FECENA AX5043_FEC_FECENA_Msk -#define AX5043_FEC_FECINPSHIFT_Pos (1U) -#define AX5043_FEC_FECINPSHIFT_Msk (0x7U << AX5043_FEC_FECINPSHIFT_Pos) -#define AX5043_FEC_FECINPSHIFT AX5043_FEC_FECINPSHIFT_Msk -#define AX5043_FEC_FECPOS_Pos (4U) -#define AX5043_FEC_FECPOS_Msk (0x1U << AX5043_FEC_FECPOS_Pos) -#define AX5043_FEC_FECPOS AX5043_FEC_FECPOS_Msk -#define AX5043_FEC_FECNEG_Pos (5U) -#define AX5043_FEC_FECNEG_Msk (0x1U << AX5043_FEC_FECNEG_Pos) -#define AX5043_FEC_FECNEG AX5043_FEC_FECNEG_Msk -#define AX5043_FEC_RSTVITERBI_Pos (6U) -#define AX5043_FEC_RSTVITERBI_Msk (0x1U << AX5043_FEC_RSTVITERBI_Pos) -#define AX5043_FEC_RSTVITERBI AX5043_FEC_RSTVITERBI_Msk -#define AX5043_FEC_SHORTMEM_Pos (7U) -#define AX5043_FEC_SHORTMEM_Msk (0x1U << AX5043_FEC_SHORTMEM_Pos) -#define AX5043_FEC_SHORTMEM AX5043_FEC_SHORTMEM_Msk -/** @} */ - -/** - * @name AX5043 FECSYNC register fields - * @{ - */ -#define AX5043_FECSYNC_Pos (0U) -#define AX5043_FECSYNC_Msk (0xFFU << AX5043_FECSYNC_Pos) -#define AX5043_FECSYNC AX5043_FECSYNC_Msk -/** @} */ - -/** - * @name AX5043 FECSTATUS register fields - * @{ - */ -#define AX5043_FECSTATUS_MAXMETRIC_Pos (0U) -#define AX5043_FECSTATUS_MAXMETRIC_Msk (0x7FU << AX5043_FECSTATUS_MAXMETRIC_Pos) -#define AX5043_FECSTATUS_MAXMETRIC AX5043_FECSTATUS_MAXMETRIC_Msk -#define AX5043_FECSTATUS_FECINV_Pos (7U) -#define AX5043_FECSTATUS_FECINV_Msk (0x1U << AX5043_FECSTATUS_FECINV_Pos) -#define AX5043_FECSTATUS_FECINV AX5043_FECSTATUS_FECINV_Msk -/** @} */ - -/** - * @name AX5043 RADIOSTATE register fields - * @{ - */ -#define AX5043_RADIOSTATE_Pos (0U) -#define AX5043_RADIOSTATE_Msk (0xFU << AX5043_RADIOSTATE_Pos) -#define AX5043_RADIOSTATE AX5043_RADIOSTATE_Msk -#define AX5043_RADIOSTATE_IDLE (0x0U) -#define AX5043_RADIOSTATE_POWERDOWN (0x1U) -#define AX5043_RADIOSTATE_TX_PLL_SET (0x4U) -#define AX5043_RADIOSTATE_TX (0x6U) -#define AX5043_RADIOSTATE_TX_TAIL (0x7U) -#define AX5043_RADIOSTATE_RX_PLL_SET (0x8U) -#define AX5043_RADIOSTATE_RX_ANTSEL (0x9U) -#define AX5043_RADIOSTATE_RX_PREAMBLE1 (0xCU) -#define AX5043_RADIOSTATE_RX_PREAMBLE2 (0xDU) -#define AX5043_RADIOSTATE_RX_PREAMBLE3 (0xEU) -#define AX5043_RADIOSTATE_RX (0xFU) -/** @} */ - -/** - * @name AX5043 XTALSTATUS register fields - * @{ - */ -#define AX5043_XTALSTATUS_XTALRUN_Pos (0U) -#define AX5043_XTALSTATUS_XTALRUN_Msk (0x1U << AX5043_XTALSTATUS_XTALRUN_Pos) -#define AX5043_XTALSTATUS_XTALRUN AX5043_XTALSTATUS_XTALRUN_Msk - -/** - * @name AX5043 PINSTATE register fields - * @{ - */ -#define AX5043_PINSTATE_PSSYSCLK_Pos (0U) -#define AX5043_PINSTATE_PSSYSCLK_Msk (0x1U << AX5043_PINSTATE_PSSYSCLK_Pos) -#define AX5043_PINSTATE_PSSYSCLK AX5043_PINSTATE_PSSYSCLK_Msk -#define AX5043_PINSTATE_PSDCLK_Pos (1U) -#define AX5043_PINSTATE_PSDCLK_Msk (0x1U << AX5043_PINSTATE_PSDCLK_Pos) -#define AX5043_PINSTATE_PSDCLK AX5043_PINSTATE_PSDCLK_Msk -#define AX5043_PINSTATE_PSDATA_Pos (2U) -#define AX5043_PINSTATE_PSDATA_Msk (0x1U << AX5043_PINSTATE_PSDATA_Pos) -#define AX5043_PINSTATE_PSDATA AX5043_PINSTATE_PSDATA_Msk -#define AX5043_PINSTATE_PSIRQ_Pos (3U) -#define AX5043_PINSTATE_PSIRQ_Msk (0x1U << AX5043_PINSTATE_PSIRQ_Pos) -#define AX5043_PINSTATE_PSIRQ AX5043_PINSTATE_PSIRQ_Msk -#define AX5043_PINSTATE_PSANTSEL_Pos (4U) -#define AX5043_PINSTATE_PSANTSEL_Msk (0x1U << AX5043_PINSTATE_PSANTSEL_Pos) -#define AX5043_PINSTATE_PSANTSEL AX5043_PINSTATE_PSANTSEL_Msk -#define AX5043_PINSTATE_PSPWRAMP_Pos (5U) -#define AX5043_PINSTATE_PSPWRAMP_Msk (0x1U << AX5043_PINSTATE_PSPWRAMP_Pos) -#define AX5043_PINSTATE_PSPWRAMP AX5043_PINSTATE_PSPWRAMP_Msk -/** @} */ - -/** - * @name AX5043 PINFUNCSYSCLK register fields - * @{ - */ -#define AX5043_PINFUNCSYSCLK_Pos (0U) -#define AX5043_PINFUNCSYSCLK_Msk (0x1FU << AX5043_PINFUNCSYSCLK_Pos) -#define AX5043_PINFUNCSYSCLK AX5043_PINFUNCSYSCLK_Msk -#define AX5043_PFSYSCLK_OUT_0 (0x00U) -#define AX5043_PFSYSCLK_OUT_1 (0x01U) -#define AX5043_PFSYSCLK_OUT_Z (0x02U) -#define AX5043_PFSYSCLK_OUT_XTAL_INV (0x03U) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV1 (0x04U) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV2 (0x05U) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV4 (0x06U) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV8 (0x07U) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV16 (0x08U) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV32 (0x09U) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV64 (0x0AU) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV128 (0x0BU) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV256 (0x0CU) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV512 (0x0DU) -#define AX5043_PFSYSCLK_OUT_XTAL_DIV1024 (0x0EU) -#define AX5043_PFSYSCLK_OUT_LPOSC (0x0FU) -#define AX5043_PFSYSCLK_OUT_TEST_OBS (0x1FU) -#define AX5043_PINFUNCSYSCLK_PUSYSCLK_Pos (7U) -#define AX5043_PINFUNCSYSCLK_PUSYSCLK_Msk (0x1U << AX5043_PINFUNCSYSCLK_PUSYSCLK_Pos) -#define AX5043_PINFUNCSYSCLK_PUSYSCLK AX5043_PINFUNCSYSCLK_PUSYSCLK_Msk -/** @} */ - -/** - * @name AX5043 PINFUNCDCLK register fields - * @{ - */ -#define AX5043_PINFUNCDCLK_Pos (0U) -#define AX5043_PINFUNCDCLK_Msk (0x7U << AX5043_PINFUNCDCLK_Pos) -#define AX5043_PINFUNCDCLK AX5043_PINFUNCDCLK_Msk -#define AX5043_PFDCLK_OUT_0 (0x0U) -#define AX5043_PFDCLK_OUT_1 (0x1U) -#define AX5043_PFDCLK_OUT_Z (0x2U) -#define AX5043_PFDCLK_IN_MODEM_IO (0x3U) -#define AX5043_PFDCLK_OUT_MODEM (0x4U) -#define AX5043_PFDCLK_OUT_MODEM_IO (0x5U) -#define AX5043_PFDCLK_OUT_TEST_OBS (0x7U) -#define AX5043_PINFUNCDCLK_PIDCLK_Pos (6U) -#define AX5043_PINFUNCDCLK_PIDCLK_Msk (0x1U << AX5043_PINFUNCDCLK_PIDCLK_Pos) -#define AX5043_PINFUNCDCLK_PIDCLK AX5043_PINFUNCDCLK_PIDCLK_Msk -#define AX5043_PINFUNCDCLK_PUDCLK_Pos (7U) -#define AX5043_PINFUNCDCLK_PUDCLK_Msk (0x1U << AX5043_PINFUNCDCLK_PUDCLK_Pos) -#define AX5043_PINFUNCDCLK_PUDCLK AX5043_PINFUNCDCLK_PUDCLK_Msk -/** @} */ - -/** - * @name AX5043 PINFUNCDATA register fields - * @{ - */ -#define AX5043_PINFUNCDATA_Pos (0U) -#define AX5043_PINFUNCDATA_Msk (0xFU << AX5043_PINFUNCDATA_Pos) -#define AX5043_PINFUNCDATA AX5043_PINFUNCDATA_Msk -#define AX5043_PFDATA_OUT_0 (0x0U) -#define AX5043_PFDATA_OUT_1 (0x1U) -#define AX5043_PFDATA_OUT_Z (0x2U) -#define AX5043_PFDATA_IO_FRAME (0x3U) -#define AX5043_PFDATA_IO_MODEM (0x4U) -#define AX5043_PFDATA_IO_MODEM_ASYNC (0x5U) -#define AX5043_PFDATA_OUT_MODEM (0x7U) -#define AX5043_PFDATA_OUT_TEST_OBS (0xFU) -#define AX5043_PINFUNCDATA_PIDATA_Pos (6U) -#define AX5043_PINFUNCDATA_PIDATA_Msk (0x1U << AX5043_PINFUNCDATA_PIDATA_Pos) -#define AX5043_PINFUNCDATA_PIDATA AX5043_PINFUNCDATA_PIDATA_Msk -#define AX5043_PINFUNCDATA_PUDATA_Pos (7U) -#define AX5043_PINFUNCDATA_PUDATA_Msk (0x1U << AX5043_PINFUNCDATA_PUDATA_Pos) -#define AX5043_PINFUNCDATA_PUDATA AX5043_PINFUNCDATA_PUDATA_Msk -/** @} */ - -/** - * @name AX5043 PINFUNCIRQ register fields - * @{ - */ -#define AX5043_PINFUNCIRQ_Pos (0U) -#define AX5043_PINFUNCIRQ_Msk (0x7U << AX5043_PINFUNCIRQ_Pos) -#define AX5043_PINFUNCIRQ AX5043_PINFUNCIRQ_Msk -#define AX5043_PFIRQ_OUT_0 (0x0U) -#define AX5043_PFIRQ_OUT_1 (0x1U) -#define AX5043_PFIRQ_OUT_Z (0x2U) -#define AX5043_PFIRQ_OUT_IRQ (0x3U) -#define AX5043_PFIRQ_OUT_TEST_OBS (0x7U) -#define AX5043_PINFUNCIRQ_PIIRQ_Pos (6U) -#define AX5043_PINFUNCIRQ_PIIRQ_Msk (0x1U << AX5043_PINFUNCIRQ_PIIRQ_Pos) -#define AX5043_PINFUNCIRQ_PIIRQ AX5043_PINFUNCIRQ_PIIRQ_Msk -#define AX5043_PINFUNCIRQ_PUIRQ_Pos (7U) -#define AX5043_PINFUNCIRQ_PUIRQ_Msk (0x1U << AX5043_PINFUNCIRQ_PUIRQ_Pos) -#define AX5043_PINFUNCIRQ_PUIRQ AX5043_PINFUNCIRQ_PUIRQ_Msk -/** @} */ - -/** - * @name AX5043 PINFUNCANTSEL register fields - * @{ - */ -#define AX5043_PINFUNCANTSEL_Pos (0U) -#define AX5043_PINFUNCANTSEL_Msk (0x7U << AX5043_PINFUNCANTSEL_Pos) -#define AX5043_PINFUNCANTSEL AX5043_PINFUNCANTSEL_Msk -#define AX5043_PFANTSEL_OUT_0 (0x0U) -#define AX5043_PFANTSEL_OUT_1 (0x1U) -#define AX5043_PFANTSEL_OUT_Z (0x2U) -#define AX5043_PFANTSEL_OUT_BB_TUNE_CLK (0x3U) -#define AX5043_PFANTSEL_OUT_TCXO_EN (0x4U) -#define AX5043_PFANTSEL_OUT_DAC (0x5U) -#define AX5043_PFANTSEL_OUT_DIVERSE_ANTSEL (0x6U) -#define AX5043_PFANTSEL_OUT_TEST_OBS (0x7U) -#define AX5043_PINFUNCANTSEL_PIANTSEL_Pos (6U) -#define AX5043_PINFUNCANTSEL_PIANTSEL_Msk (0x1U << AX5043_PINFUNCANTSEL_PIANTSEL_Pos) -#define AX5043_PINFUNCANTSEL_PIANTSEL AX5043_PINFUNCANTSEL_PIANTSEL_Msk -#define AX5043_PINFUNCANTSEL_PUANTSEL_Pos (7U) -#define AX5043_PINFUNCANTSEL_PUANTSEL_Msk (0x1U << AX5043_PINFUNCANTSEL_PUANTSEL_Pos) -#define AX5043_PINFUNCANTSEL_PUANTSEL AX5043_PINFUNCANTSEL_PUANTSEL_Msk -/** @} */ - -/** - * @name AX5043 PINFUNCPWRAMP register fields - * @{ - */ -#define AX5043_PINFUNCPWRAMP_Pos (0U) -#define AX5043_PINFUNCPWRAMP_Msk (0xFU << AX5043_PINFUNCPWRAMP_Pos) -#define AX5043_PINFUNCPWRAMP AX5043_PINFUNCPWRAMP_Msk -#define AX5043_PFPWRAMP_OUT_0 (0x0U) -#define AX5043_PFPWRAMP_OUT_1 (0x1U) -#define AX5043_PFPWRAMP_OUT_Z (0x2U) -#define AX5043_PFPWRAMP_IN_DIBIT_SYNC (0x3U) -#define AX5043_PFPWRAMP_OUT_DIBIT_SYNC (0x4U) -#define AX5043_PFPWRAMP_OUT_DAC (0x5U) -#define AX5043_PFPWRAMP_OUT_PWRAMP_CTRL (0x6U) -#define AX5043_PFPWRAMP_OUT_TXCO_EN (0x7U) -#define AX5043_PFPWRAMP_OUT_TEST_OBS (0xFU) -#define AX5043_PINFUNCPWRAMP_PIPWRAMP_Pos (6U) -#define AX5043_PINFUNCPWRAMP_PIPWRAMP_Msk (0x1U << AX5043_PINFUNCPWRAMP_PIPWRAMP_Pos) -#define AX5043_PINFUNCPWRAMP_PIPWRAMP AX5043_PINFUNCPWRAMP_PIPWRAMP_Msk -#define AX5043_PINFUNCPWRAMP_PUPWRAMP_Pos (7U) -#define AX5043_PINFUNCPWRAMP_PUPWRAMP_Msk (0x1U << AX5043_PINFUNCPWRAMP_PUPWRAMP_Pos) -#define AX5043_PINFUNCPWRAMP_PUPWRAMP AX5043_PINFUNCPWRAMP_PUPWRAMP_Msk -/** @} */ - -/** - * @name AX5043 PWRAMP register fields - * @{ - */ -#define AX5043_PWRAMP_Pos (0U) -#define AX5043_PWRAMP_Msk (0x1U << AX5043_PWRAMP_Pos) -#define AX5043_PWRAMP AX5043_PWRAMP_Msk -/** @} */ - -/** - * @name AX5043 FIFOSTAT register fields - * @{ - */ -#define AX5043_FIFOSTAT_FIFOCMD_Pos (0U) -#define AX5043_FIFOSTAT_FIFOCMD_Msk (0x3FU << AX5043_FIFOSTAT_FIFOCMD_Pos) -#define AX5043_FIFOSTAT_FIFOCMD AX5043_FIFOSTAT_FIFOCMD_Msk -#define AX5043_FIFOCMD_NOP (0x00U) -#define AX5043_FIFOCMD_ASK_COHERENT (0x01U) -#define AX5043_FIFOCMD_CLEAR_FIFOERR (0x02U) -#define AX5043_FIFOCMD_CLEAR_FIFODAT (0x03U) -#define AX5043_FIFOCMD_COMMIT (0x04U) -#define AX5043_FIFOCMD_ROLLBACK (0x05U) -#define AX5043_FIFOSTAT_FIFOEMPTY_Pos (0U) -#define AX5043_FIFOSTAT_FIFOEMPTY_Msk (0x1U << AX5043_FIFOSTAT_FIFOEMPTY_Pos) -#define AX5043_FIFOSTAT_FIFOEMPTY AX5043_FIFOSTAT_FIFOEMPTY_Msk -#define AX5043_FIFOSTAT_FIFOFULL_Pos (1U) -#define AX5043_FIFOSTAT_FIFOFULL_Msk (0x1U << AX5043_FIFOSTAT_FIFOFULL_Pos) -#define AX5043_FIFOSTAT_FIFOFULL AX5043_FIFOSTAT_FIFOFULL_Msk -#define AX5043_FIFOSTAT_FIFOUNDER_Pos (2U) -#define AX5043_FIFOSTAT_FIFOUNDER_Msk (0x1U << AX5043_FIFOSTAT_FIFOUNDER_Pos) -#define AX5043_FIFOSTAT_FIFOUNDER AX5043_FIFOSTAT_FIFOUNDER_Msk -#define AX5043_FIFOSTAT_FIFOOVER_Pos (3U) -#define AX5043_FIFOSTAT_FIFOOVER_Msk (0x1U << AX5043_FIFOSTAT_FIFOOVER_Pos) -#define AX5043_FIFOSTAT_FIFOOVER AX5043_FIFOSTAT_FIFOOVER_Msk -#define AX5043_FIFOSTAT_FIFOCNTTHR_Pos (4U) -#define AX5043_FIFOSTAT_FIFOCNTTHR_Msk (0x1U << AX5043_FIFOSTAT_FIFOCNTTHR_Pos) -#define AX5043_FIFOSTAT_FIFOCNTTHR AX5043_FIFOSTAT_FIFOCNTTHR_Msk -#define AX5043_FIFOSTAT_FIFOFREETHR_Pos (5U) -#define AX5043_FIFOSTAT_FIFOFREETHR_Msk (0x1U << AX5043_FIFOSTAT_FIFOFREETHR_Pos) -#define AX5043_FIFOSTAT_FIFOFREETHR AX5043_FIFOSTAT_FIFOFREETHR_Msk -#define AX5043_FIFOSTAT_FIFOAUTOCOMMIT_Pos (7U) -#define AX5043_FIFOSTAT_FIFOAUTOCOMMIT_Msk (0x1U << AX5043_FIFOSTAT_FIFOAUTOCOMMIT_Pos) -#define AX5043_FIFOSTAT_FIFOAUTOCOMMIT AX5043_FIFOSTAT_FIFOAUTOCOMMIT_Msk -/** @} */ - -/** - * @name AX5043 FIFODATA register fields - * @{ - */ -#define AX5043_FIFODATA_Pos (0U) -#define AX5043_FIFODATA_Msk (0xFFU << AX5043_FIFODATA_Pos) -#define AX5043_FIFODATA AX5043_FIFODATA_Msk -/** @} */ - -/** - * @name AX5043 FIFOCOUNT register fields - * @{ - */ -#define AX5043_FIFOCOUNT_Pos (0U) -#define AX5043_FIFOCOUNT_Msk (0x1FFU << AX5043_FIFOCOUNT_Pos) -#define AX5043_FIFOCOUNT AX5043_FIFOCOUNT_Msk -/** @} */ - -/** - * @name AX5043 FIFOFREE register fields - * @{ - */ -#define AX5043_FIFOFREE_Pos (0U) -#define AX5043_FIFOFREE_Msk (0x1FFU << AX5043_FIFOFREE_Pos) -#define AX5043_FIFOFREE AX5043_FIFOFREE_Msk -/** @} */ - -/** - * @name AX5043 FIFOTHRESH register fields - * @{ - */ -#define AX5043_FIFOTHRESH_Pos (0U) -#define AX5043_FIFOTHRESH_Msk (0x1FFU << AX5043_FIFOTHRESH_Pos) -#define AX5043_FIFOTHRESH AX5043_FIFOTHRESH_Msk -/** @} */ - -/** - * @name AX5043 PLLLOOP/PLLLOOPBOOST register fields - * @{ - */ -#define AX5043_PLLLOOP_FLT_Pos (0U) -#define AX5043_PLLLOOP_FLT_Msk (0x3U << AX5043_PLLLOOP_FLT_Pos) -#define AX5043_PLLLOOP_FLT AX5043_PLLLOOP_FLT_Msk -#define AX5043_FLT_EXTERN (0x0U) -#define AX5043_FLT_INTERN_100KHZ (0x1U) -#define AX5043_FLT_INTERN_200KHZ (0x2U) -#define AX5043_FLT_INTERN_300KHZ (0x3U) -#define AX5043_PLLLOOP_FLTEN_Pos (2U) -#define AX5043_PLLLOOP_FLTEN_Msk (0x1U << AX5043_PLLLOOP_FLTEN_Pos) -#define AX5043_PLLLOOP_FLTEN AX5043_PLLLOOP_FLTEN_Msk -#define AX5043_PLLLOOP_DIRECT_Pos (3U) -#define AX5043_PLLLOOP_DIRECT_Msk (0x1U << AX5043_PLLLOOP_DIRECT_Pos) -#define AX5043_PLLLOOP_DIRECT AX5043_PLLLOOP_DIRECT_Msk -#define AX5043_PLLLOOP_FREQSEL_Pos (7U) -#define AX5043_PLLLOOP_FREQSEL_Msk (0x1U << AX5043_PLLLOOP_FREQSEL_Pos) -#define AX5043_PLLLOOP_FREQSEL AX5043_PLLLOOP_FREQSEL_Msk -/** @} */ - -/** - * @name AX5043 PLLCPI/PLLCPIBOOST register fields - * @{ - */ -#define AX5043_PLLCPI_Pos (0U) -#define AX5043_PLLCPI_Msk (0xFFU << AX5043_PLLCPI_Pos) -#define AX5043_PLLCPI AX5043_PLLCPI_Msk -/** @} */ - -/** - * @name AX5043 PLLVCODIV register fields - * @{ - */ -#define AX5043_PLLVCODIV_REFDIV_Pos (0U) -#define AX5043_PLLVCODIV_REFDIV_Msk (0x3U << AX5043_PLLVCODIV_REFDIV_Pos) -#define AX5043_PLLVCODIV_REFDIV AX5043_PLLVCODIV_REFDIV_Msk -#define AX5043_REFDIV_XTAL_DIV1 (0x0U) -#define AX5043_REFDIV_XTAL_DIV2 (0x1U) -#define AX5043_REFDIV_XTAL_DIV4 (0x2U) -#define AX5043_REFDIV_XTAL_DIV8 (0x3U) -#define AX5043_PLLVCODIV_RFDIV_Pos (2U) -#define AX5043_PLLVCODIV_RFDIV_Msk (0x1U << AX5043_PLLVCODIV_RFDIV_Pos) -#define AX5043_PLLVCODIV_RFDIV AX5043_PLLVCODIV_RFDIV_Msk -#define AX5043_PLLVCODIV_VCOSEL_Pos (4U) -#define AX5043_PLLVCODIV_VCOSEL_Msk (0x1U << AX5043_PLLVCODIV_VCOSEL_Pos) -#define AX5043_PLLVCODIV_VCOSEL AX5043_PLLVCODIV_VCOSEL_Msk -#define AX5043_PLLVCODIV_VCO2INT_Pos (5U) -#define AX5043_PLLVCODIV_VCO2INT_Msk (0x1U << AX5043_PLLVCODIV_VCO2INT_Pos) -#define AX5043_PLLVCODIV_VCO2INT AX5043_PLLVCODIV_VCO2INT_Msk -#define AX5043_PLLVCODIV_VCOIMAN_Pos (6U) -#define AX5043_PLLVCODIV_VCOIMAN_Msk (0x1U << AX5043_PLLVCODIV_VCOIMAN_Pos) -#define AX5043_PLLVCODIV_VCOIMAN AX5043_PLLVCODIV_VCOIMAN_Msk -/** @} */ - -/** - * @name AX5043 PLLRANGINGA/PLLRANGINGB register fields - * @{ - */ -#define AX5043_PLLRANGING_VCOR_Pos (0U) -#define AX5043_PLLRANGING_VCOR_Msk (0xFU << AX5043_PLLRANGING_VCOR_Pos) -#define AX5043_PLLRANGING_VCOR AX5043_PLLRANGING_VCOR_Msk -#define AX5043_PLLRANGING_RNGSTART_Pos (4U) -#define AX5043_PLLRANGING_RNGSTART_Msk (0x1U << AX5043_PLLRANGING_RNGSTART_Pos) -#define AX5043_PLLRANGING_RNGSTART AX5043_PLLRANGING_RNGSTART_Msk -#define AX5043_PLLRANGING_RNGERR_Pos (5U) -#define AX5043_PLLRANGING_RNGERR_Msk (0x1U << AX5043_PLLRANGING_RNGERR_Pos) -#define AX5043_PLLRANGING_RNGERR AX5043_PLLRANGING_RNGERR_Msk -#define AX5043_PLLRANGING_PLLLOCK_Pos (6U) -#define AX5043_PLLRANGING_PLLLOCK_Msk (0x1U << AX5043_PLLRANGING_PLLLOCK_Pos) -#define AX5043_PLLRANGING_PLLLOCK AX5043_PLLRANGING_PLLLOCK_Msk -#define AX5043_PLLRANGING_STICKYLOCK_Pos (7U) -#define AX5043_PLLRANGING_STICKYLOCK_Msk (0x1U << AX5043_PLLRANGING_STICKYLOCK_Pos) -#define AX5043_PLLRANGING_STICKYLOCK AX5043_PLLRANGING_STICKYLOCK_Msk -/** @} */ - -/** - * @name AX5043 FREQA/FREQB register fields - * @{ - */ -#define AX5043_FREQ_Pos (0U) -#define AX5043_FREQ_Msk (0xFFFFFFFFU << AX5043_FREQ_Pos) -#define AX5043_FREQ AX5043_FREQ_Msk -/** @} */ - -/** - * @name AX5043 RSSI register fields - * @{ - */ -#define AX5043_RSSI_Pos (0U) -#define AX5043_RSSI_Msk (0xFFU << AX5043_RSSI_Pos) -#define AX5043_RSSI AX5043_RSSI_Msk -/** @} */ - -/** - * @name AX5043 BGNDRSSI register fields - * @{ - */ -#define AX5043_BGNDRSSI_Pos (0U) -#define AX5043_BGNDRSSI_Msk (0xFFU << AX5043_BGNDRSSI_Pos) -#define AX5043_BGNDRSSI AX5043_BGNDRSSI_Msk -/** @} */ - -/** - * @name AX5043 DIVERSITY register fields - * @{ - */ -#define AX5043_DIVERSITY_DIVENA_Pos (0U) -#define AX5043_DIVERSITY_DIVENA_Msk (0x1U << AX5043_DIVERSITY_DIVENA_Pos) -#define AX5043_DIVERSITY_DIVENA AX5043_DIVERSITY_DIVENA_Msk -#define AX5043_DIVERSITY_ANTSEL_Pos (1U) -#define AX5043_DIVERSITY_ANTSEL_Msk (0x1U << AX5043_DIVERSITY_ANTSEL_Pos) -#define AX5043_DIVERSITY_ANTSEL AX5043_DIVERSITY_ANTSEL_Msk -/** @} */ - -/** - * @name AX5043 AGCCOUNTER register fields - * @{ - */ -#define AX5043_AGCCOUNTER_Pos (0U) -#define AX5043_AGCCOUNTER_Msk (0xFFU << AX5043_AGCCOUNTER_Pos) -#define AX5043_AGCCOUNTER AX5043_AGCCOUNTER_Msk -/** @} */ - -/** - * @name AX5043 TRKDATARATE register fields - * @{ - */ -#define AX5043_TRKDATARATE_Pos (0U) -#define AX5043_TRKDATARATE_Msk (0xFFFFFFU << AX5043_TRKDATARATE_Pos) -#define AX5043_TRKDATARATE AX5043_TRKDATARATE_Msk -/** @} */ - -/** - * @name AX5043 TRKAMPL register fields - * @{ - */ -#define AX5043_TRKAMPL_Pos (0U) -#define AX5043_TRKAMPL_Msk (0xFFFFU << AX5043_TRKAMPL_Pos) -#define AX5043_TRKAMPL AX5043_TRKAMPL_Msk -/** @} */ - -/** - * @name AX5043 TRKPHASE register fields - * @{ - */ -#define AX5043_TRKPHASE_Pos (0U) -#define AX5043_TRKPHASE_Msk (0xFFFU << AX5043_TRKPHASE_Pos) -#define AX5043_TRKPHASE AX5043_TRKPHASE_Msk -/** @} */ - -/** - * @name AX5043 TRKRFFREQ register fields - * @{ - */ -#define AX5043_TRKRFFREQ_Pos (0U) -#define AX5043_TRKRFFREQ_Msk (0xFFFFFU << AX5043_TRKRFFREQ_Pos) -#define AX5043_TRKRFFREQ AX5043_TRKRFFREQ_Msk -/** @} */ - -/** - * @name AX5043 TRKFREQ register fields - * @{ - */ -#define AX5043_TRKFREQ_Pos (0U) -#define AX5043_TRKFREQ_Msk (0xFFFFU << AX5043_TRKFREQ_Pos) -#define AX5043_TRKFREQ AX5043_TRKFREQ_Msk -/** @} */ - -/** - * @name AX5043 TRKFSKDEMOD register fields - * @{ - */ -#define AX5043_TRKFSKDEMOD_Pos (0U) -#define AX5043_TRKFSKDEMOD_Msk (0x3FFFU << AX5043_TRKFSKDEMOD_Pos) -#define AX5043_TRKFSKDEMOD AX5043_TRKFSKDEMOD_Msk -/** @} */ - -/** - * @name AX5043 TRKAFSKDEMOD register fields - * @{ - */ -#define AX5043_TRKAFSKDEMOD_Pos (0U) -#define AX5043_TRKAFSKDEMOD_Msk (0xFFFFU << AX5043_TRKAFSKDEMOD_Pos) -#define AX5043_TRKAFSKDEMOD AX5043_TRKAFSKDEMOD_Msk -/** @} */ - -/** - * @name AX5043 Tracking register reset fields - * - * @note For writes to TRKDATARATE, TRKAMPL, TRKPHASE registers - * TODO: Verify these are correct? - * @{ - */ -#define AX5043_TRACKING_DTRKRESET_Pos (3U) -#define AX5043_TRACKING_DTRKRESET_Msk (0x1U << AX5043_TRACKING_DTRKRESET_Pos) -#define AX5043_TRACKING_DTRKRESET AX5043_TRACKING_DTRKRESET_Msk -#define AX5043_TRACKING_ATRKRESET_Pos (4U) -#define AX5043_TRACKING_ATRKRESET_Msk (0x1U << AX5043_TRACKING_ATRKRESET_Pos) -#define AX5043_TRACKING_ATRKRESET AX5043_TRACKING_ATRKRESET_Msk -#define AX5043_TRACKING_PTRKRESET_Pos (5U) -#define AX5043_TRACKING_PTRKRESET_Msk (0x1U << AX5043_TRACKING_PTRKRESET_Pos) -#define AX5043_TRACKING_PTRKRESET AX5043_TRACKING_PTRKRESET_Msk -#define AX5043_TRACKING_RTRKRESET_Pos (6U) -#define AX5043_TRACKING_RTRKRESET_Msk (0x1U << AX5043_TRACKING_RTRKRESET_Pos) -#define AX5043_TRACKING_RTRKRESET AX5043_TRACKING_RTRKRESET_Msk -#define AX5043_TRACKING_FTRKRESET_Pos (7U) -#define AX5043_TRACKING_FTRKRESET_Msk (0x1U << AX5043_TRACKING_FTRKRESET_Pos) -#define AX5043_TRACKING_FTRKRESET AX5043_TRACKING_FTRKRESET_Msk -/** @} */ - -/** - * @name AX5043 TIMER register fields - * @{ - */ -#define AX5043_TIMER_Pos (0U) -#define AX5043_TIMER_Msk (0xFFFFFFU << AX5043_TIMER_Pos) -#define AX5043_TIMER AX5043_TIMER_Msk -/** @} */ - -/** - * @name AX5043 WAKEUPTIMER register fields - * @{ - */ -#define AX5043_WAKEUPTIMER_Pos (0U) -#define AX5043_WAKEUPTIMER_Msk (0xFFFFU << AX5043_WAKEUPTIMER_Pos) -#define AX5043_WAKEUPTIMER AX5043_WAKEUPTIMER_Msk -/** @} */ - -/** - * @name AX5043 WAKEUP register fields - * @{ - */ -#define AX5043_WAKEUP_Pos (0U) -#define AX5043_WAKEUP_Msk (0xFFFFU << AX5043_WAKEUP_Pos) -#define AX5043_WAKEUP AX5043_WAKEUP_Msk -/** @} */ - -/** - * @name AX5043 WAKEUPFREQ register fields - * @{ - */ -#define AX5043_WAKEUPFREQ_Pos (0U) -#define AX5043_WAKEUPFREQ_Msk (0xFFFFU << AX5043_WAKEUPFREQ_Pos) -#define AX5043_WAKEUPFREQ AX5043_WAKEUPFREQ_Msk -/** @} */ - -/** - * @name AX5043 WAKEUPXOEARLY register fields - * @{ - */ -#define AX5043_WAKEUPXOEARLY_Pos (0U) -#define AX5043_WAKEUPXOEARLY_Msk (0xFFU << AX5043_WAKEUPXOEARLY_Pos) -#define AX5043_WAKEUPXOEARLY AX5043_WAKEUPXOEARLY_Msk -/** @} */ - -/** - * @name AX5043 IFFREQ register fields - * @{ - */ -#define AX5043_IFFREQ_Pos (0U) -#define AX5043_IFFREQ_Msk (0xFFFFU << AX5043_IFFREQ_Pos) -#define AX5043_IFFREQ AX5043_IFFREQ_Msk -/** @} */ - -/** - * @name AX5043 DECIMATION register fields - * @{ - */ -#define AX5043_DECIMATION_Pos (0U) -#define AX5043_DECIMATION_Msk (0x7F << AX5043_DECIMATION_Pos) -#define AX5043_DECIMATION AX5043_DECIMATION_Msk -/** @} */ - -/** - * @name AX5043 RXDATARATE register fields - * @{ - */ -#define AX5043_RXDATARATE_Pos (0U) -#define AX5043_RXDATARATE_Msk (0xFFFFFFU << AX5043_RXDATARATE_Pos) -#define AX5043_RXDATARATE AX5043_RXDATARATE_Msk -/** @} */ - -/** - * @name AX5043 MAXDROFFSET register fields - * @{ - */ -#define AX5043_MAXDROFFSET_Pos (0U) -#define AX5043_MAXDROFFSET_Msk (0xFFFFFFU << AX5043_MAXDROFFSET_Pos) -#define AX5043_MAXDROFFSET AX5043_MAXDROFFSET_Msk -/** @} */ - -/** - * @name AX5043 MAXRFOFFSET register fields - * @{ - */ -#define AX5043_MAXRFOFFSET_Pos (0U) -#define AX5043_MAXRFOFFSET_Msk (0xFFFFFU << AX5043_MAXRFOFFSET_Pos) -#define AX5043_MAXRFOFFSET AX5043_MAXRFOFFSET_Msk -#define AX5043_MAXRFOFFSET_FREQOFFSCORR_Pos (23U) -#define AX5043_MAXRFOFFSET_FREQOFFSCORR_Msk (0x1U << AX5043_MAXRFOFFSET_FREQOFFSCORR_Pos) -#define AX5043_MAXRFOFFSET_FREQOFFSCORR AX5043_MAXRFOFFSET_FREQOFFSCORR_Msk -/** @} */ - -/** - * @name AX5043 FSKDMAX register fields - * @{ - */ -#define AX5043_FSKDMAX_Pos (0U) -#define AX5043_FSKDMAX_Msk (0xFFFFU << AX5043_FSKDMAX_Pos) -#define AX5043_FSKDMAX AX5043_FSKDMAX_Msk -/** @} */ - -/** - * @name AX5043 FSKDMIN register fields - * @{ - */ -#define AX5043_FSKDMIN_Pos (0U) -#define AX5043_FSKDMIN_Msk (0xFFFFU << AX5043_FSKDMIN_Pos) -#define AX5043_FSKDMIN AX5043_FSKDMIN_Msk -/** @} */ - -/** - * @name AX5043 AFSKSPACE register fields - * TODO: Verify the field width here - * @{ - */ -#define AX5043_AFSKSPACE_Pos (0U) -#define AX5043_AFSKSPACE_Msk (0xFFFFU << AX5043_AFSKSPACE_Pos) -#define AX5043_AFSKSPACE AX5043_AFSKSPACE_Msk -/** @} */ - -/** - * @name AX5043 AFSKMARK register fields - * TODO: Verify the field width here - * @{ - */ -#define AX5043_AFSKMARK_Pos (0U) -#define AX5043_AFSKMARK_Msk (0xFFFFU << AX5043_AFSKMARK_Pos) -#define AX5043_AFSKMARK AX5043_AFSKMARK_Msk -/** @} */ - -/** - * @name AX5043 AFSKCTRL register fields - * @{ - */ -#define AX5043_AFSKCTRL_AFSKSHIFT_Pos (0U) -#define AX5043_AFSKCTRL_AFSKSHIFT_Msk (0x1FU << AX5043_AFSKCTRL_AFSKSHIFT_Pos) -#define AX5043_AFSKCTRL_AFSKSHIFT AX5043_AFSKCTRL_AFSKSHIFT_Msk -/** @} */ - -/** - * @name AX5043 AMPLFILTER register fields - * @{ - */ -#define AX5043_AMPLFILTER_Pos (0U) -#define AX5043_AMPLFILTER_Msk (0xFU << AX5043_AMPLFILTER_Pos) -#define AX5043_AMPLFILTER AX5043_AMPLFILTER_Msk -/** @} */ - -/** - * @name AX5043 FREQUENCYLEAK register fields - * @{ - */ -#define AX5043_FREQUENCYLEAK_Pos (0U) -#define AX5043_FREQUENCYLEAK_Msk (0xFU << AX5043_FREQUENCYLEAK_Pos) -#define AX5043_FREQUENCYLEAK AX5043_FREQUENCYLEAK_Msk -/** @} */ - -/** - * @name AX5043 RXPARAMSETS register fields - * @{ - */ -#define AX5043_RXPARAMSETS_RXPS0_Pos (0U) -#define AX5043_RXPARAMSETS_RXPS0_Msk (0x3U << AX5043_RXPARAMSETS_RXPS0_Pos) -#define AX5043_RXPARAMSETS_RXPS0 AX5043_RXPARAMSETS_RXPS0_Msk -#define AX5043_RXPARAMSETS_RXPS1_Pos (2U) -#define AX5043_RXPARAMSETS_RXPS1_Msk (0x3U << AX5043_RXPARAMSETS_RXPS1_Pos) -#define AX5043_RXPARAMSETS_RXPS1 AX5043_RXPARAMSETS_RXPS1_Msk -#define AX5043_RXPARAMSETS_RXPS2_Pos (4U) -#define AX5043_RXPARAMSETS_RXPS2_Msk (0x3U << AX5043_RXPARAMSETS_RXPS2_Pos) -#define AX5043_RXPARAMSETS_RXPS2 AX5043_RXPARAMSETS_RXPS2_Msk -#define AX5043_RXPARAMSETS_RXPS3_Pos (6U) -#define AX5043_RXPARAMSETS_RXPS3_Msk (0x3U << AX5043_RXPARAMSETS_RXPS3_Pos) -#define AX5043_RXPARAMSETS_RXPS3 AX5043_RXPARAMSETS_RXPS3_Msk -/** @} */ - -/** - * @name AX5043 RXPARAMCURSET register fields - * @{ - */ -#define AX5043_RXPARAMCURSET_RXSI_Pos (0U) -#define AX5043_RXPARAMCURSET_RXSI_Msk (0x3U << AX5043_RXPARAMCURSET_RXSI_Pos) -#define AX5043_RXPARAMCURSET_RXSI AX5043_RXPARAMCURSET_RXSI_Msk -#define AX5043_RXPARAMCURSET_RXSN_Pos (2U) -#define AX5043_RXPARAMCURSET_RXSN_Msk (0x3U << AX5043_RXPARAMCURSET_RXSN_Pos) -#define AX5043_RXPARAMCURSET_RXSN AX5043_RXPARAMCURSET_RXSN_Msk -#define AX5043_RXPARAMCURSET_RXSI_FUNC_Pos (4U) -#define AX5043_RXPARAMCURSET_RXSI_FUNC_Msk (0x1U << AX5043_RXPARAMCURSET_RXSI_FUNC_Pos) -#define AX5043_RXPARAMCURSET_RXSI_FUNC AX5043_RXPARAMCURSET_RXSI_FUNC_Msk -/** @} */ - -/** - * @name AX5043 AGCGAIN 0/1/2/3 register fields - * @{ - */ -#define AX5043_AGCGAIN_AGCATTACK_Pos (0U) -#define AX5043_AGCGAIN_AGCATTACK_Msk (0xFU << AX5043_AGCGAIN_AGCATTACK_Pos) -#define AX5043_AGCGAIN_AGCATTACK AX5043_AGCGAIN_AGCATTACK_Msk -#define AX5043_AGCGAIN_AGCDECAY_Pos (4U) -#define AX5043_AGCGAIN_AGCDECAY_Msk (0xFU << AX5043_AGCGAIN_AGCDECAY_Pos) -#define AX5043_AGCGAIN_AGCDECAY AX5043_AGCGAIN_AGCDECAY_Msk -/** @} */ - -/** - * @name AX5043 AGCTARGET 0/1/2/3 register fields - * @{ - */ -#define AX5043_AGCTARGET_Pos (0U) -#define AX5043_AGCTARGET_Msk (0xFFU << AX5043_AGCTARGET_Pos) -#define AX5043_AGCTARGET AX5043_AGCTARGET_Msk -/** @} */ - -/** - * @name AX5043 AGCAHYST 0/1/2/3 register fields - * @{ - */ -#define AX5043_AGCAHYST_Pos (0U) -#define AX5043_AGCAHYST_Msk (0x7U << AX5043_AGCAHYST_Pos) -#define AX5043_AGCAHYST AX5043_AGCAHYST_Msk -/** @} */ - -/** - * @name AX5043 AGCMINMAX 0/1/2/3 register fields - * @{ - */ -#define AX5043_AGCMINMAX_AGCMINDA_Pos (0U) -#define AX5043_AGCMINMAX_AGCMINDA_Msk (0x7U << AX5043_AGCMINMAX_AGCMINDA_Pos) -#define AX5043_AGCMINMAX_AGCMINDA AX5043_AGCMINMAX_AGCMINDA_Msk -#define AX5043_AGCMINMAX_AGCMAXDA_Pos (4U) -#define AX5043_AGCMINMAX_AGCMAXDA_Msk (0x7U << AX5043_AGCMINMAX_AGCMAXDA_Pos) -#define AX5043_AGCMINMAX_AGCMAXDA AX5043_AGCMINMAX_AGCMAXDA_Msk -/** @} */ - -/** - * @name AX5043 TIMEGAIN 0/1/2/3 register fields - * @{ - */ -#define AX5043_TIMEGAIN_E_Pos (0U) -#define AX5043_TIMEGAIN_E_Msk (0xFU << AX5043_TIMEGAIN_E_Pos) -#define AX5043_TIMEGAIN_E AX5043_TIMEGAIN_E_Msk -#define AX5043_TIMEGAIN_M_Pos (4U) -#define AX5043_TIMEGAIN_M_Msk (0xFU << AX5043_TIMEGAIN_M_Pos) -#define AX5043_TIMEGAIN_M AX5043_TIMEGAIN_M_Msk -/** @} */ - -/** - * @name AX5043 DRGAIN 0/1/2/3 register fields - * @{ - */ -#define AX5043_DRGAIN_E_Pos (0U) -#define AX5043_DRGAIN_E_Msk (0xFU << AX5043_DRGAIN_E_Pos) -#define AX5043_DRGAIN_E AX5043_DRGAIN_E_Msk -#define AX5043_DRGAIN_M_Pos (4U) -#define AX5043_DRGAIN_M_Msk (0xFU << AX5043_DRGAIN_M_Pos) -#define AX5043_DRGAIN_M AX5043_DRGAIN_M_Msk -/** @} */ - -/** - * @name AX5043 PHASEGAIN 0/1/2/3 register fields - * @{ - */ -#define AX5043_PHASEGAIN_Pos (0U) -#define AX5043_PHASEGAIN_Msk (0xFU << AX5043_PHASEGAIN_Pos) -#define AX5043_PHASEGAIN AX5043_PHASEGAIN_Msk -#define AX5043_PHASEGAIN_FILTERIDX_Pos (6U) -#define AX5043_PHASEGAIN_FILTERIDX_Msk (0x3U << AX5043_PHASEGAIN_FILTERIDX_Pos) -#define AX5043_PHASEGAIN_FILTERIDX AX5043_PHASEGAIN_FILTERIDX_Msk -/** @} */ - -/** - * @name AX5043 FREQGAINA 0/1/2/3 register fields - * @{ - */ -#define AX5043_FREQGAINA_Pos (0U) -#define AX5043_FREQGAINA_Msk (0xFU << AX5043_FREQGAINA_Pos) -#define AX5043_FREQGAINA AX5043_FREQGAINA_Msk -#define AX5043_FREQGAINA_FREQAMPLGATE_Pos (4U) -#define AX5043_FREQGAINA_FREQAMPLGATE_Msk (0x1U << AX5043_FREQGAINA_FREQAMPLGATE_Pos) -#define AX5043_FREQGAINA_FREQAMPLGATE AX5043_FREQGAINA_FREQAMPLGATE_Msk -#define AX5043_FREQGAINA_FREQHALFMOD_Pos (5U) -#define AX5043_FREQGAINA_FREQHALFMOD_Msk (0x1U << AX5043_FREQGAINA_FREQHALFMOD_Pos) -#define AX5043_FREQGAINA_FREQHALFMOD AX5043_FREQGAINA_FREQHALFMOD_Msk -#define AX5043_FREQGAINA_FREQMODULO_Pos (6U) -#define AX5043_FREQGAINA_FREQMODULO_Msk (0x1U << AX5043_FREQGAINA_FREQMODULO_Pos) -#define AX5043_FREQGAINA_FREQMODULO AX5043_FREQGAINA_FREQMODULO_Msk -#define AX5043_FREQGAINA_FREQLIM_Pos (7U) -#define AX5043_FREQGAINA_FREQLIM_Msk (0x1U << AX5043_FREQGAINA_FREQLIM_Pos) -#define AX5043_FREQGAINA_FREQLIM AX5043_FREQGAINA_FREQLIM_Msk -/** @} */ - -/** - * @name AX5043 FREQGAINB 0/1/2/3 register fields - * @{ - */ -#define AX5043_FREQGAINB_Pos (0U) -#define AX5043_FREQGAINB_Msk (0x1FU << AX5043_FREQGAINB_Pos) -#define AX5043_FREQGAINB AX5043_FREQGAINB_Msk -#define AX5043_FREQGAINB_FREQAVG_Pos (6U) -#define AX5043_FREQGAINB_FREQAVG_Msk (0x1U << AX5043_FREQGAINB_FREQAVG_Pos) -#define AX5043_FREQGAINB_FREQAVG AX5043_FREQGAINB_FREQAVG_Msk -#define AX5043_FREQGAINB_FREQFREEZE_Pos (7U) -#define AX5043_FREQGAINB_FREQFREEZE_Msk (0x1U << AX5043_FREQGAINB_FREQFREEZE_Pos) -#define AX5043_FREQGAINB_FREQFREEZE AX5043_FREQGAINB_FREQFREEZE_Msk -/** @} */ - -/** - * @name AX5043 FREQGAINC 0/1/2/3 register fields - * @{ - */ -#define AX5043_FREQGAINC_Pos (0U) -#define AX5043_FREQGAINC_Msk (0x1FU << AX5043_FREQGAINC_Pos) -#define AX5043_FREQGAINC AX5043_FREQGAINC_Msk -/** @} */ - -/** - * @name AX5043 FREQGAIND 0/1/2/3 register fields - * @{ - */ -#define AX5043_FREQGAIND_Pos (0U) -#define AX5043_FREQGAIND_Msk (0x1FU << AX5043_FREQGAIND_Pos) -#define AX5043_FREQGAIND AX5043_FREQGAIND_Msk -#define AX5043_FREQGAIND_RFFREQFREEZE_Pos (7U) -#define AX5043_FREQGAIND_RFFREQFREEZE_Msk (0x1U << AX5043_FREQGAIND_RFFREQFREEZE_Pos) -#define AX5043_FREQGAIND_RFFREQFREEZE AX5043_FREQGAIND_RFFREQFREEZE_Msk -/** @} */ - -/** - * @name AX5043 AMPLGAIN 0/1/2/3 register fields - * @{ - */ -#define AX5043_AMPLGAIN_Pos (0U) -#define AX5043_AMPLGAIN_Msk (0xFU << AX5043_AMPLGAIN_Pos) -#define AX5043_AMPLGAIN AX5043_AMPLGAIN_Msk -#define AX5043_AMPLGAIN_AMPLAGC_Pos (6U) -#define AX5043_AMPLGAIN_AMPLAGC_Msk (0x1U << AX5043_AMPLGAIN_AMPLAGC_Pos) -#define AX5043_AMPLGAIN_AMPLAGC AX5043_AMPLGAIN_AMPLAGC_Msk -#define AX5043_AMPLGAIN_AMPLAVG_Pos (7U) -#define AX5043_AMPLGAIN_AMPLAVG_Msk (0x1U << AX5043_AMPLGAIN_AMPLAVG_Pos) -#define AX5043_AMPLGAIN_AMPLAVG AX5043_AMPLGAIN_AMPLAVG_Msk -/** @} */ - -/** - * @name AX5043 FREQDEV 0/1/2/3 register fields - * @{ - */ -#define AX5043_FREQDEV_Pos (0U) -#define AX5043_FREQDEV_Msk (0xFFFU << AX5043_FREQDEV_Pos) -#define AX5043_FREQDEV AX5043_FREQDEV_Msk -/** @} */ - -/** - * @name AX5043 FOURFSK register fields - * @{ - */ -#define AX5043_FOURFSK_DEVDECAY_Pos (0U) -#define AX5043_FOURFSK_DEVDECAY_Msk (0xFU << AX5043_FOURFSK_DEVDECAY_Pos) -#define AX5043_FOURFSK_DEVDECAY AX5043_FOURFSK_DEVDECAY_Msk -#define AX5043_FOURFSK_DEVUPDATE_Pos (4U) -#define AX5043_FOURFSK_DEVUPDATE_Msk (0x1U << AX5043_FOURFSK_DEVUPDATE_Pos) -#define AX5043_FOURFSK_DEVUPDATE AX5043_FOURFSK_DEVUPDATE_Msk -/** @} */ - -/** - * @name AX5043 BBOFFSRES 0/1/2/3 register fields - * @{ - */ -#define AX5043_BBOFFSRES_RESINTA_Pos (0U) -#define AX5043_BBOFFSRES_RESINTA_Msk (0xFU << AX5043_BBOFFSRES_RESINTA_Pos) -#define AX5043_BBOFFSRES_RESINTA AX5043_BBOFFSRES_RESINTA_Msk -#define AX5043_BBOFFSRES_RESINTB_Pos (4U) -#define AX5043_BBOFFSRES_RESINTB_Msk (0xFU << AX5043_BBOFFSRES_RESINTB_Pos) -#define AX5043_BBOFFSRES_RESINTB AX5043_BBOFFSRES_RESINTB_Msk -/** @} */ - -/** - * @name AX5043 MODCFGF register fields - * @{ - */ -#define AX5043_MODCFGF_FREQSHAPE_Pos (0U) -#define AX5043_MODCFGF_FREQSHAPE_Msk (0x3U << AX5043_MODCFGF_FREQSHAPE_Pos) -#define AX5043_MODCFGF_FREQSHAPE AX5043_MODCFGF_FREQSHAPE_Msk -#define AX5043_FREQSHAPE_EXTERN_LOOP_FILT (0x0U) -#define AX5043_FREQSHAPE_GAUSS_BT_0_3 (0x2U) -#define AX5043_FREQSHAPE_GAUSS_BT_0_5 (0x3U) -/** @} */ - -/** - * @name AX5043 FSKDEV register fields - * @{ - */ -#define AX5043_FSKDEV_Pos (0U) -#define AX5043_FSKDEV_Msk (0xFFFFFFU << AX5043_FSKDEV_Pos) -#define AX5043_FSKDEV AX5043_FSKDEV_Msk -#define AX5043_FSKDEV_FMSHIFT_Pos (0U) -#define AX5043_FSKDEV_FMSHIFT_Msk (0x3U << AX5043_FSKDEV_FMSHIFT_Pos) -#define AX5043_FSKDEV_FMSHIFT AX5043_FSKDEV_FMSHIFT_Msk -#define AX5043_FSKDEV_FMINPUT_Pos (8U) -#define AX5043_FSKDEV_FMINPUT_Msk (0x3U << AX5043_FSKDEV_FMINPUT_Pos) -#define AX5043_FSKDEV_FMINPUT AX5043_FSKDEV_FMINPUT_Msk -#define AX5043_FSKDEV_FMSEXT_Pos (14U) -#define AX5043_FSKDEV_FMSEXT_Msk (0x1U << AX5043_FSKDEV_FMSEXT_Pos) -#define AX5043_FSKDEV_FMSEXT AX5043_FSKDEV_FMSEXT_Msk -#define AX5043_FSKDEV_FMOFFS_Pos (15U) -#define AX5043_FSKDEV_FMOFFS_Msk (0x1U << AX5043_FSKDEV_FMOFFS_Pos) -#define AX5043_FSKDEV_FMOFFS AX5043_FSKDEV_FMOFFS_Msk -/** @} */ - -/** - * @name AX5043 MODCFGA register fields - * @{ - */ -#define AX5043_MODCFGA_TXDIFF_Pos (0U) -#define AX5043_MODCFGA_TXDIFF_Msk (0x1U << AX5043_MODCFGA_TXDIFF_Pos) -#define AX5043_MODCFGA_TXDIFF AX5043_MODCFGA_TXDIFF_Msk -#define AX5043_MODCFGA_TXSE_Pos (1U) -#define AX5043_MODCFGA_TXSE_Msk (0x1U << AX5043_MODCFGA_TXSE_Pos) -#define AX5043_MODCFGA_TXSE AX5043_MODCFGA_TXSE_Msk -#define AX5043_MODCFGA_AMPLSHAPE_Pos (2U) -#define AX5043_MODCFGA_AMPLSHAPE_Msk (0x1U << AX5043_MODCFGA_AMPLSHAPE_Pos) -#define AX5043_MODCFGA_AMPLSHAPE AX5043_MODCFGA_AMPLSHAPE_Msk -#define AX5043_AMPLSHAPE_UNSHAPED (0x0U) -#define AX5043_AMPLSHAPE_RAISEDCOS (0x1U) -#define AX5043_MODCFGA_SLOWRAMP_Pos (4U) -#define AX5043_MODCFGA_SLOWRAMP_Msk (0x3U << AX5043_MODCFGA_SLOWRAMP_Pos) -#define AX5043_MODCFGA_SLOWRAMP AX5043_MODCFGA_SLOWRAMP_Msk -#define AX5043_SLOWRAMP_1BIT (0x0U) -#define AX5043_SLOWRAMP_2BIT (0x1U) -#define AX5043_SLOWRAMP_4BIT (0x2U) -#define AX5043_SLOWRAMP_8BIT (0x3U) -#define AX5043_MODCFGA_PTTLCKGATE_Pos (6U) -#define AX5043_MODCFGA_PTTLCKGATE_Msk (0x1U << AX5043_MODCFGA_PTTLCKGATE_Pos) -#define AX5043_MODCFGA_PTTLCKGATE AX5043_MODCFGA_PTTLCKGATE_Msk -#define AX5043_MODCFGA_BROWNGATE_Pos (7U) -#define AX5043_MODCFGA_BROWNGATE_Msk (0x1U << AX5043_MODCFGA_BROWNGATE_Pos) -#define AX5043_MODCFGA_BROWNGATE AX5043_MODCFGA_BROWNGATE_Msk -/** @} */ - -/** - * @name AX5043 TXRATE register fields - * @{ - */ -#define AX5043_TXRATE_Pos (0U) -#define AX5043_TXRATE_Msk (0xFFFFFFU << AX5043_TXRATE_Pos) -#define AX5043_TXRATE AX5043_TXRATE_Msk -/** @} */ - -/** - * @name AX5043 TXPWRCOEFF A/B/C/D/E register fields - * @{ - */ -#define AX5043_TXPWRCOEFF_Pos (0U) -#define AX5043_TXPWRCOEFF_Msk (0xFFFFU << AX5043_TXPWRCOEFF_Pos) -#define AX5043_TXPWRCOEFF AX5043_TXPWRCOEFF_Msk -/** @} */ - -/** - * @name AX5043 PLLVCOI register fields - * @{ - */ -#define AX5043_PLLVCOI_VCOI_Pos (0U) -#define AX5043_PLLVCOI_VCOI_Msk (0x3FU << AX5043_PLLVCOI_VCOI_Pos) -#define AX5043_PLLVCOI_VCOI AX5043_PLLVCOI_VCOI_Msk -#define AX5043_PLLVCOI_VCOIE_Pos (7U) -#define AX5043_PLLVCOI_VCOIE_Msk (0x1U << AX5043_PLLVCOI_VCOIE_Pos) -#define AX5043_PLLVCOI_VCOIE AX5043_PLLVCOI_VCOIE_Msk -/** @} */ - -/** - * @name AX5043 PLLVCOIR register fields - * @{ - */ -#define AX5043_PLLVCOIR_Pos (0U) -#define AX5043_PLLVCOIR_Msk (0x3FU << AX5043_PLLVCOIR_Pos) -#define AX5043_PLLVCOIR AX5043_PLLVCOIR_Msk -/** @} */ - -/** - * @name AX5043 PLLLOCKDET register fields - * @{ - */ -#define AX5043_PLLLOCKDET_LOCKDETDLY_Pos (0U) -#define AX5043_PLLLOCKDET_LOCKDETDLY_Msk (0x3U << AX5043_PLLLOCKDET_LOCKDETDLY_Pos) -#define AX5043_PLLLOCKDET_LOCKDETDLY AX5043_PLLLOCKDET_LOCKDETDLY_Msk -#define AX5043_LOCKDETDLY_6NS (0x0U) -#define AX5043_LOCKDETDLY_9NS (0x1U) -#define AX5043_LOCKDETDLY_12NS (0x2U) -#define AX5043_LOCKDETDLY_14NS (0x3U) -#define AX5043_PLLLOCKDET_LOCKDETDLYM_Pos (2U) -#define AX5043_PLLLOCKDET_LOCKDETDLYM_Msk (0x1U << AX5043_PLLLOCKDET_LOCKDETDLYM_Pos) -#define AX5043_PLLLOCKDET_LOCKDETDLYM AX5043_PLLLOCKDET_LOCKDETDLYM_Msk -#define AX5043_PLLLOCKDET_LOCKDETDLYR_Pos (6U) -#define AX5043_PLLLOCKDET_LOCKDETDLYR_Msk (0x3U << AX5043_PLLLOCKDET_LOCKDETDLYR_Pos) -#define AX5043_PLLLOCKDET_LOCKDETDLYR AX5043_PLLLOCKDET_LOCKDETDLYR_Msk -/** @} */ - -/** - * @name AX5043 PLLRNGCLK register fields - * @{ - */ -#define AX5043_PLLRNGCLK_Pos (0U) -#define AX5043_PLLRNGCLK_Msk (0x7U << AX5043_PLLRNGCLK_Pos) -#define AX5043_PLLRNGCLK AX5043_PLLRNGCLK_Msk -/** @} */ - -/** - * @name AX5043 XTALCAP register fields - * @{ - */ -#define AX5043_XTALCAP_Pos (0U) -#define AX5043_XTALCAP_Msk (0xFFU << AX5043_XTALCAP_Pos) -#define AX5043_XTALCAP AX5043_XTALCAP_Msk -/** @} */ - -/** - * @name AX5043 BBTUNE register fields - * @{ - */ -#define AX5043_BBTUNE_Pos (0U) -#define AX5043_BBTUNE_Msk (0xFU << AX5043_BBTUNE_Pos) -#define AX5043_BBTUNE AX5043_BBTUNE_Msk -#define AX5043_BBTUNE_BBTUNERUN_Pos (4U) -#define AX5043_BBTUNE_BBTUNERUN_Msk (0x1U << AX5043_BBTUNE_BBTUNERUN_Pos) -#define AX5043_BBTUNE_BBTUNERUN AX5043_BBTUNE_BBTUNERUN_Msk -/** @} */ - -/** - * @name AX5043 BBOFFSCAP register fields - * @{ - */ -#define AX5043_BBOFFSCAP_CAPINTA_Pos (0U) -#define AX5043_BBOFFSCAP_CAPINTA_Msk (0x7U << AX5043_BBOFFSCAP_CAPINTA_Pos) -#define AX5043_BBOFFSCAP_CAPINTA AX5043_BBOFFSCAP_CAPINTA_Msk -#define AX5043_BBOFFSCAP_CAPINTB_Pos (4U) -#define AX5043_BBOFFSCAP_CAPINTB_Msk (0x7U << AX5043_BBOFFSCAP_CAPINTB_Pos) -#define AX5043_BBOFFSCAP_CAPINTB AX5043_BBOFFSCAP_CAPINTB_Msk -/** @} */ - -/** - * @name AX5043 PKTADDRCFG register fields - * @{ - */ -#define AX5043_PKTADDRCFG_ADDRPOS_Pos (0U) -#define AX5043_PKTADDRCFG_ADDRPOS_Msk (0xFU << AX5043_PKTADDRCFG_ADDRPOS_Pos) -#define AX5043_PKTADDRCFG_ADDRPOS AX5043_PKTADDRCFG_ADDRPOS_Msk -#define AX5043_PKTADDRCFG_FECSYNCDIS_Pos (5U) -#define AX5043_PKTADDRCFG_FECSYNCDIS_Msk (0x1U << AX5043_PKTADDRCFG_FECSYNCDIS_Pos) -#define AX5043_PKTADDRCFG_FECSYNCDIS AX5043_PKTADDRCFG_FECSYNCDIS_Msk -#define AX5043_PKTADDRCFG_CRCSKIPFIRST_Pos (6U) -#define AX5043_PKTADDRCFG_CRCSKIPFIRST_Msk (0x1U << AX5043_PKTADDRCFG_CRCSKIPFIRST_Pos) -#define AX5043_PKTADDRCFG_CRCSKIPFIRST AX5043_PKTADDRCFG_CRCSKIPFIRST_Msk -#define AX5043_PKTADDRCFG_MSBFIRST_Pos (7U) -#define AX5043_PKTADDRCFG_MSBFIRST_Msk (0x1U << AX5043_PKTADDRCFG_MSBFIRST_Pos) -#define AX5043_PKTADDRCFG_MSBFIRST AX5043_PKTADDRCFG_MSBFIRST_Msk -/** @} */ - -/** - * @name AX5043 PKTLENCFG register fields - * @{ - */ -#define AX5043_PKTLENCFG_LENPOS_Pos (0U) -#define AX5043_PKTLENCFG_LENPOS_Msk (0xFU << AX5043_PKTLENCFG_LENPOS_Pos) -#define AX5043_PKTLENCFG_LENPOS AX5043_PKTLENCFG_LENPOS_Msk -#define AX5043_PKTLENCFG_LENBITS_Pos (4U) -#define AX5043_PKTLENCFG_LENBITS_Msk (0xFU << AX5043_PKTLENCFG_LENBITS_Pos) -#define AX5043_PKTLENCFG_LENBITS AX5043_PKTLENCFG_LENBITS_Msk -/** @} */ - -/** - * @name AX5043 PKTLENOFFSET register fields - * @{ - */ -#define AX5043_PKTLENOFFSET_Pos (0U) -#define AX5043_PKTLENOFFSET_Msk (0xFFU << AX5043_PKTLENOFFSET_Pos) -#define AX5043_PKTLENOFFSET AX5043_PKTLENOFFSET_Msk -/** @} */ - -/** - * @name AX5043 PKTMAXLEN register fields - * @{ - */ -#define AX5043_PKTMAXLEN_Pos (0U) -#define AX5043_PKTMAXLEN_Msk (0xFFU << AX5043_PKTMAXLEN_Pos) -#define AX5043_PKTMAXLEN AX5043_PKTMAXLEN_Msk -/** @} */ - -/** - * @name AX5043 PKTADDR register fields - * @{ - */ -#define AX5043_PKTADDR_Pos (0U) -#define AX5043_PKTADDR_Msk (0xFFFFFFFFU << AX5043_PKTADDR_Pos) -#define AX5043_PKTADDR AX5043_PKTADDR_Msk -/** @} */ - -/** - * @name AX5043 PKTADDRMASK register fields - * @{ - */ -#define AX5043_PKTADDRMASK_Pos (0U) -#define AX5043_PKTADDRMASK_Msk (0xFFFFFFFFU << AX5043_PKTADDRMASK_Pos) -#define AX5043_PKTADDRMASK AX5043_PKTADDRMASK_Msk -/** @} */ - -/** - * @name AX5043 MATCH0PAT register fields - * @{ - */ -#define AX5043_MATCH0PAT_Pos (0U) -#define AX5043_MATCH0PAT_Msk (0xFFFFFFFFU << AX5043_MATCH0PAT_Pos) -#define AX5043_MATCH0PAT AX5043_MATCH0PAT_Msk -/** @} */ - -/** - * @name AX5043 MATCH0LEN register fields - * @{ - */ -#define AX5043_MATCH0LEN_Pos (0U) -#define AX5043_MATCH0LEN_Msk (0x1FU << AX5043_MATCH0LEN_Pos) -#define AX5043_MATCH0LEN AX5043_MATCH0LEN_Msk -#define AX5043_MATCH0LEN_MATCH0RAW_Pos (7U) -#define AX5043_MATCH0LEN_MATCH0RAW_Msk (0x1U << AX5043_MATCH0LEN_MATCH0RAW_Pos) -#define AX5043_MATCH0LEN_MATCH0RAW AX5043_MATCH0LEN_MATCH0RAW_Msk -/** @} */ - -/** - * @name AX5043 MATCH0MIN register fields - * @{ - */ -#define AX5043_MATCH0MIN_Pos (0U) -#define AX5043_MATCH0MIN_Msk (0x1FU << AX5043_MATCH0MIN_Pos) -#define AX5043_MATCH0MIN AX5043_MATCH0MIN_Msk -/** @} */ - -/** - * @name AX5043 MATCH0MAX register fields - * @{ - */ -#define AX5043_MATCH0MAX_Pos (0U) -#define AX5043_MATCH0MAX_Msk (0x1FU << AX5043_MATCH0MAX_Pos) -#define AX5043_MATCH0MAX AX5043_MATCH0MAX_Msk -/** @} */ - -/** - * @name AX5043 MATCH1PAT register fields - * @{ - */ -#define AX5043_MATCH1PAT_Pos (0U) -#define AX5043_MATCH1PAT_Msk (0xFFFFU << AX5043_MATCH1PAT_Pos) -#define AX5043_MATCH1PAT AX5043_MATCH1PAT_Msk -/** @} */ - -/** - * @name AX5043 MATCH1LEN register fields - * @{ - */ -#define AX5043_MATCH1LEN_Pos (0U) -#define AX5043_MATCH1LEN_Msk (0xFU << AX5043_MATCH1LEN_Pos) -#define AX5043_MATCH1LEN AX5043_MATCH1LEN_Msk -#define AX5043_MATCH1LEN_MATCH1RAW_Pos (7U) -#define AX5043_MATCH1LEN_MATCH1RAW_Msk (0x1U << AX5043_MATCH1LEN_MATCH1RAW_Pos) -#define AX5043_MATCH1LEN_MATCH1RAW AX5043_MATCH1LEN_MATCH1RAW_Msk -/** @} */ - -/** - * @name AX5043 MATCH1MIN register fields - * @{ - */ -#define AX5043_MATCH1MIN_Pos (0U) -#define AX5043_MATCH1MIN_Msk (0xFU << AX5043_MATCH1MIN_Pos) -#define AX5043_MATCH1MIN AX5043_MATCH1MIN_Msk -/** @} */ - -/** - * @name AX5043 MATCH1MAX register fields - * @{ - */ -#define AX5043_MATCH1MAX_Pos (0U) -#define AX5043_MATCH1MAX_Msk (0xFU << AX5043_MATCH1MAX_Pos) -#define AX5043_MATCH1MAX AX5043_MATCH1MAX_Msk -/** @} */ - -/** - * @name AX5043 TMGTXBOOST register fields - * @{ - */ -#define AX5043_TMGTXBOOST_M_Pos (0U) -#define AX5043_TMGTXBOOST_M_Msk (0x1FU << AX5043_TMGTXBOOST_M_Pos) -#define AX5043_TMGTXBOOST_M AX5043_TMGTXBOOST_M_Msk -#define AX5043_TMGTXBOOST_E_Pos (5U) -#define AX5043_TMGTXBOOST_E_Msk (0x7U << AX5043_TMGTXBOOST_E_Pos) -#define AX5043_TMGTXBOOST_E AX5043_TMGTXBOOST_E_Msk -/** @} */ - -/** - * @name AX5043 TMGTXSETTLE register fields - * @{ - */ -#define AX5043_TMGTXSETTLE_M_Pos (0U) -#define AX5043_TMGTXSETTLE_M_Msk (0x1FU << AX5043_TMGTXSETTLE_M_Pos) -#define AX5043_TMGTXSETTLE_M AX5043_TMGTXSETTLE_M_Msk -#define AX5043_TMGTXSETTLE_E_Pos (5U) -#define AX5043_TMGTXSETTLE_E_Msk (0x7U << AX5043_TMGTXSETTLE_E_Pos) -#define AX5043_TMGTXSETTLE_E AX5043_TMGTXSETTLE_E_Msk -/** @} */ - -/** - * @name AX5043 TMGRXBOOST register fields - * @{ - */ -#define AX5043_TMGRXBOOST_M_Pos (0U) -#define AX5043_TMGRXBOOST_M_Msk (0x1FU << AX5043_TMGRXBOOST_M_Pos) -#define AX5043_TMGRXBOOST_M AX5043_TMGRXBOOST_M_Msk -#define AX5043_TMGRXBOOST_E_Pos (5U) -#define AX5043_TMGRXBOOST_E_Msk (0x7U << AX5043_TMGRXBOOST_E_Pos) -#define AX5043_TMGRXBOOST_E AX5043_TMGRXBOOST_E_Msk -/** @} */ - -/** - * @name AX5043 TMGRXSETTLE register fields - * @{ - */ -#define AX5043_TMGRXSETTLE_M_Pos (0U) -#define AX5043_TMGRXSETTLE_M_Msk (0x1FU << AX5043_TMGRXSETTLE_M_Pos) -#define AX5043_TMGRXSETTLE_M AX5043_TMGRXSETTLE_M_Msk -#define AX5043_TMGRXSETTLE_E_Pos (5U) -#define AX5043_TMGRXSETTLE_E_Msk (0x7U << AX5043_TMGRXSETTLE_E_Pos) -#define AX5043_TMGRXSETTLE_E AX5043_TMGRXSETTLE_E_Msk -/** @} */ - -/** - * @name AX5043 TMGRXOFFSACQ register fields - * @{ - */ -#define AX5043_TMGRXOFFSACQ_M_Pos (0U) -#define AX5043_TMGRXOFFSACQ_M_Msk (0x1FU << AX5043_TMGRXOFFSACQ_M_Pos) -#define AX5043_TMGRXOFFSACQ_M AX5043_TMGRXOFFSACQ_M_Msk -#define AX5043_TMGRXOFFSACQ_E_Pos (5U) -#define AX5043_TMGRXOFFSACQ_E_Msk (0x7U << AX5043_TMGRXOFFSACQ_E_Pos) -#define AX5043_TMGRXOFFSACQ_E AX5043_TMGRXOFFSACQ_E_Msk -/** @} */ - -/** - * @name AX5043 TMGRXCOARSEAGC register fields - * @{ - */ -#define AX5043_TMGRXCOARSEAGC_M_Pos (0U) -#define AX5043_TMGRXCOARSEAGC_M_Msk (0x1FU << AX5043_TMGRXCOARSEAGC_M_Pos) -#define AX5043_TMGRXCOARSEAGC_M AX5043_TMGRXCOARSEAGC_M_Msk -#define AX5043_TMGRXCOARSEAGC_E_Pos (0U) -#define AX5043_TMGRXCOARSEAGC_E_Msk (0x7U << AX5043_TMGRXCOARSEAGC_E_Pos) -#define AX5043_TMGRXCOARSEAGC_E AX5043_TMGRXCOARSEAGC_E_Msk -/** @} */ - -/** - * @name AX5043 TMGRXAGC register fields - * @{ - */ -#define AX5043_TMGRXAGC_M_Pos (0U) -#define AX5043_TMGRXAGC_M_Msk (0x1FU << AX5043_TMGRXAGC_M_Pos) -#define AX5043_TMGRXAGC_M AX5043_TMGRXAGC_M_Msk -#define AX5043_TMGRXAGC_E_Pos (5U) -#define AX5043_TMGRXAGC_E_Msk (0x7U << AX5043_TMGRXAGC_E_Pos) -#define AX5043_TMGRXAGC_E AX5043_TMGRXAGC_E_Msk -/** @} */ - -/** - * @name AX5043 TMGRXRSSI register fields - * @{ - */ -#define AX5043_TMGRXRSSI_M_Pos (0U) -#define AX5043_TMGRXRSSI_M_Msk (0x1FU << AX5043_TMGRXRSSI_M_Pos) -#define AX5043_TMGRXRSSI_M AX5043_TMGRXRSSI_M_Msk -#define AX5043_TMGRXRSSI_E_Pos (5U) -#define AX5043_TMGRXRSSI_E_Msk (0x7U << AX5043_TMGRXRSSI_E_Pos) -#define AX5043_TMGRXRSSI_E AX5043_TMGRXRSSI_E_Msk -/** @} */ - -/** - * @name AX5043 TMGRXPREAMBLE 1/2/3 register fields - * @{ - */ -#define AX5043_TMGRXPREAMBLE_M_Pos (0U) -#define AX5043_TMGRXPREAMBLE_M_Msk (0x1FU << AX5043_TMGRXPREAMBLE_M_Pos) -#define AX5043_TMGRXPREAMBLE_M AX5043_TMGRXPREAMBLE_M_Msk -#define AX5043_TMGRXPREAMBLE_E_Pos (5U) -#define AX5043_TMGRXPREAMBLE_E_Msk (0x7U << AX5043_TMGRXPREAMBLE_E_Pos) -#define AX5043_TMGRXPREAMBLE_E AX5043_TMGRXPREAMBLE_E_Msk -/** @} */ - -/** - * @name AX5043 RSSIREFERENCE register fields - * @{ - */ -#define AX5043_RSSIREFERENCE_Pos (0U) -#define AX5043_RSSIREFERENCE_Msk (0xFFU << AX5043_RSSIREFERENCE_Pos) -#define AX5043_RSSIREFERENCE AX5043_RSSIREFERENCE_Msk -/** @} */ - -/** - * @name AX5043 RSSIABSTHR register fields - * @{ - */ -#define AX5043_RSSIABSTHR_Pos (0U) -#define AX5043_RSSIABSTHR_Msk (0xFFU << AX5043_RSSIABSTHR_Pos) -#define AX5043_RSSIABSTHR AX5043_RSSIABSTHR_Msk -/** @} */ - -/** - * @name AX5043 BGNDRSSIGAIN register fields - * @{ - */ -#define AX5043_BGNDRSSIGAIN_Pos (0U) -#define AX5043_BGNDRSSIGAIN_Msk (0xFU << AX5043_BGNDRSSIGAIN_Pos) -#define AX5043_BGNDRSSIGAIN AX5043_BGNDRSSIGAIN_Msk -/** @} */ - -/** - * @name AX5043 BGNDRSSITHR register fields - * @{ - */ -#define AX5043_BGNDRSSITHR_Pos (0U) -#define AX5043_BGNDRSSITHR_Msk (0x3FU << AX5043_BGNDRSSITHR_Pos) -#define AX5043_BGNDRSSITHR AX5043_BGNDRSSITHR_Msk -/** @} */ - -/** - * @name AX5043 PKTCHUNKSIZE register fields - * @{ - */ -#define AX5043_PKTCHUNKSIZE_Pos (0U) -#define AX5043_PKTCHUNKSIZE_Msk (0xFU << AX5043_PKTCHUNKSIZE_Pos) -#define AX5043_PKTCHUNKSIZE AX5043_PKTCHUNKSIZE_Msk -#define AX5043_PKTCHUNKSIZE_1 (0x1U) -#define AX5043_PKTCHUNKSIZE_2 (0x2U) -#define AX5043_PKTCHUNKSIZE_4 (0x3U) -#define AX5043_PKTCHUNKSIZE_8 (0x4U) -#define AX5043_PKTCHUNKSIZE_16 (0x5U) -#define AX5043_PKTCHUNKSIZE_32 (0x6U) -#define AX5043_PKTCHUNKSIZE_64 (0x7U) -#define AX5043_PKTCHUNKSIZE_96 (0x8U) -#define AX5043_PKTCHUNKSIZE_128 (0x9U) -#define AX5043_PKTCHUNKSIZE_160 (0xAU) -#define AX5043_PKTCHUNKSIZE_192 (0xBU) -#define AX5043_PKTCHUNKSIZE_224 (0xCU) -#define AX5043_PKTCHUNKSIZE_240 (0xDU) -/** @} */ - -/** - * @name AX5043 PKTMISCFLAGS register fields - * @{ - */ -#define AX5043_PKTMISCFLAGS_RXRSSICLK_Pos (0U) -#define AX5043_PKTMISCFLAGS_RXRSSICLK_Msk (0x1U << AX5043_PKTMISCFLAGS_RXRSSICLK_Pos) -#define AX5043_PKTMISCFLAGS_RXRSSICLK AX5043_PKTMISCFLAGS_RXRSSICLK_Msk -#define AX5043_PKTMISCFLAGS_RXAGCCLK_Pos (1U) -#define AX5043_PKTMISCFLAGS_RXAGCCLK_Msk (0x1U << AX5043_PKTMISCFLAGS_RXAGCCLK_Pos) -#define AX5043_PKTMISCFLAGS_RXAGCCLK AX5043_PKTMISCFLAGS_RXAGCCLK_Msk -#define AX5043_PKTMISCFLAGS_BGNDRSSI_Pos (2U) -#define AX5043_PKTMISCFLAGS_BGNDRSSI_Msk (0x1U << AX5043_PKTMISCFLAGS_BGNDRSSI_Pos) -#define AX5043_PKTMISCFLAGS_BGNDRSSI AX5043_PKTMISCFLAGS_BGNDRSSI_Msk -#define AX5043_PKTMISCFLAGS_AGCSETTLDET_Pos (3U) -#define AX5043_PKTMISCFLAGS_AGCSETTLDET_Msk (0x1U << AX5043_PKTMISCFLAGS_AGCSETTLDET_Pos) -#define AX5043_PKTMISCFLAGS_AGCSETTLDET AX5043_PKTMISCFLAGS_AGCSETTLDET_Msk -#define AX5043_PKTMISCFLAGS_WORMULTIPKT_Pos (4U) -#define AX5043_PKTMISCFLAGS_WORMULTIPKT_Msk (0x1U << AX5043_PKTMISCFLAGS_WORMULTIPKT_Pos) -#define AX5043_PKTMISCFLAGS_WORMULTIPKT AX5043_PKTMISCFLAGS_WORMULTIPKT_Msk -/** @} */ - -/** - * @name AX5043 PKTSTOREFLAGS register fields - * @{ - */ -#define AX5043_PKTSTOREFLAGS_TIMER_Pos (0U) -#define AX5043_PKTSTOREFLAGS_TIMER_Msk (0x1U << AX5043_PKTSTOREFLAGS_TIMER_Pos) -#define AX5043_PKTSTOREFLAGS_TIMER AX5043_PKTSTOREFLAGS_TIMER_Msk -#define AX5043_PKTSTOREFLAGS_FOFFS_Pos (1U) -#define AX5043_PKTSTOREFLAGS_FOFFS_Msk (0x1U << AX5043_PKTSTOREFLAGS_FOFFS_Pos) -#define AX5043_PKTSTOREFLAGS_FOFFS AX5043_PKTSTOREFLAGS_FOFFS_Msk -#define AX5043_PKTSTOREFLAGS_RFOFFS_Pos (2U) -#define AX5043_PKTSTOREFLAGS_RFOFFS_Msk (0x1U << AX5043_PKTSTOREFLAGS_RFOFFS_Pos) -#define AX5043_PKTSTOREFLAGS_RFOFFS AX5043_PKTSTOREFLAGS_RFOFFS_Msk -#define AX5043_PKTSTOREFLAGS_DR_Pos (3U) -#define AX5043_PKTSTOREFLAGS_DR_Msk (0x1U << AX5043_PKTSTOREFLAGS_DR_Pos) -#define AX5043_PKTSTOREFLAGS_DR AX5043_PKTSTOREFLAGS_DR_Msk -#define AX5043_PKTSTOREFLAGS_RSSI_Pos (4U) -#define AX5043_PKTSTOREFLAGS_RSSI_Msk (0x1U << AX5043_PKTSTOREFLAGS_RSSI_Pos) -#define AX5043_PKTSTOREFLAGS_RSSI AX5043_PKTSTOREFLAGS_RSSI_Msk -#define AX5043_PKTSTOREFLAGS_CRCB_Pos (5U) -#define AX5043_PKTSTOREFLAGS_CRCB_Msk (0x1U << AX5043_PKTSTOREFLAGS_CRCB_Pos) -#define AX5043_PKTSTOREFLAGS_CRCB AX5043_PKTSTOREFLAGS_CRCB_Msk -#define AX5043_PKTSTOREFLAGS_ANTRSSI_Pos (6U) -#define AX5043_PKTSTOREFLAGS_ANTRSSI_Msk (0x1U << AX5043_PKTSTOREFLAGS_ANTRSSI_Pos) -#define AX5043_PKTSTOREFLAGS_ANTRSSI AX5043_PKTSTOREFLAGS_ANTRSSI_Msk -/** @} */ - -/** - * @name AX5043 PKTACCEPTFLAGS register fields - * @{ - */ -#define AX5043_PKTACCEPTFLAGS_RESIDUE_Pos (0U) -#define AX5043_PKTACCEPTFLAGS_RESIDUE_Msk (0x1U << AX5043_PKTACCEPTFLAGS_RESIDUE_Pos) -#define AX5043_PKTACCEPTFLAGS_RESIDUE AX5043_PKTACCEPTFLAGS_RESIDUE_Msk -#define AX5043_PKTACCEPTFLAGS_ABRT_Pos (1U) -#define AX5043_PKTACCEPTFLAGS_ABRT_Msk (0x1U << AX5043_PKTACCEPTFLAGS_ABRT_Pos) -#define AX5043_PKTACCEPTFLAGS_ABRT AX5043_PKTACCEPTFLAGS_ABRT_Msk -#define AX5043_PKTACCEPTFLAGS_CRCF_Pos (2U) -#define AX5043_PKTACCEPTFLAGS_CRCF_Msk (0x1U << AX5043_PKTACCEPTFLAGS_CRCF_Pos) -#define AX5043_PKTACCEPTFLAGS_CRCF AX5043_PKTACCEPTFLAGS_CRCF_Msk -#define AX5043_PKTACCEPTFLAGS_ADDRF_Pos (3U) -#define AX5043_PKTACCEPTFLAGS_ADDRF_Msk (0x1U << AX5043_PKTACCEPTFLAGS_ADDRF_Pos) -#define AX5043_PKTACCEPTFLAGS_ADDRF AX5043_PKTACCEPTFLAGS_ADDRF_Msk -#define AX5043_PKTACCEPTFLAGS_SZF_Pos (4U) -#define AX5043_PKTACCEPTFLAGS_SZF_Msk (0x1U << AX5043_PKTACCEPTFLAGS_SZF_Pos) -#define AX5043_PKTACCEPTFLAGS_SZF AX5043_PKTACCEPTFLAGS_SZF_Msk -#define AX5043_PKTACCEPTFLAGS_LRGP_Pos (5U) -#define AX5043_PKTACCEPTFLAGS_LRGP_Msk (0x1U << AX5043_PKTACCEPTFLAGS_LRGP_Pos) -#define AX5043_PKTACCEPTFLAGS_LRGP AX5043_PKTACCEPTFLAGS_LRGP_Msk -/** @} */ - -/** - * @name AX5043 GPADCCTRL register fields - * @{ - */ -#define AX5043_GPADCCTRL_CHISOL_Pos (0U) -#define AX5043_GPADCCTRL_CHISOL_Msk (0x1U << AX5043_GPADCCTRL_CHISOL_Pos) -#define AX5043_GPADCCTRL_CHISOL AX5043_GPADCCTRL_CHISOL_Msk -#define AX5043_GPADCCTRL_CONT_Pos (1U) -#define AX5043_GPADCCTRL_CONT_Msk (0x1U << AX5043_GPADCCTRL_CONT_Pos) -#define AX5043_GPADCCTRL_CONT AX5043_GPADCCTRL_CONT_Msk -#define AX5043_GPADCCTRL_GPADC13_Pos (2U) -#define AX5043_GPADCCTRL_GPADC13_Msk (0x1U << AX5043_GPADCCTRL_GPADC13_Pos) -#define AX5043_GPADCCTRL_GPADC13 AX5043_GPADCCTRL_GPADC13_Msk -#define AX5043_GPADCCTRL_BUSY_Pos (7U) -#define AX5043_GPADCCTRL_BUSY_Msk (0x1U << AX5043_GPADCCTRL_BUSY_Pos) -#define AX5043_GPADCCTRL_BUSY AX5043_GPADCCTRL_BUSY_Msk -/** @} */ - -/** - * @name AX5043 GPADCPERIOD register fields - * @{ - */ -#define AX5043_GPADCPERIOD_Pos (0U) -#define AX5043_GPADCPERIOD_Msk (0xFFU << AX5043_GPADCPERIOD_Pos) -#define AX5043_GPADCPERIOD AX5043_GPADCPERIOD_Msk -/** @} */ - -/** - * @name AX5043 GPADC13VALUE register fields - * @{ - */ -#define AX5043_GPADC13VALUE_Pos (0U) -#define AX5043_GPADC13VALUE_Msk (0x3FFU << AX5043_GPADC13VALUE_Pos) -#define AX5043_GPADC13VALUE AX5043_GPADC13VALUE_Msk -/** @} */ - -/** - * @name AX5043 LPOSCCONFIG register fields - * @{ - */ -#define AX5043_LPOSCCONFIG_ENA_Pos (0U) -#define AX5043_LPOSCCONFIG_ENA_Msk (0x1U << AX5043_LPOSCCONFIG_ENA_Pos) -#define AX5043_LPOSCCONFIG_ENA AX5043_LPOSCCONFIG_ENA_Msk -#define AX5043_LPOSCCONFIG_FAST_Pos (1U) -#define AX5043_LPOSCCONFIG_FAST_Msk (0x1U << AX5043_LPOSCCONFIG_FAST_Pos) -#define AX5043_LPOSCCONFIG_FAST AX5043_LPOSCCONFIG_FAST_Msk -/* TODO: Verify which bit is IRQF/IRQR, manual is inconsistent */ -#define AX5043_LPOSCCONFIG_IRQF_Pos (2U) -#define AX5043_LPOSCCONFIG_IRQF_Msk (0x1U << AX5043_LPOSCCONFIG_IRQF_Pos) -#define AX5043_LPOSCCONFIG_IRQF AX5043_LPOSCCONFIG_IRQF_Msk -#define AX5043_LPOSCCONFIG_IRQR_Pos (3U) -#define AX5043_LPOSCCONFIG_IRQR_Msk (0x1U << AX5043_LPOSCCONFIG_IRQR_Pos) -#define AX5043_LPOSCCONFIG_IRQR AX5043_LPOSCCONFIG_IRQR_Msk -#define AX5043_LPOSCCONFIG_CALIBF_Pos (4U) -#define AX5043_LPOSCCONFIG_CALIBF_Msk (0x1U << AX5043_LPOSCCONFIG_CALIBF_Pos) -#define AX5043_LPOSCCONFIG_CALIBF AX5043_LPOSCCONFIG_CALIBF_Msk -#define AX5043_LPOSCCONFIG_CALIBR_Pos (5U) -#define AX5043_LPOSCCONFIG_CALIBR_Msk (0x1U << AX5043_LPOSCCONFIG_CALIBR_Pos) -#define AX5043_LPOSCCONFIG_CALIBR AX5043_LPOSCCONFIG_CALIBR_Msk -#define AX5043_LPOSCCONFIG_OSCDOUBLE_Pos (6U) -#define AX5043_LPOSCCONFIG_OSCDOUBLE_Msk (0x1U << AX5043_LPOSCCONFIG_OSCDOUBLE_Pos) -#define AX5043_LPOSCCONFIG_OSCDOUBLE AX5043_LPOSCCONFIG_OSCDOUBLE_Msk -#define AX5043_LPOSCCONFIG_OSCINVERT_Pos (7U) -#define AX5043_LPOSCCONFIG_OSCINVERT_Msk (0x1U << AX5043_LPOSCCONFIG_OSCINVERT_Pos) -#define AX5043_LPOSCCONFIG_OSCINVERT AX5043_LPOSCCONFIG_OSCINVERT_Msk -/** @} */ - -/** - * @name AX5043 LPOSCSTATUS register fields - * @{ - */ -#define AX5043_LPOSCSTATUS_EDGE_Pos (0U) -#define AX5043_LPOSCSTATUS_EDGE_Msk (0x1U << AX5043_LPOSCSTATUS_EDGE_Pos) -#define AX5043_LPOSCSTATUS_EDGE AX5043_LPOSCSTATUS_EDGE_Msk -#define AX5043_LPOSCSTATUS_IRQ_Pos (1U) -#define AX5043_LPOSCSTATUS_IRQ_Msk (0x1U << AX5043_LPOSCSTATUS_IRQ_Pos) -#define AX5043_LPOSCSTATUS_IRQ AX5043_LPOSCSTATUS_IRQ_Msk -/** @} */ - -/** - * @name AX5043 LPOSCFILT register fields - * @{ - */ -#define AX5043_LPOSCFILT_Pos (0U) -#define AX5043_LPOSCFILT_Msk (0xFFFFU << AX5043_LPOSCFILT_Pos) -#define AX5043_LPOSCFILT AX5043_LPOSCFILT_Msk -/** @} */ - -/** - * @name AX5043 LPOSCREF register fields - * @{ - */ -#define AX5043_LPOSCREF_Pos (0U) -#define AX5043_LPOSCREF_Msk (0xFFFFU << AX5043_LPOSCREF_Pos) -#define AX5043_LPOSCREF AX5043_LPOSCREF_Msk -/** @} */ - -/** - * @name AX5043 LPOSCFREQ register fields - * TODO: Verify the field width here - * @{ - */ -#define AX5043_LPOSCFREQ_Pos (0U) -#define AX5043_LPOSCFREQ_Msk (0x3FFU << AX5043_LPOSCFREQ_Pos) -#define AX5043_LPOSCFREQ AX5043_LPOSCFREQ_Msk -/** @} */ - -/** - * @name AX5043 LPOSCPER register fields - * @{ - */ -#define AX5043_LPOSCPER_Pos (0U) -#define AX5043_LPOSCPER_Msk (0xFFFFU << AX5043_LPOSCPER_Pos) -#define AX5043_LPOSCPER AX5043_LPOSCPER_Msk -/** @} */ - -/** - * @name AX5043 DACVALUE register fields - * @{ - */ -#define AX5043_DACVALUE_Pos (0U) -#define AX5043_DACVALUE_Msk (0xFFFU << AX5043_DACVALUE_Pos) -#define AX5043_DACVALUE AX5043_DACVALUE_Msk -#define AX5043_DACVALUE_DACSHIFT_Pos (0U) -#define AX5043_DACVALUE_DACSHIFT_Msk (0xFU << AX5043_DACVALUE_DACSHIFT_Pos) -#define AX5043_DACVALUE_DACSHIFT AX5043_DACVALUE_DACSHIFT_Msk -/** @} */ - -/** - * @name AX5043 DACCONFIG register fields - * @{ - */ -#define AX5043_DACCONFIG_DACINPUT_Pos (0U) -#define AX5043_DACCONFIG_DACINPUT_Msk (0xFU << AX5043_DACCONFIG_DACINPUT_Pos) -#define AX5043_DACCONFIG_DACINPUT AX5043_DACCONFIG_DACINPUT_Msk -#define AX5043_DACINPUT_DACVALUER (0x0U) -#define AX5043_DACINPUT_TRKAMPLITUDE (0x1U) -#define AX5043_DACINPUT_TRKRFFREQUENCY (0x2U) -#define AX5043_DACINPUT_TRKFREQUENCY (0x3U) -#define AX5043_DACINPUT_FSKDEMOD (0x4U) -#define AX5043_DACINPUT_AFSKDEMOD (0x5U) -#define AX5043_DACINPUT_RXSOFTDATA (0x6U) -#define AX5043_DACINPUT_RSSI (0x7U) -#define AX5043_DACINPUT_SAMPLE_ROT_I (0x8U) -#define AX5043_DACINPUT_SAMPLE_ROT_Q (0x9U) -#define AX5043_DACINPUT_GPADC13 (0xCU) -#define AX5043_DACCONFIG_DACCLKX2_Pos (6U) -#define AX5043_DACCONFIG_DACCLKX2_Msk (0x1U << AX5043_DACCONFIG_DACCLKX2_Pos) -#define AX5043_DACCONFIG_DACCLKX2 AX5043_DACCONFIG_DACCLKX2_Msk -#define AX5043_DACCONFIG_DACPWM_Pos (7U) -#define AX5043_DACCONFIG_DACPWM_Msk (0x1U << AX5043_DACCONFIG_DACPWM_Pos) -#define AX5043_DACCONFIG_DACPWM AX5043_DACCONFIG_DACPWM_Msk -/** @} */ - -/** - * @name AX5043 PERFTUNE registers - * @{ - */ -#define AX5043_0xF00_DEFVAL (0x0FU) -#define AX5043_0xF08_DEFVAL (0x04U) -#define AX5043_0xF0C_DEFVAL (0x00U) -#define AX5043_0xF0D_DEFVAL (0x03U) -#define AX5043_0xF10_CRYSTAL (0x03U) -#define AX5043_0xF10_TCXO (0x04U) -#define AX5043_0xF10_GT_43MHZ (0x0DU) -#define AX5043_0xF11_TCXO (0x00U) -#define AX5043_0xF11_CRYSTAL (0x07U) -/* TODO: Try to figure out 0xF18 values */ -#define AX5043_0xF1C_DEFVAL (0x07U) -#define AX5043_0xF21_DEFVAL (0x5CU) -#define AX5043_0xF22_DEFVAL (0x53U) -#define AX5043_0xF23_DEFVAL (0x76U) -#define AX5043_0xF26_DEFVAL (0x92U) -#define AX5043_0xF30_DEFVAL (0x3FU) -#define AX5043_0xF31_DEFVAL (0xF0U) -#define AX5043_0xF32_DEFVAL (0x3FU) -#define AX5043_0xF33_DEFVAL (0xF0U) -#define AX5043_0xF34_NORFDIV (0x08U) -#define AX5043_0xF34_RFDIV (0x28U) -#define AX5043_0xF35_XTALDIV1 (0x10U) -#define AX5043_0xF35_XTALDIV2 (0x11U) -#define AX5043_0xF44_DEFVAL (0x24U) -#define AX5043_0xF72_NORAWSOFTBITS (0x00U) -#define AX5043_0xF72_RAWSOFTBITS (0x06U) -/** @} */ - -/** - * @name AX5043 SPI Status Bits - * @{ - */ -#define AX5043_STATUS_GPADC_INT_Pos (1U) -#define AX5043_STATUS_GPADC_INT_Msk (0x1U << AX5043_STATUS_GPADC_INT_Pos) -#define AX5043_STATUS_GPADC_INT AX5043_STATUS_GPADC_INT_Msk -#define AX5043_STATUS_LPOSC_INT_Pos (2U) -#define AX5043_STATUS_LPOSC_INT_Msk (0x1U << AX5043_STATUS_LPOSC_INT_Pos) -#define AX5043_STATUS_LPOSC_INT AX5043_STATUS_LPOSC_INT_Msk -#define AX5043_STATUS_WAKEUP_INT_Pos (3U) -#define AX5043_STATUS_WAKEUP_INT_Msk (0x1U << AX5043_STATUS_WAKEUP_INT_Pos) -#define AX5043_STATUS_WAKEUP_INT AX5043_STATUS_WAKEUP_INT_Msk -#define AX5043_STATUS_XTAL_INT_Pos (4U) -#define AX5043_STATUS_XTAL_INT_Msk (0x1U << AX5043_STATUS_XTAL_INT_Pos) -#define AX5043_STATUS_XTAL_INT AX5043_STATUS_XTAL_INT_Msk -#define AX5043_STATUS_RADIOEVENT_INT_Pos (5U) -#define AX5043_STATUS_RADIOEVENT_INT_Msk (0x1U << AX5043_STATUS_RADIOEVENT_INT_Pos) -#define AX5043_STATUS_RADIOEVENT_INT AX5043_STATUS_RADIOEVENT_INT_Msk -#define AX5043_STATUS_PWR_INT_Pos (6U) -#define AX5043_STATUS_PWR_INT_Msk (0x1U << AX5043_STATUS_PWR_INT_Pos) -#define AX5043_STATUS_PWR_INT AX5043_STATUS_PWR_INT_Msk -#define AX5043_STATUS_PWRGOOD_Pos (7U) -#define AX5043_STATUS_PWRGOOD_Msk (0x1U << AX5043_STATUS_PWRGOOD_Pos) -#define AX5043_STATUS_PWRGOOD AX5043_STATUS_PWRGOOD_Msk -#define AX5043_STATUS_FIFO_EMPTY_Pos (8U) -#define AX5043_STATUS_FIFO_EMPTY_Msk (0x1U << AX5043_STATUS_FIFO_EMPTY_Pos) -#define AX5043_STATUS_FIFO_EMPTY AX5043_STATUS_FIFO_EMPTY_Msk -#define AX5043_STATUS_FIFO_FULL_Pos (9U) -#define AX5043_STATUS_FIFO_FULL_Msk (0x1U << AX5043_STATUS_FIFO_FULL_Pos) -#define AX5043_STATUS_FIFO_FULL AX5043_STATUS_FIFO_FULL_Msk -#define AX5043_STATUS_THR_COUNT_Pos (10U) -#define AX5043_STATUS_THR_COUNT_Msk (0x1U << AX5043_STATUS_THR_COUNT_Pos) -#define AX5043_STATUS_THR_COUNT AX5043_STATUS_THR_COUNT_Msk -#define AX5043_STATUS_THR_FREE_Pos (11U) -#define AX5043_STATUS_THR_FREE_Msk (0x1U << AX5043_STATUS_THR_FREE_Pos) -#define AX5043_STATUS_THR_FREE AX5043_STATUS_THR_FREE_Msk -#define AX5043_STATUS_FIFO_UNDER_Pos (12U) -#define AX5043_STATUS_FIFO_UNDER_Msk (0x1U << AX5043_STATUS_FIFO_UNDER_Pos) -#define AX5043_STATUS_FIFO_UNDER AX5043_STATUS_FIFO_UNDER_Msk -#define AX5043_STATUS_FIFO_OVER_Pos (13U) -#define AX5043_STATUS_FIFO_OVER_Msk (0x1U << AX5043_STATUS_FIFO_OVER_Pos) -#define AX5043_STATUS_FIFO_OVER AX5043_STATUS_FIFO_OVER_Msk -#define AX5043_STATUS_PLL_LOCK_Pos (14U) -#define AX5043_STATUS_PLL_LOCK_Msk (0x1U << AX5043_STATUS_PLL_LOCK_Pos) -#define AX5043_STATUS_PLL_LOCK AX5043_STATUS_PLL_LOCK_Msk -/** @} */ - -/** - * @name AX5043 FIFO chunk header fields and encodings - * @{ - */ -#define AX5043_FIFOCHUNK_CMD_Pos (0U) -#define AX5043_FIFOCHUNK_CMD_Msk (0x1FU << AX5043_FIFOCHUNK_CMD_Pos) -#define AX5043_FIFOCHUNK_CMD AX5043_FIFOCHUNK_CMD_Msk -#define AX5043_CHUNKCMD_NOP (0x00U) -#define AX5043_CHUNKCMD_DATA (0x01U) -#define AX5043_CHUNKCMD_REPEATDATA (0x02U) -#define AX5043_CHUNKCMD_TIMER (0x10U) -#define AX5043_CHUNKCMD_RSSI (0x11U) -#define AX5043_CHUNKCMD_FREQOFFS (0x12U) -#define AX5043_CHUNKCMD_RFFREQOFFS (0x13U) -#define AX5043_CHUNKCMD_DATARATE (0x14U) -#define AX5043_CHUNKCMD_ANTRSSI (0x15U) -#define AX5043_CHUNKCMD_TXCTRL (0x1CU) -#define AX5043_CHUNKCMD_TXPWR (0x1DU) -#define AX5043_FIFOCHUNK_SIZE_Pos (5U) -#define AX5043_FIFOCHUNK_SIZE_Msk (0x7U << AX5043_FIFOCHUNK_SIZE_Pos) -#define AX5043_FIFOCHUNK_SIZE AX5043_FIFOCHUNK_SIZE_Msk -#define AX5043_CHUNKSIZE_VAR (0x7U) -/** @} */ - -/** - * @name AX5043 FIFO TXCTRL Command flags - * @{ - */ -#define AX5043_CHUNK_TXCTRL_PASTATE_Pos (0U) -#define AX5043_CHUNK_TXCTRL_PASTATE_Msk (0x1U << AX5043_CHUNK_TXCTRL_PASTATE_Pos) -#define AX5043_CHUNK_TXCTRL_PASTATE AX5043_CHUNK_TXCTRL_PASTATE_Msk -#define AX5043_CHUNK_TXCTRL_SETPA_Pos (1U) -#define AX5043_CHUNK_TXCTRL_SETPA_Msk (0x1U << AX5043_CHUNK_TXCTRL_SETPA_Pos) -#define AX5043_CHUNK_TXCTRL_SETPA AX5043_CHUNK_TXCTRL_SETPA_Msk -#define AX5043_CHUNK_TXCTRL_ANTSTATE_Pos (2U) -#define AX5043_CHUNK_TXCTRL_ANTSTATE_Msk (0x1U << AX5043_CHUNK_TXCTRL_ANTSTATE_Pos) -#define AX5043_CHUNK_TXCTRL_ANTSTATE AX5043_CHUNK_TXCTRL_ANTSTATE_Msk -#define AX5043_CHUNK_TXCTRL_SETANT_Pos (3U) -#define AX5043_CHUNK_TXCTRL_SETANT_Msk (0x1U << AX5043_CHUNK_TXCTRL_SETANT_Pos) -#define AX5043_CHUNK_TXCTRL_SETANT AX5043_CHUNK_TXCTRL_SETANT_Msk -#define AX5043_CHUNK_TXCTRL_TXDIFF_Pos (4U) -#define AX5043_CHUNK_TXCTRL_TXDIFF_Msk (0x1U << AX5043_CHUNK_TXCTRL_TXDIFF_Pos) -#define AX5043_CHUNK_TXCTRL_TXDIFF AX5043_CHUNK_TXCTRL_TXDIFF_Msk -#define AX5043_CHUNK_TXCTRL_TXSE_Pos (5U) -#define AX5043_CHUNK_TXCTRL_TXSE_Msk (0x1U << AX5043_CHUNK_TXCTRL_TXSE_Pos) -#define AX5043_CHUNK_TXCTRL_TXSE AX5043_CHUNK_TXCTRL_TXSE_Msk -#define AX5043_CHUNK_TXCTRL_SETTX_Pos (6U) -#define AX5043_CHUNK_TXCTRL_SETTX_Msk (0x1U << AX5043_CHUNK_TXCTRL_SETTX_Pos) -#define AX5043_CHUNK_TXCTRL_SETTX AX5043_CHUNK_TXCTRL_SETTX_Msk -/** @} */ - -/** - * @name AX5043 FIFO REPEATDATA Command flags - * @{ - */ -#define AX5043_CHUNK_REPEATDATA_PKTSTART_Pos (0U) -#define AX5043_CHUNK_REPEATDATA_PKTSTART_Msk (0x1U << AX5043_CHUNK_REPEATDATA_PKTSTART_Pos) -#define AX5043_CHUNK_REPEATDATA_PKTSTART AX5043_CHUNK_REPEATDATA_PKTSTART_Msk -#define AX5043_CHUNK_REPEATDATA_PKTEND_Pos (1U) -#define AX5043_CHUNK_REPEATDATA_PKTEND_Msk (0x1U << AX5043_CHUNK_REPEATDATA_PKTEND_Pos) -#define AX5043_CHUNK_REPEATDATA_PKTEND AX5043_CHUNK_REPEATDATA_PKTEND_Msk -#define AX5043_CHUNK_REPEATDATA_RESIDUE_Pos (2U) -#define AX5043_CHUNK_REPEATDATA_RESIDUE_Msk (0x1U << AX5043_CHUNK_REPEATDATA_RESIDUE_Pos) -#define AX5043_CHUNK_REPEATDATA_RESIDUE AX5043_CHUNK_REPEATDATA_RESIDUE_Msk -#define AX5043_CHUNK_REPEATDATA_NOCRC_Pos (3U) -#define AX5043_CHUNK_REPEATDATA_NOCRC_Msk (0x1U << AX5043_CHUNK_REPEATDATA_NOCRC_Pos) -#define AX5043_CHUNK_REPEATDATA_NOCRC AX5043_CHUNK_REPEATDATA_NOCRC_Msk -#define AX5043_CHUNK_REPEATDATA_RAW_Pos (4U) -#define AX5043_CHUNK_REPEATDATA_RAW_Msk (0x1U << AX5043_CHUNK_REPEATDATA_RAW_Pos) -#define AX5043_CHUNK_REPEATDATA_RAW AX5043_CHUNK_REPEATDATA_RAW_Msk -#define AX5043_CHUNK_REPEATDATA_UNENC_Pos (5U) -#define AX5043_CHUNK_REPEATDATA_UNENC_Msk (0x1U << AX5043_CHUNK_REPEATDATA_UNENC_Pos) -#define AX5043_CHUNK_REPEATDATA_UNENC AX5043_CHUNK_REPEATDATA_UNENC_Msk -/** @} */ - -/** - * @name AX5043 FIFO DATA TX flags - * @{ - */ -#define AX5043_CHUNK_DATATX_PKTSTART_Pos (0U) -#define AX5043_CHUNK_DATATX_PKTSTART_Msk (0x1U << AX5043_CHUNK_DATATX_PKTSTART_Pos) -#define AX5043_CHUNK_DATATX_PKTSTART AX5043_CHUNK_DATATX_PKTSTART_Msk -#define AX5043_CHUNK_DATATX_PKTEND_Pos (1U) -#define AX5043_CHUNK_DATATX_PKTEND_Msk (0x1U << AX5043_CHUNK_DATATX_PKTEND_Pos) -#define AX5043_CHUNK_DATATX_PKTEND AX5043_CHUNK_DATATX_PKTEND_Msk -#define AX5043_CHUNK_DATATX_RESIDUE_Pos (2U) -#define AX5043_CHUNK_DATATX_RESIDUE_Msk (0x1U << AX5043_CHUNK_DATATX_RESIDUE_Pos) -#define AX5043_CHUNK_DATATX_RESIDUE AX5043_CHUNK_DATATX_RESIDUE_Msk -#define AX5043_CHUNK_DATATX_NOCRC_Pos (3U) -#define AX5043_CHUNK_DATATX_NOCRC_Msk (0x1U << AX5043_CHUNK_DATATX_NOCRC_Pos) -#define AX5043_CHUNK_DATATX_NOCRC AX5043_CHUNK_DATATX_NOCRC_Msk -#define AX5043_CHUNK_DATATX_RAW_Pos (4U) -#define AX5043_CHUNK_DATATX_RAW_Msk (0x1U << AX5043_CHUNK_DATATX_RAW_Pos) -#define AX5043_CHUNK_DATATX_RAW AX5043_CHUNK_DATATX_RAW_Msk -#define AX5043_CHUNK_DATATX_UNENC_Pos (5U) -#define AX5043_CHUNK_DATATX_UNENC_Msk (0x1U << AX5043_CHUNK_DATATX_UNENC_Pos) -#define AX5043_CHUNK_DATATX_UNENC AX5043_CHUNK_DATATX_UNENC_Msk -/** @} */ - -/** - * @name AX5043 FIFO DATA RX flags - * @{ - */ -#define AX5043_CHUNK_DATARX_PKTSTART_Pos (0U) -#define AX5043_CHUNK_DATARX_PKTSTART_Msk (0x1U << AX5043_CHUNK_DATARX_PKTSTART_Pos) -#define AX5043_CHUNK_DATARX_PKTSTART AX5043_CHUNK_DATARX_PKTSTART_Msk -#define AX5043_CHUNK_DATARX_PKTEND_Pos (1U) -#define AX5043_CHUNK_DATARX_PKTEND_Msk (0x1U << AX5043_CHUNK_DATARX_PKTEND_Pos) -#define AX5043_CHUNK_DATARX_PKTEND AX5043_CHUNK_DATARX_PKTEND_Msk -#define AX5043_CHUNK_DATARX_RESIDUE_Pos (2U) -#define AX5043_CHUNK_DATARX_RESIDUE_Msk (0x1U << AX5043_CHUNK_DATARX_RESIDUE_Pos) -#define AX5043_CHUNK_DATARX_RESIDUE AX5043_CHUNK_DATARX_RESIDUE_Msk -#define AX5043_CHUNK_DATARX_CRCFAIL_Pos (3U) -#define AX5043_CHUNK_DATARX_CRCFAIL_Msk (0x1U << AX5043_CHUNK_DATARX_CRCFAIL_Pos) -#define AX5043_CHUNK_DATARX_CRCFAIL AX5043_CHUNK_DATARX_CRCFAIL_Msk -#define AX5043_CHUNK_DATARX_ADDRFAIL_Pos (4U) -#define AX5043_CHUNK_DATARX_ADDRFAIL_Msk (0x1U << AX5043_CHUNK_DATARX_ADDRFAIL_Pos) -#define AX5043_CHUNK_DATARX_ADDRFAIL AX5043_CHUNK_DATARX_ADDRFAIL_Msk -#define AX5043_CHUNK_DATARX_SIZEFAIL_Pos (5U) -#define AX5043_CHUNK_DATARX_SIZEFAIL_Msk (0x1U << AX5043_CHUNK_DATARX_SIZEFAIL_Pos) -#define AX5043_CHUNK_DATARX_SIZEFAIL AX5043_CHUNK_DATARX_SIZEFAIL_Msk -#define AX5043_CHUNK_DATARX_ABORT_Pos (6U) -#define AX5043_CHUNK_DATARX_ABORT_Msk (0x1U << AX5043_CHUNK_DATARX_ABORT_Pos) -#define AX5043_CHUNK_DATARX_ABORT AX5043_CHUNK_DATARX_ABORT_Msk -/** @} */ - -/** - * @name AX5043 Frequency ranges - * @{ - */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief AX5043 SPI interface switch. - * @details If set to @p TRUE the support for SPI is included. - * @note The default is @p TRUE. - */ -#if !defined(AX5043_USE_SPI) || defined(__DOXYGEN__) -#define AX5043_USE_SPI TRUE -#endif - -/** - * @brief AX5043 shared SPI switch. - * @details If set to @p TRUE the device acquires SPI bus ownership - * on each transaction. - * @note The default is @p FALSE. Requires SPI_USE_MUTUAL_EXCLUSION. - */ -#if !defined(AX5043_SHARED_SPI) || defined(__DOXYGEN__) -#define AX5043_SHARED_SPI FALSE -#endif - -/** - * @brief Maximum frequency for RFDIV = 0 (DIV 1) - */ -#if !defined(AX5043_RFDIV_DIV1_MAX) || defined(__DOXYGEN__) -#define AX5043_RFDIV_DIV1_MAX (1050000000U) -#endif - -/** - * @brief Minimum frequency for RFDIV = 0 (DIV 1) - */ -#if !defined(AX5043_RFDIV_DIV1_MIN) || defined(__DOXYGEN__) -#define AX5043_RFDIV_DIV1_MIN (800000000U) -#endif - -/** - * @brief Maximum frequency for RFDIV = 1 (DIV 2) - */ -#if !defined(AX5043_RFDIV_DIV2_MAX) || defined(__DOXYGEN__) -#define AX5043_RFDIV_DIV2_MAX (525000000U) -#endif - -/** - * @brief Maximum frequency for RFDIV = 1 (DIV 2) - */ -#if !defined(AX5043_RFDIV_DIV2_MIN) || defined(__DOXYGEN__) -#define AX5043_RFDIV_DIV2_MIN (400000000U) -#endif - -/** - * @brief FIFO Write Length - */ -#if !defined(AX5043_FIFO_WRITE_LEN) || defined(__DOXYGEN__) -#define AX5043_FIFO_WRITE_LEN (128U) -#endif - -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if AX5043_USE_SPI && !HAL_USE_SPI -#error "AX5043_USE_SPI requires HAL_USE_SPI" -#endif - -#if AX5043_SHARED_SPI && !SPI_USE_MUTUAL_EXCLUSION -#error "AX5043_SHARED_SPI requires SPI_USE_MUTUAL_EXCLUSION" -#endif - -#if (AX5043_FIFO_WRITE_LEN > 256U) -#error "AX5043_FIFO_WRITE_LEN must be less than or equal to 256" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @name AX5043 data structures and types. - * @{ - */ -/** - * @brief Structure representing a AX5043 driver. - */ -typedef struct AX5043Driver AX5043Driver; - -/** - * @brief AX5043 status bits. - */ -typedef uint16_t ax5043_status_t; - -/** - * @brief AX5043 TX buffer fill callback type. - * @details Callback used to fill the TX buffer with more data. - * - * @param arg User provided pointer - * - * @return The number of bytes written to the buffer. - * If 0, TX terminates. - */ -typedef size_t (*ax5043_tx_cb_t)(void *arg); - -/** - * @name AX5043 chunk structures. - * @{ - */ -/** - * @brief RSSI - */ -typedef struct __attribute__((packed)) { - int8_t rssi; -} ax5043_chunk_rssi_t; - -/** - * @brief TXCTRL - */ -typedef struct __attribute__((packed)) { - uint8_t header; - uint8_t length; - uint8_t flags; -} ax5043_chunk_txctrl_t; - -/** - * @brief FREQOFFS - */ -typedef struct __attribute__((packed)) { - uint16_t freqoffs; -} ax5043_chunk_freqoffs_t; - -/** - * @brief ANTRSSI2 - */ -typedef struct __attribute__((packed)) { - int8_t rssi; - int8_t bgndnoise; -} ax5043_chunk_antrssi2_t; - -/** - * @brief REPEATDATA - */ -typedef struct __attribute__((packed)) { - uint8_t header; - uint8_t length; - uint8_t flags; - uint8_t repeatcnt; - uint8_t data; -} ax5043_chunk_repeatdata_t; - -/** - * @brief TIMER - */ -typedef struct __attribute__((packed)) { - uint32_t timer; -} ax5043_chunk_timer_t; - -/** - * @brief RFFREQOFFS - */ -typedef struct __attribute__((packed)) { - uint32_t rffreqoffs; -} ax5043_chunk_rffreqoffs_t; - -/** - * @brief DATARATE - */ -typedef struct __attribute__((packed)) { - uint32_t datarate; -} ax5043_chunk_datarate_t; - -/** - * @brief ANTRSSI3 - */ -typedef struct __attribute__((packed)) { - int8_t ant0rssi; - int8_t ant1rssi; - int8_t bgndnoise; -} ax5043_chunk_antrssi3_t; - -/** - * @brief DATA RX - */ -typedef struct __attribute__((packed)) { - uint8_t flags; - uint8_t data[]; -} ax5043_chunk_data_t; - -/** - * @brief DATA TX - */ -typedef struct __attribute__((packed)) { - uint8_t header; - uint8_t length; - uint8_t flags; - uint8_t data[]; -} ax5043_chunk_data_tx_t; - -/** - * @brief TXPWR - */ -typedef struct __attribute__((packed)) { - uint8_t header; - uint8_t length; - uint16_t txpwrcoeffa; - uint16_t txpwrcoeffb; - uint16_t txpwrcoeffc; - uint16_t txpwrcoeffd; - uint16_t txpwrcoeffe; -} ax5043_chunk_txpwr_t; - -/** - * @brief FIFO Chunk union type - */ -typedef union __attribute__((packed)) { - ax5043_chunk_rssi_t rssi; - ax5043_chunk_freqoffs_t freqoffs; - ax5043_chunk_antrssi2_t antrssi2; - ax5043_chunk_timer_t timer; - ax5043_chunk_rffreqoffs_t rffreqoffs; - ax5043_chunk_datarate_t datarate; - ax5043_chunk_antrssi3_t antrssi3; - ax5043_chunk_data_t data; -} ax5043_rx_chunk_t; -/** @} */ - -/** - * @brief Ax5043 Register value pair type - */ -typedef struct { - uint16_t reg; - uint32_t val; - size_t len; -} ax5043_profile_t; - -/** - * @brief Error codes - */ -typedef enum { - AX5043_ERR_NOERROR, - AX5043_ERR_NOTSUPPORTED, - AX5043_ERR_BUSY, - AX5043_ERR_TIMEOUT, - AX5043_ERR_INVALID, - AX5043_ERR_NOCHIP, - AX5043_ERR_RANGING, - AX5043_ERR_LOCKLOST, - AX5043_ERR_RETRANSMISSION, - AX5043_ERR_RESYNC, - AX5043_ERR_RESYNCTIMEOUT, - AX5043_ERR_RECEIVESTART, - AX5043_ERR_FIFO_CHUNK, - AX5043_ERR_FIFO_CMD, - AX5043_ERR_UNEXPECTED_STATE, - AX5043_ERR_NOT_CONNECTED, - AX5043_ERR_REG_NOT_IN_CONF, - AX5043_ERR_VAL_NOT_IN_CONF, - AX5043_ERR_PLLRNG_VAL -} ax5043_err_t; - -/** - * @brief Driver state machine possible states. - */ -typedef enum { - AX5043_UNINIT, /**< Not initialized. */ - AX5043_STOP, /**< Stopped. */ - AX5043_RESET, /**< Reset. */ - AX5043_READY, /**< Ready. */ - AX5043_RX, /**< Receive. */ - AX5043_WOR, /**< Wake-On-Radio. */ - AX5043_TX /**< Transmit. */ -} ax5043_state_t; - -/** - * @brief AX5043 configuration structure. - */ -typedef struct{ -#if (AX5043_USE_SPI) || defined(__DOXYGEN__) - /** - * @brief SPI driver associated with this AX5043. - */ - SPIDriver *spip; - /** - * @brief SPI configuration associated with this AX5043. - */ - const SPIConfig *spicfg; - /** - * @brief PAL Line for MISO, to detect status of device - */ - ioline_t miso; -#endif /* AX5043_USE_SPI */ - /** - * @brief PAL Line for IRQ signal from radio - */ - ioline_t irq; - /** - * @brief XTAL Frequency in Hz - */ - uint32_t xtal_freq; - /** - * @brief Receive FIFO - */ - objects_fifo_t *fifo; - /** - * @brief Optional frame buffer PHY argument - */ - const void *phy_arg; - /** - * @brief Profile register values table - * @note This is for initial configuration and performance tuning. - * Certain registers may be overwritten later, either by - * the driver or a future call to @p ax5043SetProfile. - */ - const ax5043_profile_t *profile; - /** - * @brief Preamble pointer and length - */ - const void *preamble; - size_t preamble_len; - /** - * @brief Postamble pointer and length - */ - const void *postamble; - size_t postamble_len; -} AX5043Config; - -/** - * @brief AX5043 Radio class. - */ -struct AX5043Driver { - /* Driver state */ - ax5043_state_t state; - /* Current configuration data */ - const AX5043Config *config; - /* AX5043 Status bits as of last exchange */ - ax5043_status_t status; - /* Error state of device */ - ax5043_err_t error; - - /* TX state lock */ - mutex_t tx_lock; - - /* IRQ worker thread */ - thread_t *irq_worker; - /* IRQ event Source */ - event_source_t irq_event; - /* RX worker thread */ - thread_t *rx_worker; - - /* Currently active profile */ - const ax5043_profile_t *profile; - - /* Preamble buffer and length */ - const void *preamble; - size_t preamble_len; - /* Postamble buffer and length */ - const void *postamble; - size_t postamble_len; - - /* Last VCOR returned from ranging */ - uint8_t vcora; - uint8_t vcorb; - - /* RX information */ - uint32_t timer; - uint32_t datarate; - uint32_t freq_off; - uint32_t rf_freq_off; - int8_t rssi; - int8_t ant0rssi; - int8_t ant1rssi; - int8_t bgndnoise; -}; -/** @} */ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -#define AX5043_FREQ_TO_REG(freq, ref) (((freq * UINT64_C(0x2000000) + ref) / (ref * 2)) | 0x01U) -#define AX5043_REG_TO_FREQ(reg, ref) (((reg & ~UINT64_C(1)) * ref) / UINT64_C(0x1000000)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -void ax5043ObjectInit(AX5043Driver *devp); -void ax5043Start(AX5043Driver *devp, const AX5043Config *config); -void ax5043Stop(AX5043Driver *devp); - -void ax5043Idle(AX5043Driver *devp); -void ax5043RX(AX5043Driver *devp, bool chan_b, bool wor); -void ax5043TX(AX5043Driver *devp, const ax5043_profile_t *profile, const void *buf, size_t len, size_t total_len, ax5043_tx_cb_t tx_cb, void *tx_cb_arg, bool chan_b); -void ax5043TXRaw(AX5043Driver *devp, const ax5043_profile_t *profile, const void *buf, size_t len, size_t total_len, ax5043_tx_cb_t tx_cb, void *tx_cb_arg, bool chan_b); - -void ax5043SetProfile(AX5043Driver *devp, const ax5043_profile_t *profile); -const ax5043_profile_t *ax5043GetProfile(AX5043Driver *devp); -uint8_t ax5043SetFreq(AX5043Driver *devp, uint32_t freq, uint8_t vcor, bool chan_b); -uint32_t ax5043GetFreq(AX5043Driver *devp); -void ax5043SetPreamble(AX5043Driver *devp, const void *preamble, size_t len); -const void *ax5043GetPreamble(AX5043Driver *devp); -void ax5043SetPostamble(AX5043Driver *devp, const void *postamble, size_t len); -const void *ax5043GetPostamble(AX5043Driver *devp); - -ax5043_status_t ax5043Exchange(AX5043Driver *devp, uint16_t reg, bool write, const void *txbuf, void *rxbuf, size_t n); -ax5043_status_t ax5043GetStatus(AX5043Driver *devp); -uint8_t ax5043ReadU8(AX5043Driver *devp, uint16_t reg); -uint16_t ax5043ReadU16(AX5043Driver *devp, uint16_t reg); -uint32_t ax5043ReadU24(AX5043Driver *devp, uint16_t reg); -uint32_t ax5043ReadU32(AX5043Driver *devp, uint16_t reg); -void ax5043WriteU8(AX5043Driver *devp, uint16_t reg, uint8_t value); -void ax5043WriteU16(AX5043Driver *devp, uint16_t reg, uint16_t value); -void ax5043WriteU24(AX5043Driver *devp, uint16_t reg, uint32_t value); -void ax5043WriteU32(AX5043Driver *devp, uint16_t reg, uint32_t value); - -#ifdef __cplusplus -} -#endif - -#endif /* _AX5043_H_ */ - -/** @} */ diff --git a/common/include/can_bootloader.h b/common/include/can_bootloader.h deleted file mode 100644 index 9a44a095..00000000 --- a/common/include/can_bootloader.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef _CAN_BOOTLOADER_H_ -#define _CAN_BOOTLOADER_H_ -#include "ch.h" -#include "hal.h" - -#define CAN_BOOTLOADER_ENABLE_SERIAL_DEBUG 0 - -#define ORESAT_F0_FLASH_PAGE_SIZE 2048 - -#define BOOTLOADER_EXPECTED_FIRST_FRAME_ID 0x79 -#define STM32_BOOTLOADER_SYNCHRONIZATION_SID 0x79 -#define CAN_ANNOUNCE_MAGIC_NUMBER 0x04030201 -#define STM32_BOOTLOADER_CAN_ACK 0x79 -#define STM32_BOOTLOADER_CAN_NACK 0x1F -#define STM32_BOOTLOADER_CAN_ANNOUNCE 0x47 -#define CAN_BOOTLOADER_WRITE_MEMORY_RESPONSE_SID 0x04 - - -typedef enum { - //ORESAT_BOOTLOADER_CAN_COMMAND_GET = 0x00, - ORESAT_BOOTLOADER_CAN_COMMAND_GET = 0x37, - - //ORESAT_BOOTLOADER_CAN_COMMAND_GET_VERSION = 0x01, - //ORESAT_BOOTLOADER_CAN_COMMAND_GET_ID = 0x02, - //ORESAT_BOOTLOADER_CAN_COMMAND_SPEED = 0x03, - ORESAT_BOOTLOADER_CAN_COMMAND_READ_MEMORY = 0x11, - ORESAT_BOOTLOADER_CAN_COMMAND_GO = 0x21, - ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_MEMORY = 0x31, - ORESAT_BOOTLOADER_CAN_COMMAND_ERASE = 0x43, - //ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_PROTECT = 0x63, - //ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_UNPROTECT = 0x73, - //ORESAT_BOOTLOADER_CAN_COMMAND_READOUT_PROTECT = 0x82, - //ORESAT_BOOTLOADER_CAN_COMMAND_READOUT_UNPROTECT = 0x92, - ORESAT_BOOTLOADER_CAN_COMMAND_SET_OPT_DATA = 0x65 -} oresat_bootloader_can_command_t; - - -typedef uint32_t (*firmware_read_function_ptr_t)(const uint32_t offset, uint8_t *dest_buffer, const uint32_t number_of_bytes, void *arg0); - -typedef struct { - CANDriver *canp; - BaseSequentialStream *chp;//debug stream - uint32_t low_cpu_id; - bool stm32_bootloader_mode; - - void *read_function_arg0; - - uint32_t read_fail_count; - uint32_t write_fail_count; - uint32_t erase_fail_count; - uint32_t verify_fail_count; - uint32_t ack_count; - uint32_t nack_count; - uint32_t unknown_count; - uint32_t can_tx_fail_count; - uint32_t initiate_connection_count; - uint32_t connection_verify_fail; - - uint32_t update_duration_ms; -} can_bootloader_config_t; - -#ifdef __cplusplus -extern "C" { -#endif - -bool can_api_init_can_bootloader_config_t(can_bootloader_config_t *can_bl_config, CANDriver *canp, BaseSequentialStream *chp, const uint32_t low_cpu_id, const bool stm32_bootloader_mode, void *read_function_arg0); - -bool can_bootloader_initiate(can_bootloader_config_t *can_bl_config, const uint32_t timeout_ms); -void print_can_bootloader_config_t(BaseSequentialStream *chp, can_bootloader_config_t *can_bl_config); -bool oresat_firmware_update_m0(can_bootloader_config_t *can_bl_config, const uint32_t base_address, const uint32_t total_firmware_length_bytes, firmware_read_function_ptr_t read_function_pointer); - -const char* oresat_bootloader_can_command_t_to_str(const oresat_bootloader_can_command_t v); - -bool can_bootloader_set_opt_data(can_bootloader_config_t *can_bl_config, const uint8_t data_0_value, const uint8_t data_1_value); - -void can_api_purge_rx_buffer(can_bootloader_config_t *can_bl_config); -void can_api_print_rx_frame(BaseSequentialStream *chp, CANRxFrame *msg, const char *pre_msg, const char *post_msg); -void can_api_print_tx_frame(BaseSequentialStream *chp, CANTxFrame *msg, const char *pre_msg, const char *post_msg); -msg_t can_api_receive(can_bootloader_config_t *can_bl_config, CANRxFrame *msg, const uint32_t timeout_ms); - -//bool can_bootloader_test(can_bootloader_config_t *can_bl_config); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* _CAN_BOOTLOADER_H_ */ diff --git a/common/include/can_hw.h b/common/include/can_hw.h index b0d67853..b48928fa 100644 --- a/common/include/can_hw.h +++ b/common/include/can_hw.h @@ -21,12 +21,6 @@ extern "C" { #if defined(STM32F0XX) // ~87.5% sample point 1Mbps based on 48MHz APB Clock #define CAN_BTR(n) (CAN_BTR_SJW(0)|CAN_BTR_TS1(12)|CAN_BTR_TS2(1)|CAN_BTR_BRP((3000/n)-1)) -#elif defined(STM32F4XX) -// ~87.5% sample point 1Mbps based on 42MHz APB1 Clock -#define CAN_BTR(n) (CAN_BTR_SJW(0)|CAN_BTR_TS1(10)|CAN_BTR_TS2(1)|CAN_BTR_BRP((3000/n)-1)) -#elif defined(STM32L4XX) -// ~87.5% sample point 1Mbps based on 80MHz APB1 Clock -#define CAN_BTR(n) (CAN_BTR_SJW(0)|CAN_BTR_TS1(12)|CAN_BTR_TS2(1)|CAN_BTR_BRP((5000/n)-1)) #else #error "No CAN Config for this MCU" #endif diff --git a/common/include/fram.h b/common/include/fram.h deleted file mode 100644 index 08f7196d..00000000 --- a/common/include/fram.h +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @file fram.h - * @brief F-RAM Driver. - * - * @addtogroup FRAM - * @ingroup ORESAT - * @{ - */ -#ifndef _FRAM_H_ -#define _FRAM_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Version Identification - * @{ - */ -/** - * @brief FRAM Driver version string. - */ -#define FRAM_VERSION "1.0.0" - -/** - * @brief FRAM Driver version major number. - */ -#define FRAM_MAJOR 1 - -/** - * @brief FRAM Driver version minor number. - */ -#define FRAM_MINOR 0 - -/** - * @brief FRAM Driver version patch number. - */ -#define FRAM_PATCH 0 -/** @} */ - -/** - * @name FRAM Properties - * @{ - */ -/** - * @brief FRAM size. - */ -#define FRAM_SIZE 0x2000U -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief FRAM I2C interface switch. - * @details If set to @p TRUE the support for I2C is included. - * @note The default is @p TRUE. - */ -#if !defined(FRAM_USE_I2C) || defined(__DOXYGEN__) -#define FRAM_USE_I2C TRUE -#endif - -/** - * @brief FRAM shared I2C switch. - * @details If set to @p TRUE the device acquires I2C bus ownership - * on each transaction. - * @note The default is @p FALSE. Requires I2C_USE_MUTUAL_EXCLUSION. - */ -#if !defined(FRAM_SHARED_I2C) || defined(__DOXYGEN__) -#define FRAM_SHARED_I2C FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if FRAM_USE_I2C && !HAL_USE_I2C -#error "FRAM_USE_I2C requires HAL_USE_I2C" -#endif - -#if FRAM_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION -#error "FRAM_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @name FRAM data structures and types. - * @{ - */ -/** - * @brief Structure representing a FRAM driver. - */ -typedef struct FRAMDriver FRAMDriver; - -/** - * @brief Driver state machine possible states. - */ -typedef enum { - FRAM_UNINIT = 0, /**< Not initialized. */ - FRAM_STOP = 1, /**< Stopped. */ - FRAM_READY = 2, /**< Ready. */ -} fram_state_t; - -/** - * @brief FRAM configuration structure. - */ -typedef struct { -#if (FRAM_USE_I2C) || defined(__DOXYGEN__) - /** - * @brief I2C driver associated with this FRAM. - */ - I2CDriver *i2cp; - /** - * @brief I2C configuration associated with this FRAM. - */ - const I2CConfig *i2ccfg; - /** - * @brief FRAM Slave Address - */ - i2caddr_t saddr; -#endif /* FRAM_USE_I2C */ -} FRAMConfig; - -/** - * @brief @p FRAM specific methods. - */ -#define _fram_methods_alone - -/** - * @brief @p FRAM specific methods with inherited ones. - */ -#define _fram_methods \ - _base_object_methods - -/** - * @extends BaseObjectVMT - * - * @brief @p FRAM virtual methods table. - */ -struct FRAMVMT { - _fram_methods -}; - -/** - * @brief @p FRAMDriver specific data. - */ -#define _fram_data \ - _base_object_data \ - /* Driver state.*/ \ - fram_state_t state; \ - /* Current configuration data.*/ \ - const FRAMConfig *config; - -/** - * @brief FRAM Power Monitor class. - */ -struct FRAMDriver { - /** @brief Virtual Methods Table.*/ - const struct FRAMVMT *vmt; - _fram_data -}; - -/** @} */ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -extern FRAMDriver FRAMD1; - -void framObjectInit(FRAMDriver *devp); -void framStart(FRAMDriver *devp, const FRAMConfig *config); -void framStop(FRAMDriver *devp); -void framRead(FRAMDriver *devp, uint16_t addr, void *buf, size_t n); -void framWrite(FRAMDriver *devp, uint16_t addr, void *buf, size_t n); -void framErase(FRAMDriver *devp, uint16_t addr, size_t n); -void framEraseAll(FRAMDriver *devp); -#ifdef __cplusplus -} -#endif - -#endif /* _FRAM_H_ */ - -/** @} */ - diff --git a/common/include/fs.h b/common/include/fs.h deleted file mode 100644 index 7a089183..00000000 --- a/common/include/fs.h +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @file fs.h - * @brief Filesystem driver. - * - * @addtogroup Filesystem - * @ingroup ORESAT - * @{ - */ -#ifndef _FS_H_ -#define _FS_H_ - -#include "lfs.h" -#include "lfs_util.h" - -/*============================================================================*/ -/* Driver constants. */ -/*============================================================================*/ - -/*============================================================================*/ -/* Driver pre-compile time settings. */ -/*============================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Filesystem Cache Sizes - */ -#if !defined(FS_CACHE_SIZE) || defined(__DOXYGEN__) -#define FS_CACHE_SIZE (512U) -#endif - -/** - * @brief Filesystem Lookahead buffer size - */ -#if !defined(FS_LOOKAHEAD_SIZE) || defined(__DOXYGEN__) -#define FS_LOOKAHEAD_SIZE (16U) -#endif - -/** - * @brief Maximum number of files open - */ -#if !defined(FS_MAX_HANDLERS) || defined(__DOXYGEN__) -#define FS_MAX_HANDLERS (4U) -#endif - -/** @} */ - -/*============================================================================*/ -/* Derived constants and error checks. */ -/*============================================================================*/ - -/*============================================================================*/ -/* Driver data structures and types. */ -/*============================================================================*/ - -/** - * @name Filesystem data structures and types. - * @{ - */ -/** - * @brief Structure representing a INA226 driver. - */ -typedef struct FSDriver FSDriver; - -/** - * @brief Driver state machine possible states. - */ -typedef enum { - FS_UNINIT = 0, /**< Not initialized. */ - FS_STOP = 1, /**< Stopped. */ - FS_OFFLINE = 2, /**< eMMC is offline. */ - FS_ONLINE = 3, /**< eMMC is online. */ - FS_MOUNTED = 4 /**< Filesystem is mounted. */ -} fs_state_t; - -/** - * @brief Filesystem configuration structure. - */ -typedef struct { - /** - * @brief SDC driver associated with this filesystem. - */ - SDCDriver *sdcp; - /** - * @brief SDC configuration associated with this filesystem. - */ - const SDCConfig *sdccfg; - /** - * @brief GPIO Line for enabling eMMC - */ - ioline_t mmc_pwr; -} FSConfig; - -/** - * @brief Filesystem driver object - */ -struct FSDriver { - /* Driver state */ - fs_state_t state; - /* Current configuration */ - const FSConfig *config; - /* Filesystem mutex */ - mutex_t mutex; - /* LFS object */ - lfs_t lfs; - /* LFS configuration */ - struct lfs_config lfscfg; - /* Last LFS error */ - int err; - /* MMC CID field */ - unpacked_mmc_cid_t mmc_cid; - /* MMC CSD field */ - unpacked_mmc_csd_t mmc_csd; - /* Guarded file pool */ - guarded_memory_pool_t file_pool; - lfs_file_t file[FS_MAX_HANDLERS]; - /* Guarded dir pool */ - guarded_memory_pool_t dir_pool; - lfs_file_t dir[FS_MAX_HANDLERS]; - /* TODO: Implement static file buffers */ - /* Read buffer */ - uint8_t read_buf[FS_CACHE_SIZE]; - /* Program buffer */ - uint8_t prog_buf[FS_CACHE_SIZE]; - /* Lookahead buffer */ - uint8_t lookahead_buf[FS_LOOKAHEAD_SIZE]; -}; - -/** @} */ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Default filesystem object */ -extern FSDriver FSD1; - -/* Driver functions */ -void fs_init(FSDriver *fsp); -void fs_start(FSDriver *fsp, const FSConfig *config); -void fs_stop(FSDriver *fsp); - -/* Filesystem operations */ -int fs_format(FSDriver *fsp); -int fs_mount(FSDriver *fsp, bool format); -int fs_unmount(FSDriver *fsp); -int fs_remove(FSDriver *fsp, const char *path); -int fs_rename(FSDriver *fsp, const char *oldpath, const char *newpath); -int fs_stat(FSDriver *fsp, const char *path, struct lfs_info *info); -lfs_ssize_t fs_getattr(FSDriver *fsp, const char *path, uint8_t type, void *buffer, lfs_size_t size); -int fs_setattr(FSDriver *fsp, const char *path, uint8_t type, const void *buffer, lfs_size_t size); -int fs_removeattr(FSDriver *fsp, const char *path, uint8_t type); -lfs_size_t fs_size(FSDriver *fsp); -uint8_t fs_usage(FSDriver *fsp); - -/* File operations */ -lfs_file_t *file_open(FSDriver *fsp, const char *path, int flags); -int file_close(FSDriver *fsp, lfs_file_t *file); -int file_sync(FSDriver *fsp, lfs_file_t *file); -lfs_ssize_t file_read(FSDriver *fsp, lfs_file_t *file, void *buffer, lfs_size_t size); -lfs_ssize_t file_write(FSDriver *fsp, lfs_file_t *file, const void *buffer, lfs_size_t size); -lfs_soff_t file_seek(FSDriver *fsp, lfs_file_t *file, lfs_soff_t off, int whence); -int file_truncate(FSDriver *fsp, lfs_file_t *file, lfs_soff_t size); -lfs_soff_t file_tell(FSDriver *fsp, lfs_file_t *file); -int file_rewind(FSDriver *fsp, lfs_file_t *file); -lfs_soff_t file_size(FSDriver *fsp, lfs_file_t *file); -uint32_t file_crc(FSDriver *fsp, lfs_file_t *file); - -/* Directory operations */ -int fs_mkdir(FSDriver *fsp, const char *path); -lfs_dir_t *dir_open(FSDriver *fsp, const char *path); -int dir_close(FSDriver *fsp, lfs_dir_t *dir); -int dir_read(FSDriver *fsp, lfs_dir_t *dir, struct lfs_info *info); -int dir_seek(FSDriver *fsp, lfs_dir_t *dir, lfs_soff_t off); -lfs_soff_t dir_tell(FSDriver *fsp, lfs_dir_t *dir); -int dir_rewind(FSDriver *fsp, lfs_dir_t *dir); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/common/include/lfs_util_custom.h b/common/include/lfs_util_custom.h deleted file mode 100644 index c10318c2..00000000 --- a/common/include/lfs_util_custom.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - * lfs utility functions - * - * Copyright (c) 2017, Arm Limited. All rights reserved. - * SPDX-License-Identifier: BSD-3-Clause - */ -#ifndef LFS_CONF_H -#define LFS_CONF_H - -// System includes -#include -#include -#include -#include -#include "ch.h" -#include "hal.h" - -#define LFS_THREADSAFE - -#ifndef LFS_NO_MALLOC -#include -#endif -#if !defined(LFS_NO_DEBUG) || \ - !defined(LFS_NO_WARN) || \ - !defined(LFS_NO_ERROR) || \ - defined(LFS_YES_TRACE) -#include "chprintf.h" -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - - -// Macros, may be replaced by system specific wrappers. Arguments to these -// macros must not have side-effects as the macros can be removed for a smaller -// code footprint - -// Logging functions -#ifdef LFS_YES_TRACE -#define LFS_TRACE_(fmt, ...) \ - chprintf((BaseSequentialStream*)&SD3, "%s:%d:trace: " fmt "%s\r\n", __FILE__, __LINE__, __VA_ARGS__) -#define LFS_TRACE(...) LFS_TRACE_(__VA_ARGS__, "") -#else -#define LFS_TRACE(...) -#endif - -#ifndef LFS_NO_DEBUG -#define LFS_DEBUG_(fmt, ...) \ - chprintf((BaseSequentialStream*)&SD3, "%s:%d:debug: " fmt "%s\r\n", __FILE__, __LINE__, __VA_ARGS__) -#define LFS_DEBUG(...) LFS_DEBUG_(__VA_ARGS__, "") -#else -#define LFS_DEBUG(...) -#endif - -#ifndef LFS_NO_WARN -#define LFS_WARN_(fmt, ...) \ - chprintf((BaseSequentialStream*)&SD3, "%s:%d:warn: " fmt "%s\r\n", __FILE__, __LINE__, __VA_ARGS__) -#define LFS_WARN(...) LFS_WARN_(__VA_ARGS__, "") -#else -#define LFS_WARN(...) -#endif - -#ifndef LFS_NO_ERROR -#define LFS_ERROR_(fmt, ...) \ - chprintf((BaseSequentialStream*)&SD3, "%s:%d:error: " fmt "%s\r\n", __FILE__, __LINE__, __VA_ARGS__) -#define LFS_ERROR(...) LFS_ERROR_(__VA_ARGS__, "") -#else -#define LFS_ERROR(...) -#endif - -// Runtime assertions -#ifndef LFS_NO_ASSERT -#define LFS_ASSERT(test) chDbgCheck(test) -#else -#define LFS_ASSERT(test) -#endif - - -// Builtin functions, these may be replaced by more efficient -// toolchain-specific implementations. LFS_NO_INTRINSICS falls back to a more -// expensive basic C implementation for debugging purposes - -// Min/max functions for unsigned 32-bit numbers -static inline uint32_t lfs_max(uint32_t a, uint32_t b) { - return (a > b) ? a : b; -} - -static inline uint32_t lfs_min(uint32_t a, uint32_t b) { - return (a < b) ? a : b; -} - -// Align to nearest multiple of a size -static inline uint32_t lfs_aligndown(uint32_t a, uint32_t alignment) { - return a - (a % alignment); -} - -static inline uint32_t lfs_alignup(uint32_t a, uint32_t alignment) { - return lfs_aligndown(a + alignment-1, alignment); -} - -// Find the smallest power of 2 greater than or equal to a -static inline uint32_t lfs_npw2(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) - return 32 - __builtin_clz(a-1); -#else - uint32_t r = 0; - uint32_t s; - a -= 1; - s = (a > 0xffff) << 4; a >>= s; r |= s; - s = (a > 0xff ) << 3; a >>= s; r |= s; - s = (a > 0xf ) << 2; a >>= s; r |= s; - s = (a > 0x3 ) << 1; a >>= s; r |= s; - return (r | (a >> 1)) + 1; -#endif -} - -// Count the number of trailing binary zeros in a -// lfs_ctz(0) may be undefined -static inline uint32_t lfs_ctz(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && defined(__GNUC__) - return __builtin_ctz(a); -#else - return lfs_npw2((a & -a) + 1) - 1; -#endif -} - -// Count the number of binary ones in a -static inline uint32_t lfs_popc(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) - return __builtin_popcount(a); -#else - a = a - ((a >> 1) & 0x55555555); - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); - return (((a + (a >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24; -#endif -} - -// Find the sequence comparison of a and b, this is the distance -// between a and b ignoring overflow -static inline int lfs_scmp(uint32_t a, uint32_t b) { - return (int)(unsigned)(a - b); -} - -// Convert between 32-bit little-endian and native order -static inline uint32_t lfs_fromle32(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && ( \ - (defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \ - (defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) - return a; -#elif !defined(LFS_NO_INTRINSICS) && ( \ - (defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \ - (defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) - return __builtin_bswap32(a); -#else - return (((uint8_t*)&a)[0] << 0) | - (((uint8_t*)&a)[1] << 8) | - (((uint8_t*)&a)[2] << 16) | - (((uint8_t*)&a)[3] << 24); -#endif -} - -static inline uint32_t lfs_tole32(uint32_t a) { - return lfs_fromle32(a); -} - -// Convert between 32-bit big-endian and native order -static inline uint32_t lfs_frombe32(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && ( \ - (defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \ - (defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) - return __builtin_bswap32(a); -#elif !defined(LFS_NO_INTRINSICS) && ( \ - (defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \ - (defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) - return a; -#else - return (((uint8_t*)&a)[0] << 24) | - (((uint8_t*)&a)[1] << 16) | - (((uint8_t*)&a)[2] << 8) | - (((uint8_t*)&a)[3] << 0); -#endif -} - -static inline uint32_t lfs_tobe32(uint32_t a) { - return lfs_frombe32(a); -} - -// Calculate CRC-32 with polynomial = 0x04c11db7 -uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size); - -// Allocate memory, only used if buffers are not provided to littlefs -// Note, memory must be 64-bit aligned -static inline void *lfs_malloc(size_t size) { -#ifndef LFS_NO_MALLOC - return malloc(size); -#else - (void)size; - return NULL; -#endif -} - -// Deallocate memory, only used if buffers are not provided to littlefs -static inline void lfs_free(void *p) { -#ifndef LFS_NO_MALLOC - free(p); -#else - (void)p; -#endif -} - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/common/include/max580x.h b/common/include/max580x.h deleted file mode 100644 index 26fdda4e..00000000 --- a/common/include/max580x.h +++ /dev/null @@ -1,310 +0,0 @@ -/** - * @file max580x.h - * @brief MAX580X Digital to Analog Converter. - * - * @addtogroup MAX580X - * @ingroup ORESAT - * @{ - */ -#ifndef _MAX580X_H_ -#define _MAX580X_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Version Identification - * @{ - */ -/** - * @brief MAX580X Driver version string. - */ -#define MAX580X_VERSION "1.0.0" - -/** - * @brief MAX580X Driver version major number. - */ -#define MAX580X_MAJOR 1 - -/** - * @brief MAX580X Driver version minor number. - */ -#define MAX580X_MINOR 0 - -/** - * @brief MAX580X Driver version patch number. - */ -#define MAX580X_PATCH 0 -/** @} */ - -/** - * @name MAX580X Registers - * @{ - */ -#define MAX580X_AD_NOP (0U << 4) -#define MAX580X_AD_REF (2U << 4) -#define MAX580X_AD_SOFTWARE (3U << 4) -#define MAX580X_AD_POWER (4U << 4) -#define MAX580X_AD_CONFIG (5U << 4) -#define MAX580X_AD_DEFAULT (6U << 4) -#define MAX580X_AD_RETURN (7U << 4) -#define MAX580X_AD_CODE (8U << 4) -#define MAX580X_AD_LOAD (9U << 4) -#define MAX580X_AD_CODE_LOAD (10U << 4) -/** @} */ - -/** - * @name MAX580X REF Register fields - * @{ - */ -#define MAX580X_REF_EXT (0U << 0) -#define MAX580X_REF_2500 (1U << 0) -#define MAX580X_REF_2048 (2U << 0) -#define MAX580X_REF_4096 (3U << 0) -#define MAX580X_REF_INT_STBY (1U << 2) -#define MAX580X_REF_INT_EN (1U << 3) -/** @} */ - -/** - * @name MAX580X SOFTWARE Register fields - * @{ - */ -#define MAX580X_SOFTWARE_END (0U << 0) -#define MAX580X_SOFTWARE_GATE (1U << 0) -#define MAX580X_SOFTWARE_CLR (4U << 0) -#define MAX580X_SOFTWARE_RST (5U << 0) -/** @} */ - -/** - * @name MAX580X POWER Register fields - * @{ - */ -#define MAX580X_POWER_NORMAL (0U << 6) -#define MAX580X_POWER_1K (1U << 6) -#define MAX580X_POWER_100K (2U << 6) -#define MAX580X_POWER_HI_Z (3U << 6) -/** @} */ - -/** - * @name MAX580X CONFIG Register fields - * @{ - */ -#define MAX580X_CONFIG_AUX_GATE (3U << 3) -#define MAX580X_CONFIG_AUX_CLEAR (6U << 3) -#define MAX580X_CONFIG_AUX_NONE (7U << 3) -/** @} */ - -/** - * @name MAX580X DEFAULT Register Fields - * @{ - */ -#define MAX580X_DEFAULT_POR (0U << 5) -#define MAX580X_DEFAULT_ZERO (1U << 5) -#define MAX580X_DEFAULT_MID (2U << 5) -#define MAX580X_DEFAULT_FULL (3U << 5) -#define MAX580X_DEFAULT_RETURN (4U << 5) -/** @} */ - -/** - * @name MAX580X RETURN/CODE Data Fields - * @{ - */ -#define MAX580X_DAC2VAL(field,res) __REVSH(field >> (16 - res)) -#define MAX580X_VAL2DAC(val,res) __REVSH(val << (16 - res)) -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief MAX580X I2C interface switch. - * @details If set to @p TRUE the support for I2C is included. - * @note The default is @p TRUE. - */ -#if !defined(MAX580X_USE_I2C) || defined(__DOXYGEN__) -#define MAX580X_USE_I2C TRUE -#endif - -/** - * @brief MAX580X shared I2C switch. - * @details If set to @p TRUE the device acquires I2C bus ownership - * on each transaction. - * @note The default is @p FALSE. Requires I2C_USE_MUTUAL_EXCLUSION. - */ -#if !defined(MAX580X_SHARED_I2C) || defined(__DOXYGEN__) -#define MAX580X_SHARED_I2C FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if MAX580X_USE_I2C && !HAL_USE_I2C -#error "MAX580X_USE_I2C requires HAL_USE_I2C" -#endif - -#if MAX580X_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION -#error "MAX580X_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @name MAX580X data structures and types. - * @{ - */ -/** - * @brief Structure representing a MAX580X driver. - */ -typedef struct MAX580XDriver MAX580XDriver; - -/** - * @name MAX580X Part IDs - */ -typedef enum { - MAX5805 = 0x82, - MAX5803 = 0x8A, - MAX5804 = 0x92, -} max580x_devid_t; - -/** - * @name MAX580X DAC Resolutions - */ -typedef enum { - MAX5803_RES = 8, - MAX5804_RES = 10, - MAX5805_RES = 12, -} max580x_res_t; - -/** - * @name MAX580X DAC Registers - */ -typedef enum { - MAX580X_RETURN = MAX580X_AD_RETURN, - MAX580X_CODE = MAX580X_AD_CODE, - MAX580X_CODE_LOAD = MAX580X_AD_CODE_LOAD, -} max580x_reg_t; - -/** - * @brief Driver state machine possible states. - */ -typedef enum { - MAX580X_UNINIT = 0, /**< Not initialized. */ - MAX580X_STOP = 1, /**< Stopped. */ - MAX580X_READY = 2, /**< Ready. */ -} max580x_state_t; - -/** - * @brief MAX580X configuration structure. - */ -typedef struct { -#if (MAX580X_USE_I2C) || defined(__DOXYGEN__) - /** - * @brief I2C driver associated with this MAX580X. - */ - I2CDriver *i2cp; - /** - * @brief I2C configuration associated with this MAX580X. - */ - const I2CConfig *i2ccfg; - /** - * @brief MAX580X Slave Address - */ - i2caddr_t saddr; -#endif /* MAX580X_USE_I2C */ - /** - * @brief MAX580X reference configuration - */ - uint8_t ref; - /** - * @brief MAX580X power configuration - */ - uint8_t power; - /** - * @brief MAX580X aux configuration - */ - uint8_t aux; - /** - * @brief MAX580X default configuration - */ - uint8_t default_cfg; -} MAX580XConfig; - -/** - * @brief @p MAX580X specific methods. - */ -#define _max580x_methods_alone - -/** - * @brief @p MAX580X specific methods with inherited ones. - */ -#define _max580x_methods \ - _base_object_methods - -/** - * @extends BaseObjectVMT - * - * @brief @p MAX580X virtual methods table. - */ -struct MAX580XVMT { - _max580x_methods -}; - -/** - * @brief @p MAX580XDriver specific data. - */ -#define _max580x_data \ - _base_object_data \ - /* Driver state.*/ \ - max580x_state_t state; \ - /* Current configuration data.*/ \ - const MAX580XConfig *config; \ - max580x_res_t res; \ - uint16_t range; - -/** - * @brief MAX710 GPIO Expander class. - */ -struct MAX580XDriver { - /** @brief Virtual Mthods Table.*/ - const struct MAX580XVMT *vmt; - _max580x_data -}; - -/** @} */ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -void max580xObjectInit(MAX580XDriver *devp); -void max580xStart(MAX580XDriver *devp, const MAX580XConfig *config); -void max580xStop(MAX580XDriver *devp); -uint16_t max580xReadRaw(MAX580XDriver *devp, max580x_reg_t reg); -void max580xWriteRaw(MAX580XDriver *devp, max580x_reg_t reg, uint16_t value); -uint32_t max580xReadVoltage(MAX580XDriver *devp, max580x_reg_t reg); -void max580xWriteVoltage(MAX580XDriver *devp, max580x_reg_t reg, uint32_t voltage); -void max580xLoad(MAX580XDriver *devp); -#ifdef __cplusplus -} -#endif - -#endif /* _MAX580X_H_ */ - -/** @} */ diff --git a/common/include/max7310.h b/common/include/max7310.h deleted file mode 100644 index ee558ed8..00000000 --- a/common/include/max7310.h +++ /dev/null @@ -1,283 +0,0 @@ -/** - * @file max7310.h - * @brief MAX7310 GPIO Expander header. - * - * @addtogroup MAX7310 - * @ingroup ORESAT - * @{ - */ -#ifndef _MAX7310_H_ -#define _MAX7310_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Version Identification - * @{ - */ -/** - * @brief MAX7310 Driver version string. - */ -#define MAX7310_VERSION "1.0.0" - -/** - * @brief MAX7310 Driver version major number. - */ -#define MAX7310_MAJOR 1 - -/** - * @brief MAX7310 Driver version minor number. - */ -#define MAX7310_MINOR 0 - -/** - * @brief MAX7310 Driver version patch number. - */ -#define MAX7310_PATCH 0 -/** @} */ - -/** - * @name MAX7310 Device Characteristics - * - * @{ - */ - -#define MAX7310_MIN_ADDR 0x8 -#define MAX7310_MAX_ADDR 0x3F - -/** @} */ - -/** - * @name MAX7310 Register addresses - * @{ - */ -#define MAX7310_AD_INPUT 0x00 -#define MAX7310_AD_ODR 0x01 -#define MAX7310_AD_POL 0x02 -#define MAX7310_AD_MODE 0x03 -#define MAX7310_AD_TIMEOUT 0x04 -/** @} */ - -/** - * @name MAX7310 General IO pin register bits - * @{ - */ -#define MAX7310_REG_MASK 0xFF -#define MAX7310_PIN_MASK(n) (1 << n) -/** @} */ - -/** - * @name MAX7310 Output data register bits - * @{ - */ -#define MAX7310_PIN_ODR_LOW(n) (0 << n) -#define MAX7310_PIN_ODR_HIGH(n) (1 << n) -/** @} */ - -/** - * @name MAX7310 Polarity register bits - * @{ - */ -#define MAX7310_PIN_POL_STD(n) (0 << n) -#define MAX7310_PIN_POL_INV(n) (1 << n) -/** @} */ - -/** - * @name MAX7310 Mode register bits - * @{ - */ -#define MAX7310_PIN_MODE_OUTPUT(n) (0 << n) -#define MAX7310_PIN_MODE_INPUT(n) (1 << n) -/** @} */ - -/** - * @name MAX7310_TIMEOUT register bits - * @{ - */ -#define MAX7310_TIMEOUT_MASK 0x01 -#define MAX7310_TIMEOUT_EN 1 -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief MAX7310 I2C interface switch. - * @details If set to @p TRUE the support for I2C is included. - * @note The default is @p TRUE. - */ -#if !defined(MAX7310_USE_I2C) || defined(__DOXYGEN__) -#define MAX7310_USE_I2C TRUE -#endif - -/** - * @brief MAX7310 shared I2C switch. - * @details If set to @p TRUE the device acquires I2C bus ownership - * on each transaction. - * @note The default is @p FALSE. Requires I2C_USE_MUTUAL_EXCLUSION. - */ -#if !defined(MAX7310_SHARED_I2C) || defined(__DOXYGEN__) -#define MAX7310_SHARED_I2C FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if MAX7310_USE_I2C && !HAL_USE_I2C -#error "MAX7310_USE_I2C requires HAL_USE_I2C" -#endif - -#if MAX7310_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION -#error "MAX7310_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @name MAX7310 data structures and types. - * @{ - */ -/** - * @brief Structure representing a MAX7310 driver. - */ -typedef struct MAX7310Driver MAX7310Driver; - -/** - * @brief MAX7310 timout configuration. - */ -typedef enum { - MAX7310_TIMEOUT_DISABLED = 0x00, /**< Timeout disabled. */ - MAX7310_TIMEOUT_ENABLED = 0x01 /**< Timeout enabled. */ -} max7310_timeout_t; - -/** - * @brief Driver state machine possible states. - */ -typedef enum { - MAX7310_UNINIT = 0, /**< Not initialized. */ - MAX7310_STOP = 1, /**< Stopped. */ - MAX7310_READY = 2, /**< Ready. */ -} max7310_state_t; - -/** - * @brief MAX7310 configuration structure. - */ -typedef struct { -#if (MAX7310_USE_I2C) || defined(__DOXYGEN__) - /** - * @brief I2C driver associated with this MAX7310. - */ - I2CDriver *i2cp; - /** - * @brief I2C configuration associated with this MAX7310. - */ - const I2CConfig *i2ccfg; - /** - * @brief MAX7310 Slave Address - */ - i2caddr_t saddr; -#endif /* MAX7310_USE_I2C */ - /** - * @brief MAX7310 output states - */ - uint8_t odr; - /** - * @brief MAX7310 polarity inversion - */ - uint8_t pol; - /** - * @brief MAX7310 IO mode - */ - uint8_t iomode; - /** - * @brief MAX7310 timeout setting - */ - max7310_timeout_t timeout; -} MAX7310Config; - -/** - * @brief @p MAX7310 specific methods. - */ -#define _max7310_methods_alone \ - /* Change output state of MAX7310 ports.*/ \ - msg_t (*set_output)(MAX7310Driver *devp, uint8_t output); \ - /* Change polarity of MAX7310 ports.*/ \ - msg_t (*set_polarity)(MAX7310Driver *devp, uint8_t polarity); \ - /* Change IO mode of MAX7310 ports.*/ \ - msg_t (*set_iomode)(MAX7310Driver *devp, uint8_t iomode); \ - /* Change timeout setting of MAX7310.*/ \ - msg_t (*set_timeout)(MAX7310Driver *devp, max7310_timeout_t timeout); - -/** - * @brief @p MAX7310 specific methods with inherited ones. - */ -#define _max7310_methods \ - _base_object_methods - -/** - * @extends BaseObjectVMT - * - * @brief @p MAX7310 virtual methods table. - */ -struct MAX7310VMT { - _max7310_methods -}; - -/** - * @brief @p MAX7310Driver specific data. - */ -#define _max7310_data \ - _base_object_data \ - /* Driver state.*/ \ - max7310_state_t state; \ - /* Current configuration data.*/ \ - const MAX7310Config *config; - -/** - * @brief MAX710 GPIO Expander class. - */ -struct MAX7310Driver { - /** @brief Virtual Mthods Table.*/ - const struct MAX7310VMT *vmt; - _max7310_data -}; - -/** @} */ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -void max7310ObjectInit(MAX7310Driver *devp); -void max7310Start(MAX7310Driver *devp, const MAX7310Config *config); -void max7310Stop(MAX7310Driver *devp); -uint8_t max7310ReadRaw(MAX7310Driver *devp, uint8_t reg); -void max7310WriteRaw(MAX7310Driver *devp, uint8_t reg, uint8_t value); -void max7310SetPin(MAX7310Driver *devp, uint8_t pin); -void max7310ClearPin(MAX7310Driver *devp, uint8_t pin); -void max7310TogglePin(MAX7310Driver *devp, uint8_t pin); -#ifdef __cplusplus -} -#endif - -#endif /* _MAX7310_H_ */ - -/** @} */ diff --git a/common/include/mmc5883ma.h b/common/include/mmc5883ma.h deleted file mode 100644 index 8979c8a7..00000000 --- a/common/include/mmc5883ma.h +++ /dev/null @@ -1,426 +0,0 @@ -/** - * @file mmc5883ma.h - * @brief MMC5883MA Power Monitor. - * - * @addtogroup MMC5883MA - * @ingroup ORESAT - * @{ - */ -#ifndef _MMC5883MA_H_ -#define _MMC5883MA_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Version Identification - * @{ - */ - - -#define MMC5883MA_I2C_ADDRESS_READ (0x30) -#define MMC5883MA_I2C_ADDRESS_WRITE (0x30) - -#define MMC5883MA_EXPECTED_PRODUCT_CODE 0x0C - -//#define HMC5883L_I2C_ADDRESS_READ 0x3D -//#define HMC5883L_I2C_ADDRESSW_WRITE 0x3C -//#define HMC5883L_ID_REGISTER_A 0x0A - - -/** - * @brief MMC5883MA Driver version string. - */ -//#define MMC5883MA_VERSION "1.0.0" - -/** - * @brief MMC5883MA Driver version major number. - */ -//#define MMC5883MA_MAJOR 1 - -/** - * @brief MMC5883MA Driver version minor number. - */ -//#define MMC5883MA_MINOR 0 - -/** - * @brief MMC5883MA Driver version patch number. - */ -//#define MMC5883MA_PATCH 0 -/** @} */ - -/** - * @name MMC5883MA Register Addresses - * @{ - */ -#define MMC5883MA_AD_PRDCT_ID_1 0x2F -#define MMC5883MA_AD_Z_THRSHLD 0x0D -#define MMC5883MA_AD_Y_THRSHLD 0x0C -#define MMC5883MA_AD_X_THRSHLD 0x0B -#define MMC5883MA_AD_INTRNLCTRL2 0x0A -#define MMC5883MA_AD_INTRNLCTRL1 0x09 -#define MMC5883MA_AD_INTRNLCTRL0 0x08 -#define MMC5883MA_AD_STATUS 0x07 -#define MMC5883MA_AD_TEMPERATURE_OUT 0x06 -#define MMC5883MA_AD_ZOUT_HIGH 0x05 -#define MMC5883MA_AD_ZOUT_LOW 0x04 -#define MMC5883MA_AD_YOUT_HIGH 0x03 -#define MMC5883MA_AD_YOUT_LOW 0x02 -#define MMC5883MA_AD_XOUT_HIGH 0x01 -#define MMC5883MA_AD_XOUT_LOW 0x00 -/** @} */ - -/** - * @name MMC5883MA Product Id_1 register fields - * @{ - */ -#define MMC5883MA_PRDCT_ID_1_Pos (0U) -#define MMC5883MA_PRDCT_ID_1_Msk (0x7U << MMC5883MA_PRDCT_ID_1_Pos) -#define MMC5883MA_PRDCT_ID MMC5883MA_PRDCT_ID_1_Msk -#define MMC5883MA_PRDCT_ID_RST (0x0CU << MMC5883MA_PRDCT_ID_1_Pos) -/** @} */ - -/** - * @name MMC5883MA Z Threshold register fields - * @{ - */ -#define MMC5883MA_Z_THRSHLD_Z_MAG_TH_Pos (0U) -#define MMC5883MA_Z_THRSHLD_Z_MAG_TH_Msk (0xFFU << MMC5883MA_Z_THRSHLD_Z_MAG_TH_Pos) -#define MMC5883MA_Z_THRSHLD_Z_MAG_TH MMC5883MA_Z_THRSHLD_Z_MAG_TH_Msk -#define MMC5883MA_Z_THRSHLD_Z_MAG_TH_RST (0x00U << MMC5883MA_Z_THRSHLD_Z_MAG_TH_Pos) -/** @} */ - -/** - * @name MMC5883MA Y Threshold register fields - * @{ - */ -#define MMC5883MA_Y_THRSHLD_Y_MAG_TH_Pos (0U) -#define MMC5883MA_Y_THRSHLD_Y_MAG_TH_Msk (0xFFU << MMC5883MA_Y_THRSHLD_Y_MAG_TH_Pos) -#define MMC5883MA_Y_THRSHLD_Y_MAG_TH MMC5883MA_Y_THRSHLD_Y_MAG_TH_Msk -#define MMC5883MA_Y_THRSHLD_Y_MAG_TH_RST (0x00U << MMC5883MA_Y_THRSHLD_Y_MAG_TH_Pos) -/** @} */ - -/** - * @name MMC5883MA X Threshold register fields - * @{ - */ -//#define MMC5883MA_X_THRSHLD_X_MAG_TH_Pos (0U) -#define MMC5883MA_X_THRSHLD_X_MAG_TH_Msk (0xFFU << MMC5883MA_X_THRSHLD_X_MAG_TH_Pos) -#define MMC5883MA_X_THRSHLD_X_MAG_TH MMC5883MA_X_THRSHLD_X_MAG_TH_Msk -#define MMC5883MA_X_THRSHLD_X_MAG_TH_Pos (0x00U << MMC5883MA_X_THRSHLD_X_MAG_TH_Pos) -/** @} */ - -/** - * @name MMC5883MA Internal Control_2 register fields - * @{ - */ -#define MMC5883MA_INTRNLCTRL2_CM_FREQ_2200_mHz (0x03) -#define MMC5883MA_INTRNLCTRL2_CM_FREQ_1_Hz (0x04) - -#define MMC5883MA_INTRNLCTRL2_CM_FREQ_RST (0x1U << MMC5883MA_INTRNL_CTRL_2_CM_FREQ_Pos) -#define MMC5883MA_INTRNLCTRL2_MDT_Pos (5U) -#define MMC5883MA_INTRNLCTRL2_MDT_Msk (0x1U << MMC5883MA_INTRNLCTRL2_MDT_Pos) -#define MMC5883MA_INTRNLCTRL2_MDT MMC5883MA_INTRNLCTRL2_MDT_Msk -#define MMC5883MA_INTRNLCTRL2_MDT_EN (0x1U << MMC5883MA_INTRNLCTRL2_MDT_Pos) -#define MMC5883MA_INTRNLCTRL2_MDT_RST (0x0U << MMC5883MA_INTRNLCTRL2_MDT_Pos) -#define MMC5883MA_INTRNLCTRL2_MEAS_DONE_Pos (6U) -#define MMC5883MA_INTRNLCTRL2_MEAS_DONE_Msk (0x1U << MMC5883MA_INTRNLCTRL2_MEAS_DONE_Pos) -#define MMC5883MA_INTRNLCTRL2_MEAS_DONE MMC5883MA_INTRNLCTRL2_MEAS_DONE_Msk -#define MMC5883MA_INTRNLCTRL2_MEAS_DONE_EN (0x1U << MMC5883MA_INTRNLCTRL2_MEAS_DONE_Pos) -#define MMC5883MA_INTRNLCTRL2_MEAS_DONE_RST (0x0U << MMC5883MA_INTRNLCTRL2_MEAS_DONE_Pos) -/** @} */ - -/** - * @name MMC5883MA Internal Control_1 register fields - * @{ - */ -#define MMC5883MA_INTRNLCTRL1_BW_Pos (0U) -#define MMC5883MA_INTRNLCTRL1_BW_Msk (0x3U << MMC5883MA_INTRNLCTRL1_BW_Pos) -#define MMC5883MA_INTRNLCTRL1_BW MMC5883MA_INTRNLCTRL1_BW_Msk -#define MMC5883MA_INTRNLCTRL1_BW_ODR_100Hz (0x0U << MMC5883MA_INTRNLCTRL1_BW_Pos) -#define MMC5883MA_INTRNLCTRL1_BW_ODR_200Hz (0x1U << MMC5883MA_INTRNLCTRL1_BW_Pos) -#define MMC5883MA_INTRNLCTRL1_BW_ODR_400Hz (0x2U << MMC5883MA_INTRNLCTRL1_BW_Pos) -#define MMC5883MA_INTRNLCTRL1_BW_ODR_600Hz (0x3U << MMC5883MA_INTRNLCTRL1_BW_Pos) -#define MMC5883MA_INTRNLCTRL1_SW_RST_Pos (7U) -#define MMC5883MA_INTRNLCTRL1_SW_RST_CMD (0x1U << MMC5883MA_INTRNLCTRL1_SW_RST_Pos) -/** @} */ - -/** - * @name MMC5883MA Internal Control_0 register fields - * @{ - */ -#define MMC5883MA_INTRNLCTRL0_TM_M_Pos (0U) -#define MMC5883MA_INTRNLCTRL0_TM_M_Msk (0x1U << MMC5883MA_INTRNLCTRL0_TM_M_Pos) -#define MMC5883MA_INTRNLCTRL0_TM_M MMC5883MA_INTRNLCTRL0_TM_M_Msk -#define MMC5883MA_INTRNLCTRL0_TM_M_INIT (0x1U << MMC5883MA_INTRNLCTRL0_TM_M_Pos) -#define MMC5883MA_INTRNLCTRL0_TM_T_Pos (1U) -#define MMC5883MA_INTRNLCTRL0_TM_T_Msk (0x1U << MMC5883MA_INTRNLCTRL0_TM_T_Pos) -#define MMC5883MA_INTRNLCTRL0_TM_T MMC5883MA_INTRNLCTRL0_TM_T_Msk -#define MMC5883MA_INTRNLCTRL0_TM_T_INIT (0x1U << MMC5883MA_INTRNLCTRL0_TM_T_Pos) -#define MMC5883MA_INTRNLCTRL0_STRT_MDT_Pos (2U) -#define MMC5883MA_INTRNLCTRL0_STRT_MDT_Msk (0x1U << MMC5883MA_INTRNLCTRL0_STRT_MDT_Pos) -#define MMC5883MA_INTRNLCTRL0_STRT_MDT MMC5883MA_INTRNLCTRL0_STRT_MDT_Msk -#define MMC5883MA_INTRNLCTRL0_STRT_MDT_CMD (0x1U << MMC5883MA_INTRNLCTRL0_STRT_MDT_Pos) -#define MMC5883MA_INTRNLCTRL0_SET_Pos (3U) -#define MMC5883MA_INTRNLCTRL0_SET_Msk (0x1U << MMC5883MA_INTRNLCTRL0_SET_Pos) -#define MMC5883MA_INTRNLCTRL0_SET MMC5883MA_INTRNLCTRL0_SET_Msk -#define MMC5883MA_INTRNLCTRL0_SET_CMD (0x1U << MMC5883MA_INTRNLCTRL0_SET_Pos) -#define MMC5883MA_INTRNLCTRL0_RST_Pos (4U) -#define MMC5883MA_INTRNLCTRL0_RST_Msk (0x1U << MMC5883MA_INTRNLCTRL0_RST_Pos) -#define MMC5883MA_INTRNLCTRL0_RST MMC5883MA_INTRNLCTRL0_RST_Msk -#define MMC5883MA_INTRNLCTRL0_RST_CMD (0x1U << MMC5883MA_INTRNLCTRL0_RST_Pos) -#define MMC5883MA_INTRNLCTRL0_OTP_Pos (6U) -#define MMC5883MA_INTRNLCTRL0_OTP_Msk (0x1U << MMC5883MA_INTRNLCTRL0_OTP_Pos) -#define MMC5883MA_INTRNLCTRL0_OTP MMC5883MA_INTRNLCTRL0_OTP_Msk -#define MMC5883MA_INTRNLCTRL0_OTP_READ (0x1U << MMC5883MA_INTRNLCTRL0_OTP_Pos) -#define MMC5883MA_INTRNLCTRL0_TST_PIN_Pos (7U) -#define MMC5883MA_INTRNLCTRL0_TST_PIN_Msk (0x1U << MMC5883MA_INTRNLCTRL0_TST_PIN_Pos) -#define MMC5883MA_INTRNLCTRL0_TST_PIN MMC5883MA_INTRNLCTRL0_TST_PIN_Msk -#define MMC5883MA_INTRNLCTRL0_TST_PIN_SLCT (0x1U << MMC5883MA_INTRNLCTRL0_TST_PIN_Pos) -/** @} */ - -/** - * @name MMC5883MA Status register fields - * @{ - */ -#define MMC5883MA_STATUS_MEAS_M_DONE_Pos (0U) -#define MMC5883MA_STATUS_MEAS_M_DONE_Msk (0x1U << MMC5883MA_STATUS_MEAS_M_DONE_Pos) -#define MMC5883MA_STATUS_MEAS_M_DONE MMC5883MA_STATUS_MEAS_M_DONE_Msk -#define MMC5883MA_STATUS_MEAS_M_DONE_CLR (0x1U << MMC5883MA_STATUS_MEAS_M_DONE_Pos) -#define MMC5883MA_STATUS_MEAS_T_DONE_Pos (1U) -#define MMC5883MA_STATUS_MEAS_T_DONE_Msk (0x1U << MMC5883MA_STATUS_MEAS_T_DONE_Pos) -#define MMC5883MA_STATUS_MEAS_T_DONE MMC5883MA_STATUS_MEAS_T_DONE_Msk -#define MMC5883MA_STATUS_MEAS_T_DONE_CLR (0x1U << MMC5883MA_STATUS_MEAS_T_DONE_Pos) -#define MMC5883MA_STATUS_MD_Pos (2U) -#define MMC5883MA_STATUS_MD_Msk (0x1U << MMC5883MA_STATUS_MD_Pos) -#define MMC5883MA_STATUS_MD MMC5883MA_STATUS_MD_Msk -#define MMC5883MA_STATUS_MD_CLR (0x1U << MMC5883MA_STATUS_MD_Pos) -#define MMC5883MA_STATUS_PUMP_ON_Pos (3U) -#define MMC5883MA_STATUS_PUMP_ON_Msk (0x1U << MMC5883MA_STATUS_PUMP_ON_Pos) -#define MMC5883MA_STATUS_PUMP_ON MMC5883MA_STATUS_PUMP_ON_Msk -#define MMC5883MA_STATUS_OTP_RD_DONE_Pos (4U) -#define MMC5883MA_STATUS_OTP_RD_DONE_Msk (0x1U << MMC5883MA_STATUS_OTP_RD_DONE_Pos) -#define MMC5883MA_STATUS_OTP_RD_DONE MMC5883MA_STATUS_OTP_RD_DONE_Msk -/** @} */ - -/** - * @name MMC5883MA Temperature Out register fields - * @{ - */ -#define MMC5883MA_TEMPERATURE_OUT_Pos (0U) -#define MMC5883MA_TEMPERATURE_OUT_Msk (0xFFU << MMC5883MA_TEMPERATURE_Pos) -#define MMC5883MA_TEMPERATURE_OUT MMC5883MA_TEMPERATURE_Msk -/** @} */ - -/** - * @name MMC5883MA Zout High register fields - * @{ - */ -#define MMC5883MA_ZOUT_H_Pos (0U) -#define MMC5883MA_ZOUT_H_Msk (0xFFU << MMC5883MA_ZOUT_H_Pos) -#define MMC5883MA_ZOUT_H MMC5883MA_ZOUT_H_Msk -/** @} */ - -/** - * @name MMC5883MA Zout Low register fields - * @{ - */ -#define MMC5883MA_ZOUT_L_Pos (0U) -#define MMC5883MA_ZOUT_L_Msk (0xFFU << MMC5883MA_ZOUT_L_Pos) -#define MMC5883MA_ZOUT_L MMC5883MA_ZOUT_L_Msk -/** @} */ - -/** - * @name MMC5883MA Yout High register fields - * @{ - */ -#define MMC5883MA_YOUT_H_Pos (0U) -#define MMC5883MA_YOUT_H_Msk (0xFFU << MMC5883MA_YOUT_H_Pos) -//#define MMC5883MA_YOUT_H_Msk MMC5883MA_YOUT_H_Msk -/** @} */ - -/** - * @name MMC5883MA Yout Low register fields - * @{ - */ -#define MMC5883MA_YOUT_L_Pos (0U) -#define MMC5883MA_YOUT_L_Msk (0xFFU << MMC5883MA_YOUT_L_Pos) -#define MMC5883MA_YOUT_L MMC5883MA_YOUT_L_Msk -/** @} */ - -/** - * @name MMC5883MA Xout High register fields - * @{ - */ -#define MMC5883MA_XOUT_H_Pos (0U) -#define MMC5883MA_XOUT_H_Msk (0xFFU << MMC5883MA_XOUT_H_Pos) -#define MMC5883MA_XOUT_H MMC5883MA_XOUT_H_Msk -/** @} */ - -/** - * @name MMC5883MA Xout Low register fields - * @{ - */ -#define MMC5883MA_XOUT_L_Pos (0U) -#define MMC5883MA_XOUT_L_Msk (0xFFU << MMC5883MA_XOUT_L_Pos) -#define MMC5883MA_XOUT_L MMC5883MA_XOUT_L_Msk -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief MMC5883MA I2C interface switch. - * @details If set to @p TRUE the support for I2C is included. - * @note The default is @p TRUE. - */ -#if !defined(MMC5883MA_USE_I2C) || defined(__DOXYGEN__) -#define MMC5883MA_USE_I2C TRUE -#endif - -/** - * @brief MMC5883MA shared I2C switch. - * @details If set to @p TRUE the device acquires I2C bus ownership - * on each transaction. - * @note The default is @p FALSE. Requires I2C_USE_MUTUAL_EXCLUSION. - */ -#if !defined(MMC5883MA_SHARED_I2C) || defined(__DOXYGEN__) -#define MMC5883MA_SHARED_I2C FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if MMC5883MA_USE_I2C && !HAL_USE_I2C -#error "MMC5883MA_USE_I2C requires HAL_USE_I2C" -#endif - -#if MMC5883MA_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION -#error "MMC5883MA_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @name MMC5883MA data structures and types. - * @{ - */ -/** - * @brief Structure representing a MMC5883MA driver. - */ -typedef struct MMC5883MADriver MMC5883MADriver; - -/** - * @brief Driver state machine possible states. - */ -typedef enum { - MMC5883MA_UNINIT = 0, /**< Not initialized. */ - MMC5883MA_STOP = 1, /**< Stopped. */ - MMC5883MA_READY = 2, /**< Ready. */ -} mmc5883ma_state_t; - -/** - * @brief MMC5883MA configuration structure. - */ -typedef struct { -#if (MMC5883MA_USE_I2C) || defined(__DOXYGEN__) - /** - * @brief I2C driver associated with this MMC5883MA. - */ - I2CDriver *i2cp; - /** - * @brief I2C configuration associated with this MMC5883MA. - */ - const I2CConfig *i2ccfg; - /** - * @brief MMC5883MA Slave Address - */ - //i2caddr_t saddr; -#endif /* MMC5883MA_USE_I2C */ -} MMC5883MAConfig; - -/** - * @brief @p MMC5883MA specific methods. - */ -#define _mmc5883ma_methods_alone - -/** - * @brief @p MMC5883MA specific methods with inherited ones. - */ -#define _mmc5883ma_methods \ - _base_object_methods - -/** - * @extends BaseObjectVMT - * - * @brief @p MMC5883MA virtual methods table. - */ -struct MMC5883MAVMT { - _mmc5883ma_methods -}; - -/** - * @brief @p MMC5883MADriver specific data. - */ -#define _mmc5883ma_data \ - _base_object_data \ - /* Driver state.*/ \ - mmc5883ma_state_t state; \ - /* Current configuration data.*/ \ - const MMC5883MAConfig *config; \ - float bridge_offset_estimate_x; \ - float bridge_offset_estimate_y; \ - float bridge_offset_estimate_z; \ - uint32_t read_call_count; - -/** - * @brief MMC5883MA Power Monitor class. - */ -struct MMC5883MADriver { - /** @brief Virtual Methods Table.*/ - const struct MMC5883MAVMT *vmt; - _mmc5883ma_data -}; - -/** @} */ - -typedef struct { - int16_t mx; - int16_t my; - int16_t mz; -} mmc5883ma_data_t; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -void mmc5883maObjectInit(MMC5883MADriver *devp); -bool mmc5883maStart(MMC5883MADriver *devp, const MMC5883MAConfig *config); -void mmc5883maStop(MMC5883MADriver *devp); -bool mmc5883maReadData(MMC5883MADriver *devp, mmc5883ma_data_t *dest); -bool mmc5883maI2CReadRegister3(I2CDriver *i2cp, const uint8_t i2c_address, const uint8_t reg_number, uint8_t *dest_value); -bool mmc5883maI2CReadRegister4(I2CDriver *i2cp, const uint8_t i2c_address, const uint8_t reg_number, uint16_t *dest_value); -#ifdef __cplusplus -} -#endif - -#endif /* _MMC5883MA_H_ */ - -/** @} */ diff --git a/common/include/morse.h b/common/include/morse.h deleted file mode 100644 index 3312530d..00000000 --- a/common/include/morse.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @file morse.h - * @brief Morse code support code. - * - * @addtogroup MORSE - * @ingroup ORESAT - * @{ - */ -#ifndef _MORSE_H_ -#define _MORSE_H_ - -#ifdef __cplusplus -extern "C" { -#endif -void ax5043_morse_dot_dash(AX5043Driver *devp, uint16_t dot_dash_time); -const char *ax5043_ascii_to_morse(char letter); -void ax5043_send_cw(AX5043Driver *devp, int wpm, char beaconMessage[], uint16_t pktlen ); -#ifdef __cplusplus -} -#endif - -#endif /* _MORSE_H_ */ - -/** @} */ diff --git a/common/include/node_mgr.h b/common/include/node_mgr.h deleted file mode 100644 index a71b1ffe..00000000 --- a/common/include/node_mgr.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _NODE_MGR_H_ -#define _NODE_MGR_H_ - -#include "ch.h" -#include "hal.h" -#include "CANopen.h" -#include "OD.h" - -typedef struct oresat_node { - uint8_t id; - i2caddr_t opd_addr; - uint16_t timeout; - bool autostart; - char *name; -} oresat_node_t; - -#ifdef __cplusplus -extern "C" { -#endif - -extern THD_WORKING_AREA(node_mgr_wa, 0x400); -extern THD_FUNCTION(node_mgr, arg); -int node_enable(uint8_t id, bool enable); -int node_status(uint8_t id, CO_NMT_internalState_t *state); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif /*_NODE_MGR_H_*/ diff --git a/common/include/opd.h b/common/include/opd.h deleted file mode 100644 index e571ba72..00000000 --- a/common/include/opd.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef OPD_H -#define OPD_H - -#define OPD_MIN_ADDR 0x8 -#define OPD_MAX_ADDR 0x3F - -/* IO Pin Assignments */ -#define OPD_SCL 0U -#define OPD_SDA 1U -#define OPD_FAULT 2U -#define OPD_EN 3U -#define OPD_CB_RESET 4U -#define OPD_BOOT0 5U -#define OPD_LINUX_BOOT 6U -#define OPD_PIN7 7U - -#define OPD_PIN_MASK(n) (1U << (n)) - -#define OPD_PIN_ODR_LOW(n) (0U << (n)) -#define OPD_PIN_ODR_HIGH(n) (1U << (n)) -#define OPD_PIN_POL_STD(n) (0U << (n)) -#define OPD_PIN_POL_INV(n) (1U << (n)) -#define OPD_PIN_MODE_OUTPUT(n) (0U << (n)) -#define OPD_PIN_MODE_INPUT(n) (1U << (n)) - -/* IO Pin Configurations */ -#define OPD_ODR_VAL (OPD_PIN_ODR_LOW(OPD_SCL) | \ - OPD_PIN_ODR_LOW(OPD_SDA) | \ - OPD_PIN_ODR_LOW(OPD_FAULT) | \ - OPD_PIN_ODR_LOW(OPD_EN) | \ - OPD_PIN_ODR_LOW(OPD_CB_RESET) | \ - OPD_PIN_ODR_LOW(OPD_BOOT0) | \ - OPD_PIN_ODR_HIGH(OPD_LINUX_BOOT) | \ - OPD_PIN_ODR_LOW(OPD_PIN7)) -#define OPD_POL_VAL (OPD_PIN_POL_STD(OPD_SCL) | \ - OPD_PIN_POL_STD(OPD_SDA) | \ - OPD_PIN_POL_INV(OPD_FAULT) | \ - OPD_PIN_POL_STD(OPD_EN) | \ - OPD_PIN_POL_STD(OPD_CB_RESET) | \ - OPD_PIN_POL_STD(OPD_BOOT0) | \ - OPD_PIN_POL_STD(OPD_LINUX_BOOT) | \ - OPD_PIN_POL_STD(OPD_PIN7)) -#define OPD_MODE_VAL (OPD_PIN_MODE_INPUT(OPD_SCL) | \ - OPD_PIN_MODE_INPUT(OPD_SDA) | \ - OPD_PIN_MODE_INPUT(OPD_FAULT) | \ - OPD_PIN_MODE_OUTPUT(OPD_EN) | \ - OPD_PIN_MODE_OUTPUT(OPD_CB_RESET) | \ - OPD_PIN_MODE_OUTPUT(OPD_BOOT0) | \ - OPD_PIN_MODE_OUTPUT(OPD_LINUX_BOOT)| \ - OPD_PIN_MODE_OUTPUT(OPD_PIN7)) - -typedef struct { - uint8_t input; - uint8_t odr; - uint8_t pol; - uint8_t mode; - uint8_t timeout; -} opd_status_t; - -void opd_init(void); -void opd_start(void); -void opd_stop(void); -void opd_scan(bool restart); -bool opd_probe(i2caddr_t addr, bool restart); -int opd_enable(i2caddr_t addr, bool enable); -int opd_disable(i2caddr_t addr); -int opd_reset(i2caddr_t addr); -int opd_status(i2caddr_t addr, opd_status_t *status); - -int opd_boot(i2caddr_t addr); -int opd_linux_recover(i2caddr_t addr, bool enable); -#endif diff --git a/common/include/oresat_f0.h b/common/include/oresat_f0.h index 74cc046b..5a44bf1c 100644 --- a/common/include/oresat_f0.h +++ b/common/include/oresat_f0.h @@ -5,7 +5,7 @@ extern "C" { #endif -// See STM32F091xC-bootloader.ld/STM32F4091xC-app.ld for definitions and +// See STM32F091xC-bootloader.ld/STM32F091xC-app.ld for definitions and // rules_memory.ld for declarations. extern uint8_t __flash0_base__[]; extern uint8_t __flash0_end__[]; diff --git a/common/include/radio.h b/common/include/radio.h deleted file mode 100644 index 92a6cf95..00000000 --- a/common/include/radio.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @file radio.h - * @brief OreSat radio support library. - * - * @addtogroup RADIO - * @ingroup ORESAT - * @{ - */ -#ifndef _RADIO_H_ -#define _RADIO_H_ - -#include "ch.h" -#include "hal.h" -#include "ax5043.h" -#include "si41xx.h" -#include "frame_buf.h" - -/*===========================================================================*/ -/* Constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Pre-compile time settings. */ -/*===========================================================================*/ - -#if !defined(RADIO_FIFO_COUNT) || defined(__DOXYGEN__) -#define RADIO_FIFO_COUNT 8U -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Data structures and types. */ -/*===========================================================================*/ - -typedef struct { - SI41XXDriver *devp; - SI41XXConfig *cfgp; - const char *name; -} synth_dev_t; - -typedef struct { - AX5043Driver *devp; - const AX5043Config *cfgp; - const char *name; -} radio_dev_t; - -typedef struct { - AX5043Driver *devp; - const ax5043_profile_t *profile; - const char *name; -} radio_cfg_t; - -/*===========================================================================*/ -/* Macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -extern synth_dev_t synth_devices[]; -extern radio_dev_t radio_devices[]; -extern radio_cfg_t radio_cfgs[]; -extern objects_fifo_t rx_fifo; -extern objects_fifo_t tx_fifo; - -void radio_init(void); -void radio_start(void); -void radio_stop(void); - -void pdu_send(fb_t *fb, void *arg); -void pdu_send_ahead(fb_t *fb, void *arg); -fb_t *pdu_recv(void *arg); - -#ifdef __cplusplus -} -#endif - -#endif /* _RADIO_H_ */ - -/** @} */ diff --git a/common/include/rtc.h b/common/include/rtc.h deleted file mode 100644 index 417d3c0c..00000000 --- a/common/include/rtc.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef RTC_H -#define RTC_H - -#include -#include "ch.h" -#include "hal.h" -#include "CANopen.h" - -/* Preamble definitions - * While Level 1 Time Codes are generally preferred by CCSDS, we are using - * Level 2 Time Codes (meaning Agency Defined). In this case we are using - * the UNIX Epoch of Jan 1, 1970. - * Refer to CCSDS 301.0-B-4 for Time Code Formats. - * TODO: Verify that the bit order is correct for preambles - */ -#define TIME_CUC_PREAMBLE 0x2E /* CCSDS Unsegmented Time Code (CUC) Preamble */ -#define TIME_CDS_PREAMBLE 0x49 /* CCSDS Day Segmented Time Code (CDS) Preamble */ - -#define RTC_WEEKDAY_SEL RTC_ALRMAR_WDSEL -#define RTC_DATE_MASK RTC_ALRMAR_MSK4 -#define RTC_HOUR_MASK RTC_ALRMAR_MSK3 -#define RTC_MIN_MASK RTC_ALRMAR_MSK2 -#define RTC_SEC_MASK RTC_ALRMAR_MSK1 - -/* CCSDS Unsegmented Time Code (CUC) data type */ -typedef union { - uint64_t raw; - struct { - uint32_t coarse:32; - uint32_t fine:24; - }; -} time_scet_t; - -/* CCSDS Day Segmented Time Code (CDS) data type */ -typedef union { - uint64_t raw; - struct { - uint16_t day:16; - uint32_t ms:32; - uint16_t us:16; - }; -} time_utc_t; - -#ifdef __cplusplus -extern "C" { -#endif - -time_t rtcConvertDateTimeToUnix(const RTCDateTime *timespec, uint32_t *msec); -void rtcConvertUnixToDateTime(RTCDateTime *timespec, time_t unix_time, uint32_t msec); - -void rtcGetTimeTm(struct tm *tim, uint32_t *msec); -void rtcSetTimeTm(const struct tm *tim, uint32_t msec); -time_t rtcGetTimeUnix(uint32_t *msec); -void rtcSetTimeUnix(time_t unix_time, uint32_t msec); -void rtcGetTimeSCET(time_scet_t *scet); -void rtcSetTimeSCET(const time_scet_t *scet); -void rtcGetTimeUTC(time_utc_t *utc); -void rtcSetTimeUTC(const time_utc_t *utc); - -uint32_t rtcEncodeAlarm(const RTCDateTime *timespec, uint32_t flags); -uint32_t rtcEncodeRelAlarm(const RTCDateTime *timespec, int days, int hours, int minutes, int seconds); - -/* -CO_SDO_abortCode_t OD_SCET_Func(CO_ODF_arg_t *ODF_arg); -CO_SDO_abortCode_t OD_UTC_Func(CO_ODF_arg_t *ODF_arg); -*/ - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif /*RTC_H*/ diff --git a/common/include/sensors.h b/common/include/sensors.h index 5b733abe..06f96af4 100644 --- a/common/include/sensors.h +++ b/common/include/sensors.h @@ -17,52 +17,6 @@ extern "C" { ADC_SMPR_SMP_239P5, /* SMPR */ \ ADC_CHSELR_CHSEL16 | ADC_CHSELR_CHSEL17 /* CHSELR */ #define ADC_ENABLE_SENSORS(adc) {adcSTM32SetCCR(ADC_CCR_TSEN | ADC_CCR_VREFEN);} -#elif defined(STM32F4xx_MCUCONF) -#define TS_CAL1_BASE ((uint32_t)0x1FFF7A2C) -#define TS_CAL2_BASE ((uint32_t)0x1FFF7A2E) -#define VREFINT_CAL_BASE ((uint32_t)0x1FFF7A2A) -#define TS_CAL1_TEMP 30 -#define TS_CAL2_TEMP 110 -#define VREFINT_CAL_VOLT 330 -#define ADC_REG_CFG 0, /* CR1 */ \ - ADC_CR2_SWSTART, /* CR2 */ \ - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_480) /* SMPR1 */ \ - | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_480), \ - 0, /* SMPR2 */ \ - 0, /* HTR */ \ - 0, /* LTR */ \ - 0, /* SQR1 */ \ - 0, /* SQR2 */ \ - ADC_SQR3_SQ1_N(ADC_CHANNEL_SENSOR) /* SQR3 */ \ - | ADC_SQR3_SQ2_N(ADC_CHANNEL_VREFINT) -#define ADC_ENABLE_SENSORS(adc) {adcSTM32EnableTSVREFE();} -#elif defined(STM32L4xx_MCUCONF) -#define TS_CAL1_BASE ((uint32_t)0x1FFF75A8) -#define TS_CAL2_BASE ((uint32_t)0x1FFF75CA) -#define VREFINT_CAL_BASE ((uint32_t)0x1FFF75AA) -#define TS_CAL1_TEMP 30 -#define TS_CAL2_TEMP 130 -#define VREFINT_CAL_VOLT 330 -#define ADC_REG_CFG ADC_CFGR_CONT, /* CFGR */ \ - 0, /* CFGR2 */ \ - ADC_TR(0, 4095), /* TR1 */ \ - 0, /* TR2 */ \ - 0, /* TR3 */ \ - 0, /* AWD2CR */ \ - 0, /* AWD3CR */ \ - { /* SMPR[2] */ \ - 0, \ - ADC_SMPR2_SMP_AN16(ADC_SMPR_SMP_47P5) \ - | ADC_SMPR2_SMP_AN17(ADC_SMPR_SMP_47P5), \ - }, \ - { /* SQR[4] */ \ - ADC_SQR1_SQ1_N(ADC_CHANNEL_IN16) \ - | ADC_SQR1_SQ2_N(ADC_CHANNEL_IN17), \ - 0, \ - 0, \ - 0 \ - } -#define ADC_ENABLE_SENSORS(adc) {adcSTM32EnableTS(adc); adcSTM32EnableVREF(adc);} #else #error "No Sensors Config for this MCU" #endif diff --git a/common/include/si41xx.h b/common/include/si41xx.h deleted file mode 100644 index 288768dd..00000000 --- a/common/include/si41xx.h +++ /dev/null @@ -1,390 +0,0 @@ -/** - * @file si41xx.h - * @brief SI41XX Radio. - * - * @addtogroup SI41XX - * @ingroup ORESAT - * @{ - */ -#ifndef _SI41XX_H_ -#define _SI41XX_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Version Identification - * @{ - */ -/** - * @brief SI41XX Driver version string. - */ -#define SI41XX_VERSION "1.0.0" - -/** - * @brief SI41XX Driver version major number. - */ -#define SI41XX_MAJOR 1 - -/** - * @brief SI41XX Driver version minor number. - */ -#define SI41XX_MINOR 0 - -/** - * @brief SI41XX Driver version patch number. - */ -#define SI41XX_PATCH 0 -/** @} */ - -/** - * @name Device Types - * @{ - */ -#define SI4112 0 -#define SI4113 1 -#define SI4122 2 -#define SI4123 3 -#define SI4133 4 -/** @} */ - -/** - * @name SI41XX Register Addresses - * @{ - */ -#define SI41XX_REG_CONFIG 0x0U -#define SI41XX_REG_PHASE_GAIN 0x1U -#define SI41XX_REG_PWRDOWN 0x2U -#define SI41XX_REG_RF1_NDIV 0x3U -#define SI41XX_REG_RF2_NDIV 0x4U -#define SI41XX_REG_IF_NDIV 0x5U -#define SI41XX_REG_RF1_RDIV 0x6U -#define SI41XX_REG_RF2_RDIV 0x7U -#define SI41XX_REG_IF_RDIV 0x8U -/** @} */ - -/** - * @name SI41XX Main Configuration register fields - * @{ - */ -#define SI41XX_CONFIG_RFPWR_Pos (1U) -#define SI41XX_CONFIG_RFPWR_Msk (0x1U << SI41XX_CONFIG_RFPWR_Pos) -#define SI41XX_CONFIG_RFPWR SI41XX_CONFIG_RFPWR_Msk -#define SI41XX_CONFIG_AUTOKP_Pos (2U) -#define SI41XX_CONFIG_AUTOKP_Msk (0x1U << SI41XX_CONFIG_AUTOKP_Pos) -#define SI41XX_CONFIG_AUTOKP SI41XX_CONFIG_AUTOKP_Msk -#define SI41XX_CONFIG_AUTOPDB_Pos (3U) -#define SI41XX_CONFIG_AUTOPDB_Msk (0x1U << SI41XX_CONFIG_AUTOPDB_Pos) -#define SI41XX_CONFIG_AUTOPDB SI41XX_CONFIG_AUTOPDB_Msk -#define SI41XX_CONFIG_LPWR_Pos (5U) -#define SI41XX_CONFIG_LPWR_Msk (0x1U << SI41XX_CONFIG_LPWR_Pos) -#define SI41XX_CONFIG_LPWR SI41XX_CONFIG_LPWR_Msk -#define SI41XX_CONFIG_IFDIV_Pos (10U) -#define SI41XX_CONFIG_IFDIV_Msk (0x3U << SI41XX_CONFIG_IFDIV_Pos) -#define SI41XX_CONFIG_IFDIV SI41XX_CONFIG_IFDIV_Msk -#define SI41XX_IFDIV_DIV1 (0x0U) -#define SI41XX_IFDIV_DIV2 (0x1U) -#define SI41XX_IFDIV_DIV4 (0x2U) -#define SI41XX_IFDIV_DIV8 (0x3U) -#define SI41XX_CONFIG_AUXSEL_Pos (12U) -#define SI41XX_CONFIG_AUXSEL_Msk (0x3U << SI41XX_CONFIG_AUXSEL_Pos) -#define SI41XX_CONFIG_AUXSEL SI41XX_CONFIG_AUXSEL_Msk -#define SI41XX_AUXSEL_LOW (0x1U) -#define SI41XX_AUXSEL_LOCKDET (0x3U) -/** @} */ - -/** - * @name SI41XX Phase Detector Gain register fields - * @{ - */ -#define SI41XX_PHASEGAIN_KP1_Pos (0U) -#define SI41XX_PHASEGAIN_KP1_Msk (0x3U << SI41XX_PHASEGAIN_KP1_Pos) -#define SI41XX_PHASEGAIN_KP1 SI41XX_PHASEGAIN_KP1_Msk -#define SI41XX_PHASEGAIN_KP2_Pos (2U) -#define SI41XX_PHASEGAIN_KP2_Msk (0x3U << SI41XX_PHASEGAIN_KP2_Pos) -#define SI41XX_PHASEGAIN_KP2 SI41XX_PHASEGAIN_KP2_Msk -#define SI41XX_PHASEGAIN_KPI_Pos (4U) -#define SI41XX_PHASEGAIN_KPI_Msk (0x3U << SI41XX_PHASEGAIN_KPI_Pos) -#define SI41XX_PHASEGAIN_KPI SI41XX_PHASEGAIN_KPI_Msk -/** @} */ - -/** - * @name SI41XX Powerdown register fields - * @{ - */ -#define SI41XX_POWERDOWN_PBRB_Pos (0U) -#define SI41XX_POWERDOWN_PBRB_Msk (0x1U << SI41XX_POWERDOWN_PBRB_Pos) -#define SI41XX_POWERDOWN_PBRB SI41XX_POWERDOWN_PBRB_Msk -#define SI41XX_POWERDOWN_PBIB_Pos (1U) -#define SI41XX_POWERDOWN_PBIB_Msk (0x1U << SI41XX_POWERDOWN_PBIB_Pos) -#define SI41XX_POWERDOWN_PBIB SI41XX_POWERDOWN_PBIB_Msk -/** @} */ - -/** - * @name SI41XX RF1 N-Divider register fields - * @{ - */ -#define SI41XX_RF1_NDIV_Pos (0U) -#define SI41XX_RF1_NDIV_Msk (0x3FFFFU << SI41XX_RF1_NDIV_Pos) -#define SI41XX_RF1_NDIV SI41XX_RF1_NDIV_Msk -/** @} */ - -/** - * @name SI41XX RF2 N-Divider register fields - * @{ - */ -#define SI41XX_RF2_NDIV_Pos (0U) -#define SI41XX_RF2_NDIV_Msk (0x1FFFFU << SI41XX_RF2_NDIV_Pos) -#define SI41XX_RF2_NDIV SI41XX_RF2_NDIV_Msk -/** @} */ - -/** - * @name SI41XX IF N-Divider register fields - * @{ - */ -#define SI41XX_IF_NDIV_Pos (0U) -#define SI41XX_IF_NDIV_Msk (0xFFFFU << SI41XX_IF_NDIV_Pos) -#define SI41XX_IF_NDIV SI41XX_IF_NDIV_Msk -/** @} */ - -/** - * @name SI41XX RF1 R-Divider register fields - * @{ - */ -#define SI41XX_RF1_RDIV_Pos (0U) -#define SI41XX_RF1_RDIV_Msk (0x1FFFU << SI41XX_RF1_RDIV_Pos) -#define SI41XX_RF1_RDIV SI41XX_RF1_RDIV_Msk -/** @} */ - -/** - * @name SI41XX RF2 R-Divider register fields - * @{ - */ -#define SI41XX_RF2_RDIV_Pos (0U) -#define SI41XX_RF2_RDIV_Msk (0x1FFFU << SI41XX_RF2_RDIV_Pos) -#define SI41XX_RF2_RDIV SI41XX_RF2_RDIV_Msk -/** @} */ - -/** - * @name SI41XX IF R-Divider register fields - * @{ - */ -#define SI41XX_IF_RDIV_Pos (0U) -#define SI41XX_IF_RDIV_Msk (0x1FFFU << SI41XX_IF_RDIV_Pos) -#define SI41XX_IF_RDIV SI41XX_IF_RDIV_Msk -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief SI41XX device type. - * @details Defines the device type, which defines features availabe. - * @note The default is @p TRUE. - */ -#if !defined(SI41XX_DEVICE) || defined(__DOXYGEN__) -#define SI41XX_DEVICE SI4133 -#endif - -/** - * @brief SI41XX Mutual Exclusion. - * @details Enables mutual exclusion code for SI41XX driver. - * @note The default is @p TRUE. - */ -#if !defined(SI41XX_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SI41XX_USE_MUTUAL_EXCLUSION FALSE -#endif - -/** - * @brief SI41XX SERIAL interface switch. - * @details If set to @p TRUE the support for SI41XX SERIAL is included. - * @note The default is @p TRUE. - */ -#if !defined(SI41XX_USE_SERIAL) || defined(__DOXYGEN__) -#define SI41XX_USE_SERIAL TRUE -#endif - -/** - * @brief SI41XX shared SERIAL switch. - * @details If set to @p TRUE the device acquires SI41XX SERIAL bus ownership - * on each transaction. - * @note The default is @p FALSE. Requires SI41XX_USE_MUTUAL_EXCLUSION. - */ -#if !defined(SI41XX_SHARED_SERIAL) || defined(__DOXYGEN__) -#define SI41XX_SHARED_SERIAL FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if SI41XX_USE_SERIAL && !HAL_USE_PAL -#error "SI41XX_USE_SERIAL requires HAL_USE_PAL" -#endif - -#if SI41XX_SHARED_SERIAL && !SI41XX_USE_MUTUAL_EXCLUSION -#error "SI41XX_SHARED_SERIAL requires SI41XX_USE_MUTUAL_EXCLUSION" -#endif - -#if (SI41XX_DEVICE != SI4112 && \ - SI41XX_DEVICE != SI4113 && \ - SI41XX_DEVICE != SI4122 && \ - SI41XX_DEVICE != SI4123 && \ - SI41XX_DEVICE != SI4133) -#error "SI41XX_DEVICE is unknown device type" -#endif - -#if (SI41XX_DEVICE == SI4112 || SI41XX_DEVICE == SI4122 || SI41XX_DEVICE == SI4123 || SI41XX_DEVICE == SI4133) -#define SI41XX_HAS_IF TRUE -#else -#define SI41XX_HAS_IF FALSE -#endif - -#if (SI41XX_DEVICE == SI4113 || SI41XX_DEVICE == SI4123 || SI41XX_DEVICE == SI4133) -#define SI41XX_HAS_RF1 TRUE -#else -#define SI41XX_HAS_RF1 FALSE -#endif - -#if (SI41XX_DEVICE == SI4113 || SI41XX_DEVICE == SI4122 || SI41XX_DEVICE == SI4133) -#define SI41XX_HAS_RF2 TRUE -#else -#define SI41XX_HAS_RF2 FALSE -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @name SI41XX data structures and types. - * @{ - */ -/** - * @brief Driver state machine possible states. - */ -typedef enum { - SI41XX_UNINIT, /**< Not initialized. */ - SI41XX_STOP, /**< Stopped. */ - SI41XX_READY /**< Ready. */ -} si41xx_state_t; - -/** - * @brief SI41XX configuration structure. - */ -typedef struct{ -#if (SI41XX_USE_SERIAL) || defined(__DOXYGEN__) - /** - * @brief SI41XX SERIAL Enable Line. - */ - ioline_t sen; - /** - * @brief SI41XX SERIAL CLK Line. - */ - ioline_t sclk; - /** - * @brief SI41XX SERIAL DATA Line. - */ - ioline_t sdata; -#endif /* SI41XX_USE_SERIAL */ - /** - * @brief SI41XX Reference frequency. - */ - uint32_t ref_freq; -#if SI41XX_HAS_IF - /** - * @brief SI41XX IF Output Divider register value. - */ - uint8_t if_div; - /** - * @brief SI41XX IF N-Divider value. - */ - uint32_t if_n; - /** - * @brief SI41XX IF R-Divider value. - */ - uint32_t if_r; -#endif /* SI41XX_HAS_IF */ -#if SI41XX_HAS_RF1 - /** - * @brief SI41XX RF1 N-Divider value. - */ - uint32_t rf1_n; - /** - * @brief SI41XX RF1 R-Divider value. - */ - uint32_t rf1_r; -#endif /* SI41XX_HAS_RF1 */ -#if SI41XX_HAS_RF2 - /** - * @brief SI41XX RF2 N-Divider value. - */ - uint32_t rf2_n; - /** - * @brief SI41XX RF2 R-Divider value. - */ - uint32_t rf2_r; -#endif /* SI41XX_HAS_RF2 */ -} SI41XXConfig; - -/** - * @brief SI41XX Radio class. - */ -typedef struct SI41XXDriver { - /** - * @brief Driver state. - */ - si41xx_state_t state; - /** - * @brief Current configuration data. - */ - SI41XXConfig *config; -#if SI41XX_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - mutex_t mutex; -#endif /* SI41XX_USE_MUTUAL_EXCLUSION */ - uint8_t pwr; -} SI41XXDriver; -/** @} */ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -void si41xxObjectInit(SI41XXDriver *devp); -void si41xxStart(SI41XXDriver *devp, SI41XXConfig *config); -void si41xxStop(SI41XXDriver *devp); -void si41xxWriteRaw(SI41XXDriver *devp, uint8_t reg, uint32_t data); -#if SI41XX_HAS_IF -bool si41xxSetIF(SI41XXDriver *devp, uint32_t freq); -bool si41xxSetIFDiv(SI41XXDriver *devp, uint8_t div); -#endif -#if SI41XX_HAS_RF1 -bool si41xxSetRF1(SI41XXDriver *devp, uint32_t freq); -#endif -#if SI41XX_HAS_RF2 -bool si41xxSetRF2(SI41XXDriver *devp, uint32_t freq); -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _SI41XX_H_ */ - -/** @} */ diff --git a/common/lfs_util.c b/common/lfs_util.c deleted file mode 100644 index ebddd989..00000000 --- a/common/lfs_util.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * lfs util functions - * - * Copyright (c) 2017, Arm Limited. All rights reserved. - * SPDX-License-Identifier: BSD-3-Clause - */ -#include "lfs_util.h" - -// Software CRC implementation with small lookup table -uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size) { - static const uint32_t rtable[16] = { - 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, - 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, - 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, - 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c, - }; - - const uint8_t *data = buffer; - - for (size_t i = 0; i < size; i++) { - crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 0)) & 0xf]; - crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 4)) & 0xf]; - } - - return crc; -} diff --git a/common/max580x.c b/common/max580x.c deleted file mode 100644 index 73815885..00000000 --- a/common/max580x.c +++ /dev/null @@ -1,369 +0,0 @@ -/** - * @file max580x.c - * @brief MAX580X Digital to Analog Converter. - * - * @addtogroup MAX580X - * @ingrup ORESAT - * @{ - */ - -#include "hal.h" -#include "max580x.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ -typedef union { - struct __attribute__((packed)) { - uint8_t reg; - union { - uint8_t data[2]; - uint16_t value; - }; - }; - uint8_t buf[3]; -} i2cbuf_t; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -#if (MAX580X_USE_I2C) || defined(__DOXYGEN__) -/** - * @brief Reads registers value using I2C. - * @pre The I2C interface must be initialized and the driver started. - * - * @param[in] i2cp pointer to the I2C interface - * @param[in] sad slave address without R bit - * @param[in] reg first sub-register address - * @param[out] rxbuf pointer to an output buffer - * @param[in] n number of consecutive register to read - * @return the operation status. - * @notapi - */ -msg_t max580xI2CReadRegister(I2CDriver *i2cp, i2caddr_t sad, uint8_t reg, - uint8_t* rxbuf, size_t n) { - return i2cMasterTransmitTimeout(i2cp, sad, ®, 1, rxbuf, n, - TIME_INFINITE); -} - -/** - * @brief Writes a value into a register using I2C. - * @pre The I2C interface must be initialized and the driver started. - * - * @param[in] i2cp pointer to the I2C interface - * @param[in] sad slave address without R bit - * @param[in] txbuf buffer containing reg in first byte and high - * and low data bytes - * @param[in] n size of txbuf - * @return the operation status. - * @notapi - */ -msg_t max580xI2CWriteRegister(I2CDriver *i2cp, i2caddr_t sad, uint8_t *txbuf, - size_t n) { - return i2cMasterTransmitTimeout(i2cp, sad, txbuf, n, NULL, 0, - TIME_INFINITE); -} -#endif /* MAX580X_USE_I2C */ - -/*==========================================================================*/ -/* Interface implementation. */ -/*==========================================================================*/ - -static const struct MAX580XVMT vmt_device = { - (size_t)0, -}; - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes an instance. - * - * @param[out] devp pointer to the @p MAX580XDriver object - * - * @init - */ -void max580xObjectInit(MAX580XDriver *devp) { - devp->vmt = &vmt_device; - - devp->config = NULL; - - devp->state = MAX580X_STOP; -} - -/** - * @brief Configures and activates MAX580X Complex Driver peripheral. - * - * @param[in] devp pointer to the @p MAX580XDriver object - * @param[in] config pointer to the @p MAX580XConfig object - * - * @api - */ -void max580xStart(MAX580XDriver *devp, const MAX580XConfig *config) { - i2cbuf_t buf; - - osalDbgCheck((devp != NULL) && (config != NULL)); - osalDbgAssert((devp->state == MAX580X_STOP) || - (devp->state == MAX580X_READY), - "max580xStart(), invalid state"); - - devp->config = config; - buf.value = 0; - - /* Configuring common registers.*/ -#if MAX580X_USE_I2C -#if MAX580X_SHARED_I2C - i2cAcquireBus(config->i2cp); -#endif /* MAX580X_SHARED_I2C */ - - i2cStart(config->i2cp, config->i2ccfg); - buf.reg = MAX580X_AD_SOFTWARE | MAX580X_SOFTWARE_RST; - max580xI2CWriteRegister(config->i2cp, config->saddr, - buf.buf, sizeof(i2cbuf_t)); - buf.reg = MAX580X_AD_REF | config->ref; - max580xI2CWriteRegister(config->i2cp, config->saddr, - buf.buf, sizeof(i2cbuf_t)); - buf.reg = MAX580X_AD_POWER; - buf.data[1] = config->power; - max580xI2CWriteRegister(config->i2cp, config->saddr, - buf.buf, sizeof(i2cbuf_t)); - buf.reg = MAX580X_AD_CONFIG; - buf.data[1] = config->aux; - max580xI2CWriteRegister(config->i2cp, config->saddr, - buf.buf, sizeof(i2cbuf_t)); - buf.reg = MAX580X_AD_DEFAULT; - buf.data[1] = config->default_cfg; - max580xI2CWriteRegister(config->i2cp, config->saddr, - buf.buf, sizeof(i2cbuf_t)); - max580xI2CReadRegister(config->i2cp, config->saddr, MAX580X_AD_NOP, buf.data, sizeof(buf.data)); - switch (buf.data[1]) { - case MAX5805: - devp->res = MAX5805_RES; - devp->range = 4096; - break; - case MAX5803: - devp->res = MAX5803_RES; - devp->range = 256; - break; - case MAX5804: - devp->res = MAX5804_RES; - devp->range = 1024; - break; - default: - devp->res = 0; - devp->range = 0; - break; - } - -#if MAX580X_SHARED_I2C - i2cReleaseBus(config->i2cp); -#endif /* MAX580X_SHARED_I2C */ -#endif /* MAX580X_USE_I2C */ - devp->state = MAX580X_READY; -} - -/** - * @brief Deactivates the MAX580X Complex Driver peripheral. - * - * @param[in] devp pointer to the @p MAX580XDriver object - * - * @api - */ -void max580xStop(MAX580XDriver *devp) { - i2cbuf_t buf; - - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == MAX580X_STOP) || (devp->state == MAX580X_READY), - "max580xStop(), invalid state"); - - if (devp->state == MAX580X_READY) { -#if MAX580X_USE_I2C -#if MAX580X_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX580X_SHARED_I2C */ - - /* Reset to input.*/ - buf.reg = MAX580X_AD_SOFTWARE | MAX580X_SOFTWARE_RST; - max580xI2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(i2cbuf_t)); - - i2cStop(devp->config->i2cp); -#if MAX580X_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX580X_SHARED_I2C */ -#endif /* MAX580X_USE_I2C */ - } - devp->state = MAX580X_STOP; -} - -/** - * @brief Reads MAX580X DAC Register as raw value. - * - * @param[in] devp pointer to the @p MAX580XDriver object - * @param[in] reg the DAC register to read from - * - * @api - */ -uint16_t max580xReadRaw(MAX580XDriver *devp, max580x_reg_t reg) { - i2cbuf_t buf; - - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->state == MAX580X_READY, - "max580xReadRaw(), invalid state"); - -#if MAX580X_USE_I2C -#if MAX580X_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX580X_SHARED_I2C */ - - buf.reg = reg; - max580xI2CReadRegister(devp->config->i2cp, devp->config->saddr, buf.reg, buf.data, sizeof(buf.data)); - -#if MAX580X_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX580X_SHARED_I2C */ -#endif /* MAX580X_USE_I2C */ - return MAX580X_DAC2VAL(buf.value, devp->res); -} - -/** - * @brief Writes MAX580X DAC Register as raw value. - * - * @param[in] devp pointer to the @p MAX580XDriver object - * @param[in] reg the DAC register to write the value into - * @param[in] value the value to write to a DAC register - * - * @api - */ -void max580xWriteRaw(MAX580XDriver *devp, max580x_reg_t reg, uint16_t value) { - i2cbuf_t buf; - - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->state == MAX580X_READY, - "max580xWriteRaw(), invalid state"); - -#if MAX580X_USE_I2C -#if MAX580X_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX580X_SHARED_I2C */ - - buf.reg = reg; - buf.value = MAX580X_VAL2DAC(value, devp->res); - max580xI2CWriteRegister(devp->config->i2cp, devp->config->saddr, buf.buf, sizeof(buf)); - -#if MAX580X_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX580X_SHARED_I2C */ -#endif /* MAX580X_USE_I2C */ -} - -/** - * @brief Reads MAX580X DAC Register as a voltage. - * @details This only works when using an internal reference and assumes sufficient supply. - * - * @param[in] devp pointer to the @p MAX580XDriver object - * @param[in] reg the DAC register to read from - * - * @api - */ -uint32_t max580xReadVoltage(MAX580XDriver *devp, max580x_reg_t reg) { - uint32_t voltage; - - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->config->ref != MAX580X_REF_EXT, - "max580xReadVoltage(), REF_EXT not allowed"); - - /* TODO: Clean this up, it's terrible */ - voltage = max580xReadRaw(devp, reg) * 10; - switch (devp->config->ref & 3U) { - case MAX580X_REF_2500: - voltage = voltage * 2500; - break; - case MAX580X_REF_2048: - voltage = voltage * 2048; - break; - case MAX580X_REF_4096: - voltage = voltage * 4096; - break; - } - voltage /= devp->range; - - return voltage; -} - -/** - * @brief Writes MAX580X DAC Register as a voltage. - * @details This only works when using an internal reference and assumes sufficient supply. - * - * @param[in] devp pointer to the @p MAX580XDriver object - * @param[in] reg the DAC register to write the value into - * @param[in] voltage the voltage to write to a DAC register - * - * @api - */ -void max580xWriteVoltage(MAX580XDriver *devp, max580x_reg_t reg, uint32_t voltage) { - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->config->ref != MAX580X_REF_EXT, - "max580xWriteVoltage(), REF_EXT not allowed"); - - /* TODO: Clean this up, it's terrible */ - /* TODO: Bounds checking */ - voltage -= (voltage % 5); - voltage *= devp->range; - switch (devp->config->ref & 3U) { - case MAX580X_REF_2500: - voltage /= 25000; - break; - case MAX580X_REF_2048: - voltage /= 20480; - break; - case MAX580X_REF_4096: - voltage /= 40960; - break; - } - max580xWriteRaw(devp, reg, voltage); -} - -/** - * @brief Execute MAX580X LOAD instruction. - * - * @param[in] devp pointer to the @p MAX580XDriver object - * - * @api - */ -void max580xLoad(MAX580XDriver *devp) { - i2cbuf_t buf; - osalDbgCheck(devp != NULL); - osalDbgAssert(devp->state == MAX580X_READY, - "max580xReadRaw(), invalid state"); - -#if MAX580X_USE_I2C -#if MAX580X_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX580X_SHARED_I2C */ - - buf.reg = MAX580X_AD_LOAD; - buf.value = 0; - max580xI2CWriteRegister(devp->config->i2cp, devp->config->saddr, buf.buf, sizeof(buf)); - -#if MAX580X_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX580X_SHARED_I2C */ -#endif /* MAX580X_USE_I2C */ -} - -/** @} */ diff --git a/common/max580x.mk b/common/max580x.mk deleted file mode 100644 index fe9e70a1..00000000 --- a/common/max580x.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the MAX580X device files. -MAX580XSRC := $(PROJ_SRC)/max580x.c - -# Required include directories -MAX580XINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(MAX580XSRC) -ALLINC += $(MAX580XINC) diff --git a/common/max7310.c b/common/max7310.c deleted file mode 100644 index 9b212c97..00000000 --- a/common/max7310.c +++ /dev/null @@ -1,368 +0,0 @@ -/** - * @file max7310.c - * @brief MAX7310 GPIO Expander code. - * - * @addtogroup MAX7310 - * @ingrup ORESAT - * @{ - */ - -#include "hal.h" -#include "max7310.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ -typedef union { - struct __attribute__((packed)) { - uint8_t reg; - uint8_t data; - }; - uint8_t buf[2]; -} i2cbuf_t; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -#if (MAX7310_USE_I2C) || defined(__DOXYGEN__) -/** - * @brief Reads registers value using I2C. - * @pre The I2C interface must be initialized and the driver started. - * - * @param[in] i2cp pointer to the I2C interface - * @param[in] sad slave address without R bit - * @param[in] reg first sub-register address - * @param[out] rxbuf pointer to an output buffer - * @param[in] n number of consecutive register to read - * @return the operation status. - * @notapi - */ -msg_t max7310I2CReadRegister(I2CDriver *i2cp, i2caddr_t sad, uint8_t reg, - uint8_t* rxbuf, size_t n) { - return i2cMasterTransmitTimeout(i2cp, sad, ®, 1, rxbuf, n, - TIME_MS2I(10)); -} - -/** - * @brief Writes a value into a register using I2C. - * @pre The I2C interface must be initialized and the driver started. - * - * @param[in] i2cp pointer to the I2C interface - * @param[in] sad slave address without R bit - * @param[in] txbuf buffer containing command in first byte and high - * and low data bytes - * @param[in] n size of txbuf - * @return the operation status. - * @notapi - */ -msg_t max7310I2CWriteRegister(I2CDriver *i2cp, i2caddr_t sad, uint8_t *txbuf, - size_t n) { - return i2cMasterTransmitTimeout(i2cp, sad, txbuf, n, NULL, 0, - TIME_MS2I(10)); -} -#endif /* MAX7310_USE_I2C */ - -/*==========================================================================*/ -/* Interface implementation. */ -/*==========================================================================*/ - -static const struct MAX7310VMT vmt_device = { - (size_t)0, -}; - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes an instance. - * - * @param[out] devp pointer to the @p MAX7310Driver object - * - * @init - */ -void max7310ObjectInit(MAX7310Driver *devp) { - devp->vmt = &vmt_device; - - devp->config = NULL; - - devp->state = MAX7310_STOP; -} - -/** - * @brief Configures and activates MAX7310 Complex Driver peripheral. - * - * @param[in] devp pointer to the @p MAX7310Driver object - * @param[in] config pointer to the @p MAX7310Config object - * - * @api - */ -void max7310Start(MAX7310Driver *devp, const MAX7310Config *config) { - i2cbuf_t buf; - osalDbgCheck((devp != NULL) && (config != NULL)); - - osalDbgAssert((devp->state == MAX7310_STOP) || - (devp->state == MAX7310_READY), - "max7310Start(), invalid state"); - - devp->config = config; - - /* Configuring common registers.*/ -#if MAX7310_USE_I2C -#if MAX7310_SHARED_I2C - i2cAcquireBus(config->i2cp); -#endif /* MAX7310_SHARED_I2C */ - - i2cStart(config->i2cp, config->i2ccfg); - buf.reg = MAX7310_AD_ODR; - buf.data = config->odr; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(buf)); - buf.reg = MAX7310_AD_POL; - buf.data = config->pol; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(buf)); - buf.reg = MAX7310_AD_MODE; - buf.data = config->iomode; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(buf)); - buf.reg = MAX7310_AD_TIMEOUT; - buf.data = config->timeout; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(buf)); - -#if MAX7310_SHARED_I2C - i2cReleaseBus(config->i2cp); -#endif /* MAX7310_SHARED_I2C */ -#endif /* MAX7310_USE_I2C */ - devp->state = MAX7310_READY; -} - -/** - * @brief Deactivates the MAX7310 Complex Driver peripheral. - * - * @param[in] devp pointer to the @p MAX7310Driver object - * - * @api - */ -void max7310Stop(MAX7310Driver *devp) { - i2cbuf_t buf; - - osalDbgCheck(devp != NULL); - - osalDbgAssert((devp->state == MAX7310_STOP) || (devp->state == MAX7310_READY), - "max7310Stop(), invalid state"); - - if (devp->state == MAX7310_READY) { -#if MAX7310_USE_I2C -#if MAX7310_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX7310_SHARED_I2C */ - - /* Reset to input.*/ - buf.reg = MAX7310_AD_MODE; - buf.data = 0xFF; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(buf)); - - /* Reset output reg to 0.*/ - buf.reg = MAX7310_AD_ODR; - buf.data = 0; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(buf)); - - /* Reset polarity.*/ - buf.reg = MAX7310_AD_POL; - buf.data = 0xF0; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(buf)); - - /* Reset timeout.*/ - buf.reg = MAX7310_AD_TIMEOUT; - buf.data = MAX7310_TIMEOUT_ENABLED; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, - buf.buf, sizeof(buf)); - - i2cStop(devp->config->i2cp); -#if MAX7310_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX7310_SHARED_I2C */ -#endif /* MAX7310_USE_I2C */ - } - devp->state = MAX7310_STOP; -} - -/** - * @brief Reads MAX7310 register as raw value. - * - * @param[in] devp pointer to the @p MAX7310Driver object - * @param[in] reg the register to read - * - * @api - */ -uint8_t max7310ReadRaw(MAX7310Driver *devp, uint8_t reg) { - uint8_t value; - - osalDbgCheck(devp != NULL); - - osalDbgAssert(devp->state == MAX7310_READY, - "max7310ReadRaw(), invalid state"); - -#if MAX7310_USE_I2C -#if MAX7310_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX7310_SHARED_I2C */ - - max7310I2CReadRegister(devp->config->i2cp, devp->config->saddr, reg, &value, sizeof(value)); - -#if MAX7310_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX7310_SHARED_I2C */ -#endif /* MAX7310_USE_I2C */ - return value; -} - -/** - * @brief Writes MAX7310 register as raw value. - * - * @param[in] devp pointer to the @p MAX7310Driver object - * @param[in] reg the register to write to - * @param[in] value the value to write - * - * @api - */ -void max7310WriteRaw(MAX7310Driver *devp, uint8_t reg, uint8_t value) { - i2cbuf_t buf; - - osalDbgCheck(devp != NULL); - - osalDbgAssert(devp->state == MAX7310_READY, - "max7310WriteRaw(), invalid state"); - -#if MAX7310_USE_I2C -#if MAX7310_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX7310_SHARED_I2C */ - - buf.reg = reg; - buf.data = value; - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, buf.buf, sizeof(buf)); - -#if MAX7310_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX7310_SHARED_I2C */ -#endif /* MAX7310_USE_I2C */ -} - -/** - * @brief Sets MAX7310 pin - * - * @param[in] devp pointer to the @p MAX7310Driver object - * @param[in] pin pin to set - * - * @api - */ -void max7310SetPin(MAX7310Driver *devp, uint8_t pin) { - i2cbuf_t buf; - - osalDbgCheck(devp != NULL); - - osalDbgAssert(devp->state == MAX7310_READY, - "max7310SetPin(), invalid state"); - -#if MAX7310_USE_I2C -#if MAX7310_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX7310_SHARED_I2C */ - - buf.reg = MAX7310_AD_ODR; - max7310I2CReadRegister(devp->config->i2cp, devp->config->saddr, buf.reg, &buf.data, sizeof(buf.data)); - buf.data |= MAX7310_PIN_MASK(pin); - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, buf.buf, sizeof(buf)); - -#if MAX7310_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX7310_SHARED_I2C */ -#endif /* MAX7310_USE_I2C */ -} - -/** - * @brief Clear MAX7310 pin - * - * @param[in] devp pointer to the @p MAX7310Driver object - * @param[in] pin pin to clear - * - * @api - */ -void max7310ClearPin(MAX7310Driver *devp, uint8_t pin) { - i2cbuf_t buf; - - osalDbgCheck(devp != NULL); - - osalDbgAssert(devp->state == MAX7310_READY, - "max7310SetPin(), invalid state"); - -#if MAX7310_USE_I2C -#if MAX7310_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX7310_SHARED_I2C */ - - buf.reg = MAX7310_AD_ODR; - max7310I2CReadRegister(devp->config->i2cp, devp->config->saddr, buf.reg, &buf.data, sizeof(buf.data)); - buf.data &= ~MAX7310_PIN_MASK(pin); - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, buf.buf, sizeof(buf)); - -#if MAX7310_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX7310_SHARED_I2C */ -#endif /* MAX7310_USE_I2C */ -} - -/** - * @brief Toggle MAX7310 pin - * - * @param[in] devp pointer to the @p MAX7310Driver object - * @param[in] pin pin to toggle - * - * @api - */ -void max7310TogglePin(MAX7310Driver *devp, uint8_t pin) { - i2cbuf_t buf; - - osalDbgCheck(devp != NULL); - - osalDbgAssert(devp->state == MAX7310_READY, - "max7310SetPin(), invalid state"); - -#if MAX7310_USE_I2C -#if MAX7310_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MAX7310_SHARED_I2C */ - - buf.reg = MAX7310_AD_ODR; - max7310I2CReadRegister(devp->config->i2cp, devp->config->saddr, buf.reg, &buf.data, sizeof(buf.data)); - buf.data ^= MAX7310_PIN_MASK(pin); - max7310I2CWriteRegister(devp->config->i2cp, devp->config->saddr, buf.buf, sizeof(buf)); - -#if MAX7310_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MAX7310_SHARED_I2C */ -#endif /* MAX7310_USE_I2C */ -} - -/** @} */ diff --git a/common/max7310.mk b/common/max7310.mk deleted file mode 100644 index d697f591..00000000 --- a/common/max7310.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the MAX7310 device files. -MAX7310SRC := $(PROJ_SRC)/max7310.c - -# Required include directories -MAX7310INC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(MAX7310SRC) -ALLINC += $(MAX7310INC) diff --git a/common/mmc5883ma.c b/common/mmc5883ma.c deleted file mode 100644 index d40dd06d..00000000 --- a/common/mmc5883ma.c +++ /dev/null @@ -1,353 +0,0 @@ -/** - * @file mmc5883ma.c - * @brief MMC5883MA Magnetometer - * - * @addtogroup MMC5883MA - * @ingrup ORESAT - * @{ - */ - -#include "ch.h" -#include "hal.h" -#include "mmc5883ma.h" -#include "string.h" -#include "chprintf.h" - - -#define DEBUG_SD (BaseSequentialStream*) &SD2 - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ -//typedef union { -// struct __attribute__((packed)) { -// uint8_t reg; -// union { -// uint8_t data[2]; -// uint16_t value; -// }; -// }; -// uint8_t buf[3]; -//} i2cbuf_t; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ -#define MMC5883MA_DEFAULT_I2C_TIMEOUT 50 - -#if (MMC5883MA_USE_I2C) || defined(__DOXYGEN__) - -bool mmc5883maI2CWriteRegister2(I2CDriver *i2cp, const uint8_t reg_number, const uint8_t value) { - uint8_t tx[2]; - tx[0] = reg_number; - tx[1] = value; - - if( i2cMasterTransmitTimeout(i2cp, MMC5883MA_I2C_ADDRESS_WRITE, tx, 2, NULL, 0, MMC5883MA_DEFAULT_I2C_TIMEOUT) == MSG_OK ) { - return(true); - } - return(false); -} - -bool mmc5883maI2CReadRegister2(I2CDriver *i2cp, const uint8_t reg_number, uint8_t *dest_value) { - uint8_t tx[2]; - tx[0] = reg_number; - tx[1] = 0; - uint8_t rx[2]; - rx[0] = 0; - rx[1] = 0; - - if( i2cMasterTransmitTimeout(i2cp, (i2caddr_t) MMC5883MA_I2C_ADDRESS_READ, tx, 1, rx, 1, MMC5883MA_DEFAULT_I2C_TIMEOUT) == MSG_OK ) { - *dest_value = rx[0]; - return(true); - } - return(false); -} - - -bool mmc5883maI2CReadRegister3(I2CDriver *i2cp, const uint8_t i2c_address, const uint8_t reg_number, uint8_t *dest_value) { - uint8_t tx[2]; - tx[0] = reg_number; - tx[1] = 0; - uint8_t rx[2]; - rx[0] = 0; - rx[1] = 0; - - if( i2cMasterTransmitTimeout(i2cp, (i2caddr_t) i2c_address, tx, 1, rx, 1, MMC5883MA_DEFAULT_I2C_TIMEOUT) == MSG_OK ) { - *dest_value = rx[0]; - return(true); - } - return(false); -} - -bool mmc5883maI2CReadRegister4(I2CDriver *i2cp, const uint8_t i2c_address, const uint8_t reg_number, uint16_t *dest_value) { - uint8_t tx[2]; - tx[0] = reg_number; - tx[1] = 0; - uint8_t rx[2]; - rx[0] = 0; - rx[1] = 0; - - if( i2cMasterTransmitTimeout(i2cp, (i2caddr_t) i2c_address, tx, 1, rx, 2, MMC5883MA_DEFAULT_I2C_TIMEOUT) == MSG_OK ) { - *dest_value = rx[0] | rx[1]; - return(true); - } - return(false); -} - -#endif /* MMC5883MA_USE_I2C */ - -/*==========================================================================*/ -/* Interface implementation. */ -/*==========================================================================*/ - -static const struct MMC5883MAVMT vmt_device = { - (size_t)0, -}; - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - - -bool mmc5883maReadData(MMC5883MADriver *devp, mmc5883ma_data_t *dest) { - osalDbgCheck((devp != NULL)); -// osalDbgAssert((devp->state != MMC5883MA_READY), -// "mmc5883maStart(), invalid state"); - - if( devp->state != MMC5883MA_READY ) { - return(false); - } - - - devp->read_call_count++; - - - - bool ret = false; - - /* Configuring common registers.*/ -#if MMC5883MA_USE_I2C -#if MMC5883MA_SHARED_I2C - i2cAcquireBus(config->i2cp); -#endif /* MMC5883MA_SHARED_I2C */ - - - uint8_t rx[10]; - memset(rx, 0, sizeof(rx)); - - uint8_t reg = MMC5883MA_AD_XOUT_LOW; - - i2cStart(devp->config->i2cp, devp->config->i2ccfg); - msg_t r = i2cMasterTransmitTimeout(devp->config->i2cp, MMC5883MA_I2C_ADDRESS_READ, ®, 1, rx, 6, MMC5883MA_DEFAULT_I2C_TIMEOUT); - i2cStop(devp->config->i2cp); - - dest->mx = (rx[0] << 8) | rx[1]; - dest->my = (rx[2] << 8) | rx[3]; - dest->mz = (rx[4] << 8) | rx[5]; - - if( r == MSG_OK ) { - ret = true; - - if( devp->read_call_count > 20 ) { - //This will periodically clear any bias on the magnetometer - devp->read_call_count = 0; - - i2cStart(devp->config->i2cp, devp->config->i2ccfg); - if( ! mmc5883maI2CWriteRegister2(devp->config->i2cp, MMC5883MA_AD_INTRNLCTRL0, MMC5883MA_INTRNLCTRL0_SET)) { - - } - i2cStop(devp->config->i2cp); - chThdSleepMilliseconds(1); - - - memset(rx, 0, sizeof(rx)); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); - msg_t r = i2cMasterTransmitTimeout(devp->config->i2cp, MMC5883MA_I2C_ADDRESS_READ, ®, 1, rx, 6, MMC5883MA_DEFAULT_I2C_TIMEOUT); - i2cStop(devp->config->i2cp); - - mmc5883ma_data_t dest_temp; - dest_temp.mx = (rx[0] << 8) | rx[1]; - dest_temp.my = (rx[2] << 8) | rx[3]; - dest_temp.mz = (rx[4] << 8) | rx[5]; - - - const int32_t delta_set_reset_x = dest_temp.mx - dest->mx; - const int32_t delta_set_reset_y = dest_temp.my - dest->my; - const int32_t delta_set_reset_z = dest_temp.mz - dest->mz; - - const float bridge_offset_midpoint_x = ((float) delta_set_reset_x) / 2.0; - const float bridge_offset_midpoint_y = ((float) delta_set_reset_y) / 2.0; - const float bridge_offset_midpoint_z = ((float) delta_set_reset_z) / 2.0; - - //Modify tracked bridge offset estimate, but filter the data slightly. - const float filter_coefficient = 4.0; - devp->bridge_offset_estimate_x = devp->bridge_offset_estimate_x + ((bridge_offset_midpoint_x - devp->bridge_offset_estimate_x) / filter_coefficient); - devp->bridge_offset_estimate_y = devp->bridge_offset_estimate_y + ((bridge_offset_midpoint_y - devp->bridge_offset_estimate_y) / filter_coefficient); - devp->bridge_offset_estimate_z = devp->bridge_offset_estimate_z + ((bridge_offset_midpoint_z - devp->bridge_offset_estimate_z) / filter_coefficient); - - i2cStart(devp->config->i2cp, devp->config->i2ccfg); - if( ! mmc5883maI2CWriteRegister2(devp->config->i2cp, MMC5883MA_AD_INTRNLCTRL0, MMC5883MA_INTRNLCTRL0_RST)) { - - } - i2cStop(devp->config->i2cp); - chThdSleepMilliseconds(1); - } - - dest->mx += devp->bridge_offset_estimate_x; - dest->my += devp->bridge_offset_estimate_y; - dest->mz += devp->bridge_offset_estimate_z; - } - -#if MMC5883MA_SHARED_I2C - i2cReleaseBus(config->i2cp); -#endif /* MMC5883MA_SHARED_I2C */ -#endif /* MMC5883MA_USE_I2C */ - - return(ret); -} - -/** - * @brief Initializes an instance. - * - * @param[out] devp pointer to the @p MMC5883MADriver object - * - * @init - */ -void mmc5883maObjectInit(MMC5883MADriver *devp) { - devp->vmt = &vmt_device; - - devp->config = NULL; - - devp->state = MMC5883MA_STOP; - - devp->bridge_offset_estimate_x = 0; - devp->bridge_offset_estimate_y = 0; - devp->bridge_offset_estimate_z = 0; - devp->read_call_count = 0; -} - -bool mmc5883maSoftReset(MMC5883MADriver *devp) { - chprintf(DEBUG_SD, "Resetting MMC5883...\r\n"); - bool r = mmc5883maI2CWriteRegister2(devp->config->i2cp, MMC5883MA_AD_INTRNLCTRL1, MMC5883MA_INTRNLCTRL1_SW_RST_CMD); - chThdSleepMilliseconds(5); - return(r); -} - -/** - * @brief Configures and activates MMC5883MA Complex Driver peripheral. - * - * @param[in] devp pointer to the @p MMC5883MADriver object - * @param[in] config pointer to the @p MMC5883MAConfig object - * - * @api - */ -uint8_t mmc5883ma_product_id_readback; - -bool mmc5883maStart(MMC5883MADriver *devp, const MMC5883MAConfig *config) { - osalDbgCheck((devp != NULL) && (config != NULL)); - osalDbgAssert((devp->state == MMC5883MA_STOP) || - (devp->state == MMC5883MA_READY), - "mmc5883maStart(), invalid state"); - - devp->config = config; - - /* Configuring common registers.*/ -#if MMC5883MA_USE_I2C -#if MMC5883MA_SHARED_I2C - i2cAcquireBus(config->i2cp); -#endif /* MMC5883MA_SHARED_I2C */ - - i2cStart(config->i2cp, config->i2ccfg); - - devp->state = MMC5883MA_READY; - - - bool found_mmc5883ma_flag = false; - - //Probe I2C bus to see what's attached - if( ! mmc5883maI2CReadRegister3(devp->config->i2cp, MMC5883MA_I2C_ADDRESS_READ, MMC5883MA_AD_PRDCT_ID_1, &mmc5883ma_product_id_readback) ) { - chprintf(DEBUG_SD, "Failed to read product code from MMC5883MA chip, i2c comm failure\r\n"); - } else { - if( mmc5883ma_product_id_readback == MMC5883MA_EXPECTED_PRODUCT_CODE ) { - chprintf(DEBUG_SD, "Successfully read product code from MMC5883MA (good), 0x%X\r\n", mmc5883ma_product_id_readback); - found_mmc5883ma_flag = true; - } else { - chprintf(DEBUG_SD, "ERROR: unexpected product ID code from MMC5883MA, read 0x%X, expected 0x%X\r\n", mmc5883ma_product_id_readback, MMC5883MA_EXPECTED_PRODUCT_CODE); - } - } - - if( found_mmc5883ma_flag ) { - mmc5883maSoftReset(devp); - - if( ! mmc5883maI2CReadRegister2(devp->config->i2cp, MMC5883MA_AD_PRDCT_ID_1, &mmc5883ma_product_id_readback) ) { - devp->state = MMC5883MA_STOP; - } else { - chprintf(DEBUG_SD, "Read MMC5883MA product code as 0x%X, expected 0x%X\r\n", mmc5883ma_product_id_readback, MMC5883MA_EXPECTED_PRODUCT_CODE); - if( mmc5883ma_product_id_readback != MMC5883MA_EXPECTED_PRODUCT_CODE ) { - chprintf(DEBUG_SD, "ERROR: Read incorrect MMC5883MA product code!!!\r\n"); - devp->state = MMC5883MA_STOP; - } - } - - if( devp->state == MMC5883MA_READY ) { - if( ! mmc5883maI2CWriteRegister2(devp->config->i2cp, MMC5883MA_AD_INTRNLCTRL2, MMC5883MA_INTRNLCTRL2_CM_FREQ_1_Hz)) { - devp->state = MMC5883MA_STOP; - } - } - } else { - devp->state = MMC5883MA_STOP; - } - - i2cStop(devp->config->i2cp); - -#if MMC5883MA_SHARED_I2C - i2cReleaseBus(config->i2cp); -#endif /* MMC5883MA_SHARED_I2C */ -#endif /* MMC5883MA_USE_I2C */ - - - return(devp->state == MMC5883MA_READY); -} - -/** - * @brief Deactivates the MMC5883MA Complex Driver peripheral. - * - * @param[in] devp pointer to the @p MMC5883MADriver object - * - * @api - */ -void mmc5883maStop(MMC5883MADriver *devp) { - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == MMC5883MA_STOP) || (devp->state == MMC5883MA_READY), - "mmc5883maStop(), invalid state"); - - if (devp->state == MMC5883MA_READY) { -#if MMC5883MA_USE_I2C -#if MMC5883MA_SHARED_I2C - i2cAcquireBus(devp->config->i2cp); - i2cStart(devp->config->i2cp, devp->config->i2ccfg); -#endif /* MMC5883MA_SHARED_I2C */ - - //The MMC will be in low power mode after being reset - mmc5883maSoftReset(devp); - - i2cStop(devp->config->i2cp); -#if MMC5883MA_SHARED_I2C - i2cReleaseBus(devp->config->i2cp); -#endif /* MMC5883MA_SHARED_I2C */ -#endif /* MMC5883MA_USE_I2C */ - } - devp->state = MMC5883MA_STOP; -} - - - -/** @} */ diff --git a/common/mmc5883ma.mk b/common/mmc5883ma.mk deleted file mode 100644 index 42ad92c7..00000000 --- a/common/mmc5883ma.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the MMC5883MA device files. -MMC5883MASRC := $(PROJ_SRC)/mmc5883ma.c - -# Required include directories -MMC5883MAINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(MMC5883MASRC) -ALLINC += $(MMC5883MAINC) diff --git a/common/morse.c b/common/morse.c deleted file mode 100644 index 7a7b2721..00000000 --- a/common/morse.c +++ /dev/null @@ -1,169 +0,0 @@ -#include "morse.h" -#include "ax5043.h" - -/** - * @brief Morse code for alphabets and numbers. - */ -static const char *alpha[] = { - ".-", //A - "-...", //B - "-.-.", //C - "-..", //D - ".", //E - "..-.", //F - "--.", //G - "....", //H - "..", //I - ".---", //J - "-.-", //K - ".-..", //L - "--", //M - "-.", //N - "---", //O - ".--.", //P - "--.-", //Q - ".-.", //R - "...", //S - "-", //T - "..-", //U - "...-", //V - ".--", //W - "-..-", //X - "-.--", //Y - "--..", //Z -}; - -static const char *num[] = { - "-----", //0 - ".----", //1 - "..---", //2 - "...--", //3 - "....-", //4 - ".....", //5 - "-....", //6 - "--...", //7 - "---..", //8 - "----.", //9 -}; - -/** - * @brief Prepare for CW mode - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - */ -uint8_t ax5043_prepare_cw(AX5043Driver *devp){ - ax5043WriteU24(devp, AX5043_REG_FSKDEV, 0x000000U); - ax5043WriteU24(devp, AX5043_REG_TXRATE, 0x000001U); - - ax5043SetPWRMode(devp, AX5043_PWRMODE_TX_FULL); - - /* This is not mentioned in datasheet or programming manual but is required. - * Removing this will make the transmission to transmit in low power for a few seconds - * before it reaches peak power */ - /* FIFO reset */ - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, AX5043_FIFOCMD_CLEAR_FIFODAT); - ax5043WriteU8(devp, AX5043_REG_FIFODATA, (AX5043_CHUNKCMD_REPEATDATA | _VAL2FLD(AX5043_FIFOCHUNK_SIZE, 3))); - /* Preamble flag */ - ax5043WriteU8(devp, AX5043_REG_FIFODATA, AX5043_CHUNK_DATATX_UNENC | AX5043_CHUNK_DATATX_NOCRC); - ax5043WriteU8(devp, AX5043_REG_FIFODATA, 0xFF); - /* Preamble */ - ax5043WriteU8(devp, AX5043_REG_FIFODATA, 0x55); - /* FIFO Commit */ - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, 0x04); - - ax5043SetPWRMode(devp, AX5043_PWRMODE_STANDBY); - devp->state = AX5043_CW; - return 0; -} - -/** - * @brief Send Morse dot and dash over the air - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] dot_dash_time time in milliseconds for transmiter to be on. - */ -void ax5043_morse_dot_dash(AX5043Driver *devp, uint16_t dot_dash_time){ - ax5043SetPWRMode(devp, AX5043_PWRMODE_TX_FULL); - ax5043WriteU8(devp, AX5043_REG_FIFODATA, (AX5043_CHUNKCMD_REPEATDATA | _VAL2FLD(AX5043_FIFOCHUNK_SIZE, 3))); - /* Preamble flag */ - ax5043WriteU8(devp, AX5043_REG_FIFODATA, AX5043_CHUNK_DATATX_UNENC | AX5043_CHUNK_DATATX_NOCRC); - ax5043WriteU8(devp, AX5043_REG_FIFODATA, 0xFF); - /* Preamble */ - ax5043WriteU8(devp, AX5043_REG_FIFODATA, 0x00); - /* FIFO Commit */ - ax5043WriteU8(devp, AX5043_REG_FIFOSTAT, 0x04); - chThdSleepMilliseconds(dot_dash_time); - ax5043SetPWRMode(devp, AX5043_PWRMODE_STANDBY); - -} - -/** - * @brief Convert an alphabet or number to morse dot and dash - * - * @param[in] letter An alphabet or number. - * - * @return Length of packet received. - */ -const char *ax5043_ascii_to_morse(char letter){ - letter = tolower(letter); - - if (isalpha(letter)){ - return alpha[letter-'a']; - } - else if (isdigit(letter)){ - return num[letter-'0']; - } - - return " "; -} - -/** - * @brief Convert a message to morse code and transmit it. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] wpm words per minute. - * @param[in] beaconMessage Message to be transmitted. - * @param[in] pktlen Length of packet/beacon message. - */ -void ax5043_send_cw(AX5043Driver *devp, int wpm, char beaconMessage[], uint16_t pktlen ){ - int element; - int index = 0; - const char *morse; - - uint16_t ditLength = 1200/wpm; - uint16_t letter_space = ditLength*3; - uint16_t word_space = ditLength*7; - uint16_t element_space = ditLength; - uint16_t dash = ditLength*3; - - while (index < pktlen){ - morse = ax5043_ascii_to_morse(beaconMessage[index]); - - element = 0; - while (morse[element] != '\0'){ - switch(morse[element]){ - case '-': - ax5043_morse_dot_dash(devp, dash); - break; - case '.': - ax5043_morse_dot_dash(devp, ditLength); - break; - } - - if (morse[element] == ' '){ - chThdSleepMilliseconds(word_space); - } - else if (morse[element+1] != '\0'){ - chThdSleepMilliseconds(element_space); - } - else if (morse[element+1] == '\0'){ - chThdSleepMilliseconds(letter_space); - } - element++; - } - - index++; - } -} diff --git a/common/node_mgr.c b/common/node_mgr.c deleted file mode 100644 index 6cbac29a..00000000 --- a/common/node_mgr.c +++ /dev/null @@ -1,133 +0,0 @@ -#include "node_mgr.h" -#include "opd.h" - -#define MGR_EVENT_WAKEUP EVENT_MASK(0) -#define MGR_EVENT_TERMINATE EVENT_MASK(1) -#define MGR_EVENT_CHANGE EVENT_MASK(2) -#define MGR_EVENT_ONLINE EVENT_MASK(3) -#define MGR_EVENT_OFFLINE EVENT_MASK(4) -#define MGR_EVENT_BOOT EVENT_MASK(5) - -typedef struct oresat_node_state { - const oresat_node_t *desc; - CO_NMT_internalState_t state; - uint8_t attempts; - bool enable; -} node_state_t; - -/* TODO: Don't use extern, switch to some system config/object struct */ -extern CO_t *CO; - -node_state_t node_state[OD_CNT_HB_CONS]; -EVENTSOURCE_DECL(mgr_change_event); - -void node_change_cb(uint8_t nodeId, uint8_t idx, CO_NMT_internalState_t state, void *object) -{ - (void)nodeId; - node_state_t *node = object; - syssts_t sts; - sts = chSysGetStatusAndLockX(); - node->state = state; - chEvtBroadcastFlagsI(&mgr_change_event, idx); - chSysRestoreStatusX(sts); -} - -THD_WORKING_AREA(node_mgr_wa, 0x400); -THD_FUNCTION(node_mgr, arg) -{ - const oresat_node_t *node = arg; - event_listener_t mgr_change_el; - eventmask_t event; - eventflags_t idx; - - opd_init(); - opd_start(); - - for (int i = 0; node[i].id != 0; i++) { - OD_IO_t hbcons_io; - uint32_t hbcons_entry = node[i].id << 16 | node[i].timeout; - OD_size_t count; - OD_getSub(OD_ENTRY_H1016_consumerHeartbeatTime, i + 1, &hbcons_io, false); - hbcons_io.write(&hbcons_io.stream, &hbcons_entry, sizeof(hbcons_entry), &count); - node_state[i].desc = &node[i]; - node_state[i].attempts = 0; - if (node[i].opd_addr == 0x00 || node[i].autostart) - node_enable(node[i].id, true); - } - - chEvtRegisterMaskWithFlags(&mgr_change_event, &mgr_change_el, MGR_EVENT_CHANGE, ALL_EVENTS); - - while (!chThdShouldTerminateX()) { - event = chEvtWaitAnyTimeout(MGR_EVENT_WAKEUP | MGR_EVENT_TERMINATE | MGR_EVENT_CHANGE, TIME_INFINITE); - if (event & MGR_EVENT_TERMINATE) - continue; - if (event & MGR_EVENT_CHANGE) { - idx = chEvtGetAndClearFlags(&mgr_change_el); - node_state_t *node = &node_state[idx]; - switch (node->state) { - case CO_NMT_UNKNOWN: - if (node->desc->opd_addr && node->enable) { - if (node->attempts < 3) { - node_enable(node->desc->id, false); - chThdSleepMilliseconds(500); - node_enable(node->desc->id, true); - node->attempts++; - } else { - node_enable(node->desc->id, false); - } - } - break; - case CO_NMT_INITIALIZING: - break; - case CO_NMT_PRE_OPERATIONAL: - case CO_NMT_OPERATIONAL: - node->attempts = 0; - break; - case CO_NMT_STOPPED: - break; - default: - break; - } - } - } - - chEvtUnregister(&mgr_change_event, &mgr_change_el); - for (int i = 0; node[i].id != 0; i++) { - node_enable(node[i].id, false); - OD_IO_t hbcons_io; - uint32_t hbcons_entry = 0; - OD_size_t count; - OD_getSub(OD_ENTRY_H1016_consumerHeartbeatTime, i + 1, &hbcons_io, false); - hbcons_io.write(&hbcons_io.stream, &hbcons_entry, sizeof(hbcons_entry), &count); - } - opd_stop(); -} - -int node_enable(uint8_t id, bool enable) -{ - int8_t idx = CO_HBconsumer_getIdxByNodeId(CO->HBcons, id); - if (idx < 0) - return -1; - node_state_t *node = &node_state[idx]; - node->enable = enable; - if (enable) { - CO_HBconsumer_initCallbackNmtChanged(CO->HBcons, idx, node, node_change_cb); - } else { - CO_HBconsumer_initCallbackNmtChanged(CO->HBcons, idx, NULL, NULL); - } - if (node->desc->opd_addr) { - return opd_enable(node->desc->opd_addr, enable); - } - return 0; -} - -int node_status(uint8_t id, CO_NMT_internalState_t *state) -{ - int8_t idx = CO_HBconsumer_getIdxByNodeId(CO->HBcons, id); - if (idx < 0) - return -1; - node_state_t *node = &node_state[idx]; - if (state) - *state = node->state; - return node->enable; -} diff --git a/common/node_mgr.mk b/common/node_mgr.mk deleted file mode 100644 index e1183d2a..00000000 --- a/common/node_mgr.mk +++ /dev/null @@ -1,12 +0,0 @@ -# Required libraries for node manager -include $(PROJ_SRC)/opd.mk - -# List of all the node manager files. -NODEMGRSRC := $(PROJ_SRC)/node_mgr.c - -# Required include directories -NODEMGRINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(NODEMGRSRC) -ALLINC += $(NODEMGRINC) diff --git a/common/opd.c b/common/opd.c deleted file mode 100644 index bd0bb753..00000000 --- a/common/opd.c +++ /dev/null @@ -1,312 +0,0 @@ -#include "hal.h" -#include "max7310.h" -#include "opd.h" - -#define OPD_RESET_TIME 250 -#define OPD_I2C_TRIES 3 - -static struct { - MAX7310Driver dev; - MAX7310Config config; - bool valid; -} opd_dev[OPD_MAX_ADDR + 1]; - -static const I2CConfig i2cconfig = { - OPMODE_I2C, - 100000, - STD_DUTY_CYCLE, -}; - -static MAX7310Config defconfig = { - &I2CD1, - &i2cconfig, - 0x00, - OPD_ODR_VAL, - OPD_POL_VAL, - OPD_MODE_VAL, - MAX7310_TIMEOUT_ENABLED -}; - -/** - * OPD Control Functions - */ - -void opd_init(void) -{ - for (i2caddr_t i = MAX7310_MIN_ADDR; i <= MAX7310_MAX_ADDR; i++) { - max7310ObjectInit(&opd_dev[i].dev); - opd_dev[i].config = defconfig; - opd_dev[i].config.saddr = i; - opd_dev[i].valid = false; - } -} - -void opd_start(void) -{ -#ifdef LINE_OPD_ENABLE - /* Enable the subsystem if the device has a control line */ - palClearLine(LINE_OPD_ENABLE); - chThdSleepMilliseconds(600); -#endif /* LINE_OPD_ENABLE */ - - /* Start the I2C driver */ - i2cStart(&I2CD1, &i2cconfig); - /* Probe all devices on the bus */ - opd_scan(true); -} - -void opd_stop(void) -{ - /* Forcefully disable all devices */ - for (i2caddr_t i = MAX7310_MIN_ADDR; i <= MAX7310_MAX_ADDR; i++) { - max7310Stop(&opd_dev[i].dev); - opd_dev[i].valid = false; - } - /* Stop the I2C driver */ - i2cStop(&I2CD1); -#ifdef LINE_OPD_ENABLE - /* Disable the subsystem if the device has a control line */ - palSetLine(LINE_OPD_ENABLE); -#endif /* LINE_OPD_ENABLE */ -} - -void opd_scan(bool restart) -{ - for (i2caddr_t i = MAX7310_MIN_ADDR; i <= MAX7310_MAX_ADDR; i++) { - opd_probe(i, restart); - } -} - -bool opd_probe(i2caddr_t addr, bool restart) -{ - msg_t result; - uint8_t temp; - - /* Probe the device */ - i2cAcquireBus(&I2CD1); - i2cStart(&I2CD1, &i2cconfig); - result = i2cMasterReceiveTimeout(&I2CD1, addr, &temp, 1, TIME_MS2I(10)); - i2cReleaseBus(&I2CD1); - if (result == MSG_OK) { - /* If a device responded, set as valid and (re)start if needed */ - if (opd_dev[addr].valid != true || restart) { - max7310Stop(&opd_dev[addr].dev); - max7310Start(&opd_dev[addr].dev, &opd_dev[addr].config); - } - opd_dev[addr].valid = true; - } else { - /* If no response, ensure address is stopped and set as invalid */ - max7310Stop(&opd_dev[addr].dev); - opd_dev[addr].valid = false; - } - - /* Return the result of the probe */ - return opd_dev[addr].valid; -} - -int opd_enable(i2caddr_t addr, bool enable) -{ - /* Ensure device is valid */ - if (opd_dev[addr].valid != true) { - return -1; - } - - if (enable) { - max7310SetPin(&opd_dev[addr].dev, OPD_EN); - } else { - max7310ClearPin(&opd_dev[addr].dev, OPD_EN); - } - - return 0; -} - -int opd_reset(i2caddr_t addr) -{ - /* Ensure device is valid */ - if (opd_dev[addr].valid != true) { - return -1; - } - - max7310SetPin(&opd_dev[addr].dev, OPD_CB_RESET); - chThdSleepMilliseconds(OPD_RESET_TIME); - max7310ClearPin(&opd_dev[addr].dev, OPD_CB_RESET); - return 0; -} - -int opd_status(i2caddr_t addr, opd_status_t *status) -{ - /* Ensure device is valid */ - if (opd_dev[addr].valid != true) { - return -1; - } - - status->input = max7310ReadRaw(&opd_dev[addr].dev, MAX7310_AD_INPUT); - status->odr = max7310ReadRaw(&opd_dev[addr].dev, MAX7310_AD_ODR); - status->pol = max7310ReadRaw(&opd_dev[addr].dev, MAX7310_AD_POL); - status->mode = max7310ReadRaw(&opd_dev[addr].dev, MAX7310_AD_MODE); - status->timeout = max7310ReadRaw(&opd_dev[addr].dev, MAX7310_AD_TIMEOUT); - return 0; -} - -/** - * I2C over OPD support functions - */ -void opd_i2c_start(MAX7310Driver *devp) -{ - uint8_t reg; - - reg = max7310ReadRaw(devp, MAX7310_AD_MODE); - reg &= ~MAX7310_PIN_MASK(OPD_SDA); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - reg &= ~MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); -} - -void opd_i2c_stop(MAX7310Driver *devp) -{ - uint8_t reg; - - reg = max7310ReadRaw(devp, MAX7310_AD_MODE); - reg &= ~(MAX7310_PIN_MASK(OPD_SCL) | MAX7310_PIN_MASK(OPD_SDA)); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - reg |= MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - reg |= MAX7310_PIN_MASK(OPD_SDA); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); -} - -void opd_i2c_transmit(i2caddr_t addr, uint8_t *txbuf, size_t txsize, uint8_t *rxbuf, size_t rxsize) -{ - MAX7310Driver *devp; - uint8_t tries; - uint8_t reg; - - if (opd_dev[addr].valid != true) - return; - - devp = &opd_dev[addr].dev; - - /* Assert start condition on I2C */ - opd_i2c_start(devp); - - /* Transmit all bytes */ - for (size_t i = 0; i < txsize; i++) { - uint8_t byte = txbuf[i]; - - /* Transmit 8 bits per byte */ - for (int j = 0; j < 8; j++) { - reg = max7310ReadRaw(devp, MAX7310_AD_MODE); - - /* Set SDA based on MSB of byte */ - reg = (reg & ~MAX7310_PIN_MASK(OPD_SDA)) | ((byte & 0x80) ? MAX7310_PIN_MASK(OPD_SDA) : 0); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - - /* Cycle SCL */ - reg |= MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - reg &= ~MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - - /* Shift next bit into MSB */ - byte <<= 1; - } - - /* Wait for ACK after all bits sent */ - tries = OPD_I2C_TRIES; - reg |= MAX7310_PIN_MASK(OPD_SDA); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - reg |= MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - while (!(max7310ReadRaw(devp, MAX7310_AD_INPUT) & MAX7310_PIN_MASK(OPD_SCL))); - while ((max7310ReadRaw(devp, MAX7310_AD_INPUT) & MAX7310_PIN_MASK(OPD_SDA)) && tries) - tries--; - reg &= ~(MAX7310_PIN_MASK(OPD_SCL) | MAX7310_PIN_MASK(OPD_SDA)); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - if (tries == 0) - goto opd_i2c_fail; - } - - for (size_t i = 0; i < rxsize; i++) { - uint8_t byte = 0; - - reg |= MAX7310_PIN_MASK(OPD_SDA); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - for (int j = 0; j < 8; j++) { - /* Cycle SCL while reading pin */ - reg |= MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - byte = ((byte << 1) | (max7310ReadRaw(devp, MAX7310_AD_INPUT) & MAX7310_PIN_MASK(OPD_SDA) ? 1 : 0)); - reg &= ~MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - } - - if (i < rxsize - 1) { - reg &= ~MAX7310_PIN_MASK(OPD_SDA); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - } - reg |= MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - while (!(max7310ReadRaw(devp, MAX7310_AD_INPUT) & MAX7310_PIN_MASK(OPD_SCL))); - reg &= ~MAX7310_PIN_MASK(OPD_SCL); - max7310WriteRaw(devp, MAX7310_AD_MODE, reg); - - rxbuf[i] = byte; - } - -opd_i2c_fail: - opd_i2c_stop(devp); - return; -} - -int opd_boot(i2caddr_t addr) -{ - MAX7310Driver *devp; - uint8_t txbuf[10]; - uint8_t rxbuf[10]; - int retval; - - if (opd_dev[addr].valid != true) - return -1; - devp = &opd_dev[addr].dev; - - max7310ClearPin(devp, OPD_EN); - max7310SetPin(devp, OPD_BOOT0); - max7310SetPin(devp, OPD_EN); - chThdSleepMilliseconds(2); - - txbuf[0] = 0x82U; - txbuf[1] = 0x01U; - txbuf[2] = 0xFEU; - opd_i2c_transmit(addr, txbuf, 3, NULL, 0); - - txbuf[0] = 0x83U; - opd_i2c_transmit(addr, txbuf, 1, rxbuf, 1); - if (rxbuf[0] != 0x79) - return rxbuf[0]; - - opd_i2c_transmit(addr, txbuf, 1, rxbuf, 1); - retval = rxbuf[0]; - - opd_i2c_transmit(addr, txbuf, 1, rxbuf, 1); - if (rxbuf[0] != 0x79) - return rxbuf[0]; - - max7310ClearPin(devp, OPD_BOOT0); - - return retval; -} - -int opd_linux_recover(i2caddr_t addr, bool enable) -{ - if (opd_dev[addr].valid != true) { - return -1; - } - - if (enable) { - max7310ClearPin(&opd_dev[addr].dev, OPD_LINUX_BOOT); - } else { - max7310SetPin(&opd_dev[addr].dev, OPD_LINUX_BOOT); - } - return 0; - -} diff --git a/common/opd.mk b/common/opd.mk deleted file mode 100644 index 315de7b2..00000000 --- a/common/opd.mk +++ /dev/null @@ -1,12 +0,0 @@ -# Required libraries for OPD -include $(PROJ_SRC)/max7310.mk - -# List of all the OPD device files. -OPDSRC := $(PROJ_SRC)/opd.c - -# Required include directories -OPDINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(OPDSRC) -ALLINC += $(OPDINC) diff --git a/common/radio.c b/common/radio.c deleted file mode 100644 index c490c864..00000000 --- a/common/radio.c +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @file radio.c - * @brief OreSat radio support library. - * - * @addtogroup RADIO - * @{ - */ -#include -#include "ch.h" -#include "hal.h" -#include "radio.h" - -/*===========================================================================*/ -/* Local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Local variables and types. */ -/*===========================================================================*/ - -/* Frame buffer allocation pool */ -objects_fifo_t rx_fifo; -static msg_t rx_fifo_msgs[RADIO_FIFO_COUNT]; -static fb_t rx_fifo_buf[RADIO_FIFO_COUNT]; -objects_fifo_t tx_fifo; -static msg_t tx_fifo_msgs[RADIO_FIFO_COUNT]; -static fb_t tx_fifo_buf[RADIO_FIFO_COUNT]; - -/*===========================================================================*/ -/* Local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Interface implementation. */ -/*===========================================================================*/ - -fb_t *__fb_alloc(size_t len, void *arg) { - (void)len; - osalDbgCheck(arg != NULL); - objects_fifo_t *fifo = arg; - fb_t *fb = chFifoTakeObjectTimeout(fifo, TIME_INFINITE); - memset(fb, 0, sizeof(fb_t)); - return fb; -} - -void __fb_free(fb_t *fb, void *arg) { - osalDbgCheck(fb != NULL && arg != NULL); - objects_fifo_t *fifo = arg; - chFifoReturnObject(fifo, fb); -} - -/*===========================================================================*/ -/* Exported functions. */ -/*===========================================================================*/ - -void radio_init(void) -{ - /* Initialize frame buffer FIFO */ - chFifoObjectInit(&rx_fifo, sizeof(fb_t), RADIO_FIFO_COUNT, rx_fifo_buf, rx_fifo_msgs); - chFifoObjectInit(&tx_fifo, sizeof(fb_t), RADIO_FIFO_COUNT, tx_fifo_buf, tx_fifo_msgs); - - /* Initialize radio systems */ - for (int i = 0; radio_devices[i].devp != NULL; i++) { - ax5043ObjectInit(radio_devices[i].devp); - } - for (int i = 0; synth_devices[i].devp != NULL; i++) { - si41xxObjectInit(synth_devices[i].devp); - } -} - -void radio_start(void) -{ - /* Start radio systems */ - for (int i = 0; radio_devices[i].devp != NULL; i++) { - ax5043Start(radio_devices[i].devp, radio_devices[i].cfgp); - } - for (int i = 0; synth_devices[i].devp != NULL; i++) { - si41xxStart(synth_devices[i].devp, synth_devices[i].cfgp); - } -} - -void radio_stop(void) -{ - for (int i = 0; radio_devices[i].devp != NULL; i++) { - ax5043Stop(radio_devices[i].devp); - } - for (int i = 0; synth_devices[i].devp != NULL; i++) { - si41xxStop(synth_devices[i].devp); - } -} - -void pdu_send(fb_t *fb, void *arg) -{ - osalDbgCheck(fb != NULL && arg != NULL); - objects_fifo_t *fifo = arg; - chFifoSendObject(fifo, fb); -} - -void pdu_send_ahead(fb_t *fb, void *arg) -{ - osalDbgCheck(fb != NULL && arg != NULL); - objects_fifo_t *fifo = arg; - chFifoSendObjectAhead(fifo, fb); -} - -fb_t *pdu_recv(void *arg) -{ - osalDbgCheck(arg != NULL); - fb_t *fb; - objects_fifo_t *fifo = arg; - if (chFifoReceiveObjectTimeout(fifo, (void**)&fb, TIME_MS2I(1000)) != MSG_OK) { - fb = NULL; - } - return fb; -} - -/** @} */ diff --git a/common/radio.mk b/common/radio.mk deleted file mode 100644 index bacf1d45..00000000 --- a/common/radio.mk +++ /dev/null @@ -1,17 +0,0 @@ -CCSDS_ROOT = $(PROJ_ROOT)/ext/OpenCCSDS - -# Required libraries for RADIO -include $(CCSDS_ROOT)/ccsds.mk -include $(PROJ_SRC)/si41xx.mk -include $(PROJ_SRC)/ax5043.mk -include $(PROJ_SRC)/aprs.mk - -# List of all the RADIO device files. -RADIOSRC := $(PROJ_SRC)/radio.c \ - -# Required include directories -RADIOINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(RADIOSRC) $(CCSDS_SRC) -ALLINC += $(RADIOINC) $(CCSDS_INC) diff --git a/common/rtc.c b/common/rtc.c deleted file mode 100644 index 58a93a5d..00000000 --- a/common/rtc.c +++ /dev/null @@ -1,291 +0,0 @@ -#include "rtc.h" - -/** - * @brief Convert @p RTCDateTime to Unix time. - * - * @param[in] timespec Pointer to a @p RTCDateTime structure - * @param[out] msec Pointer to milliseconds value or @p NULL - * - * @return Unix time - * @api - */ -time_t rtcConvertDateTimeToUnix(const RTCDateTime *timespec, uint32_t *msec) -{ - osalDbgCheck(timespec != NULL); - struct tm tim; - - rtcConvertDateTimeToStructTm(timespec, &tim, msec); - return mktime(&tim); -} - -/** - * @brief Convert Unix time to @p RTCDateTime. - * - * @param[out] timespec Pointer to a @p RTCDateTime structure - * @param[in] unix_time Unix time value - * @param[in] msec Milliseconds value - * - * @api - */ -void rtcConvertUnixToDateTime(RTCDateTime *timespec, time_t unix_time, uint32_t msec) -{ - osalDbgCheck(timespec != NULL); - struct tm tim; - struct tm *canary; - - canary = gmtime_r(&unix_time, &tim); - osalDbgCheck(&tim == canary); - - rtcConvertStructTmToDateTime(&tim, msec, timespec); - return; -} - -/** - * @brief Get time as struct tm - * - * @param[out] tim Pointer to struct tm to fill - * @param[out] msec Pointer to millisecond variable - * - * @api - */ -void rtcGetTimeTm(struct tm *tim, uint32_t *msec) -{ - osalDbgCheck(tim != NULL); - RTCDateTime timespec; - - rtcGetTime(&RTCD1, ×pec); - rtcConvertDateTimeToStructTm(×pec, tim, msec); -} - -/** - * @brief Set time from struct tm - * - * @param[in] tim Pointer to struct tm to use - * @param[in] msec Milliseconds value - * - * @api - */ -void rtcSetTimeTm(const struct tm *tim, uint32_t msec) -{ - osalDbgCheck(tim != NULL); - RTCDateTime timespec; - - rtcConvertStructTmToDateTime(tim, msec, ×pec); - rtcSetTime(&RTCD1, ×pec); -} - -/** - * @brief Get time as Unix time_t - * - * @param[out] msec Pointer to millisecond variable - * - * @return Current time as time_t - * @api - */ -time_t rtcGetTimeUnix(uint32_t *msec) -{ - struct tm tim; - - rtcGetTimeTm(&tim, msec); - - return mktime(&tim); -} - -/** - * @brief Set time from Unix time_t - * - * @param[in] unix_time Unix time to set RTC to - * @param[in] msec Milliseconds value - * - * @api - */ -void rtcSetTimeUnix(time_t unix_time, uint32_t msec) -{ - struct tm tim; - struct tm *canary; - - canary = gmtime_r(&unix_time, &tim); - osalDbgCheck(&tim == canary); - - rtcSetTimeTm(&tim, msec); -} - -/** - * @brief Get time as CCSDS SCET object - * - * @param[out] scet Pointer to SCET struct - * - * @api - */ -void rtcGetTimeSCET(time_scet_t *scet) -{ - osalDbgCheck(scet != NULL); - uint32_t fine; - scet->coarse = rtcGetTimeUnix(&fine); - scet->fine = fine & 0xFFFFFFU; -} - -/** - * @brief Set time from CCSDS SCET object - * - * @param[in] scet Pointer to SCET struct - * - * @api - */ -void rtcSetTimeSCET(const time_scet_t *scet) -{ - osalDbgCheck(scet != NULL); - rtcSetTimeUnix(scet->coarse, scet->fine); -} - -/** - * @brief Get time as CCSDS UTC object - * - * @param[out] scet Pointer to UTC struct - * - * @api - */ -void rtcGetTimeUTC(time_utc_t *utc) -{ - osalDbgCheck(utc != NULL); - RTCDateTime timespec; - struct tm tim; - - rtcGetTime(&RTCD1, ×pec); - rtcConvertDateTimeToStructTm(×pec, &tim, NULL); - mktime(&tim); - - utc->day = (tim.tm_year - 70) * 365 + tim.tm_yday; - utc->ms = timespec.millisecond; - utc->us = 0; -} - -/** - * @brief Set time from CCSDS UTC object - * - * @param[in] scet Pointer to UTC struct - * - * @api - */ -void rtcSetTimeUTC(const time_utc_t *utc) -{ - osalDbgCheck(utc != NULL); - /* TODO: Implement */ - (void)utc; -} - -/** - * @brief Converts time from timespec to ALRMxR register encoding - * - * @param[in] timespec Pointer to a @p RTCDateTime structure - * @param[in] flags Configuration flags - * - * @return The ALRMxR register encoding. - * @api - */ -uint32_t rtcEncodeAlarm(const RTCDateTime *timespec, uint32_t flags) -{ - osalDbgCheck(timespec != NULL); - uint32_t n, alrmr = 0; - - /* Subseconds cannot be set.*/ - n = timespec->millisecond / 1000; - - /* Seconds conversion.*/ - if ((flags & RTC_SEC_MASK) == 0) { - alrmr |= ((n % 10) << RTC_ALRMAR_SU_Pos); - n /= 10; - alrmr |= ((n % 6) << RTC_ALRMAR_ST_Pos); - n /= 6; - } - - /* Minutes conversion.*/ - if ((flags & RTC_MIN_MASK) == 0) { - alrmr |= ((n % 10) << RTC_ALRMAR_MNU_Pos); - n /= 10; - alrmr |= ((n % 6) << RTC_ALRMAR_MNT_Pos); - n /= 6; - } - - /* Hours conversion.*/ - if ((flags & RTC_HOUR_MASK) == 0) { - alrmr |= ((n % 10) << RTC_ALRMAR_HU_Pos); - n /= 10; - alrmr |= (n << RTC_ALRMAR_HT_Pos); - } - - /* Days conversion.*/ - if ((flags & RTC_DATE_MASK) == 0) { - if (flags & RTC_WEEKDAY_SEL) { - n = timespec->dayofweek; - alrmr |= (n << RTC_ALRMAR_DU_Pos); - } else { - n = timespec->day; - alrmr |= ((n % 10) << RTC_ALRMAR_DU_Pos); - n /= 10; - alrmr |= ((n % 10) << RTC_ALRMAR_DT_Pos); - } - } - - /* Set flags */ - alrmr |= flags; - - return alrmr; -} - -/** - * @brief Generates ALRMxR register value for time relative to timespec - * - * @param[in] timespec Pointer to a @p RTCDateTime structure - * @param[in] days Days to elapse - * @param[in] hours Hours to elapse - * @param[in] minutes Minutes to elapse - * @param[in] seconds Seconds to elapse - * - * @return The ALRMxR register encoding. - * @api - */ -uint32_t rtcEncodeRelAlarm(const RTCDateTime *timespec, int days, int hours, int minutes, int seconds) -{ - RTCDateTime alarm_timespec; - struct tm tim; - - /* Get current time */ - rtcConvertDateTimeToStructTm(timespec, &tim, NULL); - /* Add offsets for desired elapsed time */ - tim.tm_yday += days; - tim.tm_hour += hours; - tim.tm_min += minutes; - tim.tm_sec += seconds; - /* Recalculate struct tm and convert to timespec */ - mktime(&tim); - rtcConvertStructTmToDateTime(&tim, 0, &alarm_timespec); - /* Return the encoded alarm value */ - return rtcEncodeAlarm(&alarm_timespec, 0); -} - -/* TODO: Move these out of RTC probably */ -/* TODO: Re-implement these using new OD interface */ -/* -CO_SDO_abortCode_t OD_SCET_Func(CO_ODF_arg_t *ODF_arg) -{ - if (ODF_arg->reading) { - rtcGetTimeSCET((time_scet_t*)ODF_arg->data); - } else { - rtcSetTimeSCET((time_scet_t*)ODF_arg->data); - } - - return CO_SDO_AB_NONE; -} - -CO_SDO_abortCode_t OD_UTC_Func(CO_ODF_arg_t *ODF_arg) -{ - if (ODF_arg->reading) { - rtcGetTimeUTC((time_utc_t*)ODF_arg->data); - } else { - rtcSetTimeUTC((time_utc_t*)ODF_arg->data); - } - - return CO_SDO_AB_NONE; -} -*/ diff --git a/common/rtc.mk b/common/rtc.mk deleted file mode 100644 index 9a983b8f..00000000 --- a/common/rtc.mk +++ /dev/null @@ -1,12 +0,0 @@ -# Required libraries for RTC and time management -#include $(PROJ_SRC)/library.mk - -# List of all the time subsystem source files -RTCSRC := $(PROJ_SRC)/rtc.c - -# Required include directories -RTCINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(RTCSRC) -ALLINC += $(RTCINC) diff --git a/common/si41xx.c b/common/si41xx.c deleted file mode 100644 index 48080d53..00000000 --- a/common/si41xx.c +++ /dev/null @@ -1,482 +0,0 @@ -/** - * @file si41xx.c - * @brief SI41XX Radio. - * - * @addtogroup SI41XX - * @ingrup ORESAT - * @{ - */ - -#include "hal.h" -#include "si41xx.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/** - * @name SI41XX SERIAL Word fields - * @{ - */ -#define SI41XX_ADDRESS_Pos (0U) -#define SI41XX_ADDRESS_Msk (0xFU << SI41XX_ADDRESS_Pos) -#define SI41XX_ADDRESS SI41XX_ADDRESS_Msk -#define SI41XX_DATA_Pos (4U) -#define SI41XX_DATA_Msk (0x3FFFFU << SI41XX_DATA_Pos) -#define SI41XX_DATA SI41XX_DATA_Msk -#define SI41XX_MSB_Pos (21U) -#define SI41XX_MSB_Msk (0x1U << SI41XX_MSB_Pos) -#define SI41XX_MSB SI41XX_MSB_Msk -#define SI41XX_WORD_Pos (0U) -#define SI41XX_WORD_Msk (0x3FFFFFU << SI41XX_WORD_Pos) -#define SI41XX_WORD SI41XX_WORD_Msk -/** @} */ - -/** - * @name Maximum phase detector frequency - * @{ - */ -#define SI41XX_MAX_PHASEDET (1000000U) -#define SI41XX_MIN_PHASEDET (10000U) -/** @} */ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -#if (SI41XX_USE_SERIAL) || defined(__DOXYGEN__) -/** - * @brief Writes to an SI41xx device using its serial interface. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * @param[in] addr Register address - * @param[in] data Data to write to register - * - * @notapi - */ -void si41xxWriteRegister(SI41XXDriver *devp, uint8_t addr, uint32_t data) { - uint32_t i = 22; - uint32_t word = _VAL2FLD(SI41XX_ADDRESS, addr) - | _VAL2FLD(SI41XX_DATA, data); - - osalDbgCheck((devp != NULL) && (devp->config != NULL)); - - palClearLine(devp->config->sen); - - while (i--) { - palClearLine(devp->config->sclk); - - palWriteLine(devp->config->sdata, (word & SI41XX_MSB ? PAL_HIGH : PAL_LOW)); - palSetLine(devp->config->sclk); - word <<= 1; - } - - palClearLine(devp->config->sclk); - palSetLine(devp->config->sen); - palSetLine(devp->config->sclk); -} - -#if (SI41XX_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -/** - * @brief Gains exclusive access to the SI41XX bus. - * @details This function tries to gain ownership to the SI41XX bus, if the bus - * is already being used then the invoking thread is queued. - * @pre In order to use this function the option @p SI41XX_USE_MUTUAL_EXCLUSION - * must be enabled. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * - * @notapi - */ -void si41xxAcquireBus(SI41XXDriver *devp) { - osalDbgCheck(devp != NULL); - - osalMutexLock(&devp->mutex); -} - -/** - * @brief Releases exclusive access to the SI41XX bus. - * @pre In order to use this function the option @p SI41XX_USE_MUTUAL_EXCLUSION - * must be enabled. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * - * @notapi - */ -void si41xxReleaseBus(SI41XXDriver *devp) { - osalDbgCheck(devp != NULL); - - osalMutexUnlock(&devp->mutex); -} -#endif /* SI41XX_USE_MUTUAL_EXCLUSION */ -#endif /* SI41XX_USE_SERIAL */ - -/** - * @brief Calculates N-Div and R-Div values. - * @details This function calculates N and R division values needed to provided - * the specified frequency from the reference frequency defined in the - * device configuration. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * @param[in] freq Desired output frequency - * @param[out] ndiv Calculated N-Divider value - * @param[out] rdiv Calculated R-Divider value - * - * @return Successfully found values within phase detector frequency bounds - * @notapi - */ -bool si41xxCalcDiv(SI41XXDriver *devp, uint32_t freq, uint32_t *ndiv, uint32_t *rdiv) { - osalDbgCheck(devp != NULL && devp->config != NULL && ndiv != NULL && rdiv != NULL); - osalDbgAssert(devp->config->ref_freq != 0 && freq != 0, - "si41xxCalcDiv(), non-zero values required"); - - uint32_t ref_freq = devp->config->ref_freq; - uint32_t phasedet = ref_freq, gcd = freq; - - /* Find GCD of both frequencies */ - while (phasedet != gcd) { - if (phasedet > gcd) { - phasedet -= gcd; - } else { - gcd -= phasedet; - } - } - - /* Divide until frequency is less than the maximum */ - while (phasedet >= SI41XX_MAX_PHASEDET) { - phasedet /= 2; - } - if (phasedet < SI41XX_MIN_PHASEDET) { - return false; - } - - /* Calculate needed N and R values */ - *ndiv = freq / phasedet; - *rdiv = ref_freq / phasedet; - return true; -} - -/*==========================================================================*/ -/* Interface implementation. */ -/*==========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes an instance. - * - * @param[out] devp Pointer to the @p SI41XXDriver object - * - * @init - */ -void si41xxObjectInit(SI41XXDriver *devp) { - devp->config = NULL; - -#if SI41XX_USE_MUTUAL_EXCLUSION - osalMutexObjectInit(&devp->mutex); -#endif - - devp->state = SI41XX_STOP; -} - -/** - * @brief Configures and activates SI41XX Driver peripheral. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * @param[in] config Pointer to the @p SI41XXConfig object - * - * @api - */ -void si41xxStart(SI41XXDriver *devp, SI41XXConfig *config) { - osalDbgCheck((devp != NULL) && (config != NULL)); - osalDbgAssert((devp->state == SI41XX_STOP) || (devp->state == SI41XX_READY), - "si41xxStart(), invalid state"); - - devp->config = config; - devp->pwr = 0; - -#if SI41XX_USE_SERIAL -#if SI41XX_SHARED_SERIAL - si41xxAcquireBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ - - si41xxWriteRegister(devp, SI41XX_REG_CONFIG, SI41XX_CONFIG_AUTOKP | - _VAL2FLD(SI41XX_CONFIG_AUXSEL, SI41XX_AUXSEL_LOCKDET) | - _VAL2FLD(SI41XX_CONFIG_IFDIV, config->if_div)); - si41xxWriteRegister(devp, SI41XX_REG_PHASE_GAIN, 0x00000U); - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); -#if SI41XX_HAS_IF - devp->pwr |= SI41XX_POWERDOWN_PBIB; - si41xxWriteRegister(devp, SI41XX_REG_IF_NDIV, _VAL2FLD(SI41XX_IF_NDIV, devp->config->if_n)); - si41xxWriteRegister(devp, SI41XX_REG_IF_RDIV, _VAL2FLD(SI41XX_IF_RDIV, devp->config->if_r)); -#endif -#if SI41XX_HAS_RF1 - devp->pwr |= SI41XX_POWERDOWN_PBRB; - si41xxWriteRegister(devp, SI41XX_REG_RF1_NDIV, _VAL2FLD(SI41XX_RF1_NDIV, devp->config->rf1_n)); - si41xxWriteRegister(devp, SI41XX_REG_RF1_RDIV, _VAL2FLD(SI41XX_RF1_RDIV, devp->config->rf1_r)); -#endif -#if SI41XX_HAS_RF2 - devp->pwr |= SI41XX_POWERDOWN_PBRB; - si41xxWriteRegister(devp, SI41XX_REG_RF2_NDIV, _VAL2FLD(SI41XX_RF2_NDIV, devp->config->rf2_n)); - si41xxWriteRegister(devp, SI41XX_REG_RF2_RDIV, _VAL2FLD(SI41XX_RF2_RDIV, devp->config->rf2_r)); -#endif - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); - -#if SI41XX_SHARED_SERIAL - si41xxReleaseBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ -#endif /* SI41XX_USE_SERIAL */ - devp->state = SI41XX_READY; -} - -/** - * @brief Deactivates the SI41XX Complex Driver peripheral. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * - * @api - */ -void si41xxStop(SI41XXDriver *devp) { - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == SI41XX_STOP) || (devp->state == SI41XX_READY), - "si41xxStop(), invalid state"); - - devp->pwr = 0U; - -#if SI41XX_USE_SERIAL -#if SI41XX_SHARED_SERIAL - si41xxAcquireBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ - - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); - si41xxWriteRegister(devp, SI41XX_REG_CONFIG, 0x00000U); - -#if SI41XX_SHARED_SERIAL - si41xxReleaseBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ -#endif /* SI41XX_USE_SERIAL */ - devp->state = SI41XX_STOP; -} - -/** - * @brief Writes a raw value to an SI41XX register. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * @param[in] reg The register to write to - * @param[in] value The value to write - * - * @api - */ -void si41xxWriteRaw(SI41XXDriver *devp, uint8_t reg, uint32_t value) { - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == SI41XX_STOP) || (devp->state == SI41XX_READY), - "si41xxWriteRaw(), invalid state"); - -#if SI41XX_USE_SERIAL -#if SI41XX_SHARED_SERIAL - si41xxAcquireBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ - - si41xxWriteRegister(devp, reg, value); - -#if SI41XX_SHARED_SERIAL - si41xxReleaseBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ -#endif /* SI41XX_USE_SERIAL */ -} - -#if (SI41XX_HAS_IF) || defined(__DOXYGEN__) -/** - * @brief Sets IF N and R values to provide the desired frequency. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * @param[in] freq The desired frequency - * - * @return Successfully set frequency - * @api - */ -bool si41xxSetIF(SI41XXDriver *devp, uint32_t freq) { - uint32_t n, r; - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == SI41XX_READY), - "si41xxSetIF(), invalid state"); - - /* Calculate N and R values */ - if (!si41xxCalcDiv(devp, freq << devp->config->if_div, &n, &r)) { - return false; - } - - /* Check that values are within bounds of programmable values */ - if (n >= (SI41XX_IF_NDIV + 1) || r >= (SI41XX_IF_RDIV + 1)) { - return false; - } - devp->config->if_n = n; - devp->config->if_r = r; - -#if SI41XX_USE_SERIAL -#if SI41XX_SHARED_SERIAL - si41xxAcquireBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ - - devp->pwr &= ~SI41XX_POWERDOWN_PBIB; - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); - si41xxWriteRegister(devp, SI41XX_REG_IF_NDIV, _VAL2FLD(SI41XX_IF_NDIV, n)); - si41xxWriteRegister(devp, SI41XX_REG_IF_RDIV, _VAL2FLD(SI41XX_IF_RDIV, r)); - devp->pwr |= SI41XX_POWERDOWN_PBIB; - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); - -#if SI41XX_SHARED_SERIAL - si41xxReleaseBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ -#endif /* SI41XX_USE_SERIAL */ - return true; -} - -/** - * @brief Sets IF divider value. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * @param[in] div The divisor value (1,2,4,8) - * - * @return Successfully set divisor - * @api - */ -bool si41xxSetIFDiv(SI41XXDriver *devp, uint8_t div) { - uint8_t i; - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == SI41XX_READY), - "si41xxSetIFDiv(), invalid state"); - - /* Check that values are within bounds of programmable values */ - if (!((div != 0) && ((div & (div - 1)) == 0))) { - /* Not a power of 2 */ - return false; - } - for (i = 0; i < 4 && (div & 0xEU); i++, div >>= 1); - if (i == 4) { - return false; - } - devp->config->if_div = i; - -#if SI41XX_USE_SERIAL -#if SI41XX_SHARED_SERIAL - si41xxAcquireBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ - - si41xxWriteRegister(devp, SI41XX_REG_CONFIG, _VAL2FLD(SI41XX_CONFIG_IFDIV, i)); - -#if SI41XX_SHARED_SERIAL - si41xxReleaseBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ -#endif /* SI41XX_USE_SERIAL */ - return true; -} -#endif /* SI41XX_HAS_IF */ - -#if (SI41XX_HAS_RF1) || defined(__DOXYGEN__) -/** - * @brief Sets RF1 dividers to provide the desired frequency. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * @param[in] freq The desired frequency - * - * @return Successfully set frequency - * @api - */ -bool si41xxSetRF1(SI41XXDriver *devp, uint32_t freq) { - uint32_t n, r; - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == SI41XX_READY), - "si41xxSetRF1(), invalid state"); - - /* Calculate N and R values */ - if (!si41xxCalcDiv(devp, freq, &n, &r)) { - return false; - } - - /* Check that values are within bounds of programmable values */ - if (n >= (SI41XX_RF1_NDIV + 1) || r >= (SI41XX_RF1_RDIV + 1)) { - return false; - } - devp->config->rf1_n = n; - devp->config->rf1_r = r; - -#if SI41XX_USE_SERIAL -#if SI41XX_SHARED_SERIAL - si41xxAcquireBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ - - devp->pwr &= ~SI41XX_POWERDOWN_PBRB; - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); - si41xxWriteRegister(devp, SI41XX_REG_RF1_NDIV, _VAL2FLD(SI41XX_RF1_NDIV, n)); - si41xxWriteRegister(devp, SI41XX_REG_RF1_RDIV, _VAL2FLD(SI41XX_RF1_RDIV, r)); - devp->pwr |= SI41XX_POWERDOWN_PBRB; - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); - -#if SI41XX_SHARED_SERIAL - si41xxReleaseBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ -#endif /* SI41XX_USE_SERIAL */ - return true; -} -#endif /* SI41XX_HAS_RF1 */ - -#if (SI41XX_HAS_RF2) || defined(__DOXYGEN__) -/** - * @brief Sets RF2 dividers to provide the desired frequency. - * - * @param[in] devp Pointer to the @p SI41XXDriver object - * @param[in] freq The desired frequency - * - * @return Successfully set frequency - * @api - */ -bool si41xxSetRF2(SI41XXDriver *devp, uint32_t freq) { - uint32_t n, r; - osalDbgCheck(devp != NULL); - osalDbgAssert((devp->state == SI41XX_READY), - "si41xxSetRF2(), invalid state"); - - /* Calculate N and R values */ - if (!si41xxCalcDiv(devp, freq, &n, &r)) { - return false; - } - - /* Check that values are within bounds of programmable values */ - if (n >= (SI41XX_RF2_NDIV + 1) || r >= (SI41XX_RF2_RDIV + 1)) { - return false; - } - devp->config->rf2_n = n; - devp->config->rf2_r = r; - -#if SI41XX_USE_SERIAL -#if SI41XX_SHARED_SERIAL - si41xxAcquireBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ - - devp->pwr &= ~SI41XX_POWERDOWN_PBRB; - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); - si41xxWriteRegister(devp, SI41XX_REG_RF2_NDIV, _VAL2FLD(SI41XX_RF2_NDIV, n)); - si41xxWriteRegister(devp, SI41XX_REG_RF2_RDIV, _VAL2FLD(SI41XX_RF2_RDIV, r)); - devp->pwr |= SI41XX_POWERDOWN_PBRB; - si41xxWriteRegister(devp, SI41XX_REG_PWRDOWN, devp->pwr); - -#if SI41XX_SHARED_SERIAL - si41xxReleaseBus(devp); -#endif /* SI41XX_SHARED_SERIAL */ -#endif /* SI41XX_USE_SERIAL */ - return true; -} -#endif /* SI41XX_HAS_RF2 */ - -/** @} */ diff --git a/common/si41xx.mk b/common/si41xx.mk deleted file mode 100644 index 5d42eba0..00000000 --- a/common/si41xx.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the SI41XX device files. -SI41XXSRC := $(PROJ_SRC)/si41xx.c - -# Required include directories -SI41XXINC := $(PROJ_SRC)/include - -# Shared variables -ALLCSRC += $(SI41XXSRC) -ALLINC += $(SI41XXINC) diff --git a/ext/OpenCCSDS b/ext/OpenCCSDS deleted file mode 160000 index 87cae72e..00000000 --- a/ext/OpenCCSDS +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 87cae72ec21cc553bdd19666fdf55cace6b95c4b diff --git a/ext/littlefs b/ext/littlefs deleted file mode 160000 index 1863dc78..00000000 --- a/ext/littlefs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1863dc7883d82bd6ca79faa164b65341064d1c16 diff --git a/ld/STM32F439xI.ld b/ld/STM32F439xI.ld deleted file mode 100644 index 6cbb2a16..00000000 --- a/ld/STM32F439xI.ld +++ /dev/null @@ -1,86 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * ST32F429xI memory setup. - * Note: Use of ram1, ram2 and ram3 is mutually exclusive with use of ram0. - */ -MEMORY -{ - flash0 (rx) : org = 0x08000000, len = 1M - flash1 (rx) : org = 0x08100000, len = 1M - flash2 (rx) : org = 0x00000000, len = 0 - flash3 (rx) : org = 0x00000000, len = 0 - flash4 (rx) : org = 0x00000000, len = 0 - flash5 (rx) : org = 0x00000000, len = 0 - flash6 (rx) : org = 0x00000000, len = 0 - flash7 (rx) : org = 0x00000000, len = 0 - ram0 (wx) : org = 0x20000000, len = 192k /* SRAM1 + SRAM2 + SRAM3 */ - ram1 (wx) : org = 0x20000000, len = 112k /* SRAM1 */ - ram2 (wx) : org = 0x2001C000, len = 16k /* SRAM2 */ - ram3 (wx) : org = 0x20020000, len = 64k /* SRAM3 */ - ram4 (wx) : org = 0x10000000, len = 64k /* CCM SRAM */ - ram5 (wx) : org = 0x40024000, len = 4k /* BCKP SRAM */ - ram6 (wx) : org = 0x00000000, len = 0 - ram7 (wx) : org = 0x00000000, len = 0 -} - -/* For each data/text section two region are defined, a virtual region - and a load region (_LMA suffix).*/ - -/* Flash region to be used for exception vectors.*/ -REGION_ALIAS("VECTORS_FLASH", flash0); -REGION_ALIAS("VECTORS_FLASH_LMA", flash0); - -/* Flash region to be used for constructors and destructors.*/ -REGION_ALIAS("XTORS_FLASH", flash0); -REGION_ALIAS("XTORS_FLASH_LMA", flash0); - -/* Flash region to be used for code text.*/ -REGION_ALIAS("TEXT_FLASH", flash0); -REGION_ALIAS("TEXT_FLASH_LMA", flash0); - -/* Flash region to be used for read only data.*/ -REGION_ALIAS("RODATA_FLASH", flash0); -REGION_ALIAS("RODATA_FLASH_LMA", flash0); - -/* Flash region to be used for various.*/ -REGION_ALIAS("VARIOUS_FLASH", flash0); -REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); - -/* Flash region to be used for RAM(n) initialization data.*/ -REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); - -/* RAM region to be used for Main stack. This stack accommodates the processing - of all exceptions and interrupts.*/ -REGION_ALIAS("MAIN_STACK_RAM", ram0); - -/* RAM region to be used for the process stack. This is the stack used by - the main() function.*/ -REGION_ALIAS("PROCESS_STACK_RAM", ram0); - -/* RAM region to be used for data segment.*/ -REGION_ALIAS("DATA_RAM", ram0); -REGION_ALIAS("DATA_RAM_LMA", flash0); - -/* RAM region to be used for BSS segment.*/ -REGION_ALIAS("BSS_RAM", ram0); - -/* RAM region to be used for the default heap.*/ -REGION_ALIAS("HEAP_RAM", ram0); - -/* Generic rules inclusion.*/ -INCLUDE rules.ld diff --git a/ld/STM32F446xE.ld b/ld/STM32F446xE.ld deleted file mode 100644 index de7d56ce..00000000 --- a/ld/STM32F446xE.ld +++ /dev/null @@ -1,86 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * ST32F446xE memory setup. - * Note: Use of ram1 and ram2 is mutually exclusive with use of ram0. - */ -MEMORY -{ - flash0 (rx) : org = 0x08000000, len = 512k - flash1 (rx) : org = 0x00000000, len = 0 - flash2 (rx) : org = 0x00000000, len = 0 - flash3 (rx) : org = 0x00000000, len = 0 - flash4 (rx) : org = 0x00000000, len = 0 - flash5 (rx) : org = 0x00000000, len = 0 - flash6 (rx) : org = 0x00000000, len = 0 - flash7 (rx) : org = 0x00000000, len = 0 - ram0 (wx) : org = 0x20000000, len = 128k /* SRAM1 + SRAM2 */ - ram1 (wx) : org = 0x20000000, len = 112k /* SRAM1 */ - ram2 (wx) : org = 0x00000000, len = 16k /* SRAM2 */ - ram3 (wx) : org = 0x00000000, len = 0 - ram4 (wx) : org = 0x00000000, len = 0 - ram5 (wx) : org = 0x00000000, len = 0 - ram6 (wx) : org = 0x00000000, len = 0 - ram7 (wx) : org = 0x00000000, len = 0 -} - -/* For each data/text section two region are defined, a virtual region - and a load region (_LMA suffix).*/ - -/* Flash region to be used for exception vectors.*/ -REGION_ALIAS("VECTORS_FLASH", flash0); -REGION_ALIAS("VECTORS_FLASH_LMA", flash0); - -/* Flash region to be used for constructors and destructors.*/ -REGION_ALIAS("XTORS_FLASH", flash0); -REGION_ALIAS("XTORS_FLASH_LMA", flash0); - -/* Flash region to be used for code text.*/ -REGION_ALIAS("TEXT_FLASH", flash0); -REGION_ALIAS("TEXT_FLASH_LMA", flash0); - -/* Flash region to be used for read only data.*/ -REGION_ALIAS("RODATA_FLASH", flash0); -REGION_ALIAS("RODATA_FLASH_LMA", flash0); - -/* Flash region to be used for various.*/ -REGION_ALIAS("VARIOUS_FLASH", flash0); -REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); - -/* Flash region to be used for RAM(n) initialization data.*/ -REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); - -/* RAM region to be used for Main stack. This stack accommodates the processing - of all exceptions and interrupts.*/ -REGION_ALIAS("MAIN_STACK_RAM", ram0); - -/* RAM region to be used for the process stack. This is the stack used by - the main() function.*/ -REGION_ALIAS("PROCESS_STACK_RAM", ram0); - -/* RAM region to be used for data segment.*/ -REGION_ALIAS("DATA_RAM", ram0); -REGION_ALIAS("DATA_RAM_LMA", flash0); - -/* RAM region to be used for BSS segment.*/ -REGION_ALIAS("BSS_RAM", ram0); - -/* RAM region to be used for the default heap.*/ -REGION_ALIAS("HEAP_RAM", ram0); - -/* Generic rules inclusion.*/ -INCLUDE rules.ld diff --git a/ld/STM32L452xE.ld b/ld/STM32L452xE.ld deleted file mode 100644 index e97963bd..00000000 --- a/ld/STM32L452xE.ld +++ /dev/null @@ -1,85 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L452xE memory setup. - */ -MEMORY -{ - flash0 (rx) : org = 0x08000000, len = 256k - flash1 (rx) : org = 0x08040000, len = 256k - flash2 (rx) : org = 0x00000000, len = 0 - flash3 (rx) : org = 0x00000000, len = 0 - flash4 (rx) : org = 0x00000000, len = 0 - flash5 (rx) : org = 0x00000000, len = 0 - flash6 (rx) : org = 0x00000000, len = 0 - flash7 (rx) : org = 0x00000000, len = 0 - ram0 (wx) : org = 0x20000000, len = 128k - ram1 (wx) : org = 0x00000000, len = 0 - ram2 (wx) : org = 0x00000000, len = 0 - ram3 (wx) : org = 0x00000000, len = 0 - ram4 (wx) : org = 0x10000000, len = 32k /* This memory also mapped at address 0x20020000 */ - ram5 (wx) : org = 0x00000000, len = 0 - ram6 (wx) : org = 0x00000000, len = 0 - ram7 (wx) : org = 0x00000000, len = 0 -} - -/* For each data/text section two region are defined, a virtual region - and a load region (_LMA suffix).*/ - -/* Flash region to be used for exception vectors.*/ -REGION_ALIAS("VECTORS_FLASH", flash0); -REGION_ALIAS("VECTORS_FLASH_LMA", flash0); - -/* Flash region to be used for constructors and destructors.*/ -REGION_ALIAS("XTORS_FLASH", flash0); -REGION_ALIAS("XTORS_FLASH_LMA", flash0); - -/* Flash region to be used for code text.*/ -REGION_ALIAS("TEXT_FLASH", flash0); -REGION_ALIAS("TEXT_FLASH_LMA", flash0); - -/* Flash region to be used for read only data.*/ -REGION_ALIAS("RODATA_FLASH", flash0); -REGION_ALIAS("RODATA_FLASH_LMA", flash0); - -/* Flash region to be used for various.*/ -REGION_ALIAS("VARIOUS_FLASH", flash0); -REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); - -/* Flash region to be used for RAM(n) initialization data.*/ -REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); - -/* RAM region to be used for Main stack. This stack accommodates the processing - of all exceptions and interrupts.*/ -REGION_ALIAS("MAIN_STACK_RAM", ram0); - -/* RAM region to be used for the process stack. This is the stack used by - the main() function.*/ -REGION_ALIAS("PROCESS_STACK_RAM", ram0); - -/* RAM region to be used for data segment.*/ -REGION_ALIAS("DATA_RAM", ram0); -REGION_ALIAS("DATA_RAM_LMA", flash0); - -/* RAM region to be used for BSS segment.*/ -REGION_ALIAS("BSS_RAM", ram0); - -/* RAM region to be used for the default heap.*/ -REGION_ALIAS("HEAP_RAM", ram0); - -/* Generic rules inclusion.*/ -INCLUDE rules.ld diff --git a/profiles/oresat_battery.xpd b/profiles/oresat_battery.xpd deleted file mode 100644 index 7a354c53..00000000 --- a/profiles/oresat_battery.xpd +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - CANopen device profile - 1.1 - - - Device - - 1 - 1 - CANopen - - - - - Portland State Aerospace Society - 0 - OreSat Battery - 0 - - OreSat Battery Application Object Dictionary - - 0 - 0 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CANopen communication network profile - 1.1 - - - CommunicationNetwork - - 1 - 1 - CANopen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/profiles/oresat_node.xpd b/profiles/oresat_node.xpd deleted file mode 100644 index 45144c32..00000000 --- a/profiles/oresat_node.xpd +++ /dev/null @@ -1,6537 +0,0 @@ - - - - - - - CANopen device profile - 1.1 - - - Device - - 1 - 1 - CANopen - - - - - Portland State Aerospace Society - 0 - OreSat Node - 0 - - OreSat Node Default Profile - - 0 - 0 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * bit 16-31: Additional information -* bit 0-15: Device profile number - - - - - - - * bit 7: manufacturer specific -* bit 6: Reserved (always 0) -* bit 5: device profile specific -* bit 4: communication error (overrun, error state) -* bit 3: temperature -* bit 2: voltage -* bit 1: current -* bit 0: generic error - - - - - - - - - - - * Sub Index 0: Contains number of actual errors. 0 can be written to clear error history. -* sub-index 1 and above: - * bit 16-31: Manufacturer specific additional information - * bit 0-15: Error code as transmited in the Emergency object - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * bit 31: set to 0 -* bit 30: If set, CANopen device generates SYNC object -* bit 11-29: set to 0 -* bit 0-10: 11-bit CAN-ID - - - - - - - Period of SYNC transmission in µs (0 = transmission disabled). - - - - - - - Synchronous window leghth in µs (0 = not used). All synchronous PDOs must be transmitted within this time window. - - - - - - - - - - - - - - - - - - - - - - - - Sub-indexes 1 and above: -* Reading provides information about its storage functionality: - * bit 1: If set, CANopen device saves parameters autonomously - * bit 0: If set, CANopen device saves parameters on command -* Writing value 0x65766173 ('s','a','v','e' from LSB to MSB) stores corresponding data. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Sub-indexes 1 and above: -* Reading provides information about its restoring capability: - * bit 0: If set, CANopen device restores parameters -* Writing value 0x64616F6C ('l','o','a','d' from LSB to MSB) restores corresponding data. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * bit 31: If set, EMCY does NOT exist / is NOT valid -* bit 11-30: set to 0 -* bit 0-10: 11-bit CAN-ID - - - - - - - Inhibit time of emergency message in multiples of 100µs. The value 0 disables the inhibit time. - - - - - - Consumer Heartbeat Time: - * bit 24-31: set to 0 - * bit 16-23: Node ID of the monitored node. If 0 or greater than 127, sub-entry is not used. - * bit 0-15: Heartbeat time in ms (if 0, sub-intry is not used). Value should be higher than the corresponding producer heartbeat time. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Heartbeat producer time in ms (0 = disable transmission). - - - - - - - * Vendor-ID, assigned by CiA -* Product code, manufacturer specific -* Revision number: - * bit 16-31: Major revision number (CANopen behavior has changed) - * bit 0-15: Minor revision num. (CANopen behavior has not changed) -* Serial number, manufacturer specific - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Value 0: SYNC message is transmitted with data length 0. -* Value 1: reserved. -* Value 2-240: SYNC message has one data byte, which contains the counter. -* Value 241-255: reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Emergency consumer 1 to 127: -* bit 31: If set, EMCY consumer does NOT exist / is NOT valid -* bit 11-30: set to 0 -* bit 0-10: 11-bit CAN-ID - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If error is detected and operating NMT state is NMT operational, this object defines behavior of the device. - -Value definition for all subindexes: - 0x00 - if operational, switch to NMT pre-operational - 0x01 - do nothing - 0x02 - switch to NMT stopped - -01 - Communication error - bus off or Heartbeat consumer error. -02 - Communication other error (critical errors - see 'Error status bits') except CAN bus passive but including bus off or Heartbeat consumer. -03 - Communication passive - any communication error including CAN bus passive. -04 - Generic error (critical errors - see 'Error status bits'). -05 - Device profile error - bit 5 in error register is set. -06 - Manufacturer specific error - bit 7 in error register is set. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Sub-indexes 1 and 2: - * bit 31: If set, SDO does NOT exist / is NOT valid - * bit 30: If set, value is assigned dynamically - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Node-ID of the SDO client, 0x01 to 0x7F - - - - - - - - - - - - - - - - - - - - - - - - - - * Sub-indexes 1 and 2: - * bit 31: If set, SDO does NOT exist / is NOT valid - * bit 30: If set, value is assigned dynamically - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Node-ID of the SDO client, 0x01 to 0x7F - - - - - - - - - - - - - - - - - - - - - - - - - - - * Sub-indexes 1 and 2: - * bit 31: If set, SDO does NOT exist / is NOT valid - * bit 30: If set, value is assigned dynamically - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Node-ID of the SDO server, 0x01 to 0x7F - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 11-30: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0-240: synchronous, processed after next reception of SYNC object - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Event timer in ms (0 = disabled) for deadline monitoring. - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * COB-ID used by RPDO: - * bit 31: If set, PDO does not exist / is not valid - * bit 30: If set, NO RTR is allowed on this PDO - * bit 11-29: set to 0 - * bit 0-10: 11-bit CAN-ID -* Transmission type: - * Value 0: synchronous (acyclic) - * Value 1-240: synchronous (cyclic every (1-240)-th sync) - * Value 241-253: not used - * Value 254: event-driven (manufacturer-specific) - * Value 255: event-driven (device profile and application profile specific) -* Inhibit time in multiple of 100µs, if the transmission type is set to 254 or 255 (0 = disabled). -* Event timer interval in ms, if the transmission type is set to 254 or 255 (0 = disabled). -* SYNC start value - * Value 0: Counter of the SYNC message shall not be processed. - * Value 1-240: The SYNC message with the counter value equal to this value shall be regarded as the first received SYNC message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Number of mapped application objects in PDO: - * Value 0: mapping is disabled. - * Value 1: sub-index 0x01 is valid. - * Value 2-8: sub-indexes 0x01 to (0x02 to 0x08) are valid. -* Application object 1-8: - * bit 16-31: index - * bit 8-15: sub-index - * bit 0-7: data length in bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This object configures the start-up behavior of a device that is able to perform the NMT. - - - - - - CAN Bus redundancy management as defined in ECSS-E-ST-50-15C - - - - - - - - - - Bdefault specifies the bus to be considered active after a node power-on, node hardware reset. - - - - - Ttoggle specifies the number of Consumer Heartbeat times during which the node is required to be listeningfor an NMT HB message on a particular bus before switching to the other bus. - - - - - Ntoggle specifies the number of toggles between the Nominal and Redundant bus in case of no HB message being detected. If an even number is used the last toggle puts the system into Bdefault. - - - - - The counter of Ntoggles (bus toggles) shows the count of the number of toggles that have already been performed by the device. - - - - - CCSDS Unsegmented Time Code (CUC) object for Spacecraft Elapsed Time (SCET) get/set methods - - - - - CCSDS Day Segmented Time Code (CDS) object for UTC time get/set methods - - - - - Unique Device ID of MCU - - - - - - - - - - - - - - - - - - - - - - - - Calibration values as read from the MCU - - - - - - - - - Temperature Sensor Calibration 1 - - - - - Temperature Sensor Calibration 2 - - - - - Interal VREF calibration value - - - - - Common MCU sensors between all boards. This provides the calculated values based on calibration data as well as the raw values read from the sensors directly. - - - - - - - - - MCU temperature in 1°C. - - - - - MCU Internal VREF voltage in 0.02V. - - - - - MCU VBAT voltage in 0.02V. - - - - - VBUSP current draw in 0.02mA. - - - - - Raw MCU temperature sensor value. - - - - - Raw MCU Internal VREF sensor value. - - - - - Raw MCU VBAT sensor value. - - - - - Raw VBUSP Current sensor value. - - - - - Error Status Bits indicates error conditions inside stack or inside application. Specific bit is set by CO_errorReport() function, when error occurs in program. It can be reset by CO_errorReset() function, if error is solved. Emergency message is sent on each change of any Error Status Bit. If critical bits are set, node will not be able to stay in operational state. For more information see file CO_Emergency.h. - -Default error status bits are: - -Communication or protocol errors from driver (informative): -00 - ERROR_NO_ERROR - Error Reset or No Error. -01 - ERROR_CAN_BUS_WARNING - CAN bus warning. -02 - ERROR_RXMSG_WRONG_LENGTH - Wrong data length of received CAN message. -03 - ERROR_RXMSG_OVERFLOW - Previous received CAN message wasn't processed yet. -04 - ERROR_RPDO_WRONG_LENGTH - Wrong data length of received PDO. -05 - ERROR_RPDO_OVERFLOW - Previous received PDO wasn't processed yet. -06 - ERROR_CAN_RX_BUS_PASSIVE - CAN receive bus is passive. -07 - ERROR_CAN_TX_BUS_PASSIVE - CAN transmit bus is passive. - -Communication or protocol errors from driver (critical): -08 - ERROR_08_reserved - (reserved) -09 - ERROR_09_reserved - (reserved) -0A - ERROR_CAN_TX_BUS_OFF - CAN transmit bus is off. -0B - ERROR_CAN_RXB_OVERFLOW - CAN module receive buffer has overflowed. -0C - ERROR_CAN_TX_OVERFLOW - CAN transmit buffer has overflowed. -0D - ERROR_TPDO_OUTSIDE_WINDOW - TPDO is outside SYNC window. -0E - ERROR_CAN_CONFIGURATION_FAILED - Configuration of CAN module CAN failed (Rx or Tx). -0F - ERROR_0F_reserved - (reserved) - -Communication or protocol errors (informative): -10 - ERROR_NMT_WRONG_COMMAND - Wrong NMT command received. -11 - ERROR_SYNC_EARLY - SYNC message was too early. -12 - ERROR_12_reserved - (reserved) -13 - ERROR_13_reserved - (reserved) -14 - ERROR_14_reserved - (reserved) -15 - ERROR_15_reserved - (reserved) -16 - ERROR_16_reserved - (reserved) -17 - ERROR_17_reserved - (reserved) - -Communication or protocol errors (critical): -18 - ERROR_SYNC_TIME_OUT - SYNC message timeout. -19 - ERROR_SYNC_LENGTH - Unexpected SYNC data length -1A - ERROR_PDO_WRONG_MAPPING - Error with PDO mapping. -1B - ERROR_HEARTBEAT_CONSUMER - Heartbeat consumer timeout. -1C - ERROR_HEARTBEAT_CONSUMER_REMOTE_RESET - Heartbeat consumer detected remote node reset. -1D - ERROR_1D_reserved - (reserved) -1E - ERROR_1E_reserved - (reserved) -1F - ERROR_1F_reserved - (reserved) - -Generic errors (informative): -20 - ERROR_20_reserved - (reserved) -21 - ERROR_21_reserved - (reserved) -22 - ERROR_22_reserved - (reserved) -23 - ERROR_23_reserved - (reserved) -24 - ERROR_24_reserved - (reserved) -25 - ERROR_25_reserved - (reserved) -26 - ERROR_26_reserved - (reserved) -27 - ERROR_27_reserved - (reserved) - -Generic errors (critical): -28 - ERROR_WRONG_ERROR_REPORT - Wrong parameters to <CO_errorReport()> function. -29 - ERROR_ISR_TIMER_OVERFLOW - Timer task has overflowed. -2A - ERROR_MEMORY_ALLOCATION_ERROR - Unable to allocate memory for objects. -2B - ERROR_GENERIC_ERROR - Generic error, test usage. -2C - ERROR_MAIN_TIMER_OVERFLOW - Mainline function exceeded maximum execution time. -2D - ERROR_INTERNAL_STATE_APPL - Error in application software internal state. -2E - ERROR_2E_reserved - (reserved) -2F - ERROR_2F_reserved - (reserved) - -Manufacturer specific errors: -Manufacturer may define its own constants up to index 0xFF. Of course, he must then define large enough buffer for error status bits (up to 32 bytes). - - - - - - - - - - CANopen communication network profile - 1.1 - - - CommunicationNetwork - - 1 - 1 - CANopen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/profiles/oresat_solar.xpd b/profiles/oresat_solar.xpd deleted file mode 100644 index 08468223..00000000 --- a/profiles/oresat_solar.xpd +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - CANopen device profile - 1.1 - - - Device - - 1 - 1 - CANopen - - - - - Portland State Aerospace Society - 0 - OreSat Solar Board - 0 - - OreSat Solar Board Object Dictionary - - 0 - 0 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CANopen communication network profile - 1.1 - - - CommunicationNetwork - - 1 - 1 - CANopen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/archive/app_acs_bldc_f0/Makefile b/src/archive/app_acs_bldc_f0/Makefile deleted file mode 100644 index 4edcd3c2..00000000 --- a/src/archive/app_acs_bldc_f0/Makefile +++ /dev/null @@ -1,205 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x200 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_acs_bldc - -# Target settings. -MCU = cortex-m0 -BOARD = ST_NUCLEO32_F042K6 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f0xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F0xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F042x6.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_acs_bldc_f0/README.md b/src/archive/app_acs_bldc_f0/README.md deleted file mode 100644 index 55f3c8e2..00000000 --- a/src/archive/app_acs_bldc_f0/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# app_template - -This is the template app for new applications. - -To create a new app, simply copy the app_template directory and name it whatever you like. - -``` -cp -R app_template app_ -``` - -If building for a specific board, update the `BOARD =` line to the board -defined in the `boards` directory - -Then, open the Makefile and edit the line `PROJECT =` to whatever name you chose: -``` -PROJECT = app_ -``` diff --git a/src/archive/app_acs_bldc_f0/cfg/chconf.h b/src/archive/app_acs_bldc_f0/cfg/chconf.h deleted file mode 100644 index 6f3b51a9..00000000 --- a/src/archive/app_acs_bldc_f0/cfg/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM FALSE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_acs_bldc_f0/cfg/halconf.h b/src/archive/app_acs_bldc_f0/cfg/halconf.h deleted file mode 100644 index 0874eeae..00000000 --- a/src/archive/app_acs_bldc_f0/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_acs_bldc_f0/cfg/mcuconf.h b/src/archive/app_acs_bldc_f0/cfg/mcuconf.h deleted file mode 100644 index 78e88016..00000000 --- a/src/archive/app_acs_bldc_f0/cfg/mcuconf.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_HSI48_ENABLED FALSE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2 -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_PLLNODIV STM32_PLLNODIV_DIV2 -#define STM32_USBSW STM32_USBSW_HSI48 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI16_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI17_20_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI21_22_IRQ_PRIORITY 3 -#define STM32_IRQ_USART1_PRIORITY 3 -#define STM32_IRQ_USART2_PRIORITY 3 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_CKMODE STM32_ADC_CKMODE_ADCCLK -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 -#define STM32_GPT_TIM14_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_IRQ_PRIORITY 3 -#define STM32_I2C_USE_DMA TRUE -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI1 FALSE -#define STM32_I2S_SPI1_MODE (STM32_I2S_MODE_MASTER | \ - STM32_I2S_MODE_RX) -#define STM32_I2S_SPI1_IRQ_PRIORITY 2 -#define STM32_I2S_SPI1_DMA_PRIORITY 1 -#define STM32_I2S_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2S_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED TRUE -#define STM32_PWM_USE_TIM1 TRUE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 2 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_acs_bldc_f0/main.c b/src/archive/app_acs_bldc_f0/main.c deleted file mode 100644 index c0250515..00000000 --- a/src/archive/app_acs_bldc_f0/main.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -//=== ChibiOS header files -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -//=== Project header files -//#include "oresat.h" -#include "acs_bldc.h" - -//=== Serial configuration -static SerialConfig ser_cfg = { - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - -// bldc control thread -static THD_WORKING_AREA(wa_bldcThread,128); -static THD_FUNCTION(bldcThread,arg){ - (void)arg; - chRegSetThreadName("bldc"); -// bldcSinStart(); - - while(!chThdShouldTerminateX()){ - chThdSleepMilliseconds(500); - } -} - -static void app_init(void){ - // Start up debug output - bldcInit(); - sdStart(&SD2, &ser_cfg); -} - -static void app_main(void){ - chThdCreateStatic( - wa_bldcThread, - sizeof(wa_bldcThread), - NORMALPRIO, - bldcThread, - NULL - ); - - /* - * Begin main loop - */ - while (true){ - chThdSleepMilliseconds(1000); - } -} - -int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - //oresat_init(0); - - // Initialize and start app - app_init(); - app_main(); - - return 0; -} diff --git a/src/archive/app_acs_bldc_f0/scratch/acs_sinlut.c b/src/archive/app_acs_bldc_f0/scratch/acs_sinlut.c deleted file mode 100644 index a899cc5e..00000000 --- a/src/archive/app_acs_bldc_f0/scratch/acs_sinlut.c +++ /dev/null @@ -1,255 +0,0 @@ -#include "acs_bldc.h" - -BldcConfig bldc; - -#ifdef SADDLE -#define STEPS 384 // for ease of calculations - -sinctrl_t sinctrl[STEPS]={ - 127,131,135,138,142,145,149,152,155,159,162,165,168,171,174,177,180,183,186, - 189,192,194,197,200,202,205,207,210,212,214,217,219,221,223,225,227,229,231, - 232,234,236,237,239,240,242,243,244,245,247,248,249,250,250,251,252,253,253, - 254,254,255,255,255,255,255,255,255,255,255,255,255,254,254,253,253,252,252, - 251,250,249,248,247,246,245,244,242,241,240,238,237,235,233,232,230,228,226, - 224,222,222,225,226,228,230,232,234,235,237,238,240,241,243,244,245,246,247, - 248,249,250,251,252,252,253,254,254,254,255,255,255,255,255,255,255,255,255, - 255,254,254,254,253,252,252,251,250,249,248,247,246,245,244,243,241,240,238, - 237,235,234,232,230,228,227,225,223,220,218,216,214,212,209,207,204,202,199, - 197,194,191,188,185,183,180,177,174,171,167,164,161,158,154,151,148,144,141, - 137,134,130,127,123,119,116,112,108,104,101, 97, 93, 89, 85, 81, 77, 73, 69, - 65, 61, 57, 53, 49, 45, 41, 36, 32, 28, 24, 20, 16, 12, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 10, 15, 19, 23, 27, 31, 35, - 39, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 99,103,107,111, - 115,118,121,124 -}; - -#endif - -#ifndef SADDLE -#define STEPS 180 -//#define STEPS 90 -//#define STEPS 360 -//#define STEPS 720 - // TODO: This has too many steps in it. we should redo this manually maybe -//* -sinctrl_t sinctrl[STEPS] = { - 5000,5174,5349,5523,5696,5868,6040,6210, - 6378,6545,6710,6873,7034,7192,7347,7500, - 7650,7796,7939,8078,8214,8346,8473,8597, - 8716,8830,8940,9045,9145,9240,9330,9415, - 9494,9568,9636,9698,9755,9806,9851,9891, - 9924,9951,9973,9988,9997,10000,9997,9988, - 9973,9951,9924,9891,9851,9806,9755,9698, - 9636,9568,9494,9415,9330,9240,9145,9045, - 8940,8830,8716,8597,8473,8346,8214,8078, - 7939,7796,7650,7500,7347,7192,7034,6873, - 6710,6545,6378,6210,6040,5868,5696,5523, - 5349,5174,5000,4826,4651,4477,4304,4132, - 3960,3790,3622,3455,3290,3127,2966,2808, - 2653,2500,2350,2204,2061,1922,1786,1654, - 1527,1403,1284,1170,1060,955,855,760, - 670,585,506,432,364,302,245,194, - 149,109,76,49,27,12,3,0, - 3,12,27,49,76,109,149,194, - 245,302,364,432,506,585,670,760, - 855,955,1060,1170,1284,1403,1527,1654, - 1786,1922,2061,2204,2350,2500,2653,2808, - 2966,3127,3290,3455,3622,3790,3960,4132, - 4304,4477,4651,4826 -}; -//*/ -/* -sinctrl_t sinctrl[STEPS] = { - 5000,5349,5696,6040,6378,6710,7034,7347, - 7650,7939,8214,8473,8716,8940,9145,9330, - 9494,9636,9755,9851,9924,9973,9997,9997, - 9973,9924,9851,9755,9636,9494,9330,9145, - 8940,8716,8473,8214,7939,7650,7347,7034, - 6710,6378,6040,5696,5349,5000,4651,4304, - 3960,3622,3290,2966,2653,2350,2061,1786, - 1527,1284,1060,855,670,506,364,245, - 149,76,27,3,3,27,76,149, - 245,364,506,670,855,1060,1284,1527, - 1786,2061,2350,2653,2966,3290,3622,3960, - 4304,4651 -}; -//*/ -/* -sinctrl_t sinctrl[STEPS] = { - 4980,5068,5155,5242,5329,5416,5503,5590,5676,5763,5849,5934,6020,6105,6190,6274, - 6359,6442,6525,6608,6690,6772,6853,6934,7014,7093,7172,7250,7328,7404,7480,7556, - 7630,7704,7776,7848,7919,7989,8059,8127,8194,8261,8326,8390,8454,8516,8577,8637, - 8696,8754,8811,8866,8920,8974,9025,9076,9126,9174,9221,9266,9311,9353,9395,9435, - 9474,9512,9548,9583,9616,9648,9679,9708,9736,9762,9787,9810,9832,9852,9871,9889, - 9904,9919,9932,9943,9953,9961,9968,9974,9977,9980,9980,9980,9977,9974,9968,9961, - 9953,9943,9932,9919,9904,9889,9871,9852,9832,9810,9787,9762,9736,9708,9679,9648, - 9616,9583,9548,9512,9474,9435,9395,9353,9311,9266,9221,9174,9126,9076,9025,8974, - 8920,8866,8811,8754,8696,8637,8577,8516,8454,8390,8326,8261,8194,8127,8059,7989, - 7919,7848,7776,7704,7630,7556,7480,7404,7328,7250,7172,7093,7014,6934,6853,6772, - 6690,6608,6525,6442,6359,6274,6190,6105,6020,5934,5849,5763,5676,5590,5503,5416, - 5329,5242,5155,5068,4980,4893,4806,4719,4632,4545,4458,4371,4285,4198,4112,4026, - 3941,3856,3771,3686,3602,3519,3435,3353,3270,3189,3107,3027,2947,2867,2789,2710, - 2633,2556,2480,2405,2331,2257,2184,2113,2041,1971,1902,1834,1766,1700,1635,1570, - 1507,1445,1384,1324,1265,1207,1150,1095,1040,987,935,885,835,787,740,695,650, - 607,566,525,486,449,413,378,344,312,282,253,225,199,174,151,129,109,90,72,56, - 42,29,18,8,0,0,0,0,0,0,0,0,0,0,0,8,18,29,42,56,72,90,109,129,151,174,199,225, - 253,282,312,344,378,413,449,486,525,566,607,650,695,740,787,835,885,935,987,1040, - 1095,1150,1207,1265,1324,1384,1445,1507,1570,1635,1700,1766,1834,1902,1971,2041, - 2113,2184,2257,2331,2405,2480,2556,2633,2710,2789,2867,2947,3027,3107,3189,3270, - 3353,3435,3519,3602,3686,3771,3856,3941,4026,4112,4198,4285,4371,4458,4545,4632, - 4719,4806,4893 -}; -//*/ -/* -sinctrl_t sinctrl[STEPS] = { - 5000,5087,5174,5262,5349,5436,5523,5609, - 5696,5782,5868,5954,6040,6125,6210,6294, - 6378,6462,6545,6628,6710,6792,6873,6954, - 7034,7113,7192,7270,7347,7424,7500,7575, - 7650,7723,7796,7868,7939,8009,8078,8147, - 8214,8280,8346,8410,8473,8536,8597,8657, - 8716,8774,8830,8886,8940,8993,9045,9096, - 9145,9193,9240,9286,9330,9373,9415,9455, - 9494,9532,9568,9603,9636,9668,9698,9728, - 9755,9782,9806,9830,9851,9872,9891,9908, - 9924,9938,9951,9963,9973,9981,9988,9993, - 9997,9999,10000,9999,9997,9993,9988,9981, - 9973,9963,9951,9938,9924,9908,9891,9872, - 9851,9830,9806,9782,9755,9728,9698,9668, - 9636,9603,9568,9532,9494,9455,9415,9373, - 9330,9286,9240,9193,9145,9096,9045,8993, - 8940,8886,8830,8774,8716,8657,8597,8536, - 8473,8410,8346,8280,8214,8147,8078,8009, - 7939,7868,7796,7723,7650,7575,7500,7424, - 7347,7270,7192,7113,7034,6954,6873,6792, - 6710,6628,6545,6462,6378,6294,6210,6125, - 6040,5954,5868,5782,5696,5609,5523,5436, - 5349,5262,5174,5087,5000,4913,4826,4738, - 4651,4564,4477,4391,4304,4218,4132,4046, - 3960,3875,3790,3706,3622,3538,3455,3372, - 3290,3208,3127,3046,2966,2887,2808,2730, - 2653,2576,2500,2425,2350,2277,2204,2132, - 2061,1991,1922,1853,1786,1720,1654,1590, - 1527,1464,1403,1343,1284,1226,1170,1114, - 1060,1007,955,904,855,807,760,714, - 670,627,585,545,506,468,432,397, - 364,332,302,272,245,218,194,170, - 149,128,109,92,76,62,49,37, - 27,19,12,7,3,1,0,1, - 3,7,12,19,27,37,49,62, - 76,92,109,128,149,170,194,218, - 245,272,302,332,364,397,432,468, - 506,545,585,627,670,714,760,807, - 855,904,955,1007,1060,1114,1170,1226, - 1284,1343,1403,1464,1527,1590,1654,1720, - 1786,1853,1922,1991,2061,2132,2204,2277, - 2350,2425,2500,2576,2653,2730,2808,2887, - 2966,3046,3127,3208,3290,3372,3455,3538, - 3622,3706,3790,3875,3960,4046,4132,4218, - 4304,4391,4477,4564,4651,4738,4826,4913, -}; -//*/ - -/* -sinctrl_t sinctrl[STEPS] = { - 5000,5044,5087,5131,5174,5218,5262,5305, - 5349,5392,5436,5479,5523,5566,5609,5653, - 5696,5739,5782,5825,5868,5911,5954,5997, - 6040,6082,6125,6167,6210,6252,6294,6336, - 6378,6420,6462,6504,6545,6587,6628,6669, - 6710,6751,6792,6833,6873,6913,6954,6994, - 7034,7073,7113,7153,7192,7231,7270,7309, - 7347,7386,7424,7462,7500,7538,7575,7612, - 7650,7686,7723,7760,7796,7832,7868,7904, - 7939,7974,8009,8044,8078,8113,8147,8180, - 8214,8247,8280,8313,8346,8378,8410,8442, - 8473,8505,8536,8566,8597,8627,8657,8686, - 8716,8745,8774,8802,8830,8858,8886,8913, - 8940,8967,8993,9019,9045,9071,9096,9121, - 9145,9169,9193,9217,9240,9263,9286,9308, - 9330,9352,9373,9394,9415,9435,9455,9475, - 9494,9513,9532,9550,9568,9585,9603,9619, - 9636,9652,9668,9683,9698,9713,9728,9742, - 9755,9769,9782,9794,9806,9818,9830,9841, - 9851,9862,9872,9881,9891,9900,9908,9916, - 9924,9931,9938,9945,9951,9957,9963,9968, - 9973,9977,9981,9985,9988,9991,9993,9995, - 9997,9998,9999,10000,10000,10000,9999,9998, - 9997,9995,9993,9991,9988,9985,9981,9977, - 9973,9968,9963,9957,9951,9945,9938,9931, - 9924,9916,9908,9900,9891,9881,9872,9862, - 9851,9841,9830,9818,9806,9794,9782,9769, - 9755,9742,9728,9713,9698,9683,9668,9652, - 9636,9619,9603,9585,9568,9550,9532,9513, - 9494,9475,9455,9435,9415,9394,9373,9352, - 9330,9308,9286,9263,9240,9217,9193,9169, - 9145,9121,9096,9071,9045,9019,8993,8967, - 8940,8913,8886,8858,8830,8802,8774,8745, - 8716,8686,8657,8627,8597,8566,8536,8505, - 8473,8442,8410,8378,8346,8313,8280,8247, - 8214,8180,8147,8113,8078,8044,8009,7974, - 7939,7904,7868,7832,7796,7760,7723,7686, - 7650,7612,7575,7538,7500,7462,7424,7386, - 7347,7309,7270,7231,7192,7153,7113,7073, - 7034,6994,6954,6913,6873,6833,6792,6751, - 6710,6669,6628,6587,6545,6504,6462,6420, - 6378,6336,6294,6252,6210,6167,6125,6082, - 6040,5997,5954,5911,5868,5825,5782,5739, - 5696,5653,5609,5566,5523,5479,5436,5392, - 5349,5305,5262,5218,5174,5131,5087,5044, - 5000,4956,4913,4869,4826,4782,4738,4695, - 4651,4608,4564,4521,4477,4434,4391,4347, - 4304,4261,4218,4175,4132,4089,4046,4003, - 3960,3918,3875,3833,3790,3748,3706,3664, - 3622,3580,3538,3496,3455,3413,3372,3331, - 3290,3249,3208,3167,3127,3087,3046,3006, - 2966,2927,2887,2847,2808,2769,2730,2691, - 2653,2614,2576,2538,2500,2462,2425,2388, - 2350,2314,2277,2240,2204,2168,2132,2096, - 2061,2026,1991,1956,1922,1887,1853,1820, - 1786,1753,1720,1687,1654,1622,1590,1558, - 1527,1495,1464,1434,1403,1373,1343,1314, - 1284,1255,1226,1198,1170,1142,1114,1087, - 1060,1033,1007,981,955,929,904,879, - 855,831,807,783,760,737,714,692, - 670,648,627,606,585,565,545,525, - 506,487,468,450,432,415,397,381, - 364,348,332,317,302,287,272,258, - 245,231,218,206,194,182,170,159, - 149,138,128,119,109,100,92,84, - 76,69,62,55,49,43,37,32, - 27,23,19,15,12,9,7,5, - 3,2,1,0,0,0,1,2, - 3,5,7,9,12,15,19,23, - 27,32,37,43,49,55,62,69, - 76,84,92,100,109,119,128,138, - 149,159,170,182,194,206,218,231, - 245,258,272,287,302,317,332,348, - 364,381,397,415,432,450,468,487, - 506,525,545,565,585,606,627,648, - 670,692,714,737,760,783,807,831, - 855,879,904,929,955,981,1007,1033, - 1060,1087,1114,1142,1170,1198,1226,1255, - 1284,1314,1343,1373,1403,1434,1464,1495, - 1527,1558,1590,1622,1654,1687,1720,1753, - 1786,1820,1853,1887,1922,1956,1991,2026, - 2061,2096,2132,2168,2204,2240,2277,2314, - 2350,2388,2425,2462,2500,2538,2576,2614, - 2653,2691,2730,2769,2808,2847,2887,2927, - 2966,3006,3046,3087,3127,3167,3208,3249, - 3290,3331,3372,3413,3455,3496,3538,3580, - 3622,3664,3706,3748,3790,3833,3875,3918, - 3960,4003,4046,4089,4132,4175,4218,4261, - 4304,4347,4391,4434,4477,4521,4564,4608, - 4651,4695,4738,4782,4826,4869,4913,4956, -}; -//*/ - -#endif - diff --git a/src/archive/app_acs_bldc_f0/scratch/acs_sinlut.h b/src/archive/app_acs_bldc_f0/scratch/acs_sinlut.h deleted file mode 100644 index ba310740..00000000 --- a/src/archive/app_acs_bldc_f0/scratch/acs_sinlut.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef SINLUT_H -#define SINLUT_H - -typedef struct{ - sinctl_t *sinctl; - int steps; -}sinlut; - -sinctrl_t sinctrl360[] = { - 5000,5087,5174,5262,5349,5436,5523,5609, - 5696,5782,5868,5954,6040,6125,6210,6294, - 6378,6462,6545,6628,6710,6792,6873,6954, - 7034,7113,7192,7270,7347,7424,7500,7575, - 7650,7723,7796,7868,7939,8009,8078,8147, - 8214,8280,8346,8410,8473,8536,8597,8657, - 8716,8774,8830,8886,8940,8993,9045,9096, - 9145,9193,9240,9286,9330,9373,9415,9455, - 9494,9532,9568,9603,9636,9668,9698,9728, - 9755,9782,9806,9830,9851,9872,9891,9908, - 9924,9938,9951,9963,9973,9981,9988,9993, - 9997,9999,10000,9999,9997,9993,9988,9981, - 9973,9963,9951,9938,9924,9908,9891,9872, - 9851,9830,9806,9782,9755,9728,9698,9668, - 9636,9603,9568,9532,9494,9455,9415,9373, - 9330,9286,9240,9193,9145,9096,9045,8993, - 8940,8886,8830,8774,8716,8657,8597,8536, - 8473,8410,8346,8280,8214,8147,8078,8009, - 7939,7868,7796,7723,7650,7575,7500,7424, - 7347,7270,7192,7113,7034,6954,6873,6792, - 6710,6628,6545,6462,6378,6294,6210,6125, - 6040,5954,5868,5782,5696,5609,5523,5436, - 5349,5262,5174,5087,5000,4913,4826,4738, - 4651,4564,4477,4391,4304,4218,4132,4046, - 3960,3875,3790,3706,3622,3538,3455,3372, - 3290,3208,3127,3046,2966,2887,2808,2730, - 2653,2576,2500,2425,2350,2277,2204,2132, - 2061,1991,1922,1853,1786,1720,1654,1590, - 1527,1464,1403,1343,1284,1226,1170,1114, - 1060,1007,955,904,855,807,760,714, - 670,627,585,545,506,468,432,397, - 364,332,302,272,245,218,194,170, - 149,128,109,92,76,62,49,37, - 27,19,12,7,3,1,0,1, - 3,7,12,19,27,37,49,62, - 76,92,109,128,149,170,194,218, - 245,272,302,332,364,397,432,468, - 506,545,585,627,670,714,760,807, - 855,904,955,1007,1060,1114,1170,1226, - 1284,1343,1403,1464,1527,1590,1654,1720, - 1786,1853,1922,1991,2061,2132,2204,2277, - 2350,2425,2500,2576,2653,2730,2808,2887, - 2966,3046,3127,3208,3290,3372,3455,3538, - 3622,3706,3790,3875,3960,4046,4132,4218, - 4304,4391,4477,4564,4651,4738,4826,4913, -}; -#endif diff --git a/src/archive/app_acs_bldc_f0/source/README.md b/src/archive/app_acs_bldc_f0/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/archive/app_acs_bldc_f0/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_acs_bldc_f0/source/acs_bldc.c b/src/archive/app_acs_bldc_f0/source/acs_bldc.c deleted file mode 100644 index 6d015171..00000000 --- a/src/archive/app_acs_bldc_f0/source/acs_bldc.c +++ /dev/null @@ -1,221 +0,0 @@ -#include "acs_bldc.h" - -BldcConfig bldc; - -//* -sinctrl_t sinctrl360[] = { - 5000,5087,5174,5262,5349,5436,5523,5609, - 5696,5782,5868,5954,6040,6125,6210,6294, - 6378,6462,6545,6628,6710,6792,6873,6954, - 7034,7113,7192,7270,7347,7424,7500,7575, - 7650,7723,7796,7868,7939,8009,8078,8147, - 8214,8280,8346,8410,8473,8536,8597,8657, - 8716,8774,8830,8886,8940,8993,9045,9096, - 9145,9193,9240,9286,9330,9373,9415,9455, - 9494,9532,9568,9603,9636,9668,9698,9728, - 9755,9782,9806,9830,9851,9872,9891,9908, - 9924,9938,9951,9963,9973,9981,9988,9993, - 9997,9999,10000,9999,9997,9993,9988,9981, - 9973,9963,9951,9938,9924,9908,9891,9872, - 9851,9830,9806,9782,9755,9728,9698,9668, - 9636,9603,9568,9532,9494,9455,9415,9373, - 9330,9286,9240,9193,9145,9096,9045,8993, - 8940,8886,8830,8774,8716,8657,8597,8536, - 8473,8410,8346,8280,8214,8147,8078,8009, - 7939,7868,7796,7723,7650,7575,7500,7424, - 7347,7270,7192,7113,7034,6954,6873,6792, - 6710,6628,6545,6462,6378,6294,6210,6125, - 6040,5954,5868,5782,5696,5609,5523,5436, - 5349,5262,5174,5087,5000,4913,4826,4738, - 4651,4564,4477,4391,4304,4218,4132,4046, - 3960,3875,3790,3706,3622,3538,3455,3372, - 3290,3208,3127,3046,2966,2887,2808,2730, - 2653,2576,2500,2425,2350,2277,2204,2132, - 2061,1991,1922,1853,1786,1720,1654,1590, - 1527,1464,1403,1343,1284,1226,1170,1114, - 1060,1007,955,904,855,807,760,714, - 670,627,585,545,506,468,432,397, - 364,332,302,272,245,218,194,170, - 149,128,109,92,76,62,49,37, - 27,19,12,7,3,1,0,1, - 3,7,12,19,27,37,49,62, - 76,92,109,128,149,170,194,218, - 245,272,302,332,364,397,432,468, - 506,545,585,627,670,714,760,807, - 855,904,955,1007,1060,1114,1170,1226, - 1284,1343,1403,1464,1527,1590,1654,1720, - 1786,1853,1922,1991,2061,2132,2204,2277, - 2350,2425,2500,2576,2653,2730,2808,2887, - 2966,3046,3127,3208,3290,3372,3455,3538, - 3622,3706,3790,3875,3960,4046,4132,4218, - 4304,4391,4477,4564,4651,4738,4826,4913 -}; -//*/ - -/* -static sinctrl_t sinctrlSaddle[384] = { - 127,131,135,138,142,145,149,152, - 155,159,162,165,168,171,174,177, - 180,183,186,189,192,194,197,200, - 202,205,207,210,212,214,217,219, - 221,223,225,227,229,231,232,234, - 236,237,239,240,242,243,244,245, - 247,248,249,250,250,251,252,253, - 253,254,254,255,255,255,255,255, - 255,255,255,255,255,255,254,254, - 253,253,252,252,251,250,249,248, - 247,246,245,244,242,241,240,238, - 237,235,233,232,230,228,226,224, - 222,222,225,226,228,230,232,234, - 235,237,238,240,241,243,244,245, - 246,247,248,249,250,251,252,252, - 253,254,254,254,255,255,255,255, - 255,255,255,255,255,255,254,254, - 254,253,252,252,251,250,249,248, - 247,246,245,244,243,241,240,238, - 237,235,234,232,230,228,227,225, - 223,220,218,216,214,212,209,207, - 204,202,199,197,194,191,188,185, - 183,180,177,174,171,167,164,161, - 158,154,151,148,144,141,137,134, - 130,127,123,119,116,112,108,104, - 101, 97, 93, 89, 85, 81, 77, 73, - 69, 65, 61, 57, 53, 49, 45, 41, - 36, 32, 28, 24, 20, 16, 12, 7, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2, 6, 10, 15, 19, 23, 27, 31, - 35, 39, 44, 48, 52, 56, 60, 64, - 68, 72, 76, 80, 84, 88, 92, 96, - 99,103,107,111,115,118,121,124 -}; -//*/ - - -// pwm period callback -static void pwmpcb(PWMDriver *pwmp) { - (void)pwmp; - - palClearLine(LINE_LED_GREEN); - - ++bldc.count; - - if(bldc.count==bldc.stretch){ - ++bldc.u; - ++bldc.v; - ++bldc.w; - - if(bldc.u >= bldc.period){ - bldc.u = 0; - } - if(bldc.v >= bldc.period){ - bldc.v = 0; - } - if(bldc.w >= bldc.period){ - bldc.w = 0; - } - - bldc.count=0; - } -} - -static sinctrl_t scale(sinctrl_t duty_cycle){ - return (duty_cycle*bldc.scale)/10; -} - -static void pwmCallback(uint8_t channel,sinctrl_t step){ - palSetLine(LINE_LED_GREEN); - pwmEnableChannelI( - &PWMD1, - channel, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(sinctrl360[step])) - ); -} - -static void pwmUcb(PWMDriver *pwmp){ // channel 1 callback - (void)pwmp; - pwmCallback(PWM_U,bldc.u); -} - -static void pwmVcb(PWMDriver *pwmp){ // channel 2 callback - (void)pwmp; - pwmCallback(PWM_V,bldc.v); -} - -static void pwmWcb(PWMDriver *pwmp){ // channel 3 callback - (void)pwmp; - pwmCallback(PWM_W,bldc.w); -} - -static PWMConfig pwmcfg = { - PWM_TIMER_FREQ, - PWM_PERIOD, - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmUcb}, - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmVcb}, - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmWcb}, - {PWM_OUTPUT_ACTIVE_HIGH,NULL} - }, - 0, - 0, - 0 -}; - - -extern void bldcInit(){ - bldc.period = PERIOD; - bldc.stretch = STRETCH; - bldc.scale = SCALE; - //bldc.sinctrl_size = sizeof(sinctrl)/sizeof(sinctrl_t); - bldc.phase_shift = bldc.period/3; - bldc.count=0; - bldc.u = 0; - bldc.v = bldc.u + bldc.phase_shift; - bldc.w = bldc.v + bldc.phase_shift; - - pwmStart(&PWMD1, &pwmcfg); - pwmEnablePeriodicNotification(&PWMD1); - -// palSetPadMode(GPIOA, 11, PAL_MODE_ALTERNATE(0)); - - pwmEnableChannel(&PWMD1,PWM_U,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.u)); - pwmEnableChannel(&PWMD1,PWM_V,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.v)); - pwmEnableChannel(&PWMD1,PWM_W,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.w)); - - // enable pwm center aligned mode - // TODO: This is not working. needs more research - // - //PWMD1.tim->CR1 |= STM32_TIM_CR1_CMS(0x01); - - pwmEnableChannelNotification(&PWMD1,PWM_U); - pwmEnableChannelNotification(&PWMD1,PWM_V); - pwmEnableChannelNotification(&PWMD1,PWM_W); -} - -extern void bldcStart(){ - -} - -extern void bldcStop(){ - -} - -extern void bldcSinStart(){ - -} - diff --git a/src/archive/app_acs_bldc_f0/source/acs_bldc.h b/src/archive/app_acs_bldc_f0/source/acs_bldc.h deleted file mode 100644 index 595746a3..00000000 --- a/src/archive/app_acs_bldc_f0/source/acs_bldc.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef ACS_BLDC_H -#define ACS_BLDC_H - -#include "ch.h" -#include "hal.h" -//#include "acs_sinlut.h" - -#define SCALE 9 -#define PERIOD 360 -#define STRETCH 1 - -#define sinctrl_t int -//#define sinctrl_t uint32_t // in testing - -typedef struct{ - sinctrl_t u,v,w,phase_shift; - int sinctrl_size; - int count; - int scale; - int period; - int stretch; - sinctrl_t *sinctrl; -} BldcConfig; - -//* -#define PWM_TIMER_FREQ 48e6 // Hz -#define PWM_FREQ 30000// periods per sec -//*/ - -#define PWM_PERIOD PWM_TIMER_FREQ/PWM_FREQ - -#define PWM_U 0U -#define PWM_V 1U -#define PWM_W 2U -#define PWM_D 3U - -extern void bldcInit(void); -extern void bldcStart(void); -extern void bldcStop(void); - -extern void bldcSinStart(void); - -#endif diff --git a/src/archive/app_acs_bldc_f4/Makefile b/src/archive/app_acs_bldc_f4/Makefile deleted file mode 100644 index 3c0c6601..00000000 --- a/src/archive/app_acs_bldc_f4/Makefile +++ /dev/null @@ -1,205 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_acs_bldc - -# Target settings. -MCU = cortex-m4 -BOARD = ST_NUCLEO64_F446RE - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_acs_bldc_f4/README.md b/src/archive/app_acs_bldc_f4/README.md deleted file mode 100644 index 55f3c8e2..00000000 --- a/src/archive/app_acs_bldc_f4/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# app_template - -This is the template app for new applications. - -To create a new app, simply copy the app_template directory and name it whatever you like. - -``` -cp -R app_template app_ -``` - -If building for a specific board, update the `BOARD =` line to the board -defined in the `boards` directory - -Then, open the Makefile and edit the line `PROJECT =` to whatever name you chose: -``` -PROJECT = app_ -``` diff --git a/src/archive/app_acs_bldc_f4/cfg/chconf.h b/src/archive/app_acs_bldc_f4/cfg/chconf.h deleted file mode 100644 index 8e12427c..00000000 --- a/src/archive/app_acs_bldc_f4/cfg/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_acs_bldc_f4/cfg/halconf.h b/src/archive/app_acs_bldc_f4/cfg/halconf.h deleted file mode 100644 index 067f2147..00000000 --- a/src/archive/app_acs_bldc_f4/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_acs_bldc_f4/cfg/mcuconf.h b/src/archive/app_acs_bldc_f4/cfg/mcuconf.h deleted file mode 100644 index 59626a7e..00000000 --- a/src/archive/app_acs_bldc_f4/cfg/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED TRUE -#define STM32_PWM_USE_TIM1 TRUE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_acs_bldc_f4/main.c b/src/archive/app_acs_bldc_f4/main.c deleted file mode 100644 index f649b654..00000000 --- a/src/archive/app_acs_bldc_f4/main.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -//=== ChibiOS header files -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -//=== Project header files -//#include "can.h" -#include "acs_bldc.h" - -//=== Serial configuration -static SerialConfig ser_cfg = { - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - -// bldc control thread -static THD_WORKING_AREA(wa_bldcThread,128); -static THD_FUNCTION(bldcThread,arg){ - (void)arg; - chRegSetThreadName("bldc"); -// bldcSinStart(); - - while(!chThdShouldTerminateX()){ - chThdSleepMilliseconds(500); - } -} - -static void app_init(void){ - // Start up debug output - bldcInit(); - sdStart(&SD2, &ser_cfg); -} - -static void app_main(void){ - chThdCreateStatic( - wa_bldcThread, - sizeof(wa_bldcThread), - NORMALPRIO, - bldcThread, - NULL - ); - - /* - * Begin main loop - */ - while (true){ - chThdSleepMilliseconds(1000); - } -} - -int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - // Initialize CAN Subsystem - //can_init(); - // Start CAN threads - //can_start(); - - // Initialize and start app - app_init(); - app_main(); - - return 0; -} - -//! @} diff --git a/src/archive/app_acs_bldc_f4/source/README.md b/src/archive/app_acs_bldc_f4/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/archive/app_acs_bldc_f4/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_acs_bldc_f4/source/acs_bldc.c b/src/archive/app_acs_bldc_f4/source/acs_bldc.c deleted file mode 100644 index f6c1b45a..00000000 --- a/src/archive/app_acs_bldc_f4/source/acs_bldc.c +++ /dev/null @@ -1,149 +0,0 @@ -#include "acs_bldc.h" - -int sinctrl[] = { - 4980,5068,5155,5242,5329,5416,5503,5590,5676,5763,5849,5934,6020,6105,6190,6274, - 6359,6442,6525,6608,6690,6772,6853,6934,7014,7093,7172,7250,7328,7404,7480,7556, - 7630,7704,7776,7848,7919,7989,8059,8127,8194,8261,8326,8390,8454,8516,8577,8637, - 8696,8754,8811,8866,8920,8974,9025,9076,9126,9174,9221,9266,9311,9353,9395,9435, - 9474,9512,9548,9583,9616,9648,9679,9708,9736,9762,9787,9810,9832,9852,9871,9889, - 9904,9919,9932,9943,9953,9961,9968,9974,9977,9980,9980,9980,9977,9974,9968,9961, - 9953,9943,9932,9919,9904,9889,9871,9852,9832,9810,9787,9762,9736,9708,9679,9648, - 9616,9583,9548,9512,9474,9435,9395,9353,9311,9266,9221,9174,9126,9076,9025,8974, - 8920,8866,8811,8754,8696,8637,8577,8516,8454,8390,8326,8261,8194,8127,8059,7989, - 7919,7848,7776,7704,7630,7556,7480,7404,7328,7250,7172,7093,7014,6934,6853,6772, - 6690,6608,6525,6442,6359,6274,6190,6105,6020,5934,5849,5763,5676,5590,5503,5416, - 5329,5242,5155,5068,4980,4893,4806,4719,4632,4545,4458,4371,4285,4198,4112,4026, - 3941,3856,3771,3686,3602,3519,3435,3353,3270,3189,3107,3027,2947,2867,2789,2710, - 2633,2556,2480,2405,2331,2257,2184,2113,2041,1971,1902,1834,1766,1700,1635,1570, - 1507,1445,1384,1324,1265,1207,1150,1095,1040,987,935,885,835,787,740,695,650, - 607,566,525,486,449,413,378,344,312,282,253,225,199,174,151,129,109,90,72,56, - 42,29,18,8,0,0,0,0,0,0,0,0,0,0,0,8,18,29,42,56,72,90,109,129,151,174,199,225, - 253,282,312,344,378,413,449,486,525,566,607,650,695,740,787,835,885,935,987,1040, - 1095,1150,1207,1265,1324,1384,1445,1507,1570,1635,1700,1766,1834,1902,1971,2041, - 2113,2184,2257,2331,2405,2480,2556,2633,2710,2789,2867,2947,3027,3107,3189,3270, - 3353,3435,3519,3602,3686,3771,3856,3941,4026,4112,4198,4285,4371,4458,4545,4632, - 4719,4806,4893,4980 -}; - -BldcConfig bldc; - -// pwm period callback -static void pwmpcb(PWMDriver *pwmp) { - (void)pwmp; - - palClearLine(LINE_LED_GREEN); - -// if(bldc.count==0){ - ++bldc.u; - ++bldc.v; - ++bldc.w; - - if(bldc.u >= 360){ - bldc.u = 0; - } - if(bldc.v >= 360){ - bldc.v = 0; - } - if(bldc.w >= 360){ - bldc.w = 0; - } - bldc.count=0; -// } -// ++bldc.count; -} - -int scale(int duty_cycle){ - return duty_cycle;//*5/10+2000; -} - -static void pwmc1cb(PWMDriver *pwmp){ // channel 1 callback - (void)pwmp; - palSetLine(LINE_LED_GREEN); - pwmEnableChannelI( - &PWMD1, - PWM_CH1, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(sinctrl[bldc.u])) - ); -} - -static void pwmc2cb(PWMDriver *pwmp){ // channel 2 callback - (void)pwmp; - palSetLine(LINE_LED_GREEN); - pwmEnableChannelI( - &PWMD1, - PWM_CH2, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(sinctrl[bldc.v])) - ); -} - -static void pwmc3cb(PWMDriver *pwmp){ // channel 3 callback - (void)pwmp; - palSetLine(LINE_LED_GREEN); - pwmEnableChannelI( - &PWMD1, - PWM_CH3, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(sinctrl[bldc.w])) - ); -} - -static PWMConfig pwmcfg = { - PWM_TIMER_FREQ, - PWM_PERIOD, - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmc1cb}, - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmc2cb}, - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmc3cb}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, - 0, - 0 -}; - -extern void bldcInit(){ - bldc.sinctrl_size = sizeof(sinctrl)/sizeof(int); - bldc.phase_shift = bldc.sinctrl_size/3; - bldc.u = 0; - bldc.v = bldc.u + bldc.phase_shift; - bldc.w = bldc.v + bldc.phase_shift; - bldc.count=0; - - pwmStart(&PWMD1, &pwmcfg); - pwmEnablePeriodicNotification(&PWMD1); - - palSetPadMode(GPIOPort, ACH1, PAL_MODE_ALTERNATE(1)); - palSetPadMode(GPIOPort, ACH2, PAL_MODE_ALTERNATE(1)); - palSetPadMode(GPIOPort, ACH3, PAL_MODE_ALTERNATE(1)); - - palSetPadMode(GPIOComp, BCH1, PAL_MODE_ALTERNATE(1)); - palSetPadMode(GPIOComp, BCH2, PAL_MODE_ALTERNATE(1)); - palSetPadMode(GPIOComp, BCH3, PAL_MODE_ALTERNATE(1)); - - -//* - pwmEnableChannel(&PWMD1,PWM_CH1,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.u)); - pwmEnableChannel(&PWMD1,PWM_CH2,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.v)); - pwmEnableChannel(&PWMD1,PWM_CH3,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.w)); -//*/ - - // enable pwm center aligned mode -// PWMD1.tim->CR1 |= STM32_TIM_CR1_CMS(0x01); - - pwmEnableChannelNotification(&PWMD1,PWM_CH1); - pwmEnableChannelNotification(&PWMD1,PWM_CH2); - pwmEnableChannelNotification(&PWMD1,PWM_CH3); -} - -extern void bldcStart(){ - -} - -extern void bldcStop(){ - -} - -extern void bldcSinStart(){ - -} - diff --git a/src/archive/app_acs_bldc_f4/source/acs_bldc.h b/src/archive/app_acs_bldc_f4/source/acs_bldc.h deleted file mode 100644 index fbb61b72..00000000 --- a/src/archive/app_acs_bldc_f4/source/acs_bldc.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef ACS_BLDC_H -#define ACS_BLDC_H - -#include "ch.h" -#include "hal.h" - -typedef struct{ - int u; - int v; - int w; - int count; - int sinctrl_size; - int phase_shift; -} BldcConfig; - -#define GPIOPort GPIOA -// Pin number -#define ACH1 8U -#define ACH2 9U -#define ACH3 10U - -#define GPIOComp GPIOB -#define BCH1 13U -#define BCH2 14U -#define BCH3 15U - - -/* -#define PWM_TIMER_FREQ 40000U -#define PWM_FREQ 360U // periods per sec -//*/ -//* -//#define PWM_TIMER_FREQ 40000 // Hz -#define PWM_TIMER_FREQ 1e6 // Hz -#define PWM_FREQ 20000// periods per sec -//*/ -#define PWM_PERIOD PWM_TIMER_FREQ/PWM_FREQ - -#define PWM_CH1 0U -#define PWM_CH2 1U -#define PWM_CH3 2U - -#define PWM_DC_CH1 2000U -#define PWM_DC_CH2 4000U -#define PWM_DC_CH3 8000U - -extern void bldcInit(void); -extern void bldcStart(void); -extern void bldcStop(void); - -extern void bldcSinStart(void); - -#endif diff --git a/src/archive/app_acs_bldc_f4/source/thread1.c b/src/archive/app_acs_bldc_f4/source/thread1.c deleted file mode 100644 index 031e4904..00000000 --- a/src/archive/app_acs_bldc_f4/source/thread1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "thread1.h" - -// Example blinker thread -THD_WORKING_AREA(waThread1, 128); -THD_FUNCTION(Thread1, arg) { - - (void)arg; - chRegSetThreadName("thread1"); - - while (!chThdShouldTerminateX()) { - palClearLine(LINE_LED_GREEN); - chThdSleepMilliseconds(500); - palSetLine(LINE_LED_GREEN); - chThdSleepMilliseconds(500); - } -} diff --git a/src/archive/app_acs_bldc_f4/source/thread1.h b/src/archive/app_acs_bldc_f4/source/thread1.h deleted file mode 100644 index 32f225d5..00000000 --- a/src/archive/app_acs_bldc_f4/source/thread1.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _THREAD1_H_ -#define _THREAD1_H_ - -#include "ch.h" -#include "hal.h" - -// Example blinker thread prototypes -extern THD_WORKING_AREA(waThread1, 128); -extern THD_FUNCTION(Thread1, arg); - -#endif diff --git a/src/archive/app_ax5043_HDLC_rx/Makefile b/src/archive/app_ax5043_HDLC_rx/Makefile deleted file mode 100644 index 2d3f679b..00000000 --- a/src/archive/app_ax5043_HDLC_rx/Makefile +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = HDLC_FEC_RX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_ax5043_HDLC_rx/README.md b/src/archive/app_ax5043_HDLC_rx/README.md deleted file mode 100644 index 251e4488..00000000 --- a/src/archive/app_ax5043_HDLC_rx/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_sx1236_FulDuplex_ground - -This is used to transmit semtech radio packets signal. -This creates a instruction packet at 735.5 MhZ in a fixed interval. This code simulates ground. This pairs with " app_sx1236_FulDuplex_oresat " which receives the instruction and responds with data. the sent and received packet are shown in serial terminal. - diff --git a/src/archive/app_ax5043_HDLC_rx/conf/chconf.h b/src/archive/app_ax5043_HDLC_rx/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_ax5043_HDLC_rx/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_HDLC_rx/conf/halconf.h b/src/archive/app_ax5043_HDLC_rx/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_ax5043_HDLC_rx/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_HDLC_rx/conf/mcuconf.h b/src/archive/app_ax5043_HDLC_rx/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_ax5043_HDLC_rx/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_HDLC_rx/main.c b/src/archive/app_ax5043_HDLC_rx/main.c deleted file mode 100644 index 87a2e556..00000000 --- a/src/archive/app_ax5043_HDLC_rx/main.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - -//#include "adf7030.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0 -}; - - -/* - * Initialize the SPI drivers and configure the adf7030 chips - */ -static void app_init(void) -{ - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - chThdSleepMilliseconds(1000); - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - //spiSelect(&SPID2); - chThdSleepMilliseconds(1000); - - - - - //uint16_t reg=0; - uint8_t value=0; - uint8_t value1=0x55; - uint8_t ret_value[3]={0,0,0}; - //int i; - - - ax5043_read_reg(&SPID2, AX5043_REG_REV, value, ret_value); - chThdSleepMilliseconds(1500); - - - ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, value, ret_value); - chprintf(DEBUG_CHP, "\r\r scratch ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); - ax5043_write_reg(&SPID2, AX5043_REG_SCRATCH, value1, ret_value); - chprintf(DEBUG_CHP, "\r\r scratch ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); - ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, value, ret_value); - chprintf(DEBUG_CHP, "\r\r scratch ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - - - chprintf(DEBUG_CHP, "Configuring AX5043\r\n"); - chThdSleepMilliseconds(50); - ax5043_init(&SPID2); - chprintf(DEBUG_CHP, "done reseting AX5043\r\n"); - - - - ax5043_prepare_rx(&SPID2); - - - - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - /* Enabling events on both edges of the button line.*/ - //palEnableLineEvent(LINE_BUTTON, PAL_EVENT_MODE_RISING_EDGE); - palEnableLineEvent(LINE_ARD_A5, PAL_EVENT_MODE_RISING_EDGE); - //ax5043_write_reg(&SPID2, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - //ax5043_write_reg(&SPID2, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - //ax5043_write_reg(&SPID2, AX5043_REG_IRQREQUEST0, (uint8_t)0x00, ret_value); - //ax5043_write_reg(&SPID2, AX5043_REG_IRQREQUEST1, (uint8_t)0x00, ret_value); - - while(true) - { - //palWaitLineTimeout(LINE_BUTTON, TIME_INFINITE); - //palWaitLineTimeout(LINE_ARD_A5, TIME_INFINITE); - palWaitLineTimeout(LINE_ARD_A5, TIME_MS2I(5000)); - - if (palReadLine(LINE_ARD_A5)) - chprintf(DEBUG_CHP, "\r\r int line is HIGH ** \r\n"); - else - chprintf(DEBUG_CHP, "\r\r int line is LOW ** \r\n"); -/* - ax5043_read_reg(&SPID2, AX5043_REG_IRQREQUEST0, value, ret_value); - chprintf(DEBUG_CHP, "\r\r IRQREQUEST0 ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); - ax5043_read_reg(&SPID2, AX5043_REG_IRQREQUEST1, value, ret_value); - chprintf(DEBUG_CHP, "\r\r IRQREQUEST1 ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); - ax5043_read_reg(&SPID2, AX5043_REG_RADIOEVENTREQ0, value, ret_value); - chprintf(DEBUG_CHP, "\r\r RADIOEVENTREQ0 ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); - ax5043_read_reg(&SPID2, AX5043_REG_RADIOEVENTREQ1, value, ret_value); - chprintf(DEBUG_CHP, "\r\r RADIOEVENTREQ1 ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); - ax5043_read_reg(&SPID2, AX5043_REG_IRQMASK0, value, ret_value); - chprintf(DEBUG_CHP, "\r\r IRQMASK0 ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); - ax5043_read_reg(&SPID2, AX5043_REG_IRQMASK1, value, ret_value); - chprintf(DEBUG_CHP, "\r\r IRQMASK1 ret_value=0x%x 0x%x, --\r\n", ret_value[0],ret_value[1]); -*/ - chprintf(DEBUG_CHP, "Reading FIFO\r\n"); - //ax5043_receive(&SPID2); - receive_loop(&SPID2); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_HDLC_rx/source/README.md b/src/archive/app_ax5043_HDLC_rx/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_HDLC_rx/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_HDLC_rx/source/ax5043.c b/src/archive/app_ax5043_HDLC_rx/source/ax5043.c deleted file mode 100644 index 1902a9a8..00000000 --- a/src/archive/app_ax5043_HDLC_rx/source/ax5043.c +++ /dev/null @@ -1,1273 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043.h" - - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_phy_pn9 = 0; -const uint8_t axradio_phy_nrchannels = 1; -const uint32_t axradio_phy_chanfreq[1] = { 0x0912aaab }; -const uint8_t axradio_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_phy_chanvcoiinit[1] = { 0x98 }; -uint8_t axradio_phy_chanpllrng[1]; -uint8_t axradio_phy_chanvcoi[1]; -const uint8_t axradio_phy_vcocalib = 0; -const int32_t axradio_phy_maxfreqoffset = 913; -const int8_t axradio_phy_rssioffset = 64; -// axradio_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_phy_rssireference = (int8_t)(0xF9 + 64); -const int8_t axradio_phy_channelbusy = -87 + 64; -const uint16_t axradio_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_phy_cs_enabled = 0; -const uint8_t axradio_phy_lbt_retries = 0; -const uint8_t axradio_phy_lbt_forcetx = 0; -const uint16_t axradio_phy_preamble_wor_longlen = 23; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_phy_preamble_wor_len = 184; -const uint16_t axradio_phy_preamble_longlen = 0; -const uint16_t axradio_phy_preamble_len = 72; -const uint8_t axradio_phy_preamble_byte = 0x7e; -const uint8_t axradio_phy_preamble_flags = 0x38; -const uint8_t axradio_phy_preamble_appendbits = 0; -const uint8_t axradio_phy_preamble_appendpattern = 0x00; - -//framing variables generated from radiolab -const uint8_t axradio_framing_maclen = 3; -const uint8_t axradio_framing_addrlen = 1; -const uint8_t axradio_framing_destaddrpos = 0; -const uint8_t axradio_framing_sourceaddrpos = 0xff; -const uint8_t axradio_framing_lenpos = 2; -const uint8_t axradio_framing_lenoffs = 0; -const uint8_t axradio_framing_lenmask = 0xff; -const uint8_t axradio_framing_swcrclen = 0; - -const uint8_t axradio_framing_synclen = 32; -const uint8_t axradio_framing_syncword[] = { 0xcc, 0xaa, 0xcc, 0xaa}; -const uint8_t axradio_framing_syncflags = 0x38; -const uint8_t axradio_framing_enable_sfdcallback = 0; - -const uint32_t axradio_framing_ack_timeout = 8; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_framing_ack_retransmissions = 0; -const uint8_t axradio_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_wor_period = 128; -const uint8_t axradio_phy_innerfreqloop = 0; - -/** - * writes to an AX5043 register. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -uint8_t ax5043_write_reg_spi(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0}; - - if(reg < 0x0070) - { - command_buf[0]=0x80|reg; - command_buf[1]=value; - //chprintf(DEBUG_CHP, "\r\r written [0]=0x%x, [1]=0x%x--\r\n", command_buf[0],command_buf[1]); - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r read after writting [0]=0x%x, [1]=0x%x--\r\n", ret_value[0],ret_value[1]); - } - else - { - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - //chprintf(DEBUG_CHP, "\r\r written [0]=0x%x, [1]=0x%x, [2]=0x%x--\r\n", command_buf[0],command_buf[1],command_buf[2]); - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r read after writting [0]=0x%x, [1]=0x%x , [2]=0x%x--\r\n", ret_value[0],ret_value[1],ret_value[2]); - } - return ret_value[0]; //retun status while writting the register - -} - - -/** - * Writes to an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -void ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - //uint8_t return_val; - //int num_retries = 1; - //return_val=ax5043_write_reg_spi(spip, reg, value, ret_value); - ax5043_write_reg_spi(spip, reg, value, ret_value); - -/* - while (num_retries > 0 && return_val != 0x80) - { - chThdSleepMicroseconds(100); - return_val=ax5043_write_reg_spi(spip, reg, value, ret_value); - num_retries--; - //chprintf(DEBUG_CHP, "\r\r num_retries= %d --\r\n", num_retries); - }*/ - -} - -/** - * Reds an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value in the register. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0 }; - //uint8_t rx_buf[2]={0 ,0 }; - - if(reg < 0x0070) - { - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r spi read reg=0x%x, value=0x%x ret=0x%x %x--\r\n", command_buf[0],command_buf[1], ret_value[0],ret_value[1]); - return ret_value[1]; //return the reg value when reading the register - } - else - { - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r spi read reg=0x%x %x, value=0x%x ret=0x%x %x %x--\r\n", command_buf[0],command_buf[1],command_buf[2],ret_value[0],ret_value[1],ret_value[2]); - return ret_value[2]; //return the reg value when reading the register - } - -} - - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -void ax5043_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x24, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x30, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x88, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x89, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x82, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xC8, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); // - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); // - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x8A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xEB, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x20, ret_value); //original 20, accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); - - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTSTOREFLAGS, (uint8_t)0x15, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xB5, ret_value); -} - -/** - * Shutdown after reset the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_shutdown(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * Standby the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_standby(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Enable FIFO in AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_fifo_en(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FIFO_ENABLED; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * put AX5043 in synthesizer RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * changes AX5043 to full RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * put AX5043 in synthesizer TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * changes AX5043 to full TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - - - - - -/** - * Resets the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_reset(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - //spiUnselect(spip); - //chThdSleepMicroseconds(10); - - //Reset the chip through powermode register - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(1); - //chThdSleepMicroseconds(5); - - //read the powermode register - value=ax5043_read_reg(&SPID2, AX5043_REG_PWRMODE, value, ret_value); - //write to powermode register for enabling XOEN and REFIN and shutdown mode - //page 33 in programming manual - //value = value | AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT; - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - chThdSleepMilliseconds(10); - - //ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA) - { - chprintf(DEBUG_CHP, "Scratch register does not match 0\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - chThdSleepMilliseconds(10); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55) - { - chprintf(DEBUG_CHP, "Scratch register does not match 1\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x02, ret_value); - chThdSleepMilliseconds(10); - - -} - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_set_regs_tx(spip); - ax5043_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)0x32, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)0x34, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)0x00, ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)0x00, ret_value); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - //ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_set_regs_rx(spip); - ax5043_init_registers_common(spip); - - - //follows code from function ax5043_receiver_on_continuous() in easyax5043.c from radiolab - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_phy_rssireference, ret_value); - ax5043_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)0x33, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)0x34, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)0x00, ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)0x00, ret_value); - -} - - -void ax5043_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - -uint8_t axradio_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_phy_chanpllrng[0] & 0x0F) - (axradio_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_init(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - //int num_retries; - //uint8_t pll_range_done = 0; - //uint8_t pll_range_after; - //uint8_t vcoi_save; - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); //reset is causing problems and hence disabling it.need to remove it - - //adding two more lines to diable the interrupts. Need to remove it later - //ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - - //ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - //ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - - //PLL autoranging - uint8_t r; - if( !(axradio_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - -/** - * Transmits a packet. Not used in thsi version of code. - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_transmit(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - int i=0; - ax5043_full_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - //send out the preamble - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x02), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xE0, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - - //sync word - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xA1, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x18, ret_value);//sync flags - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xAA, ret_value); - - -/* seems this will not get executed based on logic - //send out the preamble. again? - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x02), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - - //writting preamble based on address register. pretty weird. - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x41), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x1C, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value); -*/ - - //write MAC and packet - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)AX5043_DATA_CMD, ret_value);//The data follows - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x0C, ret_value);//packet length - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x03, ret_value);//packet details like raw packet - - - //length - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x0B, ret_value); - //address values - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x33, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x34, ret_value); - for (i=0;i<8;i++) - { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x36, ret_value);//some random data - } - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - - -} - -/** - * read FIFO packet for a packet - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_receive(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - //ax5043_full_rx(spip); - //ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO status value 0x%x \r\n", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO Data 0x%x \r\n", value); - while(!(ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value)&0x01)) - { - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "0x%x ", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO 0x%x \r\n", value); - } - - chprintf(DEBUG_CHP, "\r\r finished reading FIFO--\r\n", value); - - -} - - - -/** - * writes to FIFO - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - -/** - * Transmits a packet - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_phy_preamble_appendbits); - byte |= 0x80 >> axradio_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_phy_preamble_appendbits); - byte |= 0x01 << axradio_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit_isr \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_framing_maclen); - memcpy(&axradio_txbuffer[axradio_framing_maclen], pkt, pktlen); - if (axradio_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_destaddrpos], &addr->addr, axradio_framing_addrlen); - if (axradio_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_framing_addrlen); - if (axradio_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_framing_lenoffs) & axradio_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_framing_lenpos] = (axradio_txbuffer[axradio_framing_lenpos] & (uint8_t)~axradio_framing_lenmask) | len_byte; - } -/* - if (axradio_framing_swcrclen) - axradio_txbuffer_len = axradio_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_phy_preamble_longlen; -*/ - ax5043_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - -uint8_t axradio_rxbuffer[256]; - - - -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) { - uint8_t ret_value[3]={0,0,0}; - uint8_t loc = 0; - while (len--) { - axradio_rxbuffer[loc] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP,"Packet: %x \r\n", axradio_rxbuffer[loc]); - loc++; - } - return loc; -} - - - - - -uint8_t receive_loop(SPIDriver * spip) { - uint8_t ret_value[3]={0,0,0}; - uint8_t fifo_cmd; - uint8_t i; - uint8_t b0; - uint8_t b1; - uint8_t b2; - uint8_t b3; - uint8_t len = ax5043_read_reg(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); // clear request so interrupt does not fire again. sync_rx enables interrupt on radio state changed in order to wake up on SDF detected - - uint8_t bytesRead = 0; - - - chprintf(DEBUG_CHP,"INFO: Waiting for a packet\r\n"); - while ((ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value) & 0x01) != 1) { // FIFO not empty - fifo_cmd = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // read command - len = (fifo_cmd & 0xE0) >> 5; // top 3 bits encode payload len - if (len == 7) - len = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // 7 means variable length, -> get length byte - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (!len) - break; - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // Discard the flags - --len; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, len); - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (axradio_phy_innerfreqloop || len != 3) - goto dropchunk; - i = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - i &= 0x0F; - i |= 1 + (uint8_t)~(i & 0x08); - b3 = ((int8_t)i) >> 8; - b2 = i; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x%02x\r\n", b3, b2, b1, b0); - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (!axradio_phy_innerfreqloop || len != 2) - goto dropchunk; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: Frequency offset: 0x%02x%02x\r\n", b1, b2); - break; - - case AX5043_FIFOCMD_RSSI: - if (len != 1) - goto dropchunk; - { - int8_t r; - r = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RSSI %d\n", (int)r); - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unknown chunk in FIFO\r\n"); - dropchunk: - chprintf(DEBUG_CHP, "WARNING: Discarding chunk in FIFO\r\n"); - if (!len) - break; - i = len; - do { - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // purge FIFO - } - while (--i); - break; - } - } - - chprintf(DEBUG_CHP, "INFO: Done waiting for a packet\r\n"); - - return bytesRead; - -} - - -//!@ - diff --git a/src/archive/app_ax5043_HDLC_rx/source/ax5043.h b/src/archive/app_ax5043_HDLC_rx/source/ax5043.h deleted file mode 100644 index 0f82d6bb..00000000 --- a/src/archive/app_ax5043_HDLC_rx/source/ax5043.h +++ /dev/null @@ -1,732 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_H -#define _AX5043_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define RX_BAUDRATE 9600 -#define TX_BAUDRATE 9600 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg_spi(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_set_regs(SPIDriver * spip); -void ax5043_set_regs_tx(SPIDriver * spip); -void ax5043_set_regs_rx(SPIDriver * spip); -void ax5043_set_regs_rxcont(SPIDriver * spip); -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_reset(SPIDriver * spip); -void ax5043_prepare_tx(SPIDriver * spip); -void ax5043_prepare_rx(SPIDriver * spip); -void ax5043_init_registers_common(SPIDriver * spip); -uint8_t axradio_get_pllvcoi(SPIDriver * spip); - -void ax5043_init(SPIDriver * spip); -void ax5043_transmit(SPIDriver * spip); -void ax5043_receive(SPIDriver * spip); - - -//functions added from bradenburg's code. -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) ; -uint8_t receive_loop(SPIDriver * spip); - -#endif -//! @} diff --git a/src/archive/app_ax5043_HDLC_tx/Makefile b/src/archive/app_ax5043_HDLC_tx/Makefile deleted file mode 100644 index 2d3f679b..00000000 --- a/src/archive/app_ax5043_HDLC_tx/Makefile +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = HDLC_FEC_RX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_ax5043_HDLC_tx/README.md b/src/archive/app_ax5043_HDLC_tx/README.md deleted file mode 100644 index fbb1fadd..00000000 --- a/src/archive/app_ax5043_HDLC_tx/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_sx1236_ax5043_HDLC_FEC_tx - -This is used to transmit sax5043 radio packets signal. -This creates a instruction packet at 435.5 MhZ in a fixed interval. This code simulates ground. This pairs with " app_sx1236_FulDuplex_oresat " which receives the instruction and responds with data. the sent and received packet are shown in serial terminal. - diff --git a/src/archive/app_ax5043_HDLC_tx/axradiolab_435.5_100.xml b/src/archive/app_ax5043_HDLC_tx/axradiolab_435.5_100.xml deleted file mode 100755 index c4c4e786..00000000 --- a/src/archive/app_ax5043_HDLC_tx/axradiolab_435.5_100.xml +++ /dev/null @@ -1,287 +0,0 @@ - - - -0 -0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -0 -0 -1000.000000 -200 -0 -0 - - -0xAB -0x00 -0 - - -0 -1 -1 -0 -0 -1 - - -0x01 -0x00 -0x01 -0x00 -0x00 -0x01 -0x07 -0x03 -0x01 -0x01 -0x01 -0x0 -0x0 - - -435500000.000000 -1 -0x00 -0x19 -0x02 -0x01 -0x09 -0x09 -1200.000000 -2200.000000 -48000000.000000 -871.000000 -
100000.000000
-300000.000000 -0x09 -0.500000 -25000.000000 -10.000000 -150000.000000 -0x00 -0x00 -0x03 -1 -0 -10 -0 --85 -0 -0 -0 -64655.191974 -
- -32 -0xAA -1 -0 -0x00 -240 -1 -0x02 -32 -0x33553355 -1 -0x02 -0x08 -0x00 -0xC8 -0x01 -0x00 -0x3432 -0x3433 -0xFF -0 -0 -0 -0x2 -0xFFFFFFFF -0x20 -0 -0 -3 -0 -0 -0 -0 -86_A2_40_40_40_40_60_96_8E_6E_B4_AC_AC_61_3F_F0_3A_43_51_20_20_20_20_20_20_20_3A_54_65_73_74_7B_30_30_30_30_31 - - -32768.000000 -200.000000 -3.000000 -180.000000 -10 -3 -600.000000 -0.001495 -0.000458 -0.001923 - - -1 -0 -0 0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 - -
- diff --git a/src/archive/app_ax5043_HDLC_tx/axradiolab_437.5_50.xml b/src/archive/app_ax5043_HDLC_tx/axradiolab_437.5_50.xml deleted file mode 100755 index d2e79562..00000000 --- a/src/archive/app_ax5043_HDLC_tx/axradiolab_437.5_50.xml +++ /dev/null @@ -1,287 +0,0 @@ - - - -0 -0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -0 -0 -1000.000000 -200 -0 -0 - - -0xA9 -0x00 -0 - - -0 -1 -1 -0 -0 -1 - - -0x01 -0x00 -0x01 -0x00 -0x00 -0x01 -0x07 -0x03 -0x01 -0x01 -0x01 -0x0 -0x0 - - -437500000.000000 -1 -0x00 -0x19 -0x02 -0x01 -0x09 -0x09 -1200.000000 -2200.000000 -48000000.000000 -875.000000 -
50000.000000
-200000.000000 -0x09 -0.500000 -12500.000000 -10.000000 -75000.000000 -0x00 -0x00 -0x03 -1 -0 -10 -0 --87 -0 -0 -0 -50000.000000 -
- -32 -0xAA -1 -0 -0x00 -240 -1 -0x02 -32 -0x33553355 -1 -0x02 -0x08 -0x00 -0xC8 -0x01 -0x00 -0x3432 -0x3433 -0xFF -0 -0 -0 -0x2 -0xFFFFFFFF -0x20 -0 -0 -3 -0 -0 -0 -0 -86_A2_40_40_40_40_60_96_8E_6E_B4_AC_AC_61_3F_F0_3A_43_51_20_20_20_20_20_20_20_3A_54_65_73_74_7B_30_30_30_30_31 - - -32768.000000 -200.000000 -3.000000 -180.000000 -10 -3 -600.000000 -0.001495 -0.000458 -0.001923 - - -1 -0 -0 0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 - -
- diff --git a/src/archive/app_ax5043_HDLC_tx/axradiolab_g3ruh.xml b/src/archive/app_ax5043_HDLC_tx/axradiolab_g3ruh.xml deleted file mode 100755 index 1397636e..00000000 --- a/src/archive/app_ax5043_HDLC_tx/axradiolab_g3ruh.xml +++ /dev/null @@ -1,287 +0,0 @@ - - - -0 -0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -0 -0 -1000.000000 -200 -0 -0 - - -0xA3 -0x00 -0 - - -0 -1 -1 -0 -0 -1 - - -0x01 -0x00 -0x01 -0x00 -0x00 -0x01 -0x07 -0x03 -0x01 -0x01 -0x01 -0x0 -0x0 - - -433920000.000000 -1 -0x00 -0x19 -0x02 -0x10 -0x09 -0x0B -1200.000000 -2200.000000 -48000000.000000 -867.840000 -
9600.000000
-50000.000000 -0x08 -0.625000 -3000.000000 -10.000000 -14400.000000 -0x07 -0x00 -0x03 -1 -0 -10 -0 --93 -0 -0 -0 -11999.999520 -
- -40 -0xAA -0 -0 -0xC0 -240 -1 -0x02 -32 -0x33553355 -0 -0x00 -0x00 -0x25 -0xC8 -0x00 -0x00 -0x3432 -0x3433 -0x0 -0 -0 -0 -0x2 -0xFFFFFFFF -0x20 -0 -0 -0 -0 -0 -0 -0 -86_A2_40_40_40_40_60_96_8E_6E_B4_AC_AC_61_3F_F0_3A_43_51_20_20_20_20_20_20_20_3A_54_65_73_74_7B_30_30_30_30_31 - - -32768.000000 -200.000000 -3.000000 -180.000000 -10 -3 -600.000000 -0.001495 -0.000458 -0.001923 - - -1 -0 -0 0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 - -
- diff --git a/src/archive/app_ax5043_HDLC_tx/conf/chconf.h b/src/archive/app_ax5043_HDLC_tx/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_ax5043_HDLC_tx/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_HDLC_tx/conf/halconf.h b/src/archive/app_ax5043_HDLC_tx/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_ax5043_HDLC_tx/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_HDLC_tx/conf/mcuconf.h b/src/archive/app_ax5043_HDLC_tx/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_ax5043_HDLC_tx/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_HDLC_tx/main.c b/src/archive/app_ax5043_HDLC_tx/main.c deleted file mode 100644 index 8c9dfc13..00000000 --- a/src/archive/app_ax5043_HDLC_tx/main.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - - -//#include "adf7030.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x33, 0x34, 0x00, 0x00} -}; -const struct axradio_address_mask localaddr_tx = { - { 0x32, 0x34, 0x00, 0x00}, - { 0xFF, 0x00, 0x00, 0x00} -}; -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3A, 0x43, 0x51, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0x54, 0x65, 0x73, 0x74, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x31 }; -const uint8_t framing_insert_counter = 0; -const uint8_t framing_counter_pos = 0; - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - - -/* - * Initialize the SPI drivers and configure the adf7030 chips - */ -static void app_init(void) -{ - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - chThdSleepMilliseconds(1000); - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - //spiSelect(&SPID2); - chThdSleepMilliseconds(1000); - - - -/* - uint8_t rx_buf[2]={0x00 ,0 }; - uint8_t command_buf[2] = {0x00 ,0x00 }; - - while (true) - { - //uint8_t command_buf[6]; - //uint8_t rx_bufi=0; - - //command_buf[0] = AD_READ_BLK_LADR; - - //command_buf[1] = (uint8_t) (AD_MISC_FW >> 24); - //command_buf[2] = (uint8_t) (AD_MISC_FW >> 16); - //command_buf[3] = (uint8_t) (AD_MISC_FW >> 8); - //command_buf[4] = (uint8_t) (AD_MISC_FW); - //ommand_buf[5] = 0; - //chprintf(DEBUG_CHP, "\r\r request-- 0x%x --\r\n", AD_MISC_FW); - //chprintf(DEBUG_CHP, "\r\r request-- 0x%x %x %x %x %x %x --\r\n", command_buf[0],command_buf[1],command_buf[2],command_buf[3],command_buf[4],command_buf[5]); - - spiSelect(&SPID2); - spiStartExchange(&SPID2, 2, command_buf, rx_buf); - while((SPID2).state != SPI_READY) { } - chprintf(DEBUG_CHP, "\r\r Sent to Radio-- 0x%x 0x%x --\r\n", command_buf[0],command_buf[1]); - chprintf(DEBUG_CHP, "\r\r Radio returned-- 0x%x 0x%x --\r\n", rx_buf[0],rx_buf[1]); - spiUnselect(&SPID2); - chThdSleepMilliseconds(500); - command_buf[0] = command_buf[0] +1; - - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } -*/ - //uint16_t reg=0; - uint8_t value=0; - uint8_t value1=0x55; - uint8_t ret_value[3]={0,0,0}; - //int i; - - - ax5043_read_reg(&SPID2, AX5043_REG_REV, value, ret_value); - chThdSleepMilliseconds(1500); - - - ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, value, ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_SCRATCH, value1, ret_value); - ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, value, ret_value); - chThdSleepMilliseconds(1500); - - - - chprintf(DEBUG_CHP, "Configuring AX5043\r\n"); - chThdSleepMilliseconds(50); - ax5043_init(&SPID2); - chprintf(DEBUG_CHP, "done reseting AX5043\r\n"); - -/* - while(true) - { - - reg = 0x314; - ax5043_write_reg(&SPID2, reg, value1, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg 220 contents=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = 0x314; - ax5043_read_reg(&SPID2, reg, value, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg 220 contents=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = AX5043_REG_SCRATCH; - value1 =value1+1; - ax5043_write_reg(&SPID2, reg, value1, ret_value); - //chprintf(DEBUG_CHP, "\r\r written reg=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value1,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = AX5043_REG_SCRATCH; - ax5043_read_reg(&SPID2, reg, value, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - }*/ - - //ax5043_prepare_tx(&SPID2); - -/* - while(true) - { - //ax5043_prepare_tx(&SPID2); - chThdSleepMilliseconds(3000); - chprintf(DEBUG_CHP, "Writting FIFO\r\n"); - ax5043_transmit(&SPID2); - chThdSleepMilliseconds(1000); - ax5043_shutdown(&SPID2); - } -*/ - -/* - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)AX5043_DATA_CMD, ret_value);//The data follows - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x10, ret_value);//packet length - //ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x24, ret_value);//packet details like raw packet - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x08, ret_value);//packet details like raw packet - for (i=0;i<16;i++) - { - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//some random data - } - ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit -*/ - //ax5043_transmit(&SPID2); - - for (;;) { - static uint8_t demo_packet_[sizeof(demo_packet)]; - uint16_t pkt_counter = 0; - - ++pkt_counter; - memcpy(demo_packet_, demo_packet, sizeof(demo_packet)); - if (framing_insert_counter) { - demo_packet_[framing_counter_pos] = (uint8_t)(pkt_counter & 0xFF); - demo_packet_[framing_counter_pos+1] = (uint8_t)((pkt_counter>>8) & 0xFF); - } - - chprintf(DEBUG_CHP,"INFO: Sending another packet...\r\n"); - transmit_packet(&SPID2, &remoteaddr_tx, demo_packet_, sizeof(demo_packet)); - - chThdSleepMilliseconds(3000); - } - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(500); - chprintf(DEBUG_CHP, "."); - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_HDLC_tx/source/README.md b/src/archive/app_ax5043_HDLC_tx/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_HDLC_tx/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_HDLC_tx/source/ax5043.c b/src/archive/app_ax5043_HDLC_tx/source/ax5043.c deleted file mode 100644 index 1902a9a8..00000000 --- a/src/archive/app_ax5043_HDLC_tx/source/ax5043.c +++ /dev/null @@ -1,1273 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043.h" - - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_phy_pn9 = 0; -const uint8_t axradio_phy_nrchannels = 1; -const uint32_t axradio_phy_chanfreq[1] = { 0x0912aaab }; -const uint8_t axradio_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_phy_chanvcoiinit[1] = { 0x98 }; -uint8_t axradio_phy_chanpllrng[1]; -uint8_t axradio_phy_chanvcoi[1]; -const uint8_t axradio_phy_vcocalib = 0; -const int32_t axradio_phy_maxfreqoffset = 913; -const int8_t axradio_phy_rssioffset = 64; -// axradio_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_phy_rssireference = (int8_t)(0xF9 + 64); -const int8_t axradio_phy_channelbusy = -87 + 64; -const uint16_t axradio_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_phy_cs_enabled = 0; -const uint8_t axradio_phy_lbt_retries = 0; -const uint8_t axradio_phy_lbt_forcetx = 0; -const uint16_t axradio_phy_preamble_wor_longlen = 23; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_phy_preamble_wor_len = 184; -const uint16_t axradio_phy_preamble_longlen = 0; -const uint16_t axradio_phy_preamble_len = 72; -const uint8_t axradio_phy_preamble_byte = 0x7e; -const uint8_t axradio_phy_preamble_flags = 0x38; -const uint8_t axradio_phy_preamble_appendbits = 0; -const uint8_t axradio_phy_preamble_appendpattern = 0x00; - -//framing variables generated from radiolab -const uint8_t axradio_framing_maclen = 3; -const uint8_t axradio_framing_addrlen = 1; -const uint8_t axradio_framing_destaddrpos = 0; -const uint8_t axradio_framing_sourceaddrpos = 0xff; -const uint8_t axradio_framing_lenpos = 2; -const uint8_t axradio_framing_lenoffs = 0; -const uint8_t axradio_framing_lenmask = 0xff; -const uint8_t axradio_framing_swcrclen = 0; - -const uint8_t axradio_framing_synclen = 32; -const uint8_t axradio_framing_syncword[] = { 0xcc, 0xaa, 0xcc, 0xaa}; -const uint8_t axradio_framing_syncflags = 0x38; -const uint8_t axradio_framing_enable_sfdcallback = 0; - -const uint32_t axradio_framing_ack_timeout = 8; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_framing_ack_retransmissions = 0; -const uint8_t axradio_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_wor_period = 128; -const uint8_t axradio_phy_innerfreqloop = 0; - -/** - * writes to an AX5043 register. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -uint8_t ax5043_write_reg_spi(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0}; - - if(reg < 0x0070) - { - command_buf[0]=0x80|reg; - command_buf[1]=value; - //chprintf(DEBUG_CHP, "\r\r written [0]=0x%x, [1]=0x%x--\r\n", command_buf[0],command_buf[1]); - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r read after writting [0]=0x%x, [1]=0x%x--\r\n", ret_value[0],ret_value[1]); - } - else - { - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - //chprintf(DEBUG_CHP, "\r\r written [0]=0x%x, [1]=0x%x, [2]=0x%x--\r\n", command_buf[0],command_buf[1],command_buf[2]); - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r read after writting [0]=0x%x, [1]=0x%x , [2]=0x%x--\r\n", ret_value[0],ret_value[1],ret_value[2]); - } - return ret_value[0]; //retun status while writting the register - -} - - -/** - * Writes to an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -void ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - //uint8_t return_val; - //int num_retries = 1; - //return_val=ax5043_write_reg_spi(spip, reg, value, ret_value); - ax5043_write_reg_spi(spip, reg, value, ret_value); - -/* - while (num_retries > 0 && return_val != 0x80) - { - chThdSleepMicroseconds(100); - return_val=ax5043_write_reg_spi(spip, reg, value, ret_value); - num_retries--; - //chprintf(DEBUG_CHP, "\r\r num_retries= %d --\r\n", num_retries); - }*/ - -} - -/** - * Reds an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value in the register. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0 }; - //uint8_t rx_buf[2]={0 ,0 }; - - if(reg < 0x0070) - { - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r spi read reg=0x%x, value=0x%x ret=0x%x %x--\r\n", command_buf[0],command_buf[1], ret_value[0],ret_value[1]); - return ret_value[1]; //return the reg value when reading the register - } - else - { - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r spi read reg=0x%x %x, value=0x%x ret=0x%x %x %x--\r\n", command_buf[0],command_buf[1],command_buf[2],ret_value[0],ret_value[1],ret_value[2]); - return ret_value[2]; //return the reg value when reading the register - } - -} - - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -void ax5043_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x24, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x30, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x88, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x89, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x82, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xC8, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); // - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); // - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x8A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xEB, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x20, ret_value); //original 20, accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); - - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTSTOREFLAGS, (uint8_t)0x15, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xB5, ret_value); -} - -/** - * Shutdown after reset the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_shutdown(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * Standby the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_standby(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Enable FIFO in AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_fifo_en(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FIFO_ENABLED; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * put AX5043 in synthesizer RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * changes AX5043 to full RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * put AX5043 in synthesizer TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * changes AX5043 to full TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - - - - - -/** - * Resets the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_reset(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - //spiUnselect(spip); - //chThdSleepMicroseconds(10); - - //Reset the chip through powermode register - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(1); - //chThdSleepMicroseconds(5); - - //read the powermode register - value=ax5043_read_reg(&SPID2, AX5043_REG_PWRMODE, value, ret_value); - //write to powermode register for enabling XOEN and REFIN and shutdown mode - //page 33 in programming manual - //value = value | AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT; - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - chThdSleepMilliseconds(10); - - //ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA) - { - chprintf(DEBUG_CHP, "Scratch register does not match 0\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - chThdSleepMilliseconds(10); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55) - { - chprintf(DEBUG_CHP, "Scratch register does not match 1\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x02, ret_value); - chThdSleepMilliseconds(10); - - -} - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_set_regs_tx(spip); - ax5043_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)0x32, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)0x34, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)0x00, ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)0x00, ret_value); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - //ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_set_regs_rx(spip); - ax5043_init_registers_common(spip); - - - //follows code from function ax5043_receiver_on_continuous() in easyax5043.c from radiolab - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_phy_rssireference, ret_value); - ax5043_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)0x33, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)0x34, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)0x00, ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)0x00, ret_value); - -} - - -void ax5043_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - -uint8_t axradio_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_phy_chanpllrng[0] & 0x0F) - (axradio_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_init(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - //int num_retries; - //uint8_t pll_range_done = 0; - //uint8_t pll_range_after; - //uint8_t vcoi_save; - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); //reset is causing problems and hence disabling it.need to remove it - - //adding two more lines to diable the interrupts. Need to remove it later - //ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - - //ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - //ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - - //PLL autoranging - uint8_t r; - if( !(axradio_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - -/** - * Transmits a packet. Not used in thsi version of code. - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_transmit(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - int i=0; - ax5043_full_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - //send out the preamble - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x02), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xE0, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - - //sync word - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xA1, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x18, ret_value);//sync flags - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xAA, ret_value); - - -/* seems this will not get executed based on logic - //send out the preamble. again? - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x02), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - - //writting preamble based on address register. pretty weird. - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x41), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x1C, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value); -*/ - - //write MAC and packet - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)AX5043_DATA_CMD, ret_value);//The data follows - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x0C, ret_value);//packet length - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x03, ret_value);//packet details like raw packet - - - //length - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x0B, ret_value); - //address values - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x33, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x34, ret_value); - for (i=0;i<8;i++) - { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x36, ret_value);//some random data - } - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - - -} - -/** - * read FIFO packet for a packet - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_receive(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - //ax5043_full_rx(spip); - //ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO status value 0x%x \r\n", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO Data 0x%x \r\n", value); - while(!(ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value)&0x01)) - { - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "0x%x ", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO 0x%x \r\n", value); - } - - chprintf(DEBUG_CHP, "\r\r finished reading FIFO--\r\n", value); - - -} - - - -/** - * writes to FIFO - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - -/** - * Transmits a packet - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_phy_preamble_appendbits); - byte |= 0x80 >> axradio_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_phy_preamble_appendbits); - byte |= 0x01 << axradio_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit_isr \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_framing_maclen); - memcpy(&axradio_txbuffer[axradio_framing_maclen], pkt, pktlen); - if (axradio_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_destaddrpos], &addr->addr, axradio_framing_addrlen); - if (axradio_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_framing_addrlen); - if (axradio_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_framing_lenoffs) & axradio_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_framing_lenpos] = (axradio_txbuffer[axradio_framing_lenpos] & (uint8_t)~axradio_framing_lenmask) | len_byte; - } -/* - if (axradio_framing_swcrclen) - axradio_txbuffer_len = axradio_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_phy_preamble_longlen; -*/ - ax5043_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - -uint8_t axradio_rxbuffer[256]; - - - -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) { - uint8_t ret_value[3]={0,0,0}; - uint8_t loc = 0; - while (len--) { - axradio_rxbuffer[loc] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP,"Packet: %x \r\n", axradio_rxbuffer[loc]); - loc++; - } - return loc; -} - - - - - -uint8_t receive_loop(SPIDriver * spip) { - uint8_t ret_value[3]={0,0,0}; - uint8_t fifo_cmd; - uint8_t i; - uint8_t b0; - uint8_t b1; - uint8_t b2; - uint8_t b3; - uint8_t len = ax5043_read_reg(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); // clear request so interrupt does not fire again. sync_rx enables interrupt on radio state changed in order to wake up on SDF detected - - uint8_t bytesRead = 0; - - - chprintf(DEBUG_CHP,"INFO: Waiting for a packet\r\n"); - while ((ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value) & 0x01) != 1) { // FIFO not empty - fifo_cmd = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // read command - len = (fifo_cmd & 0xE0) >> 5; // top 3 bits encode payload len - if (len == 7) - len = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // 7 means variable length, -> get length byte - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (!len) - break; - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // Discard the flags - --len; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, len); - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (axradio_phy_innerfreqloop || len != 3) - goto dropchunk; - i = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - i &= 0x0F; - i |= 1 + (uint8_t)~(i & 0x08); - b3 = ((int8_t)i) >> 8; - b2 = i; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x%02x\r\n", b3, b2, b1, b0); - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (!axradio_phy_innerfreqloop || len != 2) - goto dropchunk; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: Frequency offset: 0x%02x%02x\r\n", b1, b2); - break; - - case AX5043_FIFOCMD_RSSI: - if (len != 1) - goto dropchunk; - { - int8_t r; - r = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RSSI %d\n", (int)r); - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unknown chunk in FIFO\r\n"); - dropchunk: - chprintf(DEBUG_CHP, "WARNING: Discarding chunk in FIFO\r\n"); - if (!len) - break; - i = len; - do { - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // purge FIFO - } - while (--i); - break; - } - } - - chprintf(DEBUG_CHP, "INFO: Done waiting for a packet\r\n"); - - return bytesRead; - -} - - -//!@ - diff --git a/src/archive/app_ax5043_HDLC_tx/source/ax5043.h b/src/archive/app_ax5043_HDLC_tx/source/ax5043.h deleted file mode 100644 index 0f82d6bb..00000000 --- a/src/archive/app_ax5043_HDLC_tx/source/ax5043.h +++ /dev/null @@ -1,732 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_H -#define _AX5043_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define RX_BAUDRATE 9600 -#define TX_BAUDRATE 9600 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg_spi(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_set_regs(SPIDriver * spip); -void ax5043_set_regs_tx(SPIDriver * spip); -void ax5043_set_regs_rx(SPIDriver * spip); -void ax5043_set_regs_rxcont(SPIDriver * spip); -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_reset(SPIDriver * spip); -void ax5043_prepare_tx(SPIDriver * spip); -void ax5043_prepare_rx(SPIDriver * spip); -void ax5043_init_registers_common(SPIDriver * spip); -uint8_t axradio_get_pllvcoi(SPIDriver * spip); - -void ax5043_init(SPIDriver * spip); -void ax5043_transmit(SPIDriver * spip); -void ax5043_receive(SPIDriver * spip); - - -//functions added from bradenburg's code. -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) ; -uint8_t receive_loop(SPIDriver * spip); - -#endif -//! @} diff --git a/src/archive/app_ax5043_driver/Makefile b/src/archive/app_ax5043_driver/Makefile deleted file mode 100644 index bcf1683b..00000000 --- a/src/archive/app_ax5043_driver/Makefile +++ /dev/null @@ -1,208 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = hard -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_ax45043_driver - -# Target settings. -MCU = cortex-m4 -BOARD = ORESAT_C3_V3 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -#include $(PROJ_SRC)/oresat.mk -include $(PROJ_SRC)/si41xx.mk -include $(PROJ_SRC)/ax5043.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -include $(CHIBIOS)/test/lib/test.mk -include $(CHIBIOS)/test/rt/rt_test.mk -include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk -include $(CHIBIOS)/os/various/shell/shell.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -DSHELL_CONFIG_FILE -DAX5043_SHARED_SPI -DSI41XX_DEVICE=SI4112 - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_ax5043_driver/README.md b/src/archive/app_ax5043_driver/README.md deleted file mode 100644 index 8befef31..00000000 --- a/src/archive/app_ax5043_driver/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_ax45043_driver - -This is used to transmit ax5043 radio packets signal. -This creates a instruction packet at 435.5 MhZ in a fixed interval. This code simulates ground. This in TX mode pairs with " app_ax5043_engr_rx ". The sent and received packet numbers are shown in serial terminal. - diff --git a/src/archive/app_ax5043_driver/Supporting_Py/ax5043_config_str.txt b/src/archive/app_ax5043_driver/Supporting_Py/ax5043_config_str.txt deleted file mode 100644 index 914f7a0e..00000000 --- a/src/archive/app_ax5043_driver/Supporting_Py/ax5043_config_str.txt +++ /dev/null @@ -1,280 +0,0 @@ -AX5043_REV -AX5043_SCRATCH -AX5043_PWRMODE -AX5043_POWSTAT -AX5043_POWSTICKYSTAT -AX5043_POWIRQMASK -AX5043_IRQMASK1 -AX5043_IRQMASK0 -AX5043_RADIOEVENTMASK1 -AX5043_RADIOEVENTMASK0 -AX5043_IRQREQUEST1 -AX5043_IRQREQUEST0 -AX5043_RADIOEVENTREQ1 -AX5043_RADIOEVENTREQ0 -AX5043_MODULATION -AX5043_ENCODING -AX5043_FRAMING -AX5043_CRCINIT3 -AX5043_CRCINIT2 -AX5043_CRCINIT1 -AX5043_CRCINIT0 -AX5043_FEC -AX5043_FECSYNC -AX5043_FECSTATUS -AX5043_RADIOSTATE -AX5043_XTALSTATUS -AX5043_PINSTATE -AX5043_PINFUNCSYSCLK -AX5043_PINFUNCDCLK -AX5043_PINFUNCDATA -AX5043_PINFUNCIRQ -AX5043_PINFUNCANTSEL -AX5043_PINFUNCPWRAMP -AX5043_PWRAMP -AX5043_FIFOSTAT -AX5043_FIFODATA -AX5043_FIFOCOUNT1 -AX5043_FIFOCOUNT0 -AX5043_FIFOFREE1 -AX5043_FIFOFREE0 -AX5043_FIFOTHRESH1 -AX5043_FIFOTHRESH0 -AX5043_PLLLOOP -AX5043_PLLCPI -AX5043_PLLVCODIV -AX5043_PLLRANGINGA -AX5043_FREQA3 -AX5043_FREQA2 -AX5043_FREQA1 -AX5043_FREQA0 -AX5043_PLLLOOPBOOST -AX5043_PLLCPIBOOST -AX5043_PLLRANGINGB -AX5043_FREQB3 -AX5043_FREQB2 -AX5043_FREQB1 -AX5043_FREQB0 -AX5043_RSSI -AX5043_BGNDRSSI -AX5043_DIVERSITY -AX5043_AGCCOUNTER -AX5043_TRKDATARATE2 -AX5043_TRKDATARATE1 -AX5043_TRKDATARATE0 -AX5043_TRKAMPL1 -AX5043_TRKAMPL0 -AX5043_TRKPHASE1 -AX5043_TRKPHASE0 -AX5043_TRKRFFREQ2 -AX5043_TRKRFFREQ1 -AX5043_TRKRFFREQ0 -AX5043_TRKFREQ1 -AX5043_TRKFREQ0 -AX5043_TRKFSKDEMOD1 -AX5043_TRKFSKDEMOD0 -AX5043_TIMER2 -AX5043_TIMER1 -AX5043_TIMER0 -AX5043_WAKEUPTIMER1 -AX5043_WAKEUPTIMER0 -AX5043_WAKEUP1 -AX5043_WAKEUP0 -AX5043_WAKEUPFREQ1 -AX5043_WAKEUPFREQ0 -AX5043_WAKEUPXOEARLY -AX5043_IFFREQ1 -AX5043_IFFREQ0 -AX5043_DECIMATION -AX5043_RXDATARATE2 -AX5043_RXDATARATE1 -AX5043_RXDATARATE0 -AX5043_MAXDROFFSET2 -AX5043_MAXDROFFSET1 -AX5043_MAXDROFFSET0 -AX5043_MAXRFOFFSET2 -AX5043_MAXRFOFFSET1 -AX5043_MAXRFOFFSET0 -AX5043_FSKDMAX1 -AX5043_FSKDMAX0 -AX5043_FSKDMIN1 -AX5043_FSKDMIN0 -AX5043_AFSKSPACE1 -AX5043_AFSKSPACE0 -AX5043_AFSKMARK1 -AX5043_AFSKMARK0 -AX5043_AFSKCTRL -AX5043_AMPLFILTER -AX5043_FREQUENCYLEAK -AX5043_RXPARAMSETS -AX5043_RXPARAMCURSET -AX5043_AGCGAIN0 -AX5043_AGCTARGET0 -AX5043_AGCAHYST0 -AX5043_AGCMINMAX0 -AX5043_TIMEGAIN0 -AX5043_DRGAIN0 -AX5043_PHASEGAIN0 -AX5043_FREQUENCYGAINA0 -AX5043_FREQUENCYGAINB0 -AX5043_FREQUENCYGAINC0 -AX5043_FREQUENCYGAIND0 -AX5043_AMPLITUDEGAIN0 -AX5043_FREQDEV10 -AX5043_FREQDEV00 -AX5043_FOURFSK0 -AX5043_BBOFFSRES0 -AX5043_AGCGAIN1 -AX5043_AGCTARGET1 -AX5043_AGCAHYST1 -AX5043_AGCMINMAX1 -AX5043_TIMEGAIN1 -AX5043_DRGAIN1 -AX5043_PHASEGAIN1 -AX5043_FREQUENCYGAINA1 -AX5043_FREQUENCYGAINB1 -AX5043_FREQUENCYGAINC1 -AX5043_FREQUENCYGAIND1 -AX5043_AMPLITUDEGAIN1 -AX5043_FREQDEV11 -AX5043_FREQDEV01 -AX5043_FOURFSK1 -AX5043_BBOFFSRES1 -AX5043_AGCGAIN2 -AX5043_AGCTARGET2 -AX5043_AGCAHYST2 -AX5043_AGCMINMAX2 -AX5043_TIMEGAIN2 -AX5043_DRGAIN2 -AX5043_PHASEGAIN2 -AX5043_FREQGAINA2 -AX5043_FREQGAINB2 -AX5043_FREQGAINC2 -AX5043_FREQGAIND2 -AX5043_AMPLGAIN2 -AX5043_FREQDEV12 -AX5043_FREQDEV02 -AX5043_FOURFSK2 -AX5043_BBOFFSRES2 -AX5043_AGCGAIN3 -AX5043_AGCTARGET3 -AX5043_AGCAHYST3 -AX5043_AGCMINMAX3 -AX5043_TIMEGAIN3 -AX5043_DRGAIN3 -AX5043_PHASEGAIN3 -AX5043_FREQUENCYGAINA3 -AX5043_FREQUENCYGAINB3 -AX5043_FREQUENCYGAINC3 -AX5043_FREQUENCYGAIND3 -AX5043_AMPLITUDEGAIN3 -AX5043_FREQDEV13 -AX5043_FREQDEV03 -AX5043_FOURFSK3 -AX5043_BBOFFSRES3 -AX5043_MODCFGF -AX5043_FSKDEV2 -AX5043_FSKDEV1 -AX5043_FSKDEV0 -AX5043_MODCFGA -AX5043_TXRATE2 -AX5043_TXRATE1 -AX5043_TXRATE0 -AX5043_TXPWRCOEFFA1 -AX5043_TXPWRCOEFFA0 -AX5043_TXPWRCOEFFB1 -AX5043_TXPWRCOEFFB0 -AX5043_TXPWRCOEFFC1 -AX5043_TXPWRCOEFFC0 -AX5043_TXPWRCOEFFD1 -AX5043_TXPWRCOEFFD0 -AX5043_TXPWRCOEFFE1 -AX5043_TXPWRCOEFFE0 -AX5043_PLLVCOI -AX5043_PLLVCOIR -AX5043_PLLLOCKDET -AX5043_PLLRNGCLK -AX5043_XTALCAP -AX5043_BBTUNE -AX5043_BBOFFSCAP -AX5043_PKTADDRCFG -AX5043_PKTLENCFG -AX5043_PKTLENOFFSET -AX5043_PKTMAXLEN -AX5043_PKTADDR3 -AX5043_PKTADDR2 -AX5043_PKTADDR1 -AX5043_PKTADDR0 -AX5043_PKTADDRMASK3 -AX5043_PKTADDRMASK2 -AX5043_PKTADDRMASK1 -AX5043_PKTADDRMASK0 -AX5043_MATCH0PAT3 -AX5043_MATCH0PAT2 -AX5043_MATCH0PAT1 -AX5043_MATCH0PAT0 -AX5043_MATCH0LEN -AX5043_MATCH0MIN -AX5043_MATCH0MAX -AX5043_MATCH1PAT1 -AX5043_MATCH1PAT0 -AX5043_MATCH1LEN -AX5043_MATCH1MIN -AX5043_MATCH1MAX -AX5043_TMGTXBOOST -AX5043_TMGTXSETTLE -AX5043_TMGRXBOOST -AX5043_TMGRXSETTLE -AX5043_TMGRXOFFSACQ -AX5043_TMGRXCOARSEAGC -AX5043_TMGRXAGC -AX5043_TMGRXRSSI -AX5043_TMGRXPREAMBLE1 -AX5043_TMGRXPREAMBLE2 -AX5043_TMGRXPREAMBLE3 -AX5043_RSSIREFERENCE -AX5043_RSSIABSTHR -AX5043_BGNDRSSIGAIN -AX5043_BGNDRSSITHR -AX5043_PKTCHUNKSIZE -AX5043_PKTMISCFLAGS -AX5043_PKTSTOREFLAGS -AX5043_PKTACCEPTFLAGS -AX5043_GPADCCTRL -AX5043_GPADCPERIOD -AX5043_GPADC13VALUE1 -AX5043_GPADC13VALUE0 -AX5043_LPOSCCONFIG -AX5043_LPOSCSTATUS -AX5043_LPOSCKFILT1 -AX5043_LPOSCKFILT0 -AX5043_LPOSCREF1 -AX5043_LPOSCREF0 -AX5043_LPOSCFREQ1 -AX5043_LPOSCFREQ0 -AX5043_LPOSCPER1 -AX5043_LPOSCPER0 -AX5043_DACVALUE1 -AX5043_DACVALUE0 -AX5043_DACCONFIG -AX5043_REF -AX5043_0xF00 -AX5043_0xF0C -AX5043_0xF0D -AX5043_XTALOSC -AX5043_XTALAMPL -AX5043_0xF1C -AX5043_0xF18 -AX5043_0xF21 -AX5043_0xF22 -AX5043_0xF23 -AX5043_0xF26 -AX5043_0xF30 -AX5043_0xF31 -AX5043_0xF32 -AX5043_0xF33 -AX5043_0xF34 -AX5043_0xF35 -AX5043_0xF44 -AX5043_0xF72 -AX5043_XTALDIV \ No newline at end of file diff --git a/src/archive/app_ax5043_driver/Supporting_Py/xml_to_csv.py b/src/archive/app_ax5043_driver/Supporting_Py/xml_to_csv.py deleted file mode 100644 index 07298dfe..00000000 --- a/src/archive/app_ax5043_driver/Supporting_Py/xml_to_csv.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Fri Oct 4 14:29:50 2019 - -@author: MALADAS -""" - -import xml.etree.ElementTree as ET -import csv - -#Open config xml -tree = ET.parse("sample_config.xml") -root = tree.getroot() - -#Open structure of config -f= open("ax5043_config_str.txt","r") -regnames = f.readlines() - -# open a file for writing reg values -reg_data = open('ax5043_regs.csv', 'w') -csvwriter = csv.writer(reg_data) - -regs = [] - - -for reg in regnames: - try: - value = root.find(reg.strip()).text - regs.append(value) - except: - regs.append(0x00) - - - -csvwriter.writerow(regs) -reg_data.close() \ No newline at end of file diff --git a/src/archive/app_ax5043_driver/cfg/CO_driver_custom.h b/src/archive/app_ax5043_driver/cfg/CO_driver_custom.h deleted file mode 100644 index 7bbd300e..00000000 --- a/src/archive/app_ax5043_driver/cfg/CO_driver_custom.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef CO_DRIVER_CUSTOM_H -#define CO_DRIVER_CUSTOM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define CO_CONFIG_SDO_CLI (CO_CONFIG_SDO_CLI_ENABLE | \ - CO_CONFIG_SDO_CLI_SEGMENTED | \ - CO_CONFIG_SDO_CLI_BLOCK | \ - CO_CONFIG_SDO_CLI_LOCAL | \ - CO_CONFIG_FLAG_CALLBACK_PRE | \ - CO_CONFIG_FLAG_TIMERNEXT | \ - CO_CONFIG_FLAG_OD_DYNAMIC) - -#define CO_CONFIG_SDO_CLI (CO_CONFIG_FLAG_CALLBACK_PRE | \ - CO_CONFIG_FLAG_TIMERNEXT | \ - CO_CONFIG_SDO_CLI_SEGMENTED | \ - CO_CONFIG_SDO_CLI_BLOCK | \ - CO_CONFIG_SDO_CLI_LOCAL) - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CO_DRIVER_CUSTOM_H */ diff --git a/src/archive/app_ax5043_driver/cfg/chconf.h b/src/archive/app_ax5043_driver/cfg/chconf.h deleted file mode 100644 index 53dfa662..00000000 --- a/src/archive/app_ax5043_driver/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_driver/cfg/halconf.h b/src/archive/app_ax5043_driver/cfg/halconf.h deleted file mode 100644 index 48198c04..00000000 --- a/src/archive/app_ax5043_driver/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS TRUE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS TRUE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_LINE -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_driver/cfg/mcuconf.h b/src/archive/app_ax5043_driver/cfg/mcuconf.h deleted file mode 100644 index 1e200710..00000000 --- a/src/archive/app_ax5043_driver/cfg/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 16 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 8 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 8 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 8 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSE -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 TRUE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_driver/main.c b/src/archive/app_ax5043_driver/main.c deleted file mode 100644 index 1789f042..00000000 --- a/src/archive/app_ax5043_driver/main.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* ChibiOS header files */ -#include "ch.h" -#include "hal.h" -#include "shell.h" - -/* Project header files */ -#include "cmd.h" - -/** - * @brief App Initialization - */ -static void app_init(void) -{ - /* Initialize shell and start serial interface */ - shellInit(); - sdStart(&SD3, NULL); -} - -/** - * @brief Main Application - */ -int main(void) -{ - halInit(); - chSysInit(); - - // Initialize and start - app_init(); - - /* Initialize shell worker thread */ - chThdCreateStatic(cmd_wa, sizeof(cmd_wa), NORMALPRIO, cmd, NULL); - - while (true) { - palToggleLine(LINE_WDT); - chThdSleepMilliseconds(250); - } - return 0; -} diff --git a/src/archive/app_ax5043_driver/main_ax25_rx.c b/src/archive/app_ax5043_driver/main_ax25_rx.c deleted file mode 100644 index 9ccef7a3..00000000 --- a/src/archive/app_ax5043_driver/main_ax25_rx.c +++ /dev/null @@ -1,416 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x32, 0x34, 0x00, 0x00} -}; - -/* -const struct axradio_address_mask localaddr_tx = { - { 0x33, 0x34, 0x00, 0x00}, - { 0xFF, 0x00, 0x00, 0x00} -}; -*/ -// TX: fcarrier=435.500MHz dev= 3.200kHz br= 9.600kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 14.400kHz br= 9.600kBit/s -ax5043_regval_t reg_values[] = { - {AX5043_REG_MODULATION, 0x08,common}, - {AX5043_REG_ENCODING, 0x07,common}, - {AX5043_REG_FRAMING, 0x14,common}, - {AX5043_REG_CRCINIT3, 0x00,common}, - {AX5043_REG_CRCINIT2, 0x00,common}, - {AX5043_REG_CRCINIT1, 0xFF,common}, - {AX5043_REG_CRCINIT0, 0xFF,common}, - {AX5043_REG_PINFUNCSYSCLK, 0x01,common}, - {AX5043_REG_PINFUNCDCLK, 0x01,common}, - {AX5043_REG_PINFUNCDATA, 0x01,common}, - {AX5043_REG_PINFUNCANTSEL, 0x01,common}, - {AX5043_REG_PINFUNCPWRAMP, 0x07,common}, - {AX5043_REG_WAKEUPXOEARLY, 0x01,common}, - {AX5043_REG_IFFREQ1, 0x02,common}, - {AX5043_REG_IFFREQ0, 0x0C,common}, - {AX5043_REG_DECIMATION, 0x14,common}, - {AX5043_REG_RXDATARATE2, 0x00,common}, - {AX5043_REG_RXDATARATE1, 0x3E,common}, - {AX5043_REG_RXDATARATE0, 0x80,common}, - {AX5043_REG_MAXDROFFSET2, 0x00,common}, - {AX5043_REG_MAXDROFFSET1, 0x00,common}, - {AX5043_REG_MAXDROFFSET0, 0x00,common}, - {AX5043_REG_MAXRFOFFSET2, 0x80,common}, - {AX5043_REG_MAXRFOFFSET1, 0x01,common}, - {AX5043_REG_MAXRFOFFSET0, 0x2F,common}, - {AX5043_REG_FSKDMAX1, 0x00,common}, - {AX5043_REG_FSKDMAX0, 0xA6,common}, - {AX5043_REG_FSKDMIN1, 0xFF,common}, - {AX5043_REG_FSKDMIN0, 0x5A,common}, - {AX5043_REG_AMPLFILTER, 0x00,common}, - {AX5043_REG_RXPARAMSETS, 0xF4,common}, - {AX5043_REG_AGCGAIN0, 0xC5,common}, - {AX5043_REG_AGCTARGET0, 0x84,common}, - {AX5043_REG_TIMEGAIN0, 0xF8,common}, - {AX5043_REG_DRGAIN0, 0xF2,common}, - {AX5043_REG_PHASEGAIN0, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA0,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB0,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC0,0x0A,common}, - {AX5043_REG_FREQUENCYGAIND0,0x0A,common}, - {AX5043_REG_AMPLITUDEGAIN0, 0x06,common}, - {AX5043_REG_FREQDEV10, 0x00,common}, - {AX5043_REG_FREQDEV00, 0x00,common}, - {AX5043_REG_BBOFFSRES0, 0x00,common}, - {AX5043_REG_AGCGAIN1, 0xC5,common}, - {AX5043_REG_AGCTARGET1, 0x84,common}, - {AX5043_REG_AGCAHYST1, 0x00,common}, - {AX5043_REG_AGCMINMAX1, 0x00,common}, - {AX5043_REG_TIMEGAIN1, 0xF6,common}, - {AX5043_REG_DRGAIN1, 0xF1,common}, - {AX5043_REG_PHASEGAIN1, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA1,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB1,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC1,0x0A,common}, - {AX5043_REG_FREQUENCYGAIND1,0x0A,common}, - {AX5043_REG_AMPLITUDEGAIN1, 0x06,common}, - {AX5043_REG_FREQDEV11, 0x00,common}, - {AX5043_REG_FREQDEV01, 0x25,common}, - {AX5043_REG_FOURFSK1, 0x16,common}, - {AX5043_REG_BBOFFSRES1, 0x00,common}, - {AX5043_REG_AGCGAIN3, 0xFF,common}, - {AX5043_REG_AGCTARGET3, 0x84,common}, - {AX5043_REG_AGCAHYST3, 0x00,common}, - {AX5043_REG_AGCMINMAX3, 0x00,common}, - {AX5043_REG_TIMEGAIN3, 0xF5,common}, - {AX5043_REG_DRGAIN3, 0xF0,common}, - {AX5043_REG_PHASEGAIN3, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA3,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB3,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC3,0x0D,common}, - {AX5043_REG_FREQUENCYGAIND3,0x0D,common}, - {AX5043_REG_AMPLITUDEGAIN3, 0x06,common}, - {AX5043_REG_FREQDEV13, 0x00,common}, - {AX5043_REG_FREQDEV03, 0x25,common}, - {AX5043_REG_FOURFSK3, 0x16,common}, - {AX5043_REG_BBOFFSRES3, 0x00,common}, - {AX5043_REG_MODCFGF, 0x02,common}, - {AX5043_REG_FSKDEV2, 0x00,common}, - {AX5043_REG_FSKDEV1, 0x04,common}, - {AX5043_REG_FSKDEV0, 0x5E,common}, - {AX5043_REG_MODCFGA, 0x05,common}, - {AX5043_REG_TXRATE2, 0x00,common}, - {AX5043_REG_TXRATE1, 0x0D,common}, - {AX5043_REG_TXRATE0, 0x1B,common}, - {AX5043_REG_TXPWRCOEFFB1, 0x07,common}, - {AX5043_REG_TXPWRCOEFFB0, 0x00,common}, - {AX5043_REG_PLLVCOI, 0x99,common}, - {AX5043_REG_PLLRNGCLK, 0x05,common}, - {AX5043_REG_BBTUNE, 0x0F,common}, - {AX5043_REG_BBOFFSCAP, 0x77,common}, - {AX5043_REG_PKTADDRCFG, 0x00,common}, - {AX5043_REG_PKTLENCFG, 0x00,common}, - {AX5043_REG_PKTLENOFFSET, 0x15,common}, - {AX5043_REG_PKTMAXLEN, 0xF0,common}, - {AX5043_REG_MATCH0PAT3, 0xAA,common}, - {AX5043_REG_MATCH0PAT2, 0xCC,common}, - {AX5043_REG_MATCH0PAT1, 0xAA,common}, - {AX5043_REG_MATCH0PAT0, 0xCC,common}, - {AX5043_REG_MATCH1PAT1, 0x55,common}, - {AX5043_REG_MATCH1PAT0, 0x55,common}, - {AX5043_REG_MATCH1LEN, 0x0A,common}, - {AX5043_REG_MATCH1MAX, 0x0A,common}, - {AX5043_REG_TMGTXBOOST, 0x5B,common}, - {AX5043_REG_TMGTXSETTLE, 0x3E,common}, - {AX5043_REG_TMGRXOFFSACQ, 0x00,common}, - {AX5043_REG_TMGRXCOARSEAGC, 0x9C,common}, - {AX5043_REG_TMGRXRSSI, 0x03,common}, - {AX5043_REG_TMGRXPREAMBLE2, 0x17,common}, - {AX5043_REG_RSSIABSTHR, 0xE3,common}, - {AX5043_REG_BGNDRSSITHR, 0x00,common}, - {AX5043_REG_PKTCHUNKSIZE, 0x0D,common}, - {AX5043_REG_PKTACCEPTFLAGS, 0x39,common}, - {AX5043_REG_DACVALUE1, 0x00,common}, - {AX5043_REG_DACVALUE0, 0x00,common}, - {AX5043_REG_DACCONFIG, 0x00,common}, - {AX5043_REG_REF, 0x03,common}, - {AX5043_REG_XTALOSC, 0x04,common}, - {AX5043_REG_XTALAMPL, 0x00,common}, - {AX5043_REG_0xF1C, 0x07,common}, - {AX5043_REG_0xF21, 0x68,common}, - {AX5043_REG_0xF22, 0XFF,common}, - {AX5043_REG_0xF23, 0x84,common}, - {AX5043_REG_0xF26, 0x98,common}, - {AX5043_REG_0xF34, 0x28,common}, - {AX5043_REG_0xF35, 0x11,common}, - {AX5043_REG_0xF44, 0x25,common}, - {AX5043_REG_PINFUNCIRQ, 0x03,common}, - {AX5043_REG_PKTSTOREFLAGS, 0x14,common}, - {AX5043_REG_PLLLOOP, 0x09,tx}, - {AX5043_REG_PLLCPI, 0x02,tx}, - {AX5043_REG_PLLVCODIV, 0x24,tx}, - {AX5043_REG_XTALCAP, 0x00,tx}, - {AX5043_REG_0xF00, 0x0F,tx}, - {AX5043_REG_0xF18, 0x06,tx}, - {AX5043_REG_PLLLOOP, 0x0B,rx}, - {AX5043_REG_PLLCPI, 0x10,rx}, - {AX5043_REG_PLLVCODIV, 0x25,rx}, - {AX5043_REG_XTALCAP, 0x00,rx}, - {AX5043_REG_0xF00, 0x0F,rx}, - {AX5043_REG_0xF18, 0x02,rx}, - {AX5043_REG_TMGRXAGC, 0x00,rx_cont}, - {AX5043_REG_TMGRXPREAMBLE1, 0x00,rx_cont}, - {AX5043_REG_PKTMISCFLAGS, 0x00,rx_cont}, - {AX5043_REG_PKTADDR0, 0x00,local_address}, - {AX5043_REG_PKTADDR1, 0x00,local_address}, - {AX5043_REG_PKTADDR2, 0x00,local_address}, - {AX5043_REG_PKTADDR3, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK0, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK1, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK2, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK3, 0x00,local_address}, - {AX5043_REG_END, 0x00,common} -}; - - -ax5043_confval_t conf_values[]={ - {AXRADIO_PHY_PN9 ,0}, - {AXRADIO_PHY_NRCHANNELS ,1}, - {AXRADIO_PHY_CHANFREQ ,0X0912AAAB }, - {AXRADIO_PHY_CHANPLLRNGINIT ,0X0A }, - {AXRADIO_PHY_CHANVCOIINIT ,0X98}, - {AXRADIO_PHY_CHANPLLRNG ,0}, - {AXRADIO_PHY_CHANVCOI ,0}, - {AXRADIO_PHY_VCOCALIB ,0}, - {AXRADIO_PHY_MAXFREQOFFSET ,913}, - {AXRADIO_PHY_RSSIOFFSET ,64}, - {AXRADIO_PHY_RSSIREFERENCE ,313}, - {AXRADIO_PHY_CHANNELBUSY ,-23}, - {AXRADIO_PHY_CS_PERIOD ,7}, - {AXRADIO_PHY_CS_ENABLED ,0}, - {AXRADIO_PHY_LBT_RETRIES ,0}, - {AXRADIO_PHY_LBT_FORCETX ,0}, - {AXRADIO_PHY_PREAMBLE_WOR_LONGLEN ,9}, - {AXRADIO_PHY_PREAMBLE_WOR_LEN ,40}, - {AXRADIO_PHY_PREAMBLE_LONGLEN ,0}, - {AXRADIO_PHY_PREAMBLE_LEN ,40}, - {AXRADIO_PHY_PREAMBLE_BYTE ,0X7E}, - {AXRADIO_PHY_PREAMBLE_FLAGS ,0X18}, - {AXRADIO_PHY_PREAMBLE_APPENDBITS ,0}, - {AXRADIO_PHY_PREAMBLE_APPENDPATTERN ,0X00}, - {AXRADIO_FRAMING_MACLEN ,0}, - {AXRADIO_FRAMING_ADDRLEN ,0}, - {AXRADIO_FRAMING_DESTADDRPOS ,0}, - {AXRADIO_FRAMING_SOURCEADDRPOS ,0XFF}, - {AXRADIO_FRAMING_LENPOS ,0}, - {AXRADIO_FRAMING_LENOFFS ,21}, - {AXRADIO_FRAMING_LENMASK ,0X00}, - {AXRADIO_FRAMING_SWCRCLEN ,0}, - {AXRADIO_FRAMING_SYNCLEN ,32}, - {AXRADIO_FRAMING_SYNCWORD0 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD1 ,0XAA}, - {AXRADIO_FRAMING_SYNCWORD2 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD3 ,0XAA}, - {AXRADIO_FRAMING_SYNCFLAGS ,0X18}, - {AXRADIO_FRAMING_ENABLE_SFDCALLBACK ,0}, - {AXRADIO_FRAMING_ACK_TIMEOUT ,8}, - {AXRADIO_FRAMING_ACK_DELAY ,313}, - {AXRADIO_FRAMING_ACK_RETRANSMISSIONS ,0}, - {AXRADIO_FRAMING_ACK_SEQNRPOS ,0XFF}, - {AXRADIO_FRAMING_MINPAYLOADLEN ,0}, - {AXRADIO_WOR_PERIOD ,128}, - {AXRADIO_PHY_INNERFREQLOOP ,0}, - {AXRADIO_PHY_END ,0} -}; - -uint8_t axradio_rxbuffer[256]; //buffer to receive radio data - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0 -}; - -//mailboxes to receive the radio packets -#define NUM_BUFFERS 16 -static msg_t radio1_rx_queue[NUM_BUFFERS]; -static mailbox_t radio1_rx_mb; - - -//Radio driver configurations - -static AX5043Config axcfg1 = -{ - &SPID2, - LINE_SX_INT0, - reg_values, - conf_values, - AX5043_MODE_RX, - &radio1_rx_mb -}; -AX5043Driver axd1; - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - - uint16_t pkt_counter = 0; - - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - - // Creating the mailboxes. - chMBObjectInit(&radio1_rx_mb, radio1_rx_queue, NUM_BUFFERS); - - //initiating radio driver - ax5043ObjectInit(&axd1); - ax5043Start(&axd1, &axcfg1); -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - uint8_t packet_len=0; - //uint8_t ret_value[3]={0,0,0}; - - /* Enabling events on both edges of the button line.*/ - //palEnableLineEvent(LINE_BUTTON, PAL_EVENT_MODE_RISING_EDGE); - palEnableLineEvent(LINE_SX_INT0, PAL_EVENT_MODE_RISING_EDGE); - - - while(true) - { - //palWaitLineTimeout(LINE_BUTTON, TIME_INFINITE); - //palWaitLineTimeout(LINE_ARD_A5, TIME_INFINITE); - //palWaitLineTimeout(LINE_ARD_A5, TIME_MS2I(5000)); - - palWaitLineTimeout(LINE_SX_INT0, TIME_MS2I(5000)); - - if (palReadLine(LINE_SX_INT0)) - chprintf(DEBUG_CHP, "\r\r INFO: interrupt happened ** \r\n"); - else - chprintf(DEBUG_CHP, "\r\r INFO: interrupt timeout** \r\n"); - - packet_len=receive_loop(&axd1, axradio_rxbuffer); - //chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x\r\n", axd1.rf_freq_off3, axd1.rf_freq_off2, axd1.rf_freq_off1); - //chprintf(DEBUG_CHP,"INFO: RSSI %d\r\n", (int)axd1.rssi); - if(packet_len > 0) - chprintf(DEBUG_CHP,"INFO: Received packet %d\r\n",axradio_rxbuffer[3]); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_driver/main_ax25_tx.c b/src/archive/app_ax5043_driver/main_ax25_tx.c deleted file mode 100644 index fd904ef3..00000000 --- a/src/archive/app_ax5043_driver/main_ax25_tx.c +++ /dev/null @@ -1,409 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x33, 0x34, 0x00, 0x00} -}; - -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3E, 0x54, 0x65, 0x73, 0x74 }; -const uint8_t framing_insert_counter = 0; -const uint8_t framing_counter_pos = 0; - -// TX: fcarrier=435.500MHz dev= 3.200kHz br= 9.600kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 14.400kHz br= 9.600kBit/s -ax5043_regval_t reg_values[] = { - {AX5043_REG_MODULATION, 0x08,common}, - {AX5043_REG_ENCODING, 0x07,common}, - {AX5043_REG_FRAMING, 0x14,common}, - {AX5043_REG_CRCINIT3, 0x00,common}, - {AX5043_REG_CRCINIT2, 0x00,common}, - {AX5043_REG_CRCINIT1, 0xFF,common}, - {AX5043_REG_CRCINIT0, 0xFF,common}, - {AX5043_REG_PINFUNCSYSCLK, 0x01,common}, - {AX5043_REG_PINFUNCDCLK, 0x01,common}, - {AX5043_REG_PINFUNCDATA, 0x01,common}, - {AX5043_REG_PINFUNCANTSEL, 0x01,common}, - {AX5043_REG_PINFUNCPWRAMP, 0x07,common}, - {AX5043_REG_WAKEUPXOEARLY, 0x01,common}, - {AX5043_REG_IFFREQ1, 0x02,common}, - {AX5043_REG_IFFREQ0, 0x0C,common}, - {AX5043_REG_DECIMATION, 0x14,common}, - {AX5043_REG_RXDATARATE2, 0x00,common}, - {AX5043_REG_RXDATARATE1, 0x3E,common}, - {AX5043_REG_RXDATARATE0, 0x80,common}, - {AX5043_REG_MAXDROFFSET2, 0x00,common}, - {AX5043_REG_MAXDROFFSET1, 0x00,common}, - {AX5043_REG_MAXDROFFSET0, 0x00,common}, - {AX5043_REG_MAXRFOFFSET2, 0x80,common}, - {AX5043_REG_MAXRFOFFSET1, 0x01,common}, - {AX5043_REG_MAXRFOFFSET0, 0x2F,common}, - {AX5043_REG_FSKDMAX1, 0x00,common}, - {AX5043_REG_FSKDMAX0, 0xA6,common}, - {AX5043_REG_FSKDMIN1, 0xFF,common}, - {AX5043_REG_FSKDMIN0, 0x5A,common}, - {AX5043_REG_AMPLFILTER, 0x00,common}, - {AX5043_REG_RXPARAMSETS, 0xF4,common}, - {AX5043_REG_AGCGAIN0, 0xC5,common}, - {AX5043_REG_AGCTARGET0, 0x84,common}, - {AX5043_REG_TIMEGAIN0, 0xF8,common}, - {AX5043_REG_DRGAIN0, 0xF2,common}, - {AX5043_REG_PHASEGAIN0, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA0,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB0,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC0,0x0A,common}, - {AX5043_REG_FREQUENCYGAIND0,0x0A,common}, - {AX5043_REG_AMPLITUDEGAIN0, 0x06,common}, - {AX5043_REG_FREQDEV10, 0x00,common}, - {AX5043_REG_FREQDEV00, 0x00,common}, - {AX5043_REG_BBOFFSRES0, 0x00,common}, - {AX5043_REG_AGCGAIN1, 0xC5,common}, - {AX5043_REG_AGCTARGET1, 0x84,common}, - {AX5043_REG_AGCAHYST1, 0x00,common}, - {AX5043_REG_AGCMINMAX1, 0x00,common}, - {AX5043_REG_TIMEGAIN1, 0xF6,common}, - {AX5043_REG_DRGAIN1, 0xF1,common}, - {AX5043_REG_PHASEGAIN1, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA1,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB1,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC1,0x0A,common}, - {AX5043_REG_FREQUENCYGAIND1,0x0A,common}, - {AX5043_REG_AMPLITUDEGAIN1, 0x06,common}, - {AX5043_REG_FREQDEV11, 0x00,common}, - {AX5043_REG_FREQDEV01, 0x25,common}, - {AX5043_REG_FOURFSK1, 0x16,common}, - {AX5043_REG_BBOFFSRES1, 0x00,common}, - {AX5043_REG_AGCGAIN3, 0xFF,common}, - {AX5043_REG_AGCTARGET3, 0x84,common}, - {AX5043_REG_AGCAHYST3, 0x00,common}, - {AX5043_REG_AGCMINMAX3, 0x00,common}, - {AX5043_REG_TIMEGAIN3, 0xF5,common}, - {AX5043_REG_DRGAIN3, 0xF0,common}, - {AX5043_REG_PHASEGAIN3, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA3,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB3,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC3,0x0D,common}, - {AX5043_REG_FREQUENCYGAIND3,0x0D,common}, - {AX5043_REG_AMPLITUDEGAIN3, 0x06,common}, - {AX5043_REG_FREQDEV13, 0x00,common}, - {AX5043_REG_FREQDEV03, 0x25,common}, - {AX5043_REG_FOURFSK3, 0x16,common}, - {AX5043_REG_BBOFFSRES3, 0x00,common}, - {AX5043_REG_MODCFGF, 0x02,common}, - {AX5043_REG_FSKDEV2, 0x00,common}, - {AX5043_REG_FSKDEV1, 0x04,common}, - {AX5043_REG_FSKDEV0, 0x5E,common}, - {AX5043_REG_MODCFGA, 0x05,common}, - {AX5043_REG_TXRATE2, 0x00,common}, - {AX5043_REG_TXRATE1, 0x0D,common}, - {AX5043_REG_TXRATE0, 0x1B,common}, - {AX5043_REG_TXPWRCOEFFB1, 0x07,common}, - {AX5043_REG_TXPWRCOEFFB0, 0x00,common}, - {AX5043_REG_PLLVCOI, 0x99,common}, - {AX5043_REG_PLLRNGCLK, 0x05,common}, - {AX5043_REG_BBTUNE, 0x0F,common}, - {AX5043_REG_BBOFFSCAP, 0x77,common}, - {AX5043_REG_PKTADDRCFG, 0x00,common}, - {AX5043_REG_PKTLENCFG, 0x00,common}, - {AX5043_REG_PKTLENOFFSET, 0x15,common}, - {AX5043_REG_PKTMAXLEN, 0xF0,common}, - {AX5043_REG_MATCH0PAT3, 0xAA,common}, - {AX5043_REG_MATCH0PAT2, 0xCC,common}, - {AX5043_REG_MATCH0PAT1, 0xAA,common}, - {AX5043_REG_MATCH0PAT0, 0xCC,common}, - {AX5043_REG_MATCH1PAT1, 0x55,common}, - {AX5043_REG_MATCH1PAT0, 0x55,common}, - {AX5043_REG_MATCH1LEN, 0x0A,common}, - {AX5043_REG_MATCH1MAX, 0x0A,common}, - {AX5043_REG_TMGTXBOOST, 0x5B,common}, - {AX5043_REG_TMGTXSETTLE, 0x3E,common}, - {AX5043_REG_TMGRXOFFSACQ, 0x00,common}, - {AX5043_REG_TMGRXCOARSEAGC, 0x9C,common}, - {AX5043_REG_TMGRXRSSI, 0x03,common}, - {AX5043_REG_TMGRXPREAMBLE2, 0x17,common}, - {AX5043_REG_RSSIABSTHR, 0xE3,common}, - {AX5043_REG_BGNDRSSITHR, 0x00,common}, - {AX5043_REG_PKTCHUNKSIZE, 0x0D,common}, - {AX5043_REG_PKTACCEPTFLAGS, 0x39,common}, - {AX5043_REG_DACVALUE1, 0x00,common}, - {AX5043_REG_DACVALUE0, 0x00,common}, - {AX5043_REG_DACCONFIG, 0x00,common}, - {AX5043_REG_REF, 0x03,common}, - {AX5043_REG_XTALOSC, 0x04,common}, - {AX5043_REG_XTALAMPL, 0x00,common}, - {AX5043_REG_0xF1C, 0x07,common}, - {AX5043_REG_0xF21, 0x68,common}, - {AX5043_REG_0xF22, 0XFF,common}, - {AX5043_REG_0xF23, 0x84,common}, - {AX5043_REG_0xF26, 0x98,common}, - {AX5043_REG_0xF34, 0x28,common}, - {AX5043_REG_0xF35, 0x11,common}, - {AX5043_REG_0xF44, 0x25,common}, - {AX5043_REG_PINFUNCIRQ, 0x03,common}, - {AX5043_REG_PKTSTOREFLAGS, 0x14,common}, - {AX5043_REG_PLLLOOP, 0x09,tx}, - {AX5043_REG_PLLCPI, 0x02,tx}, - {AX5043_REG_PLLVCODIV, 0x24,tx}, - {AX5043_REG_XTALCAP, 0x00,tx}, - {AX5043_REG_0xF00, 0x0F,tx}, - {AX5043_REG_0xF18, 0x06,tx}, - {AX5043_REG_PLLLOOP, 0x0B,rx}, - {AX5043_REG_PLLCPI, 0x10,rx}, - {AX5043_REG_PLLVCODIV, 0x25,rx}, - {AX5043_REG_XTALCAP, 0x00,rx}, - {AX5043_REG_0xF00, 0x0F,rx}, - {AX5043_REG_0xF18, 0x02,rx}, - {AX5043_REG_TMGRXAGC, 0x00,rx_cont}, - {AX5043_REG_TMGRXPREAMBLE1, 0x00,rx_cont}, - {AX5043_REG_PKTMISCFLAGS, 0x00,rx_cont}, - {AX5043_REG_PKTADDR0, 0x00,local_address}, - {AX5043_REG_PKTADDR1, 0x00,local_address}, - {AX5043_REG_PKTADDR2, 0x00,local_address}, - {AX5043_REG_PKTADDR3, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK0, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK1, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK2, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK3, 0x00,local_address}, - {AX5043_REG_END, 0x00,common} -}; - - -ax5043_confval_t conf_values[]={ - {AXRADIO_PHY_PN9 ,0}, - {AXRADIO_PHY_NRCHANNELS ,1}, - {AXRADIO_PHY_CHANFREQ ,0X0912AAAB }, - {AXRADIO_PHY_CHANPLLRNGINIT ,0X0A }, - {AXRADIO_PHY_CHANVCOIINIT ,0X98}, - {AXRADIO_PHY_CHANPLLRNG ,0}, - {AXRADIO_PHY_CHANVCOI ,0}, - {AXRADIO_PHY_VCOCALIB ,0}, - {AXRADIO_PHY_MAXFREQOFFSET ,913}, - {AXRADIO_PHY_RSSIOFFSET ,64}, - {AXRADIO_PHY_RSSIREFERENCE ,313}, - {AXRADIO_PHY_CHANNELBUSY ,-23}, - {AXRADIO_PHY_CS_PERIOD ,7}, - {AXRADIO_PHY_CS_ENABLED ,0}, - {AXRADIO_PHY_LBT_RETRIES ,0}, - {AXRADIO_PHY_LBT_FORCETX ,0}, - {AXRADIO_PHY_PREAMBLE_WOR_LONGLEN ,9}, - {AXRADIO_PHY_PREAMBLE_WOR_LEN ,40}, - {AXRADIO_PHY_PREAMBLE_LONGLEN ,0}, - {AXRADIO_PHY_PREAMBLE_LEN ,40}, - {AXRADIO_PHY_PREAMBLE_BYTE ,0X7E}, - {AXRADIO_PHY_PREAMBLE_FLAGS ,0X18}, - {AXRADIO_PHY_PREAMBLE_APPENDBITS ,0}, - {AXRADIO_PHY_PREAMBLE_APPENDPATTERN ,0X00}, - {AXRADIO_FRAMING_MACLEN ,0}, - {AXRADIO_FRAMING_ADDRLEN ,0}, - {AXRADIO_FRAMING_DESTADDRPOS ,0}, - {AXRADIO_FRAMING_SOURCEADDRPOS ,0XFF}, - {AXRADIO_FRAMING_LENPOS ,0}, - {AXRADIO_FRAMING_LENOFFS ,21}, - {AXRADIO_FRAMING_LENMASK ,0X00}, - {AXRADIO_FRAMING_SWCRCLEN ,0}, - {AXRADIO_FRAMING_SYNCLEN ,32}, - {AXRADIO_FRAMING_SYNCWORD0 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD1 ,0XAA}, - {AXRADIO_FRAMING_SYNCWORD2 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD3 ,0XAA}, - {AXRADIO_FRAMING_SYNCFLAGS ,0X18}, - {AXRADIO_FRAMING_ENABLE_SFDCALLBACK ,0}, - {AXRADIO_FRAMING_ACK_TIMEOUT ,8}, - {AXRADIO_FRAMING_ACK_DELAY ,313}, - {AXRADIO_FRAMING_ACK_RETRANSMISSIONS ,0}, - {AXRADIO_FRAMING_ACK_SEQNRPOS ,0XFF}, - {AXRADIO_FRAMING_MINPAYLOADLEN ,0}, - {AXRADIO_WOR_PERIOD ,128}, - {AXRADIO_PHY_INNERFREQLOOP ,0}, - {AXRADIO_PHY_END ,0} -}; - -uint8_t axradio_rxbuffer[256]; //buffer to receive radio data - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0 -}; - -//mailboxes to receive the radio packets -#define NUM_BUFFERS 16 -static msg_t radio1_rx_queue[NUM_BUFFERS]; -static mailbox_t radio1_rx_mb; - - -//Radio driver configurations - -static AX5043Config axcfg1 = -{ - &SPID2, - LINE_SX_INT0, - reg_values, - conf_values, - AX5043_MODE_TX, - &radio1_rx_mb -}; -AX5043Driver axd1; - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - - uint16_t pkt_counter = 0; - - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - - // Creating the mailboxes. - chMBObjectInit(&radio1_rx_mb, radio1_rx_queue, NUM_BUFFERS); - - //initiating radio driver - ax5043ObjectInit(&axd1); - ax5043Start(&axd1, &axcfg1); - - - - for (;;) { - static uint8_t demo_packet_[sizeof(demo_packet)]; - //uint16_t pkt_counter = 0; - - ++pkt_counter; - memcpy(demo_packet_, demo_packet, sizeof(demo_packet)); - if (framing_insert_counter) { - demo_packet_[framing_counter_pos] = (uint8_t)(pkt_counter & 0xFF); - demo_packet_[framing_counter_pos+1] = (uint8_t)((pkt_counter>>8) & 0xFF); - } - - chprintf(DEBUG_CHP,"INFO: Sending packet %d\r\n",pkt_counter); - transmit_packet(&axd1, &remoteaddr_tx, demo_packet_, sizeof(demo_packet)); - - chThdSleepMilliseconds(5000); - } - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(500); - chprintf(DEBUG_CHP, "."); - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_driver/main_cw.c b/src/archive/app_ax5043_driver/main_cw.c deleted file mode 100644 index 67214fcf..00000000 --- a/src/archive/app_ax5043_driver/main_cw.c +++ /dev/null @@ -1,405 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" -#include "morse.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x33, 0x34, 0x00, 0x00} -}; - -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3A, 0x43, 0x51, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0x54, 0x65, 0x73, 0x74, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x31 }; -const uint8_t framing_insert_counter = 1; -const uint8_t framing_counter_pos = 0; - -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -ax5043_regval_t reg_values[] = { - {AX5043_REG_MODULATION, 0x08,common}, - {AX5043_REG_ENCODING, 0x00,common}, - {AX5043_REG_FRAMING, 0x24,common}, - {AX5043_REG_CRCINIT3, 0x00,common}, - {AX5043_REG_CRCINIT2, 0x00,common}, - {AX5043_REG_CRCINIT1, 0xFF,common}, - {AX5043_REG_CRCINIT0, 0xFF,common}, - {AX5043_REG_PINFUNCSYSCLK, 0x01,common}, - {AX5043_REG_PINFUNCDCLK, 0x01,common}, - {AX5043_REG_PINFUNCDATA, 0x01,common}, - {AX5043_REG_PINFUNCANTSEL, 0x01,common}, - {AX5043_REG_PINFUNCPWRAMP, 0x07,common}, - {AX5043_REG_WAKEUPXOEARLY, 0x01,common}, - {AX5043_REG_IFFREQ1, 0x0B,common}, - {AX5043_REG_IFFREQ0, 0x09,common}, - {AX5043_REG_DECIMATION, 0x02,common}, - {AX5043_REG_RXDATARATE2, 0x00,common}, - {AX5043_REG_RXDATARATE1, 0x3C,common}, - {AX5043_REG_RXDATARATE0, 0x00,common}, - {AX5043_REG_MAXDROFFSET2, 0x00,common}, - {AX5043_REG_MAXDROFFSET1, 0x00,common}, - {AX5043_REG_MAXDROFFSET0, 0x00,common}, - {AX5043_REG_MAXRFOFFSET2, 0x80,common}, - {AX5043_REG_MAXRFOFFSET1, 0x01,common}, - {AX5043_REG_MAXRFOFFSET0, 0x30,common}, - {AX5043_REG_FSKDMAX1, 0x00,common}, - {AX5043_REG_FSKDMAX0, 0xA6,common}, - {AX5043_REG_FSKDMIN1, 0xFF,common}, - {AX5043_REG_FSKDMIN0, 0x5A,common}, - {AX5043_REG_AMPLFILTER, 0x00,common}, - {AX5043_REG_RXPARAMSETS, 0xF4,common}, - {AX5043_REG_AGCGAIN0, 0x83,common}, - {AX5043_REG_AGCTARGET0, 0x84,common}, - {AX5043_REG_TIMEGAIN0, 0xF8,common}, - {AX5043_REG_DRGAIN0, 0xF2,common}, - {AX5043_REG_PHASEGAIN0, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA0,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB0,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC0,0x05,common}, - {AX5043_REG_FREQUENCYGAIND0,0x05,common}, - {AX5043_REG_AMPLITUDEGAIN0, 0x06,common}, - {AX5043_REG_FREQDEV10, 0x00,common}, - {AX5043_REG_FREQDEV00, 0x00,common}, - {AX5043_REG_BBOFFSRES0, 0x00,common}, - {AX5043_REG_AGCGAIN1, 0x83,common}, - {AX5043_REG_AGCTARGET1, 0x84,common}, - {AX5043_REG_AGCAHYST1, 0x00,common}, - {AX5043_REG_AGCMINMAX1, 0x00,common}, - {AX5043_REG_TIMEGAIN1, 0xF6,common}, - {AX5043_REG_DRGAIN1, 0xF1,common}, - {AX5043_REG_PHASEGAIN1, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA1,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB1,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC1,0x05,common}, - {AX5043_REG_FREQUENCYGAIND1,0x05,common}, - {AX5043_REG_AMPLITUDEGAIN1, 0x06,common}, - {AX5043_REG_FREQDEV11, 0x00,common}, - {AX5043_REG_FREQDEV01, 0x1C,common}, - {AX5043_REG_FOURFSK1, 0x16,common}, - {AX5043_REG_BBOFFSRES1, 0x00,common}, - {AX5043_REG_AGCGAIN3, 0xFF,common}, - {AX5043_REG_AGCTARGET3, 0x84,common}, - {AX5043_REG_AGCAHYST3, 0x00,common}, - {AX5043_REG_AGCMINMAX3, 0x00,common}, - {AX5043_REG_TIMEGAIN3, 0xF5,common}, - {AX5043_REG_DRGAIN3, 0xF0,common}, - {AX5043_REG_PHASEGAIN3, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA3,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB3,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC3,0x09,common}, - {AX5043_REG_FREQUENCYGAIND3,0x09,common}, - {AX5043_REG_AMPLITUDEGAIN3, 0x06,common}, - {AX5043_REG_FREQDEV13, 0x00,common}, - {AX5043_REG_FREQDEV03, 0x1C,common}, - {AX5043_REG_FOURFSK3, 0x16,common}, - {AX5043_REG_BBOFFSRES3, 0x00,common}, - {AX5043_REG_MODCFGF, 0x02,common}, - {AX5043_REG_FSKDEV2, 0x00,common}, - {AX5043_REG_FSKDEV1, 0x00,common}, - {AX5043_REG_FSKDEV0, 0x00,common}, - {AX5043_REG_MODCFGA, 0x05,common}, - {AX5043_REG_TXRATE2, 0x00,common}, - {AX5043_REG_TXRATE1, 0x00,common}, - {AX5043_REG_TXRATE0, 0x01,common}, - {AX5043_REG_TXPWRCOEFFB1, 0x07,common}, - {AX5043_REG_TXPWRCOEFFB0, 0x00,common}, - {AX5043_REG_PLLVCOI, 0x98,common}, - {AX5043_REG_PLLRNGCLK, 0x05,common}, - {AX5043_REG_BBTUNE, 0x03,common}, - {AX5043_REG_BBOFFSCAP, 0x77,common}, - {AX5043_REG_PKTADDRCFG, 0x00,common}, - {AX5043_REG_PKTLENCFG, 0x82,common}, - {AX5043_REG_PKTLENOFFSET, 0x00,common}, - {AX5043_REG_PKTMAXLEN, 0xC8,common}, - {AX5043_REG_MATCH0PAT3, 0xAA,common}, - {AX5043_REG_MATCH0PAT2, 0xCC,common}, - {AX5043_REG_MATCH0PAT1, 0xAA,common}, - {AX5043_REG_MATCH0PAT0, 0xCC,common}, - {AX5043_REG_MATCH1PAT1, 0x55,common}, - {AX5043_REG_MATCH1PAT0, 0x55,common}, - {AX5043_REG_MATCH1LEN, 0x8A,common}, - {AX5043_REG_MATCH1MAX, 0x0A,common}, - {AX5043_REG_TMGTXBOOST, 0x5B,common}, - {AX5043_REG_TMGTXSETTLE, 0x3E,common}, - {AX5043_REG_TMGRXOFFSACQ, 0x00,common}, - {AX5043_REG_TMGRXCOARSEAGC, 0x9C,common}, - {AX5043_REG_TMGRXRSSI, 0x03,common}, - {AX5043_REG_TMGRXPREAMBLE2, 0x17,common}, - {AX5043_REG_RSSIABSTHR, 0xEB,common}, - {AX5043_REG_BGNDRSSITHR, 0x00,common}, - {AX5043_REG_PKTCHUNKSIZE, 0x0D,common}, - {AX5043_REG_PKTACCEPTFLAGS, 0x20,common}, - {AX5043_REG_DACVALUE1, 0x00,common}, - {AX5043_REG_DACVALUE0, 0x00,common}, - {AX5043_REG_DACCONFIG, 0x00,common}, - {AX5043_REG_REF, 0x03,common}, - {AX5043_REG_XTALOSC, 0x04,common}, - {AX5043_REG_XTALAMPL, 0x00,common}, - {AX5043_REG_0xF1C, 0x07,common}, - {AX5043_REG_0xF21, 0x68,common}, - {AX5043_REG_0xF22, 0XFF,common}, - {AX5043_REG_0xF23, 0x84,common}, - {AX5043_REG_0xF26, 0x98,common}, - {AX5043_REG_0xF34, 0x28,common}, - {AX5043_REG_0xF35, 0x11,common}, - {AX5043_REG_0xF44, 0x25,common}, - {AX5043_REG_PINFUNCIRQ, 0x03,common}, - {AX5043_REG_PKTSTOREFLAGS, 0x14,common}, - {AX5043_REG_PLLLOOP, 0x09,tx}, - {AX5043_REG_PLLCPI, 0x02,tx}, - {AX5043_REG_PLLVCODIV, 0x24,tx}, - {AX5043_REG_XTALCAP, 0x00,tx}, - {AX5043_REG_0xF00, 0x0F,tx}, - {AX5043_REG_0xF18, 0x06,tx}, - {AX5043_REG_PLLLOOP, 0x09,rx}, - {AX5043_REG_PLLCPI, 0x01,rx}, - {AX5043_REG_PLLVCODIV, 0x25,rx}, - {AX5043_REG_XTALCAP, 0x00,rx}, - {AX5043_REG_0xF00, 0x0F,rx}, - {AX5043_REG_0xF18, 0x02,rx}, - {AX5043_REG_TMGRXAGC, 0x00,rx_cont}, - {AX5043_REG_TMGRXPREAMBLE1, 0x00,rx_cont}, - {AX5043_REG_PKTMISCFLAGS, 0x00,rx_cont}, - {AX5043_REG_PKTADDR0, 0x32,local_address}, - {AX5043_REG_PKTADDR1, 0x34,local_address}, - {AX5043_REG_PKTADDR2, 0x00,local_address}, - {AX5043_REG_PKTADDR3, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK0, 0xFF,local_address}, - {AX5043_REG_PKTADDRMASK1, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK2, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK3, 0x00,local_address}, - {AX5043_REG_END, 0x00,common} -}; - - -ax5043_confval_t conf_values[]={ - {AXRADIO_PHY_PN9 ,0}, - {AXRADIO_PHY_NRCHANNELS ,1}, - {AXRADIO_PHY_CHANFREQ ,0X0912AAAB }, - {AXRADIO_PHY_CHANPLLRNGINIT ,0X0A }, - {AXRADIO_PHY_CHANVCOIINIT ,0X98}, - {AXRADIO_PHY_CHANPLLRNG ,0}, - {AXRADIO_PHY_CHANVCOI ,0}, - {AXRADIO_PHY_VCOCALIB ,0}, - {AXRADIO_PHY_MAXFREQOFFSET ,913}, - {AXRADIO_PHY_RSSIOFFSET ,64}, - {AXRADIO_PHY_RSSIREFERENCE ,313}, - {AXRADIO_PHY_CHANNELBUSY ,-23}, - {AXRADIO_PHY_CS_PERIOD ,7}, - {AXRADIO_PHY_CS_ENABLED ,0}, - {AXRADIO_PHY_LBT_RETRIES ,0}, - {AXRADIO_PHY_LBT_FORCETX ,0}, - {AXRADIO_PHY_PREAMBLE_WOR_LONGLEN ,23}, - {AXRADIO_PHY_PREAMBLE_WOR_LEN ,184}, - {AXRADIO_PHY_PREAMBLE_LONGLEN ,0}, - {AXRADIO_PHY_PREAMBLE_LEN ,72}, - {AXRADIO_PHY_PREAMBLE_BYTE ,0X7E}, - {AXRADIO_PHY_PREAMBLE_FLAGS ,0X38}, - {AXRADIO_PHY_PREAMBLE_APPENDBITS ,0}, - {AXRADIO_PHY_PREAMBLE_APPENDPATTERN ,0X00}, - {AXRADIO_FRAMING_MACLEN ,3}, - {AXRADIO_FRAMING_ADDRLEN ,1}, - {AXRADIO_FRAMING_DESTADDRPOS ,0}, - {AXRADIO_FRAMING_SOURCEADDRPOS ,0XFF}, - {AXRADIO_FRAMING_LENPOS ,2}, - {AXRADIO_FRAMING_LENOFFS ,0}, - {AXRADIO_FRAMING_LENMASK ,0XFF}, - {AXRADIO_FRAMING_SWCRCLEN ,0}, - {AXRADIO_FRAMING_SYNCLEN ,32}, - {AXRADIO_FRAMING_SYNCWORD0 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD1 ,0XAA}, - {AXRADIO_FRAMING_SYNCWORD2 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD3 ,0XAA}, - {AXRADIO_FRAMING_SYNCFLAGS ,0X38}, - {AXRADIO_FRAMING_ENABLE_SFDCALLBACK ,0}, - {AXRADIO_FRAMING_ACK_TIMEOUT ,8}, - {AXRADIO_FRAMING_ACK_DELAY ,313}, - {AXRADIO_FRAMING_ACK_RETRANSMISSIONS ,0}, - {AXRADIO_FRAMING_ACK_SEQNRPOS ,0XFF}, - {AXRADIO_FRAMING_MINPAYLOADLEN ,0}, - {AXRADIO_WOR_PERIOD ,128}, - {AXRADIO_PHY_INNERFREQLOOP ,0}, - {AXRADIO_PHY_END ,0} -}; - -uint8_t axradio_rxbuffer[256]; //buffer to receive radio data - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0 -}; - -//mailboxes to receive the radio packets -#define NUM_BUFFERS 16 -static msg_t radio1_rx_queue[NUM_BUFFERS]; -static mailbox_t radio1_rx_mb; - - -//Radio driver configurations - -static AX5043Config axcfg1 = -{ - &SPID2, - LINE_SX_INT0, - reg_values, - conf_values, - AX5043_MODE_CW, - &radio1_rx_mb -}; -AX5043Driver axd1; - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - - uint16_t pkt_counter = 0; - - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - - // Creating the mailboxes. - chMBObjectInit(&radio1_rx_mb, radio1_rx_queue, NUM_BUFFERS); - - //initiating radio driver - ax5043ObjectInit(&axd1); - ax5043Start(&axd1, &axcfg1); - - - - // This is for CW - - char cw_message[] = "KG7ZVV Malay Das testing AX5043"; - int wpm = 22; - for (;;) { - chprintf(DEBUG_CHP,"INFO: Sending CW %d\r\n", sizeof(cw_message)); - - ax5043_send_cw(&axd1, wpm, cw_message, sizeof(cw_message)); - - chThdSleepMilliseconds(500); - } - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(500); - chprintf(DEBUG_CHP, "."); - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_driver/main_engr_rx.c b/src/archive/app_ax5043_driver/main_engr_rx.c deleted file mode 100644 index 2cd7ec8c..00000000 --- a/src/archive/app_ax5043_driver/main_engr_rx.c +++ /dev/null @@ -1,415 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x32, 0x34, 0x00, 0x00} -}; - -/* -const struct axradio_address_mask localaddr_tx = { - { 0x33, 0x34, 0x00, 0x00}, - { 0xFF, 0x00, 0x00, 0x00} -}; -*/ - -ax5043_regval_t reg_values[] = { - {AX5043_REG_MODULATION, 0x08,common}, - {AX5043_REG_ENCODING, 0x00,common}, - {AX5043_REG_FRAMING, 0x24,common}, - {AX5043_REG_CRCINIT3, 0x00,common}, - {AX5043_REG_CRCINIT2, 0x00,common}, - {AX5043_REG_CRCINIT1, 0xFF,common}, - {AX5043_REG_CRCINIT0, 0xFF,common}, - {AX5043_REG_PINFUNCSYSCLK, 0x01,common}, - {AX5043_REG_PINFUNCDCLK, 0x01,common}, - {AX5043_REG_PINFUNCDATA, 0x01,common}, - {AX5043_REG_PINFUNCANTSEL, 0x01,common}, - {AX5043_REG_PINFUNCPWRAMP, 0x07,common}, - {AX5043_REG_WAKEUPXOEARLY, 0x01,common}, - {AX5043_REG_IFFREQ1, 0x0B,common}, - {AX5043_REG_IFFREQ0, 0x09,common}, - {AX5043_REG_DECIMATION, 0x02,common}, - {AX5043_REG_RXDATARATE2, 0x00,common}, - {AX5043_REG_RXDATARATE1, 0x3C,common}, - {AX5043_REG_RXDATARATE0, 0x00,common}, - {AX5043_REG_MAXDROFFSET2, 0x00,common}, - {AX5043_REG_MAXDROFFSET1, 0x00,common}, - {AX5043_REG_MAXDROFFSET0, 0x00,common}, - {AX5043_REG_MAXRFOFFSET2, 0x80,common}, - {AX5043_REG_MAXRFOFFSET1, 0x01,common}, - {AX5043_REG_MAXRFOFFSET0, 0x30,common}, - {AX5043_REG_FSKDMAX1, 0x00,common}, - {AX5043_REG_FSKDMAX0, 0xA6,common}, - {AX5043_REG_FSKDMIN1, 0xFF,common}, - {AX5043_REG_FSKDMIN0, 0x5A,common}, - {AX5043_REG_AMPLFILTER, 0x00,common}, - {AX5043_REG_RXPARAMSETS, 0xF4,common}, - {AX5043_REG_AGCGAIN0, 0x83,common}, - {AX5043_REG_AGCTARGET0, 0x84,common}, - {AX5043_REG_TIMEGAIN0, 0xF8,common}, - {AX5043_REG_DRGAIN0, 0xF2,common}, - {AX5043_REG_PHASEGAIN0, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA0,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB0,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC0,0x05,common}, - {AX5043_REG_FREQUENCYGAIND0,0x05,common}, - {AX5043_REG_AMPLITUDEGAIN0, 0x06,common}, - {AX5043_REG_FREQDEV10, 0x00,common}, - {AX5043_REG_FREQDEV00, 0x00,common}, - {AX5043_REG_BBOFFSRES0, 0x00,common}, - {AX5043_REG_AGCGAIN1, 0x83,common}, - {AX5043_REG_AGCTARGET1, 0x84,common}, - {AX5043_REG_AGCAHYST1, 0x00,common}, - {AX5043_REG_AGCMINMAX1, 0x00,common}, - {AX5043_REG_TIMEGAIN1, 0xF6,common}, - {AX5043_REG_DRGAIN1, 0xF1,common}, - {AX5043_REG_PHASEGAIN1, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA1,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB1,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC1,0x05,common}, - {AX5043_REG_FREQUENCYGAIND1,0x05,common}, - {AX5043_REG_AMPLITUDEGAIN1, 0x06,common}, - {AX5043_REG_FREQDEV11, 0x00,common}, - {AX5043_REG_FREQDEV01, 0x1C,common}, - {AX5043_REG_FOURFSK1, 0x16,common}, - {AX5043_REG_BBOFFSRES1, 0x00,common}, - {AX5043_REG_AGCGAIN3, 0xFF,common}, - {AX5043_REG_AGCTARGET3, 0x84,common}, - {AX5043_REG_AGCAHYST3, 0x00,common}, - {AX5043_REG_AGCMINMAX3, 0x00,common}, - {AX5043_REG_TIMEGAIN3, 0xF5,common}, - {AX5043_REG_DRGAIN3, 0xF0,common}, - {AX5043_REG_PHASEGAIN3, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA3,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB3,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC3,0x09,common}, - {AX5043_REG_FREQUENCYGAIND3,0x09,common}, - {AX5043_REG_AMPLITUDEGAIN3, 0x06,common}, - {AX5043_REG_FREQDEV13, 0x00,common}, - {AX5043_REG_FREQDEV03, 0x1C,common}, - {AX5043_REG_FOURFSK3, 0x16,common}, - {AX5043_REG_BBOFFSRES3, 0x00,common}, - {AX5043_REG_MODCFGF, 0x02,common}, - {AX5043_REG_FSKDEV2, 0x00,common}, - {AX5043_REG_FSKDEV1, 0x22,common}, - {AX5043_REG_FSKDEV0, 0x22,common}, - {AX5043_REG_MODCFGA, 0x05,common}, - {AX5043_REG_TXRATE2, 0x00,common}, - {AX5043_REG_TXRATE1, 0x88,common}, - {AX5043_REG_TXRATE0, 0x89,common}, - {AX5043_REG_TXPWRCOEFFB1, 0x07,common}, - {AX5043_REG_TXPWRCOEFFB0, 0x00,common}, - {AX5043_REG_PLLVCOI, 0x98,common}, - {AX5043_REG_PLLRNGCLK, 0x05,common}, - {AX5043_REG_BBTUNE, 0x03,common}, - {AX5043_REG_BBOFFSCAP, 0x77,common}, - {AX5043_REG_PKTADDRCFG, 0x00,common}, - {AX5043_REG_PKTLENCFG, 0x82,common}, - {AX5043_REG_PKTLENOFFSET, 0x00,common}, - {AX5043_REG_PKTMAXLEN, 0xC8,common}, - {AX5043_REG_MATCH0PAT3, 0xAA,common}, - {AX5043_REG_MATCH0PAT2, 0xCC,common}, - {AX5043_REG_MATCH0PAT1, 0xAA,common}, - {AX5043_REG_MATCH0PAT0, 0xCC,common}, - {AX5043_REG_MATCH1PAT1, 0x55,common}, - {AX5043_REG_MATCH1PAT0, 0x55,common}, - {AX5043_REG_MATCH1LEN, 0x8A,common}, - {AX5043_REG_MATCH1MAX, 0x0A,common}, - {AX5043_REG_TMGTXBOOST, 0x5B,common}, - {AX5043_REG_TMGTXSETTLE, 0x3E,common}, - {AX5043_REG_TMGRXOFFSACQ, 0x00,common}, - {AX5043_REG_TMGRXCOARSEAGC, 0x9C,common}, - {AX5043_REG_TMGRXRSSI, 0x03,common}, - {AX5043_REG_TMGRXPREAMBLE2, 0x17,common}, - {AX5043_REG_RSSIABSTHR, 0xEB,common}, - {AX5043_REG_BGNDRSSITHR, 0x00,common}, - {AX5043_REG_PKTCHUNKSIZE, 0x0D,common}, - {AX5043_REG_PKTACCEPTFLAGS, 0x20,common}, - {AX5043_REG_DACVALUE1, 0x00,common}, - {AX5043_REG_DACVALUE0, 0x00,common}, - {AX5043_REG_DACCONFIG, 0x00,common}, - {AX5043_REG_REF, 0x03,common}, - {AX5043_REG_XTALOSC, 0x04,common}, - {AX5043_REG_XTALAMPL, 0x00,common}, - {AX5043_REG_0xF1C, 0x07,common}, - {AX5043_REG_0xF21, 0x68,common}, - {AX5043_REG_0xF22, 0XFF,common}, - {AX5043_REG_0xF23, 0x84,common}, - {AX5043_REG_0xF26, 0x98,common}, - {AX5043_REG_0xF34, 0x28,common}, - {AX5043_REG_0xF35, 0x11,common}, - {AX5043_REG_0xF44, 0x25,common}, - {AX5043_REG_PINFUNCIRQ, 0x03,common}, - {AX5043_REG_PKTSTOREFLAGS, 0x14,common}, - {AX5043_REG_PLLLOOP, 0x09,tx}, - {AX5043_REG_PLLCPI, 0x02,tx}, - {AX5043_REG_PLLVCODIV, 0x24,tx}, - {AX5043_REG_XTALCAP, 0x00,tx}, - {AX5043_REG_0xF00, 0x0F,tx}, - {AX5043_REG_0xF18, 0x06,tx}, - {AX5043_REG_PLLLOOP, 0x09,rx}, - {AX5043_REG_PLLCPI, 0x01,rx}, - {AX5043_REG_PLLVCODIV, 0x25,rx}, - {AX5043_REG_XTALCAP, 0x00,rx}, - {AX5043_REG_0xF00, 0x0F,rx}, - {AX5043_REG_0xF18, 0x02,rx}, - {AX5043_REG_TMGRXAGC, 0x00,rx_cont}, - {AX5043_REG_TMGRXPREAMBLE1, 0x00,rx_cont}, - {AX5043_REG_PKTMISCFLAGS, 0x00,rx_cont}, - {AX5043_REG_PKTADDR0, 0x33,local_address}, - {AX5043_REG_PKTADDR1, 0x34,local_address}, - {AX5043_REG_PKTADDR2, 0x00,local_address}, - {AX5043_REG_PKTADDR3, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK0, 0xFF,local_address}, - {AX5043_REG_PKTADDRMASK1, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK2, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK3, 0x00,local_address}, - {AX5043_REG_END, 0x00,common} -}; - - -ax5043_confval_t conf_values[]={ - {AXRADIO_PHY_PN9 ,0}, - {AXRADIO_PHY_NRCHANNELS ,1}, - {AXRADIO_PHY_CHANFREQ ,0X0912AAAB }, - {AXRADIO_PHY_CHANPLLRNGINIT ,0X0A }, - {AXRADIO_PHY_CHANVCOIINIT ,0X98}, - {AXRADIO_PHY_CHANPLLRNG ,0}, - {AXRADIO_PHY_CHANVCOI ,0}, - {AXRADIO_PHY_VCOCALIB ,0}, - {AXRADIO_PHY_MAXFREQOFFSET ,913}, - {AXRADIO_PHY_RSSIOFFSET ,64}, - {AXRADIO_PHY_RSSIREFERENCE ,313}, - {AXRADIO_PHY_CHANNELBUSY ,-23}, - {AXRADIO_PHY_CS_PERIOD ,7}, - {AXRADIO_PHY_CS_ENABLED ,0}, - {AXRADIO_PHY_LBT_RETRIES ,0}, - {AXRADIO_PHY_LBT_FORCETX ,0}, - {AXRADIO_PHY_PREAMBLE_WOR_LONGLEN ,23}, - {AXRADIO_PHY_PREAMBLE_WOR_LEN ,184}, - {AXRADIO_PHY_PREAMBLE_LONGLEN ,0}, - {AXRADIO_PHY_PREAMBLE_LEN ,72}, - {AXRADIO_PHY_PREAMBLE_BYTE ,0X7E}, - {AXRADIO_PHY_PREAMBLE_FLAGS ,0X38}, - {AXRADIO_PHY_PREAMBLE_APPENDBITS ,0}, - {AXRADIO_PHY_PREAMBLE_APPENDPATTERN ,0X00}, - {AXRADIO_FRAMING_MACLEN ,3}, - {AXRADIO_FRAMING_ADDRLEN ,1}, - {AXRADIO_FRAMING_DESTADDRPOS ,0}, - {AXRADIO_FRAMING_SOURCEADDRPOS ,0XFF}, - {AXRADIO_FRAMING_LENPOS ,2}, - {AXRADIO_FRAMING_LENOFFS ,0}, - {AXRADIO_FRAMING_LENMASK ,0XFF}, - {AXRADIO_FRAMING_SWCRCLEN ,0}, - {AXRADIO_FRAMING_SYNCLEN ,32}, - {AXRADIO_FRAMING_SYNCWORD0 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD1 ,0XAA}, - {AXRADIO_FRAMING_SYNCWORD2 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD3 ,0XAA}, - {AXRADIO_FRAMING_SYNCFLAGS ,0X38}, - {AXRADIO_FRAMING_ENABLE_SFDCALLBACK ,0}, - {AXRADIO_FRAMING_ACK_TIMEOUT ,8}, - {AXRADIO_FRAMING_ACK_DELAY ,313}, - {AXRADIO_FRAMING_ACK_RETRANSMISSIONS ,0}, - {AXRADIO_FRAMING_ACK_SEQNRPOS ,0XFF}, - {AXRADIO_FRAMING_MINPAYLOADLEN ,0}, - {AXRADIO_WOR_PERIOD ,128}, - {AXRADIO_PHY_INNERFREQLOOP ,0}, - {AXRADIO_PHY_END ,0} -}; - -uint8_t axradio_rxbuffer[256]; //buffer to receive radio data - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0 -}; - -//mailboxes to receive the radio packets -#define NUM_BUFFERS 16 -static msg_t radio1_rx_queue[NUM_BUFFERS]; -static mailbox_t radio1_rx_mb; - - -//Radio driver configurations - -static AX5043Config axcfg1 = -{ - &SPID2, - LINE_SX_INT0, - reg_values, - conf_values, - AX5043_MODE_RX, - &radio1_rx_mb -}; -AX5043Driver axd1; - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - - uint16_t pkt_counter = 0; - - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - - // Creating the mailboxes. - chMBObjectInit(&radio1_rx_mb, radio1_rx_queue, NUM_BUFFERS); - - //initiating radio driver - ax5043ObjectInit(&axd1); - ax5043Start(&axd1, &axcfg1); -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - uint8_t packet_len=0; - //uint8_t ret_value[3]={0,0,0}; - - /* Enabling events on both edges of the button line.*/ - //palEnableLineEvent(LINE_BUTTON, PAL_EVENT_MODE_RISING_EDGE); - palEnableLineEvent(LINE_SX_INT0, PAL_EVENT_MODE_RISING_EDGE); - - - while(true) - { - //palWaitLineTimeout(LINE_BUTTON, TIME_INFINITE); - //palWaitLineTimeout(LINE_ARD_A5, TIME_INFINITE); - //palWaitLineTimeout(LINE_ARD_A5, TIME_MS2I(5000)); - - palWaitLineTimeout(LINE_SX_INT0, TIME_MS2I(5000)); - - if (palReadLine(LINE_SX_INT0)) - chprintf(DEBUG_CHP, "\r\r INFO: interrupt happened ** \r\n"); - else - chprintf(DEBUG_CHP, "\r\r INFO: interrupt timeout** \r\n"); - - packet_len=receive_loop(&axd1, axradio_rxbuffer); - //chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x\r\n", axd1.rf_freq_off3, axd1.rf_freq_off2, axd1.rf_freq_off1); - //chprintf(DEBUG_CHP,"INFO: RSSI %d\r\n", (int)axd1.rssi); - if(packet_len > 0) - chprintf(DEBUG_CHP,"INFO: Received packet %d\r\n",axradio_rxbuffer[3]); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_driver/main_engr_tx.c b/src/archive/app_ax5043_driver/main_engr_tx.c deleted file mode 100644 index eca93c1d..00000000 --- a/src/archive/app_ax5043_driver/main_engr_tx.c +++ /dev/null @@ -1,409 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x33, 0x34, 0x00, 0x00} -}; - -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3A, 0x43, 0x51, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0x54, 0x65, 0x73, 0x74, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x31 }; -const uint8_t framing_insert_counter = 1; -const uint8_t framing_counter_pos = 0; - -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -ax5043_regval_t reg_values[] = { - {AX5043_REG_MODULATION, 0x08,common}, - {AX5043_REG_ENCODING, 0x00,common}, - {AX5043_REG_FRAMING, 0x24,common}, - {AX5043_REG_CRCINIT3, 0x00,common}, - {AX5043_REG_CRCINIT2, 0x00,common}, - {AX5043_REG_CRCINIT1, 0xFF,common}, - {AX5043_REG_CRCINIT0, 0xFF,common}, - {AX5043_REG_PINFUNCSYSCLK, 0x01,common}, - {AX5043_REG_PINFUNCDCLK, 0x01,common}, - {AX5043_REG_PINFUNCDATA, 0x01,common}, - {AX5043_REG_PINFUNCANTSEL, 0x01,common}, - {AX5043_REG_PINFUNCPWRAMP, 0x07,common}, - {AX5043_REG_WAKEUPXOEARLY, 0x01,common}, - {AX5043_REG_IFFREQ1, 0x0B,common}, - {AX5043_REG_IFFREQ0, 0x09,common}, - {AX5043_REG_DECIMATION, 0x02,common}, - {AX5043_REG_RXDATARATE2, 0x00,common}, - {AX5043_REG_RXDATARATE1, 0x3C,common}, - {AX5043_REG_RXDATARATE0, 0x00,common}, - {AX5043_REG_MAXDROFFSET2, 0x00,common}, - {AX5043_REG_MAXDROFFSET1, 0x00,common}, - {AX5043_REG_MAXDROFFSET0, 0x00,common}, - {AX5043_REG_MAXRFOFFSET2, 0x80,common}, - {AX5043_REG_MAXRFOFFSET1, 0x01,common}, - {AX5043_REG_MAXRFOFFSET0, 0x30,common}, - {AX5043_REG_FSKDMAX1, 0x00,common}, - {AX5043_REG_FSKDMAX0, 0xA6,common}, - {AX5043_REG_FSKDMIN1, 0xFF,common}, - {AX5043_REG_FSKDMIN0, 0x5A,common}, - {AX5043_REG_AMPLFILTER, 0x00,common}, - {AX5043_REG_RXPARAMSETS, 0xF4,common}, - {AX5043_REG_AGCGAIN0, 0x83,common}, - {AX5043_REG_AGCTARGET0, 0x84,common}, - {AX5043_REG_TIMEGAIN0, 0xF8,common}, - {AX5043_REG_DRGAIN0, 0xF2,common}, - {AX5043_REG_PHASEGAIN0, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA0,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB0,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC0,0x05,common}, - {AX5043_REG_FREQUENCYGAIND0,0x05,common}, - {AX5043_REG_AMPLITUDEGAIN0, 0x06,common}, - {AX5043_REG_FREQDEV10, 0x00,common}, - {AX5043_REG_FREQDEV00, 0x00,common}, - {AX5043_REG_BBOFFSRES0, 0x00,common}, - {AX5043_REG_AGCGAIN1, 0x83,common}, - {AX5043_REG_AGCTARGET1, 0x84,common}, - {AX5043_REG_AGCAHYST1, 0x00,common}, - {AX5043_REG_AGCMINMAX1, 0x00,common}, - {AX5043_REG_TIMEGAIN1, 0xF6,common}, - {AX5043_REG_DRGAIN1, 0xF1,common}, - {AX5043_REG_PHASEGAIN1, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA1,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB1,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC1,0x05,common}, - {AX5043_REG_FREQUENCYGAIND1,0x05,common}, - {AX5043_REG_AMPLITUDEGAIN1, 0x06,common}, - {AX5043_REG_FREQDEV11, 0x00,common}, - {AX5043_REG_FREQDEV01, 0x1C,common}, - {AX5043_REG_FOURFSK1, 0x16,common}, - {AX5043_REG_BBOFFSRES1, 0x00,common}, - {AX5043_REG_AGCGAIN3, 0xFF,common}, - {AX5043_REG_AGCTARGET3, 0x84,common}, - {AX5043_REG_AGCAHYST3, 0x00,common}, - {AX5043_REG_AGCMINMAX3, 0x00,common}, - {AX5043_REG_TIMEGAIN3, 0xF5,common}, - {AX5043_REG_DRGAIN3, 0xF0,common}, - {AX5043_REG_PHASEGAIN3, 0xC3,common}, - {AX5043_REG_FREQUENCYGAINA3,0x0F,common}, - {AX5043_REG_FREQUENCYGAINB3,0x1F,common}, - {AX5043_REG_FREQUENCYGAINC3,0x09,common}, - {AX5043_REG_FREQUENCYGAIND3,0x09,common}, - {AX5043_REG_AMPLITUDEGAIN3, 0x06,common}, - {AX5043_REG_FREQDEV13, 0x00,common}, - {AX5043_REG_FREQDEV03, 0x1C,common}, - {AX5043_REG_FOURFSK3, 0x16,common}, - {AX5043_REG_BBOFFSRES3, 0x00,common}, - {AX5043_REG_MODCFGF, 0x02,common}, - {AX5043_REG_FSKDEV2, 0x00,common}, - {AX5043_REG_FSKDEV1, 0x22,common}, - {AX5043_REG_FSKDEV0, 0x22,common}, - {AX5043_REG_MODCFGA, 0x05,common}, - {AX5043_REG_TXRATE2, 0x00,common}, - {AX5043_REG_TXRATE1, 0x88,common}, - {AX5043_REG_TXRATE0, 0x89,common}, - {AX5043_REG_TXPWRCOEFFB1, 0x07,common}, - {AX5043_REG_TXPWRCOEFFB0, 0x00,common}, - {AX5043_REG_PLLVCOI, 0x98,common}, - {AX5043_REG_PLLRNGCLK, 0x05,common}, - {AX5043_REG_BBTUNE, 0x03,common}, - {AX5043_REG_BBOFFSCAP, 0x77,common}, - {AX5043_REG_PKTADDRCFG, 0x00,common}, - {AX5043_REG_PKTLENCFG, 0x82,common}, - {AX5043_REG_PKTLENOFFSET, 0x00,common}, - {AX5043_REG_PKTMAXLEN, 0xC8,common}, - {AX5043_REG_MATCH0PAT3, 0xAA,common}, - {AX5043_REG_MATCH0PAT2, 0xCC,common}, - {AX5043_REG_MATCH0PAT1, 0xAA,common}, - {AX5043_REG_MATCH0PAT0, 0xCC,common}, - {AX5043_REG_MATCH1PAT1, 0x55,common}, - {AX5043_REG_MATCH1PAT0, 0x55,common}, - {AX5043_REG_MATCH1LEN, 0x8A,common}, - {AX5043_REG_MATCH1MAX, 0x0A,common}, - {AX5043_REG_TMGTXBOOST, 0x5B,common}, - {AX5043_REG_TMGTXSETTLE, 0x3E,common}, - {AX5043_REG_TMGRXOFFSACQ, 0x00,common}, - {AX5043_REG_TMGRXCOARSEAGC, 0x9C,common}, - {AX5043_REG_TMGRXRSSI, 0x03,common}, - {AX5043_REG_TMGRXPREAMBLE2, 0x17,common}, - {AX5043_REG_RSSIABSTHR, 0xEB,common}, - {AX5043_REG_BGNDRSSITHR, 0x00,common}, - {AX5043_REG_PKTCHUNKSIZE, 0x0D,common}, - {AX5043_REG_PKTACCEPTFLAGS, 0x20,common}, - {AX5043_REG_DACVALUE1, 0x00,common}, - {AX5043_REG_DACVALUE0, 0x00,common}, - {AX5043_REG_DACCONFIG, 0x00,common}, - {AX5043_REG_REF, 0x03,common}, - {AX5043_REG_XTALOSC, 0x04,common}, - {AX5043_REG_XTALAMPL, 0x00,common}, - {AX5043_REG_0xF1C, 0x07,common}, - {AX5043_REG_0xF21, 0x68,common}, - {AX5043_REG_0xF22, 0XFF,common}, - {AX5043_REG_0xF23, 0x84,common}, - {AX5043_REG_0xF26, 0x98,common}, - {AX5043_REG_0xF34, 0x28,common}, - {AX5043_REG_0xF35, 0x11,common}, - {AX5043_REG_0xF44, 0x25,common}, - {AX5043_REG_PINFUNCIRQ, 0x03,common}, - {AX5043_REG_PKTSTOREFLAGS, 0x14,common}, - {AX5043_REG_PLLLOOP, 0x09,tx}, - {AX5043_REG_PLLCPI, 0x02,tx}, - {AX5043_REG_PLLVCODIV, 0x24,tx}, - {AX5043_REG_XTALCAP, 0x00,tx}, - {AX5043_REG_0xF00, 0x0F,tx}, - {AX5043_REG_0xF18, 0x06,tx}, - {AX5043_REG_PLLLOOP, 0x09,rx}, - {AX5043_REG_PLLCPI, 0x01,rx}, - {AX5043_REG_PLLVCODIV, 0x25,rx}, - {AX5043_REG_XTALCAP, 0x00,rx}, - {AX5043_REG_0xF00, 0x0F,rx}, - {AX5043_REG_0xF18, 0x02,rx}, - {AX5043_REG_TMGRXAGC, 0x00,rx_cont}, - {AX5043_REG_TMGRXPREAMBLE1, 0x00,rx_cont}, - {AX5043_REG_PKTMISCFLAGS, 0x00,rx_cont}, - {AX5043_REG_PKTADDR0, 0x32,local_address}, - {AX5043_REG_PKTADDR1, 0x34,local_address}, - {AX5043_REG_PKTADDR2, 0x00,local_address}, - {AX5043_REG_PKTADDR3, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK0, 0xFF,local_address}, - {AX5043_REG_PKTADDRMASK1, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK2, 0x00,local_address}, - {AX5043_REG_PKTADDRMASK3, 0x00,local_address}, - {AX5043_REG_END, 0x00,common} -}; - - -ax5043_confval_t conf_values[]={ - {AXRADIO_PHY_PN9 ,0}, - {AXRADIO_PHY_NRCHANNELS ,1}, - {AXRADIO_PHY_CHANFREQ ,0X0912AAAB }, - {AXRADIO_PHY_CHANPLLRNGINIT ,0X0A }, - {AXRADIO_PHY_CHANVCOIINIT ,0X98}, - {AXRADIO_PHY_CHANPLLRNG ,0}, - {AXRADIO_PHY_CHANVCOI ,0}, - {AXRADIO_PHY_VCOCALIB ,0}, - {AXRADIO_PHY_MAXFREQOFFSET ,913}, - {AXRADIO_PHY_RSSIOFFSET ,64}, - {AXRADIO_PHY_RSSIREFERENCE ,313}, - {AXRADIO_PHY_CHANNELBUSY ,-23}, - {AXRADIO_PHY_CS_PERIOD ,7}, - {AXRADIO_PHY_CS_ENABLED ,0}, - {AXRADIO_PHY_LBT_RETRIES ,0}, - {AXRADIO_PHY_LBT_FORCETX ,0}, - {AXRADIO_PHY_PREAMBLE_WOR_LONGLEN ,23}, - {AXRADIO_PHY_PREAMBLE_WOR_LEN ,184}, - {AXRADIO_PHY_PREAMBLE_LONGLEN ,0}, - {AXRADIO_PHY_PREAMBLE_LEN ,72}, - {AXRADIO_PHY_PREAMBLE_BYTE ,0X7E}, - {AXRADIO_PHY_PREAMBLE_FLAGS ,0X38}, - {AXRADIO_PHY_PREAMBLE_APPENDBITS ,0}, - {AXRADIO_PHY_PREAMBLE_APPENDPATTERN ,0X00}, - {AXRADIO_FRAMING_MACLEN ,3}, - {AXRADIO_FRAMING_ADDRLEN ,1}, - {AXRADIO_FRAMING_DESTADDRPOS ,0}, - {AXRADIO_FRAMING_SOURCEADDRPOS ,0XFF}, - {AXRADIO_FRAMING_LENPOS ,2}, - {AXRADIO_FRAMING_LENOFFS ,0}, - {AXRADIO_FRAMING_LENMASK ,0XFF}, - {AXRADIO_FRAMING_SWCRCLEN ,0}, - {AXRADIO_FRAMING_SYNCLEN ,32}, - {AXRADIO_FRAMING_SYNCWORD0 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD1 ,0XAA}, - {AXRADIO_FRAMING_SYNCWORD2 ,0XCC}, - {AXRADIO_FRAMING_SYNCWORD3 ,0XAA}, - {AXRADIO_FRAMING_SYNCFLAGS ,0X38}, - {AXRADIO_FRAMING_ENABLE_SFDCALLBACK ,0}, - {AXRADIO_FRAMING_ACK_TIMEOUT ,8}, - {AXRADIO_FRAMING_ACK_DELAY ,313}, - {AXRADIO_FRAMING_ACK_RETRANSMISSIONS ,0}, - {AXRADIO_FRAMING_ACK_SEQNRPOS ,0XFF}, - {AXRADIO_FRAMING_MINPAYLOADLEN ,0}, - {AXRADIO_WOR_PERIOD ,128}, - {AXRADIO_PHY_INNERFREQLOOP ,0}, - {AXRADIO_PHY_END ,0} -}; - -uint8_t axradio_rxbuffer[256]; //buffer to receive radio data - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0 -}; - -//mailboxes to receive the radio packets -#define NUM_BUFFERS 16 -static msg_t radio1_rx_queue[NUM_BUFFERS]; -static mailbox_t radio1_rx_mb; - - -//Radio driver configurations - -static AX5043Config axcfg1 = -{ - &SPID2, - LINE_SX_INT0, - reg_values, - conf_values, - AX5043_MODE_TX, - &radio1_rx_mb -}; -AX5043Driver axd1; - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - - uint16_t pkt_counter = 0; - - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - - // Creating the mailboxes. - chMBObjectInit(&radio1_rx_mb, radio1_rx_queue, NUM_BUFFERS); - - //initiating radio driver - ax5043ObjectInit(&axd1); - ax5043Start(&axd1, &axcfg1); - - - - for (;;) { - static uint8_t demo_packet_[sizeof(demo_packet)]; - //uint16_t pkt_counter = 0; - - ++pkt_counter; - memcpy(demo_packet_, demo_packet, sizeof(demo_packet)); - if (framing_insert_counter) { - demo_packet_[framing_counter_pos] = (uint8_t)(pkt_counter & 0xFF); - demo_packet_[framing_counter_pos+1] = (uint8_t)((pkt_counter>>8) & 0xFF); - } - - chprintf(DEBUG_CHP,"INFO: Sending packet %d\r\n",pkt_counter); - transmit_packet(&axd1, &remoteaddr_tx, demo_packet_, sizeof(demo_packet)); - - chThdSleepMilliseconds(3000); - } - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(500); - chprintf(DEBUG_CHP, "."); - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_driver/source/README.md b/src/archive/app_ax5043_driver/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_driver/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_driver/source/ax5043.c b/src/archive/app_ax5043_driver/source/ax5043.c deleted file mode 100644 index b9ceee88..00000000 --- a/src/archive/app_ax5043_driver/source/ax5043.c +++ /dev/null @@ -1,1065 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include -#include -#include "ch.h" -#include "hal.h" -//#include "chprintf.h" -#include "ax5043.h" - -//#define DEBUG_SERIAL SD2 -//#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -/** - * @brief Morse code for alphabets and numbers. - */ -static const char *alpha[] = { - ".-", //A - "-...", //B - "-.-.", //C - "-..", //D - ".", //E - "..-.", //F - "--.", //G - "....", //H - "..", //I - ".---", //J - "-.-", //K - ".-..", //L - "--", //M - "-.", //N - "---", //O - ".--.", //P - "--.-", //Q - ".-.", //R - "...", //S - "-", //T - "..-", //U - "...-", //V - ".--", //W - "-..-", //X - "-.--", //Y - "--..", //Z -}; - -static const char *num[] = { - "-----", //0 - ".----", //1 - "..---", //2 - "...--", //3 - "....-", //4 - ".....", //5 - "-....", //6 - "--...", //7 - "---..", //8 - "----.", //9 -}; - - -/** - * @brief Writes to an AX5043 register. - * - * @param[in] spip pointer to the @p SPIDriver object. - * @param[in] reg AX5043 register address. - * @param[in] value AX5043 register value. - * @param[out] ret_value Complete AX5043 returned value. - * - * @return Most significant status bit. - */ -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]){ - uint8_t command_buf[3] = {0,0,0}; - if(reg < 0x0070){ - command_buf[0]=0x80|reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - else{ - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - /*Retun status from Ax5043 while writting the register.*/ - return ret_value[0]; -} - -/** - * @brief Reads AX5043 register.. - * - * @param[in] spip pointer to the @p SPIDriver object. - * @param[in] reg AX5043 register address. - * @param[in] value AX5043 register value. - * @param[out] ret_value Complete AX5043 returned value. - * - * @return Register content. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]){ - uint8_t command_buf[3] = {0,0,0 }; - if(reg < 0x0070){ - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - /* Return the reg value when reading the register.*/ - return ret_value[1]; - } - else{ - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - /* Return the reg value when reading the register.*/ - return ret_value[2]; - } -} - -/** - * @brief Sets powermode register of AX5043. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] reg_value powermode register value. - * - * @return Most significant status bits from last SPI call. - */ -uint8_t ax5043_set_pwrmode(AX5043Driver *devp, uint8_t reg_value){ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - SPIDriver *spip = devp->config->spip; - - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | reg_value; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - devp->status_code = ret_value[0]; - /*Return last status from Ax5043 while writting the register. - Normal value is 0x80 0r 0x88*/ - return ret_value[0]; -} - -/** - * @brief Resets the AX5043. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @return Most significant status bits from last SPI call. - */ -uint8_t ax5043_reset(AX5043Driver *devp){ - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - - /* Reset the chip through powermode register.*/ - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(1); - - /* Write to powermode register for enabling XOEN and REFIN and shutdown mode. - Page 33 in programming manual.*/ - value=ax5043_read_reg(&SPID2, AX5043_REG_PWRMODE, value, ret_value); - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA){ - devp->error_code = AXRADIO_ERR_NOT_CONNECTED; - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55){ - devp->error_code = AXRADIO_ERR_NOT_CONNECTED; - } - /*Return last status from Ax5043 while writting the register.*/ - return ret_value[0]; -} - -/** - * @brief Writes to AX5043 FIFO - * - * @param[in] spip pointer to the @p SPIDriver object. - * @param[in] ptr Pointer to array to be written to FIFO. - * @param[in] len length of array to be written to FIFO. - * - * @api - * TODO return a -ve return code if there are any errors - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len){ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - -/** - * @brief Reads to AX5043 FIFO - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] axradio_rxbuffer[] Pointer to array where the packet will be kept. - * @param[in] len Maximum length of array to be read FIFO. - * - * @param[out] Bytes read from FIFO. - */ -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) { - uint8_t ret_value[3]={0,0,0}; - uint8_t bytes_read = 0; - while (len--) { - axradio_rxbuffer[bytes_read] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - bytes_read++; - } - return bytes_read; -} - -/** - * @brief Sets AX5043 registers. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] group register group that needs to be written. - * - * @return Most significant status bits from last SPI call. - */ -uint8_t ax5043_set_regs_group(AX5043Driver *devp, ax5043_reg_group_t group) { - uint8_t rxbuf[3] = {0, 0, 0}; - int i = 0; - ax5043_regval_t* entry = devp->config->reg_values; - while (entry[i].reg != AX5043_REG_END) { - if (entry[i].group == group){ - ax5043_write_reg(devp->config->spip, entry[i].reg, entry[i].val, rxbuf); - } - i++; - } - devp->status_code = rxbuf[0]; - /*Return last status from Ax5043 while writting the register.*/ - return rxbuf[0]; -} - -/** - * @brief Gets AX5043 register values from the AX5043 driver structure. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] reg_name register name. - * - * @return register value. - */ -uint8_t ax5043_get_reg_val(AX5043Driver *devp, uint16_t reg_name) { - int i = 0; - ax5043_regval_t* entry = devp->config->reg_values; - while (entry[i].reg != AX5043_REG_END) { - if (entry[i].reg == reg_name){ - return entry[i].val; - } - i++; - } - devp->error_code = AXRADIO_ERR_REG_NOT_IN_CONF; - return 0; -} - -/** - * @brief Gets AX5043 configuration values from the AX5043 driver structure. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] conf_name configuration variable name. - * - * @retrun value in configuration variable. - * - * @api - * TODO return a -ve return code if there are any errors - */ -uint32_t ax5043_get_conf_val(AX5043Driver *devp, uint8_t conf_name) { - int i = 0; - ax5043_confval_t* entry = devp->config->conf_values; - while (entry[i].conf_name != AXRADIO_PHY_END) { - if (entry[i].conf_name == conf_name){ - return entry[i].val; - } - i++; - } - devp->error_code = AXRADIO_ERR_VAL_NOT_IN_CONF; - return 0; -} - -/** - * @brief Sets AX5043 configuration values from the AX5043 driver structure. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] conf_name configuration variable name. - * @param[in] value value in configuration variable. - * - * @return 0 if successful, else 0x11. - */ -uint8_t ax5043_set_conf_val(AX5043Driver *devp, uint8_t conf_name, uint32_t value) { - int i = 0; - ax5043_confval_t* entry = devp->config->conf_values; - while (entry[i].conf_name != AXRADIO_PHY_END) { - if (entry[i].conf_name == conf_name){ - entry[i].val = value; - return 0; - } - i++; - } - devp->error_code = AXRADIO_ERR_VAL_NOT_IN_CONF; - return AXRADIO_ERR_VAL_NOT_IN_CONF; -} - -/** - * @brief prepare AX5043 for tx. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(AX5043Driver *devp){ - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - ax5043_set_pwrmode(devp, AX5043_STANDBY); - ax5043_set_pwrmode(devp, AX5043_FIFO_ENABLED); - ax5043_set_regs_group(devp,tx); - ax5043_init_registers_common(devp); - - /* Set FIFO threshold and interrupt mask.*/ - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - /* Wait for xtal.*/ - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - devp->status_code = ret_value[0]; - devp->state = AX5043_TX; -} - -/** - * @brief prepare AX5043 for rx. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(AX5043Driver *devp){ - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - ax5043_set_regs_group(devp,rx); - ax5043_init_registers_common(devp); - - /* Updates RSSI reference value, Sets a group of RX registers.*/ - uint8_t rssireference = ax5043_get_conf_val(devp, AXRADIO_PHY_RSSIREFERENCE) ; - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, rssireference, ret_value); - ax5043_set_regs_group(devp,rx_cont); - /* Resets FIFO, changes powermode to FULL RX.*/ - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value); - ax5043_set_pwrmode(devp, AX5043_FULL_RX); - /* Sets FIFO threshold and interrupt mask.*/ - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - devp->status_code = ret_value[0]; - devp->state = AX5043_RX; -} - -/** - * @brief Does PLL ranging. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @returns PLLVCOI Register content. - * @api - * TODO return a -ve return code if there are any errors - */ -uint8_t axradio_get_pllvcoi(AX5043Driver *devp){ - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - uint8_t x = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANVCOIINIT) ; - uint8_t pll_init_val = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNGINIT); - uint8_t pll_val = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNG); - if (x & 0x80) { - if (!(pll_init_val & 0xF0)) { - x += (pll_val & 0x0F) - (pll_init_val & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - -/** - * @brief Initialized AX5043 registers common to RX and TX. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - * TODO return a -ve return code if there are any errors - */ -void ax5043_init_registers_common(AX5043Driver *devp){ - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - uint8_t rng = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNG); - if (rng & 0x20) - devp->status_code = AXRADIO_ERR_PLLRNG_VAL; - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } - else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_get_pllvcoi(devp); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - /** - * @brief Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - * TODO Standardize the error handling. - */ -void ax5043_init(AX5043Driver *devp){ - SPIDriver *spip = devp->config->spip; - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(devp); - - ax5043_set_regs_group(devp,common); - ax5043_set_regs_group(devp,tx); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_set_pwrmode(devp, AX5043_STANDBY); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - /* Wait for Xtal.*/ - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0){ - chThdSleepMilliseconds(1); - } - - /* Set frequency.*/ - uint32_t f = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANFREQ); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - /* PLL autoranging.*/ - uint8_t r; - uint8_t pll_init_val = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNGINIT); - if( !(pll_init_val & 0xF0) ) { // start values for ranging available - r = pll_init_val | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - int8_t value = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - ax5043_set_conf_val(devp, AXRADIO_PHY_CHANPLLRNG, value); - devp->state = AX5043_PLL_RANGE_DONE; - - ax5043_set_pwrmode(devp, AX5043_POWERDOWN); - ax5043_set_regs_group(devp,common); - ax5043_set_regs_group(devp,rx); - - uint8_t pll_val = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNG); - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (pll_val & 0x0F), ret_value); - f = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANFREQ); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - ax5043_set_regs_group(devp,local_address); -} - - /** - * @brief Transmit loop to transmit bytes of a packet. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] packet_len Complete packet length including mac. - * @param[in] axradio_txbuffer pointer to packet. - * @param[in] packet_bytes_sent length before the packet. - * - * @api - * TODO Standardize the error handling, remove packet_bytes_sent, simplify the code. - */ -void transmit_loop(AX5043Driver *devp, uint16_t packet_len,uint8_t axradio_txbuffer[]){ - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - uint8_t free_fifo_bytes; - uint8_t packet_end_indicator = 0; - uint16_t packet_bytes_sent = 0; - uint8_t flags = 0; - uint16_t packet_len_to_be_sent = 0; - uint8_t synclen = ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCLEN); - - while (packet_end_indicator == 0) { - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - free_fifo_bytes = 0xff; - else - free_fifo_bytes = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - /* Make sure sixteen bytes in FIFO are free. We can do with minimum 4 bytes free but taking in 16 here.*/ - if (free_fifo_bytes < 19) { - /* FIFO commit.*/ - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); - continue; - } - - switch (devp->state) { - case AX5043_TX_LONGPREAMBLE: - if (!packet_bytes_sent) { - devp->state = AX5043_TX_SHORTPREAMBLE; - packet_bytes_sent = ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_LEN); - break; - } - - free_fifo_bytes = 7; - if (packet_bytes_sent < 7) - free_fifo_bytes = packet_bytes_sent; - packet_bytes_sent -= free_fifo_bytes; - free_fifo_bytes <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_FLAGS), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, free_fifo_bytes, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_BYTE), ret_value); - break; - - case AX5043_TX_SHORTPREAMBLE: - if (!packet_bytes_sent) { - uint8_t preamble_appendbits = ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_APPENDBITS); - if (preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_APPENDPATTERN); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-preamble_appendbits); - byte |= 0x80 >> preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-preamble_appendbits); - byte |= 0x01 << preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && synclen) { - /* Write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS. - Chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT).*/ - int8_t len_byte = synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - /* SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits.*/ - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCFLAGS) | i, ret_value); - - uint8_t syncword[4] = {ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCWORD0), - ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCWORD1), - ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCWORD2), - ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCWORD3)}; - for (i = 0; i < len_byte; ++i) { - ax5043_write_reg(spip,AX5043_REG_FIFODATA, syncword[i], ret_value); - } - } - devp->state = AX5043_TX_PACKET; - continue; - } - free_fifo_bytes = 255; - if (packet_bytes_sent < 255*8) - free_fifo_bytes = packet_bytes_sent >> 3; - if (free_fifo_bytes) { - packet_bytes_sent -= ((uint16_t)free_fifo_bytes) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_FLAGS), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, free_fifo_bytes, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_BYTE), ret_value); - continue; - } - { - uint8_t byte = ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_BYTE) ; - free_fifo_bytes = packet_bytes_sent; - packet_bytes_sent = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - /* MSB first -> stop bit below.*/ - byte &= 0xFF << (8-free_fifo_bytes); - byte |= 0x80 >> free_fifo_bytes; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-free_fifo_bytes); - byte |= 0x01 << free_fifo_bytes; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case AX5043_TX_PACKET: - flags = 0; - packet_len_to_be_sent = 0; - if (!packet_bytes_sent) - /* Flag byte indicates packetstart.*/ - flags |= 0x01; - - packet_len_to_be_sent = packet_len - packet_bytes_sent; - /* 3 bytes of FIFO commands are written before payload can be written to FIFO.*/ - if (free_fifo_bytes >= packet_len_to_be_sent + 3) { - /* Flag byte indicates packet end.*/ - flags |= 0x02; - } - else{ - packet_len_to_be_sent = free_fifo_bytes - 3; - } - - - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - /* Write FIFO chunk length byte. Length includes the flag byte, thus the +1.*/ - ax5043_write_reg(spip,AX5043_REG_FIFODATA, packet_len_to_be_sent + 1, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[packet_bytes_sent], packet_len_to_be_sent); - packet_bytes_sent += packet_len_to_be_sent; - if (flags & 0x02){ - packet_end_indicator = 1; - /* Enable radio event done (REVRDONE) event.*/ - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - } - break; - - default: - packet_end_indicator = 1; - devp->error_code = AXRADIO_ERR_UNEXPECTED_STATE; - } - } - devp->state = AX5043_TX; -} - -/** - * @brief Transmits a packet. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] addr remote destination address of packet. - * @param[in] pkt pointer to packet. - * @param[in] pktlen packet length. - * - * @param[out] AXRADIO_ERR Error code. - * - * @api - * TODO Standardize the error handling, Maybe move address to a driver config structure - */ -uint8_t transmit_packet(AX5043Driver *devp, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) { - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - uint16_t packet_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - uint8_t axradio_localaddr[4]; - - uint8_t maclen = ax5043_get_conf_val(devp, AXRADIO_FRAMING_MACLEN); - uint8_t destaddrpos = ax5043_get_conf_val(devp, AXRADIO_FRAMING_DESTADDRPOS); - uint8_t addrlen = ax5043_get_conf_val(devp, AXRADIO_FRAMING_ADDRLEN); - uint8_t sourceaddrpos = ax5043_get_conf_val(devp, AXRADIO_FRAMING_SOURCEADDRPOS); - uint8_t lenmask = ax5043_get_conf_val(devp, AXRADIO_FRAMING_LENMASK); - uint8_t lenoffs = ax5043_get_conf_val(devp, AXRADIO_FRAMING_LENOFFS); - uint8_t lenpos = ax5043_get_conf_val(devp, AXRADIO_FRAMING_LENPOS); - - axradio_localaddr[0] = ax5043_get_reg_val(devp, AX5043_REG_PKTADDR0); - axradio_localaddr[1] = ax5043_get_reg_val(devp, AX5043_REG_PKTADDR1); - axradio_localaddr[2] = ax5043_get_reg_val(devp, AX5043_REG_PKTADDR2); - axradio_localaddr[3] = ax5043_get_reg_val(devp, AX5043_REG_PKTADDR3); - - packet_len = pktlen + maclen; - if (packet_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - - /* Prepare the MAC segment of the packet.*/ - memset(axradio_txbuffer, 0, maclen); - memcpy(&axradio_txbuffer[maclen], pkt, pktlen); - if (destaddrpos != 0xff) - memcpy(&axradio_txbuffer[destaddrpos], &addr->addr, addrlen); - if (sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[sourceaddrpos], axradio_localaddr, addrlen); - if (lenmask) { - /* Calculate payload length and update the MAC of payload.*/ - uint8_t len_byte = (uint8_t)(packet_len - lenoffs) & lenmask; - axradio_txbuffer[lenpos] = (axradio_txbuffer[lenpos] & (uint8_t)~lenmask) | len_byte; - } - /*Clear radioevent flag. This indicator is set when packet is out.*/ - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - /* Clear leftover FIFO data & flags.*/ - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); - devp->state = AX5043_TX_LONGPREAMBLE; - - /*Code for 4-FSK mode.*/ - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - /* Length including flags.*/ - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); - /* Flag PKTSTART -> dibit sync.*/ - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); - /* Dummy byte for forcing dibit sync.*/ - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); - } - transmit_loop(devp, packet_len, axradio_txbuffer); - ax5043_set_pwrmode(devp, AX5043_FULL_TX); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - devp->error_code = AXRADIO_ERR_NOERROR; - return AXRADIO_ERR_NOERROR; -} - -/** - * @brief Receive loop to recieve bytes from FIFO. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[out] axradio_rxbuffer[] Pointer to array where the packet will be kept. - * - * @return Length of packet received. - * - * @api - * TODO return a -ve return code if there are any errors - */ -uint8_t receive_loop(AX5043Driver *devp, uint8_t axradio_rxbuffer[]) { - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - uint8_t fifo_cmd; - uint8_t i; - uint8_t chunk_len; - uint8_t bytesRead = 0; - - /* Clear interrupt.*/ - ax5043_read_reg(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - devp->state = AX5043_RX_LOOP; - /* Loop until FIFO not empty.*/ - while ((ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value) & 0x01) != 1) { - /* FIFO read comman.*/ - fifo_cmd = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - /* Top 3 bits encode payload length.*/ - chunk_len = (fifo_cmd & 0xE0) >> 5; - /* 7 means variable length, get length byte from next read.*/ - if (chunk_len == 7) - chunk_len = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (chunk_len!=0){ - /* Discard the flag.*/ - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chunk_len = chunk_len - 1; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, chunk_len); - } - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (chunk_len == 3){ - devp->rf_freq_off3 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - devp->rf_freq_off2 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - devp->rf_freq_off1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - } - else{ - for(i=0;idropped[i] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - devp->error_code = AXRADIO_ERR_FIFO_CHUNK; - } - } - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (chunk_len == 2){ - devp->rf_freq_off3 = 0; - devp->rf_freq_off2 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - devp->rf_freq_off1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - } - else{ - for(i=0;idropped[i] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - devp->error_code = AXRADIO_ERR_FIFO_CHUNK; - } - } - break; - - case AX5043_FIFOCMD_RSSI: - if (chunk_len == 1){ - devp->rssi = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - } - else{ - for(i=0;idropped[i] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - devp->error_code = AXRADIO_ERR_FIFO_CHUNK; - } - } - break; - - default: - devp->error_code = AXRADIO_ERR_FIFO_CMD; - for(i=0;idropped[i] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - } - } - devp->state = AX5043_RX; - } - return bytesRead; -} - -/** - * @brief Prepare for CW mode - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @return Length of packet received. - * - * @api - * TODO return a -ve return code if there are any errors - */ -uint8_t ax5043_prepare_cw(AX5043Driver *devp){ - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x01, ret_value); - - ax5043_set_pwrmode(devp, AX5043_FULL_TX); - - /* This is not mentioned in datasheet or programming manual but is required. - * Removing this will make the transmission to transmit in low power for a few seconds - * before it reaches peak power.*/ - /* FIFO reset.*/ - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_FIFOCMD_REPEATDATA|0x60), ret_value); - /* Preamble flag.*/ - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xff, ret_value); - /* Preamble.*/ - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value); - /* FIFO Commit.*/ - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value); - - ax5043_set_pwrmode(devp, AX5043_STANDBY); - devp->state = AX5043_CW; - return 0; -} - -/** - * @brief Send Morse dot and dash over the air - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] dot_dash_time time in milliseconds for transmiter to be on. - */ -void ax5043_morse_dot_dash(AX5043Driver *devp, uint16_t dot_dash_time){ - - uint8_t ret_value[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - ax5043_set_pwrmode(devp, AX5043_FULL_TX); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_FIFOCMD_REPEATDATA|0x60), ret_value); - /* Preamble flag.*/ - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xFF, ret_value); - /* Preamble.*/ - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - /* FIFO Commit.*/ - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value); - chThdSleepMilliseconds(dot_dash_time); - ax5043_set_pwrmode(devp, AX5043_STANDBY); - -} - -/** - * @brief Convert an alphabet or number to morse dot and dash - * - * @param[in] letter An alphabet or number. - * - * @return Length of packet received. - */ -const char *ax5043_ascii_to_morse(char letter){ - letter = tolower(letter); - - if (isalpha(letter)){ - return alpha[letter-'a']; - } - else if (isdigit(letter)){ - return num[letter-'0']; - } - - return SPACE; -} - -/** - * @brief Convert a message to morse code and transmit it. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] wpm words per minute. - * @param[in] beaconMessage Message to be transmitted. - * @param[in] pktlen Length of packet/beacon message. - */ -void ax5043_send_cw(AX5043Driver *devp, int wpm, char beaconMessage[], uint16_t pktlen ){ - int element; - int index = 0; - const char *morse; - - uint16_t ditLength = 1200/wpm; - uint16_t letter_space = ditLength*3; - uint16_t word_space = ditLength*7; - uint16_t element_space = ditLength; - uint16_t dash = ditLength*3; - - while (index < pktlen){ - morse = ax5043_ascii_to_morse(beaconMessage[index]); - - element = 0; - while (morse[element] != '\0'){ - switch(morse[element]){ - case '-': - ax5043_morse_dot_dash(devp, dash); - break; - case '.': - ax5043_morse_dot_dash(devp, ditLength); - break; - } - - if (morse[element] == ' '){ - chThdSleepMilliseconds(word_space); - } - else if (morse[element+1] != '\0'){ - chThdSleepMilliseconds(element_space); - } - else if (morse[element+1] == '\0'){ - chThdSleepMilliseconds(letter_space); - } - element++; - } - - index++; - } -} -/*==========================================================================*/ -/* Interface implementation. */ -/*==========================================================================*/ - -static const struct AX5043VMT vmt_device = { - (size_t)0, -}; - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes an instance. Radio is still uninitialized. - * - * @param[out] devp pointer to the @p AX5043Driver object - * - * @init - */ -void ax5043ObjectInit(AX5043Driver *devp) { - devp->vmt = &vmt_device; - - devp->config = NULL; - - devp->state = AX5043_UNINIT; -} - -/** - * @brief Configures and activates the AX5043 Radio Driver. - * - * @param[in] devp pointer to the @p AX5043Driver object - * @param[in] config pointer to the @p AX5043Config object - */ -void ax5043Start(AX5043Driver *devp, const AX5043Config *config) { - osalDbgCheck((devp != NULL) && (config != NULL)); - osalDbgAssert((devp->state == AX5043_UNINIT) || - (devp->state == AX5043_READY), - "ax5043Start(), invalid state"); - - devp->config = config; - devp->rf_freq_off3 = 0; - devp->rf_freq_off2 = 0; - devp->rf_freq_off1 = 0; - devp->rssi = 0; - devp->error_code = 0; - devp->status_code = 0; - - ax5043_init(devp); - switch(config->ax5043_mode) { - case AX5043_MODE_RX: - ax5043_prepare_rx(devp); - break; - case AX5043_MODE_TX: - ax5043_prepare_tx(devp); - break; - case AX5043_MODE_CW: - ax5043_prepare_cw(devp); - break; - case AX5043_MODE_OFF: - ax5043_set_pwrmode(devp, AX5043_POWERDOWN); - break; - default: - ax5043_prepare_rx(devp); - } -} - -/** - * @brief Stops the AX5043 Radio Driver. - * - * @param[in] devp pointer to the @p AX5043Driver object - */ -void ax5043Stop(AX5043Driver *devp) { - ax5043_set_pwrmode(devp, AX5043_POWERDOWN); - devp->state = AX5043_OFF; - /* TODO: verify if additional driver things needs to be done.*/ - devp->state = AX5043_STOP; -} - -//!@ diff --git a/src/archive/app_ax5043_driver/source/ax5043.h b/src/archive/app_ax5043_driver/source/ax5043.h deleted file mode 100644 index 9853717a..00000000 --- a/src/archive/app_ax5043_driver/source/ax5043.h +++ /dev/null @@ -1,732 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_H -#define _AX5043_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define RX_BAUDRATE 9600 -#define TX_BAUDRATE 9600 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_set_regs(SPIDriver * spip); -void ax5043_set_regs_tx(SPIDriver * spip); -void ax5043_set_regs_rx(SPIDriver * spip); -void ax5043_set_regs_rxcont(SPIDriver * spip); -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_reset(SPIDriver * spip); -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr); -void ax5043_set_local_addr(SPIDriver * spip); -void ax5043_prepare_tx(SPIDriver * spip); -void ax5043_prepare_rx(SPIDriver * spip); -void ax5043_init_registers_common(SPIDriver * spip); -uint8_t axradio_get_pllvcoi(SPIDriver * spip); - -void ax5043_init(SPIDriver * spip); -void ax5043_receive(SPIDriver * spip); - - -//functions added from bradenburg's code. -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) ; -uint8_t receive_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]); - -#endif -//! @} diff --git a/src/archive/app_ax5043_engr_rx/Makefile b/src/archive/app_ax5043_engr_rx/Makefile deleted file mode 100644 index 2d3f679b..00000000 --- a/src/archive/app_ax5043_engr_rx/Makefile +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = HDLC_FEC_RX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_ax5043_engr_rx/README.md b/src/archive/app_ax5043_engr_rx/README.md deleted file mode 100644 index 251e4488..00000000 --- a/src/archive/app_ax5043_engr_rx/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_sx1236_FulDuplex_ground - -This is used to transmit semtech radio packets signal. -This creates a instruction packet at 735.5 MhZ in a fixed interval. This code simulates ground. This pairs with " app_sx1236_FulDuplex_oresat " which receives the instruction and responds with data. the sent and received packet are shown in serial terminal. - diff --git a/src/archive/app_ax5043_engr_rx/conf/chconf.h b/src/archive/app_ax5043_engr_rx/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_ax5043_engr_rx/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_engr_rx/conf/halconf.h b/src/archive/app_ax5043_engr_rx/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_ax5043_engr_rx/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_engr_rx/conf/mcuconf.h b/src/archive/app_ax5043_engr_rx/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_ax5043_engr_rx/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_engr_rx/main.c b/src/archive/app_ax5043_engr_rx/main.c deleted file mode 100644 index dce9c29d..00000000 --- a/src/archive/app_ax5043_engr_rx/main.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - -//#include "adf7030.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - - -const struct axradio_address remoteaddr_tx = { - { 0x32, 0x34, 0x00, 0x00} -}; -const struct axradio_address_mask localaddr_tx = { - { 0x33, 0x34, 0x00, 0x00}, - { 0xFF, 0x00, 0x00, 0x00} -}; - -uint8_t axradio_rxbuffer[256]; //buffer to receive radio data - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0 -}; - - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - //spiSelect(&SPID2); - - - - - - //uint16_t reg=0; - //uint8_t value=0; - //uint8_t value1=0x55; - //uint8_t ret_value[3]={0,0,0}; - //int i; - - - - chprintf(DEBUG_CHP, "Configuring AX5043\r\n"); - chThdSleepMilliseconds(50); - ax5043_init(&SPID2); - ax5043_set_addr(&SPID2, localaddr_tx); - chprintf(DEBUG_CHP, "done reseting AX5043\r\n"); - - - - ax5043_prepare_rx(&SPID2); - - - - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - uint8_t packet_len=0; - uint8_t ret_value[3]={0,0,0}; - - /* Enabling events on both edges of the button line.*/ - //palEnableLineEvent(LINE_BUTTON, PAL_EVENT_MODE_RISING_EDGE); - palEnableLineEvent(LINE_SX_INT0, PAL_EVENT_MODE_RISING_EDGE); - - - while(true) - { - //palWaitLineTimeout(LINE_BUTTON, TIME_INFINITE); - //palWaitLineTimeout(LINE_ARD_A5, TIME_INFINITE); - //palWaitLineTimeout(LINE_ARD_A5, TIME_MS2I(5000)); - - palWaitLineTimeout(LINE_SX_INT0, TIME_MS2I(5000)); - - if (palReadLine(LINE_SX_INT0)) - chprintf(DEBUG_CHP, "\r\r int line is HIGH ** \r\n"); - else - chprintf(DEBUG_CHP, "\r\r int line is LOW ** \r\n"); - - packet_len=receive_loop(&SPID2, axradio_rxbuffer); - - if(packet_len > 0) - chprintf(DEBUG_CHP,"INFO: Received packet %d\r\n",axradio_rxbuffer[3]); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_engr_rx/source/README.md b/src/archive/app_ax5043_engr_rx/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_engr_rx/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_engr_rx/source/ax5043.c b/src/archive/app_ax5043_engr_rx/source/ax5043.c deleted file mode 100644 index 6e730683..00000000 --- a/src/archive/app_ax5043_engr_rx/source/ax5043.c +++ /dev/null @@ -1,1175 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043.h" - - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_phy_pn9 = 0; -const uint8_t axradio_phy_nrchannels = 1; -const uint32_t axradio_phy_chanfreq[1] = { 0x0912aaab }; -const uint8_t axradio_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_phy_chanvcoiinit[1] = { 0x98 }; -uint8_t axradio_phy_chanpllrng[1]; -uint8_t axradio_phy_chanvcoi[1]; -const uint8_t axradio_phy_vcocalib = 0; -const int32_t axradio_phy_maxfreqoffset = 913; -const int8_t axradio_phy_rssioffset = 64; -// axradio_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_phy_rssireference = (int8_t)(0xF9 + 64); -const int8_t axradio_phy_channelbusy = -87 + 64; -const uint16_t axradio_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_phy_cs_enabled = 0; -const uint8_t axradio_phy_lbt_retries = 0; -const uint8_t axradio_phy_lbt_forcetx = 0; -const uint16_t axradio_phy_preamble_wor_longlen = 23; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_phy_preamble_wor_len = 184; -const uint16_t axradio_phy_preamble_longlen = 0; -const uint16_t axradio_phy_preamble_len = 72; -const uint8_t axradio_phy_preamble_byte = 0x7e; -const uint8_t axradio_phy_preamble_flags = 0x38; -const uint8_t axradio_phy_preamble_appendbits = 0; -const uint8_t axradio_phy_preamble_appendpattern = 0x00; - -//framing variables generated from radiolab -const uint8_t axradio_framing_maclen = 3; -const uint8_t axradio_framing_addrlen = 1; -const uint8_t axradio_framing_destaddrpos = 0; -const uint8_t axradio_framing_sourceaddrpos = 0xff; -const uint8_t axradio_framing_lenpos = 2; -const uint8_t axradio_framing_lenoffs = 0; -const uint8_t axradio_framing_lenmask = 0xff; -const uint8_t axradio_framing_swcrclen = 0; - -const uint8_t axradio_framing_synclen = 32; -const uint8_t axradio_framing_syncword[] = { 0xcc, 0xaa, 0xcc, 0xaa}; -const uint8_t axradio_framing_syncflags = 0x38; -const uint8_t axradio_framing_enable_sfdcallback = 0; - -const uint32_t axradio_framing_ack_timeout = 8; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_framing_ack_retransmissions = 0; -const uint8_t axradio_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_wor_period = 128; -const uint8_t axradio_phy_innerfreqloop = 0; - -/** - * writes to an AX5043 register. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0}; - - if(reg < 0x0070) - { - command_buf[0]=0x80|reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - else - { - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - //chprintf(DEBUG_CHP,"INFO: Write Reg 0x%x status: 0x%x %x %x \r\n", reg, ret_value[0], ret_value[1], ret_value[2]); - return ret_value[0]; //retun status while writting the register - -} - - -/** - * Reds an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value in the register. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0 }; - //uint8_t rx_buf[2]={0 ,0 }; - - if(reg < 0x0070) - { - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP,"INFO: Read Reg 0x%x status: 0x%x %x %x \r\n", reg, ret_value[0], ret_value[1], ret_value[2]); - return ret_value[1]; //return the reg value when reading the register - } - else - { - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP,"INFO: Read Reg 0x%x status: 0x%x %x %x \r\n", reg, ret_value[0], ret_value[1], ret_value[2]); - return ret_value[2]; //return the reg value when reading the register - } - -} - - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -void ax5043_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x24, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x30, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x88, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x89, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x82, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xC8, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); // - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); // - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x8A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xEB, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x20, ret_value); //original 20, accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); - - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTSTOREFLAGS, (uint8_t)0x14, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xB5, ret_value); -} - -/** - * Shutdown after reset the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_shutdown(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * Standby the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_standby(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Enable FIFO in AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_fifo_en(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FIFO_ENABLED; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * put AX5043 in synthesizer RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * changes AX5043 to full RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * put AX5043 in synthesizer TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * changes AX5043 to full TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - - - - - -/** - * Resets the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_reset(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - //spiUnselect(spip); - //chThdSleepMicroseconds(10); - - //Reset the chip through powermode register - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(1); - //chThdSleepMicroseconds(5); - - //read the powermode register - value=ax5043_read_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - //write to powermode register for enabling XOEN and REFIN and shutdown mode - //page 33 in programming manual - //value = value | AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT; - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - - //ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x00, ret_value); - - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA) - { - chprintf(DEBUG_CHP, "Scratch register does not match 0\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55) - { - chprintf(DEBUG_CHP, "Scratch register does not match 1\r\n"); - } - //ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x02, ret_value); - //chThdSleepMilliseconds(10); - - -} - - -/** - * sets AX5043 address registers - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr) -{ - uint8_t ret_value[3]={0,0,0}; - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)local_addr.addr[0], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)local_addr.addr[1], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)local_addr.addr[2], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)local_addr.addr[3], ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)local_addr.mask[0], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)local_addr.mask[1], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)local_addr.mask[2], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)local_addr.mask[3], ret_value); -} - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_set_regs_tx(spip); - ax5043_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - - //set address values - //ax5043_set_local_addr(spip); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - //ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_set_regs_rx(spip); - ax5043_init_registers_common(spip); - - - //follows code from function ax5043_receiver_on_continuous() in easyax5043.c from radiolab - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_phy_rssireference, ret_value); - ax5043_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - //set address values - //ax5043_set_local_addr(spip); - -} - - -void ax5043_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - -uint8_t axradio_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_phy_chanpllrng[0] & 0x0F) - (axradio_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_init(SPIDriver * spip) -{ - - - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); - - - //ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - - //PLL autoranging - uint8_t r; - if( !(axradio_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - - -/** - * read FIFO packet for a packet - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_receive(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - //ax5043_full_rx(spip); - //ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO status value 0x%x \r\n", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO Data 0x%x \r\n", value); - while(!(ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value)&0x01)) - { - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "0x%x ", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO 0x%x \r\n", value); - } - - chprintf(DEBUG_CHP, "\r\r finished reading FIFO--\r\n", value); - - -} - - - -/** - * writes to FIFO - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - -/** - * Transmits a packet - * The logic is similar to transmit_isr() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_phy_preamble_appendbits); - byte |= 0x80 >> axradio_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_phy_preamble_appendbits); - byte |= 0x01 << axradio_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Logic similar to axradio_transmit() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_framing_maclen); - memcpy(&axradio_txbuffer[axradio_framing_maclen], pkt, pktlen); - if (axradio_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_destaddrpos], &addr->addr, axradio_framing_addrlen); - if (axradio_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_framing_addrlen); - if (axradio_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_framing_lenoffs) & axradio_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_framing_lenpos] = (axradio_txbuffer[axradio_framing_lenpos] & (uint8_t)~axradio_framing_lenmask) | len_byte; - } -/* - if (axradio_framing_swcrclen) - axradio_txbuffer_len = axradio_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_phy_preamble_longlen; -*/ - //ax5043_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - - - - - -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) { - uint8_t ret_value[3]={0,0,0}; - uint8_t loc = 0; - while (len--) { - axradio_rxbuffer[loc] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - //chprintf(DEBUG_CHP,"Packet: %x \r\n", axradio_rxbuffer[loc]); - loc++; - } - return loc; -} - - - - - -uint8_t receive_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]) { - uint8_t ret_value[3]={0,0,0}; - uint8_t fifo_cmd; - uint8_t i; - uint8_t b0; - uint8_t b1; - uint8_t b2; - uint8_t b3; - uint8_t len = ax5043_read_reg(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); // clear request so interrupt does not fire again. sync_rx enables interrupt on radio state changed in order to wake up on SDF detected - - uint8_t bytesRead = 0; - - - chprintf(DEBUG_CHP,"INFO: Waiting for a packet\r\n"); - while ((ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value) & 0x01) != 1) { // FIFO not empty - fifo_cmd = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // read command - len = (fifo_cmd & 0xE0) >> 5; // top 3 bits encode payload len - if (len == 7) - len = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // 7 means variable length, -> get length byte - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (!len) - break; - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // Discard the flags - --len; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, len); - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (axradio_phy_innerfreqloop || len != 3) - goto dropchunk; - i = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - i &= 0x0F; - i |= 1 + (uint8_t)~(i & 0x08); - b3 = ((int8_t)i) >> 8; - b2 = i; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x%02x\r\n", b3, b2, b1, b0); - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (!axradio_phy_innerfreqloop || len != 2) - goto dropchunk; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: Frequency offset: 0x%02x%02x\r\n", b1, b2); - break; - - case AX5043_FIFOCMD_RSSI: - if (len != 1) - goto dropchunk; - { - int8_t r; - r = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RSSI %d\r\n", (int)r); - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unknown FIFO cmd %x \r\n", fifo_cmd); - dropchunk: - chprintf(DEBUG_CHP, "WARNING: Discarding chunk in FIFO\r\n"); - if (!len) - break; - i = len; - do { - int8_t data; - data = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value);// purge FIFO - chprintf(DEBUG_CHP,"Unknown: %x \r\n", data); - } - while (--i); - break; - } - } - - //chprintf(DEBUG_CHP, "INFO: Done waiting for a packet\r\n"); - - return bytesRead; - -} - - - - - -//!@ - diff --git a/src/archive/app_ax5043_engr_rx/source/ax5043.h b/src/archive/app_ax5043_engr_rx/source/ax5043.h deleted file mode 100644 index 9853717a..00000000 --- a/src/archive/app_ax5043_engr_rx/source/ax5043.h +++ /dev/null @@ -1,732 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_H -#define _AX5043_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define RX_BAUDRATE 9600 -#define TX_BAUDRATE 9600 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_set_regs(SPIDriver * spip); -void ax5043_set_regs_tx(SPIDriver * spip); -void ax5043_set_regs_rx(SPIDriver * spip); -void ax5043_set_regs_rxcont(SPIDriver * spip); -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_reset(SPIDriver * spip); -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr); -void ax5043_set_local_addr(SPIDriver * spip); -void ax5043_prepare_tx(SPIDriver * spip); -void ax5043_prepare_rx(SPIDriver * spip); -void ax5043_init_registers_common(SPIDriver * spip); -uint8_t axradio_get_pllvcoi(SPIDriver * spip); - -void ax5043_init(SPIDriver * spip); -void ax5043_receive(SPIDriver * spip); - - -//functions added from bradenburg's code. -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) ; -uint8_t receive_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]); - -#endif -//! @} diff --git a/src/archive/app_ax5043_engr_tx/Makefile b/src/archive/app_ax5043_engr_tx/Makefile deleted file mode 100644 index 2d3f679b..00000000 --- a/src/archive/app_ax5043_engr_tx/Makefile +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = HDLC_FEC_RX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_ax5043_engr_tx/README.md b/src/archive/app_ax5043_engr_tx/README.md deleted file mode 100644 index fbb1fadd..00000000 --- a/src/archive/app_ax5043_engr_tx/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_sx1236_ax5043_HDLC_FEC_tx - -This is used to transmit sax5043 radio packets signal. -This creates a instruction packet at 435.5 MhZ in a fixed interval. This code simulates ground. This pairs with " app_sx1236_FulDuplex_oresat " which receives the instruction and responds with data. the sent and received packet are shown in serial terminal. - diff --git a/src/archive/app_ax5043_engr_tx/conf/chconf.h b/src/archive/app_ax5043_engr_tx/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_ax5043_engr_tx/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_engr_tx/conf/halconf.h b/src/archive/app_ax5043_engr_tx/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_ax5043_engr_tx/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_engr_tx/conf/mcuconf.h b/src/archive/app_ax5043_engr_tx/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_ax5043_engr_tx/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_engr_tx/main.c b/src/archive/app_ax5043_engr_tx/main.c deleted file mode 100644 index 78124fe1..00000000 --- a/src/archive/app_ax5043_engr_tx/main.c +++ /dev/null @@ -1,204 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - - -//#include "adf7030.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x33, 0x34, 0x00, 0x00} -}; -const struct axradio_address_mask localaddr_tx = { - { 0x32, 0x34, 0x00, 0x00}, - { 0xFF, 0x00, 0x00, 0x00} -}; -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3A, 0x43, 0x51, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0x54, 0x65, 0x73, 0x74, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x31 }; -const uint8_t framing_insert_counter = 1; -const uint8_t framing_counter_pos = 0; - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - - -/* - * Initialize the SPI drivers and configure the adf7030 chips - */ -static void app_init(void) -{ - - uint16_t pkt_counter = 0; - - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - chThdSleepMilliseconds(1000); - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - //spiSelect(&SPID2); - chThdSleepMilliseconds(1000); - - - - //uint16_t reg=0; - //uint8_t value=0; - //uint8_t value1=0x55; - //uint8_t ret_value[3]={0,0,0}; - //int i; - - - chprintf(DEBUG_CHP, "Configuring AX5043\r\n"); - chThdSleepMilliseconds(50); - ax5043_init(&SPID2); - ax5043_set_addr(&SPID2, localaddr_tx); - ax5043_prepare_tx(&SPID2); - chprintf(DEBUG_CHP, "done reseting AX5043\r\n"); - - - for (;;) { - static uint8_t demo_packet_[sizeof(demo_packet)]; - //uint16_t pkt_counter = 0; - - ++pkt_counter; - memcpy(demo_packet_, demo_packet, sizeof(demo_packet)); - if (framing_insert_counter) { - demo_packet_[framing_counter_pos] = (uint8_t)(pkt_counter & 0xFF); - demo_packet_[framing_counter_pos+1] = (uint8_t)((pkt_counter>>8) & 0xFF); - } - - chprintf(DEBUG_CHP,"INFO: Sending packet %d\r\n",pkt_counter); - transmit_packet(&SPID2, &remoteaddr_tx, demo_packet_, sizeof(demo_packet)); - - chThdSleepMilliseconds(3000); - } - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(500); - chprintf(DEBUG_CHP, "."); - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_engr_tx/source/README.md b/src/archive/app_ax5043_engr_tx/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_engr_tx/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_engr_tx/source/ax5043.c b/src/archive/app_ax5043_engr_tx/source/ax5043.c deleted file mode 100644 index a4a5ab4b..00000000 --- a/src/archive/app_ax5043_engr_tx/source/ax5043.c +++ /dev/null @@ -1,1171 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043.h" - - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_phy_pn9 = 0; -const uint8_t axradio_phy_nrchannels = 1; -const uint32_t axradio_phy_chanfreq[1] = { 0x0912aaab }; -const uint8_t axradio_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_phy_chanvcoiinit[1] = { 0x98 }; -uint8_t axradio_phy_chanpllrng[1]; -uint8_t axradio_phy_chanvcoi[1]; -const uint8_t axradio_phy_vcocalib = 0; -const int32_t axradio_phy_maxfreqoffset = 913; -const int8_t axradio_phy_rssioffset = 64; -// axradio_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_phy_rssireference = (int8_t)(0xF9 + 64); -const int8_t axradio_phy_channelbusy = -87 + 64; -const uint16_t axradio_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_phy_cs_enabled = 0; -const uint8_t axradio_phy_lbt_retries = 0; -const uint8_t axradio_phy_lbt_forcetx = 0; -const uint16_t axradio_phy_preamble_wor_longlen = 23; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_phy_preamble_wor_len = 184; -const uint16_t axradio_phy_preamble_longlen = 0; -const uint16_t axradio_phy_preamble_len = 72; -const uint8_t axradio_phy_preamble_byte = 0x7e; -const uint8_t axradio_phy_preamble_flags = 0x38; -const uint8_t axradio_phy_preamble_appendbits = 0; -const uint8_t axradio_phy_preamble_appendpattern = 0x00; - -//framing variables generated from radiolab -const uint8_t axradio_framing_maclen = 3; -const uint8_t axradio_framing_addrlen = 1; -const uint8_t axradio_framing_destaddrpos = 0; -const uint8_t axradio_framing_sourceaddrpos = 0xff; -const uint8_t axradio_framing_lenpos = 2; -const uint8_t axradio_framing_lenoffs = 0; -const uint8_t axradio_framing_lenmask = 0xff; -const uint8_t axradio_framing_swcrclen = 0; - -const uint8_t axradio_framing_synclen = 32; -const uint8_t axradio_framing_syncword[] = { 0xcc, 0xaa, 0xcc, 0xaa}; -const uint8_t axradio_framing_syncflags = 0x38; -const uint8_t axradio_framing_enable_sfdcallback = 0; - -const uint32_t axradio_framing_ack_timeout = 8; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_framing_ack_retransmissions = 0; -const uint8_t axradio_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_wor_period = 128; -const uint8_t axradio_phy_innerfreqloop = 0; - -/** - * writes to an AX5043 register. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0}; - - if(reg < 0x0070) - { - command_buf[0]=0x80|reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - else - { - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - return ret_value[0]; //retun status while writting the register - -} - - -/** - * Reds an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value in the register. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0 }; - //uint8_t rx_buf[2]={0 ,0 }; - - if(reg < 0x0070) - { - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[1]; //return the reg value when reading the register - } - else - { - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[2]; //return the reg value when reading the register - } - -} - - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -void ax5043_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x24, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x30, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x88, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x89, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x82, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xC8, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); // - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); // - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x8A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xEB, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x20, ret_value); //original 20, accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); - - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTSTOREFLAGS, (uint8_t)0x14, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xB5, ret_value); -} - -/** - * Shutdown after reset the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_shutdown(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * Standby the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_standby(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Enable FIFO in AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_fifo_en(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FIFO_ENABLED; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * put AX5043 in synthesizer RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * changes AX5043 to full RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * put AX5043 in synthesizer TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * changes AX5043 to full TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - - - - - -/** - * Resets the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_reset(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - //spiUnselect(spip); - //chThdSleepMicroseconds(10); - - //Reset the chip through powermode register - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(1); - //chThdSleepMicroseconds(5); - - //read the powermode register - value=ax5043_read_reg(&SPID2, AX5043_REG_PWRMODE, value, ret_value); - //write to powermode register for enabling XOEN and REFIN and shutdown mode - //page 33 in programming manual - //value = value | AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT; - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - - //ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA) - { - chprintf(DEBUG_CHP, "Scratch register does not match 0\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55) - { - chprintf(DEBUG_CHP, "Scratch register does not match 1\r\n"); - } - //ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x02, ret_value); - //chThdSleepMilliseconds(10); - - -} - - -/** - * sets AX5043 address registers - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr) -{ - uint8_t ret_value[3]={0,0,0}; - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)local_addr.addr[0], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)local_addr.addr[1], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)local_addr.addr[2], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)local_addr.addr[3], ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)local_addr.mask[0], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)local_addr.mask[1], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)local_addr.mask[2], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)local_addr.mask[3], ret_value); -} - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_set_regs_tx(spip); - ax5043_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - - //set address values - //ax5043_set_local_addr(spip); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - //ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_set_regs_rx(spip); - ax5043_init_registers_common(spip); - - - //follows code from function ax5043_receiver_on_continuous() in easyax5043.c from radiolab - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_phy_rssireference, ret_value); - ax5043_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - //set address values - //ax5043_set_local_addr(spip); - -} - - -void ax5043_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - -uint8_t axradio_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_phy_chanpllrng[0] & 0x0F) - (axradio_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_init(SPIDriver * spip) -{ - - - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); - - - //ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - - //PLL autoranging - uint8_t r; - if( !(axradio_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - - -/** - * read FIFO packet for a packet - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_receive(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - //ax5043_full_rx(spip); - //ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO status value 0x%x \r\n", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO Data 0x%x \r\n", value); - while(!(ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value)&0x01)) - { - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "0x%x ", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO 0x%x \r\n", value); - } - - chprintf(DEBUG_CHP, "\r\r finished reading FIFO--\r\n", value); - - -} - - - -/** - * writes to FIFO - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - -/** - * Transmits a packet - * The logic is similar to transmit_isr() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_phy_preamble_appendbits); - byte |= 0x80 >> axradio_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_phy_preamble_appendbits); - byte |= 0x01 << axradio_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Logic similar to axradio_transmit() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_framing_maclen); - memcpy(&axradio_txbuffer[axradio_framing_maclen], pkt, pktlen); - if (axradio_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_destaddrpos], &addr->addr, axradio_framing_addrlen); - if (axradio_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_framing_addrlen); - if (axradio_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_framing_lenoffs) & axradio_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_framing_lenpos] = (axradio_txbuffer[axradio_framing_lenpos] & (uint8_t)~axradio_framing_lenmask) | len_byte; - } -/* - if (axradio_framing_swcrclen) - axradio_txbuffer_len = axradio_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_phy_preamble_longlen; -*/ - //ax5043_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - - - - - -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) { - uint8_t ret_value[3]={0,0,0}; - uint8_t loc = 0; - while (len--) { - axradio_rxbuffer[loc] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - //chprintf(DEBUG_CHP,"Packet: %x \r\n", axradio_rxbuffer[loc]); - loc++; - } - return loc; -} - - - - - -uint8_t receive_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]) { - uint8_t ret_value[3]={0,0,0}; - uint8_t fifo_cmd; - uint8_t i; - uint8_t b0; - uint8_t b1; - uint8_t b2; - uint8_t b3; - uint8_t len = ax5043_read_reg(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); // clear request so interrupt does not fire again. sync_rx enables interrupt on radio state changed in order to wake up on SDF detected - - uint8_t bytesRead = 0; - - - chprintf(DEBUG_CHP,"INFO: Waiting for a packet\r\n"); - while ((ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value) & 0x01) != 1) { // FIFO not empty - fifo_cmd = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // read command - len = (fifo_cmd & 0xE0) >> 5; // top 3 bits encode payload len - if (len == 7) - len = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // 7 means variable length, -> get length byte - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (!len) - break; - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // Discard the flags - --len; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, len); - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (axradio_phy_innerfreqloop || len != 3) - goto dropchunk; - i = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - i &= 0x0F; - i |= 1 + (uint8_t)~(i & 0x08); - b3 = ((int8_t)i) >> 8; - b2 = i; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x%02x\r\n", b3, b2, b1, b0); - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (!axradio_phy_innerfreqloop || len != 2) - goto dropchunk; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: Frequency offset: 0x%02x%02x\r\n", b1, b2); - break; - - case AX5043_FIFOCMD_RSSI: - if (len != 1) - goto dropchunk; - { - int8_t r; - r = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RSSI %d\r\n", (int)r); - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unknown FIFO cmd %x \r\n", fifo_cmd); - dropchunk: - chprintf(DEBUG_CHP, "WARNING: Discarding chunk in FIFO\r\n"); - if (!len) - break; - i = len; - do { - int8_t data; - data = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value);// purge FIFO - chprintf(DEBUG_CHP,"Unknown: %x \r\n", data); - } - while (--i); - break; - } - } - - //chprintf(DEBUG_CHP, "INFO: Done waiting for a packet\r\n"); - - return bytesRead; - -} - - - - - -//!@ - diff --git a/src/archive/app_ax5043_engr_tx/source/ax5043.h b/src/archive/app_ax5043_engr_tx/source/ax5043.h deleted file mode 100644 index 9853717a..00000000 --- a/src/archive/app_ax5043_engr_tx/source/ax5043.h +++ /dev/null @@ -1,732 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_H -#define _AX5043_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define RX_BAUDRATE 9600 -#define TX_BAUDRATE 9600 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_set_regs(SPIDriver * spip); -void ax5043_set_regs_tx(SPIDriver * spip); -void ax5043_set_regs_rx(SPIDriver * spip); -void ax5043_set_regs_rxcont(SPIDriver * spip); -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_reset(SPIDriver * spip); -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr); -void ax5043_set_local_addr(SPIDriver * spip); -void ax5043_prepare_tx(SPIDriver * spip); -void ax5043_prepare_rx(SPIDriver * spip); -void ax5043_init_registers_common(SPIDriver * spip); -uint8_t axradio_get_pllvcoi(SPIDriver * spip); - -void ax5043_init(SPIDriver * spip); -void ax5043_receive(SPIDriver * spip); - - -//functions added from bradenburg's code. -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) ; -uint8_t receive_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]); - -#endif -//! @} diff --git a/src/archive/app_ax5043_engr_tx_clean/Makefile b/src/archive/app_ax5043_engr_tx_clean/Makefile deleted file mode 100644 index 2d3f679b..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/Makefile +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = HDLC_FEC_RX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_ax5043_engr_tx_clean/README.md b/src/archive/app_ax5043_engr_tx_clean/README.md deleted file mode 100644 index fbb1fadd..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_sx1236_ax5043_HDLC_FEC_tx - -This is used to transmit sax5043 radio packets signal. -This creates a instruction packet at 435.5 MhZ in a fixed interval. This code simulates ground. This pairs with " app_sx1236_FulDuplex_oresat " which receives the instruction and responds with data. the sent and received packet are shown in serial terminal. - diff --git a/src/archive/app_ax5043_engr_tx_clean/conf/chconf.h b/src/archive/app_ax5043_engr_tx_clean/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_engr_tx_clean/conf/halconf.h b/src/archive/app_ax5043_engr_tx_clean/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_engr_tx_clean/conf/mcuconf.h b/src/archive/app_ax5043_engr_tx_clean/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_engr_tx_clean/main.c b/src/archive/app_ax5043_engr_tx_clean/main.c deleted file mode 100644 index b0629328..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/main.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043_common.h" -#include "ax5043_engr.h" - - -//#include "adf7030.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x33, 0x34, 0x00, 0x00} -}; -const struct axradio_address_mask localaddr_tx = { - { 0x32, 0x34, 0x00, 0x00}, - { 0xFF, 0x00, 0x00, 0x00} -}; -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3A, 0x43, 0x51, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0x54, 0x65, 0x73, 0x74, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x31 }; -const uint8_t framing_insert_counter = 1; -const uint8_t framing_counter_pos = 0; - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - - -/* - * Initialize the SPI drivers and configure the adf7030 chips - */ -static void app_init(void) -{ - - uint16_t pkt_counter = 0; - - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - chThdSleepMilliseconds(1000); - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - //spiSelect(&SPID2); - chThdSleepMilliseconds(1000); - - - - //uint16_t reg=0; - //uint8_t value=0; - //uint8_t value1=0x55; - //uint8_t ret_value[3]={0,0,0}; - //int i; - - - chprintf(DEBUG_CHP, "Configuring AX5043\r\n"); - chThdSleepMilliseconds(50); - ax5043_init(&SPID2); - ax5043_set_addr(&SPID2, localaddr_tx); - ax5043_prepare_tx(&SPID2); - chprintf(DEBUG_CHP, "done reseting AX5043\r\n"); - - - for (;;) { - static uint8_t demo_packet_[sizeof(demo_packet)]; - //uint16_t pkt_counter = 0; - - ++pkt_counter; - memcpy(demo_packet_, demo_packet, sizeof(demo_packet)); - if (framing_insert_counter) { - demo_packet_[framing_counter_pos] = (uint8_t)(pkt_counter & 0xFF); - demo_packet_[framing_counter_pos+1] = (uint8_t)((pkt_counter>>8) & 0xFF); - } - - chprintf(DEBUG_CHP,"INFO: Sending packet %d\r\n",pkt_counter); - transmit_packet(&SPID2, &remoteaddr_tx, demo_packet_, sizeof(demo_packet)); - - chThdSleepMilliseconds(3000); - } - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(500); - chprintf(DEBUG_CHP, "."); - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_engr_tx_clean/source/README.md b/src/archive/app_ax5043_engr_tx_clean/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_engr_tx_clean/source/ax5043_common.c b/src/archive/app_ax5043_engr_tx_clean/source/ax5043_common.c deleted file mode 100644 index e0b1e7e2..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/source/ax5043_common.c +++ /dev/null @@ -1,326 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043_common.h" - - - -/** - * writes to an AX5043 register. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0}; - - if(reg < 0x0070) - { - command_buf[0]=0x80|reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - else - { - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - return ret_value[0]; //retun status while writting the register - -} - - -/** - * Reds an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value in the register. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0 }; - //uint8_t rx_buf[2]={0 ,0 }; - - if(reg < 0x0070) - { - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[1]; //return the reg value when reading the register - } - else - { - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[2]; //return the reg value when reading the register - } - -} - - - - -/** - * Shutdown after reset the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_shutdown(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * Standby the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_standby(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Enable FIFO in AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_fifo_en(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FIFO_ENABLED; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * put AX5043 in synthesizer RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * changes AX5043 to full RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * put AX5043 in synthesizer TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * changes AX5043 to full TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * sets AX5043 address registers - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr) -{ - uint8_t ret_value[3]={0,0,0}; - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)local_addr.addr[0], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)local_addr.addr[1], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)local_addr.addr[2], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)local_addr.addr[3], ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)local_addr.mask[0], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)local_addr.mask[1], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)local_addr.mask[2], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)local_addr.mask[3], ret_value); -} - -/** - * Resets the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_reset(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - //spiUnselect(spip); - //chThdSleepMicroseconds(10); - - //Reset the chip through powermode register - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(1); - //chThdSleepMicroseconds(5); - - //read the powermode register - value=ax5043_read_reg(&SPID2, AX5043_REG_PWRMODE, value, ret_value); - //write to powermode register for enabling XOEN and REFIN and shutdown mode - //page 33 in programming manual - //value = value | AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT; - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - - //ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA) - { - chprintf(DEBUG_CHP, "Scratch register does not match 0\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55) - { - chprintf(DEBUG_CHP, "Scratch register does not match 1\r\n"); - } - //ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x02, ret_value); - //chThdSleepMilliseconds(10); - - -} - - - - - - - -/** - * writes to FIFO - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - - - -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t loc = 0; - while (len--) { - axradio_rxbuffer[loc] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - //chprintf(DEBUG_CHP,"Packet: %x \r\n", axradio_rxbuffer[loc]); - loc++; - } - return loc; -} - - - - -//!@ - diff --git a/src/archive/app_ax5043_engr_tx_clean/source/ax5043_common.h b/src/archive/app_ax5043_engr_tx_clean/source/ax5043_common.h deleted file mode 100644 index 889a88a2..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/source/ax5043_common.h +++ /dev/null @@ -1,712 +0,0 @@ -/*! \file ax5043_common.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_COMMON_H -#define _AX5043_COMMON_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr); -void ax5043_reset(SPIDriver * spip); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) ; - -#endif -//! @} diff --git a/src/archive/app_ax5043_engr_tx_clean/source/ax5043_engr.c b/src/archive/app_ax5043_engr_tx_clean/source/ax5043_engr.c deleted file mode 100644 index 53651c41..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/source/ax5043_engr.c +++ /dev/null @@ -1,849 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043_common.h" -#include "ax5043_engr.h" - - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_phy_pn9 = 0; -const uint8_t axradio_phy_nrchannels = 1; -const uint32_t axradio_phy_chanfreq[1] = { 0x0912aaab }; -const uint8_t axradio_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_phy_chanvcoiinit[1] = { 0x98 }; -uint8_t axradio_phy_chanpllrng[1]; -uint8_t axradio_phy_chanvcoi[1]; -const uint8_t axradio_phy_vcocalib = 0; -const int32_t axradio_phy_maxfreqoffset = 913; -const int8_t axradio_phy_rssioffset = 64; -// axradio_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_phy_rssireference = (int8_t)(0xF9 + 64); -const int8_t axradio_phy_channelbusy = -87 + 64; -const uint16_t axradio_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_phy_cs_enabled = 0; -const uint8_t axradio_phy_lbt_retries = 0; -const uint8_t axradio_phy_lbt_forcetx = 0; -const uint16_t axradio_phy_preamble_wor_longlen = 23; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_phy_preamble_wor_len = 184; -const uint16_t axradio_phy_preamble_longlen = 0; -const uint16_t axradio_phy_preamble_len = 72; -const uint8_t axradio_phy_preamble_byte = 0x7e; -const uint8_t axradio_phy_preamble_flags = 0x38; -const uint8_t axradio_phy_preamble_appendbits = 0; -const uint8_t axradio_phy_preamble_appendpattern = 0x00; - -//framing variables generated from radiolab -const uint8_t axradio_framing_maclen = 3; -const uint8_t axradio_framing_addrlen = 1; -const uint8_t axradio_framing_destaddrpos = 0; -const uint8_t axradio_framing_sourceaddrpos = 0xff; -const uint8_t axradio_framing_lenpos = 2; -const uint8_t axradio_framing_lenoffs = 0; -const uint8_t axradio_framing_lenmask = 0xff; -const uint8_t axradio_framing_swcrclen = 0; - -const uint8_t axradio_framing_synclen = 32; -const uint8_t axradio_framing_syncword[] = { 0xcc, 0xaa, 0xcc, 0xaa}; -const uint8_t axradio_framing_syncflags = 0x38; -const uint8_t axradio_framing_enable_sfdcallback = 0; - -const uint32_t axradio_framing_ack_timeout = 8; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_framing_ack_retransmissions = 0; -const uint8_t axradio_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_wor_period = 128; -const uint8_t axradio_phy_innerfreqloop = 0; - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -void ax5043_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x24, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x30, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x88, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x89, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x82, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xC8, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); // - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); // - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x8A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xEB, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x20, ret_value); //original 20, accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); - - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTSTOREFLAGS, (uint8_t)0x14, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xB5, ret_value); -} - - - - - - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_set_regs_tx(spip); - ax5043_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - - //set address values - //ax5043_set_local_addr(spip); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - //ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_set_regs_rx(spip); - ax5043_init_registers_common(spip); - - - //follows code from function ax5043_receiver_on_continuous() in easyax5043.c from radiolab - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_phy_rssireference, ret_value); - ax5043_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - //set address values - //ax5043_set_local_addr(spip); - -} - - - - - - -uint8_t axradio_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_phy_chanpllrng[0] & 0x0F) - (axradio_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - - - -void ax5043_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_init(SPIDriver * spip) -{ - - - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); - - - //ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - - //PLL autoranging - uint8_t r; - if( !(axradio_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - -/** - * Transmits a packet - * The logic is similar to transmit_isr() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_phy_preamble_appendbits); - byte |= 0x80 >> axradio_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_phy_preamble_appendbits); - byte |= 0x01 << axradio_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Logic similar to axradio_transmit() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_framing_maclen); - memcpy(&axradio_txbuffer[axradio_framing_maclen], pkt, pktlen); - if (axradio_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_destaddrpos], &addr->addr, axradio_framing_addrlen); - if (axradio_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_framing_addrlen); - if (axradio_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_framing_lenoffs) & axradio_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_framing_lenpos] = (axradio_txbuffer[axradio_framing_lenpos] & (uint8_t)~axradio_framing_lenmask) | len_byte; - } -/* - if (axradio_framing_swcrclen) - axradio_txbuffer_len = axradio_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_phy_preamble_longlen; -*/ - //ax5043_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - - - - -uint8_t receive_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]) { - uint8_t ret_value[3]={0,0,0}; - uint8_t fifo_cmd; - uint8_t i; - uint8_t b0; - uint8_t b1; - uint8_t b2; - uint8_t b3; - uint8_t len = ax5043_read_reg(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); // clear request so interrupt does not fire again. sync_rx enables interrupt on radio state changed in order to wake up on SDF detected - - uint8_t bytesRead = 0; - - - chprintf(DEBUG_CHP,"INFO: Waiting for a packet\r\n"); - while ((ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value) & 0x01) != 1) { // FIFO not empty - fifo_cmd = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // read command - len = (fifo_cmd & 0xE0) >> 5; // top 3 bits encode payload len - if (len == 7) - len = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // 7 means variable length, -> get length byte - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (!len) - break; - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // Discard the flags - --len; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, len); - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (axradio_phy_innerfreqloop || len != 3) - goto dropchunk; - i = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - i &= 0x0F; - i |= 1 + (uint8_t)~(i & 0x08); - b3 = ((int8_t)i) >> 8; - b2 = i; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x%02x\r\n", b3, b2, b1, b0); - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (!axradio_phy_innerfreqloop || len != 2) - goto dropchunk; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: Frequency offset: 0x%02x%02x\r\n", b1, b2); - break; - - case AX5043_FIFOCMD_RSSI: - if (len != 1) - goto dropchunk; - { - int8_t r; - r = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RSSI %d\r\n", (int)r); - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unknown FIFO cmd %x \r\n", fifo_cmd); - dropchunk: - chprintf(DEBUG_CHP, "WARNING: Discarding chunk in FIFO\r\n"); - if (!len) - break; - i = len; - do { - int8_t data; - data = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value);// purge FIFO - chprintf(DEBUG_CHP,"Unknown: %x \r\n", data); - } - while (--i); - break; - } - } - - //chprintf(DEBUG_CHP, "INFO: Done waiting for a packet\r\n"); - - return bytesRead; - -} - - - - - -//!@ - diff --git a/src/archive/app_ax5043_engr_tx_clean/source/ax5043_engr.h b/src/archive/app_ax5043_engr_tx_clean/source/ax5043_engr.h deleted file mode 100644 index 711e9f74..00000000 --- a/src/archive/app_ax5043_engr_tx_clean/source/ax5043_engr.h +++ /dev/null @@ -1,34 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_ENGR_H -#define _AX5043_ENGR_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - -void ax5043_set_regs(SPIDriver * spip); -void ax5043_set_regs_tx(SPIDriver * spip); -void ax5043_set_regs_rx(SPIDriver * spip); -void ax5043_set_regs_rxcont(SPIDriver * spip); -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_prepare_tx(SPIDriver * spip); -void ax5043_prepare_rx(SPIDriver * spip); -void ax5043_init_registers_common(SPIDriver * spip); -uint8_t axradio_get_pllvcoi(SPIDriver * spip); -void ax5043_init(SPIDriver * spip); -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -uint8_t receive_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]); - -#endif -//! @} diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/Makefile b/src/archive/app_ax5043_engr_tx_full_duplex/Makefile deleted file mode 100644 index 2d3f679b..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/Makefile +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = HDLC_FEC_RX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/README.md b/src/archive/app_ax5043_engr_tx_full_duplex/README.md deleted file mode 100644 index fbb1fadd..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_sx1236_ax5043_HDLC_FEC_tx - -This is used to transmit sax5043 radio packets signal. -This creates a instruction packet at 435.5 MhZ in a fixed interval. This code simulates ground. This pairs with " app_sx1236_FulDuplex_oresat " which receives the instruction and responds with data. the sent and received packet are shown in serial terminal. - diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/conf/chconf.h b/src/archive/app_ax5043_engr_tx_full_duplex/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/conf/halconf.h b/src/archive/app_ax5043_engr_tx_full_duplex/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/conf/mcuconf.h b/src/archive/app_ax5043_engr_tx_full_duplex/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/main.c b/src/archive/app_ax5043_engr_tx_full_duplex/main.c deleted file mode 100644 index 98b66e18..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/main.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043_common.h" -#include "ax5043_engr_f1.h" -#include "ax5043_engr_f2.h" - - -//#include "adf7030.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x33, 0x34, 0x00, 0x00} -}; -const struct axradio_address_mask localaddr_tx = { - { 0x32, 0x34, 0x00, 0x00}, - { 0xFF, 0x00, 0x00, 0x00} -}; - -uint8_t axradio_rxbuffer[256]; //buffer to receive radio data - -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3A, 0x43, 0x51, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0x54, 0x65, 0x73, 0x74, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x31 }; -const uint8_t framing_insert_counter = 1; -const uint8_t framing_counter_pos = 0; - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); -} - - - - -THD_WORKING_AREA(waAx5043_rx, 1024); -THD_FUNCTION(ax5043_rx, arg) -{ - (void)arg; - uint8_t packet_len=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_f2_init(&SPID1); - ax5043_set_addr(&SPID1, localaddr_tx); - chprintf(DEBUG_CHP, "done reseting AX5043 rx \r\n"); - chThdSleepMilliseconds(50); - - ax5043_f2_init(&SPID1); - ax5043_f2_prepare_rx(&SPID1); - - /* Enabling events on both edges of the button line.*/ - //palEnableLineEvent(LINE_BUTTON, PAL_EVENT_MODE_RISING_EDGE); - palEnableLineEvent(LINE_SX_INT0, PAL_EVENT_MODE_RISING_EDGE); - - - - //palWaitLineTimeout(LINE_BUTTON, TIME_INFINITE); - //palWaitLineTimeout(LINE_ARD_A5, TIME_INFINITE); - while(true) - { - palWaitLineTimeout(LINE_SX_INT0, TIME_MS2I(5000)); - - if (palReadLine(LINE_SX_INT0)) - chprintf(DEBUG_CHP, "\r\r int line is HIGH ** \r\n"); - else - chprintf(DEBUG_CHP, "\r\r int line is LOW ** \r\n"); - - packet_len=receive_f2_loop(&SPID1, axradio_rxbuffer); - - if(packet_len > 0) - chprintf(DEBUG_CHP,"INFO: Received packet %d\r\n",axradio_rxbuffer[3]); - } - - -} - - -THD_WORKING_AREA(waAx5043_tx, 1024); -THD_FUNCTION(ax5043_tx, arg) -{ - (void)arg; - uint16_t pkt_counter = 0; - - chThdSleepMilliseconds(500); - ax5043_f1_init(&SPID2); - ax5043_set_addr(&SPID2, localaddr_tx); - ax5043_f1_prepare_tx(&SPID2); - chprintf(DEBUG_CHP, "done reseting AX5043 tx\r\n"); - - - for (;;) { - static uint8_t demo_packet_[sizeof(demo_packet)]; - //uint16_t pkt_counter = 0; - - ++pkt_counter; - memcpy(demo_packet_, demo_packet, sizeof(demo_packet)); - if (framing_insert_counter) { - demo_packet_[framing_counter_pos] = (uint8_t)(pkt_counter & 0xFF); - demo_packet_[framing_counter_pos+1] = (uint8_t)((pkt_counter>>8) & 0xFF); - } - - chprintf(DEBUG_CHP,"INFO: Sending packet %d\r\n",pkt_counter); - transmit_f1_packet(&SPID2, &remoteaddr_tx, demo_packet_, sizeof(demo_packet)); - - chThdSleepMilliseconds(5000); - } - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(15000); - chprintf(DEBUG_CHP, "."); - //palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - chThdCreateStatic(waAx5043_rx, sizeof(waAx5043_rx), NORMALPRIO, ax5043_rx, NULL); - chThdSleepMilliseconds(5000); - chThdCreateStatic(waAx5043_tx, sizeof(waAx5043_tx), NORMALPRIO, ax5043_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/source/README.md b/src/archive/app_ax5043_engr_tx_full_duplex/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_common.c b/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_common.c deleted file mode 100644 index e8431a62..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_common.c +++ /dev/null @@ -1,323 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043_common.h" - - - -/** - * writes to an AX5043 register. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0}; - - if(reg < 0x0070) - { - command_buf[0]=0x80|reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - else - { - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - } - return ret_value[0]; //retun status while writting the register - -} - - -/** - * Reds an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value in the register. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0 }; - //uint8_t rx_buf[2]={0 ,0 }; - - if(reg < 0x0070) - { - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[1]; //return the reg value when reading the register - } - else - { - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[2]; //return the reg value when reading the register - } - -} - - - - -/** - * Shutdown after reset the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_shutdown(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * Standby the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_standby(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Enable FIFO in AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_fifo_en(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FIFO_ENABLED; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * put AX5043 in synthesizer RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * changes AX5043 to full RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * put AX5043 in synthesizer TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * changes AX5043 to full TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * sets AX5043 address registers - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr) -{ - uint8_t ret_value[3]={0,0,0}; - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)local_addr.addr[0], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)local_addr.addr[1], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)local_addr.addr[2], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)local_addr.addr[3], ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)local_addr.mask[0], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)local_addr.mask[1], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)local_addr.mask[2], ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)local_addr.mask[3], ret_value); -} - -/** - * Resets the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_reset(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - //spiUnselect(spip); - //chThdSleepMicroseconds(10); - - //Reset the chip through powermode register - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(1); - //chThdSleepMicroseconds(5); - - //read the powermode register - value=ax5043_read_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - //write to powermode register for enabling XOEN and REFIN and shutdown mode - //page 33 in programming manual - //value = value | AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT; - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - - //ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA) - { - chprintf(DEBUG_CHP, "Scratch register does not match 0\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55) - { - chprintf(DEBUG_CHP, "Scratch register does not match 1\r\n"); - } - //ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x02, ret_value); - //chThdSleepMilliseconds(10); - - -} - - - - -/** - * writes to FIFO - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - - - -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t loc = 0; - while (len--) { - axradio_rxbuffer[loc] = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - //chprintf(DEBUG_CHP,"Packet: %x \r\n", axradio_rxbuffer[loc]); - loc++; - } - return loc; -} - - - - -//!@ - diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_common.h b/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_common.h deleted file mode 100644 index 889a88a2..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_common.h +++ /dev/null @@ -1,712 +0,0 @@ -/*! \file ax5043_common.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_COMMON_H -#define _AX5043_COMMON_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_set_addr(SPIDriver * spip, const struct axradio_address_mask local_addr); -void ax5043_reset(SPIDriver * spip); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) ; - -#endif -//! @} diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f1.c b/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f1.c deleted file mode 100644 index 1936d185..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f1.c +++ /dev/null @@ -1,845 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043_common.h" -#include "ax5043_engr_f1.h" - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_f1_phy_pn9 = 0; -const uint8_t axradio_f1_phy_nrchannels = 1; -const uint32_t axradio_f1_phy_chanfreq[1] = { 0x0912aaab }; -const uint8_t axradio_f1_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_f1_phy_chanvcoiinit[1] = { 0x98 }; -uint8_t axradio_f1_phy_chanpllrng[1]; -uint8_t axradio_f1_phy_chanvcoi[1]; -const uint8_t axradio_f1_phy_vcocalib = 0; -const int32_t axradio_f1_phy_maxfreqoffset = 913; -const int8_t axradio_f1_phy_rssioffset = 64; -// axradio_f1_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_f1_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_f1_phy_rssireference = (int8_t)(0xF9 + 64); -const int8_t axradio_f1_phy_channelbusy = -87 + 64; -const uint16_t axradio_f1_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_f1_phy_cs_enabled = 0; -const uint8_t axradio_f1_phy_lbt_retries = 0; -const uint8_t axradio_f1_phy_lbt_forcetx = 0; -const uint16_t axradio_f1_phy_preamble_wor_longlen = 23; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_f1_phy_preamble_wor_len = 184; -const uint16_t axradio_f1_phy_preamble_longlen = 0; -const uint16_t axradio_f1_phy_preamble_len = 72; -const uint8_t axradio_f1_phy_preamble_byte = 0x7e; -const uint8_t axradio_f1_phy_preamble_flags = 0x38; -const uint8_t axradio_f1_phy_preamble_appendbits = 0; -const uint8_t axradio_f1_phy_preamble_appendpattern = 0x00; - -//framing variables generated from radiolab -const uint8_t axradio_f1_framing_maclen = 3; -const uint8_t axradio_f1_framing_addrlen = 1; -const uint8_t axradio_f1_framing_destaddrpos = 0; -const uint8_t axradio_f1_framing_sourceaddrpos = 0xff; -const uint8_t axradio_f1_framing_lenpos = 2; -const uint8_t axradio_f1_framing_lenoffs = 0; -const uint8_t axradio_f1_framing_lenmask = 0xff; -const uint8_t axradio_f1_framing_swcrclen = 0; - -const uint8_t axradio_f1_framing_synclen = 32; -const uint8_t axradio_f1_framing_syncword[] = { 0xcc, 0xaa, 0xcc, 0xaa}; -const uint8_t axradio_f1_framing_syncflags = 0x38; -const uint8_t axradio_f1_framing_enable_sfdcallback = 0; - -const uint32_t axradio_f1_framing_ack_timeout = 8; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_f1_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_f1_framing_ack_retransmissions = 0; -const uint8_t axradio_f1_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_f1_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_f1_wor_period = 128; -const uint8_t axradio_f1_phy_innerfreqloop = 0; - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -void ax5043_f1_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x24, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x30, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x88, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x89, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x82, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xC8, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); // - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); // - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x8A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xEB, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x20, ret_value); //original 20, accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); - - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTSTOREFLAGS, (uint8_t)0x14, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f1_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f1_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f1_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f1_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xB5, ret_value); -} - - - - - - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f1_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_f1_set_regs_tx(spip); - ax5043_f1_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - - //set address values - //ax5043_f1_set_local_addr(spip); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f1_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - //ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_f1_set_regs_rx(spip); - ax5043_f1_init_registers_common(spip); - - - //follows code from function ax5043_receiver_on_continuous() in easyax5043.c from radiolab - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_f1_phy_rssireference, ret_value); - ax5043_f1_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - //set address values - //ax5043_f1_set_local_addr(spip); - -} - - - - -uint8_t axradio_f1_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_f1_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_f1_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_f1_phy_chanpllrng[0] & 0x0F) - (axradio_f1_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - - - void ax5043_f1_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_f1_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_f1_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f1_init(SPIDriver * spip) -{ - - - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); - - - //ax5043_shutdown(spip); - ax5043_f1_set_regs(spip); - ax5043_f1_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_f1_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - - //PLL autoranging - uint8_t r; - if( !(axradio_f1_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_f1_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_f1_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_f1_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_f1_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_f1_set_regs(spip); - ax5043_f1_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_f1_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_f1_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - -/** - * Transmits a packet - * The logic is similar to transmit_isr() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_f1_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_f1_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f1_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f1_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_f1_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_f1_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_f1_phy_preamble_appendbits); - byte |= 0x80 >> axradio_f1_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_f1_phy_preamble_appendbits); - byte |= 0x01 << axradio_f1_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_f1_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_f1_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f1_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f1_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f1_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f1_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_f1_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Logic similar to axradio_transmit() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_f1_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_f1_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_f1_framing_maclen); - memcpy(&axradio_txbuffer[axradio_f1_framing_maclen], pkt, pktlen); - if (axradio_f1_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_f1_framing_destaddrpos], &addr->addr, axradio_f1_framing_addrlen); - if (axradio_f1_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_f1_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_f1_framing_addrlen); - if (axradio_f1_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_f1_framing_lenoffs) & axradio_f1_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_f1_framing_lenpos] = (axradio_txbuffer[axradio_f1_framing_lenpos] & (uint8_t)~axradio_f1_framing_lenmask) | len_byte; - } -/* - if (axradio_f1_framing_swcrclen) - axradio_txbuffer_len = axradio_f1_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_f1_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_f1_phy_preamble_longlen; -*/ - //ax5043_f1_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_f1_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - - - - -uint8_t receive_f1_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]) { - uint8_t ret_value[3]={0,0,0}; - uint8_t fifo_cmd; - uint8_t i; - uint8_t b0; - uint8_t b1; - uint8_t b2; - uint8_t b3; - uint8_t len = ax5043_read_reg(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); // clear request so interrupt does not fire again. sync_rx enables interrupt on radio state changed in order to wake up on SDF detected - - uint8_t bytesRead = 0; - - - chprintf(DEBUG_CHP,"INFO: Waiting for a packet\r\n"); - while ((ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value) & 0x01) != 1) { // FIFO not empty - fifo_cmd = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // read command - len = (fifo_cmd & 0xE0) >> 5; // top 3 bits encode payload len - if (len == 7) - len = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // 7 means variable length, -> get length byte - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (!len) - break; - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // Discard the flags - --len; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, len); - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (axradio_f1_phy_innerfreqloop || len != 3) - goto dropchunk; - i = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - i &= 0x0F; - i |= 1 + (uint8_t)~(i & 0x08); - b3 = ((int8_t)i) >> 8; - b2 = i; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x%02x\r\n", b3, b2, b1, b0); - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (!axradio_f1_phy_innerfreqloop || len != 2) - goto dropchunk; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: Frequency offset: 0x%02x%02x\r\n", b1, b2); - break; - - case AX5043_FIFOCMD_RSSI: - if (len != 1) - goto dropchunk; - { - int8_t r; - r = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RSSI %d\r\n", (int)r); - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unknown FIFO cmd %x \r\n", fifo_cmd); - dropchunk: - chprintf(DEBUG_CHP, "WARNING: Discarding chunk in FIFO\r\n"); - if (!len) - break; - i = len; - do { - int8_t data; - data = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value);// purge FIFO - chprintf(DEBUG_CHP,"Unknown: %x \r\n", data); - } - while (--i); - break; - } - } - - //chprintf(DEBUG_CHP, "INFO: Done waiting for a packet\r\n"); - - return bytesRead; - -} - - - - - -//!@ - diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f1.h b/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f1.h deleted file mode 100644 index 88e4ecfb..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f1.h +++ /dev/null @@ -1,34 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_ENGR_F1_H -#define _AX5043_ENGR_F1_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - -void ax5043_f1_set_regs(SPIDriver * spip); -void ax5043_f1_set_regs_tx(SPIDriver * spip); -void ax5043_f1_set_regs_rx(SPIDriver * spip); -void ax5043_f1_set_regs_rxcont(SPIDriver * spip); -void ax5043_f1_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_f1_prepare_tx(SPIDriver * spip); -void ax5043_f1_prepare_rx(SPIDriver * spip); -uint8_t axradio_f1_get_pllvcoi(SPIDriver * spip); -void ax5043_f1_init_registers_common(SPIDriver * spip); -void ax5043_f1_init(SPIDriver * spip); -void transmit_f1_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -uint8_t transmit_f1_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -uint8_t receive_f1_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]); - -#endif -//! @} diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f2.c b/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f2.c deleted file mode 100644 index 076cec2e..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f2.c +++ /dev/null @@ -1,844 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043_common.h" -#include "ax5043_engr_f2.h" - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_f2_phy_pn9 = 0; -const uint8_t axradio_f2_phy_nrchannels = 1; -const uint32_t axradio_f2_phy_chanfreq[1] = { 0x0912aaab }; -const uint8_t axradio_f2_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_f2_phy_chanvcoiinit[1] = { 0x98 }; -uint8_t axradio_f2_phy_chanpllrng[1]; -uint8_t axradio_f2_phy_chanvcoi[1]; -const uint8_t axradio_f2_phy_vcocalib = 0; -const int32_t axradio_f2_phy_maxfreqoffset = 913; -const int8_t axradio_f2_phy_rssioffset = 64; -// axradio_f2_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_f2_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_f2_phy_rssireference = (int8_t)(0xF9 + 64); -const int8_t axradio_f2_phy_channelbusy = -87 + 64; -const uint16_t axradio_f2_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_f2_phy_cs_enabled = 0; -const uint8_t axradio_f2_phy_lbt_retries = 0; -const uint8_t axradio_f2_phy_lbt_forcetx = 0; -const uint16_t axradio_f2_phy_preamble_wor_longlen = 23; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_f2_phy_preamble_wor_len = 184; -const uint16_t axradio_f2_phy_preamble_longlen = 0; -const uint16_t axradio_f2_phy_preamble_len = 72; -const uint8_t axradio_f2_phy_preamble_byte = 0x7e; -const uint8_t axradio_f2_phy_preamble_flags = 0x38; -const uint8_t axradio_f2_phy_preamble_appendbits = 0; -const uint8_t axradio_f2_phy_preamble_appendpattern = 0x00; - -//framing variables generated from radiolab -const uint8_t axradio_f2_framing_maclen = 3; -const uint8_t axradio_f2_framing_addrlen = 1; -const uint8_t axradio_f2_framing_destaddrpos = 0; -const uint8_t axradio_f2_framing_sourceaddrpos = 0xff; -const uint8_t axradio_f2_framing_lenpos = 2; -const uint8_t axradio_f2_framing_lenoffs = 0; -const uint8_t axradio_f2_framing_lenmask = 0xff; -const uint8_t axradio_f2_framing_swcrclen = 0; - -const uint8_t axradio_f2_framing_synclen = 32; -const uint8_t axradio_f2_framing_syncword[] = { 0xcc, 0xaa, 0xcc, 0xaa}; -const uint8_t axradio_f2_framing_syncflags = 0x38; -const uint8_t axradio_f2_framing_enable_sfdcallback = 0; - -const uint32_t axradio_f2_framing_ack_timeout = 8; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_f2_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_f2_framing_ack_retransmissions = 0; -const uint8_t axradio_f2_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_f2_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_f2_wor_period = 128; -const uint8_t axradio_f2_phy_innerfreqloop = 0; - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=435.500MHz dev= 12.500kHz br= 50.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw= 75.000kHz br= 50.000kBit/s -void ax5043_f2_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x24, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x30, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0x83, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x1C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x22, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x88, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x89, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x82, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xC8, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); // - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); // - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x8A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xEB, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x20, ret_value); //original 20, accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); - - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTSTOREFLAGS, (uint8_t)0x14, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f2_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f2_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f2_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f2_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xB5, ret_value); -} - - - - - - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f2_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_f2_set_regs_tx(spip); - ax5043_f2_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - - //set address values - //ax5043_f2_set_local_addr(spip); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f2_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - //ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_f2_set_regs_rx(spip); - ax5043_f2_init_registers_common(spip); - - - //follows code from function ax5043_receiver_on_continuous() in easyax5043.c from radiolab - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_f2_phy_rssireference, ret_value); - ax5043_f2_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - //set address values - //ax5043_f2_set_local_addr(spip); - -} - - - -uint8_t axradio_f2_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_f2_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_f2_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_f2_phy_chanpllrng[0] & 0x0F) - (axradio_f2_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - - - void ax5043_f2_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_f2_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_f2_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_f2_init(SPIDriver * spip) -{ - - - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); - - - //ax5043_shutdown(spip); - ax5043_f2_set_regs(spip); - ax5043_f2_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_f2_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - - //PLL autoranging - uint8_t r; - if( !(axradio_f2_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_f2_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_f2_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_f2_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_f2_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_f2_set_regs(spip); - ax5043_f2_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_f2_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_f2_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - -/** - * Transmits a packet - * The logic is similar to transmit_isr() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_f2_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_f2_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f2_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f2_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_f2_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_f2_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_f2_phy_preamble_appendbits); - byte |= 0x80 >> axradio_f2_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_f2_phy_preamble_appendbits); - byte |= 0x01 << axradio_f2_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_f2_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_f2_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f2_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f2_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f2_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_f2_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_f2_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Logic similar to axradio_transmit() - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_f2_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_f2_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_f2_framing_maclen); - memcpy(&axradio_txbuffer[axradio_f2_framing_maclen], pkt, pktlen); - if (axradio_f2_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_f2_framing_destaddrpos], &addr->addr, axradio_f2_framing_addrlen); - if (axradio_f2_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_f2_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_f2_framing_addrlen); - if (axradio_f2_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_f2_framing_lenoffs) & axradio_f2_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_f2_framing_lenpos] = (axradio_txbuffer[axradio_f2_framing_lenpos] & (uint8_t)~axradio_f2_framing_lenmask) | len_byte; - } -/* - if (axradio_f2_framing_swcrclen) - axradio_txbuffer_len = axradio_f2_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_f2_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_f2_phy_preamble_longlen; -*/ - //ax5043_f2_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_f2_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - - - - -uint8_t receive_f2_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]) { - uint8_t ret_value[3]={0,0,0}; - uint8_t fifo_cmd; - uint8_t i; - uint8_t b0; - uint8_t b1; - uint8_t b2; - uint8_t b3; - uint8_t len = ax5043_read_reg(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); // clear request so interrupt does not fire again. sync_rx enables interrupt on radio state changed in order to wake up on SDF detected - - uint8_t bytesRead = 0; - - - chprintf(DEBUG_CHP,"INFO: Waiting for a packet\r\n"); - while ((ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value) & 0x01) != 1) { // FIFO not empty - fifo_cmd = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // read command - len = (fifo_cmd & 0xE0) >> 5; // top 3 bits encode payload len - if (len == 7) - len = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // 7 means variable length, -> get length byte - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (!len) - break; - ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); // Discard the flags - --len; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, len); - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (axradio_f2_phy_innerfreqloop || len != 3) - goto dropchunk; - i = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - i &= 0x0F; - i |= 1 + (uint8_t)~(i & 0x08); - b3 = ((int8_t)i) >> 8; - b2 = i; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RF Frequency Offset: 0x%02x%02x%02x%02x\r\n", b3, b2, b1, b0); - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (!axradio_f2_phy_innerfreqloop || len != 2) - goto dropchunk; - b1 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - b0 = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: Frequency offset: 0x%02x%02x\r\n", b1, b2); - break; - - case AX5043_FIFOCMD_RSSI: - if (len != 1) - goto dropchunk; - { - int8_t r; - r = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - - chprintf(DEBUG_CHP,"INFO: RSSI %d\r\n", (int)r); - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unknown FIFO cmd %x \r\n", fifo_cmd); - dropchunk: - chprintf(DEBUG_CHP, "WARNING: Discarding chunk in FIFO\r\n"); - if (!len) - break; - i = len; - do { - int8_t data; - data = ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value);// purge FIFO - chprintf(DEBUG_CHP,"Unknown: %x \r\n", data); - } - while (--i); - break; - } - } - - //chprintf(DEBUG_CHP, "INFO: Done waiting for a packet\r\n"); - - return bytesRead; - -} - - - - - -//!@ - diff --git a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f2.h b/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f2.h deleted file mode 100644 index d97597fe..00000000 --- a/src/archive/app_ax5043_engr_tx_full_duplex/source/ax5043_engr_f2.h +++ /dev/null @@ -1,34 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_ENGR_F2_H -#define _AX5043_ENGR_F2_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - -void ax5043_f2_set_regs(SPIDriver * spip); -void ax5043_f2_set_regs_tx(SPIDriver * spip); -void ax5043_f2_set_regs_rx(SPIDriver * spip); -void ax5043_f2_set_regs_rxcont(SPIDriver * spip); -void ax5043_f2_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_f2_prepare_tx(SPIDriver * spip); -void ax5043_f2_prepare_rx(SPIDriver * spip); -uint8_t axradio_f2_get_pllvcoi(SPIDriver * spip); -void ax5043_f2_init_registers_common(SPIDriver * spip); -void ax5043_f2_init(SPIDriver * spip); -void transmit_f2_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -uint8_t transmit_f2_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -uint8_t receive_f2_loop(SPIDriver * spip, uint8_t axradio_rxbuffer[]); - -#endif -//! @} diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/Makefile b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/Makefile deleted file mode 100644 index 2d3f679b..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/Makefile +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = HDLC_FEC_RX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/README.md b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/README.md deleted file mode 100644 index d1c09fb5..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# app_ax5043_g3ruh_ax25_aprs_tx - -This is used to transmit ax5043 radio g3ruh ax.25 signal. -This creates a g3ruh packet at 435.5 MhZ in a fixed interval. This mode is suppossed to be transmitted from satellite. This pairs with " app_ax5043_g3ruh_ax25_aprs_rx " which can receive this packet. - -This mode is for amatuer radio group and will not be used for ground control. - diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/chconf.h b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/halconf.h b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/mcuconf.h b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/main.c b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/main.c deleted file mode 100644 index 61936d3e..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/main.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" - - -//#include "adf7030.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -const struct axradio_address remoteaddr_tx = { - { 0x33, 0x34, 0x00, 0x00} -}; -const struct axradio_address_mask localaddr_tx = { - { 0x32, 0x34, 0x00, 0x00}, - { 0x00, 0x00, 0x00, 0x00} -}; -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3E, 0x54, 0x65, 0x73, 0x74 }; - -const uint8_t framing_insert_counter = 0; -const uint8_t framing_counter_pos = 0; - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - - -/* - * Initialize the SPI drivers and configure the adf7030 chips - */ -static void app_init(void) -{ - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - chThdSleepMilliseconds(1000); - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - //spiSelect(&SPID2); - chThdSleepMilliseconds(1000); - - - -/* - uint8_t rx_buf[2]={0x00 ,0 }; - uint8_t command_buf[2] = {0x00 ,0x00 }; - - while (true) - { - //uint8_t command_buf[6]; - //uint8_t rx_bufi=0; - - //command_buf[0] = AD_READ_BLK_LADR; - - //command_buf[1] = (uint8_t) (AD_MISC_FW >> 24); - //command_buf[2] = (uint8_t) (AD_MISC_FW >> 16); - //command_buf[3] = (uint8_t) (AD_MISC_FW >> 8); - //command_buf[4] = (uint8_t) (AD_MISC_FW); - //ommand_buf[5] = 0; - //chprintf(DEBUG_CHP, "\r\r request-- 0x%x --\r\n", AD_MISC_FW); - //chprintf(DEBUG_CHP, "\r\r request-- 0x%x %x %x %x %x %x --\r\n", command_buf[0],command_buf[1],command_buf[2],command_buf[3],command_buf[4],command_buf[5]); - - spiSelect(&SPID2); - spiStartExchange(&SPID2, 2, command_buf, rx_buf); - while((SPID2).state != SPI_READY) { } - chprintf(DEBUG_CHP, "\r\r Sent to Radio-- 0x%x 0x%x --\r\n", command_buf[0],command_buf[1]); - chprintf(DEBUG_CHP, "\r\r Radio returned-- 0x%x 0x%x --\r\n", rx_buf[0],rx_buf[1]); - spiUnselect(&SPID2); - chThdSleepMilliseconds(500); - command_buf[0] = command_buf[0] +1; - - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } -*/ - //uint16_t reg=0; - uint8_t value=0; - uint8_t value1=0x55; - uint8_t ret_value[3]={0,0,0}; - //int i; - - - ax5043_read_reg(&SPID2, AX5043_REG_REV, value, ret_value); - chThdSleepMilliseconds(1500); - - - ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, value, ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_SCRATCH, value1, ret_value); - ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, value, ret_value); - chThdSleepMilliseconds(1500); - - - - chprintf(DEBUG_CHP, "Configuring AX5043\r\n"); - chThdSleepMilliseconds(50); - ax5043_init(&SPID2); - chprintf(DEBUG_CHP, "done reseting AX5043\r\n"); - -/* - while(true) - { - - reg = 0x314; - ax5043_write_reg(&SPID2, reg, value1, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg 220 contents=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = 0x314; - ax5043_read_reg(&SPID2, reg, value, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg 220 contents=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = AX5043_REG_SCRATCH; - value1 =value1+1; - ax5043_write_reg(&SPID2, reg, value1, ret_value); - //chprintf(DEBUG_CHP, "\r\r written reg=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value1,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = AX5043_REG_SCRATCH; - ax5043_read_reg(&SPID2, reg, value, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - }*/ - - //ax5043_prepare_tx(&SPID2); - -/* - while(true) - { - //ax5043_prepare_tx(&SPID2); - chThdSleepMilliseconds(3000); - chprintf(DEBUG_CHP, "Writting FIFO\r\n"); - ax5043_transmit(&SPID2); - chThdSleepMilliseconds(1000); - ax5043_shutdown(&SPID2); - } -*/ - -/* - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)AX5043_DATA_CMD, ret_value);//The data follows - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x10, ret_value);//packet length - //ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x24, ret_value);//packet details like raw packet - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x08, ret_value);//packet details like raw packet - for (i=0;i<16;i++) - { - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//some random data - } - ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit -*/ - //ax5043_transmit(&SPID2); - - for (;;) { - static uint8_t demo_packet_[sizeof(demo_packet)]; - uint16_t pkt_counter = 0; - - ++pkt_counter; - memcpy(demo_packet_, demo_packet, sizeof(demo_packet)); - if (framing_insert_counter) { - demo_packet_[framing_counter_pos] = (uint8_t)(pkt_counter & 0xFF); - demo_packet_[framing_counter_pos+1] = (uint8_t)((pkt_counter>>8) & 0xFF); - } - - chprintf(DEBUG_CHP,"INFO: Sending another packet...\r\n"); - transmit_packet(&SPID2, &remoteaddr_tx, demo_packet_, sizeof(demo_packet)); - - chThdSleepMilliseconds(3000); - } - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(500); - chprintf(DEBUG_CHP, "."); - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} - diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/README.md b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/ax5043.c b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/ax5043.c deleted file mode 100644 index 523870fb..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/ax5043.c +++ /dev/null @@ -1,1187 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043.h" - - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_phy_pn9 = 0; -const uint8_t axradio_phy_nrchannels = 1; -const uint32_t axradio_phy_chanfreq[1] = { 0x090a2fc9 }; -const uint8_t axradio_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_phy_chanvcoiinit[1] = { 0x99 }; -uint8_t axradio_phy_chanpllrng[1]; -uint8_t axradio_phy_chanvcoi[1]; -const uint8_t axradio_phy_vcocalib = 0; -const int32_t axradio_phy_maxfreqoffset = 910; -const int8_t axradio_phy_rssioffset = 64; -// axradio_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_phy_rssireference = (int8_t)(0xF7 + 64); -const int8_t axradio_phy_channelbusy = -93 + 64; -const uint16_t axradio_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_phy_cs_enabled = 0; -const uint8_t axradio_phy_lbt_retries = 0; -const uint8_t axradio_phy_lbt_forcetx = 0; -const uint16_t axradio_phy_preamble_wor_longlen = 9; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_phy_preamble_wor_len = 40; -const uint16_t axradio_phy_preamble_longlen = 0; -const uint16_t axradio_phy_preamble_len = 40; -const uint8_t axradio_phy_preamble_byte = 0x55; -const uint8_t axradio_phy_preamble_flags = 0x18; -const uint8_t axradio_phy_preamble_appendbits = 4; -const uint8_t axradio_phy_preamble_appendpattern = 0x03; - -//framing variables generated from radiolab -const uint8_t axradio_framing_maclen = 0; -const uint8_t axradio_framing_addrlen = 0; -const uint8_t axradio_framing_destaddrpos = 0; -const uint8_t axradio_framing_sourceaddrpos = 0xff; -const uint8_t axradio_framing_lenpos = 0; -const uint8_t axradio_framing_lenoffs = 21; -const uint8_t axradio_framing_lenmask = 0x00; -const uint8_t axradio_framing_swcrclen = 0; - -const uint8_t axradio_framing_synclen = 32; -const uint8_t axradio_framing_syncword[] = { 0xcc, 0xaa, 0xcc, 0xaa}; -const uint8_t axradio_framing_syncflags = 0x18; -const uint8_t axradio_framing_enable_sfdcallback = 0; - -const uint32_t axradio_framing_ack_timeout = 13; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_framing_ack_retransmissions = 0; -const uint8_t axradio_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_wor_period = 128; - - - - -/** - * writes to an AX5043 register. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -uint8_t ax5043_write_reg_spi(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0}; - - if(reg < 0x0070) - { - command_buf[0]=0x80|reg; - command_buf[1]=value; - //chprintf(DEBUG_CHP, "\r\r written [0]=0x%x, [1]=0x%x--\r\n", command_buf[0],command_buf[1]); - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r read after writting [0]=0x%x, [1]=0x%x--\r\n", ret_value[0],ret_value[1]); - } - else - { - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - //chprintf(DEBUG_CHP, "\r\r written [0]=0x%x, [1]=0x%x, [2]=0x%x--\r\n", command_buf[0],command_buf[1],command_buf[2]); - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r read after writting [0]=0x%x, [1]=0x%x , [2]=0x%x--\r\n", ret_value[0],ret_value[1],ret_value[2]); - } - return ret_value[0]; //retun status while writting the register - -} - - -/** - * Writes to an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -void ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - //uint8_t return_val; - //int num_retries = 1; - //return_val=ax5043_write_reg_spi(spip, reg, value, ret_value); - ax5043_write_reg_spi(spip, reg, value, ret_value); - -/* - while (num_retries > 0 && return_val != 0x80) - { - chThdSleepMicroseconds(100); - return_val=ax5043_write_reg_spi(spip, reg, value, ret_value); - num_retries--; - //chprintf(DEBUG_CHP, "\r\r num_retries= %d --\r\n", num_retries); - }*/ - -} - -/** - * Reds an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value in the register. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0 }; - - if(reg < 0x0070) - { - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[1]; //return the reg value when reading the register - } - else - { - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[2]; //return the reg value when reading the register - } - -} - - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=433.910MHz dev= 3.200kHz br= 9.600kBit/s pwr= 10.0dBm -// RX: fcarrier=433.910MHz bw= 14.400kHz br= 9.600kBit/s - -void ax5043_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x14, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_CRCINIT3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_CRCINIT2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_CRCINIT1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_CRCINIT0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x0C, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x14, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x2F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0xC5, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0xC5, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x5E, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x1B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x99, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x15, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xE3, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x39, ret_value); //original 20, 3f=accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x10, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xE7, ret_value); -} - -/** - * Shutdown after reset the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_shutdown(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * switch off xtal for AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_off_xtal(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Standby the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_standby(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Enable FIFO in AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_fifo_en(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FIFO_ENABLED; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * put AX5043 in synthesizer RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * changes AX5043 to full RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * put AX5043 in synthesizer TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * changes AX5043 to full TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - - - - - -/** - * Resets the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_reset(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - //spiUnselect(spip); - //chThdSleepMicroseconds(10); - - //Reset the chip through powermode register - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(10); - //chThdSleepMicroseconds(5); - - //read the powermode register - value=ax5043_read_reg(&SPID2, AX5043_REG_PWRMODE, value, ret_value); - //write to powermode register for enabling XOEN and REFIN and shutdown mode - //page 33 in programming manual - //value = value | AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT; - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - chThdSleepMilliseconds(1); - - //ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA) - { - chprintf(DEBUG_CHP, "Scratch register does not match 0\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - chThdSleepMilliseconds(10); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55) - { - chprintf(DEBUG_CHP, "Scratch register does not match 1\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x02, ret_value); - chThdSleepMilliseconds(10); - - -} - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_set_regs_tx(spip); - ax5043_init_registers_common(spip); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)0x32, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)0x34, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)0x00, ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)0x00, ret_value); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_set_regs_rx(spip); - ax5043_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_phy_rssireference, ret_value); - ax5043_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)0x33, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)0x34, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)0x00, ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)0x00, ret_value); - -} - - -void ax5043_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - -uint8_t axradio_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_phy_chanpllrng[0] & 0x0F) - (axradio_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_init(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - //int num_retries; - //uint8_t pll_range_done = 0; - //uint8_t pll_range_after; - //uint8_t vcoi_save; - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); //reset is causing problems and hence disabling it.need to remove it - - //adding two more lines to diable the interrupts. Need to remove it later - //ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - - //ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - //ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - - //PLL autoranging - uint8_t r; - if( !(axradio_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - -/** - * Transmits a packet. Not used in thsi version of code. - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_transmit(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - int i=0; - ax5043_full_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - //send out the preamble - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x02), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xE0, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - - //sync word - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xA1, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x18, ret_value);//sync flags - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xAA, ret_value); - - -/* seems this will not get executed based on logic - //send out the preamble. again? - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x02), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - - //writting preamble based on address register. pretty weird. - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x41), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x1C, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value); -*/ - - //write MAC and packet - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)AX5043_DATA_CMD, ret_value);//The data follows - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x0C, ret_value);//packet length - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x03, ret_value);//packet details like raw packet - - - //length - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x0B, ret_value); - //address values - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x33, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x34, ret_value); - for (i=0;i<8;i++) - { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x36, ret_value);//some random data - } - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - - -} - -/** - * read FIFO packet for a packet - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_receive(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - //ax5043_full_rx(spip); - //ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO status value 0x%x \r\n", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO Data 0x%x \r\n", value); - while(!(ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value)&0x01)) - { - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "0x%x ", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO 0x%x \r\n", value); - } - - chprintf(DEBUG_CHP, "\r\r finished reading FIFO--\r\n", value); - - -} - - - -/** - * writes to FIFO - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - -/** - * Transmits a packet - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_phy_preamble_appendbits); - byte |= 0x80 >> axradio_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_phy_preamble_appendbits); - byte |= 0x01 << axradio_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit_isr \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_framing_maclen); - memcpy(&axradio_txbuffer[axradio_framing_maclen], pkt, pktlen); - if (axradio_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_destaddrpos], &addr->addr, axradio_framing_addrlen); - if (axradio_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_framing_addrlen); - if (axradio_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_framing_lenoffs) & axradio_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_framing_lenpos] = (axradio_txbuffer[axradio_framing_lenpos] & (uint8_t)~axradio_framing_lenmask) | len_byte; - } -/* - if (axradio_framing_swcrclen) - axradio_txbuffer_len = axradio_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_phy_preamble_longlen; -*/ - ax5043_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - - - - -//!@ - diff --git a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/ax5043.h b/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/ax5043.h deleted file mode 100644 index 4a4e9b99..00000000 --- a/src/archive/app_ax5043_g3ruh_ax25_aprs_tx/source/ax5043.h +++ /dev/null @@ -1,730 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_H -#define _AX5043_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define RX_BAUDRATE 9600 -#define TX_BAUDRATE 9600 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg_spi(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_set_regs(SPIDriver * spip); -void ax5043_set_regs_tx(SPIDriver * spip); -void ax5043_set_regs_rx(SPIDriver * spip); -void ax5043_set_regs_rxcont(SPIDriver * spip); -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_reset(SPIDriver * spip); -void ax5043_prepare_tx(SPIDriver * spip); -void ax5043_prepare_rx(SPIDriver * spip); -void ax5043_init_registers_common(SPIDriver * spip); -uint8_t axradio_get_pllvcoi(SPIDriver * spip); - -void ax5043_init(SPIDriver * spip); -void ax5043_transmit(SPIDriver * spip); -void ax5043_receive(SPIDriver * spip); - - -//functions added from bradenburg's code. -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); - -#endif -//! @} diff --git a/src/archive/app_ax5043_morse_tx/Makefile b/src/archive/app_ax5043_morse_tx/Makefile deleted file mode 100644 index 2d3f679b..00000000 --- a/src/archive/app_ax5043_morse_tx/Makefile +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = HDLC_FEC_RX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_ax5043_morse_tx/README.md b/src/archive/app_ax5043_morse_tx/README.md deleted file mode 100644 index 251e4488..00000000 --- a/src/archive/app_ax5043_morse_tx/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_sx1236_FulDuplex_ground - -This is used to transmit semtech radio packets signal. -This creates a instruction packet at 735.5 MhZ in a fixed interval. This code simulates ground. This pairs with " app_sx1236_FulDuplex_oresat " which receives the instruction and responds with data. the sent and received packet are shown in serial terminal. - diff --git a/src/archive/app_ax5043_morse_tx/conf/chconf.h b/src/archive/app_ax5043_morse_tx/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_ax5043_morse_tx/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_morse_tx/conf/halconf.h b/src/archive/app_ax5043_morse_tx/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_ax5043_morse_tx/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_ax5043_morse_tx/conf/mcuconf.h b/src/archive/app_ax5043_morse_tx/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_ax5043_morse_tx/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_ax5043_morse_tx/main.c b/src/archive/app_ax5043_morse_tx/main.c deleted file mode 100644 index 1226a212..00000000 --- a/src/archive/app_ax5043_morse_tx/main.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "ax5043.h" -#include "morse.h" - -//#include "adf7030.h" - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg_rx = -{ - false, - NULL, // Operation complete callback - GPIOA, // Slave select port - GPIOA_SPI1_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg_tx = -{ - false, - NULL, // Operation complete callback - GPIOB, // Slave select port - GPIOB_SPI2_NSS, // Slave select pad - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - - -/* - * Initialize the SPI drivers and configure the adf7030 chips - */ -static void app_init(void) -{ - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - - chThdSleepMilliseconds(1000); - spiStart(&SPID1, &spicfg_rx); - spiStart(&SPID2, &spicfg_tx); - //spiSelect(&SPID2); - chThdSleepMilliseconds(1000); - - - -/* - uint8_t rx_buf[2]={0x00 ,0 }; - uint8_t command_buf[2] = {0x00 ,0x00 }; - - while (true) - { - //uint8_t command_buf[6]; - //uint8_t rx_bufi=0; - - //command_buf[0] = AD_READ_BLK_LADR; - - //command_buf[1] = (uint8_t) (AD_MISC_FW >> 24); - //command_buf[2] = (uint8_t) (AD_MISC_FW >> 16); - //command_buf[3] = (uint8_t) (AD_MISC_FW >> 8); - //command_buf[4] = (uint8_t) (AD_MISC_FW); - //ommand_buf[5] = 0; - //chprintf(DEBUG_CHP, "\r\r request-- 0x%x --\r\n", AD_MISC_FW); - //chprintf(DEBUG_CHP, "\r\r request-- 0x%x %x %x %x %x %x --\r\n", command_buf[0],command_buf[1],command_buf[2],command_buf[3],command_buf[4],command_buf[5]); - - spiSelect(&SPID2); - spiStartExchange(&SPID2, 2, command_buf, rx_buf); - while((SPID2).state != SPI_READY) { } - chprintf(DEBUG_CHP, "\r\r Sent to Radio-- 0x%x 0x%x --\r\n", command_buf[0],command_buf[1]); - chprintf(DEBUG_CHP, "\r\r Radio returned-- 0x%x 0x%x --\r\n", rx_buf[0],rx_buf[1]); - spiUnselect(&SPID2); - chThdSleepMilliseconds(500); - command_buf[0] = command_buf[0] +1; - - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } -*/ - uint16_t reg=0; - uint8_t value=0; - uint8_t value1=0x55; - uint8_t ret_value[3]={0,0,0}; - int i; - - - ax5043_read_reg(&SPID2, AX5043_REG_REV, value, ret_value); - chThdSleepMilliseconds(1500); - - - ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, value, ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_SCRATCH, value1, ret_value); - ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, value, ret_value); - chThdSleepMilliseconds(1500); - - - - chprintf(DEBUG_CHP, "Configuring AX5043\r\n"); - chThdSleepMilliseconds(50); - ax5043_init(&SPID2); - chprintf(DEBUG_CHP, "done reseting AX5043\r\n"); - -/* - while(true) - { - - reg = 0x314; - ax5043_write_reg(&SPID2, reg, value1, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg 220 contents=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = 0x314; - ax5043_read_reg(&SPID2, reg, value, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg 220 contents=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = AX5043_REG_SCRATCH; - value1 =value1+1; - ax5043_write_reg(&SPID2, reg, value1, ret_value); - //chprintf(DEBUG_CHP, "\r\r written reg=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value1,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - - reg = AX5043_REG_SCRATCH; - ax5043_read_reg(&SPID2, reg, value, ret_value); - //chprintf(DEBUG_CHP, "\r\r reg=0x%x, value=0x%x, ret_value=0x%x 0x%x, --\r\n", reg,value,ret_value[0],ret_value[1]); - chThdSleepMilliseconds(1500); - }*/ - - ax5043_prepare_tx(&SPID2); - //ax5043_write_reg(&SPID2, AX5043_REG_MODULATION, (uint8_t)0x01, ret_value); - ax5043_full_tx(&SPID2); - //ax5043_transmit(&SPID2); - - - ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x00), ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - ax5043_standby(&SPID2); - chThdSleepMilliseconds(10000); - SetWpm(5); - SetMessage("KG7ZVV Malay Das testing AX5043"); - - while(true){ - SendMessage(&SPID2); - chThdSleepMilliseconds(5000); - chprintf(DEBUG_CHP, "=====================\r\n"); - } - - - /* - // Below loop is for OOK code - while(true) - { - - //ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - //ax5043_standby(&SPID2); - //ax5043_synth_tx(&SPID2); - //ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_standby(&SPID2); - chprintf(DEBUG_CHP, "Stop\r\n"); - chThdSleepMilliseconds(2000); - - - ax5043_full_tx(&SPID2); - chprintf(DEBUG_CHP, "Start\r\n"); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x00), ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0xFF, ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0xF0, ret_value);//preamble - ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - - chThdSleepMilliseconds(2000); - } - - //very old loop. - while(true) - { - ax5043_prepare_tx(&SPID2); - chThdSleepMilliseconds(3000); - chprintf(DEBUG_CHP, "Writting FIFO\r\n"); - ax5043_transmit(&SPID2); - chThdSleepMilliseconds(1000); - //ax5043_shutdown(&SPID2); - } */ - - /* - while(true) - { - ax5043_standby(&SPID2); - //ax5043_synth_tx(&SPID2); - chprintf(DEBUG_CHP, "Stop\r\n"); - chThdSleepMilliseconds(2000); - ax5043_full_tx(&SPID2); - chprintf(DEBUG_CHP, "Start\r\n"); - chThdSleepMilliseconds(2000); - } - */ - - -/* - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)AX5043_DATA_CMD, ret_value);//The data follows - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x10, ret_value);//packet length - //ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x24, ret_value);//packet details like raw packet - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x08, ret_value);//packet details like raw packet - for (i=0;i<16;i++) - { - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//some random data - } - ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit -*/ - //ax5043_transmit(&SPID2); - -} - - -/* - * main loop blinks the led - */ -static void main_loop(void) -{ - chThdSleepMilliseconds(500); - - - while (true) - { - chThdSleepMilliseconds(500); - chprintf(DEBUG_CHP, "."); - palTogglePad(GPIOA, GPIOA_SX_TESTOUT); - } - -} - - -/* - * Entry to our code - */ -int main(void) -{ - halInit(); - chSysInit(); - app_init(); - - // Enabling events on both edges of the button line.*/ - //palEnableLineEvent(GPIOC_SX_DIO3, PAL_EVENT_MODE_RISING_EDGES); - - //chThdCreateStatic(waThread_sx1236_rx, sizeof(waThread_sx1236_rx), NORMALPRIO, Thread_sx1236_rx, NULL); - //chThdSleepMilliseconds(500); - //chThdCreateStatic(waThread_sx1236_tx, sizeof(waThread_sx1236_tx), NORMALPRIO, Thread_sx1236_tx, NULL); - chThdSleepMilliseconds(500); - - main_loop(); - return 0; -} - - - diff --git a/src/archive/app_ax5043_morse_tx/source/README.md b/src/archive/app_ax5043_morse_tx/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_ax5043_morse_tx/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_ax5043_morse_tx/source/ax5043.c b/src/archive/app_ax5043_morse_tx/source/ax5043.c deleted file mode 100644 index 809bf0fa..00000000 --- a/src/archive/app_ax5043_morse_tx/source/ax5043.c +++ /dev/null @@ -1,1179 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "ax5043.h" - - - - - -// physical layer from config.c file generated from radiolab -const uint8_t axradio_phy_pn9 = 0; -const uint8_t axradio_phy_nrchannels = 1; -const uint32_t axradio_phy_chanfreq[1] = { 0x0912aaab }; -const uint8_t axradio_phy_chanpllrnginit[1] = { 0x0a }; -const uint8_t axradio_phy_chanvcoiinit[1] = { 0x98 }; -uint8_t axradio_phy_chanpllrng[1]; -uint8_t axradio_phy_chanvcoi[1]; -const uint8_t axradio_phy_vcocalib = 0; -const int32_t axradio_phy_maxfreqoffset = 913; -const int8_t axradio_phy_rssioffset = 64; -// axradio_phy_rssioffset is added to AX5043_RSSIREFERENCE and subtracted from chip RSSI value to prevent overflows (8bit RSSI only goes down to -128) -// axradio_phy_rssioffset is also added to AX5043_RSSIABSTHR -const int8_t axradio_phy_rssireference = (int8_t)(0xF7 + 64); -const int8_t axradio_phy_channelbusy = -93 + 64; -const uint16_t axradio_phy_cs_period = 7; // timer0 units, 10ms -const uint8_t axradio_phy_cs_enabled = 0; -const uint8_t axradio_phy_lbt_retries = 0; -const uint8_t axradio_phy_lbt_forcetx = 0; -const uint16_t axradio_phy_preamble_wor_longlen = 9; // wor_longlen + wor_len totals to 240.0ms plus 112bits -const uint16_t axradio_phy_preamble_wor_len = 40; -const uint16_t axradio_phy_preamble_longlen = 0; -const uint16_t axradio_phy_preamble_len = 40; -const uint8_t axradio_phy_preamble_byte = 0x55; -const uint8_t axradio_phy_preamble_flags = 0x18; -const uint8_t axradio_phy_preamble_appendbits = 4; -const uint8_t axradio_phy_preamble_appendpattern = 0x03; - -//framing variables generated from radiolab -const uint8_t axradio_framing_maclen = 0; -const uint8_t axradio_framing_addrlen = 0; -const uint8_t axradio_framing_destaddrpos = 0; -const uint8_t axradio_framing_sourceaddrpos = 0xff; -const uint8_t axradio_framing_lenpos = 2; -const uint8_t axradio_framing_lenoffs = 37; -const uint8_t axradio_framing_lenmask = 0x00; -const uint8_t axradio_framing_swcrclen = 0; - -const uint8_t axradio_framing_synclen = 32; -const uint8_t axradio_framing_syncword[] = { 0x33, 0x55, 0x33, 0x55}; -const uint8_t axradio_framing_syncflags = 0x38; -const uint8_t axradio_framing_enable_sfdcallback = 0; - -const uint32_t axradio_framing_ack_timeout = 13; // 98.9ms in wtimer0 units (640Hz) -const uint32_t axradio_framing_ack_delay = 313; // 1.0ms in wtimer1 units (20MHz/64) -const uint8_t axradio_framing_ack_retransmissions = 0; -const uint8_t axradio_framing_ack_seqnrpos = 0xff; - -const uint8_t axradio_framing_minpayloadlen = 0; // must be set to 1 if the payload directly follows the destination address, and a CRC is configured -//WOR -const uint16_t axradio_wor_period = 128; - -/** - * writes to an AX5043 register. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -uint8_t ax5043_write_reg_spi(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0}; - - if(reg < 0x0070) - { - command_buf[0]=0x80|reg; - command_buf[1]=value; - //chprintf(DEBUG_CHP, "\r\r written [0]=0x%x, [1]=0x%x--\r\n", command_buf[0],command_buf[1]); - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r read after writting [0]=0x%x, [1]=0x%x--\r\n", ret_value[0],ret_value[1]); - } - else - { - command_buf[0]=0xF0|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - //chprintf(DEBUG_CHP, "\r\r written [0]=0x%x, [1]=0x%x, [2]=0x%x--\r\n", command_buf[0],command_buf[1],command_buf[2]); - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - //chprintf(DEBUG_CHP, "\r\r read after writting [0]=0x%x, [1]=0x%x , [2]=0x%x--\r\n", ret_value[0],ret_value[1],ret_value[2]); - } - return ret_value[0]; //retun status while writting the register - -} - - -/** - * Writes to an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value of the register. - */ -void ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - //uint8_t return_val; - //int num_retries = 1; - //return_val=ax5043_write_reg_spi(spip, reg, value, ret_value); - ax5043_write_reg_spi(spip, reg, value, ret_value); - -/* - while (num_retries > 0 && return_val != 0x80) - { - chThdSleepMicroseconds(100); - return_val=ax5043_write_reg_spi(spip, reg, value, ret_value); - num_retries--; - //chprintf(DEBUG_CHP, "\r\r num_retries= %d --\r\n", num_retries); - }*/ - -} - -/** - * Reds an AX5043 register. This has retry logic. This calls the the function ax5043_write_reg_spi. - * @param spip: SPI Configuration, reg: Register address, value: register value, ret_value: returned data. - * @return the value in the register. - */ -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]) -{ - uint8_t command_buf[3] = {0,0,0 }; - - if(reg < 0x0070) - { - command_buf[0]=reg; - command_buf[1]=value; - spiSelect(spip); - spiStartExchange(spip, 2, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[1]; //return the reg value when reading the register - } - else - { - command_buf[0]=0x70|(reg>>8); - command_buf[1]=reg; - command_buf[2]=value; - spiSelect(spip); - spiStartExchange(spip, 3, command_buf, ret_value); - while((*spip).state != SPI_READY) { } - spiUnselect(spip); - return ret_value[2]; //return the reg value when reading the register - } - -} - - - -/** - * Sets AX5043 registers. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -// TX: fcarrier=435.500MHz dev= 25.000kHz br=100.000kBit/s pwr= 10.0dBm -// RX: fcarrier=435.500MHz bw=150.000kHz br=100.000kBit/s -void ax5043_set_regs(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); //was 08 - ax5043_write_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FRAMING, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FEC, (uint8_t)0x13, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCSYSCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDCLK, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCDATA, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCANTSEL, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_PINFUNCPWRAMP, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_WAKEUPXOEARLY, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ1, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_IFFREQ0, (uint8_t)0x0C, ret_value); - ax5043_write_reg(spip, AX5043_REG_DECIMATION, (uint8_t)0x14, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE1, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXDATARATE0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXDROFFSET0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET2, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET1, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_MAXRFOFFSET0, (uint8_t)0x30, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMAX0, (uint8_t)0xA6, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN1, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDMIN0, (uint8_t)0x5A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLFILTER, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xF4, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN0, (uint8_t)0xC5, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET0, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN0, (uint8_t)0xF8, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN0, (uint8_t)0xF2, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN0, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA0,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB0,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC0,(uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND0,(uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN0, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV10, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV00, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN1, (uint8_t)0xC5, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET1, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN1, (uint8_t)0xF6, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN1, (uint8_t)0xF1, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN1, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA1,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB1,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC1,(uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND1,(uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN1, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV11, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV01, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK1, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCTARGET3, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCAHYST3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCMINMAX3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TIMEGAIN3, (uint8_t)0xF5, ret_value); - ax5043_write_reg(spip, AX5043_REG_DRGAIN3, (uint8_t)0xF0, ret_value); - ax5043_write_reg(spip, AX5043_REG_PHASEGAIN3, (uint8_t)0xC3, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINA3,(uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINB3,(uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAINC3,(uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQUENCYGAIND3,(uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_AMPLITUDEGAIN3, (uint8_t)0x06, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x3C, ret_value); - ax5043_write_reg(spip, AX5043_REG_FOURFSK3, (uint8_t)0x16, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSRES3, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGF, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_MODCFGA, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXRATE0, (uint8_t)0x01, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB1, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_TXPWRCOEFFB0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRNGCLK, (uint8_t)0x05, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBTUNE, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_BBOFFSCAP, (uint8_t)0x77, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENCFG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTLENOFFSET, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMAXLEN, (uint8_t)0xC8, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT3, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT2, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT1, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH0PAT0, (uint8_t)0xCC, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0LEN, (uint8_t)0x9F, ret_value); - //ax5043_write_reg(spip, AX5043_REG_MATCH0MAX, (uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT1, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1PAT0, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1LEN, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_MATCH1MAX, (uint8_t)0x0A, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGTXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXBOOST, (uint8_t)0x5B, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXSETTLE, (uint8_t)0x3E, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXOFFSACQ, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXCOARSEAGC, (uint8_t)0x9C, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXRSSI, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE2, (uint8_t)0x17, ret_value); - ax5043_write_reg(spip, AX5043_REG_RSSIABSTHR, (uint8_t)0xE3, ret_value); - ax5043_write_reg(spip, AX5043_REG_BGNDRSSITHR, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTCHUNKSIZE, (uint8_t)0x0D, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTACCEPTFLAGS, (uint8_t)0x20, ret_value); //original 20, 3f=accept all errors - ax5043_write_reg(spip, AX5043_REG_DACVALUE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACVALUE0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_DACCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_REF, (uint8_t)0x03, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALOSC, (uint8_t)0x04, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALAMPL, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF1C, (uint8_t)0x07, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF21, (uint8_t)0x68, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF22, (uint8_t)0XFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF23, (uint8_t)0x84, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF26, (uint8_t)0x98, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF34, (uint8_t)0x28, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF35, (uint8_t)0x11, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF44, (uint8_t)0x25, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x02, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x24, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x06, ret_value); -} - - -/** - * Sets AX5043 registers for RX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x0B, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x10, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLVCODIV, (uint8_t)0x25, ret_value); - ax5043_write_reg(spip, AX5043_REG_XTALCAP, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF00, (uint8_t)0x0F, ret_value); - ax5043_write_reg(spip, AX5043_REG_0xF18, (uint8_t)0x02, ret_value); -} - - -/** - * Sets AX5043 registers for RX continous. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_TMGRXAGC, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_TMGRXPREAMBLE1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTMISCFLAGS, (uint8_t)0x00, ret_value); -} - - -/** - * Sets AX5043 registers for TX. This is based on config file generated by radio lab. - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_write_reg(spip, AX5043_REG_RXPARAMSETS, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV13, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQDEV03, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_AGCGAIN3, (uint8_t)0xE7, ret_value); -} - -/** - * Shutdown after reset the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_shutdown(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * switch off xtal for AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_off_xtal(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Standby the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_standby(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - //ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN, ret_value); - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_STANDBY; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * Enable FIFO in AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_fifo_en(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FIFO_ENABLED; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * put AX5043 in synthesizer RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - -/** - * changes AX5043 to full RX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_rx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_RX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * put AX5043 in synthesizer TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_synth_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_SYNTH_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - -/** - * changes AX5043 to full TX mode - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_full_tx(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t value; - value = ax5043_read_reg(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, ret_value); - value = value & 0xF0; - value = value | AX5043_FULL_TX; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); -} - - - - - - -/** - * Resets the AX5043 - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_reset(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value = 0; - uint8_t ret_value[3]={0,0,0}; - - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - //spiUnselect(spip); - //chThdSleepMicroseconds(10); - - //Reset the chip through powermode register - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, ret_value); - chThdSleepMilliseconds(10); - //chThdSleepMicroseconds(5); - - //read the powermode register - value=ax5043_read_reg(&SPID2, AX5043_REG_PWRMODE, value, ret_value); - //write to powermode register for enabling XOEN and REFIN and shutdown mode - //page 33 in programming manual - //value = value | AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT; - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - ax5043_write_reg(spip, AX5043_REG_PWRMODE, value, ret_value); - chThdSleepMilliseconds(1); - - //ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, ret_value); - value = ax5043_read_reg(&SPID2, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0xAA) - { - chprintf(DEBUG_CHP, "Scratch register does not match 0\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - ax5043_write_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, ret_value); - chThdSleepMilliseconds(10); - value = ax5043_read_reg(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, ret_value); - if (value != 0x55) - { - chprintf(DEBUG_CHP, "Scratch register does not match 1\r\n"); - } - ax5043_write_reg(spip, AX5043_REG_PINFUNCIRQ, (uint8_t)0x02, ret_value); - chThdSleepMilliseconds(10); - - -} - - -/** - * prepare AX5043 for tx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - - ax5043_standby(spip); - ax5043_fifo_en(spip); - ax5043_set_regs_tx(spip); - ax5043_init_registers_common(spip); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)0x32, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)0x34, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)0x00, ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)0x00, ret_value); - - //wait for xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - - //ax5043_full_tx(spip); -} - - -/** - * prepare AX5043 for rx - * @param spip: SPI Configuration. - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(SPIDriver * spip) -{ - - //uint8_t reg=0; - //int8_t value= (int8_t)(0xF9 + 64); - uint8_t ret_value[3]={0,0,0}; - - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_STANDBY, ret_value); - ax5043_write_reg(spip, AX5043_REG_LPOSCCONFIG, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_POWERDOWN, ret_value); - - ax5043_set_regs_rx(spip); - ax5043_init_registers_common(spip); - - ax5043_write_reg(spip, AX5043_REG_RSSIREFERENCE, axradio_phy_rssireference, ret_value); - ax5043_set_regs_rxcont(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_PWRMODE, AX5043_FULL_RX, ret_value);//Full RX - - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, ret_value); - - //set address values - ax5043_write_reg(spip, AX5043_REG_PKTADDR0, (uint8_t)0x33, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR1, (uint8_t)0x34, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDR3, (uint8_t)0x00, ret_value); - //set address mask - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK0, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PKTADDRMASK3, (uint8_t)0x00, ret_value); - -} - - -void ax5043_init_registers_common(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t rng = axradio_phy_chanpllrng[0]; - if (rng & 0x20) - chprintf(DEBUG_CHP, "\r\r ERROR at ax5043_init_registers_common --\r\n"); - if ( ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value) & 0x80) { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), ret_value); - } else { - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), ret_value); - } - rng = axradio_get_pllvcoi(spip); - if (rng & 0x80) - ax5043_write_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), ret_value); -} - - - -uint8_t axradio_get_pllvcoi(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - uint8_t x = axradio_phy_chanvcoiinit[0]; - if (x & 0x80) { - if (!(axradio_phy_chanpllrnginit[0] & 0xF0)) { - x += (axradio_phy_chanpllrng[0] & 0x0F) - (axradio_phy_chanpllrnginit[0] & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); -} - - -/** - * Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_init(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - //int num_retries; - //uint8_t pll_range_done = 0; - //uint8_t pll_range_after; - //uint8_t vcoi_save; - uint8_t ret_value[3]={0,0,0}; - - ax5043_reset(spip); //reset is causing problems and hence disabling it.need to remove it - - //adding two more lines to diable the interrupts. Need to remove it later - //ax5043_write_reg(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, ret_value); - //ax5043_write_reg(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, ret_value); - - - //ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, ret_value); - - ax5043_standby(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - - //wait for Xtal - while ((ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value) & 0x01) == 0) - { - chThdSleepMilliseconds(1); - } - chprintf(DEBUG_CHP, "XTAL Status 0x%x \r\n", ax5043_read_reg(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, ret_value)); - - //set frequency based on line 693 on conig.c and 1640 on easyax5043.c from - //codeblocks generated code - uint32_t f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - - //ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - //ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - - //PLL autoranging - uint8_t r; - if( !(axradio_phy_chanpllrnginit[0] & 0xF0) ) { // start values for ranging available - r = axradio_phy_chanpllrnginit[0] | 0x10; - } - else { - r = 0x18; - } - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, ret_value); - chThdSleepMilliseconds(1); - while ((ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - axradio_phy_chanpllrng[0] = ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "\r\r PLL ranging done. 0x%x --\r\n", axradio_phy_chanpllrng[0]); - - - //VCOI calibration - /* - ax5043_set_regs_tx(spip); - ax5043_write_reg(spip, AX5043_REG_MODULATION, (uint8_t)0x08, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, ret_value); - value = value | 0x04; - ax5043_write_reg(spip, AX5043_REG_PLLLOOP, value, ret_value); - value=ax5043_read_reg(spip, AX5043_REG_0xF35, (uint8_t)0x00, ret_value); - value = value | 0x80; - if (2 & (uint8_t)~value) - ++value; - ax5043_write_reg(spip, AX5043_REG_0xF35, value, ret_value); - ax5043_synth_tx(spip); - vcoi_save = ax5043_read_reg(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, ret_value); - ax5043_write_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(pll_range_after & 0x0F), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)0xab, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)0xaa, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)0x12, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)0x09, ret_value); - //tune voltage. doesn't make sense. So, not implementing it for now.. - - num_retries = 64; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - num_retries = 32; - while (num_retries > 0) - { - ax5043_write_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x84, ret_value); - do{} while (ax5043_read_reg(spip, AX5043_REG_GPADCCTRL, (uint8_t)0x00, ret_value) & 0x80); - num_retries--; - } - //ax5043_write_reg(spip, AX5043_REG_PLLVCOI, vcoi_save, ret_value); - */ - - ax5043_shutdown(spip); - ax5043_set_regs(spip); - ax5043_set_regs_rx(spip); - - ax5043_read_reg(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(axradio_phy_chanpllrng[0] & 0x0F), ret_value); - f = axradio_phy_chanfreq[0]; - ax5043_write_reg(spip, AX5043_REG_FREQA0, (uint8_t)f, ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), ret_value); - ax5043_write_reg(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), ret_value); - - -} - - - -/** - * Transmits a packet. Not used in thsi version of code. - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_transmit(SPIDriver * spip) -{ - - //uint8_t reg=0; - //uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - int i=0; - ax5043_full_tx(spip); - - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - //send out the preamble - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x02), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xE0, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - - //sync word - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xA1, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x18, ret_value);//sync flags - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xAA, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xCC, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xAA, ret_value); - - -/* seems this will not get executed based on logic - //send out the preamble. again? - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x02), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x1F, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - - - //writting preamble based on address register. pretty weird. - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x41), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x1C, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value); -*/ - - //write MAC and packet - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)AX5043_DATA_CMD, ret_value);//The data follows - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x0C, ret_value);//packet length - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x03, ret_value);//packet details like raw packet - - - //length - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x0B, ret_value); - //address values - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x33, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x34, ret_value); - for (i=0;i<8;i++) - { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x36, ret_value);//some random data - } - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - - -} - -/** - * read FIFO packet for a packet - * @param conf the AX5043 configuration handler - * @return void - * TODO return a -ve return code if there are any errors - */ -void ax5043_receive(SPIDriver * spip) -{ - - //uint8_t reg=0; - uint8_t value=0; - uint8_t ret_value[3]={0,0,0}; - //ax5043_full_rx(spip); - //ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO status value 0x%x \r\n", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO Data 0x%x \r\n", value); - while(!(ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value)&0x01)) - { - value=ax5043_read_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "0x%x ", value); - value=ax5043_read_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, ret_value); - chprintf(DEBUG_CHP, "FIFO 0x%x \r\n", value); - } - - chprintf(DEBUG_CHP, "\r\r finished reading FIFO--\r\n", value); - - -} - - - -/** - * writes to FIFO - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len) -{ - uint8_t ret_value[3]={0,0,0}; - if (!len) - return; - do { - ax5043_write_reg(spip, AX5043_REG_FIFODATA, *ptr++, ret_value); - } while (--len); -} - -/** - * Transmits a packet - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ - -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt) -{ - uint8_t ret_value[3]={0,0,0}; - - for (;;) { - uint8_t cnt = ax5043_read_reg(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, ret_value); - - if (ax5043_read_reg(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, ret_value)) - cnt = 0xff; - - switch (axradio_trxstate) { - case trxstate_tx_longpreamble: - if (!axradio_txbuffer_cnt) { - axradio_trxstate = trxstate_tx_shortpreamble; - axradio_txbuffer_cnt = axradio_phy_preamble_len; - goto shortpreamble; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 7; - if (axradio_txbuffer_cnt < 7) - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt -= cnt; - cnt <<= 5; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - break; - - case trxstate_tx_shortpreamble: - shortpreamble: - if (!axradio_txbuffer_cnt) { - if (cnt < 15) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - if (axradio_phy_preamble_appendbits) { - uint8_t byte; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - byte = axradio_phy_preamble_appendpattern; - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-axradio_phy_preamble_appendbits); - byte |= 0x80 >> axradio_phy_preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-axradio_phy_preamble_appendbits); - byte |= 0x01 << axradio_phy_preamble_appendbits; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - if ((ax5043_read_reg(spip,AX5043_REG_FRAMING, (uint8_t)0x00, ret_value) & 0x0E) == 0x06 && axradio_framing_synclen) { - // write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS (chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT) - uint8_t len_byte = axradio_framing_synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - // SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits;v - len_byte += 7; - len_byte >>= 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncflags | i, ret_value); - for (i = 0; i < len_byte; ++i) { - // better put a brace, it might prevent SDCC from optimizing away the assignement... - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_framing_syncword[i], ret_value); - } - } - axradio_trxstate = trxstate_tx_packet; - continue; - } - if (cnt < 4) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - cnt = 255; - if (axradio_txbuffer_cnt < 255*8) - cnt = axradio_txbuffer_cnt >> 3; - if (cnt) { - axradio_txbuffer_cnt -= ((uint16_t)cnt) << 3; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_flags, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt, ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, axradio_phy_preamble_byte, ret_value); - continue; - } - { - uint8_t byte = axradio_phy_preamble_byte; - cnt = axradio_txbuffer_cnt; - axradio_txbuffer_cnt = 0; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x1C, ret_value); - if (ax5043_read_reg(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, ret_value) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-cnt); - byte |= 0x80 >> cnt; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-cnt); - byte |= 0x01 << cnt; - } - ax5043_write_reg(spip,AX5043_REG_FIFODATA, byte, ret_value); - } - continue; - - case trxstate_tx_packet: - if (cnt < 11) { - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit - chThdSleepMilliseconds(1); - continue; - } - { - uint8_t flags = 0; - if (!axradio_txbuffer_cnt) - flags |= 0x01; // flag byte: pkt_start - { - uint16_t len = axradio_txbuffer_len - axradio_txbuffer_cnt; - cnt -= 3; - if (cnt >= len) { - cnt = len; - flags |= 0x02; // flag byte: pkt_end - } - } - if (!cnt) - goto pktend; - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, cnt + 1, ret_value); // write FIFO chunk length byte (length includes the flag byte, thus the +1) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, flags, ret_value); - ax5043_writefifo(spip,&axradio_txbuffer[axradio_txbuffer_cnt], cnt); - axradio_txbuffer_cnt += cnt; - if (flags & 0x02) - goto pktend; - } - break; - - default: - chprintf(DEBUG_CHP, "ERROR: Unexpected state found in transmit_isr \r\n"); - } - } - -pktend: - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, ret_value); // enable REVRDONE event - ax5043_write_reg(spip,AX5043_REG_FIFOSTAT, 4, ret_value); // commit -} - - - - - -/** - * Transmits a packet - * Takn from Bradenburg library which seems to be taken from onSemi's code - * @param conf the AX5043 configuration handler - * @return void - * - */ - -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) -{ - uint8_t ret_value[3]={0,0,0}; - axradio_trxstate_t axradio_trxstate; - uint16_t axradio_txbuffer_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - struct axradio_address_mask axradio_localaddr; - uint16_t axradio_txbuffer_cnt = 0; - - axradio_txbuffer_len = pktlen + axradio_framing_maclen; - if (axradio_txbuffer_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - memset(axradio_txbuffer, 0, axradio_framing_maclen); - memcpy(&axradio_txbuffer[axradio_framing_maclen], pkt, pktlen); - if (axradio_framing_destaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_destaddrpos], &addr->addr, axradio_framing_addrlen); - if (axradio_framing_sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[axradio_framing_sourceaddrpos], &axradio_localaddr.addr, axradio_framing_addrlen); - if (axradio_framing_lenmask) { - uint8_t len_byte = (uint8_t)(axradio_txbuffer_len - axradio_framing_lenoffs) & axradio_framing_lenmask; // if you prefer not counting the len byte itself, set LENOFFS = 1 - axradio_txbuffer[axradio_framing_lenpos] = (axradio_txbuffer[axradio_framing_lenpos] & (uint8_t)~axradio_framing_lenmask) | len_byte; - } -/* - if (axradio_framing_swcrclen) - axradio_txbuffer_len = axradio_framing_append_crc(axradio_txbuffer, axradio_txbuffer_len); - if (axradio_phy_pn9) - pn9_buffer(axradio_txbuffer, axradio_txbuffer_len, 0x1ff, -(ax5043_read_reg(spip, AX5043_REG_ENCODING, (uint8_t)0x00, ret_value) & 0x01)); - axradio_txbuffer_cnt = axradio_phy_preamble_longlen; -*/ - ax5043_prepare_tx(spip); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value);; // make sure REVRDONE bit is cleared, so it is a reliable indicator that the packet is out - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, 3, ret_value); // clear FIFO data & flags (prevent transmitting anything left over in the FIFO, this has no effect if the FIFO is not powerered, in this case it is reset any way) - axradio_trxstate = trxstate_tx_longpreamble; - - if ((ax5043_read_reg(spip,AX5043_REG_MODULATION, (uint8_t)0x00, ret_value) & 0x0F) == 9) { // 4-FSK - ax5043_write_reg(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), ret_value); - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 2, ret_value); // length (including flags) - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x01, ret_value); // flag PKTSTART -> dibit sync - ax5043_write_reg(spip,AX5043_REG_FIFODATA, 0x11, ret_value); // dummy byte for forcing dibit sync - } - transmit_loop(spip, axradio_trxstate, axradio_txbuffer_len, axradio_txbuffer, axradio_txbuffer_cnt); - ax5043_write_reg(spip,AX5043_REG_PWRMODE, AX5043_FULL_TX, ret_value); - - ax5043_read_reg(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, ret_value); - //printf("INFO: Waiting for transmission to complete\n"); - while (ax5043_read_reg(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, ret_value) != 0) { - chThdSleepMilliseconds(1); - } - //printf("INFO: Transmission complete\n"); - - ax5043_write_reg(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, ret_value); - - return AXRADIO_ERR_NOERROR; -} - - - - - -//!@ - diff --git a/src/archive/app_ax5043_morse_tx/source/ax5043.h b/src/archive/app_ax5043_morse_tx/source/ax5043.h deleted file mode 100644 index 4a4e9b99..00000000 --- a/src/archive/app_ax5043_morse_tx/source/ax5043.h +++ /dev/null @@ -1,730 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_H -#define _AX5043_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - -/** - * The maximum allowed frame size - -#define MAX_FRAME_LEN 1024 - -#define RX_BAUDRATE 9600 -#define TX_BAUDRATE 9600 - -#define MIN_RF_FREQ_INT_VCO_RFDIV0 800000000 -#define MAX_RF_FREQ_INT_VCO_RFDIV0 1050000000 - -#define MIN_RF_FREQ_INT_VCO_RFDIV1 (MIN_RF_FREQ_INT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_INT_VCO_RFDIV1 (MAX_RF_FREQ_INT_VCO_RFDIV0 / 2) - -#define MIN_RF_FREQ_EXT_VCO_RFDIV0 54000000 -#define MAX_RF_FREQ_EXT_VCO_RFDIV0 525000000 - -#define MIN_RF_FREQ_EXT_VCO_RFDIV1 (MIN_RF_FREQ_EXT_VCO_RFDIV0 / 2) -#define MAX_RF_FREQ_EXT_VCO_RFDIV1 (MAX_RF_FREQ_EXT_VCO_RFDIV0 / 2) - */ - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* MAC parameters */ - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* Special Functions */ - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/****************************************************************************** - ************************* Register values ************************************ - *****************************************************************************/ -#define AX5043_REV 0x51 -#define AX5043_SCRATCH_TEST 0xAA - -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -#define AX5043_RADIO_STATE_IDLE 0x0 - -#define AX5043_PLLVCOI_MANUAL (1 << 7) - -/** - * Modem Domain Voltage Regulator Ready - */ -#define AX5043_SVMODEM (1 << 3) - -/** - * Init value for the VCO prior starting an autoranging - */ -#define AX5043_VCOR_INIT 8 - -#define AX5043_RFDIV0 0x0 -#define AX5043_RFDIV1 (1 << 2) - -#define AX5043_FREQSHAPE_EXT_FILTER 0x0 -#define AX5043_FREQSHAPE_INVALID 0x1 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_03 0x2 -#define AX5043_FREQSHAPE_GAUSSIAN_BT_05 0x3 - -/** - * FSK modulation mode - */ -#define AX5043_MODULATION_FSK (1 << 3) - -#define AX5043_ENC_INV 1 -#define AX5043_ENC_DIFF (1 << 1) -#define AX5043_ENC_SCRAM (1 << 2) - -/** - * HDLC Framing mode - */ -#define AX5043_HDLC_FRAMING (1 << 2) - -/** - * HDLC compliant CRC16 - */ -#define AX5043_CRC16_CCITT (1 << 4) - -/** - * FIFO commands - */ - -#define AX5043_NOP_CMD 0x0 -#define AX5043_RSSI_CMD 0x31 -#define AX5043_TXCTRL_CMD 0x3C -#define AX5043_FREQOFFS_CMD 0x52 -#define AX5043_ANTRSSI2_CMD 0x55 -#define AX5043_REPEATDATA_CMD 0x62 -#define AX5043_TIMER_CMD 0x70 -#define AX5043_RFREQOFFS_CMD 0x73 -#define AX5043_DATARATE_CMD 0x74 -#define AX5043_ANTRSSI3_CMD 0x75 -#define AX5043_DATA_CMD 0xE1 -#define AX5043_TXPWR_CMD 0xFD - - -//fifo commands -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - - - -/** - * Poweramp pin function, output/Z pull up for board 0.9 with diodes for 1.4V - */ -#define AX5043_POWERAMP_MODE_OUTPUT (1 << 2) | 1) -#define AX5043_POWERAMP_MODE_PULLUP ((1 << 7) | 1) -#define AX5043_POWERAMP_MODE_DAC ((1 << 2) | 1) -/** - * FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -/** - * Maximum chuck that can be committed on the FIFO - */ -#define AX5043_PKTCHUNKSIZE_240 0xd - -#define AX5043_FIFO_MAX_SIZE 240 - -/** - * When this threshold of free bytes in the TX FIFO is reached, - * an IRQ is raised - */ -#define AX5043_FIFO_FREE_THR 128 - -#define AX5043_IRQMFIFOTHRFREE (1 << 3) -#define AX5043_IRQRFIFOTHRFREE (1 << 3) -#define AX5043_IRQMRADIOCTRL (1 << 6) -#define AX5043_REVMDONE 0x1 - -/** - * TX antenna transmission mode - */ -#define AX5043_TX_SINGLE_ENDED 0x2 - -/** - * Radio confguration information - */ -#define CALLSIGN_STATION (uint8_t*) "KG7ZVV" -#define CALLSIGN_DESTINATION (uint8_t*) "" - -#define APRS_UHF 433800000 -#define APRS_UHF_ALT 432500000 - -/****************************************************************************** - ************************* RF Configuration *********************************** - *****************************************************************************/ -#define RX_FREQ_HZ 433000000 -#define TX_FREQ_HZ APRS_UHF - -/** - * Enables/Disables the appropriate setup for deployment on the devboards or - * the - */ -#define PQWS_DEV_BOARD 0 - -/* Reference Oscillator frequency */ -#if PQWS_DEV_BOARD -#define XTAL_FREQ_HZ 48000000 -#else -#define XTAL_FREQ_HZ 26000000 -#endif - -/** - * External PA Control - */ - -#define AX5043_EXT_PA_ENABLE 0 -#define AX5043_EXT_PA_DISABLE 1 - -/** - * Ramp up/Ramp down period of the power amplifier in microseconds - */ -#define PWRAMP_RAMP_PERIOD_US 200 - -#define AX5043_RF_SWITCH_ENABLE ANTSEL_OUTPUT_1 -#define AX5043_RF_SWITCH_DISABLE ANTSEL_OUTPUT_0 - - -#define PKTDATA_BUFLEN 260 - - -/** - * Define error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b - -#define EXIT_FAILURE 1 // Failing exit status. -#define EXIT_SUCCESS 0 // Successful exit status. - -/** - * Frequency mode A or B actually selects at which registers - * the frequency configuration should be written. - * - * This is quite handy for different RX/TX frequencies, to avoid - * writing every time the two different frequency configurations. - */ -typedef enum { - FREQA_MODE = 0, //!< FREQA_MODE - FREQB_MODE = 1 //!< FREQB_MODE -} freq_mode_t; - -typedef enum { - VCO_INTERNAL = 0, - VCO_EXTERNAL = 1 -} vco_mode_t; - -typedef enum -{ - POWERDOWN, - DEEPSLEEP, - STANDBY, - FIFO_ENABLED, - RECEIVE_MODE, - RECEIVER_RUNNING, - RECEIVER_WOR, - TRANSMIT_MODE, - FULLTX -} power_mode_t; - -typedef enum -{ - ANTSEL_OUTPUT_0 = 0, - ANTSEL_OUTPUT_1, - ANTSEL_OUTPUT_Z, - ANTSEL_OUTPUT_BB_TUBE_CLK, - ANTSEL_OUTPUT_EXT_TCXO_EN, - ANTSEL_OUTPUT_DAC, - ANTSEL_OUTPUT_DIVERSITY, - ANTSEL_OUTPUT_TEST_OBS -} pfantsel_t; - - -typedef enum -{ - PWRAMP_OUTPUT_0 = 0, - PWRAMP_OUTPUT_1, - PWRAMP_OUTPUT_Z, - PWRAMP_INPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DiBit_SYNC, - PWRAMP_OUTPUT_DAC, - PWRAMP_OUTPUT_PA_CTRL, - PWRAMP_OUTPUT_EXT_TCXO_EN, - PWRAMP_OUTPUT_TEST_OBS, -} pfpwramp_t; - -typedef enum -{ - AX5043_OK = 0, - AX5043_INVALID_PARAM = 11, - AX5043_TIMEOUT = 12, - AX5043_NOT_FOUND = 13, - AX5043_AUTORANGING_ERROR = 14 -} ax5043_code_t; - -typedef struct -{ - uint32_t tx_freq; - uint32_t rx_freq; - uint32_t f_xtal; - uint8_t f_xtaldiv; - uint32_t tx_baudrate; - uint32_t rx_baudrate; - SPIDriver *spi; - uint8_t rf_init; - freq_mode_t freqsel; - vco_mode_t vco; -} ax5043_conf_t; - - -typedef enum { - trxstate_off, - trxstate_rx, - trxstate_rxwor, - trxstate_wait_xtal, - trxstate_xtal_ready, - trxstate_pll_ranging, - trxstate_pll_ranging_done, - trxstate_pll_settling, - trxstate_pll_settled, - trxstate_tx_xtalwait, - trxstate_tx_longpreamble, - trxstate_tx_shortpreamble, - trxstate_tx_packet, - trxstate_tx_waitdone, - trxstate_txcw_xtalwait, - trxstate_txstream_xtalwait, - trxstate_txstream -} axradio_trxstate_t; - - -//! Structure containing a four byte X.25 address -struct axradio_address { - uint8_t addr[4]; //!< Four byte X.25 address -}; - -struct axradio_address_mask { - uint8_t addr[4]; - uint8_t mask[4]; -}; - -//function declaration starts here -uint8_t ax5043_write_reg_spi(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_write_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -uint8_t ax5043_read_reg(SPIDriver * spip, uint16_t reg, uint8_t value, uint8_t ret_value[]); -void ax5043_set_regs(SPIDriver * spip); -void ax5043_set_regs_tx(SPIDriver * spip); -void ax5043_set_regs_rx(SPIDriver * spip); -void ax5043_set_regs_rxcont(SPIDriver * spip); -void ax5043_set_regs_rxcont_singleparamset(SPIDriver * spip); -void ax5043_shutdown(SPIDriver * spip); -void ax5043_standby(SPIDriver * spip); -void ax5043_fifo_en(SPIDriver * spip); -void ax5043_full_rx(SPIDriver * spip); -void ax5043_synth_tx(SPIDriver * spip); -void ax5043_full_tx(SPIDriver * spip); -void ax5043_reset(SPIDriver * spip); -void ax5043_prepare_tx(SPIDriver * spip); -void ax5043_prepare_rx(SPIDriver * spip); -void ax5043_init_registers_common(SPIDriver * spip); -uint8_t axradio_get_pllvcoi(SPIDriver * spip); - -void ax5043_init(SPIDriver * spip); -void ax5043_transmit(SPIDriver * spip); -void ax5043_receive(SPIDriver * spip); - - -//functions added from bradenburg's code. -uint8_t transmit_packet(SPIDriver * spip, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -void transmit_loop(SPIDriver * spip, axradio_trxstate_t axradio_trxstate, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[], uint16_t axradio_txbuffer_cnt); -void ax5043_writefifo(SPIDriver * spip,const uint8_t *ptr, uint8_t len); - -#endif -//! @} diff --git a/src/archive/app_ax5043_morse_tx/source/morse.c b/src/archive/app_ax5043_morse_tx/source/morse.c deleted file mode 100755 index cac5bc95..00000000 --- a/src/archive/app_ax5043_morse_tx/source/morse.c +++ /dev/null @@ -1,183 +0,0 @@ -/* -The code here refers to logic and snippets from Adam Parker - KD5OOL -*/ - -#include -#include - - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "morse.h" -#include "ax5043.h" - - -#define MAX_MESSAGE_SIZE 512 -char beaconMessage[MAX_MESSAGE_SIZE]; -uint16_t ditLength; - -static const char *alpha[] = { - ".-", //A - "-...", //B - "-.-.", //C - "-..", //D - ".", //E - "..-.", //F - "--.", //G - "....", //H - "..", //I - ".---", //J - "-.-", //K - ".-..", //L - "--", //M - "-.", //N - "---", //O - ".--.", //P - "--.-", //Q - ".-.", //R - "...", //S - "-", //T - "..-", //U - "...-", //V - ".--", //W - "-..-", //X - "-.--", //Y - "--..", //Z -}; - -static const char *num[] = { - "-----", //0 - ".----", //1 - "..---", //2 - "...--", //3 - "....-", //4 - ".....", //5 - "-....", //6 - "--...", //7 - "---..", //8 - "----.", //9 -}; - -void SendDot(SPIDriver * spip) -{ - - uint8_t ret_value[3]={0,0,0}; - - ax5043_full_tx(spip); - chprintf(DEBUG_CHP, "Dot\r\n"); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x00), ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0xFF, ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0xFF, ret_value);//preamble - ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - chThdSleepMilliseconds(DIT_MS); - ax5043_standby(spip); - -} - -void SendDash(SPIDriver * spip) -{ - - uint8_t ret_value[3]={0,0,0}; - - ax5043_full_tx(spip); - chprintf(DEBUG_CHP, "Dash\r\n"); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x00), ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0xFF, ret_value); - ax5043_write_reg(&SPID2, AX5043_REG_FIFODATA, (uint8_t)0xFF, ret_value);//preamble - ax5043_write_reg(&SPID2, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - chThdSleepMilliseconds(DASH_MS); - ax5043_standby(spip); -} - -void LetterSleep(void) -{ - chThdSleepMilliseconds(LETTER_SPACE_MS); -} - -void WordSleep(void) -{ - chThdSleepMilliseconds(WORD_SPACE_MS); -} - -void ElementSleep(void) -{ - chThdSleepMilliseconds(DIT_MS); -} - -//sets ditLength in ms -void SetWpm(int wpm) -{ - ditLength = 1200/wpm; - chprintf(DEBUG_CHP, "ditLength = %d\r\n", ditLength); -} - -void SetMessage(char *message) -{ - memset(beaconMessage, 0, MAX_MESSAGE_SIZE); - int len = strlen(message); - if (strlen(message) >= MAX_MESSAGE_SIZE) - len = MAX_MESSAGE_SIZE-1; - memcpy(beaconMessage, message, len); -} - -const char *AsciiToMorse(char letter) -{ - letter = tolower(letter); - - if (isalpha(letter)) - { - return alpha[letter-'a']; - } - else if (isdigit(letter)) - { - return num[letter-'0']; - } - - return SPACE; -} - -void SendMessage(SPIDriver * spip) -{ - int element; - int index = 0; - const char *morse; - while (beaconMessage[index] != '\0') - { - morse = AsciiToMorse(beaconMessage[index]); - - element = 0; - while (morse[element] != '\0') - { - switch(morse[element]) - { - case '-': - SendDash(spip); - break; - case '.': - SendDot(spip); - } - - if (morse[element] == ' ') - { - WordSleep(); - } - else if (morse[element+1] != '\0') - { - ElementSleep(); - } - else if (morse[element+1] == '\0') - { - LetterSleep(); - } - element++; - } - - index++; - } -} - - diff --git a/src/archive/app_ax5043_morse_tx/source/morse.h b/src/archive/app_ax5043_morse_tx/source/morse.h deleted file mode 100755 index 3d1a9a2c..00000000 --- a/src/archive/app_ax5043_morse_tx/source/morse.h +++ /dev/null @@ -1,27 +0,0 @@ - -#ifndef _MORSE_H_ -#define _MORSE_H_ - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#define SPACE " " - - -#define LETTER_SPACE_MS (ditLength*3) -#define WORD_SPACE_MS (ditLength*7) -#define DIT_MS (ditLength) -#define DASH_MS (ditLength*3) - - - -void SendDot(SPIDriver * spip); -void SendDash(SPIDriver * spip); -void LetterSleep(void); -void WordSleep(void); -void ElementSleep(void); -void SetWpm(int wpm); -void SetMessage(char *message); -void SendMessage(SPIDriver * spip); - -#endif diff --git a/src/archive/app_can_updater/Makefile b/src/archive/app_can_updater/Makefile deleted file mode 100644 index 5d123e62..00000000 --- a/src/archive/app_can_updater/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_f407_discovery - -# Target settings. -MCU = cortex-m4 -BOARD = ORESAT_C3_V3 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -#include $(PROJ_SRC)/oresat.mk -include $(PROJ_SRC)/bootloader.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -include $(CHIBIOS)/os/hal/boards/ST_STM32F4_DISCOVERY/board.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -#include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -include $(CHIBIOS)/test/lib/test.mk -include $(CHIBIOS)/test/rt/rt_test.mk -include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_can_updater/cfg/chconf.h b/src/archive/app_can_updater/cfg/chconf.h deleted file mode 100644 index cec42e04..00000000 --- a/src/archive/app_can_updater/cfg/chconf.h +++ /dev/null @@ -1,756 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_can_updater/cfg/halconf.h b/src/archive/app_can_updater/cfg/halconf.h deleted file mode 100644 index 0424c960..00000000 --- a/src/archive/app_can_updater/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_can_updater/cfg/mcuconf.h b/src/archive/app_can_updater/cfg/mcuconf.h deleted file mode 100644 index d193ad22..00000000 --- a/src/archive/app_can_updater/cfg/mcuconf.h +++ /dev/null @@ -1,352 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF -#define STM32F405_MCUCONF -#define STM32F415_MCUCONF -#define STM32F407_MCUCONF -#define STM32F417_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_PRESA_VALUE 32 -#define STM32_RTC_PRESS_VALUE 1024 -#define STM32_RTC_CR_INIT 0 -#define STM32_RTC_TAMPCR_INIT 0 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 TRUE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_HOST_WAKEUP_DURATION 2 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_can_updater/main.c b/src/archive/app_can_updater/main.c deleted file mode 100644 index 28bfdc26..00000000 --- a/src/archive/app_can_updater/main.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" -#include "rt_test_root.h" -#include "oslib_test_root.h" -#include "chprintf.h" -#include "string.h" -#include "can_bootloader.h" -#include "oresat_f0.h" - -#include "firmware_blob.h" - -#define DEBUG_SD (BaseSequentialStream *) &SD2 - -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static THD_WORKING_AREA(waThread1, 128); -static THD_FUNCTION(Thread1, arg) { - (void)arg; - chRegSetThreadName("blinker"); - while (true) { - palSetPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - palClearPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - } -} - -#define CAN_DRIVER &CAND1 - -#define CAN_BTR(n) (CAN_BTR_SJW(0)|CAN_BTR_TS1(11)|CAN_BTR_TS2(1)|CAN_BTR_BRP((3000/n)-1)) - - - -// xxd -i app_protocard2.crc32.bin > ../../../f4/app_f407_discovery/firmware_blob.h -/* - * This is an example of reading source firmware image data from an in-memory buffer, but this function could be implemented - * to open a file from a file system, seek to an offset in the file, read some data into dest_buffer and close the file. - */ -uint32_t firmware_blob_read_function(const uint32_t offset, uint8_t *dest_buffer, const uint32_t number_of_bytes) { - uint32_t dest_index = 0; - - for(; dest_index < number_of_bytes; dest_index++ ) { - if( (offset + dest_index) < app_protocard2_crc32_bin_len ) { - dest_buffer[dest_index] = app_protocard2_crc32_bin[offset + dest_index]; - } else { - break; - } - } - - return(dest_index); -} - -uint32_t test_read_function(const uint32_t offset, uint8_t *dest_buffer, const uint32_t number_of_bytes) { - chprintf(DEBUG_SD, "Calling test_read_function(%u, x, %u)\r\n", offset, number_of_bytes); - - uint32_t dest_index = 0; - for(; dest_index < number_of_bytes; dest_index++ ) { - dest_buffer[dest_index] = (offset + dest_index) % 0xFF; - } - - return(dest_index); -} - -void test_garbage_can_transmit(void) { - while(1) { - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = 0x55; - tx_msg.DLC = 8; - memset(&tx_msg.data8, 0x55, sizeof(tx_msg.data8)); - - can_api_print_tx_frame(DEBUG_SD, &tx_msg, "", ""); - - canTransmit(CAN_DRIVER, CAN_ANY_MAILBOX, &tx_msg, TIME_MS2I(150)); - chThdSleepMilliseconds(1000); - } -} - - -/* - * Application entry point. - */ -int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - * PA2(TX) and PA3(RX) are routed to USART2. - */ - sdStart(&SD2, NULL); - - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - chprintf(DEBUG_SD, "\r\n=======================================\r\n"); - chprintf(DEBUG_SD, "\r\n=========== discovery =================\r\n"); - chprintf(DEBUG_SD, "STM32_PCLK2 = %u\r\n", STM32_PCLK2); - - - palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(9)); //CAN 1 RX - palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(9)); //CAN 1 TX - - palSetPadMode(GPIOB, 5, PAL_MODE_ALTERNATE(9)); //CAN 2 RX - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(9)); //CAN 2 TX - - - CANConfig cancfg; - memset(&cancfg, 0, sizeof(cancfg)); - - -#define TARGET_STM32_BOOTLOADER 0 - - - //http://www.bittiming.can-wiki.info/ -#if TARGET_STM32_BOOTLOADER - cancfg.btr = (CAN_BTR_SJW(0) | CAN_BTR_TS1(12) | CAN_BTR_TS2(1) | CAN_BTR_BRP(20)); -#else - cancfg.btr = (CAN_BTR_SJW(0) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1) | CAN_BTR_BRP(2)); -#endif - cancfg.mcr = ( - /* MCR (Master Control Register) */ - CAN_MCR_ABOM | //Automatic Bus-Off Management - CAN_MCR_AWUM | //Automatic Wakeup Mode - CAN_MCR_TXFP | //Transmit FIFO Priority - 0/*CAN_MCR_NART*/ ); // No Automatic Retransmission - - chprintf(DEBUG_SD, "Initializing CAN peripheral with MCR = 0x%X\r\n", cancfg.mcr); - chprintf(DEBUG_SD, "Initializing CAN peripheral with BTR = 0x%X\r\n", cancfg.btr); - - - canSTM32SetFilters(CAN_DRIVER, 0, 0, NULL); - canStart(CAN_DRIVER, &cancfg); - - /* Put CAN module in normal mode */ - //canSTM32SetFilters(&CAND2, 0, 0, NULL); - //canStart(&CAND2, &cancfg); - - chprintf(DEBUG_SD, "Done starting CAN peripheral\r\n"); - - - //can_bootloader_test(CAN_DRIVER, DEBUG_SD); - /* - * Creates the example thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - -#if TARGET_STM32_BOOTLOADER - can_bootloader_config_t can_bl_config; - can_api_init_can_bootloader_config_t(&can_bl_config, CAN_DRIVER, DEBUG_SD, 0, true); - - //can_bootloader_initiate(&can_bl_config, 3000); - //can_bootloader_test(&can_bl_config); - oresat_firmware_update_m0(&can_bl_config, 0x08000000, 16, test_read_function); - -#else - const uint32_t low_cpuid_of_protoboard = 0x1D000800; - can_bootloader_config_t can_bl_config; - can_api_init_can_bootloader_config_t(&can_bl_config, CAN_DRIVER, DEBUG_SD, low_cpuid_of_protoboard, false); - - //test_garbage_can_transmit(); - //oresat_firmware_update_m0(&can_bl_config, ORESAT_F0_FIRMWARE_CRC_ADDRESS, 72, test_read_function); - - oresat_firmware_update_m0(&can_bl_config, ORESAT_F0_FIRMWARE_CRC_ADDRESS, app_protocard2_crc32_bin_len, firmware_blob_read_function); -#endif - - print_can_bootloader_config_t(&can_bl_config); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (true) { -#if 0 - CANTxFrame tx_msg; - memset(&tx_msg, 0, sizeof(tx_msg)); - tx_msg.SID = 0x79; - tx_msg.DLC = 8; - memset(&tx_msg.data8, 0x55, sizeof(tx_msg.data8)); - - can_api_print_tx_frame(DEBUG_SD, &tx_msg, "TXing: ", ""); - - canTransmit(CAN_DRIVER, CAN_ANY_MAILBOX, &tx_msg, TIME_MS2I(150)); - -#endif - -#if 0 - CANRxFrame rx_msg; - memset(&rx_msg, 0, sizeof(rx_msg)); - chprintf(DEBUG_SD, "CAN State: %u\r\n", (CAN_DRIVER)->state); - chprintf(DEBUG_SD, "Attempting CAN RX....\r\n"); - can_api_receive(&can_bl_config, &rx_msg, 1000); -#endif - - -#if 0 - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - test_execute((BaseSequentialStream *)&SD2, &rt_test_suite); - test_execute((BaseSequentialStream *)&SD2, &oslib_test_suite); - } -#endif - chThdSleepMilliseconds(500); - } -} - - - - - - diff --git a/src/archive/app_can_updater/source/firmware_blob.h b/src/archive/app_can_updater/source/firmware_blob.h deleted file mode 100644 index 31c1f659..00000000 --- a/src/archive/app_can_updater/source/firmware_blob.h +++ /dev/null @@ -1,3625 +0,0 @@ -unsigned char app_protocard2_crc32_bin[] = { - 0xf6, 0x37, 0x29, 0xd7, 0xc0, 0xa9, 0x00, 0x00, 0x85, 0x62, 0x34, 0x01, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0x00, 0x20, 0x91, 0xa5, 0x00, 0x08, - 0x61, 0x27, 0x01, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0xc1, 0xec, 0x00, 0x08, - 0x31, 0xf2, 0x00, 0x08, 0xc1, 0xf1, 0x00, 0x08, 0xc1, 0xf0, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x01, 0x33, 0x01, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x93, 0xa5, 0x00, 0x08, 0xe1, 0xf2, 0x00, 0x08, - 0xb1, 0xf2, 0x00, 0x08, 0x81, 0xf2, 0x00, 0x08, 0xd1, 0xef, 0x00, 0x08, - 0x93, 0xa5, 0x00, 0x08, 0x72, 0xb6, 0x24, 0x48, 0x80, 0xf3, 0x08, 0x88, - 0x23, 0x48, 0x80, 0xf3, 0x09, 0x88, 0x02, 0x20, 0x80, 0xf3, 0x14, 0x88, - 0xbf, 0xf3, 0x6f, 0x8f, 0x07, 0xf0, 0xfa, 0xf9, 0x08, 0xf0, 0x30, 0xfe, - 0x1e, 0x48, 0x1f, 0x49, 0x1b, 0x4a, 0x91, 0x42, 0x02, 0xda, 0x08, 0x60, - 0x04, 0x31, 0xfa, 0xe7, 0x1c, 0x49, 0x19, 0x4a, 0x91, 0x42, 0x02, 0xda, - 0x08, 0x60, 0x04, 0x31, 0xfa, 0xe7, 0x1a, 0x49, 0x1a, 0x4a, 0x1b, 0x4b, - 0x9a, 0x42, 0x04, 0xda, 0x08, 0x68, 0x10, 0x60, 0x04, 0x31, 0x04, 0x32, - 0xf8, 0xe7, 0x00, 0x20, 0x17, 0x49, 0x18, 0x4a, 0x91, 0x42, 0x02, 0xda, - 0x08, 0x60, 0x04, 0x31, 0xfa, 0xe7, 0x07, 0xf0, 0xad, 0xf9, 0x07, 0xf0, - 0xcb, 0xf9, 0x14, 0x4c, 0x14, 0x4d, 0xac, 0x42, 0x03, 0xda, 0x21, 0x68, - 0x88, 0x47, 0x04, 0x34, 0xf9, 0xe7, 0x08, 0xf0, 0xb9, 0xf8, 0x11, 0x4c, - 0x11, 0x4d, 0xac, 0x42, 0x03, 0xda, 0x21, 0x68, 0x88, 0x47, 0x04, 0x34, - 0xf9, 0xe7, 0x0f, 0x49, 0x08, 0x47, 0x00, 0x00, 0x00, 0x06, 0x00, 0x20, - 0x00, 0x08, 0x00, 0x20, 0x55, 0x55, 0x55, 0x55, 0x00, 0x04, 0x00, 0x20, - 0x00, 0x06, 0x00, 0x20, 0xf0, 0x46, 0x01, 0x08, 0x00, 0x08, 0x00, 0x20, - 0xd4, 0x0a, 0x00, 0x20, 0xd8, 0x0a, 0x00, 0x20, 0x50, 0x25, 0x00, 0x20, - 0xc0, 0xa4, 0x00, 0x08, 0xc0, 0xa4, 0x00, 0x08, 0xc0, 0xa4, 0x00, 0x08, - 0xc0, 0xa4, 0x00, 0x08, 0xb1, 0x18, 0x01, 0x08, 0x96, 0xe7, 0x00, 0xf0, - 0x00, 0xf8, 0xfe, 0xe7, 0xf0, 0xb5, 0x44, 0x46, 0x4d, 0x46, 0x56, 0x46, - 0x5f, 0x46, 0xf0, 0xb4, 0x6b, 0x46, 0xcb, 0x60, 0xc3, 0x68, 0x9d, 0x46, - 0xf0, 0xbc, 0xa0, 0x46, 0xa9, 0x46, 0xb2, 0x46, 0xbb, 0x46, 0xf0, 0xbd, - 0x08, 0xf0, 0xba, 0xfc, 0x62, 0xb6, 0x28, 0x1c, 0xa0, 0x47, 0x00, 0x20, - 0x02, 0xf0, 0xd4, 0xfd, 0xfe, 0xe7, 0x08, 0xf0, 0xc9, 0xfc, 0x02, 0xf0, - 0x2f, 0xfb, 0x08, 0xf0, 0xad, 0xfc, 0x02, 0x4a, 0x02, 0x4b, 0x13, 0x60, - 0xfe, 0xe7, 0xc0, 0x46, 0x04, 0xed, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x22, 0x43, 0x08, 0x8b, 0x42, 0x74, 0xd3, 0x03, 0x09, 0x8b, 0x42, - 0x5f, 0xd3, 0x03, 0x0a, 0x8b, 0x42, 0x44, 0xd3, 0x03, 0x0b, 0x8b, 0x42, - 0x28, 0xd3, 0x03, 0x0c, 0x8b, 0x42, 0x0d, 0xd3, 0xff, 0x22, 0x09, 0x02, - 0x12, 0xba, 0x03, 0x0c, 0x8b, 0x42, 0x02, 0xd3, 0x12, 0x12, 0x09, 0x02, - 0x65, 0xd0, 0x03, 0x0b, 0x8b, 0x42, 0x19, 0xd3, 0x00, 0xe0, 0x09, 0x0a, - 0xc3, 0x0b, 0x8b, 0x42, 0x01, 0xd3, 0xcb, 0x03, 0xc0, 0x1a, 0x52, 0x41, - 0x83, 0x0b, 0x8b, 0x42, 0x01, 0xd3, 0x8b, 0x03, 0xc0, 0x1a, 0x52, 0x41, - 0x43, 0x0b, 0x8b, 0x42, 0x01, 0xd3, 0x4b, 0x03, 0xc0, 0x1a, 0x52, 0x41, - 0x03, 0x0b, 0x8b, 0x42, 0x01, 0xd3, 0x0b, 0x03, 0xc0, 0x1a, 0x52, 0x41, - 0xc3, 0x0a, 0x8b, 0x42, 0x01, 0xd3, 0xcb, 0x02, 0xc0, 0x1a, 0x52, 0x41, - 0x83, 0x0a, 0x8b, 0x42, 0x01, 0xd3, 0x8b, 0x02, 0xc0, 0x1a, 0x52, 0x41, - 0x43, 0x0a, 0x8b, 0x42, 0x01, 0xd3, 0x4b, 0x02, 0xc0, 0x1a, 0x52, 0x41, - 0x03, 0x0a, 0x8b, 0x42, 0x01, 0xd3, 0x0b, 0x02, 0xc0, 0x1a, 0x52, 0x41, - 0xcd, 0xd2, 0xc3, 0x09, 0x8b, 0x42, 0x01, 0xd3, 0xcb, 0x01, 0xc0, 0x1a, - 0x52, 0x41, 0x83, 0x09, 0x8b, 0x42, 0x01, 0xd3, 0x8b, 0x01, 0xc0, 0x1a, - 0x52, 0x41, 0x43, 0x09, 0x8b, 0x42, 0x01, 0xd3, 0x4b, 0x01, 0xc0, 0x1a, - 0x52, 0x41, 0x03, 0x09, 0x8b, 0x42, 0x01, 0xd3, 0x0b, 0x01, 0xc0, 0x1a, - 0x52, 0x41, 0xc3, 0x08, 0x8b, 0x42, 0x01, 0xd3, 0xcb, 0x00, 0xc0, 0x1a, - 0x52, 0x41, 0x83, 0x08, 0x8b, 0x42, 0x01, 0xd3, 0x8b, 0x00, 0xc0, 0x1a, - 0x52, 0x41, 0x43, 0x08, 0x8b, 0x42, 0x01, 0xd3, 0x4b, 0x00, 0xc0, 0x1a, - 0x52, 0x41, 0x41, 0x1a, 0x00, 0xd2, 0x01, 0x46, 0x52, 0x41, 0x10, 0x46, - 0x70, 0x47, 0xff, 0xe7, 0x01, 0xb5, 0x00, 0x20, 0x00, 0xf0, 0xf0, 0xf8, - 0x02, 0xbd, 0xc0, 0x46, 0x00, 0x29, 0xf7, 0xd0, 0x76, 0xe7, 0x70, 0x47, - 0x03, 0x46, 0x0b, 0x43, 0x7f, 0xd4, 0x00, 0x22, 0x43, 0x08, 0x8b, 0x42, - 0x74, 0xd3, 0x03, 0x09, 0x8b, 0x42, 0x5f, 0xd3, 0x03, 0x0a, 0x8b, 0x42, - 0x44, 0xd3, 0x03, 0x0b, 0x8b, 0x42, 0x28, 0xd3, 0x03, 0x0c, 0x8b, 0x42, - 0x0d, 0xd3, 0xff, 0x22, 0x09, 0x02, 0x12, 0xba, 0x03, 0x0c, 0x8b, 0x42, - 0x02, 0xd3, 0x12, 0x12, 0x09, 0x02, 0x65, 0xd0, 0x03, 0x0b, 0x8b, 0x42, - 0x19, 0xd3, 0x00, 0xe0, 0x09, 0x0a, 0xc3, 0x0b, 0x8b, 0x42, 0x01, 0xd3, - 0xcb, 0x03, 0xc0, 0x1a, 0x52, 0x41, 0x83, 0x0b, 0x8b, 0x42, 0x01, 0xd3, - 0x8b, 0x03, 0xc0, 0x1a, 0x52, 0x41, 0x43, 0x0b, 0x8b, 0x42, 0x01, 0xd3, - 0x4b, 0x03, 0xc0, 0x1a, 0x52, 0x41, 0x03, 0x0b, 0x8b, 0x42, 0x01, 0xd3, - 0x0b, 0x03, 0xc0, 0x1a, 0x52, 0x41, 0xc3, 0x0a, 0x8b, 0x42, 0x01, 0xd3, - 0xcb, 0x02, 0xc0, 0x1a, 0x52, 0x41, 0x83, 0x0a, 0x8b, 0x42, 0x01, 0xd3, - 0x8b, 0x02, 0xc0, 0x1a, 0x52, 0x41, 0x43, 0x0a, 0x8b, 0x42, 0x01, 0xd3, - 0x4b, 0x02, 0xc0, 0x1a, 0x52, 0x41, 0x03, 0x0a, 0x8b, 0x42, 0x01, 0xd3, - 0x0b, 0x02, 0xc0, 0x1a, 0x52, 0x41, 0xcd, 0xd2, 0xc3, 0x09, 0x8b, 0x42, - 0x01, 0xd3, 0xcb, 0x01, 0xc0, 0x1a, 0x52, 0x41, 0x83, 0x09, 0x8b, 0x42, - 0x01, 0xd3, 0x8b, 0x01, 0xc0, 0x1a, 0x52, 0x41, 0x43, 0x09, 0x8b, 0x42, - 0x01, 0xd3, 0x4b, 0x01, 0xc0, 0x1a, 0x52, 0x41, 0x03, 0x09, 0x8b, 0x42, - 0x01, 0xd3, 0x0b, 0x01, 0xc0, 0x1a, 0x52, 0x41, 0xc3, 0x08, 0x8b, 0x42, - 0x01, 0xd3, 0xcb, 0x00, 0xc0, 0x1a, 0x52, 0x41, 0x83, 0x08, 0x8b, 0x42, - 0x01, 0xd3, 0x8b, 0x00, 0xc0, 0x1a, 0x52, 0x41, 0x43, 0x08, 0x8b, 0x42, - 0x01, 0xd3, 0x4b, 0x00, 0xc0, 0x1a, 0x52, 0x41, 0x41, 0x1a, 0x00, 0xd2, - 0x01, 0x46, 0x52, 0x41, 0x10, 0x46, 0x70, 0x47, 0x5d, 0xe0, 0xca, 0x0f, - 0x00, 0xd0, 0x49, 0x42, 0x03, 0x10, 0x00, 0xd3, 0x40, 0x42, 0x53, 0x40, - 0x00, 0x22, 0x9c, 0x46, 0x03, 0x09, 0x8b, 0x42, 0x2d, 0xd3, 0x03, 0x0a, - 0x8b, 0x42, 0x12, 0xd3, 0xfc, 0x22, 0x89, 0x01, 0x12, 0xba, 0x03, 0x0a, - 0x8b, 0x42, 0x0c, 0xd3, 0x89, 0x01, 0x92, 0x11, 0x8b, 0x42, 0x08, 0xd3, - 0x89, 0x01, 0x92, 0x11, 0x8b, 0x42, 0x04, 0xd3, 0x89, 0x01, 0x3a, 0xd0, - 0x92, 0x11, 0x00, 0xe0, 0x89, 0x09, 0xc3, 0x09, 0x8b, 0x42, 0x01, 0xd3, - 0xcb, 0x01, 0xc0, 0x1a, 0x52, 0x41, 0x83, 0x09, 0x8b, 0x42, 0x01, 0xd3, - 0x8b, 0x01, 0xc0, 0x1a, 0x52, 0x41, 0x43, 0x09, 0x8b, 0x42, 0x01, 0xd3, - 0x4b, 0x01, 0xc0, 0x1a, 0x52, 0x41, 0x03, 0x09, 0x8b, 0x42, 0x01, 0xd3, - 0x0b, 0x01, 0xc0, 0x1a, 0x52, 0x41, 0xc3, 0x08, 0x8b, 0x42, 0x01, 0xd3, - 0xcb, 0x00, 0xc0, 0x1a, 0x52, 0x41, 0x83, 0x08, 0x8b, 0x42, 0x01, 0xd3, - 0x8b, 0x00, 0xc0, 0x1a, 0x52, 0x41, 0xd9, 0xd2, 0x43, 0x08, 0x8b, 0x42, - 0x01, 0xd3, 0x4b, 0x00, 0xc0, 0x1a, 0x52, 0x41, 0x41, 0x1a, 0x00, 0xd2, - 0x01, 0x46, 0x63, 0x46, 0x52, 0x41, 0x5b, 0x10, 0x10, 0x46, 0x01, 0xd3, - 0x40, 0x42, 0x00, 0x2b, 0x00, 0xd5, 0x49, 0x42, 0x70, 0x47, 0x63, 0x46, - 0x5b, 0x10, 0x00, 0xd3, 0x40, 0x42, 0x01, 0xb5, 0x00, 0x20, 0x00, 0xf0, - 0x05, 0xf8, 0x02, 0xbd, 0x00, 0x29, 0xf8, 0xd0, 0x16, 0xe7, 0x70, 0x47, - 0x70, 0x47, 0xc0, 0x46, 0x00, 0x2b, 0x11, 0xd1, 0x00, 0x2a, 0x0f, 0xd1, - 0x00, 0x29, 0x00, 0xd1, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x21, 0xc9, 0x43, - 0x08, 0x1c, 0x07, 0xb4, 0x02, 0x48, 0x02, 0xa1, 0x40, 0x18, 0x02, 0x90, - 0x03, 0xbd, 0xc0, 0x46, 0xd9, 0xff, 0xff, 0xff, 0x03, 0xb4, 0x68, 0x46, - 0x01, 0xb5, 0x02, 0x98, 0x00, 0xf0, 0x32, 0xf8, 0x01, 0x9b, 0x9e, 0x46, - 0x02, 0xb0, 0x0c, 0xbc, 0x70, 0x47, 0xc0, 0x46, 0xf0, 0xb5, 0x4f, 0x46, - 0x46, 0x46, 0xc0, 0xb4, 0x16, 0x04, 0x36, 0x0c, 0x99, 0x46, 0x33, 0x00, - 0x05, 0x04, 0x2c, 0x0c, 0x07, 0x0c, 0x15, 0x0c, 0x63, 0x43, 0x7e, 0x43, - 0x6f, 0x43, 0x65, 0x43, 0x1c, 0x0c, 0xad, 0x19, 0x64, 0x19, 0x9c, 0x46, - 0xa6, 0x42, 0x03, 0xd9, 0x80, 0x23, 0x5b, 0x02, 0x98, 0x46, 0x47, 0x44, - 0x63, 0x46, 0x25, 0x0c, 0xef, 0x19, 0x1d, 0x04, 0x4b, 0x46, 0x4a, 0x43, - 0x43, 0x43, 0x2d, 0x0c, 0x24, 0x04, 0x64, 0x19, 0x99, 0x18, 0xc9, 0x19, - 0x20, 0x00, 0x0c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xf0, 0xbd, 0xc0, 0x46, - 0xf0, 0xb5, 0x4d, 0x46, 0x56, 0x46, 0x44, 0x46, 0x5f, 0x46, 0xf0, 0xb4, - 0x92, 0x46, 0x83, 0xb0, 0x04, 0x00, 0x0d, 0x00, 0x99, 0x46, 0x8b, 0x42, - 0x2f, 0xd8, 0x2c, 0xd0, 0x49, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xae, 0xf8, - 0x29, 0x00, 0x06, 0x00, 0x20, 0x00, 0x00, 0xf0, 0xa9, 0xf8, 0x33, 0x1a, - 0x98, 0x46, 0x20, 0x3b, 0x9b, 0x46, 0x00, 0xd5, 0x74, 0xe0, 0x53, 0x46, - 0x5a, 0x46, 0x93, 0x40, 0x1f, 0x00, 0x53, 0x46, 0x42, 0x46, 0x93, 0x40, - 0x1e, 0x00, 0xaf, 0x42, 0x29, 0xd8, 0x26, 0xd0, 0x5b, 0x46, 0xa4, 0x1b, - 0xbd, 0x41, 0x00, 0x2b, 0x00, 0xda, 0x79, 0xe0, 0x00, 0x22, 0x00, 0x23, - 0x00, 0x92, 0x01, 0x93, 0x01, 0x23, 0x5a, 0x46, 0x93, 0x40, 0x01, 0x93, - 0x01, 0x23, 0x42, 0x46, 0x93, 0x40, 0x00, 0x93, 0x19, 0xe0, 0x82, 0x42, - 0xd0, 0xd9, 0x00, 0x22, 0x00, 0x23, 0x00, 0x92, 0x01, 0x93, 0x0c, 0x9b, - 0x00, 0x2b, 0x01, 0xd0, 0x1c, 0x60, 0x5d, 0x60, 0x00, 0x98, 0x01, 0x99, - 0x03, 0xb0, 0x3c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xa2, 0x46, 0xab, 0x46, - 0xf0, 0xbd, 0xa3, 0x42, 0xd6, 0xd9, 0x00, 0x22, 0x00, 0x23, 0x00, 0x92, - 0x01, 0x93, 0x43, 0x46, 0x00, 0x2b, 0xe8, 0xd0, 0xfb, 0x07, 0x72, 0x08, - 0x1a, 0x43, 0x46, 0x46, 0x7b, 0x08, 0x0e, 0xe0, 0xab, 0x42, 0x01, 0xd1, - 0xa2, 0x42, 0x0c, 0xd8, 0xa4, 0x1a, 0x9d, 0x41, 0x01, 0x20, 0x24, 0x19, - 0x6d, 0x41, 0x00, 0x21, 0x01, 0x3e, 0x24, 0x18, 0x4d, 0x41, 0x00, 0x2e, - 0x06, 0xd0, 0xab, 0x42, 0xee, 0xd9, 0x01, 0x3e, 0x24, 0x19, 0x6d, 0x41, - 0x00, 0x2e, 0xf8, 0xd1, 0x5b, 0x46, 0x00, 0x98, 0x01, 0x99, 0x00, 0x19, - 0x69, 0x41, 0x00, 0x2b, 0x22, 0xdb, 0x2b, 0x00, 0x5a, 0x46, 0xd3, 0x40, - 0x2a, 0x00, 0x44, 0x46, 0xe2, 0x40, 0x1c, 0x00, 0x5b, 0x46, 0x15, 0x00, - 0x00, 0x2b, 0x2c, 0xdb, 0x26, 0x00, 0x9e, 0x40, 0x33, 0x00, 0x26, 0x00, - 0x47, 0x46, 0xbe, 0x40, 0x32, 0x00, 0x80, 0x1a, 0x99, 0x41, 0x00, 0x90, - 0x01, 0x91, 0xae, 0xe7, 0x42, 0x46, 0x20, 0x23, 0x9b, 0x1a, 0x52, 0x46, - 0xda, 0x40, 0x41, 0x46, 0x13, 0x00, 0x4a, 0x46, 0x8a, 0x40, 0x17, 0x00, - 0x1f, 0x43, 0x82, 0xe7, 0x42, 0x46, 0x20, 0x23, 0x9b, 0x1a, 0x2a, 0x00, - 0x46, 0x46, 0x9a, 0x40, 0x23, 0x00, 0xf3, 0x40, 0x13, 0x43, 0xd5, 0xe7, - 0x42, 0x46, 0x20, 0x23, 0x00, 0x21, 0x9b, 0x1a, 0x00, 0x22, 0x00, 0x91, - 0x01, 0x92, 0x01, 0x22, 0xda, 0x40, 0x01, 0x92, 0x82, 0xe7, 0x42, 0x46, - 0x20, 0x23, 0x26, 0x00, 0x9b, 0x1a, 0xde, 0x40, 0x2f, 0x00, 0xb4, 0x46, - 0x97, 0x40, 0x66, 0x46, 0x3b, 0x00, 0x33, 0x43, 0xc9, 0xe7, 0xc0, 0x46, - 0x10, 0xb5, 0x00, 0x29, 0x03, 0xd1, 0x00, 0xf0, 0x07, 0xf8, 0x20, 0x30, - 0x02, 0xe0, 0x08, 0x1c, 0x00, 0xf0, 0x02, 0xf8, 0x10, 0xbd, 0xc0, 0x46, - 0x1c, 0x21, 0x01, 0x23, 0x1b, 0x04, 0x98, 0x42, 0x01, 0xd3, 0x00, 0x0c, - 0x10, 0x39, 0x1b, 0x0a, 0x98, 0x42, 0x01, 0xd3, 0x00, 0x0a, 0x08, 0x39, - 0x1b, 0x09, 0x98, 0x42, 0x01, 0xd3, 0x00, 0x09, 0x04, 0x39, 0x02, 0xa2, - 0x10, 0x5c, 0x40, 0x18, 0x70, 0x47, 0xc0, 0x46, 0x04, 0x03, 0x02, 0x02, - 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x01, 0x68, 0x43, 0x68, 0x1c, 0x78, 0xc2, 0x7d, 0x00, 0x2a, - 0x0a, 0xd0, 0x49, 0x7a, 0x82, 0x7d, 0x00, 0x2a, 0x02, 0xd1, 0x19, 0x70, - 0x00, 0x20, 0x10, 0xe0, 0x91, 0x42, 0x09, 0xd2, 0x07, 0x48, 0x0c, 0xe0, - 0x83, 0x7d, 0x00, 0x2b, 0x06, 0xd1, 0x00, 0x2c, 0x06, 0xd1, 0x4b, 0x72, - 0x00, 0x20, 0x04, 0xe0, 0x00, 0x20, 0x02, 0xe0, 0x02, 0x48, 0x00, 0xe0, - 0x02, 0x48, 0x10, 0xbd, 0x24, 0x00, 0x00, 0x08, 0x02, 0x00, 0x01, 0x06, - 0x30, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x4b, 0xc3, 0x5c, - 0x1a, 0x00, 0xf4, 0x32, 0x92, 0x00, 0x82, 0x18, 0x52, 0x68, 0x00, 0x2a, - 0x0b, 0xd0, 0x5a, 0x1c, 0xd2, 0xb2, 0x01, 0x2a, 0x00, 0xd9, 0x00, 0x22, - 0x03, 0x49, 0x42, 0x54, 0xf4, 0x33, 0x9b, 0x00, 0xc0, 0x18, 0x00, 0x23, - 0x43, 0x60, 0x70, 0x47, 0xdd, 0x03, 0x00, 0x00, 0xf7, 0x23, 0x9b, 0x00, - 0xc3, 0x5c, 0x5a, 0x1c, 0xd2, 0xb2, 0x01, 0x2a, 0x00, 0xd9, 0x00, 0x22, - 0xf7, 0x21, 0x89, 0x00, 0x42, 0x54, 0xf4, 0x33, 0x9b, 0x00, 0xc0, 0x18, - 0x01, 0x23, 0x43, 0x60, 0x70, 0x47, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x47, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x82, 0xb0, 0x04, 0x00, 0x06, 0x68, 0x45, 0x68, 0x04, 0x22, - 0x29, 0x00, 0x01, 0xa8, 0x08, 0xf0, 0x6a, 0xfc, 0x01, 0x9b, 0xe2, 0x7d, - 0x00, 0x2a, 0x07, 0xd0, 0x32, 0x78, 0xd3, 0x18, 0x01, 0x93, 0x04, 0x22, - 0x01, 0xa9, 0x28, 0x00, 0x08, 0xf0, 0x5e, 0xfc, 0x00, 0x20, 0x02, 0xb0, - 0x70, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x82, 0xb0, 0x04, 0x00, 0x06, 0x68, - 0x45, 0x68, 0x04, 0x22, 0x29, 0x00, 0x01, 0xa8, 0x08, 0xf0, 0x4a, 0xfc, - 0x01, 0x9a, 0xe3, 0x7d, 0x00, 0x2b, 0x0a, 0xd0, 0xa3, 0x7d, 0x00, 0x2b, - 0x07, 0xd0, 0x33, 0x78, 0x9a, 0x18, 0x01, 0x92, 0x04, 0x22, 0x01, 0xa9, - 0x28, 0x00, 0x08, 0xf0, 0x3b, 0xfc, 0x00, 0x20, 0x02, 0xb0, 0x70, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0xb0, - 0x0d, 0x00, 0x00, 0x28, 0x1b, 0xd0, 0x06, 0x6f, 0x00, 0x2e, 0x18, 0xd0, - 0x0c, 0x89, 0x64, 0x05, 0x64, 0x0d, 0x80, 0x2c, 0x13, 0xd0, 0x10, 0x31, - 0x0a, 0x27, 0x6f, 0x44, 0x02, 0x22, 0x38, 0x00, 0x08, 0xf0, 0xe2, 0xfb, - 0x29, 0x00, 0x14, 0x31, 0x04, 0x22, 0x03, 0xa8, 0x08, 0xf0, 0xdc, 0xfb, - 0xeb, 0x7c, 0xaa, 0x7c, 0x39, 0x88, 0x03, 0x98, 0x00, 0x90, 0x20, 0x00, - 0xb0, 0x47, 0x05, 0xb0, 0xf0, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x4f, 0x46, 0x46, 0x46, 0xc0, 0xb4, - 0x04, 0x00, 0x0a, 0x79, 0x12, 0x07, 0x12, 0x0f, 0x0e, 0x00, 0x10, 0x36, - 0xf7, 0x23, 0x9b, 0x00, 0xc5, 0x5c, 0xe8, 0x00, 0x20, 0x18, 0x08, 0x2a, - 0x74, 0xd1, 0x2b, 0x00, 0xf4, 0x33, 0x9b, 0x00, 0xe3, 0x18, 0x5b, 0x68, - 0x00, 0x2b, 0x6d, 0xd1, 0x38, 0x4b, 0xe3, 0x5c, 0xa5, 0x2b, 0x06, 0xd0, - 0x31, 0x00, 0x08, 0xf0, 0xaf, 0xfb, 0x20, 0x00, 0xff, 0xf7, 0x56, 0xff, - 0x52, 0xe0, 0x0b, 0x7c, 0x03, 0x70, 0x7f, 0x22, 0x1a, 0x40, 0x00, 0x21, - 0xf2, 0x23, 0x9b, 0x00, 0xe1, 0x50, 0x30, 0x4b, 0xe3, 0x5c, 0x00, 0x2b, - 0x01, 0xd0, 0x2e, 0x4b, 0xe1, 0x54, 0x2e, 0x4b, 0xe3, 0x5c, 0x59, 0x1c, - 0x8a, 0x42, 0x35, 0xd1, 0xe6, 0x22, 0x92, 0x00, 0xa1, 0x5a, 0x2b, 0x4a, - 0x52, 0x1a, 0x06, 0x2a, 0x27, 0xdd, 0x01, 0x33, 0x27, 0x4a, 0xa3, 0x54, - 0x01, 0x23, 0x0f, 0xe0, 0xe8, 0x22, 0x92, 0x00, 0xa2, 0x58, 0x91, 0x46, - 0xe6, 0x22, 0x92, 0x00, 0x90, 0x46, 0xa2, 0x5a, 0x51, 0x1c, 0x47, 0x46, - 0xe1, 0x53, 0xf1, 0x5c, 0x4f, 0x46, 0xb9, 0x54, 0x01, 0x33, 0xdb, 0xb2, - 0x07, 0x2b, 0xed, 0xd9, 0x00, 0x23, 0xc3, 0x56, 0x00, 0x2b, 0x05, 0xdb, - 0x1a, 0x4b, 0xe2, 0x5c, 0x0a, 0x33, 0xe3, 0x5c, 0x9a, 0x42, 0x17, 0xd3, - 0xa6, 0x22, 0x15, 0x4b, 0xe2, 0x54, 0x20, 0x00, 0xff, 0xf7, 0x14, 0xff, - 0x10, 0xe0, 0xa7, 0x22, 0x11, 0x4b, 0xe2, 0x54, 0x20, 0x00, 0xff, 0xf7, - 0x0d, 0xff, 0x09, 0xe0, 0x9a, 0x42, 0x07, 0xd0, 0x00, 0x2b, 0x05, 0xd0, - 0xa7, 0x22, 0x0c, 0x4b, 0xe2, 0x54, 0x20, 0x00, 0xff, 0xf7, 0x02, 0xff, - 0x2b, 0x00, 0xf4, 0x33, 0x9b, 0x00, 0xe3, 0x18, 0x5b, 0x68, 0x00, 0x2b, - 0x08, 0xd0, 0xf8, 0x23, 0x9b, 0x00, 0xe3, 0x58, 0x00, 0x2b, 0x03, 0xd0, - 0xf9, 0x22, 0x92, 0x00, 0xa0, 0x58, 0x98, 0x47, 0x0c, 0xbc, 0x90, 0x46, - 0x99, 0x46, 0xf8, 0xbd, 0xc1, 0x03, 0x00, 0x00, 0xd1, 0x03, 0x00, 0x00, - 0xc2, 0x03, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x47, 0x46, - 0x80, 0xb4, 0x04, 0x00, 0x0e, 0x00, 0xe8, 0x23, 0x9b, 0x00, 0xc7, 0x58, - 0x04, 0x33, 0xc5, 0x58, 0x2e, 0x4b, 0xc3, 0x5a, 0x1b, 0x07, 0x52, 0xd5, - 0x00, 0x2d, 0x03, 0xd1, 0xea, 0x23, 0x9b, 0x00, 0xe1, 0x52, 0x04, 0xe0, - 0xea, 0x23, 0x9b, 0x00, 0xc3, 0x5a, 0x8b, 0x42, 0x49, 0xd1, 0x28, 0x48, - 0x02, 0xf0, 0x2c, 0xfa, 0x00, 0x22, 0x27, 0x4b, 0xe2, 0x54, 0x1f, 0x3b, - 0xe2, 0x58, 0x00, 0x2a, 0x13, 0xd0, 0x25, 0x4b, 0xe3, 0x5a, 0x59, 0x00, - 0xcb, 0x18, 0x99, 0x00, 0x53, 0x58, 0x00, 0x2b, 0x0b, 0xd0, 0xe7, 0x22, - 0x92, 0x00, 0xa0, 0x18, 0x98, 0x47, 0x80, 0x46, 0x00, 0x28, 0x04, 0xd0, - 0x1b, 0x48, 0x02, 0xf0, 0xb3, 0xf9, 0x40, 0x46, 0x2c, 0xe0, 0xea, 0x23, - 0x9b, 0x00, 0xe3, 0x5a, 0xef, 0x22, 0x92, 0x00, 0xa1, 0x58, 0x8c, 0x46, - 0x63, 0x44, 0xa3, 0x50, 0x00, 0x22, 0xed, 0x23, 0x9b, 0x00, 0xe2, 0x54, - 0x04, 0x3b, 0xe3, 0x58, 0x1b, 0x02, 0x1b, 0x0a, 0x13, 0x4a, 0x93, 0x42, - 0x01, 0xd0, 0x00, 0x23, 0x00, 0xe0, 0x01, 0x23, 0x00, 0x2d, 0x0b, 0xd0, - 0x00, 0x2b, 0x05, 0xd0, 0x08, 0xe0, 0x3a, 0x78, 0x2a, 0x70, 0x1e, 0x00, - 0x01, 0x35, 0x01, 0x37, 0x73, 0x1e, 0x9b, 0xb2, 0x00, 0x2e, 0xf6, 0xd1, - 0x06, 0x48, 0x02, 0xf0, 0x89, 0xf9, 0x00, 0x20, 0x02, 0xe0, 0x08, 0x48, - 0x00, 0xe0, 0x08, 0x48, 0x04, 0xbc, 0x90, 0x46, 0xf0, 0xbd, 0xc0, 0x46, - 0xaa, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0xb3, 0x03, 0x00, 0x00, - 0x9a, 0x03, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x02, 0x00, 0x01, 0x06, - 0x10, 0x00, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x4f, 0x46, - 0x80, 0xb4, 0x82, 0xb0, 0x05, 0x00, 0x01, 0x91, 0xe8, 0x23, 0x9b, 0x00, - 0xc7, 0x58, 0x04, 0x33, 0xc6, 0x58, 0x04, 0x33, 0xc4, 0x5a, 0x33, 0x4b, - 0xc3, 0x5a, 0x5b, 0x07, 0x5c, 0xd5, 0xe5, 0x23, 0x9b, 0x00, 0xc2, 0x58, - 0x00, 0x2a, 0x07, 0xd0, 0x2f, 0x4b, 0xc3, 0x5a, 0x59, 0x00, 0xcb, 0x18, - 0x99, 0x00, 0x91, 0x46, 0x89, 0x44, 0x01, 0xe0, 0x00, 0x23, 0x99, 0x46, - 0x2b, 0x48, 0x02, 0xf0, 0xad, 0xf9, 0x00, 0x2e, 0x05, 0xd1, 0x09, 0xe0, - 0x32, 0x78, 0x3a, 0x70, 0x1c, 0x00, 0x01, 0x36, 0x01, 0x37, 0x63, 0x1e, - 0x9b, 0xb2, 0x00, 0x2c, 0xf6, 0xd1, 0x0a, 0xe0, 0x4b, 0x46, 0x00, 0x2b, - 0x07, 0xd0, 0x1b, 0x68, 0x00, 0x2b, 0x04, 0xd1, 0x20, 0x48, 0x02, 0xf0, - 0x37, 0xf9, 0x20, 0x48, 0x33, 0xe0, 0x01, 0x22, 0x1f, 0x4b, 0xea, 0x54, - 0x4b, 0x46, 0x00, 0x2b, 0x1a, 0xd0, 0x1b, 0x68, 0x00, 0x2b, 0x17, 0xd0, - 0xe7, 0x22, 0x92, 0x00, 0xa8, 0x18, 0x98, 0x47, 0x04, 0x1e, 0x04, 0xd0, - 0x16, 0x48, 0x02, 0xf0, 0x23, 0xf9, 0x20, 0x00, 0x1f, 0xe0, 0xea, 0x23, - 0x9b, 0x00, 0xeb, 0x5a, 0x00, 0x2b, 0x02, 0xd0, 0x01, 0x9a, 0x93, 0x42, - 0x04, 0xd9, 0x10, 0x48, 0x02, 0xf0, 0x16, 0xf9, 0x0f, 0x48, 0x12, 0xe0, - 0x0d, 0x48, 0x02, 0xf0, 0x11, 0xf9, 0xea, 0x23, 0x9b, 0x00, 0xeb, 0x5a, - 0xef, 0x22, 0x92, 0x00, 0xa9, 0x58, 0x8c, 0x46, 0x63, 0x44, 0xab, 0x50, - 0x00, 0x22, 0xed, 0x23, 0x9b, 0x00, 0xea, 0x54, 0x00, 0x20, 0x00, 0xe0, - 0x07, 0x48, 0x02, 0xb0, 0x04, 0xbc, 0x91, 0x46, 0xf0, 0xbd, 0xc0, 0x46, - 0xaa, 0x03, 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, - 0x47, 0x00, 0x04, 0x06, 0xb3, 0x03, 0x00, 0x00, 0x01, 0x00, 0x01, 0x06, - 0x70, 0xb5, 0x05, 0x1e, 0x35, 0xd0, 0x46, 0x68, 0x72, 0xb6, 0x07, 0xf0, - 0x49, 0xff, 0x33, 0x00, 0x08, 0x3b, 0x00, 0x22, 0xd5, 0x21, 0x5a, 0x54, - 0x01, 0x39, 0x5a, 0x54, 0xd6, 0x32, 0x9b, 0x5a, 0x9b, 0xb2, 0x00, 0x2b, - 0x22, 0xd0, 0x72, 0x69, 0x34, 0x8b, 0x17, 0xe0, 0x13, 0x7c, 0x00, 0x2b, - 0x11, 0xd0, 0x00, 0x23, 0x13, 0x74, 0xd6, 0x20, 0x33, 0x00, 0x08, 0x3b, - 0x19, 0x5a, 0x01, 0x39, 0x89, 0xb2, 0x19, 0x52, 0x51, 0x7c, 0xc9, 0xb2, - 0x02, 0x38, 0x19, 0x54, 0x00, 0x21, 0x28, 0x00, 0x06, 0xf0, 0x0e, 0xfb, - 0x04, 0xe0, 0x18, 0x32, 0x01, 0x3c, 0xa4, 0xb2, 0x00, 0x2c, 0xe5, 0xd1, - 0x00, 0x2c, 0x03, 0xd1, 0x08, 0x3e, 0x00, 0x22, 0xd6, 0x23, 0xf2, 0x52, - 0x07, 0xf0, 0x00, 0xff, 0x62, 0xb6, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb5, 0x87, 0xb0, - 0x04, 0x1e, 0x4b, 0xd0, 0x45, 0x68, 0x72, 0xb6, 0x07, 0xf0, 0x08, 0xff, - 0x6a, 0x46, 0x00, 0x21, 0x20, 0x00, 0x06, 0xf0, 0xc3, 0xfa, 0x6b, 0x46, - 0x1c, 0x89, 0x64, 0x05, 0x64, 0x0d, 0x1b, 0x79, 0xdb, 0x06, 0xdb, 0x0f, - 0xdb, 0x02, 0x1c, 0x43, 0x2a, 0x00, 0x08, 0x3a, 0xd0, 0x23, 0xd3, 0x58, - 0x00, 0x2b, 0x0d, 0xd0, 0x6b, 0x46, 0x1b, 0x78, 0x99, 0xb2, 0x2a, 0x8a, - 0x91, 0x42, 0x17, 0xd2, 0x5a, 0x00, 0xd3, 0x18, 0x9a, 0x00, 0xeb, 0x68, - 0x9c, 0x46, 0x62, 0x44, 0x01, 0x23, 0x13, 0xe0, 0x2b, 0x00, 0xea, 0x68, - 0x08, 0x3b, 0x1b, 0x7e, 0x07, 0xe0, 0x11, 0x88, 0x61, 0x40, 0x50, 0x88, - 0x01, 0x42, 0x08, 0xd0, 0x0c, 0x32, 0x01, 0x3b, 0xdb, 0xb2, 0x00, 0x2b, - 0xf5, 0xd1, 0x03, 0xe0, 0x00, 0x23, 0x00, 0x22, 0x00, 0xe0, 0x01, 0x23, - 0x00, 0x2b, 0x07, 0xd0, 0x00, 0x2a, 0x05, 0xd0, 0x93, 0x68, 0x00, 0x2b, - 0x02, 0xd0, 0x50, 0x68, 0x69, 0x46, 0x98, 0x47, 0x28, 0x00, 0x08, 0x30, - 0x00, 0x21, 0x01, 0xf0, 0x03, 0xfd, 0x07, 0xf0, 0xa9, 0xfe, 0x62, 0xb6, - 0x07, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, 0x40, 0x68, 0x06, 0xf0, - 0x23, 0xfc, 0xd0, 0x23, 0xe2, 0x58, 0x23, 0x00, 0x28, 0x33, 0x00, 0x21, - 0x60, 0x68, 0x03, 0xf0, 0xdb, 0xfd, 0x21, 0x00, 0x08, 0x31, 0x60, 0x68, - 0x06, 0xf0, 0x56, 0xfc, 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0a, 0x4b, 0x99, 0x42, 0x0d, 0xd0, 0xe5, 0x23, - 0x9b, 0x00, 0xc0, 0x58, 0x00, 0x28, 0x0a, 0xd0, 0x4b, 0x00, 0x59, 0x18, - 0x8b, 0x00, 0xc3, 0x18, 0x98, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x18, - 0x02, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x70, 0x47, 0xc0, 0x46, - 0xff, 0xff, 0x00, 0x00, 0x10, 0xb5, 0xe3, 0x23, 0x9b, 0x00, 0xc4, 0x58, - 0x48, 0x00, 0x40, 0x18, 0x83, 0x00, 0xe3, 0x18, 0x10, 0x48, 0x81, 0x42, - 0x19, 0xd0, 0x99, 0x78, 0x00, 0x29, 0x01, 0xd1, 0x98, 0x68, 0x17, 0xe0, - 0x91, 0x42, 0x14, 0xd3, 0x99, 0x88, 0x00, 0x29, 0x0b, 0xd0, 0x00, 0x2a, - 0x01, 0xd1, 0x98, 0x1c, 0x0e, 0xe0, 0x98, 0x68, 0x00, 0x28, 0x0b, 0xd0, - 0x01, 0x3a, 0xdb, 0x88, 0x5a, 0x43, 0x80, 0x18, 0x06, 0xe0, 0x9b, 0x68, - 0xd2, 0x00, 0x98, 0x58, 0x02, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x00, 0x20, - 0x10, 0xbd, 0xc0, 0x46, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xe3, 0x23, 0x9b, 0x00, 0xc4, 0x58, - 0x48, 0x00, 0x40, 0x18, 0x83, 0x00, 0xe3, 0x18, 0x13, 0x48, 0x81, 0x42, - 0x22, 0xd0, 0x99, 0x78, 0x00, 0x29, 0x01, 0xd1, 0x98, 0x88, 0x1e, 0xe0, - 0x98, 0x88, 0x00, 0x28, 0x15, 0xd0, 0x19, 0x88, 0x0e, 0x4b, 0x99, 0x42, - 0x06, 0xd1, 0x00, 0x2a, 0x06, 0xd1, 0x08, 0x23, 0x18, 0x43, 0x80, 0xb2, - 0x01, 0x23, 0x02, 0xe0, 0x00, 0x23, 0x00, 0xe0, 0x00, 0x23, 0x1a, 0x43, - 0x0b, 0xd1, 0x18, 0x23, 0x98, 0x43, 0x04, 0x23, 0x18, 0x43, 0x80, 0xb2, - 0x05, 0xe0, 0x9b, 0x68, 0xd2, 0x00, 0x9a, 0x18, 0x90, 0x88, 0x00, 0xe0, - 0x00, 0x20, 0x10, 0xbd, 0xff, 0xff, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xe3, 0x23, - 0x9b, 0x00, 0xc4, 0x58, 0x48, 0x00, 0x40, 0x18, 0x83, 0x00, 0xe3, 0x18, - 0x13, 0x48, 0x81, 0x42, 0x19, 0xd0, 0x99, 0x78, 0x00, 0x29, 0x04, 0xd1, - 0x9a, 0x68, 0x00, 0x2a, 0x15, 0xd0, 0xd8, 0x88, 0x1a, 0xe0, 0x99, 0x88, - 0x00, 0x29, 0x06, 0xd0, 0x00, 0x2a, 0x10, 0xd0, 0x9a, 0x68, 0x00, 0x2a, - 0x0f, 0xd0, 0xd8, 0x88, 0x10, 0xe0, 0x9b, 0x68, 0xd2, 0x00, 0x9a, 0x18, - 0x13, 0x68, 0x00, 0x2b, 0x09, 0xd0, 0xd0, 0x88, 0x08, 0xe0, 0x00, 0x20, - 0x06, 0xe0, 0x05, 0x48, 0x04, 0xe0, 0x01, 0x20, 0x02, 0xe0, 0x03, 0x48, - 0x00, 0xe0, 0x02, 0x48, 0x10, 0xbd, 0xc0, 0x46, 0xff, 0xff, 0x00, 0x00, - 0x79, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x07, 0x00, 0xe4, 0x23, 0x9b, 0x00, 0xc5, 0x5a, 0x01, 0x3d, - 0xad, 0xb2, 0x00, 0x26, 0x19, 0xe0, 0x73, 0x19, 0xda, 0x0f, 0xd3, 0x18, - 0x5b, 0x10, 0x9a, 0xb2, 0xe3, 0x20, 0x80, 0x00, 0x38, 0x58, 0x1b, 0x04, - 0x1b, 0x0c, 0x5c, 0x00, 0xe3, 0x18, 0x9c, 0x00, 0x03, 0x5b, 0x8b, 0x42, - 0x17, 0xd0, 0x04, 0xd9, 0x00, 0x2a, 0x05, 0xd0, 0x01, 0x3a, 0x95, 0xb2, - 0x03, 0xe0, 0x01, 0x32, 0x96, 0xb2, 0x00, 0xe0, 0x15, 0x00, 0xae, 0x42, - 0xe3, 0xd3, 0x0c, 0xd1, 0xe3, 0x23, 0x9b, 0x00, 0xf8, 0x58, 0x73, 0x00, - 0x9b, 0x19, 0x9a, 0x00, 0x83, 0x5a, 0x99, 0x42, 0x05, 0xd0, 0x04, 0x48, - 0x04, 0xe0, 0x10, 0x00, 0x02, 0xe0, 0x02, 0x48, 0x00, 0xe0, 0x30, 0x00, - 0xf0, 0xbd, 0xc0, 0x46, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x4f, 0x46, - 0x46, 0x46, 0xc0, 0xb4, 0x04, 0x00, 0x16, 0x00, 0xec, 0x23, 0x9b, 0x00, - 0xc1, 0x52, 0x34, 0x4b, 0xe2, 0x54, 0xff, 0xf7, 0xb3, 0xff, 0x05, 0x00, - 0x32, 0x4b, 0xe0, 0x52, 0x32, 0x4b, 0x98, 0x42, 0x54, 0xd0, 0xe3, 0x23, - 0x9b, 0x00, 0xe2, 0x58, 0x43, 0x00, 0x1b, 0x18, 0x9f, 0x00, 0xd3, 0x19, - 0x9a, 0x78, 0x96, 0x42, 0x02, 0xd9, 0x9b, 0x68, 0x00, 0x2b, 0x49, 0xd1, - 0x32, 0x00, 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, 0xfb, 0xfe, 0x80, 0x46, - 0xe9, 0x23, 0x9b, 0x00, 0xe0, 0x50, 0x00, 0x22, 0x08, 0x3b, 0xe2, 0x50, - 0x08, 0x3b, 0xe3, 0x58, 0x00, 0x2b, 0x04, 0xd0, 0xdf, 0x19, 0x7a, 0x68, - 0xe7, 0x23, 0x9b, 0x00, 0xe2, 0x50, 0x23, 0x00, 0x10, 0x33, 0xe8, 0x22, - 0x92, 0x00, 0xa3, 0x50, 0x32, 0x00, 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, - 0x49, 0xff, 0x07, 0x00, 0x81, 0x46, 0xea, 0x23, 0x9b, 0x00, 0xe0, 0x52, - 0x32, 0x00, 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, 0x07, 0xff, 0x17, 0x4b, - 0xe0, 0x52, 0x32, 0x00, 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, 0xb8, 0xfe, - 0xeb, 0x23, 0x9b, 0x00, 0xe0, 0x50, 0x01, 0x23, 0xed, 0x22, 0x92, 0x00, - 0xa3, 0x54, 0x11, 0x4a, 0xa3, 0x54, 0x43, 0x46, 0x00, 0x2b, 0x00, 0xd1, - 0x00, 0x27, 0xee, 0x23, 0x9b, 0x00, 0xe7, 0x50, 0x00, 0x22, 0x04, 0x33, - 0xe2, 0x50, 0x0c, 0x4b, 0x99, 0x45, 0x05, 0xd9, 0x0b, 0x48, 0x04, 0xe0, - 0x0b, 0x48, 0x02, 0xe0, 0x0b, 0x48, 0x00, 0xe0, 0x00, 0x20, 0x0c, 0xbc, - 0x90, 0x46, 0x99, 0x46, 0xf8, 0xbd, 0xc0, 0x46, 0xb2, 0x03, 0x00, 0x00, - 0x9a, 0x03, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, - 0xb5, 0x03, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0x47, 0x00, 0x04, 0x06, - 0x00, 0x00, 0x02, 0x06, 0x11, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x47, 0x46, 0x80, 0xb4, 0x04, 0x00, - 0x90, 0x46, 0x1f, 0x00, 0x06, 0xab, 0x40, 0xcb, 0x1d, 0x78, 0xff, 0xf7, - 0x2d, 0xff, 0x15, 0x4b, 0x98, 0x42, 0x23, 0xd0, 0xe5, 0x23, 0x9b, 0x00, - 0xe2, 0x58, 0x43, 0x00, 0x18, 0x18, 0x83, 0x00, 0xd2, 0x18, 0xe3, 0x21, - 0x89, 0x00, 0x61, 0x58, 0xcb, 0x18, 0x98, 0x78, 0x43, 0x46, 0x13, 0x60, - 0x57, 0x60, 0x00, 0x2e, 0x10, 0xd0, 0x00, 0x2d, 0x0e, 0xd0, 0xa8, 0x42, - 0x0c, 0xd1, 0x96, 0x60, 0x00, 0x23, 0x05, 0xe0, 0x91, 0x68, 0xc9, 0x18, - 0x00, 0x24, 0x0c, 0x70, 0x01, 0x33, 0x9b, 0xb2, 0x81, 0xb2, 0x8b, 0x42, - 0xf6, 0xd9, 0x01, 0xe0, 0x00, 0x23, 0x93, 0x60, 0x04, 0xbc, 0x90, 0x46, - 0xf0, 0xbd, 0xc0, 0x46, 0xff, 0xff, 0x00, 0x00, 0x00, 0x28, 0x04, 0xd0, - 0xf9, 0x23, 0x9b, 0x00, 0xc1, 0x50, 0x04, 0x3b, 0xc2, 0x50, 0x70, 0x47, - 0xf0, 0xb5, 0x43, 0x68, 0x9d, 0x6a, 0xac, 0x69, 0xeb, 0x68, 0x1b, 0x01, - 0x80, 0x22, 0x52, 0x00, 0x13, 0x40, 0x1c, 0x43, 0x2b, 0x69, 0x5b, 0x01, - 0x80, 0x21, 0x89, 0x00, 0x0b, 0x40, 0x1a, 0x00, 0x23, 0x00, 0x13, 0x43, - 0x1a, 0x0e, 0xd6, 0xb2, 0x1f, 0x0c, 0x29, 0x39, 0xff, 0x39, 0x41, 0x58, - 0x8b, 0x42, 0x2e, 0xd0, 0x41, 0x8c, 0xd8, 0x24, 0x03, 0x51, 0x5b, 0x07, - 0x03, 0xd5, 0x04, 0x23, 0x0b, 0x43, 0x9b, 0xb2, 0x1c, 0xe0, 0x13, 0x4b, - 0x0b, 0x40, 0x52, 0xb2, 0x00, 0x2a, 0x03, 0xda, 0xc0, 0x22, 0x92, 0x00, - 0x13, 0x43, 0x04, 0xe0, 0x5f, 0x2e, 0x02, 0xd9, 0x80, 0x22, 0x52, 0x00, - 0x13, 0x43, 0x3a, 0x06, 0x03, 0xd5, 0x03, 0x22, 0x13, 0x43, 0x9b, 0xb2, - 0x04, 0xe0, 0x5f, 0x2e, 0x02, 0xd9, 0x01, 0x22, 0x13, 0x43, 0x9b, 0xb2, - 0x9a, 0x07, 0x01, 0xd4, 0x08, 0x22, 0x93, 0x43, 0xe9, 0x68, 0x2a, 0x69, - 0x0a, 0x43, 0xd2, 0x06, 0x02, 0xd5, 0x80, 0x22, 0x12, 0x01, 0x13, 0x43, - 0x43, 0x84, 0xf0, 0xbd, 0xf8, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0xac, 0x24, 0x78, 0x05, 0xad, - 0x2d, 0x78, 0x00, 0x28, 0x1f, 0xd0, 0x06, 0x8c, 0x8e, 0x42, 0x1e, 0xd9, - 0xc6, 0x69, 0x48, 0x00, 0x41, 0x18, 0xc8, 0x00, 0x30, 0x18, 0x52, 0x05, - 0x51, 0x0d, 0x82, 0x88, 0xd2, 0x0a, 0xd2, 0x02, 0x0a, 0x43, 0x82, 0x80, - 0x0f, 0x22, 0x14, 0x40, 0x01, 0x78, 0x91, 0x43, 0x0e, 0x3a, 0x13, 0x40, - 0x1a, 0x01, 0x0b, 0x00, 0x23, 0x43, 0x10, 0x21, 0x8b, 0x43, 0x13, 0x43, - 0x03, 0x70, 0x00, 0x23, 0x03, 0x74, 0x45, 0x74, 0x02, 0xe0, 0x00, 0x20, - 0x00, 0xe0, 0x00, 0x20, 0x70, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0xac, 0x25, 0x78, 0x00, 0x28, - 0x50, 0xd0, 0x07, 0x9c, 0x00, 0x2c, 0x50, 0xd0, 0x08, 0x9c, 0x00, 0x2c, - 0x50, 0xd0, 0x04, 0x8b, 0x8c, 0x42, 0x50, 0xd9, 0x4e, 0x00, 0x76, 0x18, - 0xb4, 0x00, 0x46, 0x69, 0xb4, 0x46, 0x64, 0x44, 0x07, 0x9e, 0x66, 0x60, - 0x08, 0x9e, 0xa6, 0x60, 0x56, 0x05, 0x76, 0x0d, 0x26, 0x80, 0x00, 0x2d, - 0x03, 0xd0, 0x80, 0x27, 0x3f, 0x01, 0x3e, 0x43, 0x26, 0x80, 0x5b, 0x05, - 0x5b, 0x0d, 0x80, 0x26, 0x36, 0x01, 0x33, 0x43, 0x63, 0x80, 0xd0, 0x23, - 0xc3, 0x58, 0x00, 0x2b, 0x36, 0xd0, 0x03, 0x23, 0x0b, 0x40, 0x01, 0x2b, - 0x07, 0xd8, 0x8b, 0x08, 0x5c, 0x00, 0xe3, 0x18, 0x9c, 0x00, 0x28, 0x34, - 0x04, 0x19, 0x04, 0x34, 0x05, 0xe0, 0x8b, 0x08, 0x5c, 0x00, 0xe3, 0x18, - 0x9c, 0x00, 0x30, 0x34, 0x04, 0x19, 0x01, 0x23, 0x19, 0x40, 0x49, 0x00, - 0x53, 0x01, 0x0a, 0x5b, 0x1f, 0x26, 0x32, 0x40, 0x1a, 0x43, 0x0a, 0x53, - 0x01, 0x23, 0x1d, 0x40, 0x2d, 0x01, 0xd2, 0xb2, 0x0f, 0x33, 0x9a, 0x43, - 0x2a, 0x43, 0x0a, 0x55, 0x14, 0x33, 0xc3, 0x5c, 0x00, 0x2b, 0x11, 0xd0, - 0xff, 0xf7, 0x54, 0xfd, 0x00, 0x20, 0x0e, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x0b, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x08, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x05, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x02, 0xe0, 0x00, 0x20, 0x00, 0xe0, - 0x00, 0x20, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x5f, 0x46, - 0x56, 0x46, 0x4d, 0x46, 0x44, 0x46, 0xf0, 0xb4, 0x87, 0xb0, 0x04, 0x00, - 0x0d, 0x00, 0x04, 0x92, 0x99, 0x46, 0x10, 0x9b, 0x12, 0xaa, 0x17, 0x88, - 0x14, 0xaa, 0x12, 0x78, 0x93, 0x46, 0x15, 0xaa, 0x12, 0x88, 0x92, 0x46, - 0x17, 0xaa, 0x12, 0x88, 0x90, 0x46, 0x19, 0xaa, 0x12, 0x88, 0x05, 0x92, - 0x00, 0x28, 0x00, 0xd1, 0x96, 0xe0, 0x16, 0x9a, 0x00, 0x2a, 0x00, 0xd1, - 0x95, 0xe0, 0x18, 0x9a, 0x00, 0x2a, 0x00, 0xd1, 0x94, 0xe0, 0x00, 0x2b, - 0x20, 0xd1, 0x01, 0x22, 0x4e, 0x4b, 0xc2, 0x54, 0x03, 0x33, 0x11, 0x9a, - 0xc2, 0x50, 0x04, 0x33, 0xc7, 0x52, 0x04, 0x33, 0x13, 0x9a, 0xc2, 0x50, - 0x00, 0x20, 0x10, 0xe0, 0xe5, 0x21, 0x89, 0x00, 0x42, 0x00, 0x12, 0x18, - 0x93, 0x00, 0x62, 0x58, 0xd6, 0x18, 0x00, 0x22, 0x32, 0x60, 0x66, 0x58, - 0xf6, 0x18, 0x72, 0x60, 0x61, 0x58, 0xcb, 0x18, 0x9a, 0x60, 0x01, 0x30, - 0x80, 0xb2, 0xb8, 0x42, 0xec, 0xd3, 0x0b, 0xe0, 0x00, 0x21, 0x3e, 0x4a, - 0x81, 0x54, 0x03, 0x32, 0x99, 0x58, 0x81, 0x50, 0x04, 0x32, 0x99, 0x5a, - 0x81, 0x52, 0x04, 0x32, 0x9b, 0x58, 0x83, 0x50, 0xf0, 0x23, 0x9b, 0x00, - 0x5a, 0x46, 0xe2, 0x54, 0x28, 0x33, 0x52, 0x46, 0x53, 0x43, 0xf1, 0x22, - 0x92, 0x00, 0xa3, 0x50, 0x00, 0x22, 0x34, 0x4b, 0xe2, 0x54, 0x00, 0x23, - 0x07, 0xe0, 0x1a, 0x00, 0xf4, 0x32, 0x92, 0x00, 0xa2, 0x18, 0x00, 0x21, - 0x51, 0x60, 0x01, 0x33, 0xdb, 0xb2, 0x01, 0x2b, 0xf5, 0xd9, 0x00, 0x23, - 0xf7, 0x22, 0x92, 0x00, 0xa3, 0x54, 0x2c, 0x4a, 0xa3, 0x54, 0x03, 0x32, - 0xa3, 0x50, 0x04, 0x32, 0xa3, 0x50, 0x90, 0x23, 0x5b, 0x01, 0x99, 0x45, - 0x0a, 0xd1, 0xf0, 0x23, 0x9b, 0x00, 0xe3, 0x18, 0x00, 0x22, 0x01, 0x92, - 0x00, 0x92, 0x25, 0x4a, 0x49, 0x46, 0x20, 0x00, 0xff, 0xf7, 0x52, 0xfe, - 0x00, 0x2d, 0x03, 0xdb, 0x04, 0x9b, 0x00, 0x2b, 0x07, 0xda, 0x03, 0xe0, - 0x00, 0x23, 0x04, 0x93, 0x00, 0x25, 0x02, 0xe0, 0x00, 0x23, 0x04, 0x93, - 0x00, 0x25, 0xaa, 0xb2, 0x1c, 0x4b, 0x02, 0x93, 0x01, 0x94, 0x00, 0x26, - 0x00, 0x96, 0x1b, 0x4b, 0x41, 0x46, 0x16, 0x98, 0xff, 0xf7, 0xfa, 0xfe, - 0x05, 0x00, 0xfa, 0x23, 0x9b, 0x00, 0x18, 0x9a, 0xe2, 0x50, 0x6b, 0x46, - 0x1a, 0x8a, 0x01, 0x96, 0x08, 0x23, 0x00, 0x93, 0x00, 0x23, 0x05, 0x99, - 0x18, 0x98, 0xff, 0xf7, 0xbb, 0xfe, 0xfb, 0x23, 0x9b, 0x00, 0xe0, 0x50, - 0x00, 0x28, 0x0a, 0xd0, 0x28, 0x00, 0x0a, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x07, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x04, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x01, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x07, 0xb0, 0x3c, 0xbc, 0x90, 0x46, - 0x99, 0x46, 0xa2, 0x46, 0xab, 0x46, 0xf0, 0xbd, 0x89, 0x03, 0x00, 0x00, - 0xc1, 0x03, 0x00, 0x00, 0xdd, 0x03, 0x00, 0x00, 0x41, 0xac, 0x00, 0x08, - 0xd1, 0xac, 0x00, 0x08, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x4f, 0x46, - 0x46, 0x46, 0xc0, 0xb4, 0x04, 0x00, 0x08, 0x00, 0x19, 0x00, 0x08, 0xab, - 0x20, 0xcb, 0xa9, 0x46, 0x1f, 0x88, 0x0a, 0xab, 0x1b, 0x88, 0x9c, 0x46, - 0x00, 0x2c, 0x74, 0xd0, 0x00, 0x2a, 0x75, 0xd0, 0x00, 0x2d, 0x76, 0xd0, - 0x20, 0x60, 0x03, 0x68, 0x63, 0x60, 0x3d, 0x48, 0x98, 0x61, 0x63, 0x68, - 0x3c, 0x48, 0xd8, 0x61, 0x63, 0x68, 0x3c, 0x48, 0x18, 0x62, 0x23, 0x00, - 0x10, 0x33, 0x23, 0x61, 0x62, 0x61, 0x21, 0x83, 0xe5, 0x61, 0x27, 0x84, - 0x00, 0x23, 0x63, 0x84, 0x24, 0x33, 0x00, 0x20, 0xe0, 0x54, 0x38, 0x29, - 0x02, 0xd8, 0x8b, 0x08, 0x01, 0x33, 0x00, 0xe0, 0x00, 0x23, 0xd0, 0x20, - 0x23, 0x50, 0x00, 0x23, 0x04, 0x30, 0x23, 0x54, 0x01, 0x25, 0x01, 0x30, - 0x25, 0x54, 0x01, 0x30, 0x23, 0x52, 0x02, 0x30, 0x23, 0x50, 0x00, 0x25, - 0x0c, 0xe0, 0x6b, 0x00, 0x5b, 0x19, 0x98, 0x00, 0x10, 0x18, 0x00, 0x23, - 0x03, 0x80, 0x01, 0x26, 0x76, 0x42, 0x46, 0x80, 0x43, 0x60, 0x83, 0x60, - 0x01, 0x35, 0xad, 0xb2, 0x8d, 0x42, 0xf0, 0xd3, 0x00, 0x23, 0x07, 0xe0, - 0x58, 0x00, 0xc0, 0x18, 0xc2, 0x00, 0x4a, 0x44, 0x00, 0x20, 0x10, 0x74, - 0x01, 0x33, 0x9b, 0xb2, 0xbb, 0x42, 0xf5, 0xd3, 0x64, 0x23, 0xa3, 0x60, - 0x61, 0x46, 0x1d, 0x48, 0xfe, 0xf7, 0xf6, 0xfe, 0x01, 0x38, 0xe0, 0x23, - 0x5b, 0x03, 0x18, 0x43, 0xe0, 0x60, 0x00, 0x22, 0x17, 0xe0, 0x55, 0x00, - 0xab, 0x18, 0x99, 0x00, 0x61, 0x18, 0x08, 0x00, 0x28, 0x30, 0x0a, 0x85, - 0x86, 0x78, 0x01, 0x23, 0x33, 0x43, 0xdb, 0xb2, 0x02, 0x26, 0xb3, 0x43, - 0x02, 0x36, 0xb3, 0x43, 0x83, 0x70, 0x00, 0x20, 0xc8, 0x62, 0xab, 0x18, - 0x99, 0x00, 0x61, 0x18, 0x08, 0x63, 0x01, 0x32, 0x92, 0xb2, 0xd0, 0x23, - 0xe3, 0x58, 0x9a, 0x42, 0xe3, 0xd3, 0x00, 0x20, 0x07, 0xe0, 0x01, 0x20, - 0x40, 0x42, 0x04, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x01, 0xe0, 0x01, 0x20, - 0x40, 0x42, 0x0c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xf8, 0xbd, 0xc0, 0x46, - 0x71, 0xb0, 0x00, 0x08, 0xf1, 0xaf, 0x00, 0x08, 0xf1, 0xab, 0x00, 0x08, - 0xb8, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, 0xd0, 0x23, 0xc2, 0x58, - 0x03, 0x00, 0x28, 0x33, 0x00, 0x21, 0x40, 0x68, 0x03, 0xf0, 0xa6, 0xf9, - 0x21, 0x00, 0x08, 0x31, 0x60, 0x68, 0x06, 0xf0, 0x21, 0xf8, 0x01, 0x22, - 0x24, 0x23, 0xe2, 0x54, 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x68, 0x05, 0xf0, 0xd4, 0xff, - 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, - 0x72, 0xb6, 0x07, 0xf0, 0xc3, 0xfa, 0xd4, 0x23, 0xe3, 0x5c, 0x00, 0x2b, - 0x04, 0xd0, 0x00, 0x22, 0xd4, 0x23, 0xe2, 0x54, 0x01, 0x25, 0x00, 0xe0, - 0x00, 0x25, 0xd6, 0x23, 0xe3, 0x5a, 0x9b, 0xb2, 0x00, 0x2b, 0x15, 0xd0, - 0xe2, 0x69, 0x23, 0x8c, 0x10, 0xe0, 0x11, 0x7c, 0x00, 0x29, 0x0a, 0xd0, - 0x51, 0x7c, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x21, 0x11, 0x74, 0xd6, 0x20, - 0x21, 0x5a, 0x01, 0x39, 0x89, 0xb2, 0x21, 0x52, 0x02, 0x25, 0x18, 0x32, - 0x01, 0x3b, 0x9b, 0xb2, 0x00, 0x2b, 0xec, 0xd1, 0x07, 0xf0, 0x84, 0xfa, - 0x09, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, - 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x06, 0x48, 0x07, 0xf0, 0x98, 0xf9, - 0x62, 0xb6, 0x00, 0x2d, 0x03, 0xd0, 0x62, 0x8c, 0x80, 0x23, 0x13, 0x43, - 0x63, 0x84, 0x70, 0xbd, 0xe8, 0x19, 0x00, 0x20, 0x0c, 0x36, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x00, - 0x0e, 0x00, 0x0b, 0x7c, 0x00, 0x2b, 0x0a, 0xd0, 0xd5, 0x23, 0xc3, 0x5c, - 0x00, 0x2b, 0x08, 0xd1, 0x42, 0x8c, 0x08, 0x23, 0x13, 0x43, 0x43, 0x84, - 0x09, 0x24, 0x64, 0x42, 0x03, 0xe0, 0x00, 0x24, 0x01, 0xe0, 0x09, 0x24, - 0x64, 0x42, 0x72, 0xb6, 0x07, 0xf0, 0x68, 0xfa, 0xd6, 0x23, 0xeb, 0x5a, - 0x9b, 0xb2, 0x00, 0x2b, 0x0b, 0xd1, 0x32, 0x00, 0x00, 0x21, 0x68, 0x68, - 0x05, 0xf0, 0xde, 0xfd, 0x00, 0x28, 0x04, 0xd1, 0x73, 0x7c, 0xdb, 0xb2, - 0xd4, 0x22, 0xab, 0x54, 0x06, 0xe0, 0x01, 0x23, 0x33, 0x74, 0xd6, 0x22, - 0xab, 0x5a, 0x01, 0x33, 0x9b, 0xb2, 0xab, 0x52, 0x07, 0xf0, 0x36, 0xfa, - 0x07, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, - 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, 0x07, 0xf0, 0x4a, 0xf9, - 0x62, 0xb6, 0x20, 0x00, 0x70, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0x0c, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x82, 0xb0, - 0x04, 0x00, 0x01, 0x91, 0xfb, 0x23, 0x9b, 0x00, 0x80, 0x22, 0xc1, 0x58, - 0x0a, 0x72, 0xec, 0x22, 0x92, 0x00, 0x81, 0x5a, 0xc0, 0x58, 0x41, 0x72, - 0xa2, 0x5a, 0x12, 0x0a, 0xe1, 0x58, 0x8a, 0x72, 0x11, 0x4a, 0xa2, 0x5c, - 0xe1, 0x58, 0xca, 0x72, 0xe0, 0x58, 0x0c, 0x30, 0x04, 0x22, 0x01, 0xa9, - 0x07, 0xf0, 0xa2, 0xfc, 0x00, 0x22, 0x0d, 0x4b, 0xe2, 0x54, 0x03, 0xe0, - 0x00, 0x21, 0x20, 0x00, 0xff, 0xf7, 0x2c, 0xf8, 0x0a, 0x4b, 0xe3, 0x5c, - 0xf4, 0x33, 0x9b, 0x00, 0xe3, 0x18, 0x5b, 0x68, 0x00, 0x2b, 0xf3, 0xd1, - 0xfb, 0x23, 0x9b, 0x00, 0xe1, 0x58, 0x04, 0x3b, 0xe0, 0x58, 0xff, 0xf7, - 0x85, 0xff, 0x02, 0xb0, 0x10, 0xbd, 0xc0, 0x46, 0xb2, 0x03, 0x00, 0x00, - 0xc1, 0x03, 0x00, 0x00, 0xdd, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x4f, 0x46, 0x46, 0x46, 0xc0, 0xb4, - 0x85, 0xb0, 0x04, 0x00, 0x01, 0x92, 0x1f, 0x00, 0xc9, 0x4b, 0xc5, 0x5c, - 0x2b, 0x00, 0xf4, 0x33, 0x9b, 0x00, 0xc3, 0x18, 0x5e, 0x68, 0x33, 0x00, - 0x5a, 0x1e, 0x93, 0x41, 0xdb, 0xb2, 0x98, 0x46, 0xc4, 0x4b, 0xc3, 0x5c, - 0x00, 0x2b, 0x03, 0xd1, 0x00, 0x2e, 0x01, 0xd1, 0x00, 0xf0, 0x5d, 0xfe, - 0x00, 0x29, 0x09, 0xd1, 0x00, 0x22, 0xbf, 0x4b, 0xe2, 0x54, 0x39, 0x00, - 0x20, 0x00, 0xfe, 0xf7, 0xeb, 0xff, 0x00, 0x20, 0x00, 0xf0, 0x56, 0xfe, - 0xed, 0x00, 0x65, 0x19, 0xfb, 0x22, 0x92, 0x00, 0xa0, 0x58, 0x02, 0x7c, - 0x00, 0x2a, 0x79, 0xd1, 0x00, 0x2e, 0x01, 0xd1, 0xb6, 0x2b, 0x77, 0xd1, - 0xb6, 0x2b, 0x05, 0xd0, 0x00, 0x22, 0xf2, 0x23, 0x9b, 0x00, 0xe2, 0x50, - 0x00, 0x23, 0x01, 0x93, 0x08, 0x30, 0x08, 0x22, 0x00, 0x21, 0x07, 0xf0, - 0xc7, 0xfc, 0x00, 0x2e, 0x0d, 0xd0, 0x2b, 0x78, 0x80, 0x2b, 0x0a, 0xd1, - 0x00, 0x22, 0xab, 0x4b, 0xe2, 0x54, 0x39, 0x00, 0x20, 0x00, 0xfe, 0xf7, - 0xc3, 0xff, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0x2d, 0xfe, 0xa6, 0x4b, - 0xe3, 0x5c, 0x00, 0x2b, 0x5d, 0xd1, 0x2b, 0x78, 0x5b, 0x09, 0x99, 0x46, - 0x01, 0x3b, 0xdb, 0xb2, 0x01, 0x2b, 0x0c, 0xd9, 0x4b, 0x46, 0x06, 0x2b, - 0x09, 0xd0, 0x05, 0x2b, 0x07, 0xd0, 0x9f, 0x49, 0x20, 0x00, 0xff, 0xf7, - 0x5b, 0xff, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0x15, 0xfe, 0xa9, 0x78, - 0x09, 0x02, 0x6b, 0x78, 0x19, 0x43, 0xea, 0x78, 0x20, 0x00, 0xff, 0xf7, - 0x77, 0xfb, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x00, 0x20, 0x00, 0xff, 0xf7, - 0x49, 0xff, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0x03, 0xfe, 0x4b, 0x46, - 0x01, 0x2b, 0x01, 0xd0, 0x06, 0x2b, 0x10, 0xd1, 0x90, 0x4b, 0xe3, 0x5a, - 0x1b, 0x07, 0x07, 0xd4, 0x8f, 0x49, 0x20, 0x00, 0xff, 0xf7, 0x38, 0xff, - 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0xf2, 0xfd, 0x4b, 0x46, 0x01, 0x2b, - 0x1e, 0xd1, 0xa0, 0x33, 0x21, 0xe0, 0x8a, 0x49, 0x20, 0x00, 0xff, 0xf7, - 0x2b, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x00, 0x20, 0x00, 0xff, 0xf7, - 0x25, 0xff, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0xdf, 0xfd, 0x4b, 0x46, - 0x05, 0x2b, 0x0d, 0xd1, 0xea, 0x23, 0x9b, 0x00, 0xe2, 0x5a, 0x6b, 0x79, - 0x9a, 0x42, 0x09, 0xd8, 0xb1, 0x23, 0x08, 0xe0, 0x00, 0x23, 0x06, 0xe0, - 0x00, 0x23, 0x04, 0xe0, 0xa4, 0x23, 0x02, 0xe0, 0xb1, 0x23, 0x00, 0xe0, - 0xb4, 0x23, 0xf2, 0x22, 0x92, 0x00, 0xa1, 0x58, 0x04, 0x3a, 0xa2, 0x58, - 0x91, 0x42, 0x04, 0xd2, 0x01, 0x98, 0x46, 0x18, 0xf2, 0x21, 0x89, 0x00, - 0x66, 0x50, 0xf2, 0x21, 0x89, 0x00, 0x61, 0x58, 0x8a, 0x42, 0x1d, 0xd8, - 0x6c, 0x4b, 0xe3, 0x5c, 0xa5, 0x2b, 0x11, 0xd1, 0x6f, 0x4b, 0xe3, 0x5c, - 0x00, 0x2b, 0x0d, 0xd1, 0xfb, 0x23, 0x9b, 0x00, 0xe3, 0x58, 0x1b, 0x7c, - 0x00, 0x2b, 0x07, 0xd1, 0x01, 0x22, 0x6a, 0x4b, 0xe2, 0x54, 0x00, 0x22, - 0x09, 0x3b, 0xe2, 0x50, 0xa7, 0x23, 0x0e, 0xe0, 0x67, 0x49, 0x20, 0x00, - 0xff, 0xf7, 0xe2, 0xfe, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0x9c, 0xfd, - 0x00, 0x2f, 0x04, 0xd0, 0x52, 0x1a, 0x39, 0x68, 0x8a, 0x42, 0x00, 0xd2, - 0x3a, 0x60, 0x00, 0x2b, 0x01, 0xd1, 0x00, 0xf0, 0x8e, 0xfd, 0xa7, 0x2b, - 0x17, 0xd8, 0xa6, 0x2b, 0x00, 0xd3, 0x94, 0xe1, 0xa2, 0x2b, 0x00, 0xd1, - 0x98, 0xe0, 0x07, 0xd8, 0x00, 0x2b, 0x01, 0xd1, 0x00, 0xf0, 0x57, 0xfd, - 0xa1, 0x2b, 0x25, 0xd0, 0x00, 0xf0, 0x4c, 0xfd, 0xa4, 0x2b, 0x00, 0xd1, - 0x30, 0xe1, 0xa5, 0x2b, 0x01, 0xd1, 0x00, 0xf0, 0x4c, 0xfd, 0x00, 0xf0, - 0x43, 0xfd, 0xb4, 0x2b, 0x00, 0xd1, 0x7c, 0xe3, 0x0a, 0xd8, 0xb1, 0x2b, - 0x00, 0xd1, 0x61, 0xe2, 0xb2, 0x2b, 0x00, 0xd1, 0xb7, 0xe2, 0xa8, 0x2b, - 0x01, 0xd0, 0x00, 0xf0, 0x35, 0xfd, 0xe8, 0xe1, 0xb6, 0x2b, 0x01, 0xd1, - 0x00, 0xf0, 0xe9, 0xfb, 0x00, 0xd2, 0xc9, 0xe3, 0xb7, 0x2b, 0x01, 0xd1, - 0x00, 0xf0, 0x15, 0xfd, 0x00, 0xf0, 0x28, 0xfd, 0xfb, 0x23, 0x9b, 0x00, - 0x60, 0x22, 0xe1, 0x58, 0x0a, 0x72, 0x6a, 0x78, 0xe1, 0x58, 0x4a, 0x72, - 0xaa, 0x78, 0xe1, 0x58, 0x8a, 0x72, 0xe3, 0x58, 0xea, 0x78, 0xda, 0x72, - 0x2b, 0x78, 0x9a, 0x07, 0x32, 0xd5, 0xda, 0x07, 0x06, 0xd5, 0x9b, 0x08, - 0x03, 0x22, 0x13, 0x40, 0x04, 0x21, 0xcb, 0x1a, 0x99, 0xb2, 0x02, 0xe0, - 0xea, 0x23, 0x9b, 0x00, 0xe1, 0x5a, 0xe8, 0x22, 0x92, 0x00, 0x2b, 0x79, - 0xa0, 0x58, 0x03, 0x70, 0x6b, 0x79, 0xa0, 0x58, 0x43, 0x70, 0xab, 0x79, - 0xa0, 0x58, 0x83, 0x70, 0xa3, 0x58, 0xea, 0x79, 0xda, 0x70, 0x20, 0x00, - 0xfe, 0xf7, 0xf8, 0xff, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x00, 0x20, 0x00, - 0xff, 0xf7, 0x6a, 0xfe, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0x24, 0xfd, - 0x00, 0x22, 0x21, 0x4b, 0xe2, 0x54, 0x00, 0x2f, 0x01, 0xd1, 0x00, 0xf0, - 0xf2, 0xfc, 0x00, 0x23, 0x3b, 0x60, 0x01, 0x25, 0x00, 0xf0, 0x00, 0xfd, - 0xdb, 0x07, 0x19, 0xd5, 0x29, 0x1d, 0x04, 0x22, 0x03, 0xa8, 0x07, 0xf0, - 0x11, 0xfb, 0x03, 0x9b, 0xee, 0x22, 0x92, 0x00, 0xa3, 0x50, 0x10, 0x3a, - 0xa2, 0x5a, 0x93, 0x42, 0x0c, 0xd0, 0xe9, 0x23, 0x9b, 0x00, 0xe3, 0x58, - 0x00, 0x2b, 0x07, 0xd0, 0x18, 0x49, 0x20, 0x00, 0xff, 0xf7, 0x42, 0xfe, - 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0xfc, 0xfc, 0x00, 0x22, 0xe6, 0x23, - 0x9b, 0x00, 0xe2, 0x52, 0x13, 0x4b, 0xe2, 0x54, 0xa2, 0x22, 0x0a, 0x4b, - 0xe2, 0x54, 0x01, 0x25, 0x00, 0xf0, 0xd8, 0xfc, 0x2b, 0x78, 0x1f, 0x22, - 0x19, 0x00, 0x91, 0x43, 0x1c, 0xd0, 0x06, 0x49, 0x20, 0x00, 0xff, 0xf7, - 0x29, 0xfe, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0xe3, 0xfc, 0xc0, 0x46, - 0xdd, 0x03, 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0x01, 0x00, 0x04, 0x05, - 0xaa, 0x03, 0x00, 0x00, 0x02, 0x00, 0x01, 0x06, 0x79, 0x03, 0x00, 0x00, - 0xd1, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x10, 0x00, 0x07, 0x06, - 0xc2, 0x03, 0x00, 0x00, 0xda, 0x06, 0x01, 0xd5, 0x01, 0x21, 0x00, 0xe0, - 0x00, 0x21, 0xd0, 0x4a, 0xa2, 0x5c, 0x91, 0x42, 0x07, 0xd0, 0xcf, 0x49, - 0x20, 0x00, 0xff, 0xf7, 0x03, 0xfe, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, - 0xbd, 0xfc, 0x5b, 0x08, 0x07, 0x26, 0x9e, 0x43, 0xb0, 0x46, 0xe6, 0x23, - 0x9b, 0x00, 0xe1, 0x5a, 0x8a, 0x19, 0xea, 0x23, 0x9b, 0x00, 0xe3, 0x5a, - 0x9a, 0x42, 0x23, 0xdd, 0xe9, 0x23, 0x9b, 0x00, 0xe3, 0x58, 0x00, 0x2b, - 0x07, 0xd0, 0xc3, 0x49, 0x20, 0x00, 0xff, 0xf7, 0xe9, 0xfd, 0x01, 0x20, - 0x40, 0x42, 0x00, 0xf0, 0xa3, 0xfc, 0x00, 0x22, 0xbf, 0x4b, 0xe2, 0x54, - 0x20, 0x00, 0xfe, 0xf7, 0x67, 0xff, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x00, - 0x20, 0x00, 0xff, 0xf7, 0xd9, 0xfd, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, - 0x93, 0xfc, 0xb9, 0x4a, 0xea, 0x23, 0x9b, 0x00, 0xe2, 0x52, 0x00, 0x22, - 0x10, 0x3b, 0xe2, 0x52, 0x00, 0x23, 0x0c, 0xe0, 0xe8, 0x22, 0x92, 0x00, - 0xa0, 0x58, 0xe6, 0x21, 0x89, 0x00, 0x62, 0x5a, 0x56, 0x1c, 0x66, 0x52, - 0xe9, 0x18, 0x49, 0x78, 0x81, 0x54, 0x01, 0x33, 0x9b, 0xb2, 0x43, 0x45, - 0xf0, 0xd3, 0x2b, 0x78, 0xdb, 0x07, 0x18, 0xd5, 0x01, 0x22, 0xaa, 0x4b, - 0xe2, 0x54, 0x1d, 0x3b, 0xe1, 0x5a, 0x20, 0x00, 0xfe, 0xf7, 0x3a, 0xff, - 0x00, 0x28, 0x07, 0xd0, 0x01, 0x00, 0x20, 0x00, 0xff, 0xf7, 0xac, 0xfd, - 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0x66, 0xfc, 0x00, 0x22, 0xa3, 0x4b, - 0xe2, 0x54, 0x00, 0x2f, 0x01, 0xd0, 0x00, 0x23, 0x3b, 0x60, 0xfb, 0x23, - 0x9b, 0x00, 0xe3, 0x58, 0x99, 0x4a, 0xa2, 0x5c, 0x00, 0x2a, 0x01, 0xd0, - 0x30, 0x22, 0x00, 0xe0, 0x20, 0x22, 0x1a, 0x72, 0x95, 0x4a, 0xa1, 0x5c, - 0x4b, 0x42, 0x4b, 0x41, 0xa3, 0x54, 0x01, 0x25, 0x00, 0xf0, 0x34, 0xfc, - 0x2b, 0x78, 0x1e, 0x22, 0x93, 0x43, 0xc0, 0x2b, 0x07, 0xd0, 0x95, 0x49, - 0x20, 0x00, 0xff, 0xf7, 0x85, 0xfd, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, - 0x3f, 0xfc, 0xfb, 0x23, 0x9b, 0x00, 0xa4, 0x22, 0xe1, 0x58, 0x0a, 0x72, - 0x6a, 0x78, 0xe1, 0x58, 0x4a, 0x72, 0xaa, 0x78, 0xe1, 0x58, 0x8a, 0x72, - 0xea, 0x78, 0xe1, 0x58, 0xca, 0x72, 0x7f, 0x22, 0xf3, 0x21, 0x89, 0x00, - 0x62, 0x54, 0xe3, 0x58, 0x1a, 0x73, 0x2b, 0x78, 0x9b, 0x08, 0x7e, 0x3a, - 0x13, 0x40, 0x86, 0x4a, 0xa3, 0x54, 0x00, 0x22, 0x85, 0x4b, 0xe2, 0x52, - 0x2b, 0x78, 0x9b, 0x07, 0x19, 0xd5, 0x29, 0x1d, 0x04, 0x32, 0x03, 0xa8, - 0x07, 0xf0, 0x1a, 0xfa, 0x03, 0x9b, 0xee, 0x22, 0x92, 0x00, 0xa3, 0x50, - 0x10, 0x3a, 0xa2, 0x5a, 0x93, 0x42, 0x0c, 0xd0, 0xe9, 0x23, 0x9b, 0x00, - 0xe3, 0x58, 0x00, 0x2b, 0x07, 0xd0, 0x7b, 0x49, 0x20, 0x00, 0xff, 0xf7, - 0x4b, 0xfd, 0x01, 0x20, 0x40, 0x42, 0x00, 0xf0, 0x05, 0xfc, 0x00, 0x22, - 0xe6, 0x23, 0x9b, 0x00, 0xe2, 0x52, 0x6c, 0x4b, 0xe2, 0x54, 0x75, 0x4b, - 0xe2, 0x54, 0xa5, 0x22, 0x6e, 0x4b, 0xe2, 0x54, 0x01, 0x25, 0x00, 0xf0, - 0xdf, 0xfb, 0x71, 0x4a, 0xa2, 0x5c, 0x00, 0x2a, 0x05, 0xd1, 0x00, 0x22, - 0xaa, 0x56, 0x00, 0x2a, 0x03, 0xdb, 0x00, 0x25, 0x02, 0xe0, 0x00, 0x25, - 0x00, 0xe0, 0x01, 0x25, 0xed, 0xb2, 0xfb, 0x22, 0x92, 0x00, 0xa2, 0x21, - 0xa0, 0x58, 0x01, 0x72, 0xa2, 0x58, 0x5d, 0x49, 0x61, 0x5c, 0x51, 0x72, - 0xa6, 0x2b, 0x02, 0xd1, 0x00, 0x22, 0x5a, 0x4b, 0xe2, 0x54, 0xe9, 0x23, - 0x9b, 0x00, 0xe3, 0x58, 0x00, 0x2b, 0x29, 0xd1, 0xe6, 0x23, 0x9b, 0x00, - 0xe1, 0x5a, 0x00, 0x29, 0x24, 0xd0, 0x00, 0x2d, 0x22, 0xd1, 0x5a, 0x4b, - 0xe3, 0x5c, 0x00, 0x2b, 0x07, 0xd0, 0xe8, 0x23, 0x9b, 0x00, 0xe0, 0x58, - 0x57, 0x4e, 0xa2, 0x5b, 0x02, 0xf0, 0x4e, 0xf8, 0xa0, 0x53, 0x00, 0x22, - 0x4f, 0x4b, 0xe2, 0x54, 0x1d, 0x3b, 0xe1, 0x5a, 0x20, 0x00, 0xfe, 0xf7, - 0x85, 0xfe, 0x01, 0x1e, 0x05, 0xd0, 0x20, 0x00, 0xff, 0xf7, 0xf8, 0xfc, - 0x01, 0x20, 0x40, 0x42, 0xb2, 0xe3, 0x49, 0x4a, 0xea, 0x23, 0x9b, 0x00, - 0xe2, 0x52, 0x00, 0x22, 0x10, 0x3b, 0xe2, 0x52, 0xe6, 0x23, 0x9b, 0x00, - 0xe0, 0x5a, 0x44, 0x4b, 0x18, 0x1a, 0x80, 0xb2, 0x98, 0x42, 0x04, 0xd8, - 0x07, 0x21, 0xfe, 0xf7, 0x5f, 0xfa, 0xc0, 0xb2, 0x00, 0xe0, 0x7f, 0x20, - 0xf3, 0x23, 0x9b, 0x00, 0xe0, 0x54, 0x20, 0x33, 0xe3, 0x58, 0x98, 0x72, - 0x00, 0x2d, 0x04, 0xd0, 0xa8, 0x22, 0x3b, 0x4b, 0xe2, 0x54, 0x01, 0x25, - 0x78, 0xe3, 0xe6, 0x23, 0x9b, 0x00, 0xe2, 0x5a, 0x20, 0x3b, 0x9a, 0x42, - 0x06, 0xd9, 0x3c, 0x49, 0x20, 0x00, 0xff, 0xf7, 0xc9, 0xfc, 0x01, 0x20, - 0x40, 0x42, 0x83, 0xe3, 0xa5, 0x22, 0x32, 0x4b, 0xe2, 0x54, 0x01, 0x25, - 0x66, 0xe3, 0x2b, 0x78, 0x1e, 0x22, 0x19, 0x00, 0x91, 0x43, 0xc1, 0x29, - 0x06, 0xd0, 0x2e, 0x49, 0x20, 0x00, 0xff, 0xf7, 0xb7, 0xfc, 0x01, 0x20, - 0x40, 0x42, 0x71, 0xe3, 0x9b, 0x08, 0x07, 0x22, 0x13, 0x40, 0xe6, 0x22, - 0x92, 0x00, 0xa1, 0x5a, 0xcb, 0x1a, 0x99, 0xb2, 0xa1, 0x52, 0x27, 0x4b, - 0xe3, 0x5c, 0x00, 0x2b, 0x1c, 0xd0, 0xe8, 0x23, 0x9b, 0x00, 0xe0, 0x58, - 0x24, 0x4b, 0x98, 0x46, 0xe2, 0x5a, 0x01, 0xf0, 0xe7, 0xff, 0x06, 0x00, - 0x43, 0x46, 0xe0, 0x52, 0x03, 0xab, 0x98, 0x46, 0x69, 0x1c, 0x02, 0x22, - 0x18, 0x00, 0x07, 0xf0, 0x53, 0xf9, 0x43, 0x46, 0x1b, 0x88, 0x9e, 0x42, - 0x06, 0xd0, 0x1f, 0x49, 0x20, 0x00, 0xff, 0xf7, 0x8d, 0xfc, 0x01, 0x20, - 0x40, 0x42, 0x47, 0xe3, 0x01, 0x22, 0x12, 0x4b, 0xe2, 0x54, 0x1d, 0x3b, - 0xe1, 0x5a, 0x20, 0x00, 0xfe, 0xf7, 0x0a, 0xfe, 0x00, 0x28, 0x06, 0xd0, - 0x01, 0x00, 0x20, 0x00, 0xff, 0xf7, 0x7c, 0xfc, 0x01, 0x20, 0x40, 0x42, - 0x36, 0xe3, 0xfb, 0x23, 0x9b, 0x00, 0xe3, 0x58, 0xa1, 0x22, 0x1a, 0x72, - 0x00, 0x22, 0x09, 0x4b, 0xe2, 0x54, 0x00, 0x2f, 0x00, 0xd1, 0x02, 0xe3, - 0x00, 0x23, 0x3b, 0x60, 0x01, 0x25, 0x0f, 0xe3, 0xc2, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x05, 0x12, 0x00, 0x07, 0x06, 0xb5, 0x03, 0x00, 0x00, - 0x79, 0x03, 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0x01, 0x00, 0x04, 0x05, - 0xcd, 0x03, 0x00, 0x00, 0xce, 0x03, 0x00, 0x00, 0x10, 0x00, 0x07, 0x06, - 0xd1, 0x03, 0x00, 0x00, 0x47, 0x00, 0x04, 0x06, 0x04, 0x00, 0x04, 0x05, - 0xfb, 0x23, 0x9b, 0x00, 0x6a, 0x78, 0xe1, 0x58, 0x4a, 0x72, 0xaa, 0x78, - 0xe1, 0x58, 0x8a, 0x72, 0xe3, 0x58, 0xea, 0x78, 0xda, 0x72, 0xea, 0x23, - 0x9b, 0x00, 0xe3, 0x5a, 0x04, 0x2b, 0x0d, 0xd9, 0x25, 0xe0, 0xfb, 0x22, - 0x92, 0x00, 0xa0, 0x58, 0x1a, 0x1d, 0xe8, 0x21, 0x89, 0x00, 0x61, 0x58, - 0xc9, 0x5c, 0x82, 0x18, 0x11, 0x72, 0x01, 0x33, 0x9b, 0xb2, 0x00, 0xe0, - 0x00, 0x23, 0xea, 0x22, 0x92, 0x00, 0xa2, 0x5a, 0x93, 0x42, 0xec, 0xd3, - 0xfb, 0x23, 0x9b, 0x00, 0xe1, 0x58, 0x04, 0x23, 0x9a, 0x1a, 0x92, 0x00, - 0x43, 0x23, 0x1a, 0x43, 0x0a, 0x72, 0x00, 0x22, 0xc0, 0x4b, 0xe2, 0x54, - 0x00, 0x2f, 0x00, 0xd1, 0xb3, 0xe2, 0x00, 0x23, 0x3b, 0x60, 0x01, 0x25, - 0xbe, 0xe2, 0x00, 0x22, 0xe6, 0x23, 0x9b, 0x00, 0xe2, 0x52, 0xbb, 0x4b, - 0xe2, 0x54, 0xb2, 0x22, 0xb8, 0x4b, 0xe2, 0x54, 0x09, 0x3b, 0xe3, 0x58, - 0x00, 0x2b, 0x0d, 0xd0, 0x03, 0x93, 0xfb, 0x25, 0xad, 0x00, 0x60, 0x59, - 0x0c, 0x30, 0xae, 0x3a, 0x03, 0xa9, 0x07, 0xf0, 0xc1, 0xf8, 0x63, 0x59, - 0x41, 0x22, 0x1a, 0x72, 0x01, 0x25, 0xa3, 0xe2, 0xfb, 0x23, 0x9b, 0x00, - 0xe3, 0x58, 0x40, 0x22, 0x1a, 0x72, 0x01, 0x25, 0x9c, 0xe2, 0x2b, 0x78, - 0x1f, 0x22, 0x19, 0x00, 0x91, 0x43, 0x60, 0x29, 0x06, 0xd0, 0xaa, 0x49, - 0x20, 0x00, 0xff, 0xf7, 0xed, 0xfb, 0x01, 0x20, 0x40, 0x42, 0xa7, 0xe2, - 0xdb, 0x06, 0x01, 0xd5, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0xa3, 0x4b, - 0xe3, 0x5c, 0x9a, 0x42, 0x06, 0xd0, 0xa3, 0x49, 0x20, 0x00, 0xff, 0xf7, - 0xdd, 0xfb, 0x01, 0x20, 0x40, 0x42, 0x97, 0xe2, 0xea, 0x23, 0x9b, 0x00, - 0xe3, 0x5a, 0xe6, 0x22, 0x92, 0x00, 0xa5, 0x5a, 0x5d, 0x1b, 0xab, 0xb2, - 0x98, 0x46, 0x07, 0x2b, 0x01, 0xd9, 0x07, 0x23, 0x98, 0x46, 0xe9, 0x23, - 0x9b, 0x00, 0xe3, 0x58, 0x00, 0x2b, 0x47, 0xd1, 0x43, 0x46, 0x06, 0x2b, - 0x44, 0xd8, 0x96, 0x4b, 0xe3, 0x5c, 0x00, 0x2b, 0x0b, 0xd0, 0x3f, 0xe0, - 0xe8, 0x22, 0x92, 0x00, 0xa1, 0x58, 0x08, 0x3a, 0xa2, 0x5a, 0xd2, 0x18, - 0x8a, 0x5c, 0xca, 0x54, 0x01, 0x33, 0x9b, 0xb2, 0x00, 0xe0, 0x00, 0x23, - 0x98, 0x45, 0xf1, 0xd8, 0xe8, 0x22, 0x92, 0x00, 0xa3, 0x58, 0x43, 0x44, - 0xa3, 0x50, 0x8b, 0x4b, 0xe2, 0x5c, 0x8b, 0x4b, 0xe1, 0x5a, 0x20, 0x00, - 0xfe, 0xf7, 0x56, 0xff, 0x43, 0x46, 0xc0, 0x1a, 0xea, 0x23, 0x9b, 0x00, - 0xe0, 0x52, 0x87, 0x49, 0x20, 0x00, 0xfe, 0xf7, 0x9d, 0xfd, 0x01, 0x1e, - 0x05, 0xd0, 0x20, 0x00, 0xff, 0xf7, 0x98, 0xfb, 0x01, 0x20, 0x40, 0x42, - 0x52, 0xe2, 0xe8, 0x22, 0x92, 0x00, 0xa3, 0x58, 0x41, 0x46, 0x5b, 0x1a, - 0xa3, 0x50, 0x08, 0x32, 0xa3, 0x5a, 0x43, 0x44, 0x9b, 0xb2, 0x98, 0x46, - 0xa3, 0x52, 0x00, 0x22, 0xe6, 0x23, 0x9b, 0x00, 0xe2, 0x52, 0x43, 0x46, - 0x07, 0x2b, 0x01, 0xd9, 0x07, 0x23, 0x98, 0x46, 0x00, 0x23, 0x0f, 0xe0, - 0xfb, 0x22, 0x92, 0x00, 0xa2, 0x58, 0x01, 0x33, 0xe8, 0x21, 0x89, 0x00, - 0x66, 0x58, 0xe6, 0x20, 0x80, 0x00, 0x21, 0x5a, 0x4d, 0x1c, 0x25, 0x52, - 0x71, 0x5c, 0xd2, 0x18, 0x11, 0x72, 0x9b, 0xb2, 0x98, 0x45, 0xed, 0xd8, - 0xfb, 0x23, 0x9b, 0x00, 0xe2, 0x58, 0x65, 0x4b, 0xe3, 0x5c, 0x00, 0x2b, - 0x01, 0xd0, 0x10, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x07, 0x23, 0x40, 0x46, - 0x1d, 0x1a, 0x6d, 0x00, 0x0d, 0x43, 0x15, 0x72, 0x5e, 0x4a, 0xa1, 0x5c, - 0x4b, 0x42, 0x4b, 0x41, 0xa3, 0x54, 0xe6, 0x23, 0x9b, 0x00, 0xe2, 0x5a, - 0x10, 0x33, 0xe3, 0x5a, 0x9a, 0x42, 0x00, 0xd0, 0xe7, 0xe1, 0x5b, 0x4b, - 0xe3, 0x5c, 0x00, 0x2b, 0x00, 0xd1, 0xe4, 0xe1, 0xfb, 0x23, 0x9b, 0x00, - 0xe2, 0x58, 0x11, 0x7a, 0x01, 0x23, 0x0b, 0x43, 0x13, 0x72, 0x00, 0x22, - 0x50, 0x4b, 0xe2, 0x54, 0x00, 0x2f, 0x00, 0xd1, 0xd9, 0xe1, 0x00, 0x23, - 0x3b, 0x60, 0x01, 0x25, 0xde, 0xe1, 0xfb, 0x23, 0x9b, 0x00, 0x6a, 0x78, - 0xe1, 0x58, 0x4a, 0x72, 0xaa, 0x78, 0xe1, 0x58, 0x8a, 0x72, 0xe3, 0x58, - 0xea, 0x78, 0xda, 0x72, 0x2b, 0x78, 0x5b, 0x07, 0x0c, 0xd5, 0x01, 0x22, - 0x4c, 0x4b, 0xe2, 0x54, 0x2d, 0x3b, 0xe0, 0x58, 0x08, 0x33, 0xe1, 0x5a, - 0x00, 0x22, 0x01, 0xf0, 0x69, 0xfe, 0x49, 0x4b, 0xe0, 0x52, 0x04, 0xe0, - 0x00, 0x23, 0x46, 0x4a, 0xa3, 0x54, 0x46, 0x4a, 0xa3, 0x52, 0x2b, 0x79, - 0xf3, 0x22, 0x92, 0x00, 0xa3, 0x54, 0x2a, 0x78, 0x92, 0x07, 0x06, 0xd0, - 0x3a, 0x49, 0x20, 0x00, 0xff, 0xf7, 0x0e, 0xfb, 0x01, 0x20, 0x40, 0x42, - 0xc8, 0xe1, 0x5a, 0xb2, 0x00, 0x2a, 0x0a, 0xdd, 0xda, 0x00, 0xd3, 0x1a, - 0xea, 0x22, 0x92, 0x00, 0xa2, 0x5a, 0x93, 0x42, 0x0a, 0xd9, 0x34, 0x4b, - 0xe3, 0x5c, 0x00, 0x2b, 0x06, 0xd1, 0x38, 0x49, 0x20, 0x00, 0xff, 0xf7, - 0xf9, 0xfa, 0x01, 0x20, 0x40, 0x42, 0xb3, 0xe1, 0xee, 0x23, 0x9b, 0x00, - 0xe3, 0x58, 0x00, 0x2b, 0x0c, 0xd0, 0x03, 0x93, 0xfb, 0x25, 0xad, 0x00, - 0x60, 0x59, 0x0c, 0x30, 0x04, 0x22, 0x03, 0xa9, 0x06, 0xf0, 0xa6, 0xff, - 0x63, 0x59, 0xc6, 0x22, 0x1a, 0x72, 0x04, 0xe0, 0xfb, 0x23, 0x9b, 0x00, - 0xe3, 0x58, 0xc4, 0x22, 0x1a, 0x72, 0xb5, 0x22, 0x1e, 0x4b, 0xe2, 0x54, - 0x01, 0x25, 0x7f, 0xe1, 0x2b, 0x78, 0x1c, 0x22, 0x93, 0x43, 0xa3, 0x2b, - 0x06, 0xd0, 0x1c, 0x49, 0x20, 0x00, 0xff, 0xf7, 0xd1, 0xfa, 0x01, 0x20, - 0x40, 0x42, 0x8b, 0xe1, 0x00, 0x22, 0xe6, 0x23, 0x9b, 0x00, 0xe2, 0x52, - 0x15, 0x4b, 0xe2, 0x54, 0x1e, 0x4b, 0xe2, 0x54, 0x39, 0x00, 0x20, 0x00, - 0xfe, 0xf7, 0x12, 0xfb, 0xb6, 0x22, 0x10, 0x4b, 0xe2, 0x54, 0x00, 0x23, - 0x98, 0x46, 0x43, 0x46, 0x00, 0x2b, 0x00, 0xd1, 0xd0, 0xe0, 0x2b, 0x78, - 0x1c, 0x22, 0x93, 0x43, 0xa2, 0x2b, 0x06, 0xd0, 0x0b, 0x49, 0x20, 0x00, - 0xff, 0xf7, 0xb0, 0xfa, 0x01, 0x20, 0x40, 0x42, 0x6a, 0xe1, 0x69, 0x78, - 0x06, 0x4b, 0xe3, 0x5c, 0x99, 0x42, 0x21, 0xd9, 0x0f, 0x49, 0x20, 0x00, - 0xff, 0xf7, 0xa4, 0xfa, 0x01, 0x20, 0x40, 0x42, 0x5e, 0xe1, 0xc0, 0x46, - 0xc1, 0x03, 0x00, 0x00, 0xc2, 0x03, 0x00, 0x00, 0x01, 0x00, 0x04, 0x05, - 0x00, 0x00, 0x03, 0x05, 0xb5, 0x03, 0x00, 0x00, 0xb2, 0x03, 0x00, 0x00, - 0x9a, 0x03, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0xcd, 0x03, 0x00, 0x00, - 0xce, 0x03, 0x00, 0x00, 0x02, 0x00, 0x04, 0x05, 0xd2, 0x03, 0x00, 0x00, - 0x03, 0x00, 0x04, 0x05, 0xa4, 0x4b, 0xe3, 0x5c, 0x00, 0x2b, 0x22, 0xd0, - 0xf3, 0x23, 0x9b, 0x00, 0xe3, 0x5c, 0x99, 0x42, 0x1d, 0xd1, 0xfb, 0x23, - 0x9b, 0x00, 0xe2, 0x58, 0x1c, 0x3b, 0xe1, 0x5c, 0x07, 0x23, 0x5b, 0x1a, - 0x9b, 0x00, 0x3f, 0x21, 0x49, 0x42, 0x0b, 0x43, 0x13, 0x72, 0x9b, 0x4b, - 0xe3, 0x5c, 0x00, 0x2b, 0x08, 0xd0, 0xfb, 0x23, 0x9b, 0x00, 0xe0, 0x58, - 0x09, 0x30, 0x02, 0x22, 0x97, 0x4b, 0xe1, 0x18, 0x06, 0xf0, 0x22, 0xff, - 0xb7, 0x22, 0x96, 0x4b, 0xe2, 0x54, 0x01, 0x25, 0x04, 0xe1, 0xcb, 0x00, - 0x59, 0x1a, 0x8e, 0xb2, 0x33, 0x00, 0x00, 0x22, 0x08, 0xe0, 0xe8, 0x20, - 0x80, 0x00, 0x21, 0x58, 0xc8, 0x5c, 0x88, 0x54, 0x01, 0x33, 0x9b, 0xb2, - 0x01, 0x32, 0x92, 0xb2, 0xea, 0x20, 0x80, 0x00, 0x21, 0x5a, 0x8b, 0x42, - 0xf1, 0xd3, 0x89, 0x1b, 0x8e, 0xb2, 0x26, 0x52, 0xab, 0x78, 0xf3, 0x22, - 0x92, 0x00, 0xa3, 0x54, 0x28, 0x3a, 0xa2, 0x58, 0x00, 0x2a, 0x3a, 0xd1, - 0xda, 0x00, 0xd3, 0x1a, 0x9e, 0x42, 0x36, 0xd2, 0x83, 0x4b, 0xe3, 0x5c, - 0x00, 0x2b, 0x32, 0xd1, 0xe8, 0x22, 0x92, 0x00, 0xa3, 0x58, 0x9b, 0x19, - 0xa3, 0x50, 0x80, 0x4b, 0xe2, 0x5c, 0x80, 0x4b, 0xe1, 0x5a, 0x20, 0x00, - 0xfe, 0xf7, 0xdc, 0xfd, 0x80, 0x1b, 0xea, 0x23, 0x9b, 0x00, 0xe0, 0x52, - 0x7c, 0x49, 0x20, 0x00, 0xfe, 0xf7, 0x24, 0xfc, 0x01, 0x1e, 0x05, 0xd0, - 0x20, 0x00, 0xff, 0xf7, 0x1f, 0xfa, 0x01, 0x20, 0x40, 0x42, 0xd9, 0xe0, - 0x70, 0x4b, 0xe3, 0x5c, 0x00, 0x2b, 0x09, 0xd0, 0xe8, 0x23, 0x9b, 0x00, - 0xe0, 0x58, 0x08, 0x33, 0xe1, 0x5a, 0x6d, 0x4d, 0x62, 0x5b, 0x01, 0xf0, - 0x57, 0xfd, 0x60, 0x53, 0xe8, 0x22, 0x92, 0x00, 0xa3, 0x58, 0x9b, 0x1b, - 0xa3, 0x50, 0x08, 0x32, 0xa3, 0x5a, 0xf6, 0x18, 0xa6, 0x52, 0xf3, 0x23, - 0x9b, 0x00, 0xe2, 0x5c, 0xd3, 0x00, 0x9b, 0x1a, 0xea, 0x22, 0x92, 0x00, - 0xa2, 0x5a, 0x93, 0x42, 0x0a, 0xd9, 0x63, 0x4b, 0xe3, 0x5c, 0x00, 0x2b, - 0x06, 0xd1, 0x65, 0x49, 0x20, 0x00, 0xff, 0xf7, 0xf3, 0xf9, 0x01, 0x20, - 0x40, 0x42, 0xad, 0xe0, 0x00, 0x22, 0xe6, 0x23, 0x9b, 0x00, 0xe2, 0x52, - 0x60, 0x4b, 0xe2, 0x54, 0x56, 0x4b, 0xe2, 0x54, 0x5e, 0x4b, 0xe2, 0x5c, - 0x0a, 0x33, 0xe3, 0x5c, 0x9a, 0x42, 0x00, 0xd1, 0x7f, 0xe0, 0x52, 0x4b, - 0xe3, 0x5c, 0x00, 0x2b, 0x00, 0xd0, 0x7c, 0xe0, 0x00, 0x22, 0xf2, 0x23, - 0x9b, 0x00, 0xe2, 0x50, 0x20, 0x3b, 0xe3, 0x5a, 0xe6, 0x22, 0x92, 0x00, - 0xa5, 0x5a, 0x5d, 0x1b, 0xab, 0xb2, 0x98, 0x46, 0x07, 0x2b, 0x01, 0xd9, - 0x07, 0x23, 0x98, 0x46, 0x00, 0x23, 0x0f, 0xe0, 0xfb, 0x22, 0x92, 0x00, - 0xa2, 0x58, 0x01, 0x33, 0xe8, 0x21, 0x89, 0x00, 0x66, 0x58, 0xe6, 0x20, - 0x80, 0x00, 0x21, 0x5a, 0x4d, 0x1c, 0x25, 0x52, 0x71, 0x5c, 0xd2, 0x18, - 0x11, 0x72, 0x9b, 0xb2, 0x98, 0x45, 0xed, 0xd8, 0xfb, 0x23, 0x9b, 0x00, - 0xe1, 0x58, 0x45, 0x4a, 0xa3, 0x5c, 0x01, 0x33, 0xdb, 0xb2, 0xa3, 0x54, - 0x0b, 0x72, 0xe6, 0x23, 0x9b, 0x00, 0xe2, 0x5a, 0x10, 0x33, 0xe3, 0x5a, - 0x9a, 0x42, 0x16, 0xd1, 0x39, 0x4b, 0xe3, 0x5c, 0x00, 0x2b, 0x12, 0xd0, - 0xfb, 0x23, 0x9b, 0x00, 0xe2, 0x58, 0x13, 0x7a, 0x80, 0x21, 0x49, 0x42, - 0x0b, 0x43, 0x13, 0x72, 0xf4, 0x23, 0x9b, 0x00, 0x42, 0x46, 0xe2, 0x54, - 0x36, 0x4b, 0xe2, 0x5c, 0x0a, 0x33, 0xe2, 0x54, 0x01, 0x22, 0x2b, 0x4b, - 0xe2, 0x54, 0x00, 0x2f, 0x31, 0xd0, 0x00, 0x23, 0x3b, 0x60, 0x01, 0x25, - 0x30, 0xe0, 0x2b, 0x78, 0x1e, 0x22, 0x93, 0x43, 0xa1, 0x2b, 0x06, 0xd0, - 0x2e, 0x49, 0x20, 0x00, 0xff, 0xf7, 0x82, 0xf9, 0x01, 0x20, 0x40, 0x42, - 0x3c, 0xe0, 0x00, 0x22, 0x23, 0x4b, 0xe2, 0x54, 0x00, 0x2f, 0x1e, 0xd0, - 0x00, 0x23, 0x3b, 0x60, 0x00, 0x25, 0x1b, 0xe0, 0x27, 0x49, 0x20, 0x00, - 0xff, 0xf7, 0x72, 0xf9, 0x01, 0x20, 0x40, 0x42, 0x2c, 0xe0, 0x00, 0x25, - 0x12, 0xe0, 0x01, 0x25, 0x10, 0xe0, 0x01, 0x25, 0x0e, 0xe0, 0x01, 0x25, - 0x0c, 0xe0, 0x01, 0x25, 0x0a, 0xe0, 0x01, 0x25, 0x08, 0xe0, 0x01, 0x25, - 0x06, 0xe0, 0x00, 0x25, 0x04, 0xe0, 0x00, 0x25, 0x02, 0xe0, 0x01, 0x25, - 0x00, 0xe0, 0x00, 0x25, 0x39, 0x00, 0x20, 0x00, 0xfe, 0xf7, 0xa6, 0xf9, - 0x00, 0x2d, 0x06, 0xd0, 0xfb, 0x23, 0x9b, 0x00, 0xe1, 0x58, 0x04, 0x3b, - 0xe0, 0x58, 0xff, 0xf7, 0x05, 0xf9, 0x0b, 0x4b, 0xe3, 0x5c, 0x00, 0x2b, - 0x05, 0xd0, 0x01, 0x20, 0x04, 0xe0, 0x00, 0x20, 0x02, 0xe0, 0x00, 0x20, - 0x00, 0xe0, 0x00, 0x20, 0x05, 0xb0, 0x0c, 0xbc, 0x90, 0x46, 0x99, 0x46, - 0xf0, 0xbd, 0xc0, 0x46, 0xd2, 0x03, 0x00, 0x00, 0xcd, 0x03, 0x00, 0x00, - 0xce, 0x03, 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, - 0xb2, 0x03, 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, - 0x02, 0x00, 0x04, 0x05, 0xc2, 0x03, 0x00, 0x00, 0x01, 0x00, 0x04, 0x05, - 0x47, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x04, 0x00, 0x06, 0xf0, 0x84, 0xfa, 0x00, 0x2c, 0x02, 0xd1, - 0x0d, 0x48, 0x06, 0xf0, 0x57, 0xfa, 0x20, 0x23, 0xe3, 0x5c, 0x00, 0x2b, - 0x01, 0xd0, 0x0f, 0x2b, 0x02, 0xd1, 0x09, 0x48, 0x06, 0xf0, 0x4e, 0xfa, - 0x00, 0x22, 0x20, 0x23, 0xe2, 0x54, 0x07, 0x4b, 0x1b, 0x68, 0x9a, 0x68, - 0xa1, 0x68, 0x8a, 0x42, 0xfa, 0xd8, 0x23, 0x60, 0x5a, 0x68, 0x62, 0x60, - 0x14, 0x60, 0x5c, 0x60, 0x20, 0x00, 0x10, 0xbd, 0x00, 0x37, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x10, 0x4c, - 0xa0, 0x69, 0x23, 0x68, 0x1a, 0x68, 0x22, 0x60, 0x54, 0x60, 0xa3, 0x61, - 0x01, 0x21, 0x20, 0x22, 0x99, 0x54, 0xff, 0xf7, 0xcb, 0xff, 0x05, 0x00, - 0xa0, 0x69, 0x29, 0x00, 0x06, 0xf0, 0xfe, 0xf9, 0xef, 0xf3, 0x09, 0x83, - 0x24, 0x3b, 0xea, 0x69, 0x9a, 0x42, 0x02, 0xd9, 0x05, 0x48, 0x06, 0xf0, - 0x1d, 0xfa, 0x03, 0x4b, 0x98, 0x69, 0x29, 0x00, 0xfd, 0xf7, 0x2c, 0xfe, - 0x70, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0xa4, 0x36, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x00, 0x0f, 0x4c, 0xa5, 0x69, - 0x06, 0xf0, 0x1a, 0xfa, 0x20, 0x23, 0xee, 0x54, 0x20, 0x68, 0x02, 0x68, - 0x22, 0x60, 0x54, 0x60, 0xa0, 0x61, 0x01, 0x22, 0xc2, 0x54, 0x29, 0x00, - 0x06, 0xf0, 0xd6, 0xf9, 0xef, 0xf3, 0x09, 0x83, 0x24, 0x3b, 0xea, 0x69, - 0x9a, 0x42, 0x02, 0xd9, 0x05, 0x48, 0x06, 0xf0, 0xf5, 0xf9, 0x03, 0x4b, - 0x98, 0x69, 0x29, 0x00, 0xfd, 0xf7, 0x04, 0xfe, 0x70, 0xbd, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0xa4, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x00, 0x06, 0xf0, 0x0c, 0xfa, 0x00, 0x2c, 0x02, 0xd1, - 0x22, 0x48, 0x06, 0xf0, 0xdf, 0xf9, 0xe3, 0x68, 0x00, 0x2b, 0x02, 0xd1, - 0x1f, 0x48, 0x06, 0xf0, 0xd9, 0xf9, 0x1f, 0x4b, 0xdb, 0x69, 0x9c, 0x42, - 0x11, 0xd0, 0x63, 0x68, 0x22, 0x68, 0x1a, 0x60, 0x23, 0x68, 0x62, 0x68, - 0x5a, 0x60, 0x00, 0x23, 0xe3, 0x60, 0x23, 0x68, 0x19, 0x4a, 0x93, 0x42, - 0x2a, 0xd0, 0xa2, 0x68, 0x99, 0x68, 0x8c, 0x46, 0x62, 0x44, 0x9a, 0x60, - 0x24, 0xe0, 0x21, 0x68, 0x13, 0x4b, 0xd9, 0x61, 0x1a, 0x00, 0x1c, 0x32, - 0x4a, 0x60, 0x00, 0x21, 0xe1, 0x60, 0xdb, 0x69, 0x93, 0x42, 0x02, 0xd1, - 0x04, 0xf0, 0x1e, 0xff, 0x16, 0xe0, 0xa2, 0x68, 0x99, 0x68, 0x8c, 0x46, - 0x62, 0x44, 0x9a, 0x60, 0x0a, 0x4c, 0xa5, 0x6a, 0x04, 0xf0, 0xfc, 0xfe, - 0x43, 0x1b, 0xe2, 0x69, 0x90, 0x68, 0x83, 0x42, 0x08, 0xd2, 0xc2, 0x1a, - 0x01, 0x2a, 0x00, 0xd8, 0x98, 0x1c, 0x04, 0x4b, 0x9b, 0x6a, 0xc0, 0x18, - 0x04, 0xf0, 0xf6, 0xfe, 0x70, 0xbd, 0xc0, 0x46, 0x78, 0x37, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0x04, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x00, - 0x0e, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x06, 0xf0, 0xb1, 0xf9, 0x00, 0x2d, - 0x03, 0xd0, 0x00, 0x2c, 0x01, 0xd0, 0x00, 0x2e, 0x02, 0xd1, 0x25, 0x48, - 0x06, 0xf0, 0x80, 0xf9, 0x2f, 0x61, 0xec, 0x60, 0x04, 0xf0, 0xcc, 0xfe, - 0x01, 0x2e, 0x00, 0xd8, 0x02, 0x26, 0x21, 0x4b, 0xda, 0x69, 0x1c, 0x33, - 0x9a, 0x42, 0x0d, 0xd1, 0x1e, 0x4b, 0x98, 0x62, 0xdd, 0x61, 0x1d, 0x62, - 0x1a, 0x00, 0x1c, 0x32, 0x2a, 0x60, 0x6a, 0x60, 0xae, 0x60, 0x98, 0x6a, - 0x30, 0x18, 0x04, 0xf0, 0xd7, 0xfe, 0x2b, 0xe0, 0x17, 0x4b, 0x9b, 0x6a, - 0xc1, 0x1a, 0x74, 0x18, 0xa1, 0x42, 0x04, 0xd9, 0x15, 0x48, 0x06, 0xf0, - 0xdd, 0xf8, 0x34, 0x00, 0x05, 0xe0, 0x92, 0x68, 0x94, 0x42, 0x02, 0xd2, - 0x18, 0x19, 0x04, 0xf0, 0xad, 0xfe, 0x0f, 0x4b, 0xdb, 0x69, 0x07, 0xe0, - 0xab, 0x42, 0x02, 0xd1, 0x0b, 0x48, 0x06, 0xf0, 0x4d, 0xf9, 0x9a, 0x68, - 0xa4, 0x1a, 0x1b, 0x68, 0x9a, 0x68, 0x94, 0x42, 0xf4, 0xd8, 0x2b, 0x60, - 0x5a, 0x68, 0x6a, 0x60, 0x15, 0x60, 0x5d, 0x60, 0xac, 0x60, 0x9a, 0x68, - 0x14, 0x1b, 0x9c, 0x60, 0x01, 0x22, 0x52, 0x42, 0x02, 0x4b, 0x5a, 0x62, - 0xf8, 0xbd, 0xc0, 0x46, 0x44, 0x36, 0x01, 0x08, 0xe8, 0x19, 0x00, 0x20, - 0x04, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x00, - 0x0d, 0x00, 0x06, 0xf0, 0x53, 0xf9, 0x00, 0x2e, 0x02, 0xd1, 0x0a, 0x48, - 0x06, 0xf0, 0x26, 0xf9, 0x34, 0x68, 0x0c, 0xe0, 0xe3, 0x68, 0x2b, 0x43, - 0xe3, 0x60, 0x00, 0x2d, 0x02, 0xd0, 0x23, 0x69, 0x2b, 0x42, 0x03, 0xd0, - 0xa1, 0x68, 0x60, 0x68, 0x05, 0xf0, 0xb8, 0xfe, 0x24, 0x68, 0xb4, 0x42, - 0xf0, 0xd1, 0x70, 0xbd, 0x28, 0x37, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x00, 0x28, 0x02, 0xd1, 0x04, 0x48, 0x06, 0xf0, 0x0a, 0xf9, - 0x00, 0x60, 0x40, 0x60, 0x00, 0x23, 0x83, 0x60, 0x10, 0xbd, 0xc0, 0x46, - 0x5c, 0x37, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x02, 0x70, - 0x01, 0x30, 0x88, 0x42, 0xfb, 0xd3, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x82, 0x60, 0x02, 0x24, 0x20, 0x23, 0xc4, 0x54, 0x00, 0x23, - 0x1f, 0x34, 0x03, 0x55, 0xc2, 0x63, 0x83, 0x63, 0x43, 0x63, 0x01, 0x22, - 0x22, 0x33, 0xc2, 0x54, 0x81, 0x61, 0x06, 0x4b, 0x03, 0x61, 0x5a, 0x69, - 0x42, 0x61, 0x10, 0x61, 0x58, 0x61, 0x03, 0x00, 0x28, 0x33, 0x83, 0x62, - 0x04, 0x33, 0xc3, 0x62, 0x03, 0x63, 0x10, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, 0x06, 0xf0, 0xfc, 0xf8, - 0x00, 0x2c, 0x02, 0xd1, 0x15, 0x48, 0x06, 0xf0, 0xcf, 0xf8, 0x63, 0x68, - 0x5a, 0x07, 0x07, 0xd1, 0xa2, 0x68, 0x51, 0x07, 0x04, 0xd1, 0x93, 0x42, - 0x02, 0xd2, 0xd3, 0x1a, 0xc7, 0x2b, 0x02, 0xd8, 0x0e, 0x48, 0x06, 0xf0, - 0xc1, 0xf8, 0xe3, 0x68, 0xff, 0x2b, 0x02, 0xd8, 0x23, 0x69, 0x00, 0x2b, - 0x02, 0xd1, 0x0a, 0x48, 0x06, 0xf0, 0xb8, 0xf8, 0xa3, 0x68, 0x18, 0x00, - 0x48, 0x38, 0x62, 0x68, 0xc2, 0x61, 0x6c, 0x3b, 0xc3, 0x60, 0x22, 0x69, - 0x1a, 0x61, 0x62, 0x69, 0x5a, 0x61, 0x04, 0x4a, 0x1a, 0x62, 0xe2, 0x68, - 0x21, 0x68, 0xff, 0xf7, 0xaf, 0xff, 0x10, 0xbd, 0xdc, 0x36, 0x01, 0x08, - 0xb9, 0xa5, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x10, 0x4c, - 0xa0, 0x69, 0x23, 0x68, 0x1a, 0x68, 0x22, 0x60, 0x54, 0x60, 0xa3, 0x61, - 0x01, 0x21, 0x20, 0x22, 0x99, 0x54, 0xff, 0xf7, 0x33, 0xfe, 0x05, 0x00, - 0xa0, 0x69, 0x29, 0x00, 0x06, 0xf0, 0x66, 0xf8, 0xef, 0xf3, 0x09, 0x83, - 0x24, 0x3b, 0xea, 0x69, 0x9a, 0x42, 0x02, 0xd9, 0x05, 0x48, 0x06, 0xf0, - 0x85, 0xf8, 0x03, 0x4b, 0x98, 0x69, 0x29, 0x00, 0xfd, 0xf7, 0x94, 0xfc, - 0x70, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0xa4, 0x36, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x4b, 0x1a, 0x68, 0x90, 0x68, 0x9b, 0x69, - 0x9b, 0x68, 0x83, 0x42, 0x80, 0x41, 0x40, 0x42, 0x70, 0x47, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x06, 0xf0, 0x75, 0xf8, 0x06, 0xf0, 0x8b, 0xf8, 0x05, 0x4b, - 0x1a, 0x68, 0x92, 0x68, 0x9b, 0x69, 0x9b, 0x68, 0x9a, 0x42, 0x01, 0xd9, - 0xff, 0xf7, 0x22, 0xfe, 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0xb5, 0x87, 0xb0, 0x05, 0x00, 0x0c, 0x00, 0x06, 0xf0, 0x5a, 0xf8, - 0x63, 0x1c, 0x12, 0xd0, 0x0d, 0x4b, 0x9b, 0x69, 0x0d, 0x4a, 0x21, 0x00, - 0x01, 0xa8, 0xff, 0xf7, 0xb1, 0xfe, 0x28, 0x00, 0xff, 0xf7, 0x2e, 0xfe, - 0x06, 0xf0, 0x64, 0xf8, 0x04, 0x9b, 0x00, 0x2b, 0x06, 0xd0, 0x01, 0xa8, - 0xff, 0xf7, 0x4e, 0xfe, 0x02, 0xe0, 0x28, 0x00, 0xff, 0xf7, 0x22, 0xfe, - 0x02, 0x4b, 0x9b, 0x69, 0x58, 0x6a, 0x07, 0xb0, 0x30, 0xbd, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0x21, 0xd0, 0x00, 0x08, 0x10, 0xb5, 0x00, 0x29, - 0x0a, 0xd0, 0x07, 0x4b, 0x9b, 0x69, 0x18, 0x60, 0x42, 0x68, 0x5a, 0x60, - 0x13, 0x60, 0x43, 0x60, 0x04, 0x20, 0xff, 0xf7, 0xcb, 0xff, 0x01, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0x06, 0xf0, 0x34, 0xf8, 0x00, 0x2c, 0x02, 0xd1, 0x0d, 0x48, 0x06, 0xf0, - 0x07, 0xf8, 0x20, 0x23, 0xe3, 0x5c, 0x00, 0x2b, 0x01, 0xd0, 0x0f, 0x2b, - 0x02, 0xd1, 0x09, 0x48, 0x05, 0xf0, 0xfe, 0xff, 0x00, 0x22, 0x20, 0x23, - 0xe2, 0x54, 0x07, 0x4b, 0x1b, 0x68, 0x9a, 0x68, 0xa1, 0x68, 0x8a, 0x42, - 0xfa, 0xd2, 0x23, 0x60, 0x5a, 0x68, 0x62, 0x60, 0x14, 0x60, 0x5c, 0x60, - 0x20, 0x00, 0x10, 0xbd, 0xf4, 0x36, 0x01, 0x08, 0xe8, 0x19, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x00, 0x3b, 0x4b, 0x9c, 0x69, - 0x05, 0xf0, 0xf2, 0xff, 0x00, 0x2d, 0x02, 0xd1, 0x39, 0x48, 0x05, 0xf0, - 0xdd, 0xff, 0xa8, 0x68, 0x00, 0x28, 0x44, 0xd1, 0x65, 0xe0, 0x83, 0x60, - 0x20, 0x23, 0xc3, 0x5c, 0x06, 0x2b, 0x04, 0xd0, 0x07, 0x2b, 0x1a, 0xd0, - 0x00, 0x2b, 0x3e, 0xd1, 0x2d, 0xe0, 0x01, 0x00, 0x43, 0x68, 0x02, 0x68, - 0x1a, 0x60, 0x03, 0x68, 0x42, 0x68, 0x5a, 0x60, 0x42, 0x6a, 0x13, 0x00, - 0x1b, 0x68, 0x9a, 0x42, 0x03, 0xd0, 0x9e, 0x68, 0x87, 0x68, 0xbe, 0x42, - 0xf8, 0xd2, 0x03, 0x60, 0x5a, 0x68, 0x42, 0x60, 0x11, 0x60, 0x59, 0x60, - 0x43, 0x6a, 0x98, 0x68, 0x21, 0xe0, 0x01, 0x00, 0x43, 0x68, 0x02, 0x68, - 0x1a, 0x60, 0x03, 0x68, 0x42, 0x68, 0x5a, 0x60, 0x42, 0x6a, 0x13, 0x00, - 0x1b, 0x68, 0x9a, 0x42, 0x03, 0xd0, 0x9e, 0x68, 0x87, 0x68, 0xbe, 0x42, - 0xf8, 0xd2, 0x03, 0x60, 0x5a, 0x68, 0x42, 0x60, 0x11, 0x60, 0x59, 0x60, - 0x0f, 0xe0, 0x01, 0x22, 0x20, 0x23, 0xc2, 0x54, 0x43, 0x68, 0x02, 0x68, - 0x1a, 0x60, 0x03, 0x68, 0x42, 0x68, 0x5a, 0x60, 0xff, 0xf7, 0x86, 0xff, - 0x03, 0xe0, 0xa3, 0x68, 0x82, 0x68, 0x9a, 0x42, 0xb7, 0xd3, 0x2a, 0x00, - 0x2b, 0x00, 0x1b, 0x68, 0x9a, 0x42, 0x03, 0xd0, 0x99, 0x68, 0xa0, 0x68, - 0x81, 0x42, 0xf8, 0xd2, 0x23, 0x60, 0x5a, 0x68, 0x62, 0x60, 0x14, 0x60, - 0x5c, 0x60, 0x65, 0x62, 0x06, 0x20, 0xff, 0xf7, 0x6f, 0xfd, 0xab, 0x68, - 0x9c, 0x42, 0x02, 0xd0, 0x07, 0x48, 0x05, 0xf0, 0x79, 0xff, 0xa3, 0x6b, - 0x9d, 0x42, 0x06, 0xd0, 0x04, 0x48, 0x05, 0xf0, 0x73, 0xff, 0xac, 0x60, - 0xa3, 0x6b, 0xeb, 0x60, 0xa5, 0x63, 0xf8, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x98, 0x37, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x03, 0x68, - 0x98, 0x42, 0x12, 0xd0, 0x02, 0xd1, 0x09, 0x48, 0x05, 0xf0, 0x60, 0xff, - 0x03, 0x68, 0x1a, 0x68, 0x02, 0x60, 0x50, 0x60, 0x20, 0x22, 0x9a, 0x5c, - 0x04, 0x2a, 0x02, 0xd0, 0x03, 0x48, 0x05, 0xf0, 0x55, 0xff, 0x59, 0x62, - 0x18, 0x00, 0xff, 0xf7, 0x41, 0xff, 0x10, 0xbd, 0x14, 0x37, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x00, 0x13, 0xe0, 0x23, 0x68, 0x9c, 0x42, - 0x02, 0xd1, 0x0a, 0x48, 0x05, 0xf0, 0x3e, 0xff, 0x20, 0x68, 0x03, 0x68, - 0x23, 0x60, 0x5c, 0x60, 0x20, 0x23, 0xc3, 0x5c, 0x04, 0x2b, 0x02, 0xd0, - 0x04, 0x48, 0x05, 0xf0, 0x33, 0xff, 0x45, 0x62, 0xff, 0xf7, 0x20, 0xff, - 0x23, 0x68, 0x9c, 0x42, 0xe8, 0xd1, 0x70, 0xbd, 0x14, 0x37, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x03, 0x68, 0x00, 0x2b, 0x0c, 0xd0, - 0x20, 0x22, 0x9a, 0x5c, 0x03, 0x2a, 0x02, 0xd0, 0x04, 0x48, 0x05, 0xf0, - 0x1d, 0xff, 0x00, 0x22, 0x02, 0x60, 0x59, 0x62, 0x18, 0x00, 0xff, 0xf7, - 0x07, 0xff, 0x10, 0xbd, 0xc0, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x10, 0x4b, 0x9c, 0x69, 0x60, 0x62, - 0x03, 0xe0, 0x03, 0x68, 0xa3, 0x62, 0xff, 0xf7, 0xf7, 0xfe, 0x23, 0x00, - 0x28, 0x33, 0xa0, 0x6a, 0x83, 0x42, 0xf6, 0xd1, 0x22, 0x23, 0xe3, 0x5c, - 0x00, 0x2b, 0x09, 0xd1, 0x21, 0x33, 0xe3, 0x5c, 0x9b, 0x07, 0x05, 0xd1, - 0x63, 0x69, 0x22, 0x69, 0x1a, 0x61, 0x23, 0x69, 0x62, 0x69, 0x5a, 0x61, - 0x0f, 0x20, 0xff, 0xf7, 0xe1, 0xfc, 0x02, 0x48, 0x05, 0xf0, 0xee, 0xfe, - 0xe8, 0x19, 0x00, 0x20, 0x38, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0xf8, 0xb5, 0x04, 0x00, 0x0f, 0x00, 0x1a, 0x4d, 0xae, 0x69, 0x05, 0xf0, - 0xf1, 0xfe, 0x2b, 0x68, 0xab, 0x42, 0x08, 0xd0, 0x16, 0x4a, 0x92, 0x69, - 0x92, 0x68, 0x9b, 0x68, 0x9a, 0x42, 0x02, 0xd2, 0x14, 0x48, 0x05, 0xf0, - 0xd5, 0xfe, 0x67, 0x62, 0xa3, 0x68, 0xb2, 0x68, 0x93, 0x42, 0x03, 0xd8, - 0x20, 0x00, 0xff, 0xf7, 0xbd, 0xfe, 0x19, 0xe0, 0x30, 0x00, 0xff, 0xf7, - 0x69, 0xfc, 0x05, 0x00, 0x0b, 0x4b, 0x9c, 0x61, 0x01, 0x22, 0x20, 0x23, - 0xe2, 0x54, 0x01, 0x00, 0x20, 0x00, 0x05, 0xf0, 0x97, 0xfe, 0xef, 0xf3, - 0x09, 0x83, 0x24, 0x3b, 0xea, 0x69, 0x9a, 0x42, 0x02, 0xd9, 0x06, 0x48, - 0x05, 0xf0, 0xb6, 0xfe, 0x29, 0x00, 0x20, 0x00, 0xfd, 0xf7, 0xc6, 0xfa, - 0xf8, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0x4c, 0x37, 0x01, 0x08, - 0xa4, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, - 0x72, 0xb6, 0x05, 0xf0, 0x33, 0xff, 0x20, 0x23, 0xe3, 0x5c, 0x07, 0x2b, - 0x17, 0xd8, 0x9b, 0x00, 0x10, 0x4a, 0xd3, 0x58, 0x9f, 0x46, 0x05, 0xf0, - 0x11, 0xff, 0x62, 0xb6, 0x18, 0xe0, 0x63, 0x6a, 0x00, 0x22, 0x1a, 0x60, - 0x0b, 0xe0, 0x65, 0x6a, 0x05, 0xf0, 0xb8, 0xfe, 0xab, 0x68, 0x01, 0x33, - 0xab, 0x60, 0x63, 0x68, 0x22, 0x68, 0x1a, 0x60, 0x23, 0x68, 0x62, 0x68, - 0x5a, 0x60, 0x01, 0x23, 0x5b, 0x42, 0x63, 0x62, 0x20, 0x00, 0xff, 0xf7, - 0x71, 0xfe, 0x05, 0xf0, 0xf7, 0xfe, 0x62, 0xb6, 0x70, 0xbd, 0xc0, 0x46, - 0x18, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4b, 0x1b, 0x60, - 0x5b, 0x60, 0x00, 0x22, 0x9a, 0x60, 0x1b, 0x61, 0x5b, 0x61, 0x70, 0x47, - 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x05, 0xf0, 0x8d, 0xfe, 0x28, 0x4b, - 0xdc, 0x69, 0x04, 0xf0, 0xb1, 0xfb, 0x26, 0x4b, 0x9d, 0x6a, 0x45, 0x1b, - 0xa3, 0x68, 0xab, 0x42, 0x23, 0xd8, 0x23, 0x4b, 0x9a, 0x6a, 0xa1, 0x68, - 0x8c, 0x46, 0x62, 0x44, 0x9a, 0x62, 0xa2, 0x68, 0xad, 0x1a, 0x21, 0x68, - 0x1a, 0x00, 0x1c, 0x32, 0x4a, 0x60, 0x21, 0x68, 0xd9, 0x61, 0xe6, 0x68, - 0x00, 0x21, 0xe1, 0x60, 0xdb, 0x69, 0x93, 0x42, 0x01, 0xd1, 0x04, 0xf0, - 0xad, 0xfb, 0x05, 0xf0, 0xbb, 0xfe, 0x62, 0xb6, 0x20, 0x69, 0xb0, 0x47, - 0x72, 0xb6, 0x05, 0xf0, 0xcd, 0xfe, 0x14, 0x4b, 0xdc, 0x69, 0xa3, 0x68, - 0x9d, 0x42, 0xdc, 0xd2, 0xd3, 0xe7, 0x11, 0x4b, 0xda, 0x69, 0x1c, 0x33, - 0x9a, 0x42, 0x1b, 0xd0, 0x0e, 0x49, 0x88, 0x62, 0x93, 0x68, 0x5d, 0x1b, - 0x95, 0x60, 0xa3, 0x68, 0x8c, 0x6a, 0x04, 0x1b, 0x1c, 0x1b, 0x01, 0x2c, - 0x00, 0xd8, 0x02, 0x24, 0x24, 0x18, 0x20, 0x00, 0x04, 0xf0, 0x7a, 0xfb, - 0x06, 0x4d, 0xae, 0x6a, 0x04, 0xf0, 0x6e, 0xfb, 0x83, 0x1b, 0xa8, 0x6a, - 0x20, 0x1a, 0x83, 0x42, 0x02, 0xd9, 0x03, 0x48, 0x05, 0xf0, 0x16, 0xfe, - 0x70, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0xa4, 0x37, 0x01, 0x08, - 0x05, 0x4b, 0x1a, 0x00, 0x1c, 0x32, 0xda, 0x61, 0x1a, 0x62, 0x01, 0x22, - 0x52, 0x42, 0x5a, 0x62, 0x00, 0x22, 0x9a, 0x62, 0x70, 0x47, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0x72, 0xb6, 0x05, 0xf0, 0xf3, 0xfe, 0x20, 0x00, 0xff, 0xf7, 0xe8, 0xfe, - 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x28, 0x02, 0xd1, 0x0e, 0x48, - 0x05, 0xf0, 0xf0, 0xfd, 0x72, 0xb6, 0x05, 0xf0, 0xe5, 0xfe, 0x29, 0x00, - 0x20, 0x00, 0x05, 0xf0, 0x89, 0xfb, 0xff, 0xf7, 0x7f, 0xfd, 0x05, 0xf0, - 0xc5, 0xfe, 0x08, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, 0x05, 0xf0, - 0xd9, 0xfd, 0x62, 0xb6, 0x70, 0xbd, 0xc0, 0x46, 0x6c, 0x37, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0x90, 0x44, 0x01, 0x08, 0xf8, 0xb5, 0x06, 0x1e, - 0x28, 0x4b, 0x9c, 0x69, 0x02, 0xd1, 0x28, 0x48, 0x05, 0xf0, 0xc8, 0xfd, - 0x72, 0xb6, 0x05, 0xf0, 0xbd, 0xfe, 0xa3, 0x6b, 0x00, 0x2b, 0x02, 0xd1, - 0x23, 0x48, 0x05, 0xf0, 0xbf, 0xfd, 0xa3, 0x6b, 0x9b, 0x68, 0x9c, 0x42, - 0x02, 0xd0, 0x20, 0x48, 0x05, 0xf0, 0xb8, 0xfd, 0xa3, 0x6b, 0x9e, 0x42, - 0x02, 0xd0, 0x1d, 0x48, 0x05, 0xf0, 0xb2, 0xfd, 0xf3, 0x68, 0xa3, 0x63, - 0x05, 0xf0, 0xbe, 0xfd, 0x33, 0x68, 0x9e, 0x42, 0x1c, 0xd0, 0xe7, 0x6b, - 0xa5, 0x6b, 0x09, 0xe0, 0x05, 0xf0, 0xb6, 0xfd, 0x2b, 0x68, 0x9d, 0x42, - 0x03, 0xd0, 0x9b, 0x68, 0x9f, 0x42, 0x00, 0xd2, 0x1f, 0x00, 0xed, 0x68, - 0x00, 0x2d, 0xf3, 0xd1, 0xa7, 0x60, 0x30, 0x68, 0x03, 0x68, 0x33, 0x60, - 0x5e, 0x60, 0xb0, 0x60, 0x83, 0x6b, 0xf3, 0x60, 0x86, 0x63, 0xff, 0xf7, - 0x81, 0xfd, 0xff, 0xf7, 0x27, 0xfd, 0x01, 0xe0, 0x00, 0x23, 0xb3, 0x60, - 0x05, 0xf0, 0x6a, 0xfe, 0x06, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, - 0x05, 0xf0, 0x7e, 0xfd, 0x62, 0xb6, 0xf8, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x50, 0x36, 0x01, 0x08, 0x98, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0x72, 0xb6, 0x05, 0xf0, 0x63, 0xfe, 0x20, 0x00, 0xff, 0xf7, 0x80, 0xfd, - 0x05, 0xf0, 0x46, 0xfe, 0x06, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, - 0x05, 0xf0, 0x5a, 0xfd, 0x62, 0xb6, 0x10, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x98, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x72, 0xb6, 0x05, 0xf0, 0x44, 0xfe, 0x0b, 0x4c, 0x25, 0x69, - 0x22, 0x22, 0xab, 0x5c, 0x01, 0x33, 0xab, 0x54, 0x05, 0xf0, 0x24, 0xfe, - 0x23, 0x68, 0xa3, 0x42, 0x08, 0xd0, 0x06, 0x4a, 0x92, 0x69, 0x92, 0x68, - 0x9b, 0x68, 0x9a, 0x42, 0x02, 0xd2, 0x04, 0x48, 0x05, 0xf0, 0x38, 0xfd, - 0x62, 0xb6, 0x28, 0x00, 0x70, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0xb4, 0x36, 0x01, 0x08, 0x10, 0xb5, 0x05, 0xf0, 0x0d, 0xfe, 0x07, 0x4b, - 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, - 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, 0x05, 0xf0, 0x21, 0xfd, 0x62, 0xb6, - 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0x8c, 0x36, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, 0xff, 0x28, 0x02, 0xd9, - 0x0b, 0x48, 0x05, 0xf0, 0x11, 0xfd, 0x72, 0xb6, 0x05, 0xf0, 0x06, 0xfe, - 0x09, 0x4b, 0x9b, 0x69, 0xdd, 0x6b, 0x9a, 0x68, 0x95, 0x42, 0x01, 0xd0, - 0x94, 0x42, 0x00, 0xd9, 0x9c, 0x60, 0x05, 0x4b, 0x9b, 0x69, 0xdc, 0x63, - 0xff, 0xf7, 0x98, 0xfc, 0xff, 0xf7, 0xce, 0xff, 0x28, 0x00, 0x70, 0xbd, - 0x68, 0x36, 0x01, 0x08, 0xe8, 0x19, 0x00, 0x20, 0x10, 0xb5, 0x04, 0x00, - 0x72, 0xb6, 0x05, 0xf0, 0xeb, 0xfd, 0x00, 0x2c, 0x02, 0xd1, 0x0b, 0x48, - 0x05, 0xf0, 0xee, 0xfc, 0x21, 0x00, 0x08, 0x20, 0xff, 0xf7, 0x9a, 0xfc, - 0x05, 0xf0, 0xc8, 0xfd, 0x07, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, - 0x05, 0xf0, 0xdc, 0xfc, 0x62, 0xb6, 0x10, 0xbd, 0xd0, 0x36, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0x8c, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, 0x72, 0xb6, 0x05, 0xf0, - 0xc3, 0xfd, 0x21, 0x22, 0xa1, 0x5c, 0x04, 0x23, 0x0b, 0x43, 0xa3, 0x54, - 0x05, 0xf0, 0xa4, 0xfd, 0x06, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, - 0x05, 0xf0, 0xb8, 0xfc, 0x62, 0xb6, 0x10, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x8c, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0x72, 0xb6, 0x05, 0xf0, 0xa3, 0xfd, 0x22, 0x23, 0xe3, 0x5c, 0x00, 0x2b, - 0x02, 0xd1, 0x21, 0x48, 0x05, 0xf0, 0xa4, 0xfc, 0x22, 0x22, 0xa3, 0x5c, - 0x01, 0x3b, 0xa3, 0x54, 0x1e, 0x4b, 0x22, 0x6a, 0x13, 0x40, 0x0f, 0x2b, - 0x26, 0xd1, 0x63, 0x69, 0x22, 0x69, 0x1a, 0x61, 0x23, 0x69, 0x62, 0x69, - 0x5a, 0x61, 0x05, 0xf0, 0x73, 0xfd, 0x19, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x15, 0x48, 0x05, 0xf0, 0x87, 0xfc, 0x62, 0xb6, 0x21, 0x23, 0xe3, 0x5c, - 0x03, 0x22, 0x13, 0x40, 0x01, 0x2b, 0x02, 0xd0, 0x02, 0x2b, 0x04, 0xd0, - 0x17, 0xe0, 0xe0, 0x69, 0x05, 0xf0, 0x7a, 0xf9, 0x13, 0xe0, 0x20, 0x6c, - 0xe1, 0x69, 0x05, 0xf0, 0x65, 0xfa, 0x0e, 0xe0, 0x05, 0xf0, 0x52, 0xfd, - 0x08, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, - 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x05, 0x48, 0x05, 0xf0, 0x66, 0xfc, - 0x62, 0xb6, 0x10, 0xbd, 0x88, 0x37, 0x01, 0x08, 0xff, 0x00, 0xff, 0x00, - 0xe8, 0x19, 0x00, 0x20, 0x8c, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x00, 0x72, 0xb6, 0x05, 0xf0, - 0x4b, 0xfd, 0x2c, 0x69, 0x11, 0x4b, 0x9c, 0x42, 0x0b, 0xd0, 0x22, 0x23, - 0xe3, 0x5c, 0xff, 0x2b, 0x02, 0xd1, 0x0f, 0x48, 0x05, 0xf0, 0x48, 0xfc, - 0x22, 0x22, 0xa3, 0x5c, 0x01, 0x33, 0xa3, 0x54, 0x00, 0xe0, 0x00, 0x24, - 0x05, 0xf0, 0x20, 0xfd, 0x08, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x06, 0x48, - 0x05, 0xf0, 0x34, 0xfc, 0x62, 0xb6, 0x28, 0x00, 0xff, 0xf7, 0x80, 0xff, - 0x20, 0x00, 0x70, 0xbd, 0xe8, 0x19, 0x00, 0x20, 0x7c, 0x36, 0x01, 0x08, - 0xb4, 0x36, 0x01, 0x08, 0x10, 0xb5, 0x04, 0x00, 0xff, 0xf7, 0xd4, 0xfe, - 0xc3, 0x69, 0xa3, 0x42, 0x03, 0xd0, 0xff, 0xf7, 0xc7, 0xff, 0x00, 0x28, - 0xf8, 0xd1, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x1e, 0x02, 0xd1, 0x1a, 0x48, 0x05, 0xf0, 0x12, 0xfc, - 0x72, 0xb6, 0x05, 0xf0, 0x07, 0xfd, 0x18, 0x4b, 0x9b, 0x69, 0x9c, 0x42, - 0x02, 0xd1, 0x15, 0x48, 0x05, 0xf0, 0x08, 0xfc, 0x22, 0x23, 0xe3, 0x5c, - 0x00, 0x2b, 0x02, 0xd1, 0x11, 0x48, 0x05, 0xf0, 0x01, 0xfc, 0x20, 0x23, - 0xe3, 0x5c, 0x0f, 0x2b, 0x07, 0xd0, 0x0f, 0x4b, 0x9b, 0x69, 0xa2, 0x6a, - 0x1a, 0x60, 0xa3, 0x62, 0x09, 0x20, 0xff, 0xf7, 0xe5, 0xf9, 0x65, 0x6a, - 0x05, 0xf0, 0xd2, 0xfc, 0x09, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x06, 0x48, - 0x05, 0xf0, 0xe6, 0xfb, 0x62, 0xb6, 0x20, 0x00, 0xff, 0xf7, 0x32, 0xff, - 0x28, 0x00, 0x70, 0xbd, 0x5c, 0x36, 0x01, 0x08, 0xe8, 0x19, 0x00, 0x20, - 0x8c, 0x36, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0x40, 0x68, 0xff, 0xf7, 0xab, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x11, 0x48, - 0x05, 0xf0, 0xce, 0xfb, 0x55, 0x22, 0xa1, 0x68, 0x60, 0x68, 0xff, 0xf7, - 0xc9, 0xfa, 0x72, 0xb6, 0x05, 0xf0, 0xbe, 0xfc, 0x20, 0x00, 0xff, 0xf7, - 0xeb, 0xfa, 0x04, 0x00, 0x00, 0x21, 0xff, 0xf7, 0xd7, 0xfc, 0x05, 0xf0, - 0x9d, 0xfc, 0x08, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, 0x05, 0xf0, - 0xb1, 0xfb, 0x62, 0xb6, 0x20, 0x00, 0x10, 0xbd, 0x40, 0x37, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0x8c, 0x36, 0x01, 0x08, 0x70, 0x47, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x83, 0xb0, 0x85, 0x68, 0x18, 0x4b, 0x1f, 0x88, 0xa5, 0x20, - 0x40, 0x00, 0x78, 0x43, 0x6b, 0x88, 0x01, 0x93, 0x19, 0x00, 0xfd, 0xf7, - 0x59, 0xf8, 0x04, 0xb2, 0x2e, 0x88, 0x77, 0x43, 0xba, 0x00, 0xd3, 0x19, - 0x58, 0x00, 0x01, 0x99, 0xfd, 0xf7, 0x50, 0xf8, 0x0f, 0x4b, 0x19, 0x88, - 0x0a, 0x23, 0x5b, 0x42, 0x4b, 0x43, 0x18, 0x18, 0x00, 0xb2, 0x83, 0x00, - 0x1b, 0x18, 0x18, 0x01, 0x0b, 0x4b, 0x1b, 0x88, 0x59, 0x1a, 0xfd, 0xf7, - 0x41, 0xf8, 0x2d, 0x30, 0xff, 0x30, 0x09, 0x4b, 0x56, 0x22, 0x9e, 0x52, - 0x69, 0x88, 0x02, 0x32, 0x99, 0x52, 0x04, 0x32, 0x98, 0x52, 0x02, 0x32, - 0x9c, 0x52, 0x03, 0xb0, 0xf0, 0xbd, 0xc0, 0x46, 0xba, 0xf7, 0xff, 0x1f, - 0xb8, 0xf7, 0xff, 0x1f, 0xc2, 0xf7, 0xff, 0x1f, 0x40, 0x08, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x00, - 0x05, 0xf0, 0x6c, 0xfc, 0x04, 0x00, 0x01, 0x21, 0x28, 0x00, 0x05, 0xf0, - 0xf7, 0xf8, 0x20, 0x00, 0x05, 0xf0, 0x94, 0xfc, 0x70, 0xbd, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x00, 0x05, 0xf0, 0x5c, 0xfc, - 0x04, 0x00, 0x05, 0x2d, 0x05, 0xd1, 0x07, 0x4b, 0x18, 0x68, 0x02, 0x21, - 0x05, 0xf0, 0xe4, 0xf8, 0x04, 0xe0, 0x04, 0x4b, 0x18, 0x68, 0x01, 0x21, - 0x05, 0xf0, 0xde, 0xf8, 0x20, 0x00, 0x05, 0xf0, 0x7b, 0xfc, 0x70, 0xbd, - 0x84, 0x19, 0x00, 0x20, 0x10, 0xb5, 0x07, 0x4b, 0x1c, 0x68, 0x07, 0xe0, - 0xe3, 0x69, 0x00, 0x2b, 0x03, 0xd1, 0x20, 0x00, 0xff, 0xf7, 0x56, 0xff, - 0xe0, 0x61, 0x24, 0x6a, 0x00, 0x2c, 0xf5, 0xd1, 0x10, 0xbd, 0xc0, 0x46, - 0x40, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, 0x20, 0x00, 0x03, 0xf0, - 0xdb, 0xff, 0x01, 0x23, 0x05, 0x4a, 0x06, 0x49, 0x20, 0x00, 0x04, 0xf0, - 0xbd, 0xf9, 0x20, 0x00, 0x03, 0xf0, 0xc2, 0xff, 0x10, 0xbd, 0xc0, 0x46, - 0xc0, 0x18, 0x00, 0x20, 0x70, 0x17, 0x00, 0x20, 0x10, 0x08, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, 0x13, 0x00, 0x09, 0x4a, - 0x12, 0x69, 0x80, 0x69, 0x02, 0xf0, 0x20, 0xfe, 0x01, 0x28, 0x08, 0xd0, - 0x02, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x05, 0xe0, 0x60, 0x68, 0xfe, 0xf7, - 0x27, 0xf9, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x10, 0xbd, 0xc0, 0x46, - 0xa8, 0x08, 0x00, 0x20, 0xf0, 0xb5, 0x57, 0x46, 0x4e, 0x46, 0x45, 0x46, - 0xe0, 0xb4, 0x8c, 0xb0, 0x40, 0x23, 0xc3, 0x5c, 0x00, 0x2b, 0x03, 0xd0, - 0x00, 0x29, 0x03, 0xd0, 0x01, 0x21, 0x02, 0xe0, 0x01, 0x21, 0x00, 0xe0, - 0x00, 0x21, 0x42, 0x7e, 0x00, 0x2a, 0x04, 0xd0, 0x02, 0x69, 0x12, 0x78, - 0x52, 0xb2, 0x05, 0x2a, 0x03, 0xd0, 0x00, 0x23, 0x43, 0x64, 0x83, 0x64, - 0x89, 0xe0, 0x00, 0x29, 0x00, 0xd1, 0x86, 0xe0, 0xc2, 0x6b, 0x00, 0x2a, - 0x20, 0xd0, 0x00, 0x2b, 0x20, 0xd0, 0x13, 0x7f, 0x00, 0x2b, 0x1f, 0xd0, - 0x00, 0x25, 0x1e, 0xe0, 0x83, 0x7e, 0x2a, 0x00, 0x09, 0x32, 0xd2, 0x00, - 0x82, 0x18, 0x04, 0x32, 0x01, 0x00, 0x1c, 0x31, 0x2c, 0x00, 0x10, 0x34, - 0xa4, 0x00, 0x04, 0x19, 0x00, 0x26, 0x66, 0x60, 0x06, 0xe0, 0x14, 0x78, - 0x0e, 0x68, 0x34, 0x70, 0x01, 0x3b, 0x1b, 0xb2, 0x04, 0x31, 0x01, 0x32, - 0x01, 0x24, 0x00, 0x2b, 0xf5, 0xdc, 0x05, 0xe0, 0x00, 0x25, 0x02, 0xe0, - 0x00, 0x25, 0x00, 0xe0, 0x01, 0x25, 0x00, 0x24, 0x2b, 0x00, 0x10, 0x33, - 0x9b, 0x00, 0xc3, 0x18, 0x5b, 0x68, 0x00, 0x2b, 0xd8, 0xd1, 0x00, 0x2c, - 0x53, 0xd0, 0x43, 0x68, 0x1a, 0x00, 0x01, 0x93, 0xe5, 0x23, 0x9b, 0x00, - 0xd3, 0x58, 0x00, 0x2b, 0x4b, 0xd0, 0xc2, 0x68, 0x13, 0x1d, 0x16, 0x78, - 0x45, 0xe0, 0x1a, 0x1d, 0x92, 0x46, 0x1c, 0x68, 0x23, 0x0c, 0x99, 0x46, - 0x24, 0x0a, 0xe3, 0xb2, 0x98, 0x46, 0x49, 0x46, 0x01, 0x9c, 0x20, 0x00, - 0xfd, 0xf7, 0x2c, 0xfd, 0x05, 0x00, 0x20, 0x4b, 0x98, 0x42, 0x31, 0xd0, - 0xe5, 0x23, 0x9b, 0x00, 0x01, 0x94, 0xe1, 0x58, 0x43, 0x00, 0x1b, 0x18, - 0x9a, 0x00, 0x8c, 0x18, 0x23, 0x68, 0x00, 0x2b, 0x26, 0xd0, 0x03, 0xaf, - 0x24, 0x22, 0x00, 0x21, 0x38, 0x00, 0x05, 0xf0, 0x77, 0xfe, 0x4b, 0x46, - 0xbb, 0x82, 0x43, 0x46, 0xbb, 0x75, 0x63, 0x68, 0x03, 0x93, 0x42, 0x46, - 0x29, 0x00, 0x01, 0x98, 0xfd, 0xf7, 0x9c, 0xfc, 0xf8, 0x81, 0x42, 0x46, - 0x29, 0x00, 0x01, 0x98, 0xfd, 0xf7, 0x4e, 0xfc, 0x38, 0x61, 0x42, 0x46, - 0x29, 0x00, 0x01, 0x98, 0xfd, 0xf7, 0x60, 0xfc, 0x78, 0x60, 0x42, 0x46, - 0x29, 0x00, 0x01, 0x98, 0xfd, 0xf7, 0xc2, 0xfc, 0xb8, 0x81, 0x23, 0x68, - 0x38, 0x00, 0x98, 0x47, 0x73, 0x1e, 0x1e, 0xb2, 0x53, 0x46, 0x00, 0x2e, - 0xb7, 0xdc, 0x0c, 0xb0, 0x1c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xa2, 0x46, - 0xf0, 0xbd, 0xc0, 0x46, 0xff, 0xff, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x00, - 0x0d, 0x00, 0x00, 0x24, 0x08, 0xe0, 0xa3, 0x1d, 0x9b, 0x00, 0xf3, 0x18, - 0x58, 0x68, 0x29, 0x00, 0xff, 0xf7, 0x44, 0xff, 0x01, 0x34, 0x24, 0xb2, - 0x03, 0x2c, 0xf4, 0xdd, 0x70, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x5f, 0x46, - 0x56, 0x46, 0x45, 0x46, 0xe0, 0xb4, 0x8c, 0xb0, 0x83, 0x46, 0x43, 0x68, - 0x1a, 0x00, 0x00, 0x93, 0xe5, 0x23, 0x9b, 0x00, 0xd3, 0x58, 0x00, 0x2b, - 0x4d, 0xd0, 0xc2, 0x68, 0x13, 0x1d, 0x17, 0x78, 0x47, 0xe0, 0x1a, 0x1d, - 0x90, 0x46, 0x1c, 0x68, 0x23, 0x0c, 0x9a, 0x46, 0x24, 0x0a, 0xe3, 0xb2, - 0x01, 0x93, 0x51, 0x46, 0x00, 0x9c, 0x20, 0x00, 0xfd, 0xf7, 0xb0, 0xfc, - 0x05, 0x00, 0x2d, 0x4b, 0x98, 0x42, 0x33, 0xd0, 0xe5, 0x23, 0x9b, 0x00, - 0x00, 0x94, 0xe1, 0x58, 0x43, 0x00, 0x1b, 0x18, 0x9a, 0x00, 0x8c, 0x18, - 0x21, 0x68, 0x00, 0x29, 0x28, 0xd0, 0x03, 0xae, 0x24, 0x22, 0x00, 0x21, - 0x30, 0x00, 0x05, 0xf0, 0xfb, 0xfd, 0x01, 0x23, 0xf3, 0x75, 0x51, 0x46, - 0xb1, 0x82, 0x01, 0x9b, 0xb3, 0x75, 0x61, 0x68, 0x03, 0x91, 0x1a, 0x00, - 0x29, 0x00, 0x00, 0x98, 0xfd, 0xf7, 0x1e, 0xfc, 0xf0, 0x81, 0x01, 0x9a, - 0x29, 0x00, 0x00, 0x98, 0xfd, 0xf7, 0xd0, 0xfb, 0x30, 0x61, 0x01, 0x9a, - 0x29, 0x00, 0x00, 0x98, 0xfd, 0xf7, 0xe2, 0xfb, 0x70, 0x60, 0x01, 0x9a, - 0x29, 0x00, 0x00, 0x98, 0xfd, 0xf7, 0x44, 0xfc, 0xb0, 0x81, 0x23, 0x68, - 0x30, 0x00, 0x98, 0x47, 0x7b, 0x1e, 0x1f, 0xb2, 0x43, 0x46, 0x00, 0x2f, - 0xb5, 0xdc, 0x5b, 0x46, 0x9b, 0x7e, 0x5a, 0x46, 0x12, 0x6d, 0x08, 0x32, - 0x59, 0x46, 0x1c, 0x31, 0x06, 0xe0, 0x08, 0x68, 0x00, 0x78, 0x10, 0x70, - 0x01, 0x3b, 0x1b, 0xb2, 0x04, 0x31, 0x01, 0x32, 0x00, 0x2b, 0xf6, 0xdc, - 0x00, 0x23, 0x5a, 0x46, 0xd3, 0x76, 0x11, 0x6d, 0xd0, 0x6c, 0xfe, 0xf7, - 0x2b, 0xf8, 0x0c, 0xb0, 0x1c, 0xbc, 0x90, 0x46, 0x9a, 0x46, 0xa3, 0x46, - 0xf0, 0xbd, 0xc0, 0x46, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x00, 0x1d, 0x00, 0xc3, 0x6b, 0x93, 0x42, 0x01, 0xd9, - 0x9b, 0x1a, 0x00, 0xe0, 0x00, 0x23, 0xe3, 0x63, 0x20, 0x6c, 0x82, 0x42, - 0x01, 0xd2, 0x80, 0x1a, 0x00, 0xe0, 0x00, 0x20, 0x20, 0x64, 0x62, 0x7e, - 0x00, 0x2a, 0x6f, 0xd0, 0x22, 0x69, 0x12, 0x78, 0x52, 0xb2, 0x05, 0x2a, - 0x6a, 0xd1, 0xa6, 0x68, 0x32, 0x7a, 0xfc, 0x2a, 0x2d, 0xd9, 0x00, 0x2b, - 0x16, 0xd1, 0xe3, 0x7e, 0x00, 0x2b, 0x04, 0xd1, 0xf3, 0x89, 0x00, 0x2b, - 0x10, 0xd0, 0x00, 0x28, 0x0e, 0xd1, 0x20, 0x00, 0xff, 0xf7, 0x56, 0xff, - 0x00, 0x28, 0x09, 0xd1, 0xa2, 0x68, 0x51, 0x89, 0x64, 0x23, 0x4b, 0x43, - 0xe3, 0x63, 0xd2, 0x89, 0xfa, 0x23, 0x9b, 0x00, 0x53, 0x43, 0x23, 0x64, - 0x00, 0x2d, 0x54, 0xd0, 0xe3, 0x7e, 0x00, 0x2b, 0x05, 0xd0, 0xe3, 0x6b, - 0x2a, 0x68, 0x9a, 0x42, 0x01, 0xd9, 0x2b, 0x60, 0x4b, 0xe0, 0xa3, 0x68, - 0xdb, 0x89, 0x00, 0x2b, 0x47, 0xd0, 0x23, 0x6c, 0x2a, 0x68, 0x9a, 0x42, - 0x43, 0xd9, 0x2b, 0x60, 0x41, 0xe0, 0xa3, 0x6c, 0x00, 0x2b, 0x3e, 0xd0, - 0x00, 0x29, 0x3c, 0xd0, 0x00, 0x2a, 0x06, 0xd1, 0xe3, 0x7e, 0x00, 0x2b, - 0x37, 0xd0, 0x20, 0x00, 0xff, 0xf7, 0x28, 0xff, 0x33, 0xe0, 0x45, 0x21, - 0x61, 0x5c, 0xff, 0x29, 0x0b, 0xd1, 0x19, 0x7d, 0x00, 0x29, 0x06, 0xd0, - 0x31, 0x7c, 0x00, 0x29, 0x03, 0xd0, 0xfe, 0x21, 0x45, 0x22, 0xa1, 0x54, - 0x01, 0xe0, 0x45, 0x21, 0x62, 0x54, 0x45, 0x22, 0xa2, 0x5c, 0xfe, 0x2a, - 0x0a, 0xd1, 0x5a, 0x7f, 0x33, 0x7c, 0x9a, 0x42, 0x1b, 0xd1, 0x32, 0x7a, - 0x45, 0x23, 0xe2, 0x54, 0x20, 0x00, 0xff, 0xf7, 0x09, 0xff, 0x14, 0xe0, - 0x01, 0x3a, 0xd2, 0xb2, 0x45, 0x23, 0xe2, 0x54, 0x00, 0x2a, 0x0e, 0xd1, - 0x32, 0x7a, 0xe2, 0x54, 0x20, 0x00, 0xff, 0xf7, 0xfd, 0xfe, 0x08, 0xe0, - 0xa3, 0x68, 0x1b, 0x7a, 0xfd, 0x2b, 0x02, 0xd9, 0x01, 0x23, 0xe3, 0x76, - 0x01, 0xe0, 0x00, 0x23, 0xe3, 0x76, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x85, 0xb0, 0x06, 0x00, 0x01, 0x91, 0x02, 0x92, 0x03, 0x93, - 0x00, 0x25, 0x17, 0xe0, 0x2c, 0x00, 0x2b, 0x00, 0x0a, 0x33, 0x9b, 0x00, - 0xf3, 0x18, 0x5f, 0x68, 0xfb, 0x7e, 0x00, 0x2b, 0x03, 0xd1, 0x38, 0x00, - 0x02, 0xf0, 0x74, 0xfa, 0xf8, 0x76, 0x0a, 0x34, 0xa4, 0x00, 0x34, 0x19, - 0x60, 0x68, 0x03, 0x9b, 0x02, 0x9a, 0x01, 0x99, 0xff, 0xf7, 0x52, 0xff, - 0x6b, 0x1c, 0x1d, 0xb2, 0x03, 0x2d, 0xe5, 0xdd, 0x05, 0xb0, 0xf0, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xc0, 0x22, - 0x0b, 0x49, 0x80, 0x20, 0x80, 0x05, 0x05, 0xf0, 0x67, 0xfc, 0xbf, 0xf3, - 0x4f, 0x8f, 0x09, 0x4a, 0x91, 0x69, 0x01, 0x23, 0x0b, 0x43, 0x93, 0x61, - 0xbf, 0xf3, 0x4f, 0x8f, 0x06, 0x4a, 0x11, 0x68, 0x03, 0x23, 0x0b, 0x43, - 0x13, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x10, 0xbd, - 0x00, 0xa4, 0x00, 0x08, 0x00, 0x10, 0x02, 0x40, 0x00, 0x00, 0x01, 0x40, - 0x70, 0xb5, 0x05, 0x00, 0x0a, 0x4b, 0x1c, 0x68, 0x0f, 0xe0, 0xe0, 0x69, - 0x00, 0x28, 0x0b, 0xd0, 0x23, 0x7e, 0x00, 0x2b, 0x01, 0xd0, 0x00, 0x2d, - 0x06, 0xd0, 0xff, 0xf7, 0xf1, 0xfb, 0xe0, 0x69, 0xff, 0xf7, 0xa6, 0xfc, - 0x00, 0x23, 0xe3, 0x61, 0x24, 0x6a, 0x00, 0x2c, 0xed, 0xd1, 0x70, 0xbd, - 0x40, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x01, 0x28, 0x02, 0xd1, 0xff, 0xf7, - 0x73, 0xfd, 0x02, 0xe0, 0x00, 0x20, 0xff, 0xf7, 0xd7, 0xff, 0x10, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x08, 0x4b, 0x1c, 0x68, 0x0a, 0xe0, 0xe3, 0x69, 0x00, 0x2b, - 0x06, 0xd1, 0x23, 0x7e, 0x00, 0x2b, 0x03, 0xd0, 0x20, 0x00, 0xff, 0xf7, - 0xbb, 0xfc, 0xe0, 0x61, 0x24, 0x6a, 0x00, 0x2c, 0xf2, 0xd1, 0x10, 0xbd, - 0x40, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x00, 0x28, 0x02, 0xd1, 0x06, 0x48, 0x05, 0xf0, 0x82, 0xf8, - 0x05, 0x4b, 0x1b, 0x68, 0x00, 0x2b, 0x01, 0xd0, 0x03, 0x62, 0x58, 0x62, - 0x02, 0x4b, 0x18, 0x60, 0x10, 0xbd, 0xc0, 0x46, 0xb0, 0x37, 0x01, 0x08, - 0x40, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0xb5, 0x06, 0xac, 0x25, 0x78, 0x00, 0x24, 0xc4, 0x61, 0x04, 0x62, - 0x44, 0x62, 0x05, 0x76, 0x01, 0x60, 0x42, 0x60, 0xd3, 0x18, 0x83, 0x60, - 0x03, 0x9b, 0xc3, 0x60, 0x04, 0x9b, 0x03, 0x61, 0x05, 0x9b, 0x43, 0x61, - 0x30, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x00, 0x21, 0x0b, 0x48, 0x03, 0xf0, 0xdb, 0xfe, 0xc0, 0x22, - 0x12, 0x04, 0x0a, 0x4b, 0x1a, 0x60, 0x0a, 0x4b, 0x19, 0x88, 0x0a, 0x4b, - 0x86, 0x22, 0x92, 0x00, 0x99, 0x52, 0x09, 0x4a, 0x11, 0x88, 0x09, 0x4a, - 0x99, 0x52, 0x09, 0x4a, 0x11, 0x88, 0x87, 0x22, 0x92, 0x00, 0x99, 0x52, - 0x10, 0xbd, 0xc0, 0x46, 0xc0, 0x18, 0x00, 0x20, 0x08, 0x27, 0x01, 0x40, - 0xb8, 0xf7, 0xff, 0x1f, 0xa8, 0x08, 0x00, 0x20, 0xc2, 0xf7, 0xff, 0x1f, - 0x1a, 0x02, 0x00, 0x00, 0xba, 0xf7, 0xff, 0x1f, 0x10, 0xb5, 0x03, 0x00, - 0x04, 0x30, 0x1b, 0x68, 0x19, 0x40, 0x04, 0xf0, 0xa1, 0xfd, 0x10, 0xbd, - 0xf0, 0xb5, 0x5f, 0x46, 0x56, 0x46, 0x4d, 0x46, 0x44, 0x46, 0xf0, 0xb4, - 0x8f, 0xb0, 0x0b, 0x90, 0xb1, 0x4b, 0x1b, 0x68, 0x00, 0x22, 0x1a, 0x70, - 0x43, 0xb2, 0x00, 0x2b, 0x00, 0xdc, 0x52, 0xe1, 0x00, 0x24, 0x43, 0xe0, - 0x00, 0x2c, 0x0c, 0xd1, 0x0b, 0x9a, 0x13, 0x00, 0xc0, 0x20, 0xc0, 0x00, - 0x84, 0x46, 0x63, 0x44, 0x19, 0x00, 0x13, 0x00, 0x80, 0x38, 0x84, 0x46, - 0x63, 0x44, 0x1a, 0x00, 0x08, 0xe0, 0xa6, 0x48, 0x63, 0x00, 0x1a, 0x19, - 0x91, 0x00, 0x0a, 0x00, 0x41, 0x18, 0x89, 0x6e, 0x82, 0x18, 0xd2, 0x6e, - 0xa0, 0x4b, 0x1e, 0x68, 0xa3, 0x1c, 0x9b, 0x00, 0x98, 0x59, 0xa5, 0xb2, - 0x90, 0x23, 0x5b, 0x01, 0xeb, 0x18, 0x9b, 0xb2, 0x00, 0x2c, 0x01, 0xd0, - 0xb7, 0x68, 0x00, 0xe0, 0x00, 0x27, 0x9b, 0x4c, 0x24, 0x68, 0xa4, 0x46, - 0x76, 0x68, 0xec, 0x1d, 0xa4, 0xb2, 0x09, 0x94, 0x08, 0x96, 0x07, 0x94, - 0x06, 0x96, 0xfa, 0x24, 0xa4, 0x00, 0x05, 0x94, 0x0b, 0x9c, 0x04, 0x94, - 0x64, 0x46, 0x03, 0x94, 0x30, 0x24, 0x02, 0x94, 0x92, 0x4c, 0x01, 0x94, - 0x00, 0x97, 0xfd, 0xf7, 0x6f, 0xfc, 0x00, 0x28, 0x00, 0xd0, 0x10, 0xe1, - 0x01, 0x35, 0x2c, 0xb2, 0x00, 0x2c, 0xb9, 0xdd, 0x89, 0x4b, 0x1b, 0x68, - 0xd8, 0x68, 0x19, 0x69, 0x9a, 0x68, 0x5e, 0x68, 0x6b, 0x46, 0x9d, 0x8d, - 0x2c, 0x00, 0x80, 0x34, 0x88, 0x4b, 0x08, 0x94, 0x02, 0x24, 0x07, 0x94, - 0x06, 0x96, 0x05, 0x94, 0x04, 0x96, 0x06, 0x34, 0x03, 0x94, 0x1c, 0x00, - 0x3c, 0x3c, 0x02, 0x94, 0x1c, 0x00, 0x44, 0x3c, 0x01, 0x94, 0x0a, 0x24, - 0x00, 0x94, 0x03, 0xf0, 0x4b, 0xfa, 0x00, 0x28, 0x00, 0xd0, 0xec, 0xe0, - 0x79, 0x4b, 0x1b, 0x68, 0x58, 0x69, 0x19, 0x69, 0x5a, 0x68, 0xe0, 0x23, - 0xdb, 0x00, 0xeb, 0x18, 0x08, 0x93, 0x08, 0x23, 0x07, 0x93, 0x06, 0x92, - 0x00, 0x23, 0x05, 0x93, 0x04, 0x93, 0x03, 0x92, 0x02, 0x93, 0x01, 0x93, - 0x00, 0x92, 0xf5, 0x33, 0xff, 0x33, 0x0b, 0x9a, 0x02, 0xf0, 0xb0, 0xfe, - 0x00, 0x28, 0x00, 0xd0, 0xd1, 0xe0, 0x6c, 0x4b, 0x1c, 0x68, 0xa0, 0x69, - 0xe1, 0x68, 0xa2, 0x68, 0x63, 0x69, 0x98, 0x46, 0x69, 0x4d, 0xae, 0x68, - 0xef, 0x68, 0x5c, 0x23, 0xeb, 0x5c, 0x64, 0x68, 0x01, 0x25, 0x06, 0x95, - 0x05, 0x94, 0x04, 0x95, 0x03, 0x94, 0x02, 0x93, 0x01, 0x97, 0x00, 0x96, - 0x43, 0x46, 0x02, 0xf0, 0x1d, 0xfb, 0x00, 0x28, 0x00, 0xd0, 0xb6, 0xe0, - 0x00, 0x25, 0x48, 0xe0, 0x5d, 0x4b, 0x1a, 0x68, 0x53, 0x68, 0x9a, 0x46, - 0xaf, 0xb2, 0xfb, 0x1c, 0x9b, 0xb2, 0x2e, 0x00, 0xa9, 0x1d, 0x89, 0x00, - 0x51, 0x18, 0x48, 0x68, 0xd1, 0x68, 0x94, 0x68, 0xa4, 0x46, 0x94, 0x69, - 0xa0, 0x46, 0x52, 0x69, 0x91, 0x46, 0x03, 0x2d, 0x03, 0xdc, 0x02, 0x35, - 0x2d, 0x02, 0xac, 0xb2, 0x00, 0xe0, 0x00, 0x24, 0x72, 0x00, 0x92, 0x19, - 0x95, 0x00, 0x70, 0x35, 0x4f, 0x4a, 0xad, 0x18, 0x04, 0x95, 0xf5, 0x00, - 0xab, 0x46, 0x5e, 0x44, 0xb5, 0x00, 0x2e, 0x00, 0xa0, 0x36, 0xb2, 0x18, - 0x05, 0x92, 0xa0, 0x25, 0x6d, 0x01, 0x7e, 0x19, 0xb6, 0xb2, 0xb0, 0x25, - 0x6d, 0x01, 0xab, 0x46, 0xbb, 0x44, 0x5d, 0x46, 0x6a, 0x46, 0x15, 0x86, - 0x15, 0x8e, 0x09, 0x93, 0x53, 0x46, 0x08, 0x93, 0x07, 0x95, 0x06, 0x96, - 0x00, 0x23, 0x03, 0x93, 0x02, 0x94, 0x0b, 0x9b, 0x01, 0x93, 0x4b, 0x46, - 0x00, 0x93, 0x43, 0x46, 0x62, 0x46, 0x02, 0xf0, 0xd3, 0xf9, 0x00, 0x28, - 0x6d, 0xd1, 0x01, 0x37, 0x3d, 0xb2, 0x03, 0x2d, 0xb4, 0xdd, 0x00, 0x24, - 0x51, 0xe0, 0x37, 0x4b, 0x1b, 0x68, 0x25, 0x00, 0x22, 0x00, 0x0a, 0x32, - 0x92, 0x00, 0x9a, 0x18, 0x50, 0x68, 0xda, 0x68, 0x0c, 0x92, 0x9a, 0x68, - 0x94, 0x46, 0x9a, 0x69, 0x90, 0x46, 0x5a, 0x69, 0x91, 0x46, 0x03, 0x2c, - 0x04, 0xdc, 0x22, 0x02, 0x81, 0x32, 0xff, 0x32, 0x92, 0xb2, 0x00, 0xe0, - 0x00, 0x22, 0xaf, 0x00, 0x7e, 0x19, 0xb7, 0x00, 0x31, 0x37, 0xff, 0x37, - 0x29, 0x4e, 0xbf, 0x19, 0xe9, 0x00, 0x8b, 0x46, 0x5d, 0x44, 0xa9, 0x00, - 0x0d, 0x00, 0x81, 0x35, 0xff, 0x35, 0xad, 0x19, 0xa4, 0xb2, 0xc0, 0x21, - 0x49, 0x01, 0x8a, 0x46, 0xa2, 0x44, 0x51, 0x46, 0x6e, 0x46, 0xf1, 0x86, - 0xf1, 0x8e, 0x8a, 0x46, 0xd0, 0x21, 0x49, 0x01, 0x8b, 0x46, 0xa3, 0x44, - 0x59, 0x46, 0xf1, 0x86, 0xf1, 0x8e, 0x5b, 0x68, 0x08, 0x93, 0xe3, 0x1c, - 0x9b, 0xb2, 0x09, 0x93, 0x07, 0x91, 0x53, 0x46, 0x06, 0x93, 0x05, 0x95, - 0x04, 0x97, 0x00, 0x23, 0x03, 0x93, 0x02, 0x92, 0x0b, 0x9b, 0x01, 0x93, - 0x4b, 0x46, 0x00, 0x93, 0x43, 0x46, 0x62, 0x46, 0x0c, 0x99, 0x02, 0xf0, - 0xdd, 0xf8, 0x00, 0x28, 0x17, 0xd1, 0x01, 0x34, 0x24, 0xb2, 0x03, 0x2c, - 0xab, 0xdd, 0x0d, 0x4b, 0x1b, 0x68, 0xd8, 0x6b, 0xd9, 0x68, 0x9a, 0x68, - 0x0f, 0x4c, 0x24, 0x68, 0x5b, 0x68, 0x02, 0x93, 0x08, 0x23, 0x03, 0x93, - 0x04, 0x3b, 0x01, 0x93, 0x00, 0x94, 0x0c, 0x4b, 0x02, 0xf0, 0x6e, 0xfc, - 0x01, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x0f, 0xb0, 0x3c, 0xbc, 0x90, 0x46, - 0x99, 0x46, 0xa2, 0x46, 0xab, 0x46, 0xf0, 0xbd, 0x80, 0x19, 0x00, 0x20, - 0xa8, 0x08, 0x00, 0x20, 0xf4, 0x10, 0x00, 0x20, 0x88, 0x3a, 0x01, 0x08, - 0x88, 0x08, 0x00, 0x20, 0xb4, 0x17, 0x00, 0x20, 0xdc, 0x08, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x84, 0xb0, 0x04, 0x00, 0x0e, 0x00, 0x0b, 0x4d, 0x2b, 0x68, - 0x5a, 0x68, 0x00, 0x21, 0x24, 0x23, 0xd1, 0x54, 0xfd, 0xf7, 0xc4, 0xfc, - 0x2b, 0x68, 0x58, 0x68, 0x07, 0x4b, 0x1a, 0x68, 0x07, 0x4b, 0x1b, 0x68, - 0x00, 0x93, 0x02, 0x96, 0x09, 0x23, 0x01, 0x93, 0x03, 0x33, 0x21, 0x00, - 0xfd, 0xf7, 0xfe, 0xfb, 0x04, 0xb0, 0x70, 0xbd, 0x80, 0x19, 0x00, 0x20, - 0x2c, 0x18, 0x00, 0x20, 0x34, 0x0b, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xfd, 0xf7, - 0xa5, 0xfc, 0x00, 0x22, 0x01, 0x4b, 0x1a, 0x60, 0x10, 0xbd, 0xc0, 0x46, - 0x80, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x4b, 0x1b, 0x68, 0x00, 0x2b, 0x4a, 0xd1, - 0x27, 0x4b, 0x26, 0x4a, 0x13, 0x60, 0x27, 0x4a, 0x5a, 0x60, 0x27, 0x4a, - 0x27, 0x4b, 0x1a, 0x60, 0x27, 0x4a, 0x28, 0x4b, 0x1a, 0x60, 0x00, 0x23, - 0x0a, 0xe0, 0x19, 0x01, 0x9a, 0x02, 0x52, 0x1a, 0x25, 0x49, 0x8a, 0x18, - 0x99, 0x1c, 0x89, 0x00, 0x1d, 0x48, 0x0a, 0x50, 0x01, 0x33, 0x1b, 0xb2, - 0x00, 0x2b, 0xf2, 0xdd, 0x21, 0x4a, 0x22, 0x4b, 0x1a, 0x60, 0x19, 0x4b, - 0x21, 0x4a, 0xda, 0x60, 0x21, 0x4a, 0x1a, 0x61, 0x21, 0x4a, 0x5a, 0x61, - 0x21, 0x4a, 0x9a, 0x61, 0x00, 0x23, 0x0a, 0xe0, 0x6c, 0x21, 0x59, 0x43, - 0x1f, 0x4a, 0x51, 0x18, 0x9a, 0x1d, 0x92, 0x00, 0x10, 0x48, 0x82, 0x18, - 0x51, 0x60, 0x01, 0x33, 0x1b, 0xb2, 0x03, 0x2b, 0xf2, 0xdd, 0x00, 0x23, - 0x0b, 0xe0, 0x58, 0x21, 0x59, 0x43, 0x19, 0x4a, 0x51, 0x18, 0x1a, 0x00, - 0x0a, 0x32, 0x92, 0x00, 0x08, 0x48, 0x82, 0x18, 0x51, 0x60, 0x01, 0x33, - 0x1b, 0xb2, 0x03, 0x2b, 0xf1, 0xdd, 0x14, 0x4a, 0x04, 0x4b, 0xda, 0x63, - 0x13, 0x4a, 0x14, 0x4b, 0x1a, 0x60, 0x00, 0x20, 0x70, 0x47, 0xc0, 0x46, - 0x80, 0x19, 0x00, 0x20, 0x74, 0x17, 0x00, 0x20, 0x94, 0x16, 0x00, 0x20, - 0x30, 0x18, 0x00, 0x20, 0x2c, 0x18, 0x00, 0x20, 0x38, 0x0b, 0x00, 0x20, - 0x34, 0x0b, 0x00, 0x20, 0xf8, 0x10, 0x00, 0x20, 0x00, 0x0d, 0x00, 0x20, - 0xf4, 0x10, 0x00, 0x20, 0xb8, 0x17, 0x00, 0x20, 0x74, 0x16, 0x00, 0x20, - 0xe8, 0x14, 0x00, 0x20, 0xf0, 0x0a, 0x00, 0x20, 0x44, 0x0f, 0x00, 0x20, - 0x14, 0x15, 0x00, 0x20, 0xd8, 0x0a, 0x00, 0x20, 0x10, 0x0c, 0x00, 0x20, - 0xb4, 0x17, 0x00, 0x20, 0x70, 0xb5, 0x06, 0x00, 0x00, 0x24, 0x09, 0xe0, - 0x15, 0x0a, 0x33, 0x5d, 0x6b, 0x40, 0x12, 0x02, 0x5b, 0x00, 0x04, 0x4d, - 0x58, 0x5b, 0x42, 0x40, 0x92, 0xb2, 0x01, 0x34, 0x8c, 0x42, 0xf3, 0xd3, - 0x10, 0x00, 0x70, 0xbd, 0xbc, 0x37, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x82, 0xb0, 0x05, 0x00, 0x3d, 0x4e, - 0x3d, 0x4a, 0xb1, 0x69, 0x02, 0xf0, 0x68, 0xfb, 0x72, 0xb6, 0x04, 0xf0, - 0xcd, 0xfe, 0x03, 0xf0, 0x23, 0xfb, 0x04, 0x00, 0x04, 0xf0, 0xb0, 0xfe, - 0x33, 0x68, 0xb3, 0x42, 0x08, 0xd0, 0x35, 0x4a, 0x92, 0x69, 0x92, 0x68, - 0x9b, 0x68, 0x9a, 0x42, 0x02, 0xd2, 0x34, 0x48, 0x04, 0xf0, 0xc4, 0xfd, - 0x62, 0xb6, 0x4f, 0xe0, 0x01, 0x23, 0x5b, 0x42, 0x01, 0x93, 0x31, 0x4b, - 0x1b, 0x68, 0x5b, 0x69, 0x1b, 0x78, 0x5b, 0xb2, 0x7f, 0x2b, 0x03, 0xd0, - 0x05, 0x2b, 0x03, 0xd1, 0x01, 0x26, 0x02, 0xe0, 0x01, 0x26, 0x00, 0xe0, - 0x00, 0x26, 0xf6, 0xb2, 0x03, 0xf0, 0xfe, 0xfa, 0x00, 0x1b, 0x29, 0x4a, - 0x00, 0x23, 0x00, 0x21, 0xfc, 0xf7, 0x7a, 0xfb, 0x27, 0x4a, 0x00, 0x23, - 0x80, 0x18, 0x59, 0x41, 0x26, 0x4a, 0x00, 0x23, 0xfc, 0xf7, 0x52, 0xfb, - 0x02, 0x00, 0x01, 0xab, 0x31, 0x00, 0x28, 0x00, 0x02, 0xf0, 0xf2, 0xfd, - 0x72, 0xb6, 0x04, 0xf0, 0x8f, 0xfe, 0x03, 0xf0, 0xe5, 0xfa, 0x04, 0x00, - 0x04, 0xf0, 0x72, 0xfe, 0x17, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x15, 0x48, - 0x04, 0xf0, 0x86, 0xfd, 0x62, 0xb6, 0x17, 0x4a, 0x00, 0x23, 0x01, 0x98, - 0x00, 0x21, 0xfc, 0xf7, 0x51, 0xfb, 0x15, 0x4a, 0x00, 0x23, 0x80, 0x18, - 0x59, 0x41, 0x10, 0x4a, 0x00, 0x23, 0xfc, 0xf7, 0x29, 0xfb, 0x01, 0x00, - 0x01, 0x20, 0x40, 0x42, 0x04, 0xf0, 0xea, 0xfb, 0x07, 0x4b, 0x9a, 0x69, - 0x21, 0x23, 0xd3, 0x5c, 0x5b, 0x07, 0xa9, 0xd5, 0x00, 0x22, 0x00, 0x21, - 0x28, 0x00, 0x02, 0xf0, 0xf7, 0xfa, 0x00, 0x20, 0xfe, 0xf7, 0x64, 0xff, - 0x02, 0xb0, 0x70, 0xbd, 0xe8, 0x19, 0x00, 0x20, 0xb1, 0xd6, 0x00, 0x08, - 0x84, 0x42, 0x01, 0x08, 0x80, 0x19, 0x00, 0x20, 0x40, 0x42, 0x0f, 0x00, - 0x0f, 0x27, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x3f, 0x42, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x00, 0x51, 0x4b, - 0x99, 0x69, 0x51, 0x4a, 0x80, 0x69, 0x02, 0xf0, 0xdf, 0xf8, 0x00, 0x25, - 0x09, 0xe0, 0xab, 0x1d, 0x9b, 0x00, 0xe3, 0x18, 0x58, 0x68, 0x4b, 0x4b, - 0x99, 0x69, 0x4b, 0x4a, 0x01, 0xf0, 0xd4, 0xff, 0x01, 0x35, 0x03, 0x2d, - 0xf3, 0xdd, 0x72, 0xb6, 0x04, 0xf0, 0x2e, 0xfe, 0x03, 0xf0, 0x84, 0xfa, - 0x05, 0x00, 0x04, 0xf0, 0x11, 0xfe, 0x43, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x40, 0x48, 0x04, 0xf0, 0x25, 0xfd, 0x62, 0xb6, 0x5a, 0xe0, 0x01, 0x23, - 0x5b, 0x42, 0x03, 0x93, 0xff, 0xf7, 0xfe, 0xf9, 0x03, 0xf0, 0x6c, 0xfa, - 0x40, 0x1b, 0x3b, 0x4a, 0x00, 0x23, 0x00, 0x21, 0xfc, 0xf7, 0xe8, 0xfa, - 0x39, 0x4e, 0x00, 0x27, 0x80, 0x19, 0x79, 0x41, 0x38, 0x4a, 0x00, 0x23, - 0xfc, 0xf7, 0xc0, 0xfa, 0x01, 0x00, 0x03, 0xaa, 0x20, 0x00, 0xff, 0xf7, - 0x01, 0xfa, 0x01, 0x90, 0x01, 0x00, 0x20, 0x00, 0xff, 0xf7, 0xc4, 0xfa, - 0x03, 0xf0, 0x52, 0xfa, 0x40, 0x1b, 0x2e, 0x4a, 0x00, 0x23, 0x00, 0x21, - 0xfc, 0xf7, 0xce, 0xfa, 0x80, 0x19, 0x79, 0x41, 0x2c, 0x4a, 0x00, 0x23, - 0xfc, 0xf7, 0xa8, 0xfa, 0x02, 0x00, 0x03, 0xab, 0x01, 0x99, 0x20, 0x00, - 0xff, 0xf7, 0xd8, 0xfb, 0x72, 0xb6, 0x04, 0xf0, 0xe5, 0xfd, 0x03, 0xf0, - 0x3b, 0xfa, 0x05, 0x00, 0x04, 0xf0, 0xc8, 0xfd, 0x1e, 0x4b, 0x1a, 0x68, - 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, - 0x02, 0xd2, 0x1c, 0x48, 0x04, 0xf0, 0xdc, 0xfc, 0x62, 0xb6, 0x1d, 0x4a, - 0x00, 0x23, 0x03, 0x98, 0x00, 0x21, 0xfc, 0xf7, 0xa7, 0xfa, 0x1b, 0x4a, - 0x00, 0x23, 0x80, 0x18, 0x59, 0x41, 0x16, 0x4a, 0x00, 0x23, 0xfc, 0xf7, - 0x7f, 0xfa, 0x01, 0x00, 0x01, 0x20, 0x40, 0x42, 0x04, 0xf0, 0x40, 0xfb, - 0x0e, 0x4b, 0x9a, 0x69, 0x21, 0x23, 0xd3, 0x5c, 0x5b, 0x07, 0x9e, 0xd5, - 0x00, 0x22, 0x00, 0x21, 0xa0, 0x69, 0x02, 0xf0, 0x55, 0xf8, 0x00, 0x25, - 0x08, 0xe0, 0xab, 0x1d, 0x9b, 0x00, 0xe3, 0x18, 0x58, 0x68, 0x00, 0x22, - 0x00, 0x21, 0x01, 0xf0, 0x4b, 0xff, 0x01, 0x35, 0x03, 0x2d, 0xf4, 0xdd, - 0x00, 0x20, 0xfe, 0xf7, 0xad, 0xfe, 0x05, 0xb0, 0xf0, 0xbd, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0xb1, 0xd6, 0x00, 0x08, 0x84, 0x42, 0x01, 0x08, - 0x40, 0x42, 0x0f, 0x00, 0x0f, 0x27, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, - 0x3f, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x84, 0xb0, 0x05, 0x00, 0x3f, 0x4e, 0x3f, 0x4a, 0xb1, 0x69, - 0x00, 0x69, 0x02, 0xf0, 0x1f, 0xff, 0x72, 0xb6, 0x04, 0xf0, 0x84, 0xfd, - 0x03, 0xf0, 0xda, 0xf9, 0x04, 0x00, 0x04, 0xf0, 0x67, 0xfd, 0x33, 0x68, - 0xb3, 0x42, 0x08, 0xd0, 0x36, 0x4a, 0x92, 0x69, 0x92, 0x68, 0x9b, 0x68, - 0x9a, 0x42, 0x02, 0xd2, 0x35, 0x48, 0x04, 0xf0, 0x7b, 0xfc, 0x62, 0xb6, - 0x52, 0xe0, 0x01, 0x23, 0x5b, 0x42, 0x03, 0x93, 0x32, 0x4b, 0x1b, 0x68, - 0x5b, 0x69, 0x1b, 0x78, 0x5b, 0xb2, 0x7f, 0x2b, 0x03, 0xd0, 0x05, 0x2b, - 0x03, 0xd1, 0x01, 0x26, 0x02, 0xe0, 0x01, 0x26, 0x00, 0xe0, 0x00, 0x26, - 0xf6, 0xb2, 0x03, 0xf0, 0xb5, 0xf9, 0x00, 0x1b, 0x2a, 0x4a, 0x00, 0x23, - 0x00, 0x21, 0xfc, 0xf7, 0x31, 0xfa, 0x29, 0x4a, 0x00, 0x23, 0x80, 0x18, - 0x59, 0x41, 0x28, 0x4a, 0x00, 0x23, 0xfc, 0xf7, 0x09, 0xfa, 0x02, 0x00, - 0x26, 0x4b, 0x1b, 0x8e, 0x03, 0xa9, 0x00, 0x91, 0x31, 0x00, 0x28, 0x00, - 0x02, 0xf0, 0x86, 0xfd, 0x72, 0xb6, 0x04, 0xf0, 0x43, 0xfd, 0x03, 0xf0, - 0x99, 0xf9, 0x04, 0x00, 0x04, 0xf0, 0x26, 0xfd, 0x17, 0x4b, 0x1a, 0x68, - 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, - 0x02, 0xd2, 0x15, 0x48, 0x04, 0xf0, 0x3a, 0xfc, 0x62, 0xb6, 0x17, 0x4a, - 0x00, 0x23, 0x03, 0x98, 0x00, 0x21, 0xfc, 0xf7, 0x05, 0xfa, 0x16, 0x4a, - 0x00, 0x23, 0x80, 0x18, 0x59, 0x41, 0x10, 0x4a, 0x00, 0x23, 0xfc, 0xf7, - 0xdd, 0xf9, 0x01, 0x00, 0x01, 0x20, 0x40, 0x42, 0x04, 0xf0, 0x9e, 0xfa, - 0x07, 0x4b, 0x9a, 0x69, 0x21, 0x23, 0xd3, 0x5c, 0x5b, 0x07, 0xa6, 0xd5, - 0x28, 0x69, 0x00, 0x22, 0x00, 0x21, 0x02, 0xf0, 0xab, 0xfe, 0x00, 0x20, - 0xfe, 0xf7, 0x18, 0xfe, 0x04, 0xb0, 0x70, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0xb1, 0xd6, 0x00, 0x08, 0x84, 0x42, 0x01, 0x08, 0x80, 0x19, 0x00, 0x20, - 0x40, 0x42, 0x0f, 0x00, 0x0f, 0x27, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, - 0xa8, 0x08, 0x00, 0x20, 0x3f, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x82, 0xb0, 0x05, 0x00, 0x3d, 0x4e, - 0x3d, 0x4a, 0xb1, 0x69, 0xfc, 0xf7, 0xa0, 0xff, 0x72, 0xb6, 0x04, 0xf0, - 0xed, 0xfc, 0x03, 0xf0, 0x43, 0xf9, 0x04, 0x00, 0x04, 0xf0, 0xd0, 0xfc, - 0x33, 0x68, 0xb3, 0x42, 0x08, 0xd0, 0x35, 0x4a, 0x92, 0x69, 0x92, 0x68, - 0x9b, 0x68, 0x9a, 0x42, 0x02, 0xd2, 0x34, 0x48, 0x04, 0xf0, 0xe4, 0xfb, - 0x62, 0xb6, 0x4f, 0xe0, 0x01, 0x23, 0x5b, 0x42, 0x01, 0x93, 0x31, 0x4b, - 0x1b, 0x68, 0x5b, 0x69, 0x1b, 0x78, 0x5b, 0xb2, 0x7f, 0x2b, 0x03, 0xd0, - 0x05, 0x2b, 0x03, 0xd1, 0x01, 0x26, 0x02, 0xe0, 0x01, 0x26, 0x00, 0xe0, - 0x00, 0x26, 0xf6, 0xb2, 0x03, 0xf0, 0x1e, 0xf9, 0x00, 0x1b, 0x29, 0x4a, - 0x00, 0x23, 0x00, 0x21, 0xfc, 0xf7, 0x9a, 0xf9, 0x27, 0x4a, 0x00, 0x23, - 0x80, 0x18, 0x59, 0x41, 0x26, 0x4a, 0x00, 0x23, 0xfc, 0xf7, 0x72, 0xf9, - 0x02, 0x00, 0x01, 0xab, 0x31, 0x00, 0x28, 0x00, 0xfd, 0xf7, 0xba, 0xfa, - 0x72, 0xb6, 0x04, 0xf0, 0xaf, 0xfc, 0x03, 0xf0, 0x05, 0xf9, 0x04, 0x00, - 0x04, 0xf0, 0x92, 0xfc, 0x17, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x15, 0x48, - 0x04, 0xf0, 0xa6, 0xfb, 0x62, 0xb6, 0x17, 0x4a, 0x00, 0x23, 0x01, 0x98, - 0x00, 0x21, 0xfc, 0xf7, 0x71, 0xf9, 0x15, 0x4a, 0x00, 0x23, 0x80, 0x18, - 0x59, 0x41, 0x10, 0x4a, 0x00, 0x23, 0xfc, 0xf7, 0x49, 0xf9, 0x01, 0x00, - 0x01, 0x20, 0x40, 0x42, 0x04, 0xf0, 0x0a, 0xfa, 0x07, 0x4b, 0x9a, 0x69, - 0x21, 0x23, 0xd3, 0x5c, 0x5b, 0x07, 0xa9, 0xd5, 0x00, 0x22, 0x00, 0x21, - 0x28, 0x00, 0xfc, 0xf7, 0x2f, 0xff, 0x00, 0x20, 0xfe, 0xf7, 0x84, 0xfd, - 0x02, 0xb0, 0x70, 0xbd, 0xe8, 0x19, 0x00, 0x20, 0xb1, 0xd6, 0x00, 0x08, - 0x84, 0x42, 0x01, 0x08, 0x80, 0x19, 0x00, 0x20, 0x40, 0x42, 0x0f, 0x00, - 0x0f, 0x27, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x3f, 0x42, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x00, 0x0c, 0x00, 0x16, 0x00, - 0x00, 0x28, 0x02, 0xd1, 0x12, 0x48, 0x04, 0xf0, 0x67, 0xfb, 0x1f, 0x29, - 0x01, 0xdc, 0x00, 0x2a, 0x02, 0xd1, 0x0f, 0x48, 0x04, 0xf0, 0x60, 0xfb, - 0x72, 0xb6, 0x04, 0xf0, 0x55, 0xfc, 0x01, 0x23, 0xa3, 0x40, 0x2a, 0x68, - 0x13, 0x43, 0x2b, 0x60, 0xa4, 0x00, 0x2c, 0x19, 0x66, 0x60, 0x04, 0xf0, - 0x33, 0xfc, 0x08, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, 0x04, 0xf0, - 0x47, 0xfb, 0x62, 0xb6, 0x70, 0xbd, 0xc0, 0x46, 0x2c, 0x3e, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0xec, 0x39, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1e, - 0x02, 0xd1, 0x10, 0x48, 0x04, 0xf0, 0x32, 0xfb, 0x72, 0xb6, 0x04, 0xf0, - 0x27, 0xfc, 0x00, 0x23, 0x23, 0x60, 0x04, 0xe0, 0x9a, 0x00, 0xa2, 0x18, - 0x00, 0x21, 0x51, 0x60, 0x01, 0x33, 0x1f, 0x2b, 0xf8, 0xd9, 0x04, 0xf0, - 0x03, 0xfc, 0x08, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, 0x04, 0xf0, - 0x17, 0xfb, 0x62, 0xb6, 0x10, 0xbd, 0xc0, 0x46, 0xc0, 0x3d, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0xec, 0x39, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x4b, 0x00, 0x22, - 0x1a, 0x60, 0x5a, 0x60, 0x00, 0x23, 0x0b, 0xe0, 0x99, 0x00, 0xc9, 0x18, - 0x8a, 0x00, 0x0a, 0x49, 0x8a, 0x18, 0x51, 0x68, 0x00, 0x22, 0x0a, 0x60, - 0x01, 0x33, 0xd8, 0x00, 0x05, 0x49, 0x42, 0x50, 0x0b, 0x2b, 0xf1, 0xdd, - 0x01, 0x23, 0x5b, 0x42, 0x04, 0x4a, 0x53, 0x60, 0x04, 0x4a, 0x53, 0x60, - 0x70, 0x47, 0xc0, 0x46, 0xe8, 0x24, 0x00, 0x20, 0x74, 0x40, 0x01, 0x08, - 0x00, 0x00, 0x02, 0x40, 0x00, 0x04, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, 0x83, 0x6a, 0x5d, 0x68, - 0x5d, 0x60, 0x2b, 0x07, 0x0b, 0xd5, 0x04, 0x23, 0x03, 0x70, 0x82, 0x6a, - 0x13, 0x68, 0x02, 0x21, 0x8b, 0x43, 0x13, 0x60, 0x43, 0x6a, 0x00, 0x2b, - 0x01, 0xd0, 0x00, 0x21, 0x98, 0x47, 0x6b, 0x07, 0x07, 0xd5, 0xa3, 0x6a, - 0x99, 0x69, 0x23, 0x6a, 0x00, 0x2b, 0x02, 0xd0, 0x09, 0x04, 0x20, 0x00, - 0x98, 0x47, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x4e, 0x4c, - 0xa0, 0x42, 0x17, 0xd1, 0x4d, 0x4c, 0xe5, 0x69, 0x80, 0x26, 0xb6, 0x04, - 0x35, 0x43, 0xe5, 0x61, 0xe4, 0x69, 0x85, 0x6a, 0x80, 0x26, 0xb6, 0x00, - 0xac, 0x59, 0x24, 0x0c, 0x24, 0x04, 0x01, 0x27, 0x3c, 0x43, 0xac, 0x51, - 0x84, 0x6a, 0xa5, 0x59, 0x2d, 0x0c, 0x2d, 0x04, 0x09, 0x02, 0x29, 0x43, - 0x39, 0x43, 0xa1, 0x51, 0x00, 0x2a, 0x59, 0xd0, 0x00, 0x21, 0x87, 0x24, - 0xa4, 0x00, 0x85, 0x6a, 0x29, 0x51, 0x18, 0x3c, 0x85, 0x6a, 0x29, 0x51, - 0x08, 0x34, 0x85, 0x6a, 0x29, 0x51, 0x08, 0x34, 0x85, 0x6a, 0x29, 0x51, - 0x38, 0x49, 0x88, 0x42, 0x0f, 0xd1, 0x0b, 0xe0, 0x21, 0x00, 0x48, 0x31, - 0xc9, 0x00, 0x00, 0x25, 0x86, 0x6a, 0x8d, 0x51, 0x86, 0x6a, 0xb4, 0x46, - 0x61, 0x44, 0x4d, 0x60, 0x01, 0x34, 0x00, 0xe0, 0x00, 0x24, 0x0d, 0x2c, - 0xf0, 0xd9, 0x00, 0x25, 0x33, 0xe0, 0x19, 0x88, 0x01, 0x24, 0x8c, 0x40, - 0x99, 0x78, 0xc9, 0x07, 0x05, 0xd5, 0x86, 0x6a, 0x81, 0x27, 0xbf, 0x00, - 0xf1, 0x59, 0x21, 0x43, 0xf1, 0x51, 0x99, 0x78, 0x89, 0x07, 0x05, 0xd5, - 0x86, 0x6a, 0x83, 0x27, 0xbf, 0x00, 0xf1, 0x59, 0x21, 0x43, 0xf1, 0x51, - 0x99, 0x78, 0x49, 0x07, 0x05, 0xd5, 0x86, 0x6a, 0x85, 0x27, 0xbf, 0x00, - 0xf1, 0x59, 0x21, 0x43, 0xf1, 0x51, 0x19, 0x88, 0x48, 0x31, 0xc9, 0x00, - 0x86, 0x6a, 0x5f, 0x68, 0x8f, 0x51, 0x19, 0x88, 0x48, 0x31, 0xc9, 0x00, - 0x86, 0x6a, 0xb4, 0x46, 0x61, 0x44, 0x9e, 0x68, 0x4e, 0x60, 0x86, 0x6a, - 0x87, 0x27, 0xbf, 0x00, 0xf1, 0x59, 0x0c, 0x43, 0xf4, 0x51, 0x0c, 0x33, - 0x01, 0x35, 0x95, 0x42, 0xc9, 0xd3, 0x14, 0xe0, 0x00, 0x23, 0x90, 0x22, - 0x92, 0x00, 0x81, 0x6a, 0x8b, 0x50, 0x04, 0x32, 0x81, 0x6a, 0x8b, 0x50, - 0x40, 0x3a, 0x81, 0x6a, 0x8b, 0x50, 0x10, 0x32, 0x81, 0x6a, 0x8b, 0x50, - 0x01, 0x33, 0x08, 0x3a, 0x81, 0x6a, 0x8b, 0x50, 0x10, 0x32, 0x81, 0x6a, - 0x8b, 0x50, 0x81, 0x6a, 0x80, 0x22, 0x92, 0x00, 0x8b, 0x58, 0x01, 0x24, - 0xa3, 0x43, 0x8b, 0x50, 0x04, 0x4b, 0x98, 0x42, 0x05, 0xd1, 0x04, 0x4b, - 0xd9, 0x69, 0x04, 0x4a, 0x0a, 0x40, 0xda, 0x61, 0xdb, 0x69, 0xf0, 0xbd, - 0x6c, 0x22, 0x00, 0x20, 0x00, 0x10, 0x02, 0x40, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x68, 0x5b, 0x07, - 0x08, 0xd5, 0x82, 0x68, 0x10, 0x23, 0x13, 0x43, 0x83, 0x60, 0x83, 0x68, - 0xdb, 0x06, 0xfc, 0xd4, 0x00, 0x23, 0x43, 0x60, 0x70, 0x47, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xc3, 0x6a, 0x5a, 0x68, 0x13, 0x68, - 0x0f, 0x21, 0x8b, 0x43, 0x13, 0x60, 0xc3, 0x6a, 0x1a, 0x68, 0x19, 0x7c, - 0x0e, 0x23, 0x8b, 0x40, 0x53, 0x60, 0x80, 0x6a, 0xff, 0xf7, 0xe0, 0xff, - 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x12, 0x4a, 0x13, 0x68, 0x80, 0x21, 0x49, 0x00, - 0x0b, 0x43, 0x13, 0x60, 0x10, 0x4b, 0x1a, 0x6a, 0xc0, 0x23, 0x9b, 0x00, - 0x13, 0x40, 0x80, 0x22, 0x92, 0x00, 0x93, 0x42, 0x05, 0xd0, 0x0c, 0x4b, - 0x80, 0x22, 0x52, 0x02, 0x1a, 0x62, 0x00, 0x22, 0x1a, 0x62, 0x09, 0x4b, - 0x1b, 0x6a, 0x1b, 0x04, 0x0a, 0xd4, 0x07, 0x4b, 0x1a, 0x6a, 0x80, 0x21, - 0x89, 0x00, 0x0a, 0x43, 0x1a, 0x62, 0x1a, 0x6a, 0x80, 0x21, 0x09, 0x02, - 0x0a, 0x43, 0x1a, 0x62, 0x70, 0x47, 0xc0, 0x46, 0x00, 0x70, 0x00, 0x40, - 0x00, 0x10, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x83, 0x68, 0x00, 0x2b, 0x02, 0xd0, - 0x01, 0x48, 0x04, 0xf0, 0xb9, 0xf9, 0x10, 0xbd, 0x74, 0x41, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x00, 0x83, 0x6a, 0x1d, 0x69, 0xaa, 0x07, 0x13, 0xd0, - 0x5a, 0x69, 0x10, 0x21, 0x8a, 0x43, 0x5a, 0x61, 0x83, 0x69, 0x00, 0x2b, - 0x01, 0xd0, 0x0e, 0x39, 0x98, 0x47, 0x72, 0xb6, 0x04, 0xf0, 0x2e, 0xfa, - 0x20, 0x00, 0x10, 0x30, 0x00, 0x21, 0xfe, 0xf7, 0x51, 0xfa, 0x04, 0xf0, - 0x0f, 0xfa, 0x62, 0xb6, 0xeb, 0x06, 0x08, 0xd5, 0xa3, 0x6a, 0x10, 0x22, - 0x1a, 0x61, 0x23, 0x6a, 0x00, 0x2b, 0x02, 0xd0, 0x10, 0x21, 0x20, 0x00, - 0x98, 0x47, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, - 0x83, 0x6a, 0xdd, 0x68, 0xaa, 0x07, 0x13, 0xd0, 0x5a, 0x69, 0x02, 0x21, - 0x8a, 0x43, 0x5a, 0x61, 0x83, 0x69, 0x00, 0x2b, 0x01, 0xd0, 0x01, 0x39, - 0x98, 0x47, 0x72, 0xb6, 0x04, 0xf0, 0x06, 0xfa, 0x20, 0x00, 0x10, 0x30, - 0x00, 0x21, 0xfe, 0xf7, 0x29, 0xfa, 0x04, 0xf0, 0xe7, 0xf9, 0x62, 0xb6, - 0xeb, 0x06, 0x08, 0xd5, 0xa3, 0x6a, 0x10, 0x22, 0xda, 0x60, 0x23, 0x6a, - 0x00, 0x2b, 0x02, 0xd0, 0x10, 0x21, 0x20, 0x00, 0x98, 0x47, 0x70, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, 0x82, 0x6a, 0x93, 0x68, - 0x93, 0x60, 0xda, 0x07, 0x05, 0xd5, 0x0c, 0x22, 0x1a, 0x42, 0x04, 0xd0, - 0x80, 0x21, 0x49, 0x02, 0x02, 0xe0, 0x00, 0x21, 0x00, 0xe0, 0x01, 0x21, - 0xda, 0x05, 0x09, 0xd5, 0xc0, 0x22, 0x12, 0x01, 0x13, 0x42, 0x03, 0xd0, - 0x80, 0x22, 0x92, 0x02, 0x11, 0x43, 0x01, 0xe0, 0x02, 0x22, 0x11, 0x43, - 0xda, 0x03, 0x09, 0xd5, 0xc0, 0x22, 0x12, 0x03, 0x13, 0x42, 0x03, 0xd0, - 0x80, 0x23, 0xdb, 0x02, 0x19, 0x43, 0x01, 0xe0, 0x04, 0x23, 0x19, 0x43, - 0xe3, 0x69, 0x00, 0x2b, 0x01, 0xd0, 0x20, 0x00, 0x98, 0x47, 0x72, 0xb6, - 0x04, 0xf0, 0xc0, 0xf9, 0x20, 0x00, 0x08, 0x30, 0x00, 0x21, 0xfe, 0xf7, - 0xe3, 0xf9, 0x04, 0xf0, 0xa1, 0xf9, 0x62, 0xb6, 0x10, 0xbd, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x00, 0x83, 0x6a, 0x1d, 0x68, 0x1d, 0x60, 0x03, 0x69, - 0x00, 0x2b, 0x51, 0xd0, 0xeb, 0x06, 0x28, 0xd5, 0xc3, 0x6a, 0x5b, 0x68, - 0x5b, 0x68, 0x00, 0x2b, 0x23, 0xd0, 0xff, 0xf7, 0x07, 0xff, 0x23, 0x69, - 0x9a, 0x68, 0x00, 0x2a, 0x0d, 0xd0, 0x05, 0x22, 0x22, 0x70, 0x9b, 0x68, - 0x01, 0x21, 0x20, 0x00, 0x98, 0x47, 0x23, 0x78, 0x05, 0x2b, 0x08, 0xd1, - 0x03, 0x3b, 0x23, 0x70, 0x00, 0x23, 0x23, 0x61, 0x03, 0xe0, 0x02, 0x23, - 0x23, 0x70, 0x00, 0x23, 0x23, 0x61, 0x72, 0xb6, 0x04, 0xf0, 0x86, 0xf9, - 0x20, 0x00, 0x14, 0x30, 0x01, 0x21, 0x49, 0x42, 0xfe, 0xf7, 0xc8, 0xf9, - 0x04, 0xf0, 0x66, 0xf9, 0x62, 0xb6, 0x2b, 0x06, 0x24, 0xd5, 0x20, 0x00, - 0xff, 0xf7, 0xe0, 0xfe, 0x23, 0x69, 0x9a, 0x68, 0x00, 0x2a, 0x0d, 0xd0, - 0x05, 0x22, 0x22, 0x70, 0x9b, 0x68, 0x02, 0x21, 0x20, 0x00, 0x98, 0x47, - 0x23, 0x78, 0x05, 0x2b, 0x08, 0xd1, 0x03, 0x3b, 0x23, 0x70, 0x00, 0x23, - 0x23, 0x61, 0x03, 0xe0, 0x02, 0x23, 0x23, 0x70, 0x00, 0x23, 0x23, 0x61, - 0x72, 0xb6, 0x04, 0xf0, 0x5f, 0xf9, 0x20, 0x00, 0x14, 0x30, 0x01, 0x21, - 0x49, 0x42, 0xfe, 0xf7, 0xa1, 0xf9, 0x04, 0xf0, 0x3f, 0xf9, 0x62, 0xb6, - 0x70, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x04, 0x00, 0x0b, 0x07, 0x24, 0xd5, 0xff, 0xf7, 0xb2, 0xfe, - 0x23, 0x69, 0x9a, 0x68, 0x00, 0x2a, 0x0d, 0xd0, 0x05, 0x22, 0x22, 0x70, - 0x9b, 0x68, 0x00, 0x21, 0x20, 0x00, 0x98, 0x47, 0x23, 0x78, 0x05, 0x2b, - 0x08, 0xd1, 0x03, 0x3b, 0x23, 0x70, 0x00, 0x23, 0x23, 0x61, 0x03, 0xe0, - 0x02, 0x23, 0x23, 0x70, 0x00, 0x23, 0x23, 0x61, 0x72, 0xb6, 0x04, 0xf0, - 0x31, 0xf9, 0x20, 0x00, 0x14, 0x30, 0x01, 0x21, 0x49, 0x42, 0xfe, 0xf7, - 0x73, 0xf9, 0x04, 0xf0, 0x11, 0xf9, 0x62, 0xb6, 0x3d, 0xe0, 0x03, 0x69, - 0x00, 0x2b, 0x3a, 0xd0, 0x8a, 0x07, 0x32, 0xd5, 0x1a, 0x78, 0x00, 0x2a, - 0x0c, 0xd0, 0x5a, 0x68, 0x00, 0x2a, 0x32, 0xd0, 0x04, 0x22, 0x02, 0x70, - 0x5b, 0x68, 0x98, 0x47, 0x23, 0x78, 0x04, 0x2b, 0x2b, 0xd1, 0x01, 0x3b, - 0x23, 0x70, 0x28, 0xe0, 0xff, 0xf7, 0x78, 0xfe, 0x23, 0x69, 0x5a, 0x68, - 0x00, 0x2a, 0x0c, 0xd0, 0x04, 0x22, 0x22, 0x70, 0x5b, 0x68, 0x20, 0x00, - 0x98, 0x47, 0x23, 0x78, 0x04, 0x2b, 0x08, 0xd1, 0x02, 0x3b, 0x23, 0x70, - 0x00, 0x23, 0x23, 0x61, 0x03, 0xe0, 0x02, 0x23, 0x23, 0x70, 0x00, 0x23, - 0x23, 0x61, 0x72, 0xb6, 0x04, 0xf0, 0xf8, 0xf8, 0x20, 0x00, 0x14, 0x30, - 0x00, 0x21, 0xfe, 0xf7, 0x3b, 0xf9, 0x04, 0xf0, 0xd9, 0xf8, 0x62, 0xb6, - 0x05, 0xe0, 0x4a, 0x07, 0x03, 0xd5, 0x5b, 0x68, 0x00, 0x2b, 0x00, 0xd0, - 0x98, 0x47, 0x10, 0xbd, 0x70, 0xb5, 0x75, 0x46, 0x08, 0x4c, 0x20, 0x00, - 0x04, 0xf0, 0x0a, 0xf8, 0x04, 0xf0, 0xb0, 0xf8, 0x06, 0x48, 0x04, 0xf0, - 0xad, 0xfb, 0x04, 0xf0, 0x93, 0xf8, 0x20, 0x00, 0x03, 0xf0, 0xe0, 0xff, - 0x28, 0x00, 0x03, 0xf0, 0x0d, 0xfd, 0x70, 0xbd, 0x34, 0x40, 0x01, 0x08, - 0x74, 0x40, 0x01, 0x08, 0x10, 0xb5, 0x06, 0x4c, 0x24, 0x78, 0x01, 0x2c, - 0x02, 0xd0, 0x05, 0x48, 0x04, 0xf0, 0x38, 0xf8, 0x02, 0x4c, 0xa0, 0x42, - 0x01, 0xd1, 0xff, 0xf7, 0x73, 0xfd, 0x10, 0xbd, 0x6c, 0x22, 0x00, 0x20, - 0x14, 0x40, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x00, 0x29, 0x09, 0xd1, 0x83, 0x6a, - 0xd9, 0x68, 0x89, 0x07, 0x04, 0xd1, 0x1b, 0x69, 0x9b, 0x07, 0x64, 0xd0, - 0x02, 0x21, 0x00, 0xe0, 0x01, 0x21, 0x01, 0x29, 0x02, 0xd0, 0x02, 0x29, - 0x1a, 0xd0, 0x5c, 0xe0, 0x83, 0x6a, 0xd8, 0x21, 0x49, 0x00, 0x5c, 0x58, - 0x04, 0x31, 0x5d, 0x58, 0x04, 0x31, 0x5b, 0x58, 0x13, 0x61, 0xde, 0x23, - 0x5b, 0x00, 0x81, 0x6a, 0xcb, 0x58, 0x53, 0x61, 0x83, 0x6a, 0x20, 0x21, - 0xd9, 0x60, 0x83, 0x6a, 0xd9, 0x68, 0x89, 0x07, 0x1d, 0xd1, 0x58, 0x69, - 0x02, 0x21, 0x01, 0x43, 0x59, 0x61, 0x18, 0xe0, 0x83, 0x6a, 0xe0, 0x21, - 0x49, 0x00, 0x5c, 0x58, 0x04, 0x31, 0x5d, 0x58, 0x04, 0x31, 0x5b, 0x58, - 0x13, 0x61, 0xe6, 0x23, 0x5b, 0x00, 0x81, 0x6a, 0xcb, 0x58, 0x53, 0x61, - 0x83, 0x6a, 0x20, 0x21, 0x19, 0x61, 0x83, 0x6a, 0x19, 0x69, 0x89, 0x07, - 0x03, 0xd1, 0x58, 0x69, 0x10, 0x21, 0x01, 0x43, 0x59, 0x61, 0x63, 0x08, - 0x01, 0x26, 0x33, 0x40, 0x19, 0x01, 0x13, 0x79, 0x10, 0x20, 0x83, 0x43, - 0xa0, 0x08, 0x30, 0x40, 0x40, 0x01, 0x0b, 0x43, 0x20, 0x21, 0x8b, 0x43, - 0x03, 0x43, 0x13, 0x71, 0x9b, 0x06, 0x06, 0xd5, 0xe4, 0x08, 0x93, 0x68, - 0x5b, 0x0f, 0x5b, 0x07, 0x23, 0x43, 0x93, 0x60, 0x05, 0xe0, 0x64, 0x0d, - 0x13, 0x89, 0xdb, 0x0a, 0xdb, 0x02, 0x1c, 0x43, 0x14, 0x81, 0x0f, 0x23, - 0x2b, 0x40, 0x19, 0x00, 0x13, 0x79, 0x0f, 0x20, 0x83, 0x43, 0x0b, 0x43, - 0x13, 0x71, 0x2b, 0x0a, 0x13, 0x70, 0x2d, 0x0c, 0x55, 0x80, 0x70, 0xbd, - 0x01, 0x29, 0x11, 0xd0, 0x00, 0x29, 0x02, 0xd0, 0x02, 0x29, 0x15, 0xd0, - 0x1c, 0xe0, 0x83, 0x6a, 0xda, 0x68, 0x92, 0x07, 0x04, 0xd1, 0x1b, 0x69, - 0x9b, 0x07, 0x03, 0xd0, 0x01, 0x20, 0x14, 0xe0, 0x01, 0x20, 0x12, 0xe0, - 0x00, 0x20, 0x10, 0xe0, 0x83, 0x6a, 0xdb, 0x68, 0x03, 0x20, 0x18, 0x40, - 0x43, 0x1e, 0x98, 0x41, 0xc0, 0xb2, 0x08, 0xe0, 0x83, 0x6a, 0x1b, 0x69, - 0x03, 0x20, 0x18, 0x40, 0x43, 0x1e, 0x98, 0x41, 0xc0, 0xb2, 0x00, 0xe0, - 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x01, 0x29, 0x10, 0xd0, - 0x00, 0x29, 0x04, 0xd0, 0x02, 0x29, 0x10, 0xd0, 0x03, 0x29, 0x12, 0xd0, - 0x33, 0xe0, 0x80, 0x6a, 0x81, 0x68, 0x09, 0x0e, 0x03, 0x23, 0x19, 0x40, - 0x0b, 0x00, 0x18, 0x33, 0x1b, 0x01, 0xc3, 0x18, 0x0a, 0xe0, 0x83, 0x6a, - 0x81, 0x33, 0xff, 0x33, 0x06, 0xe0, 0x83, 0x6a, 0x91, 0x33, 0xff, 0x33, - 0x02, 0xe0, 0x83, 0x6a, 0xa1, 0x33, 0xff, 0x33, 0x11, 0x78, 0x89, 0x06, - 0x09, 0xd5, 0x51, 0x68, 0xc8, 0x00, 0x11, 0x78, 0xc9, 0x06, 0xc9, 0x0f, - 0x49, 0x00, 0x01, 0x43, 0x04, 0x20, 0x01, 0x43, 0x06, 0xe0, 0x91, 0x88, - 0x48, 0x05, 0x11, 0x78, 0xc9, 0x06, 0xc9, 0x0f, 0x49, 0x00, 0x01, 0x43, - 0x10, 0x78, 0x00, 0x07, 0x00, 0x0f, 0x58, 0x60, 0x90, 0x68, 0x98, 0x60, - 0xd2, 0x68, 0xda, 0x60, 0x01, 0x22, 0x11, 0x43, 0x19, 0x60, 0x70, 0x47, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x29, 0x0f, 0xd0, 0x00, 0x29, 0x04, 0xd0, - 0x02, 0x29, 0x14, 0xd0, 0x03, 0x29, 0x1b, 0xd0, 0x23, 0xe0, 0x83, 0x6a, - 0x98, 0x68, 0xe0, 0x23, 0x5b, 0x05, 0x18, 0x40, 0x43, 0x1e, 0x98, 0x41, - 0xc0, 0xb2, 0x1b, 0xe0, 0x83, 0x6a, 0x98, 0x68, 0x80, 0x23, 0xdb, 0x04, - 0x18, 0x40, 0x43, 0x1e, 0x98, 0x41, 0xc0, 0xb2, 0x12, 0xe0, 0x83, 0x6a, - 0x98, 0x68, 0x80, 0x23, 0x1b, 0x05, 0x18, 0x40, 0x43, 0x1e, 0x98, 0x41, - 0xc0, 0xb2, 0x09, 0xe0, 0x83, 0x6a, 0x98, 0x68, 0x80, 0x23, 0x5b, 0x05, - 0x18, 0x40, 0x43, 0x1e, 0x98, 0x41, 0xc0, 0xb2, 0x00, 0xe0, 0x00, 0x20, - 0x70, 0x47, 0xc0, 0x46, 0x03, 0x78, 0x04, 0x2b, 0x0d, 0xd1, 0x07, 0x4b, - 0x98, 0x42, 0x0a, 0xd1, 0x06, 0x4b, 0x07, 0x4a, 0x1a, 0x60, 0x00, 0x22, - 0x5a, 0x61, 0x06, 0x4b, 0xd9, 0x69, 0x06, 0x4a, 0x0a, 0x40, 0xda, 0x61, - 0xdb, 0x69, 0x70, 0x47, 0x6c, 0x22, 0x00, 0x20, 0x00, 0x64, 0x00, 0x40, - 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x02, 0x40, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0x10, 0x4b, 0x98, 0x42, 0x06, 0xd1, 0x10, 0x4b, 0xda, 0x69, 0x80, 0x21, - 0x89, 0x04, 0x0a, 0x43, 0xda, 0x61, 0xdb, 0x69, 0xa3, 0x6a, 0x01, 0x22, - 0x1a, 0x60, 0x03, 0xe0, 0x01, 0x21, 0x08, 0x20, 0xfd, 0xf7, 0x9c, 0xfe, - 0xa3, 0x6a, 0x5a, 0x68, 0xd2, 0x07, 0xf7, 0xd5, 0x62, 0x68, 0x52, 0x68, - 0xda, 0x61, 0xa3, 0x6a, 0x62, 0x68, 0x12, 0x68, 0x1a, 0x60, 0xa3, 0x6a, - 0x03, 0x4a, 0x5a, 0x61, 0x10, 0xbd, 0xc0, 0x46, 0x6c, 0x22, 0x00, 0x20, - 0x00, 0x10, 0x02, 0x40, 0x5b, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x76, 0x46, - 0x0d, 0x4d, 0x28, 0x00, 0x03, 0xf0, 0x82, 0xfe, 0x03, 0xf0, 0x28, 0xff, - 0x0b, 0x4c, 0x20, 0x00, 0xff, 0xf7, 0x64, 0xfd, 0x20, 0x00, 0xff, 0xf7, - 0x39, 0xfd, 0x20, 0x00, 0xff, 0xf7, 0x0e, 0xfd, 0x20, 0x00, 0xff, 0xf7, - 0xdb, 0xfb, 0x03, 0xf0, 0x01, 0xff, 0x28, 0x00, 0x03, 0xf0, 0x4e, 0xfe, - 0x30, 0x00, 0x03, 0xf0, 0x7b, 0xfb, 0x70, 0xbd, 0xf0, 0x3f, 0x01, 0x08, - 0x6c, 0x22, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x03, 0x69, 0x05, 0x6b, 0xda, 0x68, - 0x01, 0x24, 0x14, 0x43, 0x19, 0x78, 0x00, 0x29, 0x0a, 0xd0, 0x20, 0x21, - 0x29, 0x43, 0x03, 0x24, 0x14, 0x43, 0xc2, 0x68, 0x01, 0x2a, 0x02, 0xd9, - 0x24, 0x22, 0x15, 0x43, 0x00, 0xe0, 0x0d, 0x00, 0xc2, 0x6a, 0x52, 0x68, - 0x81, 0x68, 0xd1, 0x60, 0xc2, 0x6a, 0x51, 0x68, 0x5a, 0x88, 0xc6, 0x68, - 0x72, 0x43, 0x4a, 0x60, 0xc1, 0x6a, 0xce, 0x68, 0x32, 0x68, 0x0f, 0x7c, - 0x0f, 0x21, 0xb9, 0x40, 0x8a, 0x43, 0x11, 0x00, 0x2a, 0x0c, 0xba, 0x40, - 0x0a, 0x43, 0x32, 0x60, 0xc2, 0x6a, 0x52, 0x68, 0x15, 0x60, 0xc2, 0x6a, - 0x51, 0x68, 0x0d, 0x68, 0x01, 0x22, 0x2a, 0x43, 0x0a, 0x60, 0x82, 0x6a, - 0x11, 0x68, 0x11, 0x60, 0x82, 0x6a, 0x90, 0x21, 0x51, 0x60, 0x82, 0x6a, - 0x19, 0x69, 0x11, 0x62, 0x82, 0x6a, 0x59, 0x69, 0x51, 0x61, 0x82, 0x6a, - 0x9b, 0x69, 0x93, 0x62, 0x83, 0x6a, 0xdc, 0x60, 0x82, 0x6a, 0x91, 0x68, - 0x04, 0x23, 0x0b, 0x43, 0x93, 0x60, 0xf0, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x75, 0x46, - 0x08, 0x4c, 0x20, 0x00, 0x03, 0xf0, 0x0a, 0xfe, 0x03, 0xf0, 0xb0, 0xfe, - 0x06, 0x48, 0xff, 0xf7, 0x2d, 0xfd, 0x03, 0xf0, 0x93, 0xfe, 0x20, 0x00, - 0x03, 0xf0, 0xe0, 0xfd, 0x28, 0x00, 0x03, 0xf0, 0x0d, 0xfb, 0x70, 0xbd, - 0x68, 0x40, 0x01, 0x08, 0xc0, 0x18, 0x00, 0x20, 0x2f, 0x4a, 0x11, 0x68, - 0x01, 0x23, 0x0b, 0x43, 0x13, 0x60, 0x2d, 0x4b, 0x1b, 0x68, 0x9b, 0x07, - 0xfb, 0xd5, 0x2b, 0x4a, 0x53, 0x68, 0x03, 0x21, 0x8b, 0x43, 0x53, 0x60, - 0x28, 0x4b, 0x5b, 0x68, 0x0c, 0x22, 0x1a, 0x42, 0xfa, 0xd1, 0x26, 0x4b, - 0x1a, 0x68, 0xf9, 0x21, 0x0a, 0x40, 0x1a, 0x60, 0x00, 0x22, 0x5a, 0x60, - 0x1a, 0x68, 0x80, 0x21, 0x49, 0x02, 0x0a, 0x43, 0x1a, 0x60, 0x20, 0x4b, - 0x1b, 0x68, 0x9b, 0x03, 0xfb, 0xd5, 0x1e, 0x4a, 0x51, 0x6b, 0x01, 0x23, - 0x0b, 0x43, 0x53, 0x63, 0x1b, 0x4b, 0x5b, 0x6b, 0x9b, 0x07, 0xfb, 0xd5, - 0x19, 0x4a, 0x51, 0x6a, 0x01, 0x23, 0x0b, 0x43, 0x53, 0x62, 0x17, 0x4b, - 0x5b, 0x6a, 0x9b, 0x07, 0xfb, 0xd5, 0x15, 0x4b, 0x00, 0x22, 0xda, 0x62, - 0xa0, 0x22, 0xd2, 0x02, 0x5a, 0x60, 0x03, 0x22, 0x1a, 0x63, 0x1a, 0x68, - 0x80, 0x21, 0x49, 0x04, 0x0a, 0x43, 0x1a, 0x60, 0x0e, 0x4b, 0x1b, 0x68, - 0x9b, 0x01, 0xfb, 0xd5, 0x11, 0x22, 0x0d, 0x4b, 0x1a, 0x60, 0x0c, 0x4b, - 0x1b, 0x68, 0xdb, 0x07, 0xfb, 0xd5, 0x09, 0x4a, 0x51, 0x68, 0x02, 0x23, - 0x0b, 0x43, 0x53, 0x60, 0x06, 0x4b, 0x5b, 0x68, 0x0c, 0x22, 0x13, 0x40, - 0x08, 0x2b, 0xf9, 0xd1, 0x03, 0x4b, 0x99, 0x69, 0x0b, 0x3a, 0x0a, 0x43, - 0x9a, 0x61, 0x9b, 0x69, 0x70, 0x47, 0xc0, 0x46, 0x00, 0x10, 0x02, 0x40, - 0x00, 0x20, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x76, 0x46, 0x15, 0x4d, 0x28, 0x00, 0x03, 0xf0, 0x8a, 0xfd, - 0x03, 0xf0, 0x30, 0xfe, 0x13, 0x4c, 0x20, 0x00, 0x3c, 0x30, 0x04, 0xf0, - 0x2b, 0xf9, 0x20, 0x00, 0x50, 0x30, 0x04, 0xf0, 0x27, 0xf9, 0x20, 0x00, - 0x64, 0x30, 0x04, 0xf0, 0x23, 0xf9, 0x20, 0x00, 0x78, 0x30, 0x04, 0xf0, - 0x1f, 0xf9, 0x20, 0x00, 0xb4, 0x30, 0x04, 0xf0, 0x1b, 0xf9, 0x20, 0x00, - 0xc8, 0x30, 0x04, 0xf0, 0x17, 0xf9, 0x20, 0x00, 0xdc, 0x30, 0x04, 0xf0, - 0x13, 0xf9, 0x03, 0xf0, 0xf9, 0xfd, 0x28, 0x00, 0x03, 0xf0, 0x46, 0xfd, - 0x30, 0x00, 0x03, 0xf0, 0x73, 0xfa, 0x70, 0xbd, 0x28, 0x40, 0x01, 0x08, - 0x74, 0x40, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x76, 0x46, 0x0f, 0x4d, 0x28, 0x00, - 0x03, 0xf0, 0x52, 0xfd, 0x03, 0xf0, 0xf8, 0xfd, 0x0d, 0x4c, 0x20, 0x00, - 0x14, 0x30, 0x04, 0xf0, 0xf3, 0xf8, 0x20, 0x00, 0x28, 0x30, 0x04, 0xf0, - 0xef, 0xf8, 0x20, 0x00, 0x8c, 0x30, 0x04, 0xf0, 0xeb, 0xf8, 0x20, 0x00, - 0xa0, 0x30, 0x04, 0xf0, 0xe7, 0xf8, 0x03, 0xf0, 0xcd, 0xfd, 0x28, 0x00, - 0x03, 0xf0, 0x1a, 0xfd, 0x30, 0x00, 0x03, 0xf0, 0x47, 0xfa, 0x70, 0xbd, - 0x40, 0x40, 0x01, 0x08, 0x74, 0x40, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x75, 0x46, 0x07, 0x4c, 0x20, 0x00, 0x03, 0xf0, 0x2a, 0xfd, - 0x03, 0xf0, 0xd0, 0xfd, 0x03, 0xf0, 0xb6, 0xfd, 0x20, 0x00, 0x03, 0xf0, - 0x03, 0xfd, 0x28, 0x00, 0x03, 0xf0, 0x30, 0xfa, 0x70, 0xbd, 0xc0, 0x46, - 0x08, 0x40, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x75, 0x46, 0x08, 0x4c, 0x20, 0x00, 0x03, 0xf0, 0x12, 0xfd, - 0x03, 0xf0, 0xb8, 0xfd, 0x06, 0x48, 0x03, 0xf0, 0x45, 0xff, 0x03, 0xf0, - 0x9b, 0xfd, 0x20, 0x00, 0x03, 0xf0, 0xe8, 0xfc, 0x28, 0x00, 0x03, 0xf0, - 0x15, 0xfa, 0x70, 0xbd, 0x4c, 0x40, 0x01, 0x08, 0x88, 0x19, 0x00, 0x20, - 0x70, 0xb5, 0x75, 0x46, 0x07, 0x4c, 0x20, 0x00, 0x03, 0xf0, 0xfa, 0xfc, - 0x03, 0xf0, 0xa0, 0xfd, 0x03, 0xf0, 0x86, 0xfd, 0x20, 0x00, 0x03, 0xf0, - 0xd3, 0xfc, 0x28, 0x00, 0x03, 0xf0, 0x00, 0xfa, 0x70, 0xbd, 0xc0, 0x46, - 0xfc, 0x3f, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x83, 0x08, 0x0c, 0x4c, 0xc0, 0x33, 0x9b, 0x00, 0x1d, 0x59, - 0x03, 0x22, 0x02, 0x40, 0xd2, 0x00, 0xff, 0x26, 0x96, 0x40, 0xb5, 0x43, - 0x89, 0x01, 0x91, 0x40, 0x29, 0x43, 0x19, 0x51, 0x43, 0x09, 0x1f, 0x22, - 0x10, 0x40, 0x1e, 0x3a, 0x82, 0x40, 0x19, 0x00, 0x60, 0x31, 0x89, 0x00, - 0x0a, 0x51, 0x9b, 0x00, 0x1a, 0x51, 0x70, 0xbd, 0x00, 0xe1, 0x00, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x83, 0xb0, 0x07, 0x00, 0x01, 0x91, - 0x15, 0x00, 0x00, 0x93, 0x03, 0xf0, 0x30, 0xfd, 0x0b, 0x2f, 0x52, 0xd9, - 0x2c, 0x48, 0x03, 0xf0, 0x03, 0xfd, 0x01, 0x23, 0xa3, 0x40, 0x1e, 0x00, - 0x2a, 0x4b, 0x1b, 0x68, 0x33, 0x42, 0x46, 0xd1, 0x14, 0x20, 0x60, 0x43, - 0x28, 0x4a, 0x17, 0x18, 0x26, 0x49, 0x62, 0x1c, 0xd2, 0x00, 0x55, 0x50, - 0x8a, 0x18, 0x00, 0x98, 0x50, 0x60, 0x33, 0x43, 0x0b, 0x60, 0x73, 0x06, - 0x05, 0xd0, 0x23, 0x4b, 0x5a, 0x69, 0x01, 0x21, 0x0a, 0x43, 0x5a, 0x61, - 0x5b, 0x69, 0xf8, 0x23, 0x1b, 0x01, 0x1e, 0x42, 0x05, 0xd0, 0x1e, 0x4b, - 0x5a, 0x69, 0x02, 0x21, 0x0a, 0x43, 0x5a, 0x61, 0x5b, 0x69, 0x00, 0x2d, - 0x13, 0xd0, 0x18, 0x4b, 0x5a, 0x68, 0x14, 0x23, 0x63, 0x43, 0x17, 0x49, - 0xcb, 0x18, 0x9b, 0x68, 0x13, 0x42, 0x06, 0xd1, 0x14, 0x23, 0x63, 0x43, - 0xcb, 0x18, 0x98, 0x7c, 0x01, 0x99, 0xff, 0xf7, 0x9b, 0xff, 0x10, 0x4a, - 0x53, 0x68, 0x33, 0x43, 0x53, 0x60, 0x0f, 0x48, 0x14, 0x23, 0x5c, 0x43, - 0x01, 0x19, 0x4b, 0x68, 0x1a, 0x68, 0x0f, 0x25, 0xaa, 0x43, 0x1a, 0x60, - 0x20, 0x58, 0x09, 0x7c, 0x0e, 0x22, 0x8a, 0x40, 0x42, 0x60, 0x00, 0x22, - 0x1a, 0x60, 0x38, 0x00, 0x05, 0xe0, 0x01, 0x34, 0x00, 0xe0, 0x3c, 0x00, - 0xbc, 0x42, 0xac, 0xd9, 0x00, 0x20, 0x03, 0xb0, 0xf0, 0xbd, 0xc0, 0x46, - 0xe0, 0x3f, 0x01, 0x08, 0xe8, 0x24, 0x00, 0x20, 0x74, 0x40, 0x01, 0x08, - 0x00, 0x10, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x04, 0x00, 0x03, 0x78, 0x01, 0x2b, 0x26, 0xd1, 0x14, 0x4b, - 0x98, 0x42, 0x19, 0xd1, 0x03, 0x00, 0x13, 0x4a, 0x02, 0x21, 0x00, 0x20, - 0xff, 0xf7, 0x82, 0xff, 0xe0, 0x62, 0x00, 0x28, 0x02, 0xd1, 0x10, 0x48, - 0x03, 0xf0, 0x8c, 0xfc, 0x0f, 0x4b, 0x9a, 0x69, 0x80, 0x21, 0x89, 0x00, - 0x0a, 0x43, 0x9a, 0x61, 0x9b, 0x69, 0xe3, 0x6a, 0x5b, 0x68, 0x0c, 0x4a, - 0x9a, 0x60, 0xa3, 0x6a, 0x00, 0x22, 0x1a, 0x61, 0x0a, 0x48, 0xff, 0xf7, - 0xbb, 0xfa, 0xa3, 0x6a, 0x01, 0x22, 0x9a, 0x60, 0xa3, 0x6a, 0x1b, 0x68, - 0xdb, 0x07, 0xfb, 0xd5, 0x10, 0xbd, 0xc0, 0x46, 0xc0, 0x18, 0x00, 0x20, - 0xf1, 0xeb, 0x00, 0x08, 0x64, 0x41, 0x01, 0x08, 0x00, 0x10, 0x02, 0x40, - 0x40, 0x24, 0x01, 0x40, 0x00, 0x24, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x08, 0x4c, - 0x20, 0x00, 0x02, 0xf0, 0xfb, 0xf8, 0x07, 0x4b, 0xa3, 0x62, 0x03, 0x21, - 0x1e, 0x20, 0xff, 0xf7, 0x25, 0xff, 0x00, 0x23, 0x00, 0x22, 0x0e, 0x21, - 0x20, 0x00, 0xff, 0xf7, 0x8f, 0xf9, 0x10, 0xbd, 0x6c, 0x22, 0x00, 0x20, - 0x00, 0x64, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x16, 0x4d, - 0x28, 0x00, 0x02, 0xf0, 0x13, 0xf9, 0x15, 0x4c, 0xac, 0x62, 0x00, 0x26, - 0xee, 0x62, 0x14, 0x4b, 0x2b, 0x63, 0x02, 0x21, 0x0c, 0x20, 0xff, 0xf7, - 0x09, 0xff, 0x12, 0x4b, 0x9a, 0x69, 0x80, 0x21, 0x89, 0x00, 0x0a, 0x43, - 0x9a, 0x61, 0x9b, 0x69, 0x0f, 0x4b, 0x1e, 0x60, 0x20, 0x00, 0xff, 0xf7, - 0x6d, 0xfa, 0xa3, 0x68, 0x80, 0x22, 0x12, 0x06, 0x13, 0x43, 0xa3, 0x60, - 0x07, 0x4b, 0x9b, 0x68, 0x00, 0x2b, 0xfb, 0xdb, 0x00, 0x22, 0x05, 0x4b, - 0x9a, 0x60, 0x06, 0x4b, 0x99, 0x69, 0x07, 0x4a, 0x0a, 0x40, 0x9a, 0x61, - 0x9b, 0x69, 0x70, 0xbd, 0xc0, 0x18, 0x00, 0x20, 0x00, 0x24, 0x01, 0x40, - 0x8a, 0x25, 0x01, 0x00, 0x00, 0x10, 0x02, 0x40, 0x08, 0x27, 0x01, 0x40, - 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x03, 0x21, 0x05, 0x20, 0xff, 0xf7, - 0xd3, 0xfe, 0x03, 0x21, 0x06, 0x20, 0xff, 0xf7, 0xcf, 0xfe, 0x03, 0x21, - 0x07, 0x20, 0xff, 0xf7, 0xcb, 0xfe, 0x03, 0x21, 0x1b, 0x20, 0xff, 0xf7, - 0xc7, 0xfe, 0x03, 0x21, 0x1c, 0x20, 0xff, 0xf7, 0xc3, 0xfe, 0x03, 0x21, - 0x1d, 0x20, 0xff, 0xf7, 0xbf, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x15, 0x4b, - 0x9a, 0x6a, 0x15, 0x49, 0x0a, 0x43, 0x9a, 0x62, 0x99, 0x6a, 0xbc, 0x22, - 0xd2, 0x03, 0x0a, 0x40, 0x9a, 0x62, 0x9a, 0x6a, 0x1a, 0x69, 0x01, 0x22, - 0x52, 0x42, 0x1a, 0x61, 0x1a, 0x69, 0x00, 0x22, 0x1a, 0x61, 0x1a, 0x69, - 0xda, 0x68, 0x0d, 0x49, 0x0a, 0x43, 0xda, 0x60, 0xd9, 0x68, 0x80, 0x22, - 0xd2, 0x03, 0x0a, 0x40, 0xda, 0x60, 0xda, 0x68, 0xda, 0x69, 0x80, 0x21, - 0x49, 0x05, 0x0a, 0x43, 0xda, 0x61, 0xdb, 0x69, 0xff, 0xf7, 0xd2, 0xf9, - 0xff, 0xf7, 0xb8, 0xf8, 0xff, 0xf7, 0xb6, 0xff, 0x10, 0xbd, 0xc0, 0x46, - 0x00, 0x10, 0x02, 0x40, 0xff, 0xff, 0xa1, 0xff, 0xff, 0xff, 0xbf, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x00, 0x03, 0xf0, 0xd3, 0xfb, 0x00, 0x2c, - 0x02, 0xd1, 0x0b, 0x48, 0x03, 0xf0, 0xa6, 0xfb, 0x63, 0x69, 0x00, 0x2b, - 0x03, 0xd1, 0x20, 0x1d, 0x04, 0x21, 0xfd, 0xf7, 0x6f, 0xfa, 0x20, 0x00, - 0x0c, 0x30, 0x29, 0x00, 0x02, 0xf0, 0xb2, 0xf8, 0x00, 0x28, 0x04, 0xda, - 0x20, 0x1d, 0x80, 0x21, 0xc9, 0x00, 0xfd, 0xf7, 0x63, 0xfa, 0x70, 0xbd, - 0x58, 0x40, 0x01, 0x08, 0x30, 0xb5, 0x83, 0xb0, 0x04, 0x00, 0x05, 0x68, - 0x04, 0x22, 0x41, 0x68, 0x01, 0xa8, 0x03, 0xf0, 0x43, 0xff, 0x01, 0x9a, - 0xe3, 0x7d, 0x00, 0x2b, 0x11, 0xd1, 0xeb, 0x68, 0x00, 0x2b, 0x02, 0xd1, - 0x00, 0x2a, 0x00, 0xd0, 0x6b, 0x77, 0xea, 0x60, 0x53, 0x08, 0x59, 0x00, - 0xcb, 0x18, 0x2b, 0x61, 0x93, 0x42, 0x02, 0xd2, 0x01, 0x23, 0x5b, 0x42, - 0x2b, 0x61, 0x00, 0x23, 0x2b, 0x62, 0x00, 0x20, 0x03, 0xb0, 0x30, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x5f, 0x46, 0x56, 0x46, 0xc0, 0xb4, 0x83, 0xb0, 0x04, 0x00, - 0x00, 0x92, 0x1e, 0x00, 0x0a, 0x0c, 0x0b, 0x0a, 0xdd, 0xb2, 0xcb, 0xb2, - 0x49, 0x07, 0x00, 0xd0, 0x81, 0xe0, 0xdf, 0x08, 0x0a, 0x9b, 0x1b, 0x78, - 0xfb, 0x18, 0xdb, 0xb2, 0x0a, 0x99, 0x0b, 0x70, 0x08, 0x2b, 0x7a, 0xd8, - 0x07, 0x2a, 0x23, 0xd8, 0x00, 0x2d, 0x21, 0xd1, 0x01, 0x2a, 0x09, 0xd9, - 0x02, 0x2a, 0x09, 0xd0, 0x05, 0x2a, 0x09, 0xd0, 0x03, 0x2a, 0x09, 0xd0, - 0x06, 0x2a, 0x09, 0xd0, 0x04, 0x23, 0x08, 0xe0, 0x00, 0x23, 0x06, 0xe0, - 0x01, 0x23, 0x04, 0xe0, 0x01, 0x23, 0x02, 0xe0, 0x02, 0x23, 0x00, 0xe0, - 0x02, 0x23, 0xbb, 0x42, 0x61, 0xd3, 0x00, 0x9b, 0x00, 0x2b, 0x03, 0xd1, - 0x38, 0x4b, 0x33, 0x60, 0x00, 0x20, 0x67, 0xe0, 0x37, 0x4b, 0x33, 0x60, - 0x00, 0x20, 0x63, 0xe0, 0x11, 0x00, 0x20, 0x00, 0xfb, 0xf7, 0xce, 0xfd, - 0x82, 0x46, 0x34, 0x4b, 0x98, 0x42, 0x50, 0xd0, 0xe3, 0x23, 0x9b, 0x00, - 0xe1, 0x58, 0x42, 0x00, 0x52, 0x44, 0x93, 0x00, 0xcb, 0x18, 0x9b, 0x78, - 0x9d, 0x42, 0x48, 0xd8, 0x2a, 0x00, 0x01, 0x00, 0x20, 0x00, 0xfb, 0xf7, - 0x4b, 0xfd, 0x01, 0x90, 0xc3, 0xb2, 0x9b, 0x46, 0x00, 0x9b, 0x00, 0x2b, - 0x04, 0xd1, 0x18, 0x33, 0x5a, 0x46, 0x13, 0x40, 0x18, 0x2b, 0x3a, 0xd1, - 0x00, 0x9b, 0x00, 0x2b, 0x04, 0xd0, 0x24, 0x23, 0x5a, 0x46, 0x13, 0x40, - 0x24, 0x2b, 0x34, 0xd1, 0x2a, 0x00, 0x51, 0x46, 0x20, 0x00, 0xfb, 0xf7, - 0x6b, 0xfd, 0xc0, 0xb2, 0x87, 0x42, 0x2e, 0xd8, 0x6b, 0x46, 0x1b, 0x79, - 0xdb, 0x09, 0x0c, 0x9a, 0x13, 0x70, 0x2a, 0x00, 0x51, 0x46, 0x20, 0x00, - 0xfb, 0xf7, 0xf6, 0xfc, 0x30, 0x60, 0x5b, 0x46, 0x5b, 0x06, 0x22, 0xd5, - 0x0a, 0x9b, 0x1b, 0x78, 0xdb, 0x1b, 0x08, 0xe0, 0x01, 0x22, 0x9a, 0x40, - 0x0b, 0x99, 0x09, 0x78, 0x0a, 0x43, 0x0b, 0x99, 0x0a, 0x70, 0x01, 0x33, - 0x1b, 0xb2, 0x0a, 0x9a, 0x12, 0x78, 0x93, 0x42, 0xf2, 0xdb, 0x00, 0x20, - 0x10, 0xe0, 0x0e, 0x48, 0x0e, 0xe0, 0x0e, 0x48, 0x0c, 0xe0, 0x0c, 0x48, - 0x0a, 0xe0, 0x0d, 0x48, 0x08, 0xe0, 0x0c, 0x48, 0x06, 0xe0, 0x09, 0x48, - 0x04, 0xe0, 0x08, 0x48, 0x02, 0xe0, 0x07, 0x48, 0x00, 0xe0, 0x00, 0x20, - 0x03, 0xb0, 0x0c, 0xbc, 0x92, 0x46, 0x9b, 0x46, 0xf0, 0xbd, 0xc0, 0x46, - 0xf4, 0x18, 0x00, 0x20, 0xf8, 0x18, 0x00, 0x20, 0xff, 0xff, 0x00, 0x00, - 0x41, 0x00, 0x04, 0x06, 0x42, 0x00, 0x04, 0x06, 0x00, 0x00, 0x02, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x4f, 0x46, - 0x46, 0x46, 0xc0, 0xb4, 0x89, 0xb0, 0x05, 0x00, 0x00, 0x22, 0x1f, 0x23, - 0x6b, 0x44, 0x1a, 0x70, 0xc3, 0x68, 0x04, 0x33, 0x44, 0x20, 0x2a, 0x54, - 0x0e, 0xb2, 0x00, 0x27, 0x34, 0xe0, 0x1f, 0x22, 0x6a, 0x44, 0x14, 0x78, - 0x19, 0x1d, 0x88, 0x46, 0x1b, 0x68, 0x99, 0x46, 0x2b, 0x00, 0x44, 0x33, - 0x17, 0x21, 0x69, 0x44, 0x02, 0x91, 0x01, 0x93, 0x00, 0x92, 0x06, 0xab, - 0x01, 0x22, 0x49, 0x46, 0x68, 0x68, 0xff, 0xf7, 0x23, 0xff, 0x07, 0x1e, - 0x0b, 0xd0, 0x00, 0x22, 0x1f, 0x23, 0x6b, 0x44, 0x1a, 0x70, 0x4b, 0x46, - 0x82, 0x22, 0x12, 0x02, 0x1a, 0x21, 0x28, 0x68, 0x01, 0xf0, 0x76, 0xfa, - 0x14, 0xe0, 0x23, 0xb2, 0x08, 0xe0, 0x06, 0x99, 0x4a, 0x1c, 0x06, 0x92, - 0x9a, 0x1d, 0x92, 0x00, 0xaa, 0x18, 0x51, 0x60, 0x01, 0x33, 0x1b, 0xb2, - 0x1f, 0x22, 0x6a, 0x44, 0x12, 0x78, 0x93, 0x42, 0xf1, 0xdb, 0x01, 0x3e, - 0x36, 0xb2, 0x43, 0x46, 0x00, 0x2e, 0xc8, 0xdc, 0x1f, 0x23, 0x6b, 0x44, - 0x1b, 0x78, 0xab, 0x76, 0x38, 0x00, 0x09, 0xb0, 0x0c, 0xbc, 0x90, 0x46, - 0x99, 0x46, 0xf0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x86, 0xb0, 0x04, 0x68, 0xc3, 0x7d, - 0x00, 0x2b, 0x09, 0xd0, 0x42, 0x68, 0x83, 0x7d, 0x00, 0x2b, 0x3c, 0xd1, - 0xa3, 0x7e, 0x00, 0x2b, 0x3b, 0xd1, 0x13, 0x70, 0x00, 0x20, 0x41, 0xe0, - 0x23, 0x7e, 0x1a, 0x07, 0x37, 0xd4, 0x22, 0x69, 0x12, 0x78, 0x52, 0xb2, - 0x05, 0x2a, 0x01, 0xd1, 0x9b, 0x07, 0x32, 0xd4, 0x63, 0x7e, 0x00, 0x2b, - 0x31, 0xd1, 0x83, 0x7d, 0x00, 0x2b, 0x07, 0xd1, 0x43, 0x68, 0x19, 0x78, - 0x08, 0x29, 0x2c, 0xd8, 0x20, 0x00, 0xff, 0xf7, 0x81, 0xff, 0x29, 0xe0, - 0x41, 0x68, 0x04, 0x22, 0x05, 0xa8, 0x03, 0xf0, 0xe7, 0xfd, 0x05, 0x99, - 0x00, 0x23, 0x11, 0x22, 0x6a, 0x44, 0x13, 0x70, 0x12, 0x22, 0x6a, 0x44, - 0x13, 0x70, 0xa3, 0x7e, 0x00, 0x2b, 0x0c, 0xd1, 0x60, 0x68, 0x13, 0x33, - 0x6b, 0x44, 0x02, 0x93, 0x01, 0x92, 0x11, 0x23, 0x6b, 0x44, 0x00, 0x93, - 0x05, 0xab, 0x01, 0x22, 0xff, 0xf7, 0xac, 0xfe, 0x0c, 0xe0, 0x07, 0x48, - 0x0a, 0xe0, 0x00, 0x20, 0x08, 0xe0, 0x00, 0x20, 0x06, 0xe0, 0x05, 0x48, - 0x04, 0xe0, 0x05, 0x48, 0x02, 0xe0, 0x02, 0x48, 0x00, 0xe0, 0x04, 0x48, - 0x06, 0xb0, 0x10, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x02, 0x00, 0x01, 0x06, - 0x22, 0x00, 0x00, 0x08, 0x42, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x4f, 0x46, 0x46, 0x46, 0xc0, 0xb4, - 0x89, 0xb0, 0x05, 0x00, 0x00, 0x22, 0x1f, 0x23, 0x6b, 0x44, 0x1a, 0x70, - 0xc3, 0x68, 0x04, 0x33, 0x0e, 0xb2, 0x00, 0x27, 0x36, 0xe0, 0x16, 0x21, - 0x69, 0x44, 0x00, 0x22, 0x0a, 0x70, 0x1f, 0x32, 0x6a, 0x44, 0x14, 0x78, - 0x18, 0x1d, 0x80, 0x46, 0x1b, 0x68, 0x99, 0x46, 0x17, 0x23, 0x6b, 0x44, - 0x02, 0x93, 0x01, 0x91, 0x00, 0x92, 0x06, 0xab, 0x00, 0x22, 0x49, 0x46, - 0x68, 0x68, 0xff, 0xf7, 0x6b, 0xfe, 0x07, 0x1e, 0x0b, 0xd0, 0x00, 0x22, - 0x1f, 0x23, 0x6b, 0x44, 0x1a, 0x70, 0x4b, 0x46, 0x82, 0x22, 0x12, 0x02, - 0x1a, 0x21, 0x28, 0x68, 0x01, 0xf0, 0xbe, 0xf9, 0x14, 0xe0, 0x23, 0xb2, - 0x08, 0xe0, 0x06, 0x99, 0x4a, 0x1c, 0x06, 0x92, 0x9a, 0x1d, 0x92, 0x00, - 0xaa, 0x18, 0x51, 0x60, 0x01, 0x33, 0x1b, 0xb2, 0x1f, 0x22, 0x6a, 0x44, - 0x12, 0x78, 0x93, 0x42, 0xf1, 0xdb, 0x01, 0x3e, 0x36, 0xb2, 0x43, 0x46, - 0x00, 0x2e, 0xc6, 0xdc, 0x1f, 0x23, 0x6b, 0x44, 0x1b, 0x78, 0xab, 0x76, - 0x38, 0x00, 0x09, 0xb0, 0x0c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xf0, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x86, 0xb0, 0x04, 0x68, 0xc3, 0x7d, 0x00, 0x2b, 0x09, 0xd0, - 0x42, 0x68, 0x83, 0x7d, 0x00, 0x2b, 0x3c, 0xd1, 0xa3, 0x7e, 0x00, 0x2b, - 0x3b, 0xd1, 0x13, 0x70, 0x00, 0x20, 0x41, 0xe0, 0x23, 0x7e, 0x1a, 0x07, - 0x37, 0xd4, 0x22, 0x69, 0x12, 0x78, 0x52, 0xb2, 0x05, 0x2a, 0x01, 0xd1, - 0x9b, 0x07, 0x32, 0xd4, 0x63, 0x7e, 0x00, 0x2b, 0x31, 0xd1, 0x83, 0x7d, - 0x00, 0x2b, 0x07, 0xd1, 0x43, 0x68, 0x19, 0x78, 0x08, 0x29, 0x2c, 0xd8, - 0x20, 0x00, 0xff, 0xf7, 0x81, 0xff, 0x29, 0xe0, 0x41, 0x68, 0x04, 0x22, - 0x05, 0xa8, 0x03, 0xf0, 0x2f, 0xfd, 0x05, 0x99, 0x00, 0x23, 0x11, 0x22, - 0x6a, 0x44, 0x13, 0x70, 0x12, 0x22, 0x6a, 0x44, 0x13, 0x70, 0xa3, 0x7e, - 0x00, 0x2b, 0x0c, 0xd1, 0x60, 0x68, 0x13, 0x33, 0x6b, 0x44, 0x02, 0x93, - 0x01, 0x92, 0x11, 0x23, 0x6b, 0x44, 0x00, 0x93, 0x05, 0xab, 0x00, 0x22, - 0xff, 0xf7, 0xf4, 0xfd, 0x0c, 0xe0, 0x07, 0x48, 0x0a, 0xe0, 0x00, 0x20, - 0x08, 0xe0, 0x00, 0x20, 0x06, 0xe0, 0x05, 0x48, 0x04, 0xe0, 0x05, 0x48, - 0x02, 0xe0, 0x02, 0x48, 0x00, 0xe0, 0x04, 0x48, 0x06, 0xb0, 0x10, 0xbd, - 0x00, 0x00, 0x01, 0x06, 0x02, 0x00, 0x01, 0x06, 0x22, 0x00, 0x00, 0x08, - 0x42, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x82, 0xb0, 0x04, 0x00, 0x88, 0xb2, 0x12, 0x4b, 0x19, 0x42, - 0x0d, 0xd1, 0xa3, 0x7e, 0x00, 0x2b, 0x0a, 0xd0, 0x00, 0x28, 0x08, 0xd0, - 0xe3, 0x8a, 0x98, 0x42, 0x02, 0xd1, 0x23, 0x7d, 0xc0, 0x18, 0x80, 0xb2, - 0x01, 0x23, 0x63, 0x76, 0x02, 0xe0, 0x00, 0x23, 0x63, 0x76, 0x00, 0x20, - 0x54, 0x23, 0xe1, 0x5a, 0xa3, 0x7e, 0x01, 0x92, 0x00, 0x93, 0x00, 0x23, - 0x02, 0x00, 0xe0, 0x6c, 0xfb, 0xf7, 0x1e, 0xfd, 0x20, 0x65, 0x00, 0x28, - 0x01, 0xd1, 0x00, 0x23, 0x63, 0x76, 0x02, 0xb0, 0x10, 0xbd, 0xc0, 0x46, - 0x00, 0xf8, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x82, 0xb0, 0x04, 0x68, 0x83, 0x7d, 0x04, 0x2b, 0x00, 0xd1, - 0x94, 0xe0, 0xc2, 0x7d, 0x00, 0x2a, 0x20, 0xd0, 0x01, 0x2b, 0x00, 0xd0, - 0x90, 0xe0, 0x45, 0x68, 0x04, 0x22, 0x29, 0x00, 0x01, 0xa8, 0x03, 0xf0, - 0xb9, 0xfc, 0x01, 0x9b, 0x1a, 0x04, 0x12, 0x0c, 0xe1, 0x8a, 0x8a, 0x42, - 0x03, 0xd1, 0x00, 0x29, 0x01, 0xd0, 0x22, 0x7d, 0x9b, 0x18, 0x62, 0x7e, - 0x00, 0x2a, 0x02, 0xd1, 0x80, 0x22, 0x12, 0x06, 0x13, 0x43, 0x00, 0x93, - 0x04, 0x22, 0x69, 0x46, 0x28, 0x00, 0x03, 0xf0, 0xa3, 0xfc, 0x00, 0x20, - 0x85, 0xe0, 0x22, 0x7e, 0x51, 0x07, 0x71, 0xd4, 0x21, 0x69, 0x09, 0x78, - 0x49, 0xb2, 0x05, 0x29, 0x01, 0xd1, 0xd2, 0x07, 0x6c, 0xd4, 0x01, 0x2b, - 0x2d, 0xd1, 0x46, 0x68, 0x04, 0x22, 0x31, 0x00, 0x01, 0xa8, 0x03, 0xf0, - 0x8f, 0xfc, 0x01, 0x9d, 0x3a, 0x4b, 0x1d, 0x42, 0x62, 0xd1, 0x2a, 0x04, - 0x12, 0x0c, 0xe1, 0x8a, 0x23, 0x7d, 0xcb, 0x18, 0x9a, 0x42, 0x08, 0xd1, - 0xad, 0x0f, 0xad, 0x07, 0x4d, 0x19, 0x01, 0x95, 0x04, 0x22, 0x01, 0xa9, - 0x30, 0x00, 0x03, 0xf0, 0x7b, 0xfc, 0x63, 0x7e, 0x00, 0x2b, 0x04, 0xd0, - 0xa3, 0x68, 0x5b, 0x68, 0x6b, 0x40, 0x9b, 0x00, 0x4c, 0xd1, 0x23, 0x6d, - 0x5a, 0x7c, 0xd2, 0xb2, 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, 0x70, 0xff, - 0xff, 0x22, 0x45, 0x23, 0xe2, 0x54, 0x00, 0x20, 0x4b, 0xe0, 0x02, 0x2b, - 0x12, 0xd1, 0x43, 0x68, 0x1a, 0x78, 0x13, 0x00, 0x0f, 0x33, 0xdb, 0xb2, - 0x0c, 0x2b, 0x39, 0xd9, 0x00, 0x23, 0xf0, 0x21, 0x91, 0x42, 0x5b, 0x41, - 0xdb, 0xb2, 0x22, 0x6d, 0x53, 0x74, 0xff, 0x22, 0x45, 0x23, 0xe2, 0x54, - 0x00, 0x20, 0x36, 0xe0, 0x03, 0x2b, 0x05, 0xd1, 0x63, 0x7e, 0x00, 0x2b, - 0x2a, 0xd1, 0xe3, 0x63, 0x00, 0x20, 0x2e, 0xe0, 0x05, 0x2b, 0x0c, 0xd1, - 0x41, 0x68, 0x01, 0xad, 0x02, 0x22, 0x28, 0x00, 0x03, 0xf0, 0x42, 0xfc, - 0x2a, 0x88, 0xfa, 0x23, 0x9b, 0x00, 0x53, 0x43, 0x23, 0x64, 0x00, 0x20, - 0x1f, 0xe0, 0x06, 0x2b, 0x18, 0xd1, 0x42, 0x68, 0x63, 0x7e, 0x00, 0x2b, - 0x16, 0xd1, 0x13, 0x78, 0xf0, 0x2b, 0x15, 0xd9, 0x0d, 0x48, 0x14, 0xe0, - 0x0d, 0x48, 0x12, 0xe0, 0x00, 0x20, 0x10, 0xe0, 0x0c, 0x48, 0x0e, 0xe0, - 0x0c, 0x48, 0x0c, 0xe0, 0x08, 0x48, 0x0a, 0xe0, 0x07, 0x48, 0x08, 0xe0, - 0x06, 0x48, 0x06, 0xe0, 0x05, 0x48, 0x04, 0xe0, 0x00, 0x20, 0x02, 0xe0, - 0x03, 0x48, 0x00, 0xe0, 0x00, 0x20, 0x02, 0xb0, 0x70, 0xbd, 0xc0, 0x46, - 0x00, 0x80, 0xff, 0x3f, 0x30, 0x00, 0x09, 0x06, 0x11, 0x00, 0x09, 0x06, - 0x02, 0x00, 0x01, 0x06, 0x22, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x30, 0xb5, 0x83, 0xb0, 0x04, 0x68, 0x43, 0x68, 0x1a, 0x78, 0xc3, 0x7d, - 0x00, 0x2b, 0x1a, 0xd1, 0xe3, 0x68, 0x00, 0x2b, 0x19, 0xd1, 0x01, 0x2a, - 0x19, 0xd0, 0xf0, 0x2a, 0x19, 0xd8, 0x22, 0x75, 0x00, 0x2a, 0x01, 0xd1, - 0x00, 0x25, 0x00, 0xe0, 0x01, 0x25, 0xa0, 0x6b, 0x40, 0x23, 0xe1, 0x5a, - 0x62, 0x89, 0x00, 0x23, 0x01, 0x93, 0x00, 0x95, 0xfb, 0xf7, 0x32, 0xfc, - 0xe0, 0x63, 0x00, 0x28, 0x09, 0xd0, 0x00, 0x20, 0x08, 0xe0, 0x00, 0x20, - 0x06, 0xe0, 0x04, 0x48, 0x04, 0xe0, 0x04, 0x48, 0x02, 0xe0, 0x03, 0x48, - 0x00, 0xe0, 0x01, 0x48, 0x03, 0xb0, 0x30, 0xbd, 0x22, 0x00, 0x00, 0x08, - 0x30, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x84, 0xb0, 0x04, 0x00, 0x8a, 0xb2, - 0x18, 0x4b, 0x19, 0x42, 0x15, 0xd1, 0x83, 0x7e, 0x00, 0x2b, 0x12, 0xd0, - 0x00, 0x2a, 0x10, 0xd0, 0xc3, 0x8a, 0x9a, 0x42, 0x02, 0xd1, 0x03, 0x7d, - 0xd2, 0x18, 0x92, 0xb2, 0x01, 0x23, 0x63, 0x76, 0xa3, 0x68, 0x19, 0x7a, - 0x00, 0x23, 0xf0, 0x20, 0x88, 0x42, 0x5b, 0x41, 0x40, 0x21, 0x63, 0x54, - 0x04, 0xe0, 0x00, 0x23, 0x63, 0x76, 0x63, 0x64, 0xa3, 0x64, 0x00, 0x22, - 0x68, 0x23, 0xe1, 0x5a, 0x09, 0x4b, 0x02, 0x93, 0x01, 0x94, 0x00, 0x23, - 0x00, 0x93, 0x08, 0x4b, 0x60, 0x6e, 0xfb, 0xf7, 0x1b, 0xfc, 0x00, 0x28, - 0x03, 0xd0, 0x00, 0x23, 0x63, 0x76, 0x63, 0x64, 0xa3, 0x64, 0x04, 0xb0, - 0x10, 0xbd, 0xc0, 0x46, 0x00, 0xf8, 0xff, 0xbf, 0xb1, 0xff, 0x00, 0x08, - 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x82, 0xb0, 0x04, 0x68, 0xc3, 0x7d, 0x00, 0x2b, 0x20, 0xd0, - 0x83, 0x7d, 0x01, 0x2b, 0x6a, 0xd1, 0x45, 0x68, 0x04, 0x22, 0x29, 0x00, - 0x01, 0xa8, 0x03, 0xf0, 0x85, 0xfb, 0x01, 0x9b, 0x1a, 0x04, 0x12, 0x0c, - 0xe1, 0x8a, 0x8a, 0x42, 0x03, 0xd1, 0x00, 0x29, 0x01, 0xd0, 0x22, 0x7d, - 0x9b, 0x18, 0x62, 0x7e, 0x00, 0x2a, 0x02, 0xd1, 0x80, 0x22, 0x12, 0x06, - 0x13, 0x43, 0x00, 0x93, 0x04, 0x22, 0x69, 0x46, 0x28, 0x00, 0x03, 0xf0, - 0x6f, 0xfb, 0x00, 0x20, 0x5b, 0xe0, 0x23, 0x7e, 0x5a, 0x07, 0x4b, 0xd4, - 0x22, 0x69, 0x12, 0x78, 0x52, 0xb2, 0x05, 0x2a, 0x01, 0xd1, 0xdb, 0x07, - 0x46, 0xd4, 0x83, 0x7d, 0x01, 0x2b, 0x27, 0xd1, 0x46, 0x68, 0x04, 0x22, - 0x31, 0x00, 0x01, 0xa8, 0x03, 0xf0, 0x5a, 0xfb, 0x01, 0x9d, 0x25, 0x4b, - 0x1d, 0x42, 0x3b, 0xd1, 0x2a, 0x04, 0x12, 0x0c, 0xe1, 0x8a, 0x23, 0x7d, - 0xcb, 0x18, 0x9a, 0x42, 0x08, 0xd1, 0xad, 0x0f, 0xad, 0x07, 0x4d, 0x19, - 0x01, 0x95, 0x04, 0x22, 0x01, 0xa9, 0x30, 0x00, 0x03, 0xf0, 0x46, 0xfb, - 0x63, 0x7e, 0x00, 0x2b, 0x04, 0xd0, 0xa3, 0x68, 0x5b, 0x68, 0x6b, 0x40, - 0x9b, 0x00, 0x25, 0xd1, 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, 0x66, 0xff, - 0x00, 0x20, 0x26, 0xe0, 0x02, 0x2b, 0x1f, 0xd1, 0x43, 0x68, 0x40, 0x22, - 0xa1, 0x5c, 0x1a, 0x78, 0x13, 0x00, 0x0f, 0x33, 0xdb, 0xb2, 0x0c, 0x2b, - 0x18, 0xd9, 0x00, 0x23, 0xf0, 0x20, 0x90, 0x42, 0x5b, 0x41, 0xdb, 0xb2, - 0x40, 0x22, 0xa3, 0x54, 0x99, 0x42, 0x11, 0xd0, 0x00, 0x23, 0xa3, 0x64, - 0x00, 0x20, 0x0e, 0xe0, 0x00, 0x20, 0x0c, 0xe0, 0x08, 0x48, 0x0a, 0xe0, - 0x08, 0x48, 0x08, 0xe0, 0x08, 0x48, 0x06, 0xe0, 0x07, 0x48, 0x04, 0xe0, - 0x00, 0x20, 0x02, 0xe0, 0x05, 0x48, 0x00, 0xe0, 0x00, 0x20, 0x02, 0xb0, - 0x70, 0xbd, 0xc0, 0x46, 0x00, 0x80, 0xff, 0x3f, 0x02, 0x00, 0x01, 0x06, - 0x22, 0x00, 0x00, 0x08, 0x30, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x86, 0xb0, 0x04, 0x00, 0x05, 0x68, 0x04, 0x22, 0x41, 0x68, - 0x05, 0xa8, 0x03, 0xf0, 0xfb, 0xfa, 0x05, 0x9a, 0xe3, 0x7d, 0x00, 0x2b, - 0x46, 0xd1, 0x93, 0x00, 0x07, 0xd4, 0x53, 0x00, 0x08, 0xd5, 0x2b, 0x7a, - 0x00, 0x2b, 0x08, 0xd0, 0x00, 0x23, 0x22, 0x4c, 0x07, 0xe0, 0x00, 0x23, - 0x21, 0x4c, 0x04, 0xe0, 0x00, 0x23, 0x00, 0x24, 0x01, 0xe0, 0x01, 0x23, - 0x00, 0x24, 0x00, 0x2c, 0x22, 0xd1, 0x52, 0x05, 0x52, 0x0d, 0x6a, 0x81, - 0x00, 0x2b, 0x1b, 0xd0, 0x2b, 0x7d, 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x23, - 0x6b, 0x77, 0x2b, 0x62, 0x01, 0x33, 0x00, 0xe0, 0x00, 0x23, 0xa8, 0x6b, - 0x40, 0x21, 0x69, 0x5a, 0x00, 0x26, 0x01, 0x96, 0x00, 0x93, 0x00, 0x23, - 0xfb, 0xf7, 0x10, 0xfb, 0xe8, 0x63, 0x00, 0x28, 0x03, 0xd1, 0x00, 0x23, - 0x2b, 0x72, 0x0e, 0x4c, 0x04, 0xe0, 0x01, 0x23, 0x2b, 0x72, 0x01, 0xe0, - 0x00, 0x23, 0x2b, 0x72, 0x00, 0x2c, 0x10, 0xd1, 0x28, 0x6b, 0xa9, 0x8e, - 0x6a, 0x89, 0x0a, 0x4b, 0x02, 0x93, 0x01, 0x95, 0x00, 0x23, 0x00, 0x93, - 0x08, 0x4b, 0xfb, 0xf7, 0x27, 0xfb, 0x00, 0x28, 0x02, 0xd1, 0x02, 0xe0, - 0x00, 0x24, 0x00, 0xe0, 0x01, 0x4c, 0x20, 0x00, 0x06, 0xb0, 0x70, 0xbd, - 0x22, 0x00, 0x00, 0x08, 0x30, 0x00, 0x09, 0x06, 0x11, 0x06, 0x01, 0x08, - 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, 0x0b, 0x79, 0x1b, 0x07, - 0x1b, 0x0f, 0x10, 0x31, 0x42, 0x7e, 0x00, 0x2a, 0x2a, 0xd0, 0x02, 0x69, - 0x12, 0x78, 0x52, 0xb2, 0x05, 0x2a, 0x25, 0xd1, 0x82, 0x7e, 0x93, 0x42, - 0x22, 0xd3, 0xc3, 0x6b, 0x00, 0x2b, 0x08, 0xd0, 0x40, 0x22, 0x82, 0x5c, - 0x00, 0x2a, 0x06, 0xd0, 0x1b, 0x7f, 0x00, 0x2b, 0x05, 0xd1, 0x00, 0x25, - 0x04, 0xe0, 0x00, 0x25, 0x02, 0xe0, 0x00, 0x25, 0x00, 0xe0, 0x01, 0x25, - 0x28, 0x00, 0x09, 0x30, 0xc0, 0x00, 0x20, 0x18, 0x04, 0x30, 0x08, 0x22, - 0x03, 0xf0, 0x34, 0xfa, 0x10, 0x35, 0xad, 0x00, 0x65, 0x19, 0x01, 0x23, - 0x6b, 0x60, 0xe3, 0x6d, 0x00, 0x2b, 0x01, 0xd0, 0x20, 0x6e, 0x98, 0x47, - 0x70, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x43, 0x7f, - 0x01, 0x33, 0xdb, 0xb2, 0x43, 0x77, 0x02, 0x7d, 0x93, 0x42, 0x01, 0xd9, - 0x01, 0x23, 0x43, 0x77, 0x00, 0x23, 0x03, 0x62, 0x02, 0x7f, 0x53, 0x42, - 0x53, 0x41, 0x03, 0x77, 0x43, 0x7f, 0xc2, 0x6b, 0x13, 0x72, 0xc1, 0x6b, - 0x80, 0x6b, 0xfb, 0xf7, 0x09, 0xfd, 0x10, 0xbd, 0x30, 0xb5, 0x82, 0x7e, - 0x13, 0x00, 0x08, 0x33, 0x01, 0x6d, 0xcc, 0x18, 0x93, 0x1d, 0x9b, 0x00, - 0xc3, 0x18, 0x04, 0x33, 0x08, 0x2a, 0x69, 0xd8, 0x92, 0x00, 0x3e, 0x49, - 0x89, 0x58, 0x8f, 0x46, 0x62, 0x1e, 0x14, 0x78, 0x04, 0x3b, 0x19, 0x68, - 0x09, 0x78, 0x8c, 0x42, 0x05, 0xd0, 0x44, 0x21, 0x41, 0x56, 0x00, 0x29, - 0x5c, 0xdb, 0x14, 0x00, 0x00, 0xe0, 0x14, 0x00, 0x62, 0x1e, 0x14, 0x78, - 0x19, 0x1f, 0x0b, 0x68, 0x1b, 0x78, 0x9c, 0x42, 0x06, 0xd0, 0x44, 0x23, - 0xc3, 0x5c, 0x5b, 0x06, 0x02, 0xd5, 0x4f, 0xe0, 0x19, 0x00, 0x22, 0x00, - 0x54, 0x1e, 0x25, 0x78, 0x0b, 0x1f, 0x1a, 0x68, 0x12, 0x78, 0x95, 0x42, - 0x03, 0xd0, 0x44, 0x22, 0x82, 0x5c, 0x92, 0x06, 0x44, 0xd4, 0x62, 0x1e, - 0x14, 0x78, 0x19, 0x1f, 0x0b, 0x68, 0x1b, 0x78, 0x9c, 0x42, 0x06, 0xd0, - 0x44, 0x23, 0xc3, 0x5c, 0xdb, 0x06, 0x02, 0xd5, 0x3a, 0xe0, 0x19, 0x00, - 0x22, 0x00, 0x54, 0x1e, 0x25, 0x78, 0x0b, 0x1f, 0x1a, 0x68, 0x12, 0x78, - 0x95, 0x42, 0x03, 0xd0, 0x44, 0x22, 0x82, 0x5c, 0x12, 0x07, 0x2f, 0xd4, - 0x62, 0x1e, 0x14, 0x78, 0x19, 0x1f, 0x0b, 0x68, 0x1b, 0x78, 0x9c, 0x42, - 0x06, 0xd0, 0x44, 0x23, 0xc3, 0x5c, 0x5b, 0x07, 0x02, 0xd5, 0x25, 0xe0, - 0x19, 0x00, 0x22, 0x00, 0x54, 0x1e, 0x25, 0x78, 0x0b, 0x1f, 0x1a, 0x68, - 0x12, 0x78, 0x95, 0x42, 0x03, 0xd0, 0x44, 0x22, 0x82, 0x5c, 0x92, 0x07, - 0x1a, 0xd4, 0x62, 0x1e, 0x12, 0x78, 0x04, 0x3b, 0x1b, 0x68, 0x1b, 0x78, - 0x9a, 0x42, 0x15, 0xd0, 0x44, 0x23, 0xc3, 0x5c, 0xdb, 0x07, 0x13, 0xd4, - 0x00, 0x20, 0x12, 0xe0, 0x00, 0x20, 0x10, 0xe0, 0x01, 0x20, 0x0e, 0xe0, - 0x01, 0x20, 0x0c, 0xe0, 0x01, 0x20, 0x0a, 0xe0, 0x01, 0x20, 0x08, 0xe0, - 0x01, 0x20, 0x06, 0xe0, 0x01, 0x20, 0x04, 0xe0, 0x01, 0x20, 0x02, 0xe0, - 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x30, 0xbd, 0x84, 0x41, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x5f, 0x46, - 0x56, 0x46, 0x4d, 0x46, 0x44, 0x46, 0xf0, 0xb4, 0x83, 0xb0, 0x04, 0x00, - 0x16, 0x00, 0x98, 0x46, 0x0c, 0xaa, 0x01, 0xca, 0x12, 0x78, 0x93, 0x46, - 0x0e, 0xaa, 0x17, 0x88, 0x0f, 0xaa, 0x12, 0x78, 0x10, 0x9d, 0x12, 0xab, - 0x1b, 0x88, 0x9c, 0x46, 0x13, 0xab, 0x1b, 0x88, 0x9a, 0x46, 0x15, 0xab, - 0x1b, 0x88, 0x99, 0x46, 0x00, 0x2c, 0x58, 0xd0, 0x00, 0x29, 0x59, 0xd0, - 0x00, 0x2e, 0x5a, 0xd0, 0x00, 0x28, 0x5b, 0xd0, 0x00, 0x2d, 0x5c, 0xd0, - 0x11, 0x9b, 0x00, 0x2b, 0x5c, 0xd0, 0x14, 0x9b, 0x00, 0x2b, 0x5c, 0xd0, - 0x21, 0x60, 0x66, 0x60, 0x43, 0x46, 0xa3, 0x64, 0xa5, 0x60, 0x11, 0x9b, - 0xe3, 0x60, 0x20, 0x61, 0x5b, 0x46, 0x23, 0x75, 0xe7, 0x82, 0x22, 0x76, - 0x00, 0x27, 0x01, 0x97, 0x00, 0x97, 0x23, 0x00, 0x2b, 0x4a, 0x61, 0x46, - 0x30, 0x00, 0xfb, 0xf7, 0x2f, 0xf9, 0x01, 0x97, 0x00, 0x97, 0x23, 0x00, - 0x28, 0x4a, 0x51, 0x46, 0x30, 0x00, 0xfb, 0xf7, 0x27, 0xf9, 0x14, 0x9b, - 0xe3, 0x64, 0x54, 0x23, 0x4a, 0x46, 0xe2, 0x52, 0xe7, 0x63, 0xea, 0x89, - 0xfa, 0x23, 0x9b, 0x00, 0x53, 0x43, 0x23, 0x64, 0x2b, 0x7a, 0xfd, 0x2b, - 0x01, 0xd9, 0x01, 0x23, 0xe3, 0x76, 0x11, 0x9b, 0x19, 0x78, 0x20, 0x00, - 0xff, 0xf7, 0xf2, 0xfa, 0xff, 0x22, 0x45, 0x23, 0xe2, 0x54, 0x2b, 0x7a, - 0x00, 0x22, 0xf0, 0x21, 0x99, 0x42, 0x52, 0x41, 0xd2, 0xb2, 0x69, 0x68, - 0x20, 0x00, 0xff, 0xf7, 0x55, 0xfc, 0x2b, 0x7a, 0x0f, 0x33, 0xdb, 0xb2, - 0x0c, 0x2b, 0x02, 0xd9, 0x2b, 0x7c, 0xf0, 0x2b, 0x18, 0xd9, 0x00, 0x23, - 0x63, 0x76, 0x00, 0x20, 0x15, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x12, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x0f, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x0c, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x09, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x06, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x03, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x00, 0xe0, - 0x00, 0x20, 0x03, 0xb0, 0x3c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xa2, 0x46, - 0xab, 0x46, 0xf0, 0xbd, 0x51, 0xfb, 0x00, 0x08, 0xc1, 0xf8, 0x00, 0x08, - 0x00, 0x28, 0x01, 0xd0, 0x01, 0x66, 0xc2, 0x65, 0x70, 0x47, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x5f, 0x46, 0x56, 0x46, 0x45, 0x46, - 0xe0, 0xb4, 0x82, 0xb0, 0x04, 0x00, 0x15, 0x00, 0x98, 0x46, 0x0a, 0xaa, - 0x01, 0xca, 0x12, 0x78, 0x93, 0x46, 0x0c, 0xaa, 0x16, 0x88, 0x0d, 0xaa, - 0x12, 0x78, 0x10, 0xaf, 0x3f, 0x88, 0xbc, 0x46, 0x11, 0xaf, 0x3f, 0x88, - 0xba, 0x46, 0x13, 0xaf, 0x3f, 0x88, 0x00, 0x2c, 0x40, 0xd0, 0x00, 0x29, - 0x41, 0xd0, 0x00, 0x2d, 0x42, 0xd0, 0x00, 0x28, 0x43, 0xd0, 0x0e, 0x9b, - 0x00, 0x2b, 0x43, 0xd0, 0x0f, 0x9b, 0x00, 0x2b, 0x43, 0xd0, 0x12, 0x9b, - 0x00, 0x2b, 0x43, 0xd0, 0x21, 0x60, 0x65, 0x60, 0x43, 0x46, 0xe3, 0x63, - 0x0e, 0x9b, 0xa3, 0x60, 0x0f, 0x9b, 0xe3, 0x60, 0x20, 0x61, 0x5b, 0x46, - 0x23, 0x75, 0xe6, 0x82, 0x22, 0x76, 0x00, 0x26, 0xe6, 0x65, 0x26, 0x66, - 0x01, 0x96, 0x00, 0x96, 0x23, 0x00, 0x1c, 0x4a, 0x61, 0x46, 0x28, 0x00, - 0xfb, 0xf7, 0x8e, 0xf8, 0x01, 0x96, 0x00, 0x96, 0x23, 0x00, 0x19, 0x4a, - 0x51, 0x46, 0x28, 0x00, 0xfb, 0xf7, 0x86, 0xf8, 0x66, 0x64, 0xa6, 0x64, - 0x12, 0x9b, 0x63, 0x66, 0x68, 0x23, 0xe7, 0x52, 0x0f, 0x9b, 0x19, 0x78, - 0x20, 0x00, 0xff, 0xf7, 0x13, 0xfb, 0x0e, 0x9b, 0x59, 0x68, 0x20, 0x00, - 0xff, 0xf7, 0xee, 0xfc, 0x00, 0x20, 0x13, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x10, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x0d, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x0a, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x07, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x04, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x01, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x02, 0xb0, 0x1c, 0xbc, 0x90, 0x46, 0x9a, 0x46, 0xa3, 0x46, 0xf0, 0xbd, - 0xc1, 0xfd, 0x00, 0x08, 0x31, 0xfa, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x00, - 0x15, 0x00, 0x1f, 0x00, 0x43, 0x68, 0x1b, 0x78, 0x5b, 0xb2, 0x05, 0x2b, - 0x01, 0xd0, 0x7f, 0x2b, 0x59, 0xd1, 0x23, 0x6a, 0x59, 0x18, 0x8b, 0x42, - 0x00, 0xd2, 0x21, 0x62, 0xa3, 0x69, 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x23, - 0x23, 0x62, 0xa3, 0x61, 0x01, 0x26, 0x00, 0xe0, 0x00, 0x26, 0x23, 0x7a, - 0x00, 0x2b, 0x12, 0xd0, 0xe3, 0x68, 0x00, 0x2b, 0x0f, 0xd0, 0x22, 0x6a, - 0x93, 0x42, 0x03, 0xd8, 0x20, 0x00, 0xff, 0xf7, 0x13, 0xfe, 0x01, 0x26, - 0x00, 0x2f, 0x06, 0xd0, 0xe3, 0x68, 0x22, 0x6a, 0x9b, 0x1a, 0x3a, 0x68, - 0x93, 0x42, 0x00, 0xd2, 0x3b, 0x60, 0x00, 0x2d, 0x0c, 0xd0, 0x23, 0x6a, - 0x9d, 0x42, 0x06, 0xd2, 0x63, 0x7d, 0x00, 0x2b, 0x00, 0xd0, 0x02, 0x26, - 0x00, 0x23, 0x63, 0x75, 0x04, 0xe0, 0x01, 0x23, 0x63, 0x75, 0x01, 0xe0, - 0x01, 0x23, 0x63, 0x75, 0xe3, 0x68, 0x00, 0x2b, 0x24, 0xd0, 0x63, 0x68, - 0x1b, 0x78, 0x5b, 0xb2, 0x05, 0x2b, 0x01, 0xd0, 0x7f, 0x2b, 0x1d, 0xd1, - 0x23, 0x6a, 0x22, 0x69, 0x93, 0x42, 0x06, 0xd9, 0x81, 0x22, 0x12, 0x02, - 0x18, 0x21, 0x20, 0x68, 0x00, 0xf0, 0x84, 0xfc, 0x12, 0xe0, 0x81, 0x22, - 0x12, 0x02, 0x18, 0x21, 0x20, 0x68, 0x00, 0xf0, 0x25, 0xfc, 0x00, 0x2f, - 0x0a, 0xd0, 0x23, 0x69, 0x22, 0x6a, 0x9b, 0x1a, 0x3a, 0x68, 0x93, 0x42, - 0x04, 0xd2, 0x3b, 0x60, 0x02, 0xe0, 0x00, 0x23, 0x83, 0x61, 0x00, 0x26, - 0xa3, 0x8c, 0x00, 0x2b, 0x06, 0xd0, 0x04, 0x4a, 0x19, 0x21, 0x20, 0x68, - 0x00, 0xf0, 0x68, 0xfc, 0x00, 0x23, 0xa3, 0x84, 0x30, 0x00, 0xf8, 0xbd, - 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd0, - 0xc1, 0x62, 0x82, 0x62, 0x70, 0x47, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x5f, 0x46, 0x46, 0x46, 0xc0, 0xb4, 0x85, 0xb0, 0x04, 0x00, - 0x15, 0x00, 0x0e, 0xaa, 0x16, 0x78, 0x10, 0xaa, 0x12, 0x88, 0x93, 0x46, - 0x12, 0xaa, 0x17, 0x88, 0x00, 0x28, 0x6f, 0xd0, 0x00, 0x29, 0x70, 0xd0, - 0x00, 0x2d, 0x71, 0xd0, 0x00, 0x2b, 0x72, 0xd0, 0x0f, 0x9a, 0x00, 0x2a, - 0x72, 0xd0, 0x11, 0x9a, 0x00, 0x2a, 0x72, 0xd0, 0x80, 0x22, 0xd2, 0x05, - 0x0c, 0x98, 0x02, 0x40, 0x50, 0x1e, 0x82, 0x41, 0x22, 0x72, 0x0c, 0x9a, - 0x52, 0x05, 0x52, 0x0d, 0x62, 0x81, 0x0d, 0x9a, 0xe2, 0x60, 0x52, 0x08, - 0x50, 0x00, 0x82, 0x18, 0x22, 0x61, 0x0d, 0x98, 0x90, 0x42, 0x02, 0xd9, - 0x01, 0x22, 0x52, 0x42, 0x22, 0x61, 0x26, 0x75, 0x00, 0x2e, 0x02, 0xd1, - 0x00, 0x22, 0x90, 0x46, 0x01, 0xe0, 0x01, 0x22, 0x90, 0x46, 0x01, 0x22, - 0x62, 0x75, 0x00, 0x26, 0xa6, 0x61, 0x26, 0x77, 0x26, 0x62, 0x66, 0x77, - 0xa6, 0x84, 0x21, 0x60, 0x63, 0x60, 0x0f, 0x9b, 0x23, 0x63, 0x5b, 0x46, - 0xa3, 0x86, 0xa6, 0x62, 0xe6, 0x62, 0x01, 0x96, 0x00, 0x96, 0x23, 0x00, - 0x25, 0x4a, 0x26, 0x49, 0x28, 0x00, 0xfa, 0xf7, 0x7d, 0xff, 0x01, 0x96, - 0x00, 0x96, 0x23, 0x00, 0x23, 0x4a, 0x24, 0x49, 0x28, 0x00, 0xfa, 0xf7, - 0x75, 0xff, 0x01, 0x96, 0x00, 0x96, 0x23, 0x00, 0x21, 0x4a, 0x22, 0x49, - 0x28, 0x00, 0xfa, 0xf7, 0x6d, 0xff, 0x62, 0x89, 0x20, 0x4b, 0x02, 0x93, - 0x01, 0x94, 0x00, 0x96, 0x1f, 0x4b, 0x59, 0x46, 0x0f, 0x98, 0xfb, 0xf7, - 0x23, 0xf8, 0x05, 0x00, 0x11, 0x9b, 0xa3, 0x63, 0x40, 0x23, 0xe7, 0x52, - 0x62, 0x89, 0x01, 0x96, 0x43, 0x46, 0x00, 0x93, 0x00, 0x23, 0x39, 0x00, - 0x11, 0x98, 0xfa, 0xf7, 0xe5, 0xff, 0xe0, 0x63, 0x00, 0x28, 0x13, 0xd0, - 0x28, 0x00, 0x13, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x10, 0xe0, 0x01, 0x20, - 0x40, 0x42, 0x0d, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x0a, 0xe0, 0x01, 0x20, - 0x40, 0x42, 0x07, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x04, 0xe0, 0x01, 0x20, - 0x40, 0x42, 0x01, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x05, 0xb0, 0x0c, 0xbc, - 0x90, 0x46, 0x9b, 0x46, 0xf0, 0xbd, 0xc0, 0x46, 0xe1, 0xfe, 0x00, 0x08, - 0x05, 0x10, 0x00, 0x00, 0x51, 0xf6, 0x00, 0x08, 0x06, 0x10, 0x00, 0x00, - 0xd1, 0xfc, 0x00, 0x08, 0x19, 0x10, 0x00, 0x00, 0x11, 0x06, 0x01, 0x08, - 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x43, 0x68, 0x1b, 0x78, 0x5b, 0xb2, - 0x05, 0x2b, 0x01, 0xd0, 0x7f, 0x2b, 0x26, 0xd1, 0x0b, 0x79, 0x1b, 0x07, - 0x1b, 0x0f, 0x04, 0x7d, 0x00, 0x2c, 0x09, 0xd1, 0x00, 0x2b, 0x02, 0xd1, - 0x01, 0x23, 0x83, 0x61, 0x0f, 0xe0, 0x80, 0x22, 0x52, 0x00, 0x13, 0x43, - 0x83, 0x84, 0x0a, 0xe0, 0x01, 0x2b, 0x04, 0xd1, 0x0b, 0x7c, 0x43, 0x77, - 0x01, 0x23, 0x83, 0x61, 0x03, 0xe0, 0x80, 0x22, 0x92, 0x00, 0x13, 0x43, - 0x83, 0x84, 0x83, 0x69, 0x00, 0x2b, 0x08, 0xd0, 0x02, 0x7f, 0x53, 0x42, - 0x53, 0x41, 0x03, 0x77, 0x83, 0x6a, 0x00, 0x2b, 0x01, 0xd0, 0xc0, 0x6a, - 0x98, 0x47, 0x10, 0xbd, 0x10, 0xb5, 0x0b, 0x79, 0x1b, 0x07, 0x1b, 0x0f, - 0x01, 0x2b, 0x04, 0xd1, 0x10, 0x23, 0xcb, 0x56, 0x43, 0x70, 0x01, 0x23, - 0xc3, 0x60, 0x03, 0x69, 0x00, 0x2b, 0x01, 0xd0, 0x40, 0x69, 0x98, 0x47, - 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, 0x0b, 0x79, 0x1b, 0x07, - 0x1b, 0x0f, 0x4a, 0x7c, 0x02, 0x2b, 0x38, 0xd1, 0x00, 0x2a, 0x02, 0xd0, - 0xc3, 0x78, 0x9a, 0x42, 0x33, 0xd1, 0x0b, 0x7c, 0x00, 0x25, 0x65, 0x57, - 0x80, 0x2b, 0x15, 0xd0, 0x04, 0xd8, 0x01, 0x2b, 0x07, 0xd0, 0x02, 0x2b, - 0x0d, 0xd0, 0x17, 0xe0, 0x81, 0x2b, 0x10, 0xd0, 0x82, 0x2b, 0x11, 0xd0, - 0x12, 0xe0, 0xe3, 0x68, 0x1b, 0x68, 0x1b, 0x78, 0x00, 0x2b, 0x0d, 0xd1, - 0x05, 0x33, 0x23, 0x70, 0x0a, 0xe0, 0x04, 0x23, 0x23, 0x70, 0x07, 0xe0, - 0x7f, 0x23, 0x23, 0x70, 0x04, 0xe0, 0x02, 0x23, 0xa3, 0x70, 0x01, 0xe0, - 0x01, 0x23, 0xa3, 0x70, 0xa3, 0x6a, 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x20, - 0x20, 0x56, 0x85, 0x42, 0x00, 0xd0, 0x98, 0x47, 0x23, 0x6a, 0x00, 0x2b, - 0x05, 0xd0, 0x00, 0x22, 0xa2, 0x56, 0x95, 0x42, 0x01, 0xd0, 0x60, 0x6a, - 0x98, 0x47, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xca, 0x08, 0x07, 0x23, 0x19, 0x40, 0x06, 0x3b, - 0x8b, 0x40, 0xdb, 0xb2, 0x00, 0x28, 0x08, 0xd0, 0x01, 0x79, 0x8a, 0x42, - 0x07, 0xd2, 0x01, 0x68, 0x8a, 0x5c, 0x1a, 0x42, 0x05, 0xd1, 0x00, 0x20, - 0x04, 0xe0, 0x00, 0x20, 0x02, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, - 0x70, 0x47, 0xc0, 0x46, 0xf0, 0xb5, 0x47, 0x46, 0x80, 0xb4, 0x84, 0xb0, - 0x00, 0x28, 0x57, 0xd0, 0x07, 0x7b, 0x8f, 0x42, 0x57, 0xd9, 0x00, 0x2b, - 0x1c, 0xd0, 0x00, 0x2a, 0x14, 0xd1, 0x00, 0x24, 0xa4, 0x46, 0x19, 0xe0, - 0xa5, 0x00, 0x46, 0x68, 0x75, 0x59, 0x2e, 0x0c, 0xf6, 0xb2, 0xad, 0xb2, - 0x8c, 0x42, 0x06, 0xd0, 0x00, 0x2d, 0x04, 0xd0, 0xb2, 0x42, 0x02, 0xd1, - 0x01, 0x25, 0x6d, 0x42, 0xac, 0x46, 0x01, 0x34, 0xe4, 0xb2, 0x02, 0xe0, - 0x00, 0x24, 0x00, 0x25, 0xac, 0x46, 0xbc, 0x42, 0xe8, 0xd3, 0x01, 0xe0, - 0x00, 0x24, 0xa4, 0x46, 0x64, 0x46, 0x00, 0x2c, 0x36, 0xd1, 0x0c, 0x01, - 0x64, 0x1a, 0xa6, 0x00, 0x84, 0x68, 0xa4, 0x19, 0x22, 0x70, 0xfa, 0x25, - 0xad, 0x00, 0x6b, 0x43, 0xa3, 0x60, 0xff, 0x25, 0x65, 0x70, 0x25, 0x76, - 0x00, 0x25, 0xe5, 0x60, 0x00, 0x2a, 0x08, 0xd0, 0x00, 0x2b, 0x06, 0xd0, - 0xe0, 0x23, 0xdb, 0x00, 0x98, 0x46, 0x42, 0x44, 0x01, 0x23, 0xa3, 0x70, - 0x03, 0xe0, 0x00, 0x23, 0xa3, 0x60, 0xa3, 0x70, 0x00, 0x22, 0xa3, 0x78, - 0x00, 0x2b, 0x17, 0xd0, 0x04, 0x69, 0x83, 0x8a, 0x59, 0x18, 0x89, 0xb2, - 0x83, 0x68, 0x9e, 0x19, 0x0b, 0x4b, 0x02, 0x93, 0x01, 0x96, 0x00, 0x23, - 0x00, 0x93, 0x0a, 0x4b, 0x20, 0x00, 0xfa, 0xf7, 0xdb, 0xfe, 0x08, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x05, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x02, 0xe0, - 0x60, 0x46, 0x00, 0xe0, 0x60, 0x46, 0x04, 0xb0, 0x04, 0xbc, 0x90, 0x46, - 0xf0, 0xbd, 0xc0, 0x46, 0x71, 0x06, 0x01, 0x08, 0xff, 0x07, 0x00, 0x00, - 0x30, 0xb5, 0x83, 0xb0, 0x04, 0x00, 0xc3, 0x7d, 0x00, 0x2b, 0x15, 0xd1, - 0x05, 0x68, 0x04, 0x22, 0x41, 0x68, 0x01, 0xa8, 0x02, 0xf0, 0x48, 0xfe, - 0x01, 0x99, 0x0a, 0x0c, 0xd2, 0xb2, 0x8b, 0xb2, 0xc9, 0x0d, 0x0b, 0xd1, - 0xa1, 0x7d, 0x01, 0x39, 0xc9, 0xb2, 0x28, 0x00, 0xff, 0xf7, 0x78, 0xff, - 0x00, 0x28, 0x05, 0xd0, 0x04, 0x48, 0x04, 0xe0, 0x00, 0x20, 0x02, 0xe0, - 0x02, 0x48, 0x00, 0xe0, 0x00, 0x20, 0x03, 0xb0, 0x30, 0xbd, 0xc0, 0x46, - 0x43, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb5, 0x00, 0x28, - 0x0d, 0xd1, 0x10, 0xe0, 0x1d, 0x01, 0xed, 0x1a, 0xac, 0x00, 0x85, 0x68, - 0x2d, 0x19, 0x2a, 0x61, 0x85, 0x68, 0xac, 0x46, 0x64, 0x44, 0x61, 0x61, - 0x01, 0x33, 0xdb, 0xb2, 0x00, 0xe0, 0x00, 0x23, 0x04, 0x7b, 0xa3, 0x42, - 0xee, 0xd3, 0x30, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x83, 0xb0, - 0x04, 0x00, 0x17, 0x00, 0x08, 0xaa, 0x01, 0xca, 0x15, 0x78, 0x0b, 0xaa, - 0x12, 0x88, 0x00, 0x2c, 0x47, 0xd0, 0x00, 0x29, 0x48, 0xd0, 0x00, 0x2f, - 0x49, 0xd0, 0x00, 0x2b, 0x4a, 0xd0, 0x00, 0x28, 0x4b, 0xd0, 0x0a, 0x9e, - 0x00, 0x2e, 0x4b, 0xd0, 0x21, 0x60, 0x63, 0x60, 0xa0, 0x60, 0x25, 0x73, - 0x00, 0x23, 0x63, 0x73, 0xff, 0x21, 0xa1, 0x73, 0xe3, 0x73, 0x26, 0x61, - 0xa2, 0x82, 0x00, 0x26, 0x00, 0x25, 0x20, 0xe0, 0xab, 0x00, 0x62, 0x68, - 0x9b, 0x58, 0x1a, 0x0c, 0xd2, 0xb2, 0x9b, 0xb2, 0x29, 0x00, 0x20, 0x00, - 0xff, 0xf7, 0x22, 0xff, 0x06, 0x00, 0x2a, 0x01, 0x52, 0x1b, 0x93, 0x00, - 0xa2, 0x68, 0xd1, 0x18, 0x00, 0x22, 0x0a, 0x61, 0xa1, 0x68, 0xc9, 0x18, - 0xca, 0x61, 0xa1, 0x68, 0xc9, 0x18, 0x4a, 0x62, 0xa1, 0x68, 0xc9, 0x18, - 0xca, 0x62, 0xa1, 0x68, 0x8c, 0x46, 0x63, 0x44, 0x5a, 0x63, 0x01, 0x35, - 0xed, 0xb2, 0x23, 0x7b, 0x9d, 0x42, 0xdb, 0xd3, 0x00, 0x23, 0x01, 0x93, - 0x00, 0x93, 0x23, 0x00, 0x0c, 0x4a, 0x0d, 0x49, 0x38, 0x00, 0xfa, 0xf7, - 0x77, 0xfd, 0x30, 0x00, 0x10, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x0d, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x0a, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x07, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x04, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x01, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x03, 0xb0, 0xf0, 0xbd, 0x41, 0x08, 0x01, 0x08, - 0x16, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x4f, 0x46, 0x80, 0xb4, 0x82, 0xb0, - 0x04, 0x00, 0x01, 0x93, 0x08, 0xab, 0x1b, 0x78, 0x99, 0x46, 0x0a, 0x9e, - 0x00, 0x27, 0xc7, 0x57, 0xfa, 0x25, 0xad, 0x00, 0x55, 0x43, 0x43, 0x68, - 0x9c, 0x46, 0x61, 0x44, 0x41, 0x60, 0x00, 0x2f, 0x07, 0xd0, 0x00, 0x2d, - 0x1e, 0xd0, 0x8d, 0x42, 0x03, 0xd9, 0x01, 0x23, 0xc3, 0x56, 0x9f, 0x42, - 0x18, 0xd0, 0x00, 0x23, 0x63, 0x60, 0xe3, 0x69, 0x1f, 0x72, 0xe1, 0x69, - 0xa0, 0x69, 0xfb, 0xf7, 0x3b, 0xf8, 0x00, 0x23, 0xe3, 0x56, 0x00, 0x2b, - 0x0c, 0xd1, 0xa3, 0x68, 0x9d, 0x42, 0x01, 0xd9, 0xeb, 0x1a, 0x63, 0x60, - 0x01, 0x9b, 0x08, 0x2b, 0x02, 0xd1, 0x03, 0x3b, 0x23, 0x70, 0x01, 0xe0, - 0x7f, 0x23, 0x23, 0x70, 0x00, 0x23, 0xe3, 0x56, 0x63, 0x70, 0xe3, 0x68, - 0x18, 0x69, 0x07, 0x21, 0xff, 0xf7, 0x8a, 0xfe, 0x00, 0x28, 0x08, 0xd1, - 0xe3, 0x68, 0x18, 0x69, 0x06, 0x21, 0xff, 0xf7, 0x83, 0xfe, 0x00, 0x28, - 0x03, 0xd1, 0x00, 0x22, 0x02, 0xe0, 0x01, 0x22, 0x00, 0xe0, 0x01, 0x22, - 0x09, 0x9b, 0x00, 0x2b, 0x74, 0xd0, 0x00, 0x23, 0xe3, 0x56, 0x05, 0x2b, - 0x70, 0xd1, 0x00, 0x2a, 0x0a, 0xd0, 0x09, 0x9b, 0x9b, 0x78, 0x00, 0x2b, - 0x01, 0xd0, 0x02, 0x2b, 0x04, 0xd1, 0x10, 0x23, 0x4a, 0x46, 0x1a, 0x43, - 0xd3, 0xb2, 0x99, 0x46, 0x4b, 0x46, 0x00, 0x2b, 0x60, 0xd0, 0xdb, 0x06, - 0x2b, 0xd5, 0x09, 0x9b, 0x5b, 0x78, 0x00, 0x2b, 0x02, 0xd1, 0x7f, 0x33, - 0x23, 0x70, 0x24, 0xe0, 0x02, 0x2b, 0x02, 0xd1, 0x02, 0x33, 0x23, 0x70, - 0x1f, 0xe0, 0xe3, 0x68, 0x18, 0x69, 0x12, 0x21, 0xff, 0xf7, 0x52, 0xfe, - 0x00, 0x28, 0x0d, 0xd1, 0xe3, 0x68, 0x18, 0x69, 0x1b, 0x21, 0xff, 0xf7, - 0x4b, 0xfe, 0x00, 0x28, 0x06, 0xd1, 0xe3, 0x68, 0x18, 0x69, 0x1c, 0x21, - 0xff, 0xf7, 0x44, 0xfe, 0x00, 0x28, 0x0a, 0xd0, 0x09, 0x9b, 0x1b, 0x78, - 0x00, 0x2b, 0x02, 0xd1, 0x7f, 0x33, 0x23, 0x70, 0x03, 0xe0, 0x02, 0x2b, - 0x01, 0xd1, 0x02, 0x33, 0x23, 0x70, 0x4b, 0x46, 0xdb, 0x07, 0x0a, 0xd5, - 0x09, 0x9b, 0xdb, 0x78, 0x00, 0x2b, 0x02, 0xd1, 0x7f, 0x33, 0x23, 0x70, - 0x03, 0xe0, 0x02, 0x2b, 0x01, 0xd1, 0x02, 0x33, 0x23, 0x70, 0x4b, 0x46, - 0x9b, 0x06, 0x0a, 0xd5, 0x09, 0x9b, 0x1b, 0x79, 0x00, 0x2b, 0x02, 0xd1, - 0x7f, 0x33, 0x23, 0x70, 0x03, 0xe0, 0x02, 0x2b, 0x01, 0xd1, 0x02, 0x33, - 0x23, 0x70, 0x4b, 0x46, 0x6a, 0x46, 0x13, 0x71, 0x13, 0x79, 0x5b, 0xb2, - 0x00, 0x2b, 0x0a, 0xda, 0x09, 0x9b, 0x5b, 0x79, 0x00, 0x2b, 0x02, 0xd1, - 0x7f, 0x33, 0x23, 0x70, 0x03, 0xe0, 0x02, 0x2b, 0x01, 0xd1, 0x02, 0x33, - 0x23, 0x70, 0x00, 0x23, 0xe3, 0x56, 0x05, 0x2b, 0x00, 0xd0, 0x65, 0x60, - 0x00, 0x20, 0x20, 0x56, 0x87, 0x42, 0x07, 0xd0, 0xa3, 0x6a, 0x00, 0x2b, - 0x00, 0xd0, 0x98, 0x47, 0x00, 0x2e, 0x01, 0xd0, 0x00, 0x23, 0x33, 0x60, - 0x00, 0x2d, 0x0c, 0xd0, 0x00, 0x2e, 0x0a, 0xd0, 0x62, 0x68, 0x95, 0x42, - 0x05, 0xd9, 0xad, 0x1a, 0x33, 0x68, 0x9d, 0x42, 0x03, 0xd2, 0x35, 0x60, - 0x01, 0xe0, 0x00, 0x23, 0x33, 0x60, 0xa0, 0x78, 0x02, 0xb0, 0x04, 0xbc, - 0x91, 0x46, 0xf0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x00, 0x28, 0x05, 0xd0, 0x81, 0x62, 0x00, 0x29, 0x02, 0xd0, - 0x00, 0x78, 0x40, 0xb2, 0x88, 0x47, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd0, - 0x02, 0x62, 0x41, 0x62, 0x70, 0x47, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x5f, 0x46, 0x56, 0x46, 0x4d, 0x46, 0x44, 0x46, 0xf0, 0xb4, - 0x89, 0xb0, 0x04, 0x00, 0x0d, 0x00, 0x04, 0x92, 0x05, 0x93, 0x12, 0xab, - 0x80, 0xcb, 0x19, 0x88, 0x89, 0x46, 0x14, 0xab, 0x19, 0x88, 0x8a, 0x46, - 0x16, 0xab, 0x19, 0x88, 0x06, 0x91, 0x17, 0xab, 0x18, 0x88, 0x80, 0x46, - 0x19, 0xab, 0x18, 0x88, 0x83, 0x46, 0x1a, 0xab, 0x18, 0x88, 0x07, 0x90, - 0x00, 0x2c, 0x46, 0xd0, 0x00, 0x2d, 0x47, 0xd0, 0x00, 0x2f, 0x48, 0xd0, - 0x18, 0x98, 0x00, 0x28, 0x48, 0xd0, 0x15, 0x98, 0x00, 0x28, 0x48, 0xd0, - 0x2c, 0x22, 0x00, 0x21, 0x20, 0x00, 0x02, 0xf0, 0xc1, 0xfc, 0x00, 0x26, - 0x26, 0x70, 0x66, 0x70, 0x6b, 0x46, 0x1a, 0x7c, 0xe2, 0x70, 0xfa, 0x23, - 0x9b, 0x00, 0x05, 0x9a, 0x53, 0x43, 0xa3, 0x60, 0xe5, 0x60, 0x22, 0x4b, - 0x02, 0x93, 0x01, 0x94, 0x00, 0x96, 0x21, 0x4b, 0x52, 0x46, 0x49, 0x46, - 0x38, 0x00, 0xfa, 0xf7, 0xd3, 0xfc, 0x05, 0x00, 0x15, 0x9b, 0x23, 0x61, - 0x01, 0x96, 0x02, 0x23, 0x00, 0x93, 0x00, 0x23, 0x42, 0x46, 0x06, 0x99, - 0x15, 0x98, 0xfa, 0xf7, 0x97, 0xfc, 0x60, 0x61, 0x00, 0x28, 0x01, 0xd1, - 0x01, 0x25, 0x6d, 0x42, 0x18, 0x9b, 0xa3, 0x61, 0x00, 0x23, 0x01, 0x93, - 0x01, 0x33, 0x00, 0x93, 0x00, 0x23, 0x07, 0x9a, 0x59, 0x46, 0x18, 0x98, - 0xfa, 0xf7, 0x86, 0xfc, 0xe0, 0x61, 0x00, 0x28, 0x10, 0xd0, 0x28, 0x00, - 0x10, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x0d, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x0a, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x07, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x04, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x01, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x09, 0xb0, 0x3c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xa2, 0x46, 0xab, 0x46, - 0xf0, 0xbd, 0xc0, 0x46, 0xa1, 0x06, 0x01, 0x08, 0xff, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x84, 0xb0, - 0x04, 0x00, 0xcb, 0x08, 0x07, 0x25, 0x0d, 0x40, 0x01, 0x20, 0xa8, 0x40, - 0xc6, 0xb2, 0x00, 0x2c, 0x0f, 0xd0, 0x25, 0x79, 0xab, 0x42, 0x04, 0xd3, - 0x65, 0x23, 0xe1, 0x54, 0x00, 0x25, 0x00, 0x23, 0x0b, 0xe0, 0x25, 0x68, - 0xac, 0x46, 0x63, 0x44, 0x1d, 0x78, 0x35, 0x42, 0x04, 0xd0, 0x01, 0x25, - 0x03, 0xe0, 0x00, 0x25, 0x00, 0x23, 0x00, 0xe0, 0x00, 0x25, 0x00, 0x2d, - 0x31, 0xd0, 0x1d, 0x78, 0x85, 0x43, 0x1d, 0x70, 0x64, 0x23, 0xe3, 0x5c, - 0x00, 0x2b, 0x03, 0xd0, 0x02, 0x22, 0x64, 0x23, 0xe2, 0x54, 0x26, 0xe0, - 0x01, 0x92, 0x02, 0xad, 0x00, 0x23, 0x2b, 0x70, 0x6b, 0x70, 0xab, 0x70, - 0xe9, 0x70, 0x03, 0x92, 0x10, 0x48, 0xfc, 0xf7, 0xb9, 0xfa, 0x08, 0x22, - 0x29, 0x00, 0xe0, 0x6d, 0x02, 0xf0, 0xa2, 0xfb, 0xe3, 0x6d, 0x08, 0x33, - 0xe3, 0x65, 0xa2, 0x6d, 0x93, 0x42, 0x01, 0xd1, 0x63, 0x1d, 0xe3, 0x65, - 0xe3, 0x6d, 0x22, 0x6e, 0x93, 0x42, 0x02, 0xd1, 0x01, 0x22, 0x64, 0x23, - 0xe2, 0x54, 0x05, 0x48, 0xfc, 0xf7, 0x42, 0xfa, 0xa3, 0x6e, 0x00, 0x2b, - 0x01, 0xd0, 0xe0, 0x6e, 0x98, 0x47, 0x04, 0xb0, 0x70, 0xbd, 0xc0, 0x46, - 0x2c, 0x08, 0x00, 0x20, 0x70, 0xb5, 0x84, 0xb0, 0x04, 0x00, 0xcd, 0x08, - 0x07, 0x26, 0x0e, 0x40, 0x01, 0x20, 0xb0, 0x40, 0xc0, 0xb2, 0x00, 0x2c, - 0x0f, 0xd0, 0x26, 0x79, 0xb5, 0x42, 0x04, 0xd3, 0x65, 0x25, 0x61, 0x55, - 0x00, 0x26, 0x00, 0x25, 0x0b, 0xe0, 0x26, 0x68, 0xb4, 0x46, 0x65, 0x44, - 0x2e, 0x78, 0x06, 0x42, 0x04, 0xd1, 0x01, 0x26, 0x03, 0xe0, 0x00, 0x26, - 0x00, 0x25, 0x00, 0xe0, 0x00, 0x26, 0x00, 0x2e, 0x34, 0xd0, 0x00, 0x29, - 0x02, 0xd0, 0x2e, 0x78, 0x30, 0x43, 0x28, 0x70, 0x64, 0x20, 0x20, 0x5c, - 0x00, 0x28, 0x03, 0xd0, 0x02, 0x22, 0x64, 0x23, 0xe2, 0x54, 0x27, 0xe0, - 0x68, 0x46, 0x42, 0x80, 0x01, 0x93, 0x02, 0xad, 0x2a, 0x80, 0x00, 0x22, - 0xaa, 0x70, 0xe9, 0x70, 0x03, 0x93, 0x10, 0x48, 0xfc, 0xf7, 0x5e, 0xfa, - 0x08, 0x22, 0x29, 0x00, 0xe0, 0x6d, 0x02, 0xf0, 0x47, 0xfb, 0xe3, 0x6d, - 0x08, 0x33, 0xe3, 0x65, 0xa2, 0x6d, 0x93, 0x42, 0x01, 0xd1, 0x63, 0x1d, - 0xe3, 0x65, 0xe3, 0x6d, 0x22, 0x6e, 0x93, 0x42, 0x02, 0xd1, 0x01, 0x22, - 0x64, 0x23, 0xe2, 0x54, 0x04, 0x48, 0xfc, 0xf7, 0xe7, 0xf9, 0xa3, 0x6e, - 0x00, 0x2b, 0x01, 0xd0, 0xe0, 0x6e, 0x98, 0x47, 0x04, 0xb0, 0x70, 0xbd, - 0x2c, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x5f, 0x46, 0x56, 0x46, 0x4d, 0x46, - 0x44, 0x46, 0xf0, 0xb4, 0x83, 0xb0, 0x05, 0x00, 0x88, 0x46, 0x01, 0x92, - 0x9b, 0x46, 0x00, 0x29, 0x00, 0xd1, 0x83, 0xe0, 0xc3, 0x7b, 0x00, 0x2b, - 0x76, 0xd1, 0x7f, 0xe0, 0x37, 0x00, 0x33, 0x01, 0x9b, 0x1b, 0x9c, 0x00, - 0xab, 0x68, 0x9c, 0x46, 0x64, 0x44, 0xa3, 0x78, 0x00, 0x2b, 0x68, 0xd0, - 0xe2, 0x68, 0x00, 0x2a, 0x28, 0xd0, 0x01, 0x22, 0xa2, 0x56, 0x00, 0x2a, - 0x13, 0xd1, 0x63, 0x6b, 0x00, 0x2b, 0x03, 0xd0, 0x20, 0x78, 0xa2, 0x6b, - 0x31, 0x00, 0x98, 0x47, 0xa3, 0x78, 0x02, 0x2b, 0x05, 0xd1, 0x3b, 0x00, - 0x54, 0x4a, 0x1c, 0x21, 0x28, 0x68, 0xff, 0xf7, 0x6d, 0xff, 0x01, 0x23, - 0xa3, 0x70, 0x01, 0x9a, 0x0d, 0xe0, 0x02, 0x2b, 0x06, 0xd0, 0x63, 0x6a, - 0x00, 0x2b, 0x03, 0xd0, 0x20, 0x78, 0xa2, 0x6a, 0x31, 0x00, 0x98, 0x47, - 0x02, 0x23, 0xa3, 0x70, 0x00, 0x23, 0x63, 0x60, 0x00, 0x22, 0x00, 0x23, - 0xe3, 0x60, 0x00, 0xe0, 0x01, 0x9a, 0xa3, 0x78, 0x02, 0x2b, 0x1f, 0xd1, - 0x63, 0x68, 0xd3, 0x18, 0x63, 0x60, 0xa2, 0x68, 0x93, 0x42, 0x11, 0xd3, - 0xe3, 0x6a, 0x00, 0x2b, 0x03, 0xd0, 0x20, 0x78, 0x22, 0x6b, 0x31, 0x00, - 0x98, 0x47, 0x3b, 0x00, 0x3e, 0x4a, 0x1b, 0x21, 0x28, 0x68, 0xff, 0xf7, - 0x41, 0xff, 0xff, 0x23, 0x63, 0x70, 0xfc, 0x3b, 0xa3, 0x70, 0x07, 0xe0, - 0x59, 0x46, 0x00, 0x29, 0x04, 0xd0, 0xd3, 0x1a, 0x0a, 0x68, 0x93, 0x42, - 0x00, 0xd2, 0x0b, 0x60, 0xa3, 0x78, 0x02, 0x2b, 0x01, 0xd0, 0x00, 0x23, - 0x99, 0x46, 0x01, 0x22, 0xa2, 0x56, 0x05, 0x2a, 0x01, 0xd0, 0xff, 0x23, - 0x9a, 0x46, 0x18, 0x23, 0xe3, 0x56, 0x9a, 0x42, 0x09, 0xd0, 0xe7, 0x69, - 0x00, 0x2f, 0x03, 0xd0, 0x20, 0x78, 0x23, 0x6a, 0x31, 0x00, 0xb8, 0x47, - 0x01, 0x23, 0xe3, 0x56, 0x23, 0x76, 0x01, 0x36, 0xf6, 0xb2, 0x04, 0xe0, - 0x00, 0x26, 0x05, 0x23, 0x9a, 0x46, 0x04, 0x3b, 0x99, 0x46, 0x2b, 0x7b, - 0x9e, 0x42, 0x00, 0xd2, 0x80, 0xe7, 0x27, 0xe0, 0x43, 0x46, 0x00, 0x2b, - 0x1a, 0xd1, 0xeb, 0x7b, 0x00, 0x2b, 0x19, 0xd1, 0x05, 0x33, 0x9a, 0x46, - 0x04, 0x3b, 0x99, 0x46, 0x1c, 0xe0, 0x11, 0x01, 0x89, 0x1a, 0x8b, 0x00, - 0xa9, 0x68, 0x8c, 0x46, 0x63, 0x44, 0xff, 0x21, 0x59, 0x70, 0x19, 0x76, - 0x00, 0x21, 0xd9, 0x60, 0x99, 0x78, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x21, - 0x99, 0x70, 0x01, 0x32, 0xd2, 0xb2, 0x02, 0xe0, 0x00, 0x22, 0x00, 0xe0, - 0x00, 0x22, 0x2b, 0x7b, 0x9a, 0x42, 0xe6, 0xd3, 0xff, 0x23, 0x9a, 0x46, - 0x00, 0x23, 0x99, 0x46, 0x6b, 0x7b, 0x00, 0x2b, 0x0c, 0xd1, 0x4b, 0x46, - 0x00, 0x2b, 0x09, 0xd0, 0x00, 0x22, 0x1b, 0x21, 0x28, 0x68, 0xff, 0xf7, - 0x83, 0xfe, 0x00, 0x22, 0x1c, 0x21, 0x28, 0x68, 0xff, 0xf7, 0x7e, 0xfe, - 0x4b, 0x46, 0x6b, 0x73, 0x53, 0x46, 0xab, 0x73, 0x43, 0x46, 0xeb, 0x73, - 0x03, 0xb0, 0x3c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xa2, 0x46, 0xab, 0x46, - 0xf0, 0xbd, 0xc0, 0x46, 0x30, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x4f, 0x46, - 0x46, 0x46, 0xc0, 0xb4, 0x87, 0xb0, 0x06, 0x00, 0x88, 0x46, 0x03, 0x92, - 0x05, 0x69, 0x64, 0x27, 0x5f, 0x43, 0xb9, 0x46, 0x83, 0x69, 0x5c, 0x8c, - 0x83, 0x8a, 0x9c, 0x42, 0x75, 0xd0, 0x63, 0x40, 0x1f, 0x00, 0x84, 0x82, - 0x02, 0x23, 0xff, 0x33, 0x1f, 0x42, 0x0d, 0xd0, 0x1c, 0x42, 0x06, 0xd0, - 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0x28, 0x00, 0xff, 0xf7, 0xa0, 0xfe, - 0x04, 0xe0, 0x00, 0x22, 0x01, 0x21, 0x28, 0x00, 0xff, 0xf7, 0x42, 0xfe, - 0xbb, 0x07, 0x0d, 0xd5, 0xa3, 0x07, 0x06, 0xd5, 0x00, 0x23, 0x8f, 0x4a, - 0x07, 0x21, 0x28, 0x00, 0xff, 0xf7, 0x90, 0xfe, 0x04, 0xe0, 0x00, 0x22, - 0x07, 0x21, 0x28, 0x00, 0xff, 0xf7, 0x32, 0xfe, 0x7b, 0x07, 0x0d, 0xd5, - 0x63, 0x07, 0x06, 0xd5, 0x00, 0x23, 0x88, 0x4a, 0x12, 0x21, 0x28, 0x00, - 0xff, 0xf7, 0x80, 0xfe, 0x04, 0xe0, 0x00, 0x22, 0x12, 0x21, 0x28, 0x00, - 0xff, 0xf7, 0x22, 0xfe, 0x3b, 0x07, 0x0d, 0xd5, 0x23, 0x07, 0x06, 0xd5, - 0x00, 0x23, 0x81, 0x4a, 0x14, 0x21, 0x28, 0x00, 0xff, 0xf7, 0x70, 0xfe, - 0x04, 0xe0, 0x00, 0x22, 0x14, 0x21, 0x28, 0x00, 0xff, 0xf7, 0x12, 0xfe, - 0x3b, 0x06, 0x0e, 0xd5, 0x23, 0x06, 0x07, 0xd5, 0x00, 0x23, 0x81, 0x22, - 0x12, 0x02, 0x15, 0x21, 0x28, 0x00, 0xff, 0xf7, 0x5f, 0xfe, 0x04, 0xe0, - 0x00, 0x22, 0x15, 0x21, 0x28, 0x00, 0xff, 0xf7, 0x01, 0xfe, 0xbb, 0x05, - 0x0d, 0xd5, 0xa3, 0x05, 0x06, 0xd5, 0x00, 0x23, 0x6e, 0x4a, 0x06, 0x21, - 0x28, 0x00, 0xff, 0xf7, 0x4f, 0xfe, 0x04, 0xe0, 0x00, 0x22, 0x06, 0x21, - 0x28, 0x00, 0xff, 0xf7, 0xf1, 0xfd, 0x3b, 0x05, 0x0d, 0xd5, 0x23, 0x05, - 0x06, 0xd5, 0x00, 0x23, 0x68, 0x4a, 0x13, 0x21, 0x28, 0x00, 0xff, 0xf7, - 0x3f, 0xfe, 0x04, 0xe0, 0x00, 0x22, 0x13, 0x21, 0x28, 0x00, 0xff, 0xf7, - 0xe1, 0xfd, 0x65, 0x23, 0xeb, 0x5c, 0x00, 0x2b, 0x08, 0xd0, 0xc2, 0x22, - 0xd2, 0x01, 0x28, 0x21, 0x28, 0x00, 0xff, 0xf7, 0x2f, 0xfe, 0x00, 0x22, - 0x65, 0x23, 0xea, 0x54, 0x28, 0x68, 0x43, 0x79, 0x00, 0x2b, 0x00, 0xd0, - 0x01, 0x23, 0x82, 0x78, 0x00, 0x2a, 0x02, 0xd1, 0xc2, 0x78, 0x00, 0x2a, - 0x02, 0xd0, 0x10, 0x22, 0x13, 0x43, 0xdb, 0xb2, 0x06, 0x22, 0x08, 0xe0, - 0x81, 0x5c, 0x00, 0x29, 0x03, 0xd0, 0x80, 0x21, 0x49, 0x42, 0x0b, 0x43, - 0xdb, 0xb2, 0x01, 0x32, 0xd2, 0xb2, 0x29, 0x79, 0x8a, 0x42, 0xf3, 0xd3, - 0x31, 0x68, 0x0a, 0x78, 0x6e, 0x20, 0x02, 0x40, 0x13, 0x43, 0x0b, 0x70, - 0xf3, 0x68, 0x99, 0x45, 0x02, 0xd9, 0x03, 0x9a, 0x9c, 0x18, 0xf4, 0x60, - 0x43, 0x46, 0x00, 0x2b, 0x00, 0xd1, 0x84, 0xe0, 0xf3, 0x69, 0x1b, 0x7c, - 0x00, 0x2b, 0x00, 0xd0, 0x7f, 0xe0, 0x2b, 0x6e, 0xea, 0x6d, 0x93, 0x42, - 0x03, 0xd1, 0x64, 0x22, 0xaa, 0x5c, 0x00, 0x2a, 0x77, 0xd0, 0xf2, 0x68, - 0x91, 0x45, 0x68, 0xd8, 0x32, 0x68, 0x12, 0x78, 0x9a, 0x70, 0x2f, 0x6f, - 0x00, 0x2f, 0x17, 0xd0, 0x2c, 0x6e, 0x0a, 0x23, 0x02, 0xaa, 0x94, 0x46, - 0x63, 0x44, 0x98, 0x46, 0x02, 0x22, 0x21, 0x00, 0x18, 0x00, 0x02, 0xf0, - 0x65, 0xf9, 0x21, 0x1d, 0x04, 0x22, 0x05, 0xa8, 0x02, 0xf0, 0x60, 0xf9, - 0xe3, 0x78, 0xa2, 0x78, 0x41, 0x46, 0x09, 0x88, 0x05, 0x98, 0x00, 0x90, - 0x00, 0x20, 0xb8, 0x47, 0xf0, 0x69, 0x08, 0x30, 0x08, 0x22, 0x29, 0x6e, - 0x02, 0xf0, 0x52, 0xf9, 0x2c, 0x6e, 0x04, 0x22, 0x21, 0x00, 0x05, 0xa8, - 0x02, 0xf0, 0x4c, 0xf9, 0x08, 0x34, 0x2c, 0x66, 0xab, 0x6d, 0x9c, 0x42, - 0x01, 0xd1, 0x6b, 0x1d, 0x2b, 0x66, 0x00, 0x23, 0xf3, 0x60, 0x64, 0x33, - 0xeb, 0x5c, 0x02, 0x2b, 0x0a, 0xd1, 0x00, 0x22, 0x62, 0x33, 0xea, 0x54, - 0x00, 0x23, 0x80, 0x22, 0x52, 0x01, 0x20, 0x21, 0x28, 0x00, 0xff, 0xf7, - 0xaf, 0xfd, 0x06, 0xe0, 0x00, 0x22, 0x64, 0x23, 0xea, 0x54, 0x20, 0x21, - 0x28, 0x00, 0xff, 0xf7, 0x4f, 0xfd, 0x73, 0x68, 0x00, 0x2b, 0x17, 0xd0, - 0x73, 0x7a, 0x32, 0x7a, 0x93, 0x42, 0x01, 0xd2, 0x01, 0x33, 0x73, 0x72, - 0x73, 0x7a, 0x01, 0x3b, 0xdb, 0xb2, 0x08, 0xe0, 0x71, 0x68, 0x98, 0x00, - 0x13, 0x4a, 0x9a, 0x18, 0x92, 0x00, 0x52, 0x58, 0x0a, 0x50, 0x01, 0x3b, - 0xdb, 0xb2, 0x00, 0x2b, 0xf4, 0xd1, 0x73, 0x68, 0x05, 0x9a, 0x1a, 0x60, - 0xf1, 0x69, 0xb0, 0x69, 0xfa, 0xf7, 0x08, 0xfc, 0x0b, 0xe0, 0x0e, 0x9b, - 0x00, 0x2b, 0x08, 0xd0, 0x4b, 0x46, 0x9f, 0x1a, 0x0e, 0x9b, 0x1b, 0x68, - 0x03, 0x93, 0x9f, 0x42, 0x01, 0xd2, 0x0e, 0x9b, 0x1f, 0x60, 0x07, 0xb0, - 0x0c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xf0, 0xbd, 0x20, 0x81, 0x00, 0x00, - 0x40, 0x81, 0x00, 0x00, 0x10, 0x81, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x01, 0xd0, 0xc1, 0x66, 0x82, 0x66, 0x70, 0x47, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x57, 0x46, 0x4e, 0x46, 0x45, 0x46, - 0xe0, 0xb4, 0x84, 0xb0, 0x04, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x0c, 0xaa, - 0x10, 0x78, 0x0f, 0xaa, 0x11, 0x78, 0x11, 0xaa, 0x12, 0x88, 0x91, 0x46, - 0x13, 0xaa, 0x12, 0x88, 0x92, 0x46, 0x14, 0xaa, 0x12, 0x88, 0x90, 0x46, - 0x00, 0x2c, 0x64, 0xd0, 0x00, 0x2e, 0x65, 0xd0, 0x00, 0x2d, 0x66, 0xd0, - 0x00, 0x2b, 0x67, 0xd0, 0x05, 0x28, 0x68, 0xd9, 0x0d, 0x9a, 0x00, 0x2a, - 0x68, 0xd0, 0x0e, 0x9a, 0x00, 0x2a, 0x68, 0xd0, 0x12, 0x9a, 0x00, 0x2a, - 0x68, 0xd0, 0x10, 0x9a, 0x00, 0x2a, 0x68, 0xd0, 0x23, 0x60, 0x20, 0x71, - 0x23, 0x00, 0x55, 0x33, 0xa3, 0x65, 0x63, 0x1d, 0xe3, 0x65, 0x23, 0x66, - 0x00, 0x23, 0x64, 0x22, 0xa3, 0x54, 0x01, 0x32, 0xa3, 0x54, 0xa3, 0x66, - 0xe3, 0x66, 0x23, 0x67, 0x34, 0x61, 0x0d, 0x9a, 0x32, 0x60, 0x0e, 0x9a, - 0x72, 0x60, 0x31, 0x72, 0x73, 0x72, 0xf3, 0x60, 0xb3, 0x82, 0x05, 0xe0, - 0x22, 0x68, 0xd2, 0x18, 0x00, 0x21, 0x11, 0x70, 0x01, 0x33, 0xdb, 0xb2, - 0x83, 0x42, 0xf7, 0xd3, 0x00, 0x27, 0x01, 0x97, 0x00, 0x97, 0x33, 0x00, - 0x26, 0x4a, 0x27, 0x49, 0x28, 0x00, 0xfa, 0xf7, 0x81, 0xf8, 0xf0, 0x23, - 0x9b, 0x00, 0xeb, 0x18, 0x01, 0x97, 0x00, 0x97, 0x23, 0x4a, 0x24, 0x49, - 0x28, 0x00, 0xfa, 0xf7, 0x77, 0xf8, 0x23, 0x4b, 0x02, 0x93, 0x01, 0x94, - 0x00, 0x97, 0xf0, 0x23, 0xdb, 0x00, 0x80, 0x22, 0x49, 0x46, 0x10, 0x98, - 0xfa, 0xf7, 0x2c, 0xf9, 0x04, 0x00, 0x12, 0x9b, 0xb3, 0x61, 0x01, 0x97, - 0x08, 0x23, 0x00, 0x93, 0x00, 0x23, 0x42, 0x46, 0x51, 0x46, 0x12, 0x98, - 0xfa, 0xf7, 0xf0, 0xf8, 0xf0, 0x61, 0x00, 0x28, 0x1c, 0xd0, 0x20, 0x00, - 0x1c, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x19, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x16, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x13, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x10, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x0d, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x0a, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x07, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x04, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x01, 0xe0, 0x01, 0x20, 0x40, 0x42, - 0x04, 0xb0, 0x1c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xa2, 0x46, 0xf0, 0xbd, - 0x41, 0xab, 0x00, 0x08, 0x03, 0x10, 0x00, 0x00, 0x01, 0xac, 0x00, 0x08, - 0x14, 0x10, 0x00, 0x00, 0x81, 0xac, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x23, 0xdb, 0x05, - 0xdb, 0x68, 0x02, 0x20, 0x18, 0x40, 0x43, 0x1e, 0x98, 0x41, 0xc0, 0xb2, - 0x70, 0x47, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x28, 0x02, 0xd1, 0x08, 0x48, - 0x01, 0xf0, 0xa2, 0xfc, 0x00, 0x29, 0x06, 0xd0, 0x01, 0x29, 0x07, 0xd1, - 0x00, 0x2a, 0x05, 0xd0, 0x03, 0x48, 0x01, 0xf0, 0x99, 0xfc, 0x02, 0x48, - 0x01, 0xf0, 0x96, 0xfc, 0x00, 0x20, 0x10, 0xbd, 0xb8, 0x41, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x01, 0xf0, 0x05, 0xff, 0x10, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xfe, 0xf7, - 0x25, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf8, 0xb5, 0x04, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x01, 0xf0, - 0xa1, 0xfc, 0x00, 0x2c, 0x09, 0xd0, 0x00, 0x2e, 0x07, 0xd0, 0x00, 0x2f, - 0x05, 0xd0, 0x00, 0x2d, 0x03, 0xd0, 0x01, 0x2d, 0x04, 0xd0, 0xeb, 0x07, - 0x02, 0xd5, 0x0a, 0x48, 0x01, 0xf0, 0x6a, 0xfc, 0x23, 0x78, 0x02, 0x2b, - 0x04, 0xd0, 0x05, 0x2b, 0x02, 0xd0, 0x06, 0x48, 0x01, 0xf0, 0x62, 0xfc, - 0xa7, 0x60, 0xe5, 0x60, 0x26, 0x61, 0x03, 0x23, 0x23, 0x70, 0x20, 0x00, - 0xfd, 0xf7, 0xb2, 0xfd, 0xf8, 0xbd, 0xc0, 0x46, 0x34, 0x43, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0xfe, 0xf7, 0x05, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x00, 0x0f, 0x00, 0x15, 0x1e, - 0x02, 0xd1, 0x18, 0x48, 0x01, 0xf0, 0x40, 0xfc, 0x83, 0x68, 0x9a, 0x42, - 0x00, 0xd9, 0x85, 0x68, 0x60, 0x69, 0x23, 0x69, 0x1e, 0x1a, 0xb5, 0x42, - 0x07, 0xd2, 0x2a, 0x00, 0x39, 0x00, 0x01, 0xf0, 0xb1, 0xff, 0x63, 0x69, - 0x5b, 0x19, 0x63, 0x61, 0x16, 0xe0, 0xb5, 0x42, 0x0e, 0xd9, 0x32, 0x00, - 0x39, 0x00, 0x01, 0xf0, 0xa7, 0xff, 0xb9, 0x19, 0xae, 0x1b, 0x32, 0x00, - 0xe0, 0x68, 0x01, 0xf0, 0xa1, 0xff, 0xe3, 0x68, 0x9c, 0x46, 0x66, 0x44, - 0x66, 0x61, 0x05, 0xe0, 0x2a, 0x00, 0x39, 0x00, 0x01, 0xf0, 0x98, 0xff, - 0xe3, 0x68, 0x63, 0x61, 0xa3, 0x68, 0x5b, 0x1b, 0xa3, 0x60, 0x28, 0x00, - 0xf8, 0xbd, 0xc0, 0x46, 0xdc, 0x42, 0x01, 0x08, 0xf8, 0xb5, 0x04, 0x00, - 0x0f, 0x00, 0x15, 0x1e, 0x02, 0xd1, 0x18, 0x48, 0x01, 0xf0, 0x08, 0xfc, - 0x83, 0x68, 0x9a, 0x42, 0x00, 0xd9, 0x85, 0x68, 0xa1, 0x69, 0x23, 0x69, - 0x5e, 0x1a, 0xb5, 0x42, 0x07, 0xd2, 0x2a, 0x00, 0x38, 0x00, 0x01, 0xf0, - 0x79, 0xff, 0xa3, 0x69, 0x5b, 0x19, 0xa3, 0x61, 0x16, 0xe0, 0xb5, 0x42, - 0x0e, 0xd9, 0x32, 0x00, 0x38, 0x00, 0x01, 0xf0, 0x6f, 0xff, 0xb8, 0x19, - 0xae, 0x1b, 0x32, 0x00, 0xe1, 0x68, 0x01, 0xf0, 0x69, 0xff, 0xe3, 0x68, - 0x9c, 0x46, 0x66, 0x44, 0xa6, 0x61, 0x05, 0xe0, 0x2a, 0x00, 0x38, 0x00, - 0x01, 0xf0, 0x60, 0xff, 0xe3, 0x68, 0xa3, 0x61, 0xa3, 0x68, 0x5b, 0x1b, - 0xa3, 0x60, 0x28, 0x00, 0xf8, 0xbd, 0xc0, 0x46, 0xb4, 0x42, 0x01, 0x08, - 0x10, 0xb5, 0x01, 0xf0, 0x75, 0xfe, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xfd, 0xf7, 0xe5, 0xff, 0xff, 0xf7, - 0x7b, 0xff, 0xff, 0xf7, 0x41, 0xff, 0xff, 0xf7, 0x37, 0xff, 0xff, 0xf7, - 0xed, 0xff, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x03, 0x4a, 0x04, 0xc3, 0x43, 0x60, 0x01, 0x23, 0x03, 0x72, - 0x70, 0x47, 0xc0, 0x46, 0x48, 0x43, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x00, - 0x0c, 0x00, 0x15, 0x00, 0x01, 0xf0, 0xd2, 0xfb, 0x00, 0x2e, 0x03, 0xd0, - 0x00, 0x2d, 0x01, 0xd0, 0x02, 0x2c, 0x02, 0xd9, 0x0c, 0x48, 0x01, 0xf0, - 0xa1, 0xfb, 0x33, 0x78, 0x04, 0x3b, 0xdb, 0xb2, 0x01, 0x2b, 0x02, 0xd9, - 0x08, 0x48, 0x01, 0xf0, 0x99, 0xfb, 0x21, 0x00, 0x30, 0x00, 0xfd, 0xf7, - 0xdd, 0xfb, 0x00, 0x28, 0x06, 0xd0, 0x2a, 0x00, 0x21, 0x00, 0x30, 0x00, - 0xfd, 0xf7, 0x66, 0xfb, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x70, 0xbd, - 0x24, 0x43, 0x01, 0x08, 0x70, 0xb5, 0x06, 0x00, 0x0c, 0x00, 0x15, 0x00, - 0x01, 0xf0, 0xaa, 0xfb, 0x00, 0x2e, 0x03, 0xd0, 0x00, 0x2d, 0x01, 0xd0, - 0x03, 0x2c, 0x02, 0xd9, 0x0c, 0x48, 0x01, 0xf0, 0x79, 0xfb, 0x33, 0x78, - 0x04, 0x3b, 0xdb, 0xb2, 0x01, 0x2b, 0x02, 0xd9, 0x08, 0x48, 0x01, 0xf0, - 0x71, 0xfb, 0x21, 0x00, 0x30, 0x00, 0xfd, 0xf7, 0x1d, 0xfc, 0x00, 0x28, - 0x06, 0xd0, 0x2a, 0x00, 0x21, 0x00, 0x30, 0x00, 0xfd, 0xf7, 0xd6, 0xfb, - 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x70, 0xbd, 0x70, 0x43, 0x01, 0x08, - 0x01, 0x23, 0x03, 0x70, 0x00, 0x23, 0x43, 0x60, 0x02, 0x00, 0x08, 0x32, - 0x82, 0x60, 0xc2, 0x60, 0x08, 0x32, 0x02, 0x61, 0x42, 0x61, 0x83, 0x61, - 0xc3, 0x61, 0x03, 0x62, 0x43, 0x62, 0x70, 0x47, 0x10, 0xb5, 0x00, 0x28, - 0x02, 0xd1, 0x03, 0x48, 0x01, 0xf0, 0x4a, 0xfb, 0x18, 0x30, 0xfb, 0xf7, - 0x77, 0xfd, 0x10, 0xbd, 0xa8, 0x41, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x28, 0x02, 0xd1, 0x03, 0x48, - 0x01, 0xf0, 0x3a, 0xfb, 0x18, 0x30, 0xfb, 0xf7, 0xc7, 0xfd, 0x10, 0xbd, - 0xcc, 0x42, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x01, 0x23, 0x03, 0x70, 0x00, 0x23, 0x43, 0x60, 0x83, 0x60, - 0xc3, 0x60, 0x03, 0x61, 0x43, 0x61, 0x18, 0x30, 0xfb, 0xf7, 0x14, 0xfa, - 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, - 0x01, 0xf0, 0x44, 0xfb, 0xa3, 0x69, 0x62, 0x69, 0x9a, 0x42, 0x03, 0xd1, - 0xa2, 0x68, 0x00, 0x2a, 0x02, 0xd1, 0x02, 0xe0, 0x00, 0x22, 0x00, 0xe0, - 0x01, 0x22, 0x00, 0x2a, 0x10, 0xd1, 0xa2, 0x68, 0x01, 0x32, 0xa2, 0x60, - 0x5a, 0x1c, 0xa2, 0x61, 0x1d, 0x78, 0x23, 0x69, 0x9a, 0x42, 0x01, 0xd3, - 0xe3, 0x68, 0xa3, 0x61, 0x00, 0x21, 0x20, 0x00, 0xfb, 0xf7, 0x98, 0xfb, - 0x28, 0x00, 0x01, 0xe0, 0x01, 0x20, 0x40, 0x42, 0x70, 0xbd, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x40, 0x60, 0x82, 0x60, 0xc1, 0x60, - 0x81, 0x61, 0x41, 0x61, 0x8a, 0x18, 0x02, 0x61, 0xc3, 0x61, 0x00, 0x9b, - 0x03, 0x62, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x00, 0x01, 0xf0, 0x0b, 0xfb, 0x63, 0x69, - 0xa2, 0x69, 0x93, 0x42, 0x03, 0xd1, 0xa2, 0x68, 0x00, 0x2a, 0x02, 0xd1, - 0x02, 0xe0, 0x00, 0x22, 0x00, 0xe0, 0x01, 0x22, 0x00, 0x2a, 0x11, 0xd1, - 0xa2, 0x68, 0x01, 0x32, 0xa2, 0x60, 0x5a, 0x1c, 0x62, 0x61, 0x1d, 0x70, - 0x63, 0x69, 0x22, 0x69, 0x93, 0x42, 0x01, 0xd3, 0xe3, 0x68, 0x63, 0x61, - 0x00, 0x21, 0x20, 0x00, 0xfb, 0xf7, 0x5e, 0xfb, 0x00, 0x20, 0x01, 0xe0, - 0x01, 0x20, 0x40, 0x42, 0x70, 0xbd, 0xc0, 0x46, 0x10, 0xb5, 0x00, 0x60, - 0x40, 0x60, 0x00, 0x24, 0x84, 0x60, 0xc1, 0x60, 0x81, 0x61, 0x41, 0x61, - 0x89, 0x18, 0x01, 0x61, 0xc3, 0x61, 0x02, 0x9b, 0x03, 0x62, 0x10, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x23, 0xdb, 0x05, 0x58, 0x6a, 0x70, 0x47, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0xff, 0xf7, 0xec, 0xfd, 0x00, 0x28, 0x02, 0xd1, 0x03, 0x48, 0x01, 0xf0, - 0x9f, 0xfa, 0x80, 0x23, 0xdb, 0x05, 0x5c, 0x63, 0x10, 0xbd, 0xc0, 0x46, - 0xe8, 0x42, 0x01, 0x08, 0x00, 0x22, 0x80, 0x23, 0xdb, 0x05, 0xda, 0x60, - 0x70, 0x47, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0xff, 0xf7, 0xd4, 0xfd, 0x00, 0x28, 0x02, 0xd0, 0x05, 0x48, 0x01, 0xf0, - 0x87, 0xfa, 0x80, 0x23, 0xdb, 0x05, 0x5c, 0x63, 0x00, 0x22, 0x1a, 0x61, - 0x02, 0x32, 0xda, 0x60, 0x10, 0xbd, 0xc0, 0x46, 0xbc, 0x42, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x4a, 0x11, 0x68, - 0x53, 0x68, 0x01, 0xe0, 0x01, 0xc9, 0x01, 0xc3, 0x90, 0x68, 0x83, 0x42, - 0xfa, 0xd3, 0x01, 0xe0, 0x00, 0x21, 0x02, 0xc3, 0xd1, 0x68, 0x8b, 0x42, - 0xfa, 0xd3, 0x10, 0x32, 0x02, 0x4b, 0x80, 0x33, 0x9a, 0x42, 0xec, 0xd3, - 0x70, 0x47, 0xc0, 0x46, 0x04, 0x42, 0x01, 0x08, 0xfe, 0xe7, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0x47, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x47, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, - 0xff, 0xf7, 0x74, 0xfe, 0x00, 0x2c, 0x01, 0xd0, 0xfc, 0xf7, 0x50, 0xf9, - 0x01, 0xf0, 0xf6, 0xfb, 0xfc, 0xf7, 0xe4, 0xf9, 0x00, 0x20, 0xfc, 0xf7, - 0xc9, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x02, 0x48, 0x01, 0xf0, 0x34, 0xfa, - 0x10, 0xbd, 0xc0, 0x46, 0xc0, 0x41, 0x01, 0x08, 0x70, 0xb5, 0x05, 0x00, - 0x0c, 0x00, 0x00, 0x28, 0x02, 0xd1, 0x12, 0x48, 0x01, 0xf0, 0x28, 0xfa, - 0x72, 0xb6, 0x01, 0xf0, 0x1d, 0xfb, 0x2b, 0x7a, 0x01, 0x3b, 0xdb, 0xb2, - 0x01, 0x2b, 0x02, 0xd9, 0x0c, 0x48, 0x01, 0xf0, 0x1d, 0xfa, 0x21, 0x00, - 0x28, 0x00, 0x01, 0xf0, 0x71, 0xfc, 0x02, 0x23, 0x2b, 0x72, 0x01, 0xf0, - 0xf5, 0xfa, 0x08, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, 0x01, 0xf0, - 0x09, 0xfa, 0x62, 0xb6, 0x70, 0xbd, 0xc0, 0x46, 0xf0, 0x41, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0xa8, 0x42, 0x01, 0x08, 0x70, 0xb5, 0x04, 0x1e, - 0x02, 0xd1, 0x1a, 0x48, 0x01, 0xf0, 0xfa, 0xf9, 0x72, 0xb6, 0x01, 0xf0, - 0xef, 0xfa, 0x23, 0x78, 0x01, 0x2b, 0x04, 0xd0, 0x04, 0x2b, 0x02, 0xd0, - 0x14, 0x48, 0x01, 0xf0, 0xef, 0xf9, 0x03, 0x23, 0x23, 0x70, 0x20, 0x00, - 0xfd, 0xf7, 0xca, 0xfa, 0x00, 0x23, 0x63, 0x60, 0x01, 0x33, 0x23, 0x70, - 0x20, 0x00, 0x10, 0x30, 0x02, 0x25, 0x6d, 0x42, 0x29, 0x00, 0xfb, 0xf7, - 0x97, 0xfa, 0x20, 0x00, 0x08, 0x30, 0x29, 0x00, 0xfb, 0xf7, 0x92, 0xfa, - 0xfb, 0xf7, 0x70, 0xf9, 0x01, 0xf0, 0xb6, 0xfa, 0x07, 0x4b, 0x1a, 0x68, - 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, - 0x02, 0xd2, 0x04, 0x48, 0x01, 0xf0, 0xca, 0xf9, 0x62, 0xb6, 0x70, 0xbd, - 0xf4, 0x42, 0x01, 0x08, 0xe8, 0x19, 0x00, 0x20, 0x9c, 0x42, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x28, - 0x02, 0xd1, 0x12, 0x48, 0x01, 0xf0, 0xb8, 0xf9, 0x72, 0xb6, 0x01, 0xf0, - 0xad, 0xfa, 0x23, 0x78, 0x01, 0x2b, 0x02, 0xd0, 0x0d, 0x48, 0x01, 0xf0, - 0xaf, 0xf9, 0x02, 0x23, 0x23, 0x70, 0x65, 0x60, 0x20, 0x00, 0xfd, 0xf7, - 0xa9, 0xfa, 0x04, 0x23, 0x23, 0x70, 0x01, 0xf0, 0x85, 0xfa, 0x08, 0x4b, - 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, - 0x99, 0x42, 0x02, 0xd2, 0x04, 0x48, 0x01, 0xf0, 0x99, 0xf9, 0x62, 0xb6, - 0x70, 0xbd, 0xc0, 0x46, 0x18, 0x43, 0x01, 0x08, 0xe8, 0x19, 0x00, 0x20, - 0x9c, 0x42, 0x01, 0x08, 0x10, 0xb5, 0x01, 0xf0, 0x6d, 0xfa, 0x07, 0x4b, - 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, - 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, 0x01, 0xf0, 0x81, 0xf9, 0x62, 0xb6, - 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0x90, 0x42, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x28, - 0x02, 0xd1, 0x0b, 0x48, 0x01, 0xf0, 0x70, 0xf9, 0x72, 0xb6, 0x01, 0xf0, - 0x65, 0xfa, 0x23, 0x78, 0x01, 0x3b, 0xdb, 0xb2, 0x01, 0x2b, 0x02, 0xd9, - 0x05, 0x48, 0x01, 0xf0, 0x65, 0xf9, 0x65, 0x60, 0x20, 0x00, 0xfd, 0xf7, - 0xc1, 0xfc, 0x02, 0x23, 0x23, 0x70, 0xff, 0xf7, 0xcd, 0xff, 0x70, 0xbd, - 0x0c, 0x43, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x00, - 0x0d, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x72, 0xb6, 0x01, 0xf0, 0x48, 0xfa, - 0x3b, 0x00, 0x32, 0x00, 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, 0xca, 0xfc, - 0x01, 0xf0, 0x28, 0xfa, 0x06, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, - 0x01, 0xf0, 0x3c, 0xf9, 0x62, 0xb6, 0xf8, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x90, 0x42, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x00, 0x01, 0x91, - 0x02, 0x92, 0x03, 0x93, 0xc6, 0x69, 0x00, 0x2a, 0x02, 0xd1, 0x23, 0x48, - 0x01, 0xf0, 0x24, 0xf9, 0x72, 0xb6, 0x01, 0xf0, 0x19, 0xfa, 0x02, 0x9f, - 0x29, 0xe0, 0x3a, 0x00, 0x01, 0x99, 0x20, 0x00, 0xff, 0xf7, 0xd2, 0xfc, - 0x05, 0x1e, 0x06, 0xd1, 0x03, 0x99, 0x20, 0x00, 0xfb, 0xf7, 0xec, 0xf8, - 0x00, 0x28, 0x1c, 0xd0, 0x1d, 0xe0, 0x00, 0x2e, 0x01, 0xd0, 0x20, 0x00, - 0xb0, 0x47, 0x01, 0xf0, 0xeb, 0xf9, 0x16, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x12, 0x48, 0x01, 0xf0, 0xff, 0xf8, 0x62, 0xb6, 0x7f, 0x1b, 0x01, 0x9b, - 0x9c, 0x46, 0xac, 0x44, 0x63, 0x46, 0x01, 0x93, 0x72, 0xb6, 0x01, 0xf0, - 0xed, 0xf9, 0x00, 0x2f, 0xd3, 0xd1, 0x01, 0xf0, 0xd1, 0xf9, 0x09, 0x4b, - 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, - 0x99, 0x42, 0x02, 0xd2, 0x05, 0x48, 0x01, 0xf0, 0xe5, 0xf8, 0x62, 0xb6, - 0x02, 0x9b, 0xd8, 0x1b, 0x05, 0xb0, 0xf0, 0xbd, 0xe0, 0x41, 0x01, 0x08, - 0xe8, 0x19, 0x00, 0x20, 0xf8, 0x41, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x30, 0x30, 0xff, 0xf7, 0xa4, 0xff, 0x10, 0xbd, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x30, 0x30, 0x01, 0x23, 0x5b, 0x42, - 0xff, 0xf7, 0x9a, 0xff, 0x10, 0xbd, 0xc0, 0x46, 0xf8, 0xb5, 0x04, 0x00, - 0x0e, 0x00, 0x15, 0x00, 0x72, 0xb6, 0x01, 0xf0, 0xb9, 0xf9, 0x15, 0xe0, - 0x29, 0x00, 0x20, 0x00, 0xfb, 0xf7, 0x94, 0xf8, 0x07, 0x1e, 0x0f, 0xda, - 0x01, 0xf0, 0x98, 0xf9, 0x1a, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x17, 0x48, - 0x01, 0xf0, 0xac, 0xf8, 0x62, 0xb6, 0x24, 0xe0, 0xa3, 0x68, 0x00, 0x2b, - 0xe6, 0xd0, 0xa3, 0x68, 0x01, 0x3b, 0xa3, 0x60, 0x63, 0x69, 0x5a, 0x1c, - 0x62, 0x61, 0x1e, 0x70, 0x63, 0x69, 0x22, 0x69, 0x93, 0x42, 0x01, 0xd3, - 0xe3, 0x68, 0x63, 0x61, 0xe3, 0x69, 0x00, 0x2b, 0x01, 0xd0, 0x20, 0x00, - 0x98, 0x47, 0x01, 0xf0, 0x73, 0xf9, 0x08, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x04, 0x48, 0x01, 0xf0, 0x87, 0xf8, 0x62, 0xb6, 0x00, 0x27, 0x38, 0x00, - 0xf8, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0xf8, 0x41, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x30, 0x30, 0xff, 0xf7, 0xac, 0xff, 0x10, 0xbd, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x30, 0x30, 0x01, 0x22, 0x52, 0x42, - 0xff, 0xf7, 0xa2, 0xff, 0x10, 0xbd, 0xc0, 0x46, 0xf0, 0xb5, 0x85, 0xb0, - 0x04, 0x00, 0x01, 0x91, 0x02, 0x92, 0x03, 0x93, 0xc6, 0x69, 0x00, 0x2a, - 0x02, 0xd1, 0x23, 0x48, 0x01, 0xf0, 0x5c, 0xf8, 0x72, 0xb6, 0x01, 0xf0, - 0x51, 0xf9, 0x02, 0x9f, 0x29, 0xe0, 0x3a, 0x00, 0x01, 0x99, 0x20, 0x00, - 0xff, 0xf7, 0x42, 0xfc, 0x05, 0x1e, 0x06, 0xd1, 0x03, 0x99, 0x20, 0x00, - 0xfb, 0xf7, 0x24, 0xf8, 0x00, 0x28, 0x1c, 0xd0, 0x1d, 0xe0, 0x00, 0x2e, - 0x01, 0xd0, 0x20, 0x00, 0xb0, 0x47, 0x01, 0xf0, 0x23, 0xf9, 0x16, 0x4b, - 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, - 0x99, 0x42, 0x02, 0xd2, 0x12, 0x48, 0x01, 0xf0, 0x37, 0xf8, 0x62, 0xb6, - 0x7f, 0x1b, 0x01, 0x9b, 0x9c, 0x46, 0xac, 0x44, 0x63, 0x46, 0x01, 0x93, - 0x72, 0xb6, 0x01, 0xf0, 0x25, 0xf9, 0x00, 0x2f, 0xd3, 0xd1, 0x01, 0xf0, - 0x09, 0xf9, 0x09, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x05, 0x48, 0x01, 0xf0, - 0x1d, 0xf8, 0x62, 0xb6, 0x02, 0x9b, 0xd8, 0x1b, 0x05, 0xb0, 0xf0, 0xbd, - 0xd0, 0x41, 0x01, 0x08, 0xe8, 0x19, 0x00, 0x20, 0xf8, 0x41, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x30, 0xff, 0xf7, 0xa4, 0xff, - 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x30, - 0x01, 0x23, 0x5b, 0x42, 0xff, 0xf7, 0x9a, 0xff, 0x10, 0xbd, 0xc0, 0x46, - 0x70, 0xb5, 0x04, 0x00, 0x0e, 0x00, 0x72, 0xb6, 0x01, 0xf0, 0xf2, 0xf8, - 0x15, 0xe0, 0x31, 0x00, 0x20, 0x00, 0xfa, 0xf7, 0xcd, 0xff, 0x05, 0x1e, - 0x0f, 0xda, 0x01, 0xf0, 0xd1, 0xf8, 0x19, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x15, 0x48, 0x00, 0xf0, 0xe5, 0xff, 0x62, 0xb6, 0x22, 0xe0, 0xa3, 0x68, - 0x00, 0x2b, 0xe6, 0xd0, 0xa3, 0x68, 0x01, 0x3b, 0xa3, 0x60, 0xa2, 0x69, - 0x53, 0x1c, 0xa3, 0x61, 0x15, 0x78, 0x22, 0x69, 0x93, 0x42, 0x01, 0xd3, - 0xe3, 0x68, 0xa3, 0x61, 0xe3, 0x69, 0x00, 0x2b, 0x01, 0xd0, 0x20, 0x00, - 0x98, 0x47, 0x01, 0xf0, 0xad, 0xf8, 0x07, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x03, 0x48, 0x00, 0xf0, 0xc1, 0xff, 0x62, 0xb6, 0x28, 0x00, 0x70, 0xbd, - 0xe8, 0x19, 0x00, 0x20, 0xf8, 0x41, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x0c, 0x30, 0xff, 0xf7, 0xb4, 0xff, 0x10, 0xbd, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x30, 0x01, 0x21, 0x49, 0x42, - 0xff, 0xf7, 0xaa, 0xff, 0x10, 0xbd, 0xc0, 0x46, 0xf0, 0xb5, 0x8b, 0xb0, - 0x04, 0x00, 0xa7, 0x4b, 0x9a, 0x69, 0xa7, 0x4b, 0x1a, 0x60, 0xff, 0x20, - 0xfb, 0xf7, 0x86, 0xfa, 0xfb, 0xf7, 0xfc, 0xfe, 0x00, 0x27, 0x30, 0xe1, - 0xe1, 0x88, 0x20, 0x00, 0xfc, 0xf7, 0xee, 0xf8, 0x00, 0x28, 0x02, 0xd0, - 0xa0, 0x48, 0x00, 0xf0, 0x91, 0xff, 0x20, 0x79, 0xfb, 0xf7, 0x66, 0xff, - 0x00, 0x28, 0x02, 0xd0, 0x9c, 0x48, 0x00, 0xf0, 0x89, 0xff, 0x9c, 0x4e, - 0x9c, 0x4d, 0x32, 0x00, 0x01, 0x21, 0x28, 0x00, 0xfc, 0xf7, 0x12, 0xfc, - 0x32, 0x00, 0x00, 0x21, 0x28, 0x00, 0xfc, 0xf7, 0x0d, 0xfc, 0x98, 0x4d, - 0x2b, 0x68, 0x98, 0x4a, 0x92, 0x49, 0x09, 0x68, 0x58, 0x69, 0xfe, 0xf7, - 0x85, 0xfe, 0x2b, 0x68, 0x95, 0x49, 0x58, 0x69, 0xfe, 0xf7, 0x70, 0xfe, - 0x00, 0x25, 0x15, 0xe0, 0x90, 0x4b, 0x1a, 0x68, 0xab, 0x1c, 0x9b, 0x00, - 0x9b, 0x58, 0x01, 0x93, 0x90, 0x4b, 0x00, 0x93, 0xfe, 0x23, 0x90, 0x4a, - 0x80, 0x21, 0x49, 0x01, 0x00, 0x20, 0x00, 0xf0, 0x97, 0xfd, 0xab, 0x00, - 0x0a, 0xaa, 0x94, 0x46, 0x63, 0x44, 0x04, 0x3b, 0x18, 0x60, 0x01, 0x35, - 0x00, 0x2d, 0xe7, 0xdd, 0x84, 0x4f, 0x3b, 0x68, 0x1b, 0x69, 0x01, 0x93, - 0x80, 0x25, 0xad, 0x00, 0x86, 0x4b, 0x00, 0x93, 0xfd, 0x23, 0x86, 0x4a, - 0x29, 0x00, 0x00, 0x20, 0x00, 0xf0, 0x80, 0xfd, 0x04, 0x90, 0x3b, 0x68, - 0x01, 0x93, 0x83, 0x4b, 0x00, 0x93, 0xfd, 0x23, 0x82, 0x4a, 0x29, 0x00, - 0x00, 0x20, 0x00, 0xf0, 0x75, 0xfd, 0x05, 0x90, 0x3b, 0x68, 0xdb, 0x6b, - 0x01, 0x93, 0x7f, 0x4b, 0x00, 0x93, 0xfc, 0x23, 0x7e, 0x4a, 0x29, 0x00, - 0x00, 0x20, 0x00, 0xf0, 0x69, 0xfd, 0x06, 0x90, 0x3b, 0x68, 0x58, 0x68, - 0xf9, 0xf7, 0x3c, 0xfd, 0x72, 0xb6, 0x01, 0xf0, 0x21, 0xf8, 0xff, 0xf7, - 0x77, 0xfc, 0x05, 0x00, 0x01, 0xf0, 0x04, 0xf8, 0x66, 0x4a, 0x13, 0x68, - 0x93, 0x42, 0x07, 0xd0, 0x92, 0x69, 0x92, 0x68, 0x9b, 0x68, 0x9a, 0x42, - 0x02, 0xd2, 0x72, 0x48, 0x00, 0xf0, 0x18, 0xff, 0x62, 0xb6, 0x00, 0x27, - 0x5a, 0xe0, 0x01, 0x23, 0x5b, 0x42, 0x08, 0x93, 0x62, 0x4f, 0x3b, 0x68, - 0x58, 0x68, 0xf9, 0xf7, 0xbd, 0xfa, 0x3b, 0x68, 0x5f, 0x69, 0xff, 0xf7, - 0x59, 0xfc, 0x40, 0x1b, 0x69, 0x4a, 0x00, 0x23, 0x00, 0x21, 0xf8, 0xf7, - 0xd5, 0xfc, 0x68, 0x4a, 0x00, 0x23, 0x80, 0x18, 0x59, 0x41, 0x67, 0x4a, - 0x00, 0x23, 0xf8, 0xf7, 0xad, 0xfc, 0x07, 0x90, 0x65, 0x49, 0x44, 0x23, - 0xca, 0x5a, 0xcd, 0x33, 0xff, 0x33, 0xcb, 0x58, 0x63, 0x48, 0x06, 0x79, - 0x08, 0xa8, 0x02, 0x90, 0x5d, 0x31, 0x01, 0x91, 0x00, 0x96, 0x07, 0x99, - 0x38, 0x00, 0xfe, 0xf7, 0x01, 0xfd, 0x07, 0x1e, 0x2c, 0xd1, 0x72, 0xb6, - 0x00, 0xf0, 0xdc, 0xff, 0xff, 0xf7, 0x32, 0xfc, 0x05, 0x00, 0x00, 0xf0, - 0xbf, 0xff, 0x44, 0x4a, 0x13, 0x68, 0x93, 0x42, 0x07, 0xd0, 0x92, 0x69, - 0x92, 0x68, 0x9b, 0x68, 0x9a, 0x42, 0x02, 0xd2, 0x4f, 0x48, 0x00, 0xf0, - 0xd3, 0xfe, 0x62, 0xb6, 0x50, 0x4a, 0x00, 0x23, 0x08, 0x98, 0x00, 0x21, - 0xf8, 0xf7, 0x9e, 0xfc, 0x50, 0x4a, 0x00, 0x23, 0x80, 0x18, 0x59, 0x41, - 0x49, 0x4a, 0x00, 0x23, 0xf8, 0xf7, 0x76, 0xfc, 0x01, 0x00, 0x01, 0x20, - 0x40, 0x42, 0x00, 0xf0, 0x37, 0xfd, 0x01, 0x1e, 0x02, 0xd0, 0x37, 0x48, - 0xfb, 0xf7, 0x8a, 0xfe, 0x00, 0x2f, 0xa2, 0xd0, 0x00, 0x26, 0x0d, 0xe0, - 0xb3, 0x00, 0x0a, 0xaa, 0x94, 0x46, 0x63, 0x44, 0x04, 0x3b, 0x1d, 0x68, - 0x28, 0x00, 0xfb, 0xf7, 0xdd, 0xf9, 0x01, 0x21, 0x28, 0x00, 0xfb, 0xf7, - 0xb1, 0xf8, 0x01, 0x36, 0x00, 0x2e, 0xef, 0xdd, 0x04, 0x9d, 0x28, 0x00, - 0xfb, 0xf7, 0xd2, 0xf9, 0x01, 0x21, 0x28, 0x00, 0xfb, 0xf7, 0xa6, 0xf8, - 0x05, 0x9d, 0x28, 0x00, 0xfb, 0xf7, 0xca, 0xf9, 0x01, 0x21, 0x28, 0x00, - 0xfb, 0xf7, 0x9e, 0xf8, 0x06, 0x9d, 0x28, 0x00, 0xfb, 0xf7, 0xc2, 0xf9, - 0x01, 0x21, 0x28, 0x00, 0xfb, 0xf7, 0x96, 0xf8, 0x00, 0x25, 0x08, 0xe0, - 0xab, 0x00, 0x0a, 0xaa, 0x94, 0x46, 0x63, 0x44, 0x04, 0x3b, 0x18, 0x68, - 0xfb, 0xf7, 0x6c, 0xfa, 0x01, 0x35, 0x00, 0x2d, 0xf4, 0xdd, 0x04, 0x98, - 0xfb, 0xf7, 0x66, 0xfa, 0x05, 0x98, 0xfb, 0xf7, 0x63, 0xfa, 0x06, 0x98, - 0xfb, 0xf7, 0x60, 0xfa, 0x15, 0x4d, 0x2b, 0x68, 0x00, 0x22, 0x11, 0x00, - 0x58, 0x69, 0xfe, 0xf7, 0x81, 0xfd, 0x2b, 0x68, 0x00, 0x21, 0x58, 0x69, - 0xfe, 0xf7, 0x6c, 0xfd, 0x0e, 0x48, 0xfc, 0xf7, 0x31, 0xfb, 0x02, 0x2f, - 0x00, 0xd0, 0xcb, 0xe6, 0x01, 0x20, 0xfb, 0xf7, 0x93, 0xfd, 0x20, 0x00, - 0xfb, 0xf7, 0xe0, 0xff, 0xbf, 0xf3, 0x4f, 0x8f, 0x1a, 0x4a, 0x1b, 0x4b, - 0xda, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xc0, 0x46, 0xfd, 0xe7, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0x84, 0x19, 0x00, 0x20, 0xfc, 0x42, 0x01, 0x08, - 0x11, 0xdc, 0x00, 0x08, 0xfc, 0x18, 0x00, 0x20, 0x80, 0x19, 0x00, 0x20, - 0xb1, 0xd6, 0x00, 0x08, 0xd1, 0xd6, 0x00, 0x08, 0x71, 0xe5, 0x00, 0x08, - 0x80, 0x43, 0x01, 0x08, 0x41, 0xe4, 0x00, 0x08, 0x8c, 0x43, 0x01, 0x08, - 0xd1, 0xe2, 0x00, 0x08, 0x98, 0x43, 0x01, 0x08, 0xb1, 0xe1, 0x00, 0x08, - 0xa4, 0x43, 0x01, 0x08, 0x84, 0x42, 0x01, 0x08, 0x40, 0x42, 0x0f, 0x00, - 0x0f, 0x27, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x20, - 0x40, 0x08, 0x00, 0x20, 0x3f, 0x42, 0x0f, 0x00, 0x04, 0x00, 0xfa, 0x05, - 0x00, 0xed, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x57, 0x46, 0x80, 0xb4, 0x82, 0xb0, 0x06, 0x00, 0x0d, 0x00, - 0x00, 0x92, 0x00, 0x2b, 0x01, 0xd1, 0x0c, 0x00, 0x00, 0xe0, 0x1c, 0x00, - 0x0b, 0x23, 0x9a, 0x46, 0xb2, 0x44, 0x57, 0x46, 0x01, 0x95, 0x00, 0x99, - 0x28, 0x00, 0xf8, 0xf7, 0xcd, 0xfa, 0x0b, 0x00, 0x30, 0x33, 0x39, 0x2b, - 0x00, 0xdd, 0x07, 0x33, 0x01, 0x3f, 0x3b, 0x70, 0x00, 0x99, 0x01, 0x98, - 0xf8, 0xf7, 0x3c, 0xfa, 0x05, 0x00, 0x00, 0x99, 0x20, 0x00, 0xf8, 0xf7, - 0x37, 0xfa, 0x04, 0x1e, 0xe8, 0xd1, 0x53, 0x46, 0xdb, 0x1b, 0x70, 0x1c, - 0x3a, 0x78, 0x32, 0x70, 0x01, 0x3b, 0x06, 0x00, 0x01, 0x37, 0x00, 0x2b, - 0xf7, 0xd1, 0x02, 0xb0, 0x04, 0xbc, 0x92, 0x46, 0xf0, 0xbd, 0xc0, 0x46, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x23, 0xff, 0xf7, 0xc4, 0xff, - 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x5f, 0x46, - 0x56, 0x46, 0x4d, 0x46, 0x44, 0x46, 0xf0, 0xb4, 0x89, 0xb0, 0x06, 0x00, - 0x8a, 0x46, 0x93, 0x46, 0x00, 0x25, 0x53, 0x46, 0x5f, 0x1c, 0x19, 0x78, - 0x00, 0x29, 0x00, 0xd1, 0x32, 0xe1, 0x25, 0x29, 0x06, 0xd0, 0x33, 0x68, - 0xdb, 0x68, 0x30, 0x00, 0x98, 0x47, 0x01, 0x35, 0xba, 0x46, 0xf0, 0xe7, - 0x53, 0x46, 0x5b, 0x78, 0x2d, 0x2b, 0x04, 0xd1, 0x57, 0x46, 0x02, 0x37, - 0x2c, 0x3b, 0x99, 0x46, 0x01, 0xe0, 0x00, 0x23, 0x99, 0x46, 0x3b, 0x78, - 0x2b, 0x2b, 0x03, 0xd1, 0x01, 0x37, 0x2a, 0x3b, 0x03, 0x93, 0x01, 0xe0, - 0x00, 0x23, 0x03, 0x93, 0x3b, 0x78, 0x30, 0x2b, 0x02, 0xd1, 0x01, 0x37, - 0x01, 0x93, 0x01, 0xe0, 0x20, 0x23, 0x01, 0x93, 0x3b, 0x78, 0x2a, 0x2b, - 0x07, 0xd1, 0x5b, 0x46, 0x1c, 0x68, 0x04, 0x23, 0x9c, 0x46, 0xe3, 0x44, - 0xba, 0x1c, 0x79, 0x78, 0x10, 0xe0, 0x00, 0x24, 0x7a, 0x1c, 0x39, 0x78, - 0x00, 0x29, 0x00, 0xd1, 0xfc, 0xe0, 0x0b, 0x00, 0x30, 0x3b, 0xdb, 0xb2, - 0x09, 0x2b, 0x05, 0xd8, 0xa1, 0x00, 0x0c, 0x19, 0x61, 0x00, 0xcc, 0x18, - 0x17, 0x00, 0xef, 0xe7, 0x2e, 0x29, 0x25, 0xd1, 0x53, 0x1c, 0x11, 0x78, - 0x00, 0x29, 0x00, 0xd1, 0xea, 0xe0, 0x2a, 0x29, 0x15, 0xd1, 0x5b, 0x46, - 0x1b, 0x68, 0x02, 0x93, 0x04, 0x23, 0x9c, 0x46, 0xe3, 0x44, 0x51, 0x78, - 0x02, 0x32, 0x17, 0xe0, 0x02, 0x9b, 0x99, 0x00, 0xcb, 0x18, 0x59, 0x00, - 0xcb, 0x19, 0x02, 0x93, 0x57, 0x1c, 0x11, 0x78, 0x00, 0x29, 0x00, 0xd1, - 0xd4, 0xe0, 0x3a, 0x00, 0x02, 0xe0, 0x1a, 0x00, 0x00, 0x23, 0x02, 0x93, - 0x0f, 0x00, 0x30, 0x3f, 0xff, 0xb2, 0x09, 0x2f, 0xea, 0xd9, 0x01, 0xe0, - 0x00, 0x23, 0x02, 0x93, 0x6c, 0x29, 0x01, 0xd0, 0x4c, 0x29, 0x07, 0xd1, - 0x53, 0x1c, 0x9a, 0x46, 0x11, 0x78, 0x00, 0x29, 0x00, 0xd1, 0xbd, 0xe0, - 0x01, 0x27, 0x0a, 0xe0, 0x0f, 0x00, 0x41, 0x3f, 0xf8, 0xb2, 0x84, 0x46, - 0x00, 0x27, 0x19, 0x20, 0x63, 0x46, 0x98, 0x42, 0x7f, 0x41, 0xff, 0xb2, - 0x92, 0x46, 0x0a, 0x00, 0x44, 0x3a, 0xd0, 0xb2, 0x34, 0x28, 0x66, 0xd8, - 0x82, 0x00, 0x59, 0x48, 0x82, 0x58, 0x97, 0x46, 0x10, 0x22, 0x4e, 0xe0, - 0x5b, 0x46, 0x1a, 0x68, 0x04, 0x23, 0x9c, 0x46, 0xe3, 0x44, 0x05, 0xab, - 0x1a, 0x70, 0x20, 0x22, 0x01, 0x92, 0x1f, 0x00, 0x04, 0xab, 0x58, 0x1d, - 0x5b, 0xe0, 0x5a, 0x46, 0x17, 0x68, 0x04, 0x23, 0x9c, 0x46, 0xe3, 0x44, - 0x00, 0x2f, 0x00, 0xd1, 0x4d, 0x4f, 0x02, 0x9b, 0x00, 0x2b, 0x01, 0xd1, - 0x4c, 0x4b, 0x02, 0x93, 0x38, 0x00, 0x00, 0xe0, 0x01, 0x30, 0x02, 0x78, - 0x00, 0x2a, 0x46, 0xd0, 0x02, 0x9b, 0x01, 0x3b, 0x02, 0x93, 0xf7, 0xd5, - 0x20, 0x23, 0x01, 0x93, 0x41, 0xe0, 0x00, 0x2f, 0x05, 0xd0, 0x5b, 0x46, - 0x19, 0x68, 0x04, 0x23, 0x9c, 0x46, 0xe3, 0x44, 0x04, 0xe0, 0x5b, 0x46, - 0x19, 0x68, 0x04, 0x23, 0x9c, 0x46, 0xe3, 0x44, 0x00, 0x29, 0x06, 0xda, - 0x2d, 0x22, 0x05, 0xab, 0x1a, 0x70, 0x49, 0x42, 0x04, 0xab, 0x58, 0x1d, - 0x09, 0xe0, 0x03, 0x9b, 0x00, 0x2b, 0x05, 0xd0, 0x2b, 0x22, 0x05, 0xab, - 0x1a, 0x70, 0x04, 0xab, 0x58, 0x1d, 0x00, 0xe0, 0x05, 0xa8, 0x0a, 0x22, - 0xff, 0xf7, 0x10, 0xff, 0x05, 0xaf, 0x1c, 0xe0, 0x08, 0x22, 0x00, 0xe0, - 0x0a, 0x22, 0x00, 0x2f, 0x05, 0xd0, 0x5b, 0x46, 0x19, 0x68, 0x04, 0x23, - 0x9c, 0x46, 0xe3, 0x44, 0x04, 0xe0, 0x5b, 0x46, 0x19, 0x68, 0x04, 0x23, - 0x9c, 0x46, 0xe3, 0x44, 0x05, 0xa8, 0xff, 0xf7, 0xfb, 0xfe, 0x05, 0xaf, - 0x07, 0xe0, 0x05, 0xab, 0x19, 0x70, 0x1f, 0x00, 0x04, 0xab, 0x58, 0x1d, - 0x01, 0xe0, 0x20, 0x23, 0x01, 0x93, 0xc3, 0x1b, 0x98, 0x46, 0xe4, 0x1a, - 0x00, 0xd5, 0x00, 0x24, 0x4b, 0x46, 0x00, 0x2b, 0x00, 0xd1, 0x64, 0x42, - 0x00, 0x2c, 0x22, 0xda, 0x39, 0x78, 0x2d, 0x29, 0x0c, 0xd1, 0x01, 0x9b, - 0x30, 0x2b, 0x09, 0xd1, 0x01, 0x37, 0x33, 0x68, 0xdb, 0x68, 0x30, 0x00, - 0x98, 0x47, 0x01, 0x35, 0x01, 0x23, 0x5b, 0x42, 0x9c, 0x46, 0xe0, 0x44, - 0x33, 0x68, 0xdb, 0x68, 0x01, 0x99, 0x30, 0x00, 0x98, 0x47, 0x01, 0x35, - 0x01, 0x34, 0x00, 0x2c, 0xf6, 0xd1, 0x08, 0xe0, 0x7b, 0x1c, 0x99, 0x46, - 0x39, 0x78, 0x33, 0x68, 0xdb, 0x68, 0x30, 0x00, 0x98, 0x47, 0x01, 0x35, - 0x4f, 0x46, 0x43, 0x46, 0x01, 0x3b, 0x98, 0x46, 0xf2, 0xd5, 0x06, 0xe0, - 0x33, 0x68, 0xdb, 0x68, 0x01, 0x99, 0x30, 0x00, 0x98, 0x47, 0x01, 0x35, - 0x01, 0x3c, 0x00, 0x2c, 0xf6, 0xd1, 0xc6, 0xe6, 0x28, 0x00, 0x09, 0xb0, - 0x3c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xa2, 0x46, 0xab, 0x46, 0xf0, 0xbd, - 0xb0, 0x43, 0x01, 0x08, 0xe0, 0x44, 0x01, 0x08, 0xff, 0x7f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0xb4, 0x00, 0xb5, 0x82, 0xb0, 0x03, 0xaa, 0x02, 0xca, 0x01, 0x92, - 0xff, 0xf7, 0xa0, 0xfe, 0x02, 0xb0, 0x08, 0xbc, 0x03, 0xb0, 0x18, 0x47, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x84, 0xb0, - 0x0e, 0x4c, 0x01, 0x23, 0x03, 0x93, 0x00, 0x23, 0x02, 0x93, 0x0d, 0x4b, - 0x01, 0x93, 0x80, 0x23, 0x00, 0x93, 0x88, 0x33, 0x0b, 0x4a, 0x0c, 0x49, - 0x20, 0x00, 0xfb, 0xf7, 0xf7, 0xfb, 0x20, 0x00, 0xfb, 0xf7, 0xdc, 0xfb, - 0x09, 0x4c, 0x00, 0x21, 0x20, 0x00, 0xff, 0xf7, 0x2f, 0xfa, 0x08, 0x49, - 0x20, 0x00, 0xff, 0xf7, 0xd3, 0xff, 0x04, 0xb0, 0x10, 0xbd, 0xc0, 0x46, - 0xa0, 0x22, 0x00, 0x20, 0x01, 0x29, 0x01, 0x08, 0xe8, 0x22, 0x00, 0x20, - 0xe8, 0x44, 0x01, 0x08, 0x88, 0x19, 0x00, 0x20, 0x00, 0x45, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, - 0x0d, 0x00, 0x00, 0xf0, 0x6b, 0xfc, 0x00, 0x2c, 0x05, 0xd0, 0x00, 0x2d, - 0x03, 0xd0, 0xa3, 0x68, 0x01, 0x3b, 0x1d, 0x42, 0x02, 0xd0, 0x03, 0x48, - 0x00, 0xf0, 0x38, 0xfc, 0x23, 0x68, 0x2b, 0x60, 0x25, 0x60, 0x70, 0xbd, - 0x9c, 0x45, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, - 0x0d, 0x00, 0x16, 0x00, 0x00, 0xf0, 0x52, 0xfc, 0x00, 0x2d, 0x02, 0xd0, - 0x6b, 0x1e, 0x1d, 0x42, 0x02, 0xd0, 0x0a, 0x48, 0x00, 0xf0, 0x22, 0xfc, - 0x09, 0x4b, 0x59, 0x68, 0x0c, 0x1b, 0x68, 0x42, 0x20, 0x40, 0x82, 0x1b, - 0x1b, 0x68, 0x9a, 0x42, 0x04, 0xd3, 0x91, 0x42, 0x04, 0xd3, 0x04, 0x4b, - 0x5a, 0x60, 0x02, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x70, 0xbd, - 0x74, 0x45, 0x01, 0x08, 0x98, 0x22, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x57, 0x46, 0x4e, 0x46, 0x45, 0x46, - 0xe0, 0xb4, 0x84, 0xb0, 0x80, 0x46, 0x89, 0x46, 0x16, 0x00, 0x00, 0x29, - 0x04, 0xd0, 0x00, 0x2a, 0x02, 0xd0, 0x53, 0x1e, 0x1a, 0x42, 0x02, 0xd0, - 0x46, 0x48, 0x00, 0xf0, 0xf5, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x45, 0x4b, - 0x98, 0x46, 0x07, 0x2e, 0x00, 0xd8, 0x08, 0x26, 0x4b, 0x46, 0xdf, 0x1d, - 0xfb, 0x08, 0x9a, 0x46, 0x0c, 0x23, 0x43, 0x44, 0x03, 0x93, 0x18, 0x00, - 0xfa, 0xf7, 0x74, 0xfe, 0x43, 0x46, 0x1d, 0x1d, 0xd4, 0x46, 0x52, 0xe0, - 0x0f, 0x00, 0x08, 0x37, 0xbb, 0x19, 0x01, 0x3b, 0x72, 0x42, 0x13, 0x40, - 0x08, 0x3b, 0x00, 0x93, 0x4a, 0x68, 0x50, 0x1c, 0xc4, 0x00, 0x08, 0x19, - 0x83, 0x42, 0x43, 0xd2, 0x02, 0x91, 0x01, 0x93, 0xcb, 0x1a, 0x20, 0x00, - 0x08, 0x38, 0x1b, 0x18, 0xdb, 0x10, 0x9c, 0x45, 0x3a, 0xd8, 0xe2, 0x46, - 0x14, 0x00, 0x01, 0x98, 0x06, 0x00, 0x81, 0x42, 0x11, 0xd2, 0xc0, 0x1b, - 0xc0, 0x10, 0x48, 0x60, 0x9c, 0x45, 0x24, 0xd2, 0x62, 0x46, 0x01, 0x32, - 0xd2, 0x00, 0xb4, 0x46, 0x62, 0x44, 0x50, 0x46, 0x1b, 0x1a, 0x01, 0x3b, - 0x53, 0x60, 0x0b, 0x68, 0x13, 0x60, 0x0a, 0x60, 0x17, 0xe0, 0xa4, 0x45, - 0x03, 0xd1, 0x0b, 0x68, 0x2b, 0x60, 0x00, 0x91, 0x11, 0xe0, 0x67, 0x46, - 0x01, 0x37, 0xff, 0x00, 0xcf, 0x19, 0x0b, 0x68, 0x3b, 0x60, 0x4b, 0x68, - 0x01, 0x33, 0xdb, 0x00, 0x08, 0x3b, 0x1a, 0x00, 0x02, 0x9b, 0xdb, 0x1b, - 0xd3, 0x18, 0xdb, 0x10, 0x7b, 0x60, 0x2f, 0x60, 0x00, 0x91, 0x00, 0x9c, - 0x4a, 0x46, 0x62, 0x60, 0x42, 0x46, 0x22, 0x60, 0x03, 0x98, 0xfa, 0xf7, - 0xc1, 0xfd, 0x20, 0x00, 0x08, 0x30, 0x1c, 0xe0, 0x0d, 0x00, 0x29, 0x68, - 0x00, 0x29, 0xa9, 0xd1, 0xe2, 0x46, 0x03, 0x98, 0xfa, 0xf7, 0xb6, 0xfd, - 0x43, 0x46, 0x1b, 0x68, 0x00, 0x2b, 0x0d, 0xd0, 0x52, 0x46, 0xd0, 0x00, - 0x08, 0x22, 0x31, 0x00, 0x98, 0x47, 0x00, 0x28, 0x08, 0xd0, 0x03, 0x00, - 0x08, 0x3b, 0x42, 0x46, 0x1a, 0x60, 0x4a, 0x46, 0x5a, 0x60, 0x02, 0xe0, - 0x00, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x04, 0xb0, 0x1c, 0xbc, 0x90, 0x46, - 0x99, 0x46, 0xa2, 0x46, 0xf0, 0xbd, 0xc0, 0x46, 0x88, 0x45, 0x01, 0x08, - 0xc8, 0x22, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x01, 0x20, 0xff, 0xf7, 0x14, 0xf9, - 0xff, 0xf7, 0xe2, 0xfe, 0x09, 0x4d, 0x0a, 0x49, 0x28, 0x00, 0xff, 0xf7, - 0xcd, 0xfe, 0x96, 0x24, 0x64, 0x00, 0x20, 0x00, 0xfa, 0xf7, 0x58, 0xfe, - 0x06, 0x49, 0x28, 0x00, 0xff, 0xf7, 0xc4, 0xfe, 0x20, 0x00, 0xfa, 0xf7, - 0x51, 0xfe, 0x04, 0x48, 0xff, 0xf7, 0x9e, 0xfb, 0x88, 0x19, 0x00, 0x20, - 0x20, 0x45, 0x01, 0x08, 0x58, 0x45, 0x01, 0x08, 0xcc, 0x0a, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x0f, 0x30, 0x14, 0xd0, 0x72, 0xb6, 0xef, 0xf3, 0x09, 0x84, - 0x23, 0x00, 0x20, 0x3b, 0x83, 0xf3, 0x09, 0x88, 0x80, 0x22, 0x52, 0x04, - 0xda, 0x61, 0xfa, 0xf7, 0xb1, 0xfa, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x3c, - 0x03, 0x4b, 0xa3, 0x61, 0x02, 0xe0, 0x20, 0x3c, 0x02, 0x4b, 0xa3, 0x61, - 0x10, 0xbd, 0xc0, 0x46, 0xcb, 0xa5, 0x00, 0x08, 0xd6, 0xa5, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x4a, 0x11, 0x6a, 0x02, 0x4b, 0x0b, 0x40, - 0x13, 0x62, 0x70, 0x47, 0x00, 0xed, 0x00, 0xe0, 0xff, 0xff, 0x00, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xef, 0xf3, 0x09, 0x83, 0x20, 0x33, 0x83, 0xf3, 0x09, 0x88, 0x62, 0xb6, - 0x70, 0x47, 0xc0, 0x46, 0xf8, 0xb5, 0x07, 0x1e, 0x01, 0xd0, 0x43, 0x07, - 0x02, 0xd0, 0x26, 0x48, 0x00, 0xf0, 0xf8, 0xfa, 0x05, 0x00, 0x08, 0x3d, - 0x2c, 0x68, 0x26, 0x1d, 0x6b, 0x68, 0x07, 0x33, 0xdb, 0x08, 0x6b, 0x60, - 0x0c, 0x34, 0x20, 0x00, 0xfa, 0xf7, 0x7c, 0xfd, 0x33, 0x00, 0xab, 0x42, - 0x08, 0xd8, 0x5a, 0x68, 0x01, 0x32, 0xd2, 0x00, 0x9a, 0x18, 0x95, 0x42, - 0x02, 0xd2, 0x1a, 0x48, 0x00, 0xf0, 0xe0, 0xfa, 0xb3, 0x42, 0x01, 0xd0, - 0xab, 0x42, 0x27, 0xd2, 0x1a, 0x68, 0x00, 0x2a, 0x01, 0xd0, 0x95, 0x42, - 0x22, 0xd2, 0x39, 0x00, 0x08, 0x39, 0x0a, 0x60, 0x1d, 0x60, 0x48, 0x68, - 0x42, 0x1c, 0xd2, 0x00, 0xaa, 0x18, 0x09, 0x68, 0x8a, 0x42, 0x08, 0xd1, - 0x3a, 0x00, 0x08, 0x3a, 0x4e, 0x68, 0xb4, 0x46, 0x60, 0x44, 0x01, 0x30, - 0x50, 0x60, 0x09, 0x68, 0x11, 0x60, 0x59, 0x68, 0x4a, 0x1c, 0xd2, 0x00, - 0x9a, 0x18, 0x95, 0x42, 0x0a, 0xd1, 0x08, 0x3f, 0x7a, 0x68, 0x94, 0x46, - 0x61, 0x44, 0x01, 0x31, 0x59, 0x60, 0x3a, 0x68, 0x1a, 0x60, 0x01, 0xe0, - 0x1b, 0x68, 0xc6, 0xe7, 0x20, 0x00, 0xfa, 0xf7, 0xdf, 0xfc, 0xf8, 0xbd, - 0xd4, 0x44, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x05, 0x48, 0x05, 0x4b, 0x03, 0x60, 0x00, 0x23, 0x43, 0x60, - 0x83, 0x60, 0x0c, 0x30, 0xfa, 0xf7, 0x8e, 0xf9, 0x10, 0xbd, 0xc0, 0x46, - 0xc8, 0x22, 0x00, 0x20, 0x91, 0x29, 0x01, 0x08, 0x02, 0x4b, 0x03, 0x4a, - 0x1a, 0x60, 0x03, 0x4a, 0x5a, 0x60, 0x70, 0x47, 0x98, 0x22, 0x00, 0x20, - 0x50, 0x25, 0x00, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x28, - 0x16, 0xd1, 0x0d, 0x48, 0x00, 0xf0, 0x80, 0xfa, 0x2b, 0x00, 0xe3, 0x40, - 0xdb, 0x07, 0x0d, 0xd5, 0xa3, 0x00, 0xf3, 0x18, 0x1a, 0x68, 0x00, 0x2a, - 0x02, 0xd1, 0x07, 0x48, 0x00, 0xf0, 0x74, 0xfa, 0x01, 0x22, 0xa2, 0x40, - 0x95, 0x43, 0x1b, 0x68, 0x20, 0x00, 0x98, 0x47, 0x01, 0x34, 0x00, 0xe0, - 0x00, 0x24, 0x00, 0x2d, 0xe8, 0xd1, 0x70, 0xbd, 0xb8, 0x44, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x00, 0x00, 0xf0, 0x83, 0xfa, 0x00, 0x2c, - 0x02, 0xd1, 0x0c, 0x48, 0x00, 0xf0, 0x56, 0xfa, 0x61, 0x6b, 0x29, 0x43, - 0x61, 0x63, 0x20, 0x23, 0xe3, 0x5c, 0x0a, 0x2b, 0x02, 0xd1, 0x62, 0x6a, - 0x0a, 0x42, 0x05, 0xd1, 0x0b, 0x2b, 0x08, 0xd1, 0x63, 0x6a, 0x19, 0x40, - 0x8b, 0x42, 0x04, 0xd1, 0x00, 0x23, 0x63, 0x62, 0x20, 0x00, 0xfa, 0xf7, - 0x31, 0xfa, 0x70, 0xbd, 0xa8, 0x44, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x01, 0x22, - 0x01, 0x21, 0x90, 0x20, 0xc0, 0x05, 0x00, 0xf0, 0x11, 0xfd, 0x08, 0xe0, - 0x90, 0x22, 0xd2, 0x05, 0x51, 0x69, 0x01, 0x23, 0x4b, 0x40, 0x53, 0x61, - 0x08, 0x48, 0xfa, 0xf7, 0x2f, 0xfd, 0x08, 0x4b, 0x9a, 0x69, 0x21, 0x23, - 0xd3, 0x5c, 0x5b, 0x07, 0xf0, 0xd5, 0x01, 0x22, 0x90, 0x23, 0xdb, 0x05, - 0x5a, 0x83, 0x00, 0x20, 0xfa, 0xf7, 0x1a, 0xfc, 0x10, 0xbd, 0xc0, 0x46, - 0x88, 0x13, 0x00, 0x00, 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x00, 0x72, 0xb6, - 0x00, 0xf0, 0x02, 0xfb, 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, 0xbe, 0xfd, - 0x00, 0xf0, 0xe4, 0xfa, 0x06, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, - 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, - 0x00, 0xf0, 0xf8, 0xf9, 0x62, 0xb6, 0x70, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x84, 0x44, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x00, - 0x0d, 0x00, 0x16, 0x00, 0x72, 0xb6, 0x00, 0xf0, 0xe1, 0xfa, 0x32, 0x00, - 0x29, 0x00, 0x20, 0x00, 0xff, 0xf7, 0xb4, 0xfd, 0x04, 0x00, 0x00, 0xf0, - 0xc1, 0xfa, 0x07, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, 0x00, 0xf0, - 0xd5, 0xf9, 0x62, 0xb6, 0x20, 0x00, 0x70, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x9c, 0x44, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x86, 0xb0, 0x0c, 0x00, 0x16, 0x00, - 0x1d, 0x00, 0x08, 0x22, 0xff, 0xf7, 0xb8, 0xfd, 0x00, 0x28, 0x29, 0xd0, - 0x00, 0x96, 0x01, 0x90, 0x01, 0x19, 0x02, 0x91, 0x03, 0x95, 0x0a, 0x9b, - 0x04, 0x93, 0x0b, 0x9b, 0x05, 0x93, 0x55, 0x22, 0xfa, 0xf7, 0xb2, 0xf8, - 0x72, 0xb6, 0x00, 0xf0, 0xa7, 0xfa, 0x68, 0x46, 0xfa, 0xf7, 0xd4, 0xf8, - 0x04, 0x00, 0x01, 0x22, 0x21, 0x23, 0xc2, 0x54, 0x00, 0x21, 0xfa, 0xf7, - 0xbd, 0xfa, 0x00, 0xf0, 0x83, 0xfa, 0x09, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x05, 0x48, 0x00, 0xf0, 0x97, 0xf9, 0x62, 0xb6, 0x20, 0x00, 0x00, 0xe0, - 0x00, 0x20, 0x06, 0xb0, 0x70, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0xc8, 0x44, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf8, 0xb5, 0x06, 0x00, 0x0f, 0x00, 0x24, 0x4b, 0x9d, 0x69, 0x72, 0xb6, - 0x00, 0xf0, 0x78, 0xfa, 0x6c, 0x6b, 0x34, 0x40, 0x2c, 0xd1, 0x00, 0x2f, - 0x10, 0xd1, 0x00, 0xf0, 0x59, 0xfa, 0x1e, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x1a, 0x48, 0x00, 0xf0, 0x6d, 0xf9, 0x62, 0xb6, 0x00, 0x20, 0x2c, 0xe0, - 0x6e, 0x62, 0x39, 0x00, 0x0a, 0x20, 0xfa, 0xf7, 0x15, 0xf9, 0x00, 0x28, - 0x10, 0xda, 0x00, 0xf0, 0x41, 0xfa, 0x12, 0x4b, 0x1a, 0x68, 0x9a, 0x42, - 0x07, 0xd0, 0x9b, 0x69, 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, - 0x0e, 0x48, 0x00, 0xf0, 0x55, 0xf9, 0x62, 0xb6, 0x00, 0x20, 0x14, 0xe0, - 0x6c, 0x6b, 0x34, 0x40, 0x6b, 0x6b, 0xa3, 0x43, 0x6b, 0x63, 0x00, 0xf0, - 0x2b, 0xfa, 0x07, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, 0x00, 0xf0, - 0x3f, 0xf9, 0x62, 0xb6, 0x20, 0x00, 0xf8, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x90, 0x44, 0x01, 0x08, 0x0b, 0x4b, 0x10, 0x22, 0x52, 0x42, 0x1a, 0x87, - 0x90, 0x32, 0x5a, 0x87, 0x1a, 0x00, 0x40, 0x32, 0xda, 0x63, 0x00, 0x23, - 0x09, 0xe0, 0x5a, 0x1c, 0x13, 0x01, 0x05, 0x49, 0xcb, 0x18, 0x28, 0x33, - 0x19, 0x7a, 0x07, 0x20, 0x81, 0x43, 0x19, 0x72, 0x13, 0x00, 0x7f, 0x2b, - 0xf3, 0xd9, 0x70, 0x47, 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xbf, 0xfd, 0xe7, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4b, 0x68, 0x43, 0x60, 0x8b, 0x68, 0x83, 0x60, 0xcb, 0x68, 0xc3, 0x60, - 0x0b, 0x69, 0x43, 0x61, 0x4b, 0x69, 0x03, 0x62, 0x8b, 0x69, 0x43, 0x62, - 0x0b, 0x68, 0x03, 0x60, 0x70, 0x47, 0xc0, 0x46, 0x10, 0xb5, 0x15, 0x4b, - 0x99, 0x6a, 0xbc, 0x20, 0xc0, 0x03, 0x01, 0x43, 0x99, 0x62, 0x9a, 0x6a, - 0x12, 0x49, 0x11, 0x40, 0x99, 0x62, 0x9a, 0x6a, 0x5a, 0x69, 0x02, 0x43, - 0x5a, 0x61, 0x5b, 0x69, 0x0f, 0x4c, 0x21, 0x00, 0x90, 0x20, 0xc0, 0x05, - 0xff, 0xf7, 0xda, 0xff, 0x21, 0x00, 0x1c, 0x31, 0x0c, 0x48, 0xff, 0xf7, - 0xd5, 0xff, 0x21, 0x00, 0x38, 0x31, 0x0b, 0x48, 0xff, 0xf7, 0xd0, 0xff, - 0x21, 0x00, 0x54, 0x31, 0x09, 0x48, 0xff, 0xf7, 0xcb, 0xff, 0x21, 0x00, - 0x70, 0x31, 0x08, 0x48, 0xff, 0xf7, 0xc6, 0xff, 0x10, 0xbd, 0xc0, 0x46, - 0x00, 0x10, 0x02, 0x40, 0xff, 0xff, 0xa1, 0xff, 0xc0, 0x45, 0x01, 0x08, - 0x00, 0x04, 0x00, 0x48, 0x00, 0x08, 0x00, 0x48, 0x00, 0x0c, 0x00, 0x48, - 0x00, 0x14, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x4a, 0x11, 0x68, 0xc0, 0x23, 0x0b, 0x43, - 0x13, 0x60, 0x70, 0x47, 0x00, 0x44, 0x00, 0x40, 0x70, 0xb5, 0x0c, 0x4c, - 0xe5, 0x6b, 0xfe, 0xf7, 0x03, 0xfe, 0x68, 0x60, 0xe2, 0x6b, 0xff, 0x23, - 0x11, 0x68, 0x0b, 0x40, 0x13, 0x60, 0xe3, 0x6b, 0x10, 0x33, 0xe3, 0x63, - 0x84, 0x22, 0x12, 0x01, 0x94, 0x46, 0x64, 0x44, 0xa3, 0x42, 0x03, 0xd3, - 0x02, 0x4b, 0x1a, 0x00, 0x40, 0x32, 0xda, 0x63, 0x70, 0xbd, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x0a, 0x4b, 0x1b, 0x8f, 0x5b, 0x07, 0x0f, 0xd4, 0x08, 0x49, - 0xcc, 0x6b, 0x23, 0x78, 0x07, 0x22, 0x93, 0x43, 0x04, 0x25, 0x2b, 0x43, - 0x23, 0x70, 0xcb, 0x6b, 0x1c, 0x78, 0x22, 0x40, 0x1a, 0x70, 0xcb, 0x6b, - 0x98, 0x60, 0xff, 0xf7, 0xcb, 0xff, 0x70, 0xbd, 0xe8, 0x19, 0x00, 0x20, - 0x03, 0x68, 0x03, 0xe0, 0x89, 0x1a, 0x00, 0x22, 0x9a, 0x60, 0x1b, 0x68, - 0x9a, 0x68, 0x91, 0x42, 0xf8, 0xd8, 0xc2, 0x68, 0x8a, 0x18, 0xc2, 0x60, - 0x83, 0x42, 0x02, 0xd0, 0x9a, 0x68, 0x51, 0x1a, 0x99, 0x60, 0x70, 0x47, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x0c, 0x4b, 0x1b, 0x8f, 0x9b, 0x07, 0x12, 0xd4, 0x72, 0xb6, - 0x09, 0x4b, 0xdc, 0x6b, 0x22, 0x78, 0x07, 0x21, 0x8a, 0x43, 0x03, 0x21, - 0x0a, 0x43, 0x22, 0x70, 0xd9, 0x6b, 0x0a, 0x78, 0x07, 0x24, 0x22, 0x40, - 0x0a, 0x70, 0xdb, 0x6b, 0x98, 0x60, 0xff, 0xf7, 0x99, 0xff, 0x62, 0xb6, - 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x4b, 0x1b, 0x8f, 0x9b, 0x07, - 0x12, 0xd4, 0x72, 0xb6, 0x09, 0x4b, 0xdc, 0x6b, 0x22, 0x78, 0x07, 0x21, - 0x8a, 0x43, 0x02, 0x21, 0x0a, 0x43, 0x22, 0x70, 0xd9, 0x6b, 0x0a, 0x78, - 0x07, 0x24, 0x22, 0x40, 0x0a, 0x70, 0xdb, 0x6b, 0x98, 0x60, 0xff, 0xf7, - 0x79, 0xff, 0x62, 0xb6, 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x0f, 0x4b, - 0x1b, 0x8f, 0xdb, 0x07, 0x18, 0xd4, 0x0d, 0x4b, 0xdc, 0x6b, 0x22, 0x78, - 0x07, 0x20, 0x82, 0x43, 0x01, 0x20, 0x02, 0x43, 0x22, 0x70, 0xdc, 0x6b, - 0x20, 0x22, 0x8a, 0x5c, 0xd0, 0x00, 0x22, 0x78, 0x07, 0x25, 0x2a, 0x40, - 0x02, 0x43, 0x22, 0x70, 0xda, 0x6b, 0x98, 0x69, 0x90, 0x60, 0xdb, 0x6b, - 0x4a, 0x6a, 0xda, 0x60, 0xff, 0xf7, 0x52, 0xff, 0x70, 0xbd, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, 0x72, 0xb6, 0xff, 0xf7, - 0x63, 0xff, 0x01, 0x4b, 0xdc, 0x62, 0xfe, 0xe7, 0xe8, 0x19, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x06, 0x4b, 0x1b, 0x6b, 0x00, 0x2b, 0x03, 0xd1, 0x04, 0x4b, - 0x5b, 0x6b, 0x00, 0x2b, 0x02, 0xdc, 0x03, 0x48, 0xff, 0xf7, 0xe4, 0xff, - 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0x80, 0x46, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0x06, 0x4b, 0x1b, 0x6b, 0x00, 0x2b, 0x03, 0xdb, 0x04, 0x4b, - 0x5b, 0x6b, 0x00, 0x2b, 0x02, 0xdc, 0x03, 0x48, 0xff, 0xf7, 0xcc, 0xff, - 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, 0x88, 0x46, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0xb5, 0xff, 0xf7, 0xe5, 0xff, 0xfa, 0xf7, 0x53, 0xf9, 0x10, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x72, 0xb6, 0x08, 0x4b, 0x1b, 0x6b, - 0x00, 0x2b, 0x03, 0xdd, 0x06, 0x4b, 0x5b, 0x6b, 0x00, 0x2b, 0x02, 0xd0, - 0x05, 0x48, 0xff, 0xf7, 0xab, 0xff, 0x03, 0x4a, 0x13, 0x6b, 0x01, 0x3b, - 0x13, 0x63, 0x62, 0xb6, 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0x90, 0x46, 0x01, 0x08, 0x10, 0xb5, 0x72, 0xb6, 0x08, 0x4b, 0x1b, 0x6b, - 0x00, 0x2b, 0x03, 0xdb, 0x06, 0x4b, 0x5b, 0x6b, 0x00, 0x2b, 0x02, 0xd0, - 0x05, 0x48, 0xff, 0xf7, 0x93, 0xff, 0x03, 0x4a, 0x13, 0x6b, 0x01, 0x33, - 0x13, 0x63, 0x62, 0xb6, 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0x98, 0x46, 0x01, 0x08, 0x10, 0xb5, 0x07, 0x4b, 0x1b, 0x6b, 0x00, 0x2b, - 0x03, 0xdd, 0x05, 0x4b, 0x5b, 0x6b, 0x00, 0x2b, 0x02, 0xdc, 0x04, 0x48, - 0xff, 0xf7, 0x7c, 0xff, 0x00, 0x22, 0x01, 0x4b, 0x5a, 0x63, 0x10, 0xbd, - 0xe8, 0x19, 0x00, 0x20, 0xa0, 0x46, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4b, 0x1b, 0x6b, 0x00, 0x2b, - 0x03, 0xdd, 0x05, 0x4b, 0x5b, 0x6b, 0x00, 0x2b, 0x02, 0xd0, 0x04, 0x48, - 0xff, 0xf7, 0x64, 0xff, 0x01, 0x22, 0x01, 0x4b, 0x5a, 0x63, 0x10, 0xbd, - 0xe8, 0x19, 0x00, 0x20, 0xa8, 0x46, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x00, 0x0b, 0x07, 0x01, 0xd4, - 0x00, 0x24, 0x00, 0xe0, 0x80, 0x24, 0xcb, 0x07, 0x01, 0xd5, 0x20, 0x23, - 0x1c, 0x43, 0x8b, 0x07, 0x01, 0xd5, 0x40, 0x23, 0x1c, 0x43, 0x4b, 0x07, - 0x02, 0xd5, 0x80, 0x23, 0x5b, 0x00, 0x1c, 0x43, 0x72, 0xb6, 0xff, 0xf7, - 0xd1, 0xff, 0x28, 0x1d, 0x21, 0x00, 0xf9, 0xf7, 0x0d, 0xfe, 0xff, 0xf7, - 0xb3, 0xff, 0x62, 0xb6, 0x70, 0xbd, 0xc0, 0x46, 0x10, 0xb5, 0x80, 0x21, - 0xc9, 0x05, 0x0a, 0x69, 0xcb, 0x68, 0xff, 0x20, 0x03, 0x40, 0x13, 0x40, - 0xda, 0x43, 0x0a, 0x61, 0x9b, 0x07, 0x07, 0xd5, 0x72, 0xb6, 0xff, 0xf7, - 0xb9, 0xff, 0xff, 0xf7, 0x67, 0xff, 0xff, 0xf7, 0x9d, 0xff, 0x62, 0xb6, - 0x10, 0xbd, 0xc0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4b, - 0x1b, 0x6b, 0x00, 0x2b, 0x03, 0xd1, 0x05, 0x4b, 0x5b, 0x6b, 0x00, 0x2b, - 0x02, 0xdc, 0x04, 0x48, 0xff, 0xf7, 0x14, 0xff, 0x00, 0x22, 0x01, 0x4b, - 0x5a, 0x63, 0x10, 0xbd, 0xe8, 0x19, 0x00, 0x20, 0xb0, 0x46, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4b, - 0x1b, 0x6b, 0x00, 0x2b, 0x03, 0xd1, 0x05, 0x4b, 0x5b, 0x6b, 0x00, 0x2b, - 0x02, 0xd0, 0x04, 0x48, 0xff, 0xf7, 0xfc, 0xfe, 0x01, 0x22, 0x01, 0x4b, - 0x5a, 0x63, 0x10, 0xbd, 0xe8, 0x19, 0x00, 0x20, 0xb8, 0x46, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xef, 0xf3, - 0x10, 0x84, 0xe3, 0x07, 0x0a, 0xd4, 0xef, 0xf3, 0x05, 0x83, 0xdb, 0x05, - 0x03, 0xd0, 0x72, 0xb6, 0xff, 0xf7, 0x74, 0xff, 0x02, 0xe0, 0x72, 0xb6, - 0xff, 0xf7, 0xd8, 0xff, 0x20, 0x00, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x06, 0x4b, - 0x1b, 0x6b, 0x00, 0x2b, 0x03, 0xd1, 0x04, 0x4b, 0x5b, 0x6b, 0x00, 0x2b, - 0x02, 0xd0, 0x03, 0x48, 0xff, 0xf7, 0xcc, 0xfe, 0x10, 0xbd, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0xc0, 0x46, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xc3, 0x07, - 0x18, 0xd4, 0xef, 0xf3, 0x05, 0x83, 0xdb, 0x05, 0x03, 0xd0, 0xff, 0xf7, - 0x2f, 0xff, 0x62, 0xb6, 0x10, 0xe0, 0xf9, 0xf7, 0x4b, 0xfe, 0xff, 0xf7, - 0x91, 0xff, 0x07, 0x4b, 0x1a, 0x68, 0x9a, 0x42, 0x07, 0xd0, 0x9b, 0x69, - 0x99, 0x68, 0x93, 0x68, 0x99, 0x42, 0x02, 0xd2, 0x03, 0x48, 0xff, 0xf7, - 0xa5, 0xfe, 0x62, 0xb6, 0x10, 0xbd, 0xc0, 0x46, 0xe8, 0x19, 0x00, 0x20, - 0x64, 0x46, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x00, 0x0c, 0x00, 0x45, 0x6d, - 0x09, 0x68, 0x80, 0x6d, 0xf7, 0xf7, 0xcc, 0xfa, 0x63, 0x68, 0x1b, 0x04, - 0x05, 0xd5, 0x07, 0x22, 0x03, 0x00, 0x93, 0x43, 0x5b, 0x00, 0x10, 0x40, - 0x18, 0x43, 0x19, 0x4b, 0x98, 0x42, 0x02, 0xd9, 0x18, 0x48, 0xff, 0xf7, - 0x81, 0xfe, 0xe8, 0x60, 0x40, 0x23, 0xa2, 0x68, 0x13, 0x43, 0x6b, 0x60, - 0x01, 0x23, 0xe2, 0x68, 0x13, 0x43, 0xab, 0x60, 0x2e, 0x23, 0xff, 0x33, - 0x62, 0x68, 0x13, 0x43, 0x2b, 0x60, 0x01, 0x23, 0x5b, 0x42, 0x2b, 0x62, - 0x63, 0x68, 0x5a, 0x05, 0x13, 0xd5, 0x0e, 0x4a, 0x13, 0x40, 0x04, 0xd0, - 0x80, 0x22, 0x52, 0x05, 0x93, 0x42, 0x04, 0xd0, 0x07, 0xe0, 0x7f, 0x22, - 0x5c, 0x23, 0xf2, 0x54, 0x0a, 0xe0, 0x3f, 0x22, 0x5c, 0x23, 0xf2, 0x54, - 0x06, 0xe0, 0xff, 0x22, 0x5c, 0x23, 0xf2, 0x54, 0x02, 0xe0, 0xff, 0x22, - 0x5c, 0x23, 0xf2, 0x54, 0x70, 0xbd, 0xc0, 0x46, 0xff, 0xff, 0x00, 0x00, - 0xdc, 0x46, 0x01, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xf9, 0xf7, - 0xcd, 0xff, 0xfa, 0xf7, 0x33, 0xf8, 0xff, 0xf7, 0x09, 0xfd, 0xff, 0xf7, - 0xa7, 0xfb, 0xff, 0xf7, 0x95, 0xfb, 0x0d, 0x4c, 0x00, 0x23, 0x23, 0x63, - 0x63, 0x63, 0x84, 0x23, 0x1b, 0x01, 0xe0, 0x18, 0x80, 0x22, 0x0a, 0x49, - 0xf9, 0xf7, 0x3a, 0xfd, 0xa0, 0x61, 0x09, 0x4b, 0xc3, 0x61, 0x01, 0x22, - 0x20, 0x23, 0xc2, 0x54, 0xff, 0xf7, 0x12, 0xfb, 0xff, 0xf7, 0x50, 0xff, - 0x62, 0xb6, 0x05, 0x48, 0xfa, 0xf7, 0x4c, 0xfa, 0x10, 0xbd, 0xc0, 0x46, - 0xe8, 0x19, 0x00, 0x20, 0xa8, 0x45, 0x01, 0x08, 0x00, 0x06, 0x00, 0x20, - 0x4c, 0x46, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xff, 0xf7, - 0x15, 0xfd, 0xfb, 0xf7, 0xd3, 0xff, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, - 0xf8, 0xb5, 0x06, 0x00, 0x45, 0x6d, 0x2f, 0x68, 0xec, 0x69, 0x2c, 0x62, - 0x23, 0x07, 0x02, 0xd0, 0x21, 0x00, 0xff, 0xf7, 0xad, 0xfe, 0xe3, 0x05, - 0x19, 0xd5, 0x72, 0xb6, 0xff, 0xf7, 0x90, 0xfe, 0x30, 0x1d, 0x80, 0x21, - 0x89, 0x00, 0xf9, 0xf7, 0xcb, 0xfc, 0xff, 0xf7, 0x71, 0xfe, 0x62, 0xb6, - 0x0d, 0xe0, 0x72, 0xb6, 0xff, 0xf7, 0x84, 0xfe, 0xa9, 0x8c, 0x5c, 0x23, - 0xf3, 0x5c, 0x19, 0x40, 0x30, 0x00, 0xfc, 0xf7, 0x3d, 0xfa, 0xff, 0xf7, - 0x63, 0xfe, 0x62, 0xb6, 0xec, 0x69, 0xa3, 0x06, 0xef, 0xd4, 0x3b, 0x06, - 0x1b, 0xd4, 0x1c, 0xe0, 0x72, 0xb6, 0xff, 0xf7, 0x71, 0xfe, 0x30, 0x00, - 0x30, 0x30, 0xfe, 0xf7, 0xbd, 0xfa, 0x00, 0x28, 0x0b, 0xda, 0x30, 0x1d, - 0x08, 0x21, 0xf9, 0xf7, 0xa7, 0xfc, 0x80, 0x23, 0x3a, 0x00, 0x9a, 0x43, - 0x2a, 0x60, 0xff, 0xf7, 0x49, 0xfe, 0x62, 0xb6, 0x07, 0xe0, 0x80, 0xb2, - 0x28, 0x85, 0xff, 0xf7, 0x43, 0xfe, 0x62, 0xb6, 0xec, 0x69, 0x23, 0x06, - 0xe2, 0xd4, 0x7b, 0x06, 0x1b, 0xd5, 0x63, 0x06, 0x19, 0xd5, 0x72, 0xb6, - 0xff, 0xf7, 0x50, 0xfe, 0x73, 0x6c, 0xb2, 0x6c, 0x93, 0x42, 0x03, 0xd1, - 0xb3, 0x6b, 0x00, 0x2b, 0x02, 0xd1, 0x02, 0xe0, 0x00, 0x23, 0x00, 0xe0, - 0x01, 0x23, 0x00, 0x2b, 0x06, 0xd0, 0x30, 0x1d, 0x10, 0x21, 0xf9, 0xf7, - 0x7f, 0xfc, 0x40, 0x23, 0x9f, 0x43, 0x2f, 0x60, 0xff, 0xf7, 0x22, 0xfe, - 0x62, 0xb6, 0xf8, 0xbd, 0x10, 0xb5, 0x00, 0x29, 0x00, 0xd1, 0x08, 0x49, - 0x03, 0x7a, 0x01, 0x2b, 0x09, 0xd1, 0x07, 0x4b, 0x98, 0x42, 0x06, 0xd1, - 0x06, 0x4b, 0xda, 0x69, 0x80, 0x24, 0xa4, 0x02, 0x22, 0x43, 0xda, 0x61, - 0xdb, 0x69, 0xff, 0xf7, 0xfd, 0xfe, 0x10, 0xbd, 0x70, 0x46, 0x01, 0x08, - 0x88, 0x19, 0x00, 0x20, 0x00, 0x10, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x82, 0xb0, - 0x0c, 0x4c, 0x20, 0x00, 0xfe, 0xf7, 0xc2, 0xf9, 0x20, 0x00, 0x0c, 0x30, - 0x00, 0x94, 0x00, 0x23, 0x10, 0x22, 0x09, 0x49, 0xfe, 0xf7, 0xba, 0xfa, - 0x20, 0x00, 0x30, 0x30, 0x00, 0x94, 0x07, 0x4b, 0x10, 0x22, 0x07, 0x49, - 0xfe, 0xf7, 0x7a, 0xfa, 0x06, 0x4b, 0x63, 0x65, 0x06, 0x4b, 0xa3, 0x65, - 0x02, 0xb0, 0x10, 0xbd, 0x88, 0x19, 0x00, 0x20, 0xf0, 0x23, 0x00, 0x20, - 0xf1, 0x2b, 0x01, 0x08, 0x00, 0x24, 0x00, 0x20, 0x00, 0x44, 0x00, 0x40, - 0x00, 0x6c, 0xdc, 0x02, 0x10, 0xb5, 0x0e, 0x4b, 0xd9, 0x69, 0x01, 0x22, - 0x11, 0x43, 0xd9, 0x61, 0xdb, 0x69, 0x0c, 0x49, 0x8b, 0x68, 0x13, 0x43, - 0x8b, 0x60, 0x80, 0x23, 0xdb, 0x05, 0x0a, 0x49, 0x99, 0x62, 0x01, 0x21, - 0x49, 0x42, 0xd9, 0x62, 0x00, 0x21, 0x99, 0x61, 0x59, 0x63, 0xd9, 0x60, - 0x59, 0x60, 0x5a, 0x61, 0x1a, 0x60, 0x02, 0x31, 0x0f, 0x20, 0xfc, 0xf7, - 0x13, 0xf8, 0x10, 0xbd, 0x00, 0x10, 0x02, 0x40, 0x00, 0x58, 0x01, 0x40, - 0xbf, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xb5, 0x75, 0x46, 0x08, 0x4c, 0x20, 0x00, 0xff, 0xf7, 0xea, 0xfc, - 0xff, 0xf7, 0x90, 0xfd, 0xff, 0xf7, 0xf6, 0xfd, 0xff, 0xf7, 0x74, 0xfd, - 0x20, 0x00, 0xff, 0xf7, 0xc1, 0xfc, 0x28, 0x00, 0xff, 0xf7, 0xee, 0xf9, - 0x70, 0xbd, 0xc0, 0x46, 0xd0, 0x46, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x5f, 0x46, 0x56, 0x46, 0x4d, 0x46, 0x44, 0x46, 0xf0, 0xb4, - 0x83, 0xb0, 0x03, 0x23, 0x1c, 0x00, 0x14, 0x40, 0x01, 0x94, 0x94, 0x08, - 0x01, 0x25, 0x25, 0x40, 0xd7, 0x08, 0x1f, 0x40, 0x56, 0x09, 0x1e, 0x40, - 0xd2, 0x09, 0x0c, 0x33, 0x13, 0x40, 0x9a, 0x46, 0x01, 0x9c, 0xa0, 0x46, - 0x00, 0x24, 0x43, 0x46, 0x00, 0x93, 0x33, 0x00, 0x2e, 0x00, 0x9c, 0x46, - 0xcb, 0x07, 0x4a, 0xd5, 0x07, 0x22, 0x22, 0x40, 0x92, 0x00, 0x53, 0x46, - 0x93, 0x40, 0x99, 0x46, 0x01, 0x23, 0xa3, 0x40, 0x98, 0x46, 0x63, 0x00, - 0x03, 0x25, 0x9d, 0x40, 0x2b, 0x00, 0x0f, 0x25, 0x95, 0x40, 0xab, 0x46, - 0x42, 0x68, 0x45, 0x46, 0xaa, 0x43, 0x32, 0x43, 0x42, 0x60, 0x82, 0x68, - 0xdb, 0x43, 0x1a, 0x40, 0x3a, 0x43, 0x82, 0x60, 0xc2, 0x68, 0x1a, 0x40, - 0x65, 0x46, 0x2a, 0x43, 0xc2, 0x60, 0x01, 0x9a, 0x02, 0x2a, 0x14, 0xd1, - 0x07, 0x2c, 0x06, 0xd8, 0x02, 0x6a, 0x5d, 0x46, 0xaa, 0x43, 0x4d, 0x46, - 0x15, 0x43, 0x05, 0x62, 0x05, 0xe0, 0x42, 0x6a, 0x5d, 0x46, 0xaa, 0x43, - 0x4d, 0x46, 0x15, 0x43, 0x45, 0x62, 0x02, 0x68, 0x13, 0x40, 0x00, 0x9a, - 0x13, 0x43, 0x03, 0x60, 0x13, 0xe0, 0x02, 0x68, 0x13, 0x40, 0x00, 0x9a, - 0x13, 0x43, 0x03, 0x60, 0x07, 0x2c, 0x06, 0xd8, 0x03, 0x6a, 0x5a, 0x46, - 0x93, 0x43, 0x4a, 0x46, 0x1a, 0x43, 0x02, 0x62, 0x05, 0xe0, 0x43, 0x6a, - 0x5a, 0x46, 0x93, 0x43, 0x4a, 0x46, 0x1a, 0x43, 0x42, 0x62, 0x49, 0x08, - 0x09, 0xd0, 0x76, 0x00, 0xbf, 0x00, 0x63, 0x46, 0x9b, 0x00, 0x9c, 0x46, - 0x00, 0x9b, 0x9b, 0x00, 0x00, 0x93, 0x01, 0x34, 0xa6, 0xe7, 0x03, 0xb0, - 0x3c, 0xbc, 0x90, 0x46, 0x99, 0x46, 0xa2, 0x46, 0xab, 0x46, 0xf0, 0xbd, - 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x43, 0x7c, 0x02, 0x68, 0x11, 0x68, - 0x04, 0x7c, 0xe1, 0x40, 0x0e, 0x25, 0x29, 0x40, 0x40, 0x68, 0x00, 0x68, - 0x08, 0x42, 0x0d, 0xd0, 0x08, 0x00, 0xa0, 0x40, 0x50, 0x60, 0x5a, 0x1c, - 0xd2, 0x00, 0x05, 0x48, 0x12, 0x58, 0x00, 0x2a, 0x04, 0xd0, 0x01, 0x33, - 0xdb, 0x00, 0xc3, 0x18, 0x58, 0x68, 0x90, 0x47, 0x70, 0xbd, 0xc0, 0x46, - 0xe8, 0x24, 0x00, 0x20, 0x70, 0xb5, 0x0f, 0x2a, 0x32, 0xd9, 0x0c, 0x00, - 0x04, 0x43, 0x0b, 0x00, 0xa4, 0x07, 0x31, 0xd1, 0x15, 0x00, 0x04, 0x00, - 0x10, 0x3d, 0x2d, 0x09, 0x01, 0x35, 0x2d, 0x01, 0x49, 0x19, 0x1e, 0x68, - 0x26, 0x60, 0x5e, 0x68, 0x66, 0x60, 0x9e, 0x68, 0xa6, 0x60, 0xde, 0x68, - 0x10, 0x33, 0xe6, 0x60, 0x10, 0x34, 0x99, 0x42, 0xf3, 0xd1, 0x0f, 0x23, - 0x45, 0x19, 0x13, 0x40, 0x03, 0x2b, 0x1b, 0xd9, 0x1c, 0x1f, 0x00, 0x23, - 0xa4, 0x08, 0x01, 0x34, 0xa4, 0x00, 0xce, 0x58, 0xee, 0x50, 0x04, 0x33, - 0x9c, 0x42, 0xfa, 0xd1, 0x03, 0x23, 0x2d, 0x19, 0x09, 0x19, 0x1a, 0x40, - 0x05, 0xd0, 0x00, 0x23, 0xcc, 0x5c, 0xec, 0x54, 0x01, 0x33, 0x9a, 0x42, - 0xfa, 0xd1, 0x70, 0xbd, 0x05, 0x00, 0x00, 0x2a, 0xf5, 0xd1, 0xfa, 0xe7, - 0x05, 0x00, 0xf2, 0xe7, 0x1a, 0x00, 0xf8, 0xe7, 0x70, 0xb5, 0x88, 0x42, - 0x0b, 0xd9, 0x8b, 0x18, 0x98, 0x42, 0x08, 0xd2, 0x99, 0x1a, 0x53, 0x1e, - 0x00, 0x2a, 0x03, 0xd0, 0xca, 0x5c, 0xc2, 0x54, 0x01, 0x3b, 0xfb, 0xd2, - 0x70, 0xbd, 0x0f, 0x2a, 0x09, 0xd8, 0x05, 0x00, 0x00, 0x2a, 0xf9, 0xd0, - 0x00, 0x23, 0xcc, 0x5c, 0xec, 0x54, 0x01, 0x33, 0x9a, 0x42, 0xfa, 0xd1, - 0xf2, 0xe7, 0x0c, 0x00, 0x04, 0x43, 0x0b, 0x00, 0xa4, 0x07, 0x26, 0xd1, - 0x15, 0x00, 0x04, 0x00, 0x10, 0x3d, 0x2d, 0x09, 0x01, 0x35, 0x2d, 0x01, - 0x49, 0x19, 0x1e, 0x68, 0x26, 0x60, 0x5e, 0x68, 0x66, 0x60, 0x9e, 0x68, - 0xa6, 0x60, 0xde, 0x68, 0x10, 0x33, 0xe6, 0x60, 0x10, 0x34, 0x99, 0x42, - 0xf3, 0xd1, 0x0f, 0x24, 0x45, 0x19, 0x14, 0x40, 0x03, 0x2c, 0x10, 0xd9, - 0x00, 0x23, 0x04, 0x3c, 0xa4, 0x08, 0x01, 0x34, 0xa4, 0x00, 0xce, 0x58, - 0xee, 0x50, 0x04, 0x33, 0x9c, 0x42, 0xfa, 0xd1, 0x03, 0x23, 0x2d, 0x19, - 0x09, 0x19, 0x1a, 0x40, 0xca, 0xe7, 0x05, 0x00, 0xca, 0xe7, 0x22, 0x00, - 0xc6, 0xe7, 0xc0, 0x46, 0x70, 0xb5, 0x83, 0x07, 0x3f, 0xd0, 0x54, 0x1e, - 0x00, 0x2a, 0x3b, 0xd0, 0xce, 0xb2, 0x03, 0x00, 0x03, 0x25, 0x03, 0xe0, - 0x62, 0x1e, 0x00, 0x2c, 0x34, 0xd0, 0x14, 0x00, 0x01, 0x33, 0x5a, 0x1e, - 0x16, 0x70, 0x2b, 0x42, 0xf6, 0xd1, 0x03, 0x2c, 0x24, 0xd9, 0xff, 0x25, - 0x0d, 0x40, 0x2a, 0x02, 0x15, 0x43, 0x2a, 0x04, 0x15, 0x43, 0x0f, 0x2c, - 0x11, 0xd9, 0x26, 0x00, 0x10, 0x3e, 0x36, 0x09, 0x01, 0x36, 0x36, 0x01, - 0x1a, 0x00, 0x9b, 0x19, 0x15, 0x60, 0x55, 0x60, 0x95, 0x60, 0xd5, 0x60, - 0x10, 0x32, 0x93, 0x42, 0xf8, 0xd1, 0x0f, 0x22, 0x14, 0x40, 0x03, 0x2c, - 0x0a, 0xd9, 0x26, 0x1f, 0xb6, 0x08, 0x01, 0x36, 0xb6, 0x00, 0x1a, 0x00, - 0x9b, 0x19, 0x20, 0xc2, 0x93, 0x42, 0xfc, 0xd1, 0x03, 0x22, 0x14, 0x40, - 0x00, 0x2c, 0x05, 0xd0, 0xc9, 0xb2, 0x1c, 0x19, 0x19, 0x70, 0x01, 0x33, - 0x9c, 0x42, 0xfb, 0xd1, 0x70, 0xbd, 0x14, 0x00, 0x03, 0x00, 0xcc, 0xe7, - 0x63, 0x68, 0x53, 0x79, 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, - 0x3a, 0xd0, 0x00, 0x08, 0x62, 0xd0, 0x00, 0x08, 0x62, 0xd0, 0x00, 0x08, - 0x42, 0xd0, 0x00, 0x08, 0x56, 0xd0, 0x00, 0x08, 0x4a, 0xd0, 0x00, 0x08, - 0x62, 0xd0, 0x00, 0x08, 0x56, 0xd0, 0x00, 0x08, 0x63, 0x68, 0x54, 0x68, - 0x64, 0x45, 0x78, 0x69, 0x74, 0x53, 0x00, 0x00, 0x63, 0x68, 0x56, 0x54, - 0x44, 0x6f, 0x53, 0x65, 0x74, 0x49, 0x00, 0x00, 0x63, 0x68, 0x4d, 0x74, - 0x78, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x63, 0x68, 0x54, 0x68, - 0x64, 0x57, 0x61, 0x69, 0x74, 0x00, 0x00, 0x00, 0x63, 0x68, 0x54, 0x68, - 0x64, 0x53, 0x65, 0x74, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x00, 0x00, 0x00, 0x00, 0x63, 0x68, 0x52, 0x65, 0x67, 0x4e, 0x65, 0x78, - 0x74, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x63, 0x68, 0x53, 0x79, - 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x63, 0x68, 0x53, 0x79, - 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x00, 0x00, - 0x63, 0x68, 0x53, 0x79, 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, - 0x63, 0x68, 0x54, 0x68, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x49, - 0x00, 0x00, 0x00, 0x00, 0x63, 0x68, 0x54, 0x68, 0x64, 0x53, 0x6c, 0x65, - 0x65, 0x70, 0x53, 0x00, 0x63, 0x68, 0x54, 0x68, 0x64, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x49, 0x00, 0x00, 0x00, 0x63, 0x68, 0x53, 0x63, 0x68, 0x52, 0x65, 0x61, - 0x64, 0x79, 0x49, 0x00, 0x63, 0x68, 0x53, 0x63, 0x68, 0x52, 0x65, 0x61, - 0x64, 0x79, 0x41, 0x68, 0x65, 0x61, 0x64, 0x49, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x68, 0x54, 0x68, 0x64, 0x44, 0x6f, 0x44, 0x65, 0x71, 0x75, 0x65, - 0x75, 0x65, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x00, 0x63, 0x68, 0x45, 0x76, - 0x74, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x46, 0x6c, - 0x61, 0x67, 0x73, 0x49, 0x00, 0x00, 0x00, 0x00, 0x63, 0x68, 0x54, 0x68, - 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x63, 0x68, 0x53, 0x63, - 0x68, 0x57, 0x61, 0x6b, 0x65, 0x75, 0x70, 0x53, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x68, 0x4d, 0x74, 0x78, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x6e, 0x69, 0x74, 0x00, 0x63, 0x68, 0x45, 0x76, 0x74, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x6c, 0x00, 0x63, 0x68, 0x56, 0x54, 0x44, 0x6f, 0x52, 0x65, - 0x73, 0x65, 0x74, 0x49, 0x00, 0x00, 0x00, 0x00, 0x63, 0x68, 0x54, 0x68, - 0x64, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x68, 0x4d, 0x74, 0x78, 0x4c, 0x6f, 0x63, 0x6b, 0x53, 0x00, 0x00, - 0x63, 0x68, 0x56, 0x54, 0x44, 0x6f, 0x54, 0x69, 0x63, 0x6b, 0x49, 0x00, - 0x72, 0x65, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x00, 0x00, - 0x00, 0x00, 0x21, 0x10, 0x42, 0x20, 0x63, 0x30, 0x84, 0x40, 0xa5, 0x50, - 0xc6, 0x60, 0xe7, 0x70, 0x08, 0x81, 0x29, 0x91, 0x4a, 0xa1, 0x6b, 0xb1, - 0x8c, 0xc1, 0xad, 0xd1, 0xce, 0xe1, 0xef, 0xf1, 0x31, 0x12, 0x10, 0x02, - 0x73, 0x32, 0x52, 0x22, 0xb5, 0x52, 0x94, 0x42, 0xf7, 0x72, 0xd6, 0x62, - 0x39, 0x93, 0x18, 0x83, 0x7b, 0xb3, 0x5a, 0xa3, 0xbd, 0xd3, 0x9c, 0xc3, - 0xff, 0xf3, 0xde, 0xe3, 0x62, 0x24, 0x43, 0x34, 0x20, 0x04, 0x01, 0x14, - 0xe6, 0x64, 0xc7, 0x74, 0xa4, 0x44, 0x85, 0x54, 0x6a, 0xa5, 0x4b, 0xb5, - 0x28, 0x85, 0x09, 0x95, 0xee, 0xe5, 0xcf, 0xf5, 0xac, 0xc5, 0x8d, 0xd5, - 0x53, 0x36, 0x72, 0x26, 0x11, 0x16, 0x30, 0x06, 0xd7, 0x76, 0xf6, 0x66, - 0x95, 0x56, 0xb4, 0x46, 0x5b, 0xb7, 0x7a, 0xa7, 0x19, 0x97, 0x38, 0x87, - 0xdf, 0xf7, 0xfe, 0xe7, 0x9d, 0xd7, 0xbc, 0xc7, 0xc4, 0x48, 0xe5, 0x58, - 0x86, 0x68, 0xa7, 0x78, 0x40, 0x08, 0x61, 0x18, 0x02, 0x28, 0x23, 0x38, - 0xcc, 0xc9, 0xed, 0xd9, 0x8e, 0xe9, 0xaf, 0xf9, 0x48, 0x89, 0x69, 0x99, - 0x0a, 0xa9, 0x2b, 0xb9, 0xf5, 0x5a, 0xd4, 0x4a, 0xb7, 0x7a, 0x96, 0x6a, - 0x71, 0x1a, 0x50, 0x0a, 0x33, 0x3a, 0x12, 0x2a, 0xfd, 0xdb, 0xdc, 0xcb, - 0xbf, 0xfb, 0x9e, 0xeb, 0x79, 0x9b, 0x58, 0x8b, 0x3b, 0xbb, 0x1a, 0xab, - 0xa6, 0x6c, 0x87, 0x7c, 0xe4, 0x4c, 0xc5, 0x5c, 0x22, 0x2c, 0x03, 0x3c, - 0x60, 0x0c, 0x41, 0x1c, 0xae, 0xed, 0x8f, 0xfd, 0xec, 0xcd, 0xcd, 0xdd, - 0x2a, 0xad, 0x0b, 0xbd, 0x68, 0x8d, 0x49, 0x9d, 0x97, 0x7e, 0xb6, 0x6e, - 0xd5, 0x5e, 0xf4, 0x4e, 0x13, 0x3e, 0x32, 0x2e, 0x51, 0x1e, 0x70, 0x0e, - 0x9f, 0xff, 0xbe, 0xef, 0xdd, 0xdf, 0xfc, 0xcf, 0x1b, 0xbf, 0x3a, 0xaf, - 0x59, 0x9f, 0x78, 0x8f, 0x88, 0x91, 0xa9, 0x81, 0xca, 0xb1, 0xeb, 0xa1, - 0x0c, 0xd1, 0x2d, 0xc1, 0x4e, 0xf1, 0x6f, 0xe1, 0x80, 0x10, 0xa1, 0x00, - 0xc2, 0x30, 0xe3, 0x20, 0x04, 0x50, 0x25, 0x40, 0x46, 0x70, 0x67, 0x60, - 0xb9, 0x83, 0x98, 0x93, 0xfb, 0xa3, 0xda, 0xb3, 0x3d, 0xc3, 0x1c, 0xd3, - 0x7f, 0xe3, 0x5e, 0xf3, 0xb1, 0x02, 0x90, 0x12, 0xf3, 0x22, 0xd2, 0x32, - 0x35, 0x42, 0x14, 0x52, 0x77, 0x62, 0x56, 0x72, 0xea, 0xb5, 0xcb, 0xa5, - 0xa8, 0x95, 0x89, 0x85, 0x6e, 0xf5, 0x4f, 0xe5, 0x2c, 0xd5, 0x0d, 0xc5, - 0xe2, 0x34, 0xc3, 0x24, 0xa0, 0x14, 0x81, 0x04, 0x66, 0x74, 0x47, 0x64, - 0x24, 0x54, 0x05, 0x44, 0xdb, 0xa7, 0xfa, 0xb7, 0x99, 0x87, 0xb8, 0x97, - 0x5f, 0xe7, 0x7e, 0xf7, 0x1d, 0xc7, 0x3c, 0xd7, 0xd3, 0x26, 0xf2, 0x36, - 0x91, 0x06, 0xb0, 0x16, 0x57, 0x66, 0x76, 0x76, 0x15, 0x46, 0x34, 0x56, - 0x4c, 0xd9, 0x6d, 0xc9, 0x0e, 0xf9, 0x2f, 0xe9, 0xc8, 0x99, 0xe9, 0x89, - 0x8a, 0xb9, 0xab, 0xa9, 0x44, 0x58, 0x65, 0x48, 0x06, 0x78, 0x27, 0x68, - 0xc0, 0x18, 0xe1, 0x08, 0x82, 0x38, 0xa3, 0x28, 0x7d, 0xcb, 0x5c, 0xdb, - 0x3f, 0xeb, 0x1e, 0xfb, 0xf9, 0x8b, 0xd8, 0x9b, 0xbb, 0xab, 0x9a, 0xbb, - 0x75, 0x4a, 0x54, 0x5a, 0x37, 0x6a, 0x16, 0x7a, 0xf1, 0x0a, 0xd0, 0x1a, - 0xb3, 0x2a, 0x92, 0x3a, 0x2e, 0xfd, 0x0f, 0xed, 0x6c, 0xdd, 0x4d, 0xcd, - 0xaa, 0xbd, 0x8b, 0xad, 0xe8, 0x9d, 0xc9, 0x8d, 0x26, 0x7c, 0x07, 0x6c, - 0x64, 0x5c, 0x45, 0x4c, 0xa2, 0x3c, 0x83, 0x2c, 0xe0, 0x1c, 0xc1, 0x0c, - 0x1f, 0xef, 0x3e, 0xff, 0x5d, 0xcf, 0x7c, 0xdf, 0x9b, 0xaf, 0xba, 0xbf, - 0xd9, 0x8f, 0xf8, 0x9f, 0x17, 0x6e, 0x36, 0x7e, 0x55, 0x4e, 0x74, 0x5e, - 0x93, 0x2e, 0xb2, 0x3e, 0xd1, 0x0e, 0xf0, 0x1e, 0x3c, 0x09, 0x00, 0x20, - 0x05, 0x00, 0x01, 0x00, 0x40, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x44, 0x09, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, 0x0c, 0x09, 0x00, 0x20, - 0x05, 0x00, 0x01, 0x00, 0x10, 0x09, 0x00, 0x20, 0x85, 0x00, 0x04, 0x00, - 0x14, 0x09, 0x00, 0x20, 0x85, 0x00, 0x04, 0x00, 0x63, 0x68, 0x53, 0x79, - 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x48, 0x09, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0x4c, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x50, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x54, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x58, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x5c, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x60, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x64, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x68, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x90, 0x09, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0x94, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x98, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x9c, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0xa0, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0xa4, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0xa8, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0xac, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0xb0, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x85, 0x00, 0x04, 0x00, 0xac, 0x08, 0x00, 0x20, 0x01, 0x10, 0x00, 0x00, - 0x26, 0x00, 0x01, 0x00, 0x44, 0x08, 0x00, 0x20, 0x02, 0x10, 0x00, 0x00, - 0xa6, 0x00, 0x04, 0x00, 0x48, 0x08, 0x00, 0x20, 0x03, 0x10, 0x08, 0x00, - 0x86, 0x00, 0x04, 0x00, 0x4c, 0x08, 0x00, 0x20, 0x05, 0x10, 0x00, 0x00, - 0x8d, 0x00, 0x04, 0x00, 0xb0, 0x08, 0x00, 0x20, 0x06, 0x10, 0x00, 0x00, - 0x8d, 0x00, 0x04, 0x00, 0xb4, 0x08, 0x00, 0x20, 0x07, 0x10, 0x00, 0x00, - 0x8d, 0x00, 0x04, 0x00, 0xb8, 0x08, 0x00, 0x20, 0x08, 0x10, 0x00, 0x00, - 0x05, 0x00, 0x10, 0x00, 0xbc, 0x08, 0x00, 0x20, 0x09, 0x10, 0x00, 0x00, - 0x05, 0x00, 0x03, 0x00, 0xcc, 0x08, 0x00, 0x20, 0x0a, 0x10, 0x00, 0x00, - 0x05, 0x00, 0x05, 0x00, 0xcf, 0x08, 0x00, 0x20, 0x10, 0x10, 0x01, 0x00, - 0x8e, 0x00, 0x04, 0x00, 0x6c, 0x08, 0x00, 0x20, 0x11, 0x10, 0x01, 0x00, - 0x8e, 0x00, 0x04, 0x00, 0x70, 0x08, 0x00, 0x20, 0x14, 0x10, 0x00, 0x00, - 0x85, 0x00, 0x04, 0x00, 0xd4, 0x08, 0x00, 0x20, 0x15, 0x10, 0x00, 0x00, - 0x8d, 0x00, 0x02, 0x00, 0xd8, 0x08, 0x00, 0x20, 0x16, 0x10, 0x04, 0x00, - 0x8d, 0x00, 0x04, 0x00, 0xdc, 0x08, 0x00, 0x20, 0x17, 0x10, 0x00, 0x00, - 0x8d, 0x00, 0x02, 0x00, 0xec, 0x08, 0x00, 0x20, 0x18, 0x10, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x58, 0x3f, 0x01, 0x08, 0x19, 0x10, 0x00, 0x00, - 0x0d, 0x00, 0x01, 0x00, 0x04, 0x09, 0x00, 0x20, 0x29, 0x10, 0x06, 0x00, - 0x0d, 0x00, 0x01, 0x00, 0x05, 0x09, 0x00, 0x20, 0x00, 0x12, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd4, 0x39, 0x01, 0x08, 0x00, 0x14, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xcc, 0x3d, 0x01, 0x08, 0x01, 0x14, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x3d, 0x01, 0x08, 0x02, 0x14, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x3f, 0x01, 0x08, 0x03, 0x14, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xbc, 0x39, 0x01, 0x08, 0x00, 0x16, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0x39, 0x01, 0x08, 0x01, 0x16, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x3e, 0x01, 0x08, 0x02, 0x16, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x3a, 0x01, 0x08, 0x03, 0x16, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x01, 0x08, 0x00, 0x18, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x3c, 0x01, 0x08, 0x01, 0x18, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x08, 0x02, 0x18, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x3d, 0x01, 0x08, 0x03, 0x18, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x3d, 0x01, 0x08, 0x00, 0x1a, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe4, 0x3d, 0x01, 0x08, 0x01, 0x1a, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x3e, 0x01, 0x08, 0x02, 0x1a, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x3f, 0x01, 0x08, 0x03, 0x1a, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x3e, 0x01, 0x08, 0x80, 0x1f, 0x00, 0x00, - 0x8d, 0x00, 0x04, 0x00, 0xb8, 0x0a, 0x00, 0x20, 0x10, 0x20, 0x00, 0x00, - 0xbe, 0x00, 0x08, 0x00, 0x78, 0x08, 0x00, 0x20, 0x11, 0x20, 0x00, 0x00, - 0xbe, 0x00, 0x08, 0x00, 0x80, 0x08, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, - 0x26, 0x00, 0x0a, 0x00, 0x88, 0x08, 0x00, 0x20, 0x01, 0x21, 0x00, 0x00, - 0x0d, 0x00, 0x01, 0x00, 0xbc, 0x0a, 0x00, 0x20, 0x02, 0x21, 0x00, 0x00, - 0x8d, 0x00, 0x02, 0x00, 0xbe, 0x0a, 0x00, 0x20, 0x03, 0x21, 0x00, 0x00, - 0x8e, 0x00, 0x02, 0x00, 0x92, 0x08, 0x00, 0x20, 0x04, 0x21, 0x00, 0x00, - 0x86, 0x00, 0x02, 0x00, 0x94, 0x08, 0x00, 0x20, 0x06, 0x21, 0x03, 0x00, - 0x85, 0x00, 0x02, 0x00, 0xc0, 0x0a, 0x00, 0x20, 0x07, 0x21, 0x03, 0x00, - 0xa6, 0x00, 0x02, 0x00, 0x96, 0x08, 0x00, 0x20, 0x08, 0x21, 0x01, 0x00, - 0xa6, 0x00, 0x02, 0x00, 0x9c, 0x08, 0x00, 0x20, 0x09, 0x21, 0x01, 0x00, - 0xa6, 0x00, 0x02, 0x00, 0x9e, 0x08, 0x00, 0x20, 0xd8, 0x09, 0x00, 0x20, - 0x05, 0x00, 0x01, 0x00, 0xdc, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0xe0, 0x09, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, 0xe2, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x02, 0x00, 0xe4, 0x09, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0xe6, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x02, 0x00, 0xe8, 0x09, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0xec, 0x09, 0x00, 0x20, 0x05, 0x00, 0x01, 0x00, - 0xf0, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0xf4, 0x09, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0xf6, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x02, 0x00, - 0xf8, 0x09, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, 0xfa, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x02, 0x00, 0xfc, 0x09, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0x00, 0x0a, 0x00, 0x20, 0x05, 0x00, 0x01, 0x00, 0x04, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x08, 0x0a, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0x0a, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x02, 0x00, 0x0c, 0x0a, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0x0e, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x02, 0x00, - 0x10, 0x0a, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, 0x14, 0x0a, 0x00, 0x20, - 0x05, 0x00, 0x01, 0x00, 0x18, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x1c, 0x0a, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, 0x1e, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x02, 0x00, 0x20, 0x0a, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0x22, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x02, 0x00, 0x24, 0x0a, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0x24, 0x09, 0x00, 0x20, 0x05, 0x00, 0x01, 0x00, - 0x28, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x2c, 0x09, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x65, 0x76, - 0x72, 0x65, 0x67, 0x00, 0x18, 0x09, 0x00, 0x20, 0x05, 0x00, 0x01, 0x00, - 0x1c, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x20, 0x09, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0x28, 0x0a, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0x2c, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x30, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x34, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x38, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x3c, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x40, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x44, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x48, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x72, 0x65, 0x67, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x00, 0x00, 0x00, 0x94, 0x0a, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0x98, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x9c, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0xa0, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0xa4, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0xa8, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0xac, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0xb0, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0xb4, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x4c, 0x0a, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0x50, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x54, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x58, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x5c, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x60, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x64, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x68, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x6c, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x6c, 0x09, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0x70, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x74, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x78, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x7c, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x80, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x84, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x88, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x8c, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x70, 0x0a, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, - 0x74, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x78, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x7c, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x80, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x84, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0x88, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x8c, 0x0a, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x90, 0x0a, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0xf0, 0x08, 0x00, 0x20, 0x05, 0x00, 0x01, 0x00, - 0xf4, 0x08, 0x00, 0x20, 0x85, 0x00, 0x04, 0x00, 0xf8, 0x08, 0x00, 0x20, - 0x85, 0x00, 0x04, 0x00, 0xfc, 0x08, 0x00, 0x20, 0x85, 0x00, 0x04, 0x00, - 0x00, 0x09, 0x00, 0x20, 0x85, 0x00, 0x04, 0x00, 0xb4, 0x09, 0x00, 0x20, - 0x0d, 0x00, 0x01, 0x00, 0xb8, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0xbc, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0xc0, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0xc4, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0xc8, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0xcc, 0x09, 0x00, 0x20, - 0x8d, 0x00, 0x04, 0x00, 0xd0, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0xd4, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, 0x30, 0x09, 0x00, 0x20, - 0x05, 0x00, 0x01, 0x00, 0x34, 0x09, 0x00, 0x20, 0x8d, 0x00, 0x04, 0x00, - 0x38, 0x09, 0x00, 0x20, 0x0d, 0x00, 0x01, 0x00, 0x64, 0x6d, 0x61, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x49, 0x00, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x43, 0x00, 0x00, 0x00, 0x00, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x61, 0x6e, 0x53, 0x54, 0x4d, 0x33, 0x32, 0x53, 0x65, 0x74, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x00, 0x00, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x36, 0x43, 0x00, 0x00, 0x00, 0x00, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x36, 0x34, 0x00, 0x00, 0x00, 0x00, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x36, 0x38, 0x00, 0x00, 0x00, 0x00, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x42, 0x30, 0x00, 0x00, 0x00, 0x00, 0x73, 0x64, 0x49, 0x6e, - 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x49, 0x00, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x37, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x40, 0x08, 0x00, 0x02, 0x40, 0x01, 0x00, 0x00, 0x00, - 0xa8, 0x00, 0x02, 0x40, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x40, - 0x1c, 0x00, 0x02, 0x40, 0x86, 0x01, 0x00, 0x00, 0xa8, 0x00, 0x02, 0x40, - 0x04, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x40, 0x30, 0x00, 0x02, 0x40, - 0x86, 0x01, 0x00, 0x00, 0xa8, 0x00, 0x02, 0x40, 0x08, 0x02, 0x0a, 0x00, - 0x00, 0x00, 0x02, 0x40, 0x44, 0x00, 0x02, 0x40, 0x78, 0x0e, 0x00, 0x00, - 0xa8, 0x00, 0x02, 0x40, 0x0c, 0x03, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x40, - 0x58, 0x00, 0x02, 0x40, 0x78, 0x0e, 0x00, 0x00, 0xa8, 0x00, 0x02, 0x40, - 0x10, 0x04, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x40, 0x6c, 0x00, 0x02, 0x40, - 0x78, 0x0e, 0x00, 0x00, 0xa8, 0x00, 0x02, 0x40, 0x14, 0x05, 0x0b, 0x00, - 0x00, 0x00, 0x02, 0x40, 0x80, 0x00, 0x02, 0x40, 0x78, 0x0e, 0x00, 0x00, - 0xa8, 0x00, 0x02, 0x40, 0x18, 0x06, 0x0b, 0x00, 0x00, 0x04, 0x02, 0x40, - 0x08, 0x04, 0x02, 0x40, 0x86, 0x01, 0x00, 0x00, 0xa8, 0x04, 0x02, 0x40, - 0x00, 0x07, 0x0a, 0x00, 0x00, 0x04, 0x02, 0x40, 0x1c, 0x04, 0x02, 0x40, - 0x86, 0x01, 0x00, 0x00, 0xa8, 0x04, 0x02, 0x40, 0x04, 0x08, 0x0a, 0x00, - 0x00, 0x04, 0x02, 0x40, 0x30, 0x04, 0x02, 0x40, 0x78, 0x0e, 0x00, 0x00, - 0xa8, 0x04, 0x02, 0x40, 0x08, 0x09, 0x0b, 0x00, 0x00, 0x04, 0x02, 0x40, - 0x44, 0x04, 0x02, 0x40, 0x78, 0x0e, 0x00, 0x00, 0xa8, 0x04, 0x02, 0x40, - 0x0c, 0x0a, 0x0b, 0x00, 0x00, 0x04, 0x02, 0x40, 0x58, 0x04, 0x02, 0x40, - 0x78, 0x0e, 0x00, 0x00, 0xa8, 0x04, 0x02, 0x40, 0x10, 0x0b, 0x0b, 0x00, - 0x61, 0x64, 0x63, 0x5f, 0x6c, 0x6c, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x00, 0x00, 0x00, 0x61, 0x64, 0x63, 0x5f, 0x6c, 0x6c, 0x64, 0x5f, - 0x76, 0x72, 0x65, 0x67, 0x5f, 0x6f, 0x6e, 0x00, 0x3c, 0x01, 0x01, 0x08, - 0x22, 0x01, 0x01, 0x08, 0x08, 0x01, 0x01, 0x08, 0xf0, 0x00, 0x01, 0x08, - 0xd6, 0x00, 0x01, 0x08, 0xbe, 0x00, 0x01, 0x08, 0xa4, 0x00, 0x01, 0x08, - 0x8c, 0x00, 0x01, 0x08, 0x70, 0x00, 0x01, 0x08, 0x61, 0x64, 0x63, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x42, 0x75, 0x73, 0x00, 0x00, 0x00, - 0x5f, 0x63, 0x74, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x72, 0x65, 0x73, - 0x61, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x32, 0x00, 0x00, 0x00, 0x00, - 0x69, 0x71, 0x52, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x00, 0x00, 0x00, 0x6f, 0x71, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x00, 0x00, 0x73, 0x64, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x00, 0x63, 0x68, 0x53, 0x79, 0x73, 0x55, 0x6e, 0x6c, - 0x6f, 0x63, 0x6b, 0x00, 0xc4, 0x49, 0x01, 0x08, 0x50, 0x25, 0x00, 0x20, - 0x50, 0x25, 0x00, 0x20, 0x50, 0x25, 0x00, 0x20, 0xc4, 0x49, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc4, 0x49, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc4, 0x49, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x49, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc4, 0x49, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc4, 0x49, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x49, 0x01, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x68, 0x53, 0x79, 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, - 0x63, 0x68, 0x53, 0x79, 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, - 0x63, 0x68, 0x53, 0x79, 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, - 0x63, 0x68, 0x53, 0x79, 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, - 0x69, 0x71, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x00, 0x73, 0x74, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x00, 0x00, 0x00, 0x00, - 0x61, 0x64, 0x63, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x42, 0x75, - 0x73, 0x00, 0x00, 0x00, 0x6f, 0x71, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x00, 0x00, 0x00, 0x00, 0x73, 0x74, 0x53, 0x65, 0x74, 0x41, 0x6c, 0x61, - 0x72, 0x6d, 0x00, 0x00, 0x63, 0x61, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x00, - 0x6f, 0x72, 0x65, 0x73, 0x61, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x00, 0x00, 0x00, 0x00, 0x61, 0x64, 0x63, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x00, 0x00, 0x00, 0x00, 0x63, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x00, 0x00, 0x00, 0x00, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x79, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x49, 0x00, 0x00, 0x61, 0x64, 0x63, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x1b, 0x01, 0x08, - 0x61, 0x1d, 0x01, 0x08, 0x91, 0x1c, 0x01, 0x08, 0x11, 0x1e, 0x01, 0x08, - 0x81, 0x1c, 0x01, 0x08, 0x01, 0x1e, 0x01, 0x08, 0xc1, 0x1b, 0x01, 0x08, - 0x51, 0x1d, 0x01, 0x08, 0x21, 0x14, 0x01, 0x08, 0x63, 0x61, 0x6e, 0x54, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x49, 0x00, - 0x53, 0x44, 0x4f, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, 0x00, - 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x00, 0x00, 0x00, - 0x50, 0x44, 0x4f, 0x20, 0x53, 0x59, 0x4e, 0x43, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x42, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x00, - 0x3a, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0x3a, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0x84, 0x23, 0x01, 0x08, - 0xe8, 0x22, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0x88, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xe8, 0x22, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xec, 0x22, 0x01, 0x08, 0x3a, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0x3a, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0x84, 0x23, 0x01, 0x08, 0xe8, 0x22, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, 0x06, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0x88, 0x23, 0x01, 0x08, 0xae, 0x23, 0x01, 0x08, - 0xae, 0x23, 0x01, 0x08, 0xe8, 0x22, 0x01, 0x08, 0x63, 0x68, 0x53, 0x79, - 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x63, 0x68, 0x53, 0x79, - 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x63, 0x68, 0x53, 0x79, - 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x63, 0x68, 0x45, 0x76, - 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x68, 0x45, 0x76, 0x74, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x00, 0x00, 0x00, 0x63, 0x68, 0x53, 0x79, 0x73, 0x55, 0x6e, 0x6c, - 0x6f, 0x63, 0x6b, 0x00, 0x63, 0x68, 0x48, 0x65, 0x61, 0x70, 0x46, 0x72, - 0x65, 0x65, 0x00, 0x00, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x00, 0x00, - 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x62, 0x6c, 0x69, 0x6e, - 0x6b, 0x79, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, - 0x0d, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x69, 0x7a, 0x65, 0x64, - 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x2e, 0x2e, 0x2e, 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x0a, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3d, 0x0d, 0x0a, 0x00, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x72, 0x65, 0x73, 0x61, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x28, 0x29, 0x0d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x63, 0x68, 0x43, 0x6f, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x46, 0x72, 0x6f, 0x6d, 0x54, - 0x6f, 0x70, 0x49, 0x00, 0x63, 0x68, 0x48, 0x65, 0x61, 0x70, 0x41, 0x6c, - 0x6c, 0x6f, 0x63, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x00, 0x00, - 0x63, 0x68, 0x50, 0x6f, 0x6f, 0x6c, 0x46, 0x72, 0x65, 0x65, 0x49, 0x00, - 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x16, 0x43, 0x30, 0x04, 0x04, 0x44, 0x08, - 0x0c, 0x10, 0x14, 0x18, 0x1c, 0x20, 0x21, 0x22, 0x00, 0x00, 0x00, 0x00, - 0xad, 0xab, 0x97, 0xea, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x52, 0xa8, 0x68, 0x25, 0xfe, 0xf9, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x40, 0x04, 0x00, 0xff, 0xaf, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x46, 0x01, 0x08, - 0x10, 0x24, 0x00, 0x20, 0xe8, 0x24, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, - 0x41, 0x2b, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x63, 0x68, 0x53, 0x79, - 0x73, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x00, 0xc2, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x53, 0x56, 0x23, 0x31, 0x31, 0x00, 0x00, 0x00, 0x53, 0x56, 0x23, 0x31, - 0x30, 0x00, 0x00, 0x00, 0x53, 0x56, 0x23, 0x39, 0x00, 0x00, 0x00, 0x00, - 0x53, 0x56, 0x23, 0x38, 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x23, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x23, 0x36, 0x00, 0x00, 0x00, 0x00, - 0x53, 0x56, 0x23, 0x35, 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x23, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x23, 0x33, 0x00, 0x00, 0x00, 0x00, - 0x69, 0x64, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x37, 0x43, 0x00, 0x00, 0x00, 0x00, 0x75, 0x73, 0x61, 0x72, - 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x00, 0x00, 0x84, 0x62, 0xff, 0x7f, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x31, 0xd6, 0x00, 0x08, 0x21, 0xd6, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x2c, 0x08, 0x00, 0x20, 0x2c, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4f, 0x72, 0x65, 0x53, 0x61, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x61, 0x72, 0x64, 0x33, 0x2e, 0x33, 0x30, 0x2e, 0x31, 0x2e, 0x30, - 0x80, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x05, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x80, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x27, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x80, 0x04, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x01, 0x08, 0x21, - 0x10, 0x01, 0x09, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0xe8, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x6c, 0x22, 0x00, 0x20, 0x30, 0x00, 0xe8, 0x03 -}; -unsigned int app_protocard2_crc32_bin_len = 43460; diff --git a/src/archive/app_oresat_acs-0.1/Makefile b/src/archive/app_oresat_acs-0.1/Makefile deleted file mode 100644 index 0ebef96e..00000000 --- a/src/archive/app_oresat_acs-0.1/Makefile +++ /dev/null @@ -1,205 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x200 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x200 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_oresat_acs - -# Target settings. -MCU = cortex-m0 -BOARD = ST_NUCLEO32_F042K6 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f0xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F0xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F042x6.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_oresat_acs-0.1/README.md b/src/archive/app_oresat_acs-0.1/README.md deleted file mode 100644 index 55f3c8e2..00000000 --- a/src/archive/app_oresat_acs-0.1/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# app_template - -This is the template app for new applications. - -To create a new app, simply copy the app_template directory and name it whatever you like. - -``` -cp -R app_template app_ -``` - -If building for a specific board, update the `BOARD =` line to the board -defined in the `boards` directory - -Then, open the Makefile and edit the line `PROJECT =` to whatever name you chose: -``` -PROJECT = app_ -``` diff --git a/src/archive/app_oresat_acs-0.1/cfg/chconf.h b/src/archive/app_oresat_acs-0.1/cfg/chconf.h deleted file mode 100644 index 6f3b51a9..00000000 --- a/src/archive/app_oresat_acs-0.1/cfg/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM FALSE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_oresat_acs-0.1/cfg/halconf.h b/src/archive/app_oresat_acs-0.1/cfg/halconf.h deleted file mode 100644 index af83724c..00000000 --- a/src/archive/app_oresat_acs-0.1/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_oresat_acs-0.1/cfg/mcuconf.h b/src/archive/app_oresat_acs-0.1/cfg/mcuconf.h deleted file mode 100644 index cf6d97da..00000000 --- a/src/archive/app_oresat_acs-0.1/cfg/mcuconf.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_HSI48_ENABLED FALSE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2 -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_PLLNODIV STM32_PLLNODIV_DIV2 -#define STM32_USBSW STM32_USBSW_HSI48 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI16_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI17_20_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI21_22_IRQ_PRIORITY 3 -#define STM32_IRQ_USART1_PRIORITY 3 -#define STM32_IRQ_USART2_PRIORITY 3 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_CKMODE STM32_ADC_CKMODE_ADCCLK -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM14 TRUE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 -#define STM32_GPT_TIM14_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_IRQ_PRIORITY 3 -#define STM32_I2C_USE_DMA TRUE -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI1 FALSE -#define STM32_I2S_SPI1_MODE (STM32_I2S_MODE_MASTER | \ - STM32_I2S_MODE_RX) -#define STM32_I2S_SPI1_IRQ_PRIORITY 2 -#define STM32_I2S_SPI1_DMA_PRIORITY 1 -#define STM32_I2S_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2S_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED TRUE -#define STM32_PWM_USE_TIM1 TRUE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 2 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_oresat_acs-0.1/main.c b/src/archive/app_oresat_acs-0.1/main.c deleted file mode 100644 index a7bc5a2d..00000000 --- a/src/archive/app_oresat_acs-0.1/main.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * OreSat: Attitude Control System - * Portland State Aerospace Society (PSAS) - * - * // be wery wery quiet i'm hunting wabbits... - * - * // add your name if you code things - * // and you are paying attention - * // and you want your code things in - * // space - * - * // o_0 - * - * Chad Coates - * - */ - -//=== ChibiOS header files -#include "ch.h" -#include "hal.h" - -//=== Project header files -#include "oresat.h" -#include "acs.h" - -ACSdata data = {}; - -static SerialConfig ser_cfg = { - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - -static void app_init(void){ - acsInit(&data); - //data.acs[0] = 1; - canRPDOObjectInit(CAN_PDO_1,CAN_ID_DEFAULT,CAN_BUF,data.recv); -// initTPDO(); - canTPDOObjectInit(CAN_PDO_1,CAN_ID_DEFAULT,0,0,CAN_BUF,data.send); - - sdStart(&SD2,&ser_cfg); // Start up debug output -} - -static void app_main(void){ -//* - chThdCreateStatic( - wa_acsThread, - sizeof(wa_acsThread), - NORMALPRIO, - acsThread, - NULL - ); -//*/ -//* - chThdCreateStatic( - wa_spiThread, - sizeof(wa_spiThread), - HIGHPRIO, - spiThread, - NULL - ); - - /*chThdCreateStatic( - wa_debugThread, - sizeof(wa_debugThread), - NORMALPRIO, - debugThread, - NULL - );*/ -//*/ - while(true){ - chThdSleepMilliseconds(1000); - } -} - -int main(void) { - halInit(); - chSysInit(); - - oresat_init(CAN_NODE); - - app_init(); - app_main(); - - return 0; -} diff --git a/src/archive/app_oresat_acs-0.1/source/README.md b/src/archive/app_oresat_acs-0.1/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/archive/app_oresat_acs-0.1/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_oresat_acs-0.1/source/acs.c b/src/archive/app_oresat_acs-0.1/source/acs.c deleted file mode 100644 index c83b0cae..00000000 --- a/src/archive/app_oresat_acs-0.1/source/acs.c +++ /dev/null @@ -1,495 +0,0 @@ -#include "acs.h" -#include "acs_lut.h" - - -// static virtual_timer_t speed_vt; - -// static sysinterval_t interval = 0; -//static uint32_t anglePrev, angleCurr; -//static uint32_t angleDelta = 0; -//static uint32_t rps = 0; -//static uint32_t time = 0; - -//static systime_t now; -//static systime_t prv; - -BldcConfig bldc; -uint16_t rxbuf[2] = {0}; // receive buffer - -/* -static void gpt4cb(GPTDriver *gptp) { - (void)gptp; - // Perform your action here - - anglePrev = angleCurr; - angleCurr = bldc.position; - angleDelta = 5;//angleCurr - anglePrev; - - rps = angleDelta * 10; - - - gptStartOneShotI(&GPTD14, 100000); // ~100 ns delay, then stop timer -} - -static const GPTConfig gpt4cfg = { - 100000, // 1 MHz timer clock. - gpt4cb, // No callback - 0, 0 -};*/ - -/* -static void speed_cb(void * arg) -{ - //chVTSetI(&speed_vt, TIME_MS2I(100), speed_cb, NULL); - - anglePrev = angleCurr; - angleCurr = bldc.position; - angleDelta = angleCurr - anglePrev; - - rps = angleDelta * 10; -}*/ - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Continuous, 8 samples of 1 channel, SW triggered. - * Channels: A0 - */ -static const ADCConversionGroup adcgrpcfg = { - TRUE, - ADC_GRP_NUM_CHANNELS, - NULL, - adcerrorcallback, - ADC_CFGR1_CONT | ADC_CFGR1_RES_12BIT, /* CFGRR1 */ - ADC_TR(0, 0), /* TR */ - ADC_SMPR_SMP_239P5, /* SMPR */ - ADC_CHSELR_CHSEL0 /* CHSELR */ -}; - - -uint32_t step_size = STRETCH; - -uint32_t current_sin_u, next_sin_u; -uint32_t current_sin_v, next_sin_v; -uint32_t current_sin_w, next_sin_w; -uint16_t sin_diff; -uint16_t sin_size; -uint16_t sin_step = STRETCH; - -THD_WORKING_AREA(wa_acsThread,THREAD_SIZE); -THD_FUNCTION(acsThread,arg) { - (void)arg; - chRegSetThreadName("acsThread"); - - bldcStart(); - - while (!chThdShouldTerminateX()) { - - chprintf(DEBUG_CHP,"enc pos: %u \n\r", bldc.position); - chprintf(DEBUG_CHP,"phase 1: %u \n\r", bldc.u); - chprintf(DEBUG_CHP,"phase 2: %u \n\r", bldc.v); - chprintf(DEBUG_CHP,"phase 3: %u \n\r", bldc.w); - chprintf(DEBUG_CHP,"step_size: %u \n\n\r", step_size); - chThdSleepMilliseconds(500); - - chprintf(DEBUG_CHP, "ADC: %u \n\r", (int)bldc.samples[0]); - - } -} - -THD_WORKING_AREA(wa_spiThread,THREAD_SIZE); -THD_FUNCTION(spiThread,arg){ - (void)arg; - chRegSetThreadName("spiThread"); - - spiStart(&SPID1, &spicfg); // Start driver. - spiAcquireBus(&SPID1); // Gain ownership of bus. - - while (!chThdShouldTerminateX()) { - rxbuf[0] = 0; - spiSelect(&SPID1); // Select slave. - - spiReceive(&SPID1,1,rxbuf); // Receive 1 frame (16 bits). - - spiUnselect(&SPID1); // Unselect slave. - bldc.position = 0x3FFF & rxbuf[0]; - - chThdSleepMicroseconds(1); - } - - spiReleaseBus(&SPID1); // Release ownership of bus. - spiStop(&SPID1); // Stop driver. -} - - -THD_WORKING_AREA(wa_debugThread,THREAD_SIZE); -THD_FUNCTION(debugThread,arg) { - (void)arg; - chRegSetThreadName("debugThread"); - //chThdSleepMilliseconds(100); -} - -/* - Sections off value from encoder (0 - 2^14) - into chunks of 0-360 for the LUT. - TODO MAX: clean this up. -*/ - -static uint16_t chunk0L = 0 * ENCODER_CHUNK_SIZE; -static uint16_t chunk0H = 1 * ENCODER_CHUNK_SIZE; - -static uint16_t chunk1L = 1 * ENCODER_CHUNK_SIZE; -static uint16_t chunk1H = 2 * ENCODER_CHUNK_SIZE; - -static uint16_t chunk2L = 2 * ENCODER_CHUNK_SIZE; -static uint16_t chunk2H = 3 * ENCODER_CHUNK_SIZE; - -static uint16_t chunk3L = 3 * ENCODER_CHUNK_SIZE; -static uint16_t chunk3H = 4 * ENCODER_CHUNK_SIZE; - -static uint16_t chunk4L = 4 * ENCODER_CHUNK_SIZE; -static uint16_t chunk4H = 5 * ENCODER_CHUNK_SIZE; - -static uint16_t chunk5L = 5 * ENCODER_CHUNK_SIZE; -static uint16_t chunk5H = 6 * ENCODER_CHUNK_SIZE; - - -// Uses above defines to translate encoder feedback -// into the proper LUT index. -static uint16_t encoderToLUT(uint16_t position) -{ - uint16_t step = 0; - if (position > chunk0L && position < chunk0H) - { - step = position * STEPS / (ENCODER_CHUNK_SIZE); - } - else if (position > chunk1L && position < chunk1H) - { - position = position - (ENCODER_CHUNK_SIZE*1); - step = position * STEPS / (ENCODER_CHUNK_SIZE); - } - else if (position > chunk2L && position < chunk2H) - { - - position = position - (ENCODER_CHUNK_SIZE*2); - step = position * STEPS / (ENCODER_CHUNK_SIZE); - } - else if (position > chunk3L && position < chunk3H) - { - - position = position - (ENCODER_CHUNK_SIZE*3); - step = position * STEPS / (ENCODER_CHUNK_SIZE); - } - else if (position > chunk4L && position < chunk4H) - { - - position = position - (ENCODER_CHUNK_SIZE*4); - step = position * STEPS / (ENCODER_CHUNK_SIZE); - } - else if (position > chunk5L && position < chunk5H) - { - - position = position - (ENCODER_CHUNK_SIZE*5); - step = position * STEPS / (ENCODER_CHUNK_SIZE); - } - - return step; -} - -//static uint32_t LUTrevCount = 0; - -// TODO Max, instead of increments of 10%, get finer control. -static sinctrl_t scale(sinctrl_t duty_cycle){ - return (duty_cycle*bldc.scale)/10; -} - -// Temporary for ramping function, hopefully can simulate this with CAN -uint16_t count = 0; - -bool down = false; - - -// TODO Max, find a way to separate the types of control -// easily with CAN. Probably a simple case statement - -// pwm period callback -static void pwmpcb(PWMDriver *pwmp) { - (void)pwmp; - - uint16_t step; - uint16_t next_step; - palClearLine(LINE_LED_GREEN); - - if (count > 2000) - { - if (!down) - { - step_size++; - } - else - { - step_size = step_size - 1; - } - count = 0; - } - - if (step_size >= 80) - { - down = true; - } - else if (step_size < 2) - { - down = false; - } - -// TODO Max, do we want the configure stuff for any reason? -#ifdef CONFIGURE - - if (LUTrevCount < 6 * 360) - { - if (bldc.count == bldc.stretch){ - bldc.u += STEP_SIZE; - bldc.v += STEP_SIZE; - bldc.w += STEP_SIZE; - - LUTrevCount++; - - if(bldc.u >= bldc.steps){ - bldc.u = 0 + bldc.u - bldc.steps; - } - if(bldc.v >= bldc.steps){ - bldc.v = 0 + bldc.v - bldc.steps; - } - if(bldc.w >= bldc.steps){ - bldc.w = 0 + bldc.w - bldc.steps; - } - bldc.count = 0; - } - ++bldc.count; - } - else - { - bldc.u = 0; - bldc.v = 120; - bldc.w = 240; - } - - -#endif - -#ifndef CONFIGURE -#ifdef BRUTEFORCE - bldc.u += step_size; - bldc.v += step_size; - bldc.w += step_size; - - if(bldc.u >= bldc.steps){ - bldc.u = 0 + bldc.u - bldc.steps; - } - if(bldc.v >= bldc.steps){ - bldc.v = 0 + bldc.v - bldc.steps; - } - if(bldc.w >= bldc.steps){ - bldc.w = 0 + bldc.w - bldc.steps; - } -#endif -#ifndef BRUTEFORCE -// This is the encoder feedback. -// TODO Max, this really needs to be cleaned up. -if (sin_step == step_size) -{ - step = encoderToLUT(bldc.position); - next_step = step + SKIP; - - - - bldc.u = (next_step)%360; - bldc.v = (bldc.u + bldc.phase_shift)%360; - bldc.w = (bldc.v + bldc.phase_shift)%360; - -} -#endif -#endif -if (SKIP) -{ -if (sin_step == step_size) -{ - current_sin_u = bldc.sinctrl[bldc.u]; - current_sin_v = bldc.sinctrl[bldc.v]; - current_sin_w = bldc.sinctrl[bldc.w]; - next_sin_u = bldc.sinctrl[bldc.u + 1]; - next_sin_v = bldc.sinctrl[bldc.v + 1]; - next_sin_w = bldc.sinctrl[bldc.w + 1]; - - if (current_sin_u < next_sin_u) - { - sin_diff = next_sin_u - current_sin_u; - - sin_size = sin_diff / step_size; - } - else if (current_sin_v < next_sin_v) - { - sin_diff = next_sin_v - current_sin_v; - sin_size = sin_diff / step_size; - } - else - { - sin_diff = next_sin_w - current_sin_w; - sin_size = sin_diff / step_size; - } -} - -current_sin_u = current_sin_u + sin_size; -current_sin_v = current_sin_v + sin_size; -current_sin_w = current_sin_w + sin_size; - -sin_step = sin_step - 1; - -if (sin_step == 0) -{ - current_sin_u = next_sin_u; - current_sin_v = next_sin_v; - current_sin_w = next_sin_w; - sin_step = step_size; -} -} -else -{ - current_sin_u = bldc.sinctrl[bldc.u]; - current_sin_v = bldc.sinctrl[bldc.v]; - current_sin_w = bldc.sinctrl[bldc.w]; -} - -pwmEnableChannelI( - &PWMD1, - PWM_U, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(current_sin_u))); - -pwmEnableChannelI( - &PWMD1, - PWM_V, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(current_sin_v)) - ); - -pwmEnableChannelI( - &PWMD1, - PWM_W, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(current_sin_w)) - ); - - count++; -} - - - - - -static void pwmCallback(uint8_t channel,sinctrl_t step){ - // palSetLine(LINE_LED_GREEN); - pwmEnableChannelI( - &PWMD1, - channel, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(bldc.sinctrl[step])) - ); - -} - -static void pwmUcb(PWMDriver *pwmp){ // channel 1 callback - (void)pwmp; - //pwmCallback(PWM_U,bldc.u); -} - -static void pwmVcb(PWMDriver *pwmp){ // channel 2 callback - (void)pwmp; - //pwmCallback(PWM_V,bldc.v); -} - -static void pwmWcb(PWMDriver *pwmp){ // channel 3 callback - (void)pwmp; - //pwmCallback(PWM_W,bldc.w); -} - -static PWMConfig pwmcfg = { - PWM_TIMER_FREQ, - PWM_PERIOD, - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmUcb}, - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmVcb}, - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH,pwmWcb}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, - 0, - 0 -}; - -extern void acsInit(ACSdata *data){ - bldc.data = data; - bldcInit(); - // TODO MAX wrap up into adcInit - adcStart(&ADCD1, NULL); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg, bldc.samples, ADC_GRP_BUF_DEPTH); - - - //gptStart(&GPTD14, &gpt4cfg); - //gptStartOneShot(&GPTD14, 100000); // ~100 ns delay, then stop timer - - - - //chVTObjectInit(&speed_vt); - //chVTSet(&speed_vt, TIME_MS2I(100), speed_cb, NULL); -} - -extern void bldcInit(){ - bldc.steps = STEPS; - bldc.stretch = STRETCH; - bldc.scale = SCALE; - bldc.sinctrl = sinctrl360; - bldc.count = 0; - bldc.position = 0; - bldc.phase_shift = bldc.steps/3; - bldc.u = 0; - bldc.v = bldc.u + bldc.phase_shift; - bldc.w = bldc.v + bldc.phase_shift; -} - - - -extern void bldcStart(){ - palSetLine(LINE_LED_GREEN); - pwmStart(&PWMD1,&pwmcfg); - pwmEnablePeriodicNotification(&PWMD1); - - pwmEnableChannel(&PWMD1,PWM_U,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.u)); - pwmEnableChannel(&PWMD1,PWM_V,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.v)); - pwmEnableChannel(&PWMD1,PWM_W,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.w)); - - pwmEnableChannelNotification(&PWMD1,PWM_U); - pwmEnableChannelNotification(&PWMD1,PWM_V); - pwmEnableChannelNotification(&PWMD1,PWM_W); -} - -extern void bldcStop(){ - palClearLine(LINE_LED_GREEN); - pwmStop(&PWMD1); -/* - pwmEnablePeriodicNotification(&PWMD1); - - pwmEnableChannel(&PWMD1,PWM_U,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.u)); - pwmEnableChannel(&PWMD1,PWM_V,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.v)); - pwmEnableChannel(&PWMD1,PWM_W,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,bldc.w)); - - pwmEnableChannelNotification(&PWMD1,PWM_U); - pwmEnableChannelNotification(&PWMD1,PWM_V); - pwmEnableChannelNotification(&PWMD1,PWM_W); -*/ -} diff --git a/src/archive/app_oresat_acs-0.1/source/acs.h b/src/archive/app_oresat_acs-0.1/source/acs.h deleted file mode 100644 index baf116c8..00000000 --- a/src/archive/app_oresat_acs-0.1/source/acs.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef _ACS_H_ -#define _ACS_H_ - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "string.h" - -//#define BRUTEFORCE -//#define CONFIGURE - -#define CH_DBG_SYSTEM_STATE_CHECK TRUE - -#define THREAD_SIZE (120) -#define CAN_NODE 0x3F // max 0x7f -#define CAN_BUF 8 - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#define SCALE 2 -#define STEPS 360 -#define STRETCH 1 -#define STEP_SIZE 1 -#define SKIP 1 - -#define COIL_NUM 6 - -#define ENCODER_MAX 2^14 -#define ENCODER_MIN 0 -#define ENCODER_CHUNK_SIZE 2730 - -#define PWM_TIMER_FREQ 48e6 // Hz - -//************************************************************** -// -// TODO: we need to do math ASAP -// -#define PWM_FREQ 20e3 // periods per sec -//#define PWM_FREQ 30e3 // periods per sec -#define PWM_PERIOD PWM_TIMER_FREQ/PWM_FREQ - -#define PWM_U 0U -#define PWM_V 1U -#define PWM_W 2U -#define PWM_MTQR 3u - -#define sinctrl_t uint16_t - -#define ADC_GRP_NUM_CHANNELS 1 -#define ADC_GRP_BUF_DEPTH 8 - -typedef struct{ - uint8_t send[CAN_BUF]; - uint8_t recv[CAN_BUF]; -} ACSdata; - -typedef struct{ - int count, // period counter - scale, // scales the duty cycle - steps, // number of steps in lut - stretch; - sinctrl_t u,v,w, // signals - phase_shift; // - uint16_t position; // motor position from encoder - sinctrl_t const *sinctrl; // pointer to the sin lut - - adcsample_t samples[ADC_GRP_NUM_CHANNELS * ADC_GRP_BUF_DEPTH]; // ADC conversion storage array - -} BldcConfig; - -static const SPIConfig spicfg = { - false, // Enables circular buffer if == 1 - NULL, // Operation complete call back. - GPIOA, // Chip select line - GPIOA_SPI1_NSS, // Chip select port - SPI_CR1_BR_0|SPI_CR1_CPHA,//reg 1 mask - SPI_CR2_DS_0|SPI_CR2_DS_1|SPI_CR2_DS_2|SPI_CR2_DS_3,//reg 2 mask -}; - -typedef struct{ - // o_0 -}ACSConfig; - -extern THD_WORKING_AREA(wa_acsThread,THREAD_SIZE); -extern THD_FUNCTION(acsThread,arg); - -extern THD_WORKING_AREA(wa_spiThread,THREAD_SIZE); -extern THD_FUNCTION(spiThread,arg); - -extern THD_WORKING_AREA(wa_debugThread,THREAD_SIZE); -extern THD_FUNCTION(debugThread,arg); - - - -extern void acsInit(void); -extern void bldcInit(void); -extern void bldcStart(void); -extern void bldcStop(void); - -#endif diff --git a/src/archive/app_oresat_acs-0.1/source/acs_lut.h b/src/archive/app_oresat_acs-0.1/source/acs_lut.h deleted file mode 100644 index cf888753..00000000 --- a/src/archive/app_oresat_acs-0.1/source/acs_lut.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef _ACS_LUT_H_ -#define _ACS_LUT_H_ - -#include "acs.h" - -const sinctrl_t sinctrl360[360] = { - 5000,5087,5174,5262,5349,5436,5523,5609, - 5696,5782,5868,5954,6040,6125,6210,6294, - 6378,6462,6545,6628,6710,6792,6873,6954, - 7034,7113,7192,7270,7347,7424,7500,7575, - 7650,7723,7796,7868,7939,8009,8078,8147, - 8214,8280,8346,8410,8473,8536,8597,8657, - 8716,8774,8830,8886,8940,8993,9045,9096, - 9145,9193,9240,9286,9330,9373,9415,9455, - 9494,9532,9568,9603,9636,9668,9698,9728, - 9755,9782,9806,9830,9851,9872,9891,9908, - 9924,9938,9951,9963,9973,9981,9988,9993, - 9997,9999,10000,9999,9997,9993,9988,9981, - 9973,9963,9951,9938,9924,9908,9891,9872, - 9851,9830,9806,9782,9755,9728,9698,9668, - 9636,9603,9568,9532,9494,9455,9415,9373, - 9330,9286,9240,9193,9145,9096,9045,8993, - 8940,8886,8830,8774,8716,8657,8597,8536, - 8473,8410,8346,8280,8214,8147,8078,8009, - 7939,7868,7796,7723,7650,7575,7500,7424, - 7347,7270,7192,7113,7034,6954,6873,6792, - 6710,6628,6545,6462,6378,6294,6210,6125, - 6040,5954,5868,5782,5696,5609,5523,5436, - 5349,5262,5174,5087,5000,4913,4826,4738, - 4651,4564,4477,4391,4304,4218,4132,4046, - 3960,3875,3790,3706,3622,3538,3455,3372, - 3290,3208,3127,3046,2966,2887,2808,2730, - 2653,2576,2500,2425,2350,2277,2204,2132, - 2061,1991,1922,1853,1786,1720,1654,1590, - 1527,1464,1403,1343,1284,1226,1170,1114, - 1060,1007,955,904,855,807,760,714, - 670,627,585,545,506,468,432,397, - 364,332,302,272,245,218,194,170, - 149,128,109,92,76,62,49,37, - 27,19,12,7,3,1,0,1, - 3,7,12,19,27,37,49,62, - 76,92,109,128,149,170,194,218, - 245,272,302,332,364,397,432,468, - 506,545,585,627,670,714,760,807, - 855,904,955,1007,1060,1114,1170,1226, - 1284,1343,1403,1464,1527,1590,1654,1720, - 1786,1853,1922,1991,2061,2132,2204,2277, - 2350,2425,2500,2576,2653,2730,2808,2887, - 2966,3046,3127,3208,3290,3372,3455,3538, - 3622,3706,3790,3875,3960,4046,4132,4218, - 4304,4391,4477,4564,4651,4738,4826,4913 -}; - -#endif diff --git a/src/archive/app_oresat_acs-1.0/Makefile b/src/archive/app_oresat_acs-1.0/Makefile deleted file mode 100644 index 0ebef96e..00000000 --- a/src/archive/app_oresat_acs-1.0/Makefile +++ /dev/null @@ -1,205 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x200 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x200 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_oresat_acs - -# Target settings. -MCU = cortex-m0 -BOARD = ST_NUCLEO32_F042K6 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f0xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F0xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F042x6.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_oresat_acs-1.0/README.md b/src/archive/app_oresat_acs-1.0/README.md deleted file mode 100644 index 7816ee1b..00000000 --- a/src/archive/app_oresat_acs-1.0/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# app_template - -This is the template app for new applications. - -To create a new app, simply copy the app_template directory and name it whatever you like. - -``` -cp -R app_template app_ -``` - -If building for a specific board, update the `BOARD =` line to the board -defined in the `boards` directory - -Then, open the Makefile and edit the line `PROJECT =` to whatever name you chose: -``` -PROJECT = app_ -``` - -Commands for interacting with the can bus - -sudo slcand -o -c -f -s6 /dev/serial/by-id/*CANtact*-if00 -sudo ip link set slcan0 up -candump slcan0 -``` diff --git a/src/archive/app_oresat_acs-1.0/caniface.sh b/src/archive/app_oresat_acs-1.0/caniface.sh deleted file mode 100755 index bbfca201..00000000 --- a/src/archive/app_oresat_acs-1.0/caniface.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -`sudo slcand -o -c -f -s6 /dev/serial/by-id/*CANtact*-if00` -`sudo ip link set slcan0 up` diff --git a/src/archive/app_oresat_acs-1.0/cfg/chconf.h b/src/archive/app_oresat_acs-1.0/cfg/chconf.h deleted file mode 100644 index 6f3b51a9..00000000 --- a/src/archive/app_oresat_acs-1.0/cfg/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM FALSE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_oresat_acs-1.0/cfg/halconf.h b/src/archive/app_oresat_acs-1.0/cfg/halconf.h deleted file mode 100644 index a06ea4f6..00000000 --- a/src/archive/app_oresat_acs-1.0/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_oresat_acs-1.0/cfg/mcuconf.h b/src/archive/app_oresat_acs-1.0/cfg/mcuconf.h deleted file mode 100644 index cde64fa5..00000000 --- a/src/archive/app_oresat_acs-1.0/cfg/mcuconf.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_HSI48_ENABLED FALSE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_SYSCLK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_PLLNODIV STM32_PLLNODIV_DIV2 -#define STM32_USBSW STM32_USBSW_HSI48 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_HSI -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI16_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI17_20_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI21_22_IRQ_PRIORITY 3 -#define STM32_IRQ_USART1_PRIORITY 3 -#define STM32_IRQ_USART2_PRIORITY 3 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_CKMODE STM32_ADC_CKMODE_ADCCLK -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 -#define STM32_GPT_TIM14_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_IRQ_PRIORITY 3 -#define STM32_I2C_USE_DMA TRUE -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI1 FALSE -#define STM32_I2S_SPI1_MODE (STM32_I2S_MODE_MASTER | \ - STM32_I2S_MODE_RX) -#define STM32_I2S_SPI1_IRQ_PRIORITY 2 -#define STM32_I2S_SPI1_DMA_PRIORITY 1 -#define STM32_I2S_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2S_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED TRUE -#define STM32_PWM_USE_TIM1 TRUE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 2 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_oresat_acs-1.0/main.c b/src/archive/app_oresat_acs-1.0/main.c deleted file mode 100644 index e5385dd9..00000000 --- a/src/archive/app_oresat_acs-1.0/main.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -//=== ChibiOS header files -#include "ch.h" -#include "hal.h" - -//=== Project header files -#include "acs.h" - -// global ACS structure -ACS acs = {}; - -//=== Serial configuration -static SerialConfig ser_cfg ={ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - -/** - * @brief Application initialization section - * - */ -static void app_init(void) { - acsInit(&acs); - - /// initialization of CAN resources for sending and - /// receiving. registers two 8-byte uint8_t arrays - /// with the CAN bus. these are shared resources - /// between the ACS and the CAN bus - canRPDOObjectInit(CAN_PDO_1,CAN_ID_DEFAULT,CAN_BUF_SIZE,acs.can_buf.recv); - canTPDOObjectInit(CAN_PDO_1,CAN_ID_DEFAULT,0,0,CAN_BUF_SIZE,acs.can_buf.send); - /// serial output for debugging - sdStart(&SD2, &ser_cfg); -} - -/** - * @brief main appliction section - * - * starts the acs thread and then sleeps - * - */ -static void app_main(void) { - chThdCreateStatic( - wa_acsThread, - sizeof(wa_acsThread), - NORMALPRIO+1, - acsThread, - &acs - ); - - while (true){ - chThdSleepMilliseconds(1000); - } -} - -/** - * @brief main - * - * calls initialization functions - * and then calls app_main() - * - */ -int main(void){ - halInit(); - chSysInit(); - oresat_init(CAN_NODE); - - /// Initialize and start app - app_init(); - app_main(); - - return 0; -} diff --git a/src/archive/app_oresat_acs-1.0/source/README.md b/src/archive/app_oresat_acs-1.0/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/archive/app_oresat_acs-1.0/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_oresat_acs-1.0/source/acs.c b/src/archive/app_oresat_acs-1.0/source/acs.c deleted file mode 100644 index d7082c20..00000000 --- a/src/archive/app_oresat_acs-1.0/source/acs.c +++ /dev/null @@ -1,429 +0,0 @@ -#include "acs.h" - -event_listener_t el; - -/** - * @brief cleans up on transition - * - * @param[in] acs pointer to the @p ACS object - * @p ACS caonnot be NULL - */ -static void trans_cleanup(ACS *acs){ - switch(acs->cur_state){ - case ST_OFF: - - break; - case ST_INIT: - - break; - case ST_RDY: - - break; - - case ST_RW: - bldcExit(&acs->motor); - break; - - case ST_MTQR: - mtqrExit(&acs->mtqr); - break; - default: - - break; - } -} - -/** - * @brief updates the recv buffer - * - * @note this is a critical section - * - */ -static void update_recv(ACS *acs,int recv_byte){ - switch(recv_byte){ - case ERROR_CODE: - break; - case ACS_STATE: -// *******critical section********** - chSysLock(); - acs->can_buf.send[recv_byte]=acs->cur_state; - chSysUnlock(); -// *******end critical section********** - break; - default: - break; - } -} - -/** - * @brief returns the off state - * - */ -static int state_off(ACS *acs){ - (void)acs; - return ST_OFF; -} - -/** - * @brief returns the init state - * - */ -static int state_init(ACS *acs){ - (void)acs; - return ST_INIT; -} - -/** - * @brief returns the ready state - * - */ -static int state_rdy(ACS *acs){ - trans_cleanup(acs); - return ST_RDY; -} - -/** - * @brief return the reaction wheel state - * - */ -static int state_rw(ACS *acs){ - trans_cleanup(acs); - bldcInit(&acs->motor); - return ST_RW; -} - -/** - * @brief returns the magnetorquer state - * - */ -static int state_mtqr(ACS *acs){ - trans_cleanup(acs); - return ST_MTQR; -} - -/** - * @brief function to start the the reaction wheels - * - * @note this is a critical section - * - */ -static int trap_rw_start(ACS *acs){ - // *******critical section********** - chSysLock(); - acs->can_buf.send[LAST_TRAP]=EV_RW_START; - chSysUnlock(); - // *******end critical section********** - bldcStart(&acs->motor); - return EXIT_SUCCESS; -} - -/** - * @brief function to stop the reaction wheels - * - * @note this is a critical section - * - */ -static int trap_rw_stop(ACS *acs){ - // *******critical section********** - chSysLock(); - acs->can_buf.send[LAST_TRAP]=EV_RW_STOP; - chSysUnlock(); - // *******end critical section********** - bldcStop(&acs->motor); - return EXIT_SUCCESS; -} - -/** - * @brief function to start the magnetorquer - * - * @note this is a critical section - * - */ -static int trap_mtqr_start(ACS *acs){ - // *******critical section********** - chSysLock(); - acs->can_buf.send[LAST_TRAP]=EV_MTQR_START; - chSysUnlock(); - // *******end critical section********** - mtqrStart(&acs->mtqr); - return EXIT_SUCCESS; -} - -/** - * @brief function to stop the magnetorquer - * - * @note this is a critical section - * - */ -static int trap_mtqr_stop(ACS *acs){ - (void)acs; - // *******critical section********** - chSysLock(); - acs->can_buf.send[LAST_TRAP]=EV_MTQR_STOP; - chSysUnlock(); - // *******end critical section********** - mtqrStop(&acs->mtqr); - return EXIT_SUCCESS; -} - -/** - * @brief function to change the PWM - * duty cycle for the magnetorquer - * - * @note this is a critical section - * - */ -static int trap_mtqr_dc(ACS *acs){ - (void)acs; - // *******critical section********** - chSysLock(); - acs->can_buf.send[LAST_TRAP]=EV_MTQR_DC; - chSysUnlock(); - // *******end critical section********** - mtqrSetDC((acs->recv[ARG_BYTE+1]<<8) | acs->recv[ARG_BYTE+2]); - return EXIT_SUCCESS; -} - -/** - * @brief function for function for changing the - * polarity of the magnetorquer - * - * @note this is a critical section - * - */ -static int trap_mtqr_dir(ACS *acs){ - (void)acs; - // *******critical section********** - chSysLock(); - acs->can_buf.send[LAST_TRAP]=EV_MTQR_STOP; - chSysUnlock(); - // *******end critical section********** - mtqrSetDir(acs->recv[ARG_BYTE+1]); - return EXIT_SUCCESS; -} - -/** - * @brief Changes how many steps are added in between each LUT step - * - */ -static int trap_rw_stretch(ACS *acs){ - (void)acs; - /// TODO: have a better data system. - acs->motor.stretch = acs->data; - return EXIT_SUCCESS; -} - -/** - * @brief Closed loop using encoder, or brute forcing with open loop - * - */ -static int trap_rw_control(ACS *acs){ - (void)acs; - /// TODO: have a better data system. - acs->motor.openLoop = (bool) acs->data; - return EXIT_SUCCESS; -} - -/** - * @brief Changes how many steps are skipped in the LUT when going to next step - * - */ -static int trap_rw_skip(ACS *acs){ - (void)acs; - /// TODO: have a better data system. - acs->motor.skip = acs->data; - return EXIT_SUCCESS; -} - -/** - * @brief Changes the scale factor, modifying LUT value by 0-100% - * - */ -static int trap_rw_scale(ACS *acs){ - (void)acs; - /// TODO: have a better data system. - acs->motor.scale = acs->data; - return EXIT_SUCCESS; -} - -/** - * @brief trap function table - * - * this table defines the events allowed - * to be called in states, and the function - * that needs to be called on a successful - * match - */ -const acs_trap trap[] = { - {ST_RW, EV_RW_START, &trap_rw_start}, - {ST_RW, EV_RW_STOP, &trap_rw_stop}, - {ST_RW, EV_RW_STRETCH, &trap_rw_stretch}, - {ST_RW, EV_RW_CONTROL, &trap_rw_control}, - {ST_RW, EV_RW_SKIP, &trap_rw_skip}, - {ST_RW, EV_RW_SCALE, &trap_rw_scale}, - {ST_MTQR, EV_MTQR_START, &trap_mtqr_start}, - {ST_MTQR, EV_MTQR_STOP, &trap_mtqr_stop}, - {ST_MTQR, EV_MTQR_DC, &trap_mtqr_dc}, - {ST_MTQR, EV_MTQR_DIR, &trap_mtqr_dir}, -}; - -/// determines the total number of events -#define EVENT_COUNT (int)(sizeof(trap)/sizeof(acs_trap)) - -/** - * @brief control falls here when a state change - * request is unrecognized - * - * * @note this is a critical section - * - */ -static int fsm_trap(ACS *acs){ - int i,trap_status; - - for(i = 0;i < EVENT_COUNT;++i){ - if(acs->event == trap[i].event){ - if(trap[i].state == ST_ANY || acs->cur_state == trap[i].state){ - trap_status = (trap[i].fn)(acs); - if(trap_status){ - // *******critical section********** - chSysLock(); - acs->can_buf.send[ERROR_CODE]=77; - chSysUnlock(); - chThdSleepMilliseconds(500); - // *******end critical section********** - } - } - } - } - - return acs->cur_state; -} - -/** - * @brief state transition table - * - * this state transistion table defines - * legal transitions and and what function - * is called upon a successful match in - * the table. - */ -const acs_transition trans[] = { - {ST_INIT, EV_RDY, &state_rdy}, - {ST_INIT, EV_OFF, &state_off}, - {ST_RDY, EV_RW, &state_rw}, - {ST_RDY, EV_MTQR, &state_mtqr}, - {ST_RDY, EV_OFF, &state_off}, - {ST_RW, EV_RDY, &state_rdy}, - {ST_MTQR, EV_RDY, &state_rdy}, - {ST_ANY, EV_ANY, &fsm_trap} -}; - -/// TRANS_COUNT define the total number of legal transitions -#define TRANS_COUNT (int)(sizeof(trans)/sizeof(acs_transition)) - -/** - * @brief waits for events on the CAN bus and processes them - * - * @note this is a critical section - * - */ -static acs_event getNextEvent(ACS *acs){ - acs_event event = EV_ANY; - chEvtWaitAny(ALL_EVENTS); -// ******critical section******* - chSysLock(); - for(int i=0;irecv[i]=acs->can_buf.recv[i]; - acs->can_buf.recv[i]=0; - } - chSysUnlock(); -// ******end critical section******* - - switch(acs->recv[MSG_TYPE]){ - case NOP: - break; - case CHG_STATE: - event = acs->recv[ARG_BYTE]; - acs->data = acs->recv[ARG_BYTE+1]; - break; - case CALL_TRAP: - // event = EV_STATUS; - /// TODO: we should seperate the trap from the - /// state changes in the next version - // state command - break; - default: - break; - } - - if(event < EV_ANY || event >= EV_END){ - return (acs_event)acs->cur_state; - } - - return event; -} - -/** - * @brief the ACS state machine - * - * @note this is a critical section - * - */ -static int acs_statemachine(ACS *acs){ - int i; - acs->cur_state = state_init(acs); - update_recv(acs,ACS_STATE); - - while (!chThdShouldTerminateX() && acs->cur_state != ST_OFF) { - acs->event = getNextEvent(acs); - - // *******critical section********** - chSysLock(); - acs->can_buf.send[LAST_EVENT]=acs->event; - chSysUnlock(); - // *******end critical section********** - - for (i = 0;i < TRANS_COUNT;++i) { - if((acs->cur_state == trans[i].state)||(ST_ANY == trans[i].state)){ - if((acs->event == trans[i].event)||(EV_ANY == trans[i].event)){ - acs->cur_state = (trans[i].fn)(acs); - update_recv(acs,ACS_STATE); - } - } - } - chThdSleepMilliseconds(500); -/* - // this stuff is for debugging - chprintf(DEBUG_CHP, "motor stretch: %d\r\n", acs->motor.stretch); - chprintf(DEBUG_CHP, "motor openLoop: %d\r\n", acs->motor.openLoop); - chprintf(DEBUG_CHP, "motor skip: %d\r\n\n", acs->motor.skip); - chprintf(DEBUG_CHP, "motor scale: %d\r\n\n", acs->motor.scale); - chprintf(DEBUG_CHP, "motor samples: %d\r\n\n", acs->motor.samples[0]); -//*/ - } - - return EXIT_SUCCESS; -} - -/** - * @brief general ACS initialization - * - */ -extern int acsInit(ACS *acs){ - (void)acs; - mtqrInit(&acs->mtqr); - return EXIT_SUCCESS; -} - -/** - * @brief ACS thread and thread working area - * - */ -THD_WORKING_AREA(wa_acsThread,WA_ACS_THD_SIZE); -THD_FUNCTION(acsThread,acs){ - chRegSetThreadName("acsThread"); - chEvtRegister(&rpdo_event,&el,0); - - acs_statemachine(acs); -} - diff --git a/src/archive/app_oresat_acs-1.0/source/acs.h b/src/archive/app_oresat_acs-1.0/source/acs.h deleted file mode 100644 index af8b9081..00000000 --- a/src/archive/app_oresat_acs-1.0/source/acs.h +++ /dev/null @@ -1,176 +0,0 @@ -#ifndef _ACS_H_ -#define _ACS_H_ - -#include "ch.h" -#include "hal.h" -#include "bldc.h" -#include "magnetorquer.h" -#include "chprintf.h" -#include "oresat.h" - -/** - * TODO: Thread sizes cause continual problems for managing memory - * if the threads are too small it breaks, if the thread working - * areas are too large then you run out of memory. One solution - * is to move to a mcu with more memory. - */ -#define WA_ACS_THD_SIZE (1<<7) -#define CAN_NODE 0x3F // max 0x7f -#define CAN_BUF_SIZE 8 - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - -/** - * @brief can_msg enumeraton - * - * TODO: This is going to change in v2.0 once a protocol - * is decided for communication with the ACS - * - * Byte Name Use - * 0 MSG_TYPE CHG_STATE is the only current implementation - * 1 ARG_BYTE used for passing arguments - * 2 ARG_BYTE1 used for passing arguments - * 3 ARG_BYTE2 used for passing arguments - * 4 unimplemented - * 5 unimplemented - * 6 unimplemented - * 7 unimplemented - * - */ -typedef enum{ - MSG_TYPE=0, - ARG_BYTE, - ARG_BYTE1, - ARG_BYTE2 -}can_msg; - -/** - * @brief enumeration for the recv buffer - * - * TODO: This is going to change in v2.0 once a protocol - * is decided for communication with the ACS - * - * Byte Name Use - * 0 unimplemented - * 1 STATE current state - * 2 LAST_EVENT last event received - * 3 unimplemented - * 4 unimplemented - * 5 unimplemented - * 6 unimplemented - * 7 unimplemented - * - */ -typedef enum{ - ERROR_CODE = 0, - ACS_STATE, - LAST_EVENT, - LAST_TRAP, -}can_recv; - -/** - * @brief enumeration for CAN message types - * - * TODO: This is going to change in v2.0 once a protocol - * is decided for communication with the ACS - * - */ -typedef enum{ - NOP=0, - CHG_STATE, - CALL_TRAP, -}can_msg_type; - -/** - * @brief enumeration for ACS states - * - * TODO: This is going to change in v2.0 to more - * accurately reflect how the ACS will operate - * - */ -typedef enum{ - ST_ANY=-1, - ST_OFF, - ST_INIT, - ST_RDY, - ST_RW, - ST_MTQR -}acs_state; - -/** - * @brief enumeration for all the possible events - * - * TODO: This is going to change in v2.0 to more - * accurately reflect how the ACS will operate - * - * hexidecimal values are passed to the ACS via - * the bus. - */ -typedef enum { - EV_ANY=-1, ///< -1 - EV_OFF, ///< 0 - EV_INIT, ///< 1 - EV_RDY, ///< 2 - EV_RW, ///< 3 - EV_MTQR, ///< 4 - EV_RW_START, ///< 5 - EV_RW_STOP, ///< 6 - EV_RW_STRETCH, ///< 7 - EV_RW_CONTROL, ///< 8 - EV_RW_SKIP, ///< 9 - EV_RW_SCALE, ///< a - EV_MTQR_START, ///< b - EV_MTQR_STOP, ///< c - EV_MTQR_DC, ///< d - EV_MTQR_DIR, ///< e - EV_END /// this must be the last event -}acs_event; - -/** - * @brief can_buffer structure holds the send and recv - * buffers that are registered with the CAN bus - * - */ -typedef struct{ - uint8_t send[CAN_BUF_SIZE]; - uint8_t recv[CAN_BUF_SIZE]; -}can_buffer; - -/** - * @brief ACS structure for maintaining the ACS state - * - * TODO: This structure is likely to change for v2.0 - */ -typedef struct{ - acs_state cur_state; - acs_event event; /// the most recent event - can_buffer can_buf; - bldc motor; - MTQR mtqr; - /// TODO: find a better way to handle it - /// data was a bandaid - uint8_t data; - uint8_t recv[CAN_BUF_SIZE]; -}ACS; - -/** - * @brief structure for manipulating state transistions - * and trap functions - * - */ -typedef struct{ - acs_state state; - acs_event event; - int (*fn)(ACS *acs); -}acs_transition,acs_trap; - -extern int acsInit(ACS *acs); - -extern THD_WORKING_AREA(wa_acsThread,WA_ACS_THD_SIZE); -extern THD_FUNCTION(acsThread,acs); - -#endif diff --git a/src/archive/app_oresat_acs-1.0/source/bldc.c b/src/archive/app_oresat_acs-1.0/source/bldc.c deleted file mode 100644 index 4a1f317e..00000000 --- a/src/archive/app_oresat_acs-1.0/source/bldc.c +++ /dev/null @@ -1,263 +0,0 @@ -#include "bldc.h" -#include "sin_lut.h" - -bldc *motor; - -/** - * @brief Currently not used. - * - * - */ -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - (void)adcp; - (void)err; -} - - -/** - * TODO: combine this with a timer to not spam interrupts so much? - * @brief ADC conversion group, used to configure the ADC driver - * Mode: Continuous, 1 sample of 1 channel, SW triggered. - * Channels: A0 - * Slowest sample rate possible, as putting it too high can lock other systems out. - */ -static const ADCConversionGroup adcgrpcfg = { - TRUE, - ADC_GRP_NUM_CHANNELS, - NULL, - adcerrorcallback, - ADC_CFGR1_CONT | ADC_CFGR1_RES_12BIT, /* CFGRR1 */ - ADC_TR(0, 0), /* TR */ - ADC_SMPR_SMP_239P5, /* SMPR */ - ADC_CHSELR_CHSEL0 /* CHSELR */ -}; - -/** - * @brief Translates encoder position into a useable LUT value - * - * Since it takes 6 passes through the LUT to get one physical - * revolution of the motor, we need a way to index a value - * of 0 - 2^14 into a value of 0 - 360, in 6 separate ranges - * - */ -static uint16_t encoderToLut(uint16_t position){ - uint16_t step = 0; - uint8_t chunk = (position * CHUNK_AMOUNT) / ENCODER_MAX; - step = ((position - chunk_low[chunk]) * (STEPS)) / CHUNK_SIZE; - - return step; -} - -/** - * @brief Handles the SPI transaction, getting the position from the encoder - * - */ -THD_WORKING_AREA(wa_spiThread,THREAD_SIZE); -THD_FUNCTION(spiThread,arg){ - (void)arg; - chRegSetThreadName("spiThread"); - - spiStart(&SPID1,&spicfg); // Start driver. - spiAcquireBus(&SPID1); // Gain ownership of bus. - - while (!chThdShouldTerminateX()) { - motor->spi_rxbuf[0] = 0; - spiSelect(&SPID1); // Select slave. - - while(SPID1.state != SPI_READY) {} - spiReceive(&SPID1,1,motor->spi_rxbuf); // Receive 1 frame (16 bits). - spiUnselect(&SPID1); // Unselect slave. - - motor->position = 0x3FFF & motor->spi_rxbuf[0]; - - } - - spiReleaseBus(&SPID1); // Release ownership of bus. - spiStop(&SPID1); // Stop driver. -} - -/** - * @brief Scales the duty ccycle value from LUT 0 - 100% - * - */ -static sinctrl_t scale(sinctrl_t duty_cycle){ - return ((duty_cycle*motor->scale)/100) + ((10000*(motor->scale/2))/100); -} - -/** - * @brief Periodic callback of the PWM driver - * - * At the end of each period, we call this, and go to the next - * step in the LUT, which changes absed off of closed or open - * loop control. Holds the logic for stretching, skipping, and - * repeating, to modify the LUT values on the fly. - * - */ -static void pwmpcb(PWMDriver *pwmp) { - (void)pwmp; - - /// If open loop, ignore encoder feedback. - if(motor->openLoop){ - motor->u += motor->skip; - motor->v += motor->skip; - motor->w += motor->skip; - - motor->u = motor->u % 360; - motor->v = motor->v % 360; - motor->w = motor->w % 360; - - motor->current_sin_u = motor->sinctrl[motor->u]; - motor->current_sin_v = motor->sinctrl[motor->v]; - motor->current_sin_w = motor->sinctrl[motor->w]; - }else{ - if (motor->stretch_count == 0){ - motor->u = encoderToLut(motor->position); - motor->v = (motor->u + motor->phase_shift) % 360; - motor->w = (motor->v + motor->phase_shift) % 360; - motor->current_sin_u = motor->sinctrl[motor->u]; - motor->current_sin_v = motor->sinctrl[motor->v]; - motor->current_sin_w = motor->sinctrl[motor->w]; - motor->next_sin_u = motor->sinctrl[motor->u+1]; - motor->next_sin_v = motor->sinctrl[motor->v+1]; - motor->next_sin_w = motor->sinctrl[motor->w+1]; - - /// Calculate the difference between the current step in the LUT - /// and the next step in the LUT, and break it up - /// into the desired amount of steps in between the two - motor->sin_diff = (motor->current_sin_u > motor->next_sin_u)? - (motor->current_sin_u - motor->next_sin_u) : - (motor->next_sin_u - motor->current_sin_u); - motor->sin_diff = motor->sin_diff / motor->stretch; - motor->stretch_count = motor->stretch; - } - - motor->current_sin_u += motor->sin_diff; - motor->current_sin_v += motor->sin_diff; - motor->current_sin_w += motor->sin_diff; - - motor->stretch_count = motor->stretch_count - 1; - } - - bldcSetDC(PWM_U,motor->current_sin_u); - bldcSetDC(PWM_V,motor->current_sin_v); - bldcSetDC(PWM_W,motor->current_sin_w); -} - -/** - * @brief Pwm driver configuration structure. - * - * PWM_TIMER_FREQ is our timer clock in Hz - * - * PWM_PERIOD period in ticks - * - * Configured with pwmpcb as the periodic callback - * PWM channels 0,1,2 are all active high, with a complementary output - * and no channel callback - * - */ -static PWMConfig pwmRWcfg = { - PWM_TIMER_FREQ, - PWM_PERIOD, - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH|PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, - 0, - 0 -}; - -/** - * @brief Sets up initial values for the BLDC object - * - */ -extern void bldcInit(bldc *pbldc){ - motor = pbldc; - motor->steps = STEPS; - motor->stretch = STRETCH; - motor->stretch_count = 0; - motor->scale = SCALE; - motor->skip = SKIP; - motor->sinctrl = sinctrl360; - motor->count = 0; - motor->position = 0; - motor->phase_shift = motor->steps/3; - motor->u = 0; - motor->v = motor->u + motor->phase_shift; - motor->w = motor->v + motor->phase_shift; - motor->openLoop = true; - motor->started = FALSE; - - adcStart(&ADCD1, NULL); - adcStartConversion(&ADCD1, &adcgrpcfg, motor->samples, ADC_GRP_BUF_DEPTH); - - motor->p_spi_thread=chThdCreateStatic( - wa_spiThread, - sizeof(wa_spiThread), - NORMALPRIO, - spiThread, - NULL - ); -} - -/** - * @brief Enables the three PWM channels, starting to go through the LUT - * - */ -extern void bldcStart(bldc *pbldc){ - if(pbldc->started){ - return; - } - pwmStart(&PWMD1,&pwmRWcfg); - pwmEnablePeriodicNotification(&PWMD1); - - pwmEnableChannel(&PWMD1,PWM_U,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,motor->u)); - pwmEnableChannel(&PWMD1,PWM_V,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,motor->v)); - pwmEnableChannel(&PWMD1,PWM_W,PWM_PERCENTAGE_TO_WIDTH(&PWMD1,motor->w)); - pbldc->started = TRUE; -} - -/** - * @brief Stops BLDC control - * - */ -extern void bldcStop(bldc *pbldc){ - if(!pbldc->started){ - return; - } - pwmDisableChannel(&PWMD1,PWM_U); - pwmDisableChannel(&PWMD1,PWM_V); - pwmDisableChannel(&PWMD1,PWM_W); - pwmDisablePeriodicNotification(&PWMD1); - pwmStop(&PWMD1); - pbldc->started = FALSE; -} - -/** - * @brief Changes duty cycle for a given channel - * - */ -extern void bldcSetDC(uint8_t channel,uint16_t dc){ - pwmEnableChannelI( - &PWMD1, - channel, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,scale(dc)) - ); -} - -/** - * @ brief Tear down drivers in a sane way. - * - */ -extern void bldcExit(bldc *pbldc){ - if(pbldc->started){ - bldcStop(pbldc); - } - adcStopConversion(&ADCD1); - adcStop(&ADCD1); - chThdTerminate(motor->p_spi_thread); - chThdWait(motor->p_spi_thread); -} diff --git a/src/archive/app_oresat_acs-1.0/source/bldc.h b/src/archive/app_oresat_acs-1.0/source/bldc.h deleted file mode 100644 index 448d5805..00000000 --- a/src/archive/app_oresat_acs-1.0/source/bldc.h +++ /dev/null @@ -1,167 +0,0 @@ -#ifndef _BLDC_H_ -#define _BLDC_H_ - -#include "ch.h" -#include "hal.h" - -#include - -/// TODO: openloop is going away -#define OPENLOOP /// open loop control (oxymoron) - -//#define THREAD_SIZE (1<<7) -/// TODO: had to reduce this to compile with new ADC code -/// We should figure out what an actual good value is -#define THREAD_SIZE (96) - -/// serial debugging -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - - -/** - * TODO: the definitions of STEP, STRETCH, and SKIP - * evolved over the course of various experiments. These - * will completely change in v2.0. Below is their intended and - * eventual meanings. - * - * STEPS: the number of discrete steps in the LUT - * - * STRETCH: How many periods the current LUT value is repeated - * - * SKIP: How many steps are skipped in the LUT to get the next value - * - * SMOOTH: Smoothing out the transition between LUT values by increasing the amount of steps in between - * - * SCALE: Duty cycle scaling factor from 0-100 % - * - */ -#define SCALE 100 -#define STEPS 360 -#define STRETCH 1 -#define SKIP 1 - -/// encoder has 14 bits of precision -#define ENCODER_MAX 1<<14 -/// chunk amount is the number of times through -/// the LUT for 1 revolution of the reaction wheel -#define CHUNK_AMOUNT 6 -/// chunk size is the number -#define CHUNK_SIZE 2730 - -#define PWM_TIMER_FREQ 48e6 /// Hz -#define PWM_FREQ 15e3 /// periods per sec -#define PWM_PERIOD PWM_TIMER_FREQ/PWM_FREQ - -/// PWM signals -#define PWM_U 0U -#define PWM_V 1U -#define PWM_W 2U - -#define ADC_GRP_NUM_CHANNELS 1 -#define ADC_GRP_BUF_DEPTH 8 - -#define sinctrl_t uint16_t - -/** - * @brief The structure that defines and characterizes - * a motor and how it's being control - * - * steps: Steps in the LUT - * - * stretch: How many steps are added in between LUT steps - * - * skip: How many steps are skipped in the LUT - * - * u, v, and w: The three sin signals, that traverse through the LUT - * current_sin_u,v,w and next_sin_u,v,w: Used in calculation of values for stretch - * - * sin_diff: Difference in LUT steps for stretch - * - * position: Position from encode, a value of 0 - 2^14 - * - * openLoop: Controls whether encoder feedback is used - * - * sinctrl: The LUT - * - * spi_rxbuff: Where the encoder position is after SPI transmission - * - * p_spi_thread: Spi thread for the encoder feedback - * - * samples: Samples from the ADC. - * - */ -typedef struct{ - uint16_t count, /// period counter - scale, /// scales the duty cycle - steps, /// number of steps in lut - stretch, - skip; - sinctrl_t u,v,w,/// signals - phase_shift; /// should be by 120 degrees - uint16_t current_sin_u, next_sin_u, - current_sin_v, next_sin_v, - current_sin_w, next_sin_w; - uint8_t stretch_count; - uint8_t sin_diff; - uint16_t position; // motor position from encoder - bool openLoop; - sinctrl_t const *sinctrl; // pointer to the sin lut - uint16_t spi_rxbuf[2]; // receive buffer - thread_t *p_spi_thread; - adcsample_t samples[ADC_GRP_NUM_CHANNELS * ADC_GRP_BUF_DEPTH]; // ADC conversion storage array - int started; -} bldc; - -/** - * @brief The low value used to break up the encoder value into regions - * - * Allows us to translate the encoder 0 - 2^14 into 6 discrete chunks - * of 0-360 for use in the LUT. - * - */ -static const uint16_t chunk_low[6] = { - 0 * CHUNK_SIZE, - 1 * CHUNK_SIZE, - 2 * CHUNK_SIZE, - 3 * CHUNK_SIZE, - 4 * CHUNK_SIZE, - 5 * CHUNK_SIZE -}; - - -/** - * @brief Control structure used to configure the SPI driver - * - * GPIOA_SPI1_NSS is the pin used to initially select the SPI slave. - * The mask for SPI Control Register 1 sets the frequency of data transfers - * and sets the clock polarity. - * The mask for SPI control Register 2 sets the size of the transfer buffer, 16 bits. - * - */ -static const SPIConfig spicfg = { - false, // Not using circular buffer. - NULL, // Not using operation complete callback. - GPIOA, // Chip select line. - GPIOA_SPI1_NSS, // Chip select port. - SPI_CR1_BR_0|SPI_CR1_BR_1|SPI_CR1_BR_2|SPI_CR1_CPHA, // SPI Control Register 1 mask. - SPI_CR2_DS_0|SPI_CR2_DS_1|SPI_CR2_DS_2|SPI_CR2_DS_3, // SPI Control Register 2 mask. -}; - -extern THD_WORKING_AREA(wa_spiThread,THREAD_SIZE); -/// Prototype for spi thread function. -extern THD_FUNCTION(spiThread,arg); - -/// Function prototype with no return type. Takes bldc type as paramater. -extern void bldcInit(bldc *pbldc); -/// Function prototype with no return type. Takes bldc type as paramater. -extern void bldcStart(bldc *pbldc); -/// Function prototype with no return type. Takes bldc type as paramater. -extern void bldcStop(bldc *pbldc); -/// Function prototype with no return type. Takes 8 bit unsigned integer and a -/// 16 bit unsigned integer as argument. -extern void bldcSetDC(uint8_t channel,uint16_t dc); -/// Function prototype with no return type. Takes bldc type as paramater. -extern void bldcExit(bldc *pbldc); - -#endif diff --git a/src/archive/app_oresat_acs-1.0/source/magnetorquer.c b/src/archive/app_oresat_acs-1.0/source/magnetorquer.c deleted file mode 100644 index 90e8af41..00000000 --- a/src/archive/app_oresat_acs-1.0/source/magnetorquer.c +++ /dev/null @@ -1,98 +0,0 @@ -#include "magnetorquer.h" - -/** - * @brief Magnetorquer initialization function. - * - * This function will initialize the driver state to off. - * - */ -extern void mtqrInit(MTQR *mtqr){ - (void)mtqr; - mtqr->started = FALSE; // Initializing state of magnetorquer driver. - palClearPad(GPIOB,ENABLE); // Initializing motor driver state to off. -} - -/** - * @brief Magnetorquer start function. - * - * This function will start the PWM driver and enable - * the STSPIN250 motor driver while providing a - * starting duty cycle. At this point, the state of - * the magnetorquer will be set to true to indicate on - * state. - * - */ -extern void mtqrStart(MTQR *mtqr){ - if(mtqr->started){ // Checking if state is already on. - return; - } - pwmStart(&PWMD1,&pwm_MTQRcfg); // Starting pwm driver. - mtqrSetDC(MTQR_STARTING_DC); // Setting duty cycle of output. - palSetPad(GPIOB,ENABLE); // Turning on motor driver. - mtqr->started = TRUE; // Setting to on state. -} - -/** - * @brief Magnetorquer stop function. - * - * This function will disable the active - * PWM driver and disable the STSPIN250 motor - * driver. - * - */ -extern void mtqrStop(MTQR *mtqr){ - if(!mtqr->started){ // Checking if state is already off. - return; - } - pwmDisableChannel(&PWMD1,PWM_CH_MTQR); // Disabling channel output. - palClearPad(GPIOB,ENABLE); // Shutting off STSPIN250 driver. - pwmStop(&PWMD1); // Stopping PWM driver. - mtqr->started = FALSE; // Changing state to off. -} - -/** - * @brief Magnetorquer set duty cycle function. - * - * This function takes a 16 bit value as parameter and - * sets the duty cycle of the magnetorquer driver using the - * paramater. - * - */ -extern void mtqrSetDC(uint16_t dc){ - pwmEnableChannel( // Setting duty cycle output using paramater. - &PWMD1, - PWM_CH_MTQR, - PWM_PERCENTAGE_TO_WIDTH(&PWMD1,dc) - ); -} - -/** - * @brief Magnetorquer set direction function. - * - * This function sets the phase pin for the STSPIN250 - * motor driver. The phase is set based on the value - * of the paramater given to the function. - * - */ -extern void mtqrSetDir(uint8_t dc){ - if(dc==FORWARD){ // Set phase selection pin based on requested direction. - palClearPad(GPIOA,PH); - }else if(dc==REVERSE){ - palSetPad(GPIOA,PH); - } -} - -/** - * @brief Magnetorquer exit function. - * - * Function to initialize shutdown of driver. - * - */ -extern void mtqrExit(MTQR *mtqr){ - if(!mtqr->started){ // Checking if magnetorquer state is off. - return; - } - mtqrStop(mtqr); // If the state isn't already off, shut down the driver. -} - - diff --git a/src/archive/app_oresat_acs-1.0/source/magnetorquer.h b/src/archive/app_oresat_acs-1.0/source/magnetorquer.h deleted file mode 100644 index 8d7228a7..00000000 --- a/src/archive/app_oresat_acs-1.0/source/magnetorquer.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef _MAGNETORQUER_H_ -#define _MAGNETORQUER_H_ - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#define MTQR_PWM_TIMER_FREQ 2e6 /// PWM Timer frequency -#define MTQR_PWM_FREQ 2e3 /// periods per second - -#define FORWARD 0 -#define REVERSE 1 - -#define MTQR_PWM_PERIOD MTQR_PWM_TIMER_FREQ/MTQR_PWM_FREQ - -#define PWM_CH_MTQR 0 /// pwm channel -#define MTQR_STARTING_DC 5000u /// starting duty cycle -#define PH 9u /// Phase (motor direction) -#define ENABLE GPIOB_EN_MAG /// Chip enable - -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - -/** - * @brief PWMConfig structure for the magnetorquer - * - */ -static const PWMConfig pwm_MTQRcfg = { - MTQR_PWM_TIMER_FREQ, /// Frequency - MTQR_PWM_PERIOD, /// period duration - NULL, /// Callback - { /// Channels - {PWM_OUTPUT_ACTIVE_HIGH,NULL}, - {PWM_OUTPUT_DISABLED,NULL}, - {PWM_OUTPUT_DISABLED,NULL}, - {PWM_OUTPUT_DISABLED,NULL} - }, - 0, - 0, - 0 -}; - -/** - * @brief MTQR structure for keeping state - * TODO: this structure is not being used effectively - * it may or may not be a good design choice - * - */ -typedef struct{ - uint8_t direction; - int started; - uint16_t pwm_dc; /// duty cycle -}MTQR; - -extern void mtqrInit(MTQR *mtqr); -extern void mtqrStart(MTQR *mtqr); -extern void mtqrStop(MTQR *mtqr); -extern void mtqrSetDC(uint16_t dc); -extern void mtqrSetDir(uint8_t dc); -extern void mtqrExit(MTQR *mtqr); - -#endif diff --git a/src/archive/app_oresat_acs-1.0/source/saddle_lut.h b/src/archive/app_oresat_acs-1.0/source/saddle_lut.h deleted file mode 100644 index d9c0e6b8..00000000 --- a/src/archive/app_oresat_acs-1.0/source/saddle_lut.h +++ /dev/null @@ -1,19 +0,0 @@ - -// https://www.nxp.com/docs/en/application-note/AN4869.pdf -const uint8_t SinusoidalWaveTable[384]={ -127,131,135,138,142,145,149,152,155,159,162,165,168,171,174,177,180,183,186,189,192,194,197,200, -202,205,207,210, 212,214,217,219,221,223,225,227,229,231,232,234,236,237,239,240,242,243,244,245, -247,248,249,250,250,251,252,253,253,254,254,255,255,255,255,255,255,255,255,255,255,255,254,254, -253,253,252,252,251,250,249,248,247,246,245,244,242,241,240,238,237,235,233,232,230,228,226,224, -222,222,225,226,228,230,232,234,235,237,238,240,241,243,244,245,246,247,248,249,250,251,252,252, -253,254,254,254,255,255,255,255,255,255,255,255,255,255,254,254,254,253,252,252,251,250,249,248, -247,246,245,244,243,241,240,238,237,235,234,232,230,228,227,225,223,220,218,216,214,212,209,207, -204,202,199,197,194,191,188,185,183,180,177,174,171,167,164,161,158,154,151,148,144,141,137,134, -130,127,123,119,116,112,108,104,101, 97, 93, 89, 85, 81, 77, 73, 69, 65, 61, 57, 53, 49, 45, 41, -36, 32, 28, 24, 20, 16, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 10, 15, 19, 23, 27, 31, -35, 39, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 99,103,107,111,115,118,121,124 diff --git a/src/archive/app_oresat_acs-1.0/source/sin_lut.h b/src/archive/app_oresat_acs-1.0/source/sin_lut.h deleted file mode 100644 index cf888753..00000000 --- a/src/archive/app_oresat_acs-1.0/source/sin_lut.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef _ACS_LUT_H_ -#define _ACS_LUT_H_ - -#include "acs.h" - -const sinctrl_t sinctrl360[360] = { - 5000,5087,5174,5262,5349,5436,5523,5609, - 5696,5782,5868,5954,6040,6125,6210,6294, - 6378,6462,6545,6628,6710,6792,6873,6954, - 7034,7113,7192,7270,7347,7424,7500,7575, - 7650,7723,7796,7868,7939,8009,8078,8147, - 8214,8280,8346,8410,8473,8536,8597,8657, - 8716,8774,8830,8886,8940,8993,9045,9096, - 9145,9193,9240,9286,9330,9373,9415,9455, - 9494,9532,9568,9603,9636,9668,9698,9728, - 9755,9782,9806,9830,9851,9872,9891,9908, - 9924,9938,9951,9963,9973,9981,9988,9993, - 9997,9999,10000,9999,9997,9993,9988,9981, - 9973,9963,9951,9938,9924,9908,9891,9872, - 9851,9830,9806,9782,9755,9728,9698,9668, - 9636,9603,9568,9532,9494,9455,9415,9373, - 9330,9286,9240,9193,9145,9096,9045,8993, - 8940,8886,8830,8774,8716,8657,8597,8536, - 8473,8410,8346,8280,8214,8147,8078,8009, - 7939,7868,7796,7723,7650,7575,7500,7424, - 7347,7270,7192,7113,7034,6954,6873,6792, - 6710,6628,6545,6462,6378,6294,6210,6125, - 6040,5954,5868,5782,5696,5609,5523,5436, - 5349,5262,5174,5087,5000,4913,4826,4738, - 4651,4564,4477,4391,4304,4218,4132,4046, - 3960,3875,3790,3706,3622,3538,3455,3372, - 3290,3208,3127,3046,2966,2887,2808,2730, - 2653,2576,2500,2425,2350,2277,2204,2132, - 2061,1991,1922,1853,1786,1720,1654,1590, - 1527,1464,1403,1343,1284,1226,1170,1114, - 1060,1007,955,904,855,807,760,714, - 670,627,585,545,506,468,432,397, - 364,332,302,272,245,218,194,170, - 149,128,109,92,76,62,49,37, - 27,19,12,7,3,1,0,1, - 3,7,12,19,27,37,49,62, - 76,92,109,128,149,170,194,218, - 245,272,302,332,364,397,432,468, - 506,545,585,627,670,714,760,807, - 855,904,955,1007,1060,1114,1170,1226, - 1284,1343,1403,1464,1527,1590,1654,1720, - 1786,1853,1922,1991,2061,2132,2204,2277, - 2350,2425,2500,2576,2653,2730,2808,2887, - 2966,3046,3127,3208,3290,3372,3455,3538, - 3622,3706,3790,3875,3960,4046,4132,4218, - 4304,4391,4477,4564,4651,4738,4826,4913 -}; - -#endif diff --git a/src/archive/app_oresat_acs-2.0/Makefile b/src/archive/app_oresat_acs-2.0/Makefile deleted file mode 100644 index 6b12dc59..00000000 --- a/src/archive/app_oresat_acs-2.0/Makefile +++ /dev/null @@ -1,205 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_oresat_acs - -# Target settings. -MCU = cortex-m4 -BOARD = ST_NUCLEO64_F446RE - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_oresat_acs-2.0/README.md b/src/archive/app_oresat_acs-2.0/README.md deleted file mode 100644 index 55f3c8e2..00000000 --- a/src/archive/app_oresat_acs-2.0/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# app_template - -This is the template app for new applications. - -To create a new app, simply copy the app_template directory and name it whatever you like. - -``` -cp -R app_template app_ -``` - -If building for a specific board, update the `BOARD =` line to the board -defined in the `boards` directory - -Then, open the Makefile and edit the line `PROJECT =` to whatever name you chose: -``` -PROJECT = app_ -``` diff --git a/src/archive/app_oresat_acs-2.0/cfg/chconf.h b/src/archive/app_oresat_acs-2.0/cfg/chconf.h deleted file mode 100644 index 8e12427c..00000000 --- a/src/archive/app_oresat_acs-2.0/cfg/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_oresat_acs-2.0/cfg/halconf.h b/src/archive/app_oresat_acs-2.0/cfg/halconf.h deleted file mode 100644 index 44d5840c..00000000 --- a/src/archive/app_oresat_acs-2.0/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_oresat_acs-2.0/cfg/mcuconf.h b/src/archive/app_oresat_acs-2.0/cfg/mcuconf.h deleted file mode 100644 index e7f13ef3..00000000 --- a/src/archive/app_oresat_acs-2.0/cfg/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_oresat_acs-2.0/main.c b/src/archive/app_oresat_acs-2.0/main.c deleted file mode 100644 index a9644a74..00000000 --- a/src/archive/app_oresat_acs-2.0/main.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -//=== ChibiOS header files -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -//=== Project header files -#include "oresat.h" - -#include "thread1.h" - -//=== Serial configuration -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -static void app_init(void) { - //=== App initialization - - // Start up debug output - sdStart(&SD2, &ser_cfg); - -} - -static void main_app(void) { - //=== Start application threads - - //Example thread creation - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Begin main loop - */ - while (true) - { - chThdSleepMilliseconds(1000); - } -} - -int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - oresat_init(0); - - // Initialize and start app - app_init(); - main_app(); - - return 0; -} diff --git a/src/archive/app_oresat_acs-2.0/source/README.md b/src/archive/app_oresat_acs-2.0/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/archive/app_oresat_acs-2.0/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_oresat_acs-2.0/source/thread1.c b/src/archive/app_oresat_acs-2.0/source/thread1.c deleted file mode 100644 index 031e4904..00000000 --- a/src/archive/app_oresat_acs-2.0/source/thread1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "thread1.h" - -// Example blinker thread -THD_WORKING_AREA(waThread1, 128); -THD_FUNCTION(Thread1, arg) { - - (void)arg; - chRegSetThreadName("thread1"); - - while (!chThdShouldTerminateX()) { - palClearLine(LINE_LED_GREEN); - chThdSleepMilliseconds(500); - palSetLine(LINE_LED_GREEN); - chThdSleepMilliseconds(500); - } -} diff --git a/src/archive/app_oresat_acs-2.0/source/thread1.h b/src/archive/app_oresat_acs-2.0/source/thread1.h deleted file mode 100644 index 32f225d5..00000000 --- a/src/archive/app_oresat_acs-2.0/source/thread1.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _THREAD1_H_ -#define _THREAD1_H_ - -#include "ch.h" -#include "hal.h" - -// Example blinker thread prototypes -extern THD_WORKING_AREA(waThread1, 128); -extern THD_FUNCTION(Thread1, arg); - -#endif diff --git a/src/archive/app_protodemo/Makefile b/src/archive/app_protodemo/Makefile deleted file mode 100644 index d5ff8b73..00000000 --- a/src/archive/app_protodemo/Makefile +++ /dev/null @@ -1,205 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x200 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x200 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_protodemo - -# Target settings. -MCU = cortex-m0 -BOARD = ST_NUCLEO32_F042K6 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f0xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F0xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F042x6.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_protodemo/README.md b/src/archive/app_protodemo/README.md deleted file mode 100644 index 55f3c8e2..00000000 --- a/src/archive/app_protodemo/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# app_template - -This is the template app for new applications. - -To create a new app, simply copy the app_template directory and name it whatever you like. - -``` -cp -R app_template app_ -``` - -If building for a specific board, update the `BOARD =` line to the board -defined in the `boards` directory - -Then, open the Makefile and edit the line `PROJECT =` to whatever name you chose: -``` -PROJECT = app_ -``` diff --git a/src/archive/app_protodemo/cfg/chconf.h b/src/archive/app_protodemo/cfg/chconf.h deleted file mode 100644 index 6f3b51a9..00000000 --- a/src/archive/app_protodemo/cfg/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM FALSE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_protodemo/cfg/halconf.h b/src/archive/app_protodemo/cfg/halconf.h deleted file mode 100644 index 534c4bb6..00000000 --- a/src/archive/app_protodemo/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_protodemo/cfg/mcuconf.h b/src/archive/app_protodemo/cfg/mcuconf.h deleted file mode 100644 index 38b66f58..00000000 --- a/src/archive/app_protodemo/cfg/mcuconf.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_HSI48_ENABLED FALSE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_SYSCLK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_PLLNODIV STM32_PLLNODIV_DIV2 -#define STM32_USBSW STM32_USBSW_HSI48 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_HSI -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI16_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI17_20_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI21_22_IRQ_PRIORITY 3 -#define STM32_IRQ_USART1_PRIORITY 3 -#define STM32_IRQ_USART2_PRIORITY 3 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_CKMODE STM32_ADC_CKMODE_ADCCLK -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 -#define STM32_GPT_TIM14_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_IRQ_PRIORITY 3 -#define STM32_I2C_USE_DMA TRUE -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI1 FALSE -#define STM32_I2S_SPI1_MODE (STM32_I2S_MODE_MASTER | \ - STM32_I2S_MODE_RX) -#define STM32_I2S_SPI1_IRQ_PRIORITY 2 -#define STM32_I2S_SPI1_DMA_PRIORITY 1 -#define STM32_I2S_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2S_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 2 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_protodemo/main.c b/src/archive/app_protodemo/main.c deleted file mode 100644 index cea09826..00000000 --- a/src/archive/app_protodemo/main.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -//=== ChibiOS header files -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -//=== Project header files -#include "oresat.h" - -//=== Serial configuration -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -static void app_init(void) { - //=== App initialization - - // Start up debug output - sdStart(&SD2, &ser_cfg); - -} - -static void main_app(void) { - //=== Start application threads - - - /* - * Begin main loop - */ - while (true) - { - chprintf((BaseSequentialStream*)&SD2, "OreSat Protocard V1.1!\r\n"); - palClearLine(LINE_LED_GREEN); - chThdSleepMilliseconds(500); - palSetLine(LINE_LED_GREEN); - chThdSleepMilliseconds(500); - } -} - -int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - oresat_init(0); - - // Initialize and start app - app_init(); - main_app(); - - return 0; -} diff --git a/src/archive/app_protodemo/source/README.md b/src/archive/app_protodemo/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/archive/app_protodemo/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_radio/Makefile b/src/archive/app_radio/Makefile deleted file mode 100644 index 605c95e7..00000000 --- a/src/archive/app_radio/Makefile +++ /dev/null @@ -1,206 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = hard -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_radio - -# Target settings. -MCU = cortex-m4 -BOARD = ORESAT_C3_V3 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -#include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -include $(CHIBIOS)/test/lib/test.mk -include $(CHIBIOS)/test/rt/rt_test.mk -include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk -include $(CHIBIOS)/os/various/shell/shell.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -DSHELL_CONFIG_FILE -DAX5043_SHARED_SPI - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_radio/README.md b/src/archive/app_radio/README.md deleted file mode 100644 index fbb1fadd..00000000 --- a/src/archive/app_radio/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# app_sx1236_ax5043_HDLC_FEC_tx - -This is used to transmit sax5043 radio packets signal. -This creates a instruction packet at 435.5 MhZ in a fixed interval. This code simulates ground. This pairs with " app_sx1236_FulDuplex_oresat " which receives the instruction and responds with data. the sent and received packet are shown in serial terminal. - diff --git a/src/archive/app_radio/cfg/CO_driver_custom.h b/src/archive/app_radio/cfg/CO_driver_custom.h deleted file mode 100644 index d2edd33e..00000000 --- a/src/archive/app_radio/cfg/CO_driver_custom.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef CO_DRIVER_CUSTOM_H -#define CO_DRIVER_CUSTOM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* TODO: These should be in CO_OD.h, but libedssharp does not support this yet */ -#define CO_NO_GFC 0 -#define CO_NO_SRDO 0 - -#define CO_CONFIG_SDO_CLI (CO_CONFIG_FLAG_CALLBACK_PRE | \ - CO_CONFIG_FLAG_TIMERNEXT | \ - CO_CONFIG_SDO_CLI_SEGMENTED | \ - CO_CONFIG_SDO_CLI_BLOCK | \ - CO_CONFIG_SDO_CLI_LOCAL) - -#define CO_CONFIG_GTW (CO_CONFIG_GTW_ASCII | \ - CO_CONFIG_GTW_ASCII_SDO | \ - CO_CONFIG_GTW_ASCII_NMT | \ - CO_CONFIG_GTW_ASCII_LOG | \ - CO_CONFIG_GTW_ASCII_ERROR_DESC | \ - CO_CONFIG_GTW_ASCII_PRINT_HELP) -#define CO_CONFIG_GTW_BLOCK_DL_LOOP 1 -#define CO_CONFIG_GTWA_COMM_BUF_SIZE 2000 -#define CO_CONFIG_GTWA_LOG_BUF_SIZE 2000 - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CO_DRIVER_CUSTOM_H */ diff --git a/src/archive/app_radio/cfg/chconf.h b/src/archive/app_radio/cfg/chconf.h deleted file mode 100644 index 53dfa662..00000000 --- a/src/archive/app_radio/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_radio/cfg/halconf.h b/src/archive/app_radio/cfg/halconf.h deleted file mode 100644 index 8177d35c..00000000 --- a/src/archive/app_radio/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS TRUE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_LINE -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_radio/cfg/mcuconf.h b/src/archive/app_radio/cfg/mcuconf.h deleted file mode 100644 index 1e200710..00000000 --- a/src/archive/app_radio/cfg/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 16 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 8 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 8 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 8 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSE -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 TRUE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_radio/cfg/shellconf.h b/src/archive/app_radio/cfg/shellconf.h deleted file mode 100644 index c31de933..00000000 --- a/src/archive/app_radio/cfg/shellconf.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef SHELLCONF_H -#define SHELLCONF_H - -#define SHELL_MAX_ARGUMENTS 10 -#define SHELL_USE_HISTORY TRUE -#define SHELL_USE_ESC_SEQ TRUE -#define SHELL_PROMPT_STR "OreSat> " - -#endif diff --git a/src/archive/app_radio/main.c b/src/archive/app_radio/main.c deleted file mode 100644 index f6bd0792..00000000 --- a/src/archive/app_radio/main.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/*************************************************** - * Modification Log - * 04/15/2018 Malay Das Initial Code. - * 08/09/2019 Malay Das Initial Driver. - * 08/23/2019 Malay Das Add mailbox functionality. - ***************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "shell.h" - -#include "chprintf.h" -#include "ax5043.h" - - -//#include "adf7030.h" - -#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(2048) - -ax5043_address_t remoteaddr = { - { 0x33, 0x34, 0x00, 0x00} -}; -ax5043_address_mask_t localaddr = { - { 0x33, 0x34, 0x00, 0x00}, - { 0xFF, 0x00, 0x00, 0x00} // make it { 0x00, 0x00, 0x00, 0x00} to receive AX25 packets -}; - -ax5043_regval_t reg_values[] = { - {AX5043_REG_MODULATION, 0x08}, - {AX5043_REG_ENCODING, 0x07}, - {AX5043_REG_FRAMING, 0x14}, - //{AX5043_REG_FEC, 0x13}, - {AX5043_REG_CRCINIT3, 0x00}, - {AX5043_REG_CRCINIT2, 0x00}, - {AX5043_REG_CRCINIT1, 0xFF}, - {AX5043_REG_CRCINIT0, 0xFF}, - {AX5043_REG_PINFUNCSYSCLK, 0x01}, - {AX5043_REG_PINFUNCDCLK, 0x01}, - {AX5043_REG_PINFUNCDATA, 0x01}, - {AX5043_REG_PINFUNCANTSEL, 0x01}, - {AX5043_REG_PINFUNCPWRAMP, 0x07}, - {AX5043_REG_WAKEUPXOEARLY, 0x01}, - {AX5043_REG_IFFREQ1, 0x02}, - {AX5043_REG_IFFREQ0, 0x0C}, - {AX5043_REG_DECIMATION, 0x14}, - {AX5043_REG_RXDATARATE2, 0x00}, - {AX5043_REG_RXDATARATE1, 0x3E}, - {AX5043_REG_RXDATARATE0, 0x80}, - {AX5043_REG_MAXDROFFSET2, 0x00}, - {AX5043_REG_MAXDROFFSET1, 0x00}, - {AX5043_REG_MAXDROFFSET0, 0x00}, - {AX5043_REG_MAXRFOFFSET2, 0x80}, - {AX5043_REG_MAXRFOFFSET1, 0x01}, - {AX5043_REG_MAXRFOFFSET0, 0x2F}, - {AX5043_REG_FSKDMAX1, 0x00}, - {AX5043_REG_FSKDMAX0, 0xA6}, - {AX5043_REG_FSKDMIN1, 0xFF}, - {AX5043_REG_FSKDMIN0, 0x5A}, - {AX5043_REG_AMPLFILTER, 0x00}, - {AX5043_REG_RXPARAMSETS, 0xF4}, - {AX5043_REG_AGCGAIN0, 0xC5}, - {AX5043_REG_AGCTARGET0, 0x84}, - {AX5043_REG_TIMEGAIN0, 0xF8}, - {AX5043_REG_DRGAIN0, 0xF2}, - {AX5043_REG_PHASEGAIN0, 0xC3}, - {AX5043_REG_FREQUENCYGAINA0,0x0F}, - {AX5043_REG_FREQUENCYGAINB0,0x1F}, - {AX5043_REG_FREQUENCYGAINC0,0x0A}, - {AX5043_REG_FREQUENCYGAIND0,0x0A}, - {AX5043_REG_AMPLITUDEGAIN0, 0x06}, - {AX5043_REG_FREQDEV10, 0x00}, - {AX5043_REG_FREQDEV00, 0x00}, - {AX5043_REG_BBOFFSRES0, 0x00}, - {AX5043_REG_AGCGAIN1, 0xC5}, - {AX5043_REG_AGCTARGET1, 0x84}, - {AX5043_REG_AGCAHYST1, 0x00}, - {AX5043_REG_AGCMINMAX1, 0x00}, - {AX5043_REG_TIMEGAIN1, 0xF6}, - {AX5043_REG_DRGAIN1, 0xF1}, - {AX5043_REG_PHASEGAIN1, 0xC3}, - {AX5043_REG_FREQUENCYGAINA1,0x0F}, - {AX5043_REG_FREQUENCYGAINB1,0x1F}, - {AX5043_REG_FREQUENCYGAINC1,0x0A}, - {AX5043_REG_FREQUENCYGAIND1,0x0A}, - {AX5043_REG_AMPLITUDEGAIN1, 0x06}, - {AX5043_REG_FREQDEV11, 0x00}, - {AX5043_REG_FREQDEV01, 0x25}, - {AX5043_REG_FOURFSK1, 0x16}, - {AX5043_REG_BBOFFSRES1, 0x00}, - {AX5043_REG_AGCGAIN3, 0xFF}, - {AX5043_REG_AGCTARGET3, 0x84}, - {AX5043_REG_AGCAHYST3, 0x00}, - {AX5043_REG_AGCMINMAX3, 0x00}, - {AX5043_REG_TIMEGAIN3, 0xF5}, - {AX5043_REG_DRGAIN3, 0xF0}, - {AX5043_REG_PHASEGAIN3, 0xC3}, - {AX5043_REG_FREQUENCYGAINA3,0x0F}, - {AX5043_REG_FREQUENCYGAINB3,0x1F}, - {AX5043_REG_FREQUENCYGAINC3,0x0D}, - {AX5043_REG_FREQUENCYGAIND3,0x0D}, - {AX5043_REG_AMPLITUDEGAIN3, 0x06}, - {AX5043_REG_FREQDEV13, 0x00}, - {AX5043_REG_FREQDEV03, 0x25}, - {AX5043_REG_FOURFSK3, 0x16}, - {AX5043_REG_BBOFFSRES3, 0x00}, - {AX5043_REG_MODCFGF, 0x02}, - {AX5043_REG_FSKDEV2, 0x00}, - {AX5043_REG_FSKDEV1, 0x04}, - {AX5043_REG_FSKDEV0, 0x5E}, - {AX5043_REG_MODCFGA, 0x05}, - {AX5043_REG_TXRATE2, 0x00}, - {AX5043_REG_TXRATE1, 0x0D}, - {AX5043_REG_TXRATE0, 0x1B}, - {AX5043_REG_TXPWRCOEFFB1, 0x07}, - {AX5043_REG_TXPWRCOEFFB0, 0x00}, - {AX5043_REG_PLLVCOI, 0x99}, - {AX5043_REG_PLLRNGCLK, 0x05}, - {AX5043_REG_BBTUNE, 0x0F}, - {AX5043_REG_BBOFFSCAP, 0x77}, - {AX5043_REG_PKTADDRCFG, 0x00}, - {AX5043_REG_PKTLENCFG, 0x00}, - {AX5043_REG_PKTLENOFFSET, 0x15}, - {AX5043_REG_PKTMAXLEN, 0xF0}, - {AX5043_REG_MATCH0PAT3, 0xAA}, - {AX5043_REG_MATCH0PAT2, 0xCC}, - {AX5043_REG_MATCH0PAT1, 0xAA}, - {AX5043_REG_MATCH0PAT0, 0xCC}, - //{AX5043_REG_MATCH0LEN, 0x9F}, - //{AX5043_REG_MATCH0MAX, 0x1F}, - {AX5043_REG_MATCH1PAT1, 0x55}, - {AX5043_REG_MATCH1PAT0, 0x55}, - {AX5043_REG_MATCH1LEN, 0x0A}, - {AX5043_REG_MATCH1MAX, 0x0A}, - {AX5043_REG_TMGTXBOOST, 0x5B}, - {AX5043_REG_TMGTXSETTLE, 0x3E}, - {AX5043_REG_TMGRXBOOST, 0x5B}, - {AX5043_REG_TMGRXSETTLE, 0x3E}, - {AX5043_REG_TMGRXOFFSACQ, 0x00}, - {AX5043_REG_TMGRXCOARSEAGC, 0x9C}, - {AX5043_REG_TMGRXRSSI, 0x03}, - {AX5043_REG_TMGRXPREAMBLE2, 0x17}, - {AX5043_REG_RSSIABSTHR, 0xE3}, - {AX5043_REG_BGNDRSSITHR, 0x00}, - {AX5043_REG_PKTCHUNKSIZE, 0x0D}, - {AX5043_REG_PKTACCEPTFLAGS, 0x39}, //original 20, 3f=accept all errors - {AX5043_REG_DACVALUE1, 0x00}, - {AX5043_REG_DACVALUE0, 0x00}, - {AX5043_REG_DACCONFIG, 0x00}, - {AX5043_REG_REF, 0x03}, - {AX5043_REG_XTALOSC, 0x04}, - {AX5043_REG_XTALAMPL, 0x00}, - {AX5043_REG_0xF1C, 0x07}, - {AX5043_REG_0xF21, 0x68}, - {AX5043_REG_0xF22, 0XFF}, - {AX5043_REG_0xF23, 0x84}, - {AX5043_REG_0xF26, 0x98}, - {AX5043_REG_0xF34, 0x28}, - {AX5043_REG_0xF35, 0x11}, - {AX5043_REG_0xF44, 0x25}, - {AX5043_REG_PINFUNCIRQ, 0x03}, - {AX5043_REG_PKTSTOREFLAGS, 0x14}, - {0x00, 0x00} -}; - -uint8_t ax5043_rxbuffer[256]; //buffer to receive radio data - -const uint8_t demo_packet[] = { 0x86, 0xA2, 0x40, 0x40, 0x40, 0x40, 0x60, 0x96, 0x8E, 0x6E, 0xB4, 0xAC, 0xAC, 0x61, 0x3F, 0xF0, 0x3E, 0x54, 0x65, 0x73, 0x74 }; - -char cw_message[] = "KG7ZVV Malay Das testing AX5043"; -//const uint8_t framing_insert_counter = 1; //uncomment for normal packets -const uint8_t framing_counter_pos = 0; -const uint8_t framing_insert_counter = 0; //uncomment for Ax.25 packets - - -//mailboxes to receive the radio packets -#define NUM_BUFFERS 16 - -static msg_t radio1_rx_queue[NUM_BUFFERS]; -static mailbox_t radio1_rx_mb; -static msg_t radio2_rx_queue[NUM_BUFFERS]; -static mailbox_t radio2_rx_mb; - - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - -/* - * Receive and Transmit SPI Configurations - */ -static const SPIConfig spicfg1 = -{ - false, - NULL, // Operation complete callback - LINE_AX1_CS, - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - -static const SPIConfig spicfg2 = -{ - false, - NULL, // Operation complete callback - LINE_AX2_CS, - // SPI cr1 data (see 446 ref man.) - SPI_CR1_SPE | // SPI enable - SPI_CR1_MSTR | // Master - //SPI_CR1_BR_2 | - SPI_CR1_BR_1 | - SPI_CR1_BR_0 | // fpclk/16 approx 5Mhz? BR = 0x011 - SPI_CR1_SSM, - 0, // SPI_CR2_SSOE, -}; - - - -static AX5043Config axcfg1 = -{ - &SPID1, - &spicfg1, - LINE_AX1_IRQ, - reg_values, - &radio1_rx_mb, - remoteaddr.addr, - localaddr.addr, - localaddr.mask -}; - -static AX5043Config axcfg2 = -{ - &SPID2, - &spicfg2, - LINE_AX2_IRQ, - reg_values, - &radio2_rx_mb, - remoteaddr.addr, - localaddr.addr, - localaddr.mask -}; - - -static AX5043Driver axd1; -static AX5043Driver axd2; - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - sdStart(&SD2, &ser_cfg); - - /* Creating the mailboxes.*/ - chMBObjectInit(&radio1_rx_mb, radio1_rx_queue, NUM_BUFFERS); - chMBObjectInit(&radio2_rx_mb, radio2_rx_queue, NUM_BUFFERS); - - ax5043Start(&axd1, &axcfg1); -} - - - - - -THD_WORKING_AREA(waAx5043_tx_thd, 1024); -THD_FUNCTION(ax5043_tx_thd, arg) -{ - (void)arg; - uint16_t pkt_counter = 0; - uint8_t ret_value[3]={0,0,0}; - - chThdSleepMilliseconds(500); - - -/* //This is for packet - for (;;) { - static uint8_t demo_packet_[sizeof(demo_packet)]; - //uint16_t pkt_counter = 0; - - ++pkt_counter; - memcpy(demo_packet_, demo_packet, sizeof(demo_packet)); - if (framing_insert_counter) { - demo_packet_[framing_counter_pos] = (uint8_t)(pkt_counter & 0xFF); - demo_packet_[framing_counter_pos+1] = (uint8_t)((pkt_counter>>8) & 0xFF); - } - - chprintf((BaseSequentialStream *)&SD2,"INFO: Sending packet %d\r\n",pkt_counter); - ax5043_radio2_packet_tx(&ax5043_driver, demo_packet_, sizeof(demo_packet)); - - chThdSleepMilliseconds(5000); - } - */ - - // This is for CW - - - for (;;) { - chprintf((BaseSequentialStream *)&SD2,"INFO: Sending CW %d\r\n", sizeof(cw_message)); - - /*ax5043_radio2_cw_tx(&ax1d, cw_message, sizeof(cw_message));*/ - - chThdSleepMilliseconds(500); - } - -} - - -THD_WORKING_AREA(waradio1_rx, 1024); -THD_FUNCTION(radio1_rx, arg) -{ - (void)arg; - - while (true) { - msg_t pbuf; - /* Waiting for radio1 rx buffer.*/ - msg_t msg = chMBFetchTimeout(&radio1_rx_mb, &pbuf, TIME_MS2I(10000)); - if (msg == MSG_OK) - chprintf((BaseSequentialStream *)&SD2,"INFO: rx on radio 1\r\n"); - } - -} - -THD_WORKING_AREA(waradio2_rx, 1024); -THD_FUNCTION(radio2_rx, arg) -{ - (void)arg; - - while (true) { - msg_t pbuf; - /* Waiting for radio1 rx buffer.*/ - msg_t msg = chMBFetchTimeout(&radio2_rx_mb, &pbuf, TIME_MS2I(10000)); - if (msg == MSG_OK) - chprintf((BaseSequentialStream *)&SD2,"INFO: rx on radio 2\r\n"); - } - -} - -/* - * shell commands - */ -static void mmd(BaseSequentialStream *chp, int argc, char *argv[]) { - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mmd\r\n"); - return; - } - - chprintf(chp, "testing\r\n"); -} - - -static const ShellCommand commands[] = { - {"mmd", mmd}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/* - * Entry to our code - */ -int main(void) -{ - thread_t *shelltp1; - - halInit(); - chSysInit(); - app_init(); - - ax5043ObjectInit(&axd1); - chThdSleepMilliseconds(5000); - chThdCreateStatic(waAx5043_tx_thd, sizeof(waAx5043_tx_thd), NORMALPRIO,ax5043_tx_thd, NULL); - chThdCreateStatic(waradio1_rx, sizeof(waradio1_rx), NORMALPRIO,radio1_rx, NULL); - chThdCreateStatic(waradio2_rx, sizeof(waradio2_rx), NORMALPRIO,radio2_rx, NULL); - - /* - * Shell manager initialization. - * Event zero is shell exit. - */ - shellInit(); - while (true) { - shelltp1 = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, - "shell1", NORMALPRIO + 1, - shellThread, (void *)&shell_cfg1); - chThdWait(shelltp1); - } - return 0; -} diff --git a/src/archive/app_radio/morse.c b/src/archive/app_radio/morse.c deleted file mode 100644 index 61830afa..00000000 --- a/src/archive/app_radio/morse.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -The code here refers to logic and snippets from Adam Parker - KD5OOL -*/ - -#include -#include - - -#include "ch.h" -#include "hal.h" - -#include "morse.h" -#include "ax5043.h" - - -//#define MAX_MESSAGE_SIZE 512 -//char beaconMessage[MAX_MESSAGE_SIZE]; -uint16_t ditLength; - -/** - * @brief Morse code for alphabet and numbers. - */ -static const char *alpha[] = { - ".-", //A - "-...", //B - "-.-.", //C - "-..", //D - ".", //E - "..-.", //F - "--.", //G - "....", //H - "..", //I - ".---", //J - "-.-", //K - ".-..", //L - "--", //M - "-.", //N - "---", //O - ".--.", //P - "--.-", //Q - ".-.", //R - "...", //S - "-", //T - "..-", //U - "...-", //V - ".--", //W - "-..-", //X - "-.--", //Y - "--..", //Z -}; - -static const char *num[] = { - "-----", //0 - ".----", //1 - "..---", //2 - "...--", //3 - "....-", //4 - ".....", //5 - "-....", //6 - "--...", //7 - "---..", //8 - "----.", //9 -}; - -void SendDot(SPIDriver * spip) -{ - - uint8_t ret_value[3]={0,0,0}; - - ax5043_full_tx(spip); - //chprintf(DEBUG_CHP, "Dot\r\n"); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x00), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value);//preamble - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - chThdSleepMilliseconds(DIT_MS); - ax5043_standby(spip); - -} - -void SendDash(SPIDriver * spip) -{ - - uint8_t ret_value[3]={0,0,0}; - - ax5043_full_tx(spip); - //chprintf(DEBUG_CHP, "Dash\r\n"); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x00), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xFF, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, ret_value);//preamble - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - chThdSleepMilliseconds(DASH_MS); - ax5043_standby(spip); -} - -void LetterSleep(void) -{ - chThdSleepMilliseconds(LETTER_SPACE_MS); -} - -void WordSleep(void) -{ - chThdSleepMilliseconds(WORD_SPACE_MS); -} - -void ElementSleep(void) -{ - chThdSleepMilliseconds(DIT_MS); -} - -//sets ditLength in ms -void SetWpm(int wpm) -{ - ditLength = 1200/wpm; -} - -/* -void SetMessage(char *message) -{ - memset(beaconMessage, 0, MAX_MESSAGE_SIZE); - int len = strlen(message); - if (strlen(message) >= MAX_MESSAGE_SIZE) - len = MAX_MESSAGE_SIZE-1; - memcpy(beaconMessage, message, len); -} -*/ - -const char *AsciiToMorse(char letter) -{ - letter = tolower(letter); - - if (isalpha(letter)) - { - return alpha[letter-'a']; - } - else if (isdigit(letter)) - { - return num[letter-'0']; - } - - return SPACE; -} - - -void SendMessage(SPIDriver * spip, char beaconMessage[], uint16_t pktlen ) -{ - int element; - int index = 0; - const char *morse; - while (index < pktlen) - { - morse = AsciiToMorse(beaconMessage[index]); - - element = 0; - while (morse[element] != '\0') - { - switch(morse[element]) - { - case '-': - SendDash(spip); - break; - case '.': - SendDot(spip); - break; - } - - if (morse[element] == ' ') - { - WordSleep(); - } - else if (morse[element+1] != '\0') - { - ElementSleep(); - } - else if (morse[element+1] == '\0') - { - LetterSleep(); - } - element++; - } - - index++; - //chprintf(DEBUG_CHP, ".. \r\n"); - } -} - diff --git a/src/archive/app_radio/morse.h b/src/archive/app_radio/morse.h deleted file mode 100644 index 513dfbb9..00000000 --- a/src/archive/app_radio/morse.h +++ /dev/null @@ -1,28 +0,0 @@ - -#ifndef _MORSE_H_ -#define _MORSE_H_ - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#define SPACE " " - - -#define LETTER_SPACE_MS (ditLength*3) -#define WORD_SPACE_MS (ditLength*7) -#define DIT_MS (ditLength) -#define DASH_MS (ditLength*3) - - - -void SendDot(SPIDriver * spip); -void SendDash(SPIDriver * spip); -void LetterSleep(void); -void WordSleep(void); -void ElementSleep(void); -void SetWpm(int wpm); -//void SetMessage(char *message); -//void SendMessage(SPIDriver * spip); -void SendMessage(SPIDriver * spip, char beaconMessage[], uint16_t pktlen ); - -#endif diff --git a/src/archive/app_radio/radio.c b/src/archive/app_radio/radio.c deleted file mode 100644 index 90a1913b..00000000 --- a/src/archive/app_radio/radio.c +++ /dev/null @@ -1,356 +0,0 @@ -/*! \file ax5043_driver.c */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include "ch.h" -#include "hal.h" - -#include "ax5043.h" -#include "ax5043_init.h" -#include "ax5043_driver.h" -#include "morse.h" - - -/** - * Change AX5043 radio1 configuraion. - * @param ax5043_driver_p: Radio driver, config: The set-up file details. - * @return Success or error code. - */ -uint8_t ax5043_radio1_chg_config(ax5043_drv_t *ax5043_driver_p, ax5043_config_t * config_p) -{ - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem1, TIME_MS2I(120)); - ax5043_init(ax5043_driver_p->ax5043_spip1, config_p); - - switch(ax5043_driver_p->ax5043_mode1) { - case ax5043_rx: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip1, config_p); - break; - case ax5043_tx: - ax5043_prepare_tx(ax5043_driver_p->ax5043_spip1, config_p); - break; - case ax5043_off: - ax5043_shutdown(ax5043_driver_p->ax5043_spip1); - default: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip1, config_p); - } - ax5043_set_addr(ax5043_driver_p->ax5043_spip1, config_p->localaddr); - ax5043_driver_p->ax5043_config1 = config_p; - chBSemSignal(ax5043_driver_p->ax5043_bsem1); - return 0; - -} - -/** - * Change AX5043 radio2 configuraion. - * @param ax5043_driver_p: Radio driver, config: The set-up file details. - * @return Success or error code. - */ -uint8_t ax5043_radio2_chg_config(ax5043_drv_t *ax5043_driver_p, ax5043_config_t config) -{ - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem2, TIME_MS2I(120)); - ax5043_init(ax5043_driver_p->ax5043_spip2, config); - - switch(ax5043_driver_p->ax5043_mode2) { - case ax5043_rx: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip2, config_p); - break; - case ax5043_tx: - ax5043_prepare_tx(ax5043_driver_p->ax5043_spip2, config_p); - break; - case ax5043_off: - ax5043_shutdown(ax5043_driver_p->ax5043_spip2); - default: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip2, config_p); - } - ax5043_set_addr(ax5043_driver_p->ax5043_spip2, config_p->localaddr); - ax5043_driver_p->ax5043_config2 = config_p; - chBSemSignal(ax5043_driver_p->ax5043_bsem2); - return 0; - -} - - - -/** - * Change AX5043 radio1 mode (rx, tx, off). - * @param ax5043_driver_p: Radio driver, mode: rx, tx, off. - * @return Success or error code. - */ -uint8_t ax5043_radio1_mode(ax5043_drv_t *ax5043_driver_p, ax5043_mode_t mode) -{ - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem1, TIME_MS2I(120)); - switch(mode) { - case ax5043_rx: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1); - break; - case ax5043_tx: - ax5043_prepare_tx(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1); - break; - case ax5043_off: - ax5043_shutdown(ax5043_driver_p->ax5043_spip1); - default: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1); - } - ax5043_driver_p->ax5043_mode1 = mode; - chBSemSignal(ax5043_driver_p->ax5043_bsem1); - return 0; - -} - - - -/** - * Change AX5043 radio2 mode (rx, tx, off). - * @param ax5043_driver_p: Radio driver, mode: rx, tx, off. - * @return Success or error code. - */ -uint8_t ax5043_radio2_mode(ax5043_drv_t *ax5043_driver_p, ax5043_mode_t mode) -{ - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem2, TIME_MS2I(120)); - switch(mode) { - case ax5043_rx: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip2, ax5043_driver_p->ax5043_config2); - break; - case ax5043_tx: - ax5043_prepare_tx(ax5043_driver_p->ax5043_spip2, ax5043_driver_p->ax5043_config2); - break; - case ax5043_off: - ax5043_shutdown(ax5043_driver_p->ax5043_spip2); - default: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip2, ax5043_driver_p->ax5043_config2); - } - ax5043_driver_p->ax5043_mode2 = mode; - chBSemSignal(ax5043_driver_p->ax5043_bsem2); - return 0; - -} - - -/** - * Receive packets from AX5043 radio1. - * @param ax5043_driver_p: Radio driver. - * @return The function is an infinite loop waiting to receive data from radio. - */ -uint8_t ax5043_radio1_rx(ax5043_drv_t *ax5043_driver_p) -{ - uint8_t ax5043_rxbuffer[256]; //buffer to receive radio data - uint8_t packet_len=0; - palEnableLineEvent(ax5043_driver_p->ax5043_int1, PAL_EVENT_MODE_RISING_EDGE); - - - - while(true) - { - palWaitLineTimeout(ax5043_driver_p->ax5043_int1, TIME_MS2I(5000)); - - if (ax5043_driver_p->ax5043_mode1 == AX5043_RX) - { - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem1, TIME_MS2I(120)); - packet_len=receive_loop(ax5043_driver_p->ax5043_spip1, ax5043_rxbuffer); - if(packet_len > 0) - { - chprintf(DEBUG_CHP,"INFO:R1 Received packet %d\r\n",ax5043_rxbuffer[3]); - (void)chMBPostTimeout(ax5043_driver_p->ax5043_rx_mb1, (msg_t)ax5043_rxbuffer, TIME_MS2I(10000)); - } - chBSemSignal(ax5043_driver_p->ax5043_bsem1); - } - } - return 0; -} - - -/** - * Receive packets from AX5043 radio2. - * @param ax5043_driver_p: Radio driver. - * @return The function is an infinite loop waiting to receive data from radio. - */ -uint8_t ax5043_radio2_rx(ax5043_drv_t *ax5043_driver_p) -{ - uint8_t ax5043_rxbuffer[256]; //buffer to receive radio data - uint8_t packet_len=0; - palEnableLineEvent(ax5043_driver_p->ax5043_int2, PAL_EVENT_MODE_RISING_EDGE); - - - - while(true) - { - palWaitLineTimeout(ax5043_driver_p->ax5043_int2, TIME_MS2I(5000)); - - if (ax5043_driver_p->ax5043_mode2 == AX5043_RX) - { - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem2, TIME_MS2I(120)); - packet_len=receive_loop(ax5043_driver_p->ax5043_spip2, ax5043_rxbuffer); - - if(packet_len > 0) - { - chprintf(DEBUG_CHP,"INFO:R2 Received packet %d\r\n",ax5043_rxbuffer[3]); - (void)chMBPostTimeout(ax5043_driver_p->ax5043_rx_mb2, (msg_t)ax5043_rxbuffer, TIME_MS2I(10000)); - } - chBSemSignal(ax5043_driver_p->ax5043_bsem2); - } - } - return 0; -} - - -/** - * Send packets via AX5043 radio1. - * @param ax5043_driver_p: Radio driver, pkt: address of the packet, pktlen: length of packet - * @return the value of the register. - */ -uint8_t ax5043_radio1_packet_tx(ax5043_drv_t *ax5043_driver_p, uint8_t *pkt, uint16_t pktlen) -{ - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem1, TIME_MS2I(120)); - transmit_packet(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1->remoteaddr, ax5043_driver_p->ax5043_config1->localaddr, pkt, pktlen); - chBSemSignal(ax5043_driver_p->ax5043_bsem1); - return 0; -} - - - -/** - * Send packets via AX5043 radio2. - * @param ax5043_driver_p: Radio driver, pkt: address of the packet, pktlen: length of packet - * @return the value of the register. - */ -uint8_t ax5043_radio2_packet_tx(ax5043_drv_t *ax5043_driver_p, uint8_t *pkt, uint16_t pktlen) -{ - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem2, TIME_MS2I(120)); - transmit_packet(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config2->remoteaddr, ax5043_driver_p->ax5043_config2->localaddr, pkt, pktlen); - chBSemSignal(ax5043_driver_p->ax5043_bsem2); - return 0; -} - -/** - * send CW/morse via AX5043 radio. - * @param spip: SPI Configuration - * @return error code - */ -uint8_t ax5043_radio_prepare_cw(SPIDriver * spip) -{ - uint8_t ret_value[3]={0,0,0}; - ax5043_full_tx(spip); - - /** - * This is not mentioned in datasheet or programming manual but is required. - * Removing this will make the transmission to transmit in low power for a few seconds - * before it reaches peak power. - */ - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, ret_value);//FIFO reset - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_REPEATDATA_CMD|0x00), ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, ret_value);//preamble flag - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0xff, ret_value); - ax5043_write_reg(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, ret_value);//preamble - ax5043_write_reg(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, ret_value);//FIFO Commit - - ax5043_standby(spip); - return 0; - -} - - -/** - * send CW/morse via AX5043 radio1. - * @param ax5043_driver_p: Radio driver, pkt: address of the packet, pktlen: length of packet - * @return error code - */ -uint8_t ax5043_radio1_cw_tx(ax5043_drv_t *ax5043_driver_p, char pkt[], uint16_t pktlen) -{ - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem1, TIME_MS2I(120)); - ax5043_radio_prepare_cw(ax5043_driver_p->ax5043_spip1); - SetWpm(5); - SendMessage(ax5043_driver_p->ax5043_spip1, pkt, pktlen); - chBSemSignal(ax5043_driver_p->ax5043_bsem1); - return 0; - -} - - - -/** - * send CW/morse via AX5043 radio2. - * @param ax5043_driver_p: Radio driver, pkt: address of the packet, pktlen: length of packet - * @return error code - */ -uint8_t ax5043_radio2_cw_tx(ax5043_drv_t *ax5043_driver_p, char pkt[], uint16_t pktlen) -{ - msg_t msg = chBSemWaitTimeout(ax5043_driver_p->ax5043_bsem1, TIME_MS2I(120)); - ax5043_radio_prepare_cw(ax5043_driver_p->ax5043_spip2); - SetWpm(5); - SendMessage(ax5043_driver_p->ax5043_spip2, pkt, pktlen); - chBSemSignal(ax5043_driver_p->ax5043_bsem2); - return 0; - -} - -THD_WORKING_AREA(waAx5043_radio1, 1024); -THD_FUNCTION(ax5043_radio1, ax5043_driver_ptr) -{ - ax5043_drv_t* ax5043_driver_p=(ax5043_drv_t*)ax5043_driver_ptr; - - chBSemObjectInit(ax5043_driver_p->ax5043_bsem1, true); - ax5043_init(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1); - - switch(ax5043_driver_p->ax5043_mode1) { - case ax5043_rx: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1); - break; - case ax5043_tx: - ax5043_prepare_tx(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1); - break; - case ax5043_off: - ax5043_shutdown(ax5043_driver_p->ax5043_spip1); - default: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1); - } - ax5043_set_addr(ax5043_driver_p->ax5043_spip1, ax5043_driver_p->ax5043_config1->localaddr); - chBSemSignal(ax5043_driver_p->ax5043_bsem1); - chprintf(DEBUG_CHP, "done reseting AX5043 radio1 \r\n"); - ax5043_radio1_rx(ax5043_driver_p); - -} - - -THD_WORKING_AREA(waAx5043_radio2, 1024); -THD_FUNCTION(ax5043_radio2, ax5043_driver_ptr) -{ - ax5043_drv_t* ax5043_driver_p=(ax5043_drv_t*)ax5043_driver_ptr; - - chBSemObjectInit(ax5043_driver_p->ax5043_bsem2, true); - ax5043_init(ax5043_driver_p->ax5043_spip2, ax5043_driver_p->ax5043_config2); - - switch(ax5043_driver_p->ax5043_mode2) { - case ax5043_rx: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip2, ax5043_driver_p->ax5043_config2); - break; - case ax5043_tx: - ax5043_prepare_tx(ax5043_driver_p->ax5043_spip2, ax5043_driver_p->ax5043_config2); - break; - case ax5043_off: - ax5043_shutdown(ax5043_driver_p->ax5043_spip2); - default: - ax5043_prepare_rx(ax5043_driver_p->ax5043_spip2, ax5043_driver_p->ax5043_config2); - } - ax5043_set_addr(ax5043_driver_p->ax5043_spip2, ax5043_driver_p->ax5043_config2->localaddr); - chBSemSignal(ax5043_driver_p->ax5043_bsem2); - chprintf(DEBUG_CHP, "done reseting AX5043 radio2 \r\n"); - - ax5043_radio2_rx(ax5043_driver_p); -} - - -uint8_t ax5043_init(ax5043_drv_t *ax5043_driver_p) -{ - - chThdCreateStatic(waAx5043_radio1, sizeof(waAx5043_radio1), NORMALPRIO, ax5043_radio1, ax5043_driver_p); - chThdSleepMilliseconds(5000); - chThdCreateStatic(waAx5043_radio2, sizeof(waAx5043_radio2), NORMALPRIO, ax5043_radio2, ax5043_driver_p); - return 0; -} - - -//!@ diff --git a/src/archive/app_radio/radio.h b/src/archive/app_radio/radio.h deleted file mode 100644 index 741680ea..00000000 --- a/src/archive/app_radio/radio.h +++ /dev/null @@ -1,26 +0,0 @@ -/*! \file ax5043_driver.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_DRIVER_H_ -#define _AX5043_DRIVER_H_ - -//function declaration starts here -uint8_t ax5043_radio1_chg_config(ax5043_drv_t *ax5043_driver_p, ax5043_config_t config); -uint8_t ax5043_radio2_chg_config(ax5043_drv_t *ax5043_driver_p, ax5043_config_t config); -uint8_t ax5043_radio1_mode(ax5043_drv_t *ax5043_driver_p, ax5043_mode_t mode); -uint8_t ax5043_radio2_mode(ax5043_drv_t *ax5043_driver_p, ax5043_mode_t mode); -uint8_t ax5043_radio1_rx(ax5043_drv_t *ax5043_driver_p); -uint8_t ax5043_radio2_rx(ax5043_drv_t *ax5043_driver_p); -uint8_t ax5043_radio1_packet_tx(ax5043_drv_t *ax5043_driver_p, uint8_t *pkt, uint16_t pktlen); -uint8_t ax5043_radio2_packet_tx(ax5043_drv_t *ax5043_driver_p, uint8_t *pkt, uint16_t pktlen); -uint8_t ax5043_radio1_cw_tx(ax5043_drv_t *ax5043_driver_p, char pkt[], uint16_t pktlen); -uint8_t ax5043_radio2_cw_tx(ax5043_drv_t *ax5043_driver_p, char pkt[], uint16_t pktlen); -uint8_t ax5043_init(ax5043_drv_t *ax5043_driver_p); - -#endif -//! @} diff --git a/src/archive/app_radio/source/README.md b/src/archive/app_radio/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_radio/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_radio/source/ax5043.c b/src/archive/app_radio/source/ax5043.c deleted file mode 100644 index d9a5cd36..00000000 --- a/src/archive/app_radio/source/ax5043.c +++ /dev/null @@ -1,1088 +0,0 @@ -/** - * @file ax5043.c - * @brief AX5043 Radio. - * - * @addtogroup AX5043 - * @ingrup ORESAT - * @{ - */ - -#include -#include "ch.h" -#include "hal.h" -#include "ax5043.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ -/** - * @brief Morse code for alphabets and numbers. - */ -static const char *alpha[] = { - ".-", //A - "-...", //B - "-.-.", //C - "-..", //D - ".", //E - "..-.", //F - "--.", //G - "....", //H - "..", //I - ".---", //J - "-.-", //K - ".-..", //L - "--", //M - "-.", //N - "---", //O - ".--.", //P - "--.-", //Q - ".-.", //R - "...", //S - "-", //T - "..-", //U - "...-", //V - ".--", //W - "-..-", //X - "-.--", //Y - "--..", //Z -}; - -static const char *num[] = { - "-----", //0 - ".----", //1 - "..---", //2 - "...--", //3 - "....-", //4 - ".....", //5 - "-....", //6 - "--...", //7 - "---..", //8 - "----.", //9 -}; - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -#if (AX5043_USE_SPI) || defined(__DOXYGEN__) -/** - * @brief Reads AX5043 registers using SPI. - * @pre The SPI interface must be initialized and the driver started. - * - * @param[in] spip SPI Configuration - * @param[in] reg Register address - * @param[in] value Register value - * @param[out] rxbuf Returned data - * @return The value in the register - * @notapi - */ -uint8_t ax5043SPIReadRegister(SPIDriver *spip, uint16_t reg, uint8_t value, uint8_t rxbuf[]) { - uint8_t cmd[3]; - - /* TODO: Optimize these functions */ - if (reg < 0x0070) { - cmd[0] = reg; - cmd[1] = value; - spiSelect(spip); - spiExchange(spip, 2, cmd, rxbuf); - spiUnselect(spip); - return rxbuf[1]; //return the reg value when reading the register - } else { - cmd[0] = 0x70 | (reg >> 8); - cmd[1] = reg; - cmd[2] = value; - spiSelect(spip); - spiExchange(spip, 3, cmd, rxbuf); - spiUnselect(spip); - return rxbuf[2]; //return the reg value when reading the register - } -} - -/** - * @brief Writes a value into a register using SPI. - * @pre The SPI interface must be initialized and the driver started. - * - * @param spip SPI Driver - * @param[in] reg Register address - * @param[in] value Register value - * @param[out] rxbuf Returned data - * @return The value in the register - * @notapi - */ -uint8_t ax5043SPIWriteRegister(SPIDriver *spip, uint16_t reg, uint8_t value, uint8_t rxbuf[]) { - uint8_t cmd[3]; - - /* TODO: Optimize these functions */ - if (reg < 0x0070) { - cmd[0]=0x80|reg; - cmd[1]=value; - spiSelect(spip); - spiExchange(spip, 2, cmd, rxbuf); - spiUnselect(spip); - } else { - cmd[0]=0xF0|(reg>>8); - cmd[1]=reg; - cmd[2]=value; - spiSelect(spip); - spiExchange(spip, 3, cmd, rxbuf); - spiUnselect(spip); - } - return rxbuf[0]; //retun status while writting the register -} - -/*===========================================================================*/ -/* TODO: Organize these functions and clean up comments */ -/*===========================================================================*/ - -/** - * @brief Sets powermode register of AX5043. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] reg_value powermode register value. - * - * @return Most significant status bits from last SPI call. - */ -uint8_t ax5043_set_pwrmode(AX5043Driver *devp, uint8_t reg_value){ - uint8_t rxbuf[3]={0,0,0}; - uint8_t value; - SPIDriver *spip = devp->config->spip; - - value = ax5043SPIReadRegister(spip, AX5043_REG_PWRMODE, (uint8_t)0x00, rxbuf); - value = value & 0xF0; - value = value | reg_value; - ax5043SPIWriteRegister(spip, AX5043_REG_PWRMODE, value, rxbuf); - devp->status_code = rxbuf[0]; - /*Return last status from Ax5043 while writting the register. - Normal value is 0x80 0r 0x88*/ - return rxbuf[0]; -} - -/** - * @brief Resets the AX5043. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @return Most significant status bits from last SPI call. - */ -uint8_t ax5043_reset(AX5043Driver *devp) -{ - SPIDriver *spip = devp->config->spip; - uint8_t value = 0; - uint8_t rxbuf[3]={0,0,0}; - - /* TODO: What's this for? */ - spiSelect(spip); - chThdSleepMicroseconds(5); - spiUnselect(spip); - chThdSleepMicroseconds(5); - spiSelect(spip); - chThdSleepMicroseconds(5); - - /* Reset the chip through powermode register.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_PWRMODE, AX5043_RESET_BIT, rxbuf); - chThdSleepMilliseconds(1); - - /* Write to powermode register for enabling XOEN and REFIN and shutdown mode. - Page 33 in programming manual.*/ - value = ax5043SPIReadRegister(spip, AX5043_REG_PWRMODE, value, rxbuf); - /* TODO: Why are we grabbing the register value if we overwrite it completely? */ - value = AX5043_OSC_EN_BIT | AX5043_REF_EN_BIT | AX5043_POWERDOWN; - ax5043SPIWriteRegister(spip, AX5043_REG_PWRMODE, value, rxbuf); - - ax5043SPIWriteRegister(spip, AX5043_REG_SCRATCH, (uint8_t)0xAA, rxbuf); - value = ax5043SPIReadRegister(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, rxbuf); - if (value != 0xAA) { - devp->error_code = AXRADIO_ERR_NOT_CONNECTED; - } - ax5043SPIWriteRegister(spip, AX5043_REG_SCRATCH, (uint8_t)0x55, rxbuf); - value = ax5043SPIReadRegister(spip, AX5043_REG_SCRATCH, (uint8_t)0x00, rxbuf); - if (value != 0x55) { - devp->error_code = AXRADIO_ERR_NOT_CONNECTED; - } - /*Return last status from Ax5043 while writting the register.*/ - return rxbuf[0]; -} - -/** - * @brief Writes to AX5043 FIFO - * - * @param[in] spip pointer to the @p SPIDriver object. - * @param[in] ptr Pointer to array to be written to FIFO. - * @param[in] len length of array to be written to FIFO. - * - * @api - * TODO return a -ve return code if there are any errors - */ -void ax5043_writefifo(SPIDriver * spip, const uint8_t *ptr, uint8_t len){ - uint8_t rxbuf[3]={0,0,0}; - if (!len) - return; - do { - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, *ptr++, rxbuf); - } while (--len); -} - -/** - * @brief Reads to AX5043 FIFO - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] axradio_rxbuffer[] Pointer to array where the packet will be kept. - * @param[in] len Maximum length of array to be read FIFO. - * - * @param[out] Bytes read from FIFO. - */ -uint8_t ax5043_readfifo(SPIDriver * spip, uint8_t axradio_rxbuffer[], uint8_t len) { - uint8_t rxbuf[3]={0,0,0}; - uint8_t bytes_read = 0; - while (len--) { - axradio_rxbuffer[bytes_read] = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - bytes_read++; - } - return bytes_read; -} - -/** - * @brief Sets AX5043 registers. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] group register group that needs to be written. - * - * @return Most significant status bits from last SPI call. - */ -uint8_t ax5043_set_regs_group(AX5043Driver *devp, ax5043_reg_group_t group) { - uint8_t rxbuf[3] = {0, 0, 0}; - int i = 0; - ax5043_regval_t* entry = devp->config->reg_values; - while (entry[i].reg != AX5043_REG_END) { - if (entry[i].group == group){ - ax5043SPIWriteRegister(devp->config->spip, entry[i].reg, entry[i].val, rxbuf); - } - i++; - } - devp->status_code = rxbuf[0]; - /*Return last status from Ax5043 while writting the register.*/ - return rxbuf[0]; -} - -/** - * @brief Gets AX5043 register values from the AX5043 driver structure. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] reg_name register name. - * - * @return register value. - */ -uint8_t ax5043_get_reg_val(AX5043Driver *devp, uint16_t reg_name) { - int i = 0; - ax5043_regval_t* entry = devp->config->reg_values; - while (entry[i].reg != AX5043_REG_END) { - if (entry[i].reg == reg_name){ - return entry[i].val; - } - i++; - } - devp->error_code = AXRADIO_ERR_REG_NOT_IN_CONF; - return 0; -} - -/** - * @brief Gets AX5043 configuration values from the AX5043 driver structure. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] conf_name configuration variable name. - * - * @retrun value in configuration variable. - * - * @api - * TODO return a -ve return code if there are any errors - */ -uint32_t ax5043_get_conf_val(AX5043Driver *devp, uint8_t conf_name) { - int i = 0; - ax5043_confval_t* entry = devp->config->conf_values; - while (entry[i].conf_name != AXRADIO_PHY_END) { - if (entry[i].conf_name == conf_name){ - return entry[i].val; - } - i++; - } - devp->error_code = AXRADIO_ERR_VAL_NOT_IN_CONF; - return 0; -} - -/** - * @brief Sets AX5043 configuration values from the AX5043 driver structure. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] conf_name configuration variable name. - * @param[in] value value in configuration variable. - * - * @return 0 if successful, else 0x11. - */ -uint8_t ax5043_set_conf_val(AX5043Driver *devp, uint8_t conf_name, uint32_t value) { - int i = 0; - ax5043_confval_t* entry = devp->config->conf_values; - while (entry[i].conf_name != AXRADIO_PHY_END) { - if (entry[i].conf_name == conf_name){ - entry[i].val = value; - return 0; - } - i++; - } - devp->error_code = AXRADIO_ERR_VAL_NOT_IN_CONF; - return AXRADIO_ERR_VAL_NOT_IN_CONF; -} - -/** - * @brief Prepare AX5043 for tx. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_tx(AX5043Driver *devp){ - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - ax5043_set_pwrmode(devp, AX5043_STANDBY); - ax5043_set_pwrmode(devp, AX5043_FIFO_ENABLED); - ax5043_set_regs_group(devp,tx); - ax5043_init_registers_common(devp); - - /* Set FIFO threshold and interrupt mask.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_IRQMASK0, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_IRQMASK1, (uint8_t)0x01, rxbuf); - - /* Wait for xtal.*/ - while ((ax5043SPIReadRegister(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, rxbuf) & 0x01) == 0) { - chThdSleepMilliseconds(1); - } - devp->status_code = rxbuf[0]; - devp->state = AX5043_TX; -} - -/** - * @brief prepare AX5043 for rx. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - * TODO return a -ve return code if there are any errors - */ -void ax5043_prepare_rx(AX5043Driver *devp){ - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - ax5043_set_regs_group(devp,rx); - ax5043_init_registers_common(devp); - - /* Updates RSSI reference value, Sets a group of RX registers.*/ - uint8_t rssireference = ax5043_get_conf_val(devp, AXRADIO_PHY_RSSIREFERENCE) ; - ax5043SPIWriteRegister(spip, AX5043_REG_RSSIREFERENCE, rssireference, rxbuf); - ax5043_set_regs_group(devp,rx_cont); - /* Resets FIFO, changes powermode to FULL RX.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, rxbuf); - ax5043_set_pwrmode(devp, AX5043_FULL_RX); - /* Sets FIFO threshold and interrupt mask.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOTHRESH1, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOTHRESH0, (uint8_t)0x80, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_IRQMASK0, (uint8_t)0x01, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_IRQMASK1, (uint8_t)0x00, rxbuf); - devp->status_code = rxbuf[0]; - devp->state = AX5043_RX; -} - -/** - * @brief Does PLL ranging. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @returns PLLVCOI Register content. - * @api - * TODO return a -ve return code if there are any errors - */ -uint8_t axradio_get_pllvcoi(AX5043Driver *devp){ - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - uint8_t x = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANVCOIINIT) ; - uint8_t pll_init_val = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNGINIT); - uint8_t pll_val = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNG); - if (x & 0x80) { - if (!(pll_init_val & 0xF0)) { - x += (pll_val & 0x0F) - (pll_init_val & 0x0F); - x &= 0x3f; - x |= 0x80; - } - return x; - } - return ax5043SPIReadRegister(spip, AX5043_REG_PLLVCOI, (uint8_t)0x00, rxbuf); -} - -/** - * @brief Initialized AX5043 registers common to RX and TX. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - * TODO return a -ve return code if there are any errors - */ -void ax5043_init_registers_common(AX5043Driver *devp){ - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - uint8_t rng = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNG); - if (rng & 0x20) - devp->status_code = AXRADIO_ERR_PLLRNG_VAL; - if ( ax5043SPIReadRegister(spip, AX5043_REG_PLLLOOP, (uint8_t)0x00, rxbuf) & 0x80) { - ax5043SPIWriteRegister(spip, AX5043_REG_PLLRANGINGB, (uint8_t)(rng & 0x0F), rxbuf); - } - else { - ax5043SPIWriteRegister(spip, AX5043_REG_PLLRANGINGA, (uint8_t)(rng & 0x0F), rxbuf); - } - rng = axradio_get_pllvcoi(devp); - if (rng & 0x80) - ax5043SPIWriteRegister(spip, AX5043_REG_PLLVCOI, (uint8_t)(rng), rxbuf); -} - -/** - * @brief Initializes AX5043. This is written based on easyax5043.c generated from AX Radiolab. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @api - * TODO Standardize the error handling. - */ -void ax5043_init(AX5043Driver *devp){ - SPIDriver *spip = devp->config->spip; - uint8_t rxbuf[3]={0,0,0}; - - ax5043_reset(devp); - - ax5043_set_regs_group(devp,common); - ax5043_set_regs_group(devp,tx); - - ax5043SPIWriteRegister(spip, AX5043_REG_PLLLOOP, (uint8_t)0x09, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_PLLCPI, (uint8_t)0x08, rxbuf); - - ax5043_set_pwrmode(devp, AX5043_STANDBY); - ax5043SPIWriteRegister(spip, AX5043_REG_MODULATION, (uint8_t)0x08, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, rxbuf); - - /* Wait for Xtal.*/ - while ((ax5043SPIReadRegister(spip, AX5043_REG_XTALSTATUS, (uint8_t)0x00, rxbuf) & 0x01) == 0){ - chThdSleepMilliseconds(1); - } - - /* Set frequency.*/ - uint32_t f = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANFREQ); - ax5043SPIWriteRegister(spip, AX5043_REG_FREQA0, (uint8_t)f, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), rxbuf); - - /* PLL autoranging.*/ - uint8_t r; - uint8_t pll_init_val = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNGINIT); - if( !(pll_init_val & 0xF0) ) { // start values for ranging available - r = pll_init_val | 0x10; - } - else { - r = 0x18; - } - ax5043SPIWriteRegister(spip, AX5043_REG_PLLRANGINGA, (uint8_t)r, rxbuf); - chThdSleepMilliseconds(1); - while ((ax5043SPIReadRegister(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, rxbuf) & 0x10) != 0) - { - chThdSleepMilliseconds(1); - } - int8_t value = ax5043SPIReadRegister(spip, AX5043_REG_PLLRANGINGA, (uint8_t)0x00, rxbuf); - ax5043_set_conf_val(devp, AXRADIO_PHY_CHANPLLRNG, value); - devp->state = AX5043_PLL_RANGE_DONE; - - ax5043_set_pwrmode(devp, AX5043_POWERDOWN); - ax5043_set_regs_group(devp,common); - ax5043_set_regs_group(devp,rx); - - uint8_t pll_val = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANPLLRNG); - ax5043SPIReadRegister(spip, AX5043_REG_PLLRANGINGA, (pll_val & 0x0F), rxbuf); - f = ax5043_get_conf_val(devp, AXRADIO_PHY_CHANFREQ); - ax5043SPIWriteRegister(spip, AX5043_REG_FREQA0, (uint8_t)f, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FREQA1, (uint8_t)(f >> 8), rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FREQA2, (uint8_t)(f >> 16), rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FREQA3, (uint8_t)(f >> 24), rxbuf); - - ax5043_set_regs_group(devp,local_address); -} - -/** - * @brief Transmit loop to transmit bytes of a packet. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] packet_len Complete packet length including mac. - * @param[in] axradio_txbuffer pointer to packet. - * @param[in] packet_bytes_sent length before the packet. - * - * @api - * TODO Standardize the error handling, remove packet_bytes_sent, simplify the code. - */ -void transmit_loop(AX5043Driver *devp, uint16_t packet_len,uint8_t axradio_txbuffer[]){ - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - uint8_t free_fifo_bytes; - uint8_t packet_end_indicator = 0; - uint16_t packet_bytes_sent = 0; - uint8_t flags = 0; - uint16_t packet_len_to_be_sent = 0; - uint8_t synclen = ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCLEN); - - while (packet_end_indicator == 0) { - if (ax5043SPIReadRegister(spip,AX5043_REG_FIFOFREE1, (uint8_t)0x00, rxbuf)) - free_fifo_bytes = 0xff; - else - free_fifo_bytes = ax5043SPIReadRegister(spip,AX5043_REG_FIFOFREE0, (uint8_t)0x00, rxbuf); - /* Make sure sixteen bytes in FIFO are free. We can do with minimum 4 bytes free but taking in 16 here.*/ - if (free_fifo_bytes < 19) { - /* FIFO commit.*/ - ax5043SPIWriteRegister(spip,AX5043_REG_FIFOSTAT, 4, rxbuf); - continue; - } - - switch (devp->state) { - case AX5043_TX_LONGPREAMBLE: - if (!packet_bytes_sent) { - devp->state = AX5043_TX_SHORTPREAMBLE; - packet_bytes_sent = ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_LEN); - break; - } - - free_fifo_bytes = 7; - if (packet_bytes_sent < 7) - free_fifo_bytes = packet_bytes_sent; - packet_bytes_sent -= free_fifo_bytes; - free_fifo_bytes <<= 5; - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_FLAGS), rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, free_fifo_bytes, rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_BYTE), rxbuf); - break; - - case AX5043_TX_SHORTPREAMBLE: - if (!packet_bytes_sent) { - uint8_t preamble_appendbits = ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_APPENDBITS); - if (preamble_appendbits) { - uint8_t byte; - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, 0x1C, rxbuf); - byte = ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_APPENDPATTERN); - if (ax5043SPIReadRegister(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, rxbuf) & 0x80) { - // msb first -> stop bit below - byte &= 0xFF << (8-preamble_appendbits); - byte |= 0x80 >> preamble_appendbits; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-preamble_appendbits); - byte |= 0x01 << preamble_appendbits; - } - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, byte, rxbuf); - } - if ((ax5043SPIReadRegister(spip,AX5043_REG_FRAMING, (uint8_t)0x00, rxbuf) & 0x0E) == 0x06 && synclen) { - /* Write SYNC word if framing mode is raw_patternmatch, might use SYNCLEN > 0 as a criterion, but need to make sure SYNCLEN=0 for WMBUS. - Chip automatically sends SYNCWORD but matching in RX works via MATCH0PAT).*/ - int8_t len_byte = synclen; - uint8_t i = (len_byte & 0x07) ? 0x04 : 0; - /* SYNCLEN in bytes, rather than bits. Ceiled to next integer e.g. fractional bits are counted as full bits.*/ - len_byte += 7; - len_byte >>= 3; - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | ((len_byte + 1) << 5), rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCFLAGS) | i, rxbuf); - - uint8_t syncword[4] = {ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCWORD0), - ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCWORD1), - ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCWORD2), - ax5043_get_conf_val(devp, AXRADIO_FRAMING_SYNCWORD3)}; - for (i = 0; i < len_byte; ++i) { - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, syncword[i], rxbuf); - } - } - devp->state = AX5043_TX_PACKET; - continue; - } - free_fifo_bytes = 255; - if (packet_bytes_sent < 255*8) - free_fifo_bytes = packet_bytes_sent >> 3; - if (free_fifo_bytes) { - packet_bytes_sent -= ((uint16_t)free_fifo_bytes) << 3; - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_REPEATDATA | (3 << 5), rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_FLAGS), rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, free_fifo_bytes, rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, (uint8_t)ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_BYTE), rxbuf); - continue; - } - { - uint8_t byte = ax5043_get_conf_val(devp, AXRADIO_PHY_PREAMBLE_BYTE) ; - free_fifo_bytes = packet_bytes_sent; - packet_bytes_sent = 0; - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (2 << 5), rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, 0x1C, rxbuf); - if (ax5043SPIReadRegister(spip,AX5043_REG_PKTADDRCFG, (uint8_t)0x00, rxbuf) & 0x80) { - /* MSB first -> stop bit below.*/ - byte &= 0xFF << (8-free_fifo_bytes); - byte |= 0x80 >> free_fifo_bytes; - } else { - // lsb first -> stop bit above - byte &= 0xFF >> (8-free_fifo_bytes); - byte |= 0x01 << free_fifo_bytes; - } - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, byte, rxbuf); - } - continue; - - case AX5043_TX_PACKET: - flags = 0; - packet_len_to_be_sent = 0; - if (!packet_bytes_sent) - /* Flag byte indicates packetstart.*/ - flags |= 0x01; - - packet_len_to_be_sent = packet_len - packet_bytes_sent; - /* 3 bytes of FIFO commands are written before payload can be written to FIFO.*/ - if (free_fifo_bytes >= packet_len_to_be_sent + 3) { - /* Flag byte indicates packet end.*/ - flags |= 0x02; - } - else{ - packet_len_to_be_sent = free_fifo_bytes - 3; - } - - - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), rxbuf); - /* Write FIFO chunk length byte. Length includes the flag byte, thus the +1.*/ - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, packet_len_to_be_sent + 1, rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, flags, rxbuf); - ax5043_writefifo(spip,&axradio_txbuffer[packet_bytes_sent], packet_len_to_be_sent); - packet_bytes_sent += packet_len_to_be_sent; - if (flags & 0x02){ - packet_end_indicator = 1; - /* Enable radio event done (REVRDONE) event.*/ - ax5043SPIWriteRegister(spip,AX5043_REG_RADIOEVENTMASK0, 0x01, rxbuf); - ax5043SPIWriteRegister(spip,AX5043_REG_FIFOSTAT, 4, rxbuf); // commit - } - break; - - default: - packet_end_indicator = 1; - devp->error_code = AXRADIO_ERR_UNEXPECTED_STATE; - } - } - devp->state = AX5043_TX; -} - -/** - * @brief Transmits a packet. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] addr remote destination address of packet. - * @param[in] pkt pointer to packet. - * @param[in] pktlen packet length. - * - * @param[out] AXRADIO_ERR Error code. - * - * @api - * TODO Standardize the error handling, Maybe move address to a driver config structure - */ -uint8_t transmit_packet(AX5043Driver *devp, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen) { - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - uint16_t packet_len; - uint8_t axradio_txbuffer[PKTDATA_BUFLEN]; - uint8_t axradio_localaddr[4]; - - uint8_t maclen = ax5043_get_conf_val(devp, AXRADIO_FRAMING_MACLEN); - uint8_t destaddrpos = ax5043_get_conf_val(devp, AXRADIO_FRAMING_DESTADDRPOS); - uint8_t addrlen = ax5043_get_conf_val(devp, AXRADIO_FRAMING_ADDRLEN); - uint8_t sourceaddrpos = ax5043_get_conf_val(devp, AXRADIO_FRAMING_SOURCEADDRPOS); - uint8_t lenmask = ax5043_get_conf_val(devp, AXRADIO_FRAMING_LENMASK); - uint8_t lenoffs = ax5043_get_conf_val(devp, AXRADIO_FRAMING_LENOFFS); - uint8_t lenpos = ax5043_get_conf_val(devp, AXRADIO_FRAMING_LENPOS); - - axradio_localaddr[0] = ax5043_get_reg_val(devp, AX5043_REG_PKTADDR0); - axradio_localaddr[1] = ax5043_get_reg_val(devp, AX5043_REG_PKTADDR1); - axradio_localaddr[2] = ax5043_get_reg_val(devp, AX5043_REG_PKTADDR2); - axradio_localaddr[3] = ax5043_get_reg_val(devp, AX5043_REG_PKTADDR3); - - packet_len = pktlen + maclen; - if (packet_len > sizeof(axradio_txbuffer)) - return AXRADIO_ERR_INVALID; - - /* Prepare the MAC segment of the packet.*/ - memset(axradio_txbuffer, 0, maclen); - memcpy(&axradio_txbuffer[maclen], pkt, pktlen); - if (destaddrpos != 0xff) - memcpy(&axradio_txbuffer[destaddrpos], &addr->addr, addrlen); - if (sourceaddrpos != 0xff) - memcpy(&axradio_txbuffer[sourceaddrpos], axradio_localaddr, addrlen); - if (lenmask) { - /* Calculate payload length and update the MAC of payload.*/ - uint8_t len_byte = (uint8_t)(packet_len - lenoffs) & lenmask; - axradio_txbuffer[lenpos] = (axradio_txbuffer[lenpos] & (uint8_t)~lenmask) | len_byte; - } - /*Clear radioevent flag. This indicator is set when packet is out.*/ - ax5043SPIReadRegister(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, rxbuf); - /* Clear leftover FIFO data & flags.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOSTAT, 3, rxbuf); - devp->state = AX5043_TX_LONGPREAMBLE; - - /*Code for 4-FSK mode.*/ - if ((ax5043SPIReadRegister(spip,AX5043_REG_MODULATION, (uint8_t)0x00, rxbuf) & 0x0F) == 9) { - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, AX5043_FIFOCMD_DATA | (7 << 5), rxbuf); - /* Length including flags.*/ - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, 2, rxbuf); - /* Flag PKTSTART -> dibit sync.*/ - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, 0x01, rxbuf); - /* Dummy byte for forcing dibit sync.*/ - ax5043SPIWriteRegister(spip,AX5043_REG_FIFODATA, 0x11, rxbuf); - } - transmit_loop(devp, packet_len, axradio_txbuffer); - ax5043_set_pwrmode(devp, AX5043_FULL_TX); - - ax5043SPIReadRegister(spip,AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, rxbuf); - while (ax5043SPIReadRegister(spip,AX5043_REG_RADIOSTATE, (uint8_t)0x00, rxbuf) != 0) { - chThdSleepMilliseconds(1); - } - - ax5043SPIWriteRegister(spip,AX5043_REG_RADIOEVENTMASK0, 0x00, rxbuf); - devp->error_code = AXRADIO_ERR_NOERROR; - return AXRADIO_ERR_NOERROR; -} - -/** - * @brief Receive loop to recieve bytes from FIFO. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[out] axradio_rxbuffer[] Pointer to array where the packet will be kept. - * - * @return Length of packet received. - * - * @api - * TODO return a -ve return code if there are any errors - */ -uint8_t receive_loop(AX5043Driver *devp, uint8_t axradio_rxbuffer[]) { - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - uint8_t fifo_cmd; - uint8_t i; - uint8_t chunk_len; - uint8_t bytesRead = 0; - - /* Clear interrupt.*/ - ax5043SPIReadRegister(spip, AX5043_REG_RADIOEVENTREQ0, (uint8_t)0x00, rxbuf); - devp->state = AX5043_RX_LOOP; - /* Loop until FIFO not empty.*/ - while ((ax5043SPIReadRegister(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x00, rxbuf) & 0x01) != 1) { - /* FIFO read comman.*/ - fifo_cmd = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - /* Top 3 bits encode payload length.*/ - chunk_len = (fifo_cmd & 0xE0) >> 5; - /* 7 means variable length, get length byte from next read.*/ - if (chunk_len == 7) - chunk_len = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - fifo_cmd &= 0x1F; - switch (fifo_cmd) { - case AX5043_FIFOCMD_DATA: - if (chunk_len!=0){ - /* Discard the flag.*/ - ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - chunk_len = chunk_len - 1; - bytesRead = ax5043_readfifo(spip, axradio_rxbuffer, chunk_len); - } - break; - - case AX5043_FIFOCMD_RFFREQOFFS: - if (chunk_len == 3){ - devp->rf_freq_off3 = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - devp->rf_freq_off2 = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - devp->rf_freq_off1 = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - } - else{ - for(i=0;idropped[i] = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - devp->error_code = AXRADIO_ERR_FIFO_CHUNK; - } - } - break; - - case AX5043_FIFOCMD_FREQOFFS: - if (chunk_len == 2){ - devp->rf_freq_off3 = 0; - devp->rf_freq_off2 = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - devp->rf_freq_off1 = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - } - else{ - for(i=0;idropped[i] = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - devp->error_code = AXRADIO_ERR_FIFO_CHUNK; - } - } - break; - - case AX5043_FIFOCMD_RSSI: - if (chunk_len == 1){ - devp->rssi = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - } - else{ - for(i=0;idropped[i] = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - devp->error_code = AXRADIO_ERR_FIFO_CHUNK; - } - } - break; - - default: - devp->error_code = AXRADIO_ERR_FIFO_CMD; - for(i=0;idropped[i] = ax5043SPIReadRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - } - } - devp->state = AX5043_RX; - } - return bytesRead; -} - -/** - * @brief Prepare for CW mode - * - * @param[in] devp pointer to the @p AX5043Driver object. - * - * @return Length of packet received. - * - * @api - * TODO return a -ve return code if there are any errors - */ -uint8_t ax5043_prepare_cw(AX5043Driver *devp){ - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - ax5043SPIWriteRegister(spip, AX5043_REG_FSKDEV2, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FSKDEV1, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FSKDEV0, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_TXRATE2, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_TXRATE1, (uint8_t)0x00, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_TXRATE0, (uint8_t)0x01, rxbuf); - - ax5043_set_pwrmode(devp, AX5043_FULL_TX); - - /* This is not mentioned in datasheet or programming manual but is required. - * Removing this will make the transmission to transmit in low power for a few seconds - * before it reaches peak power.*/ - /* FIFO reset.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x03, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_FIFOCMD_REPEATDATA|0x60), rxbuf); - /* Preamble flag.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0xff, rxbuf); - /* Preamble.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x55, rxbuf); - /* FIFO Commit.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, rxbuf); - - ax5043_set_pwrmode(devp, AX5043_STANDBY); - devp->state = AX5043_CW; - return 0; -} - -/** - * @brief Send Morse dot and dash over the air - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] dot_dash_time time in milliseconds for transmiter to be on. - */ -void ax5043_morse_dot_dash(AX5043Driver *devp, uint16_t dot_dash_time){ - - uint8_t rxbuf[3]={0,0,0}; - SPIDriver *spip = devp->config->spip; - - ax5043_set_pwrmode(devp, AX5043_FULL_TX); - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, (uint8_t)(AX5043_FIFOCMD_REPEATDATA|0x60), rxbuf); - /* Preamble flag.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x38, rxbuf); - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0xFF, rxbuf); - /* Preamble.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFODATA, (uint8_t)0x00, rxbuf); - /* FIFO Commit.*/ - ax5043SPIWriteRegister(spip, AX5043_REG_FIFOSTAT, (uint8_t)0x04, rxbuf); - chThdSleepMilliseconds(dot_dash_time); - ax5043_set_pwrmode(devp, AX5043_STANDBY); - -} - -/** - * @brief Convert an alphabet or number to morse dot and dash - * - * @param[in] letter An alphabet or number. - * - * @return Length of packet received. - */ -const char *ax5043_ascii_to_morse(char letter){ - letter = tolower(letter); - - if (isalpha(letter)){ - return alpha[letter-'a']; - } - else if (isdigit(letter)){ - return num[letter-'0']; - } - - return SPACE; -} - -/** - * @brief Convert a message to morse code and transmit it. - * - * @param[in] devp pointer to the @p AX5043Driver object. - * @param[in] wpm words per minute. - * @param[in] beaconMessage Message to be transmitted. - * @param[in] pktlen Length of packet/beacon message. - */ -void ax5043_send_cw(AX5043Driver *devp, int wpm, char beaconMessage[], uint16_t pktlen ){ - int element; - int index = 0; - const char *morse; - - uint16_t ditLength = 1200/wpm; - uint16_t letter_space = ditLength*3; - uint16_t word_space = ditLength*7; - uint16_t element_space = ditLength; - uint16_t dash = ditLength*3; - - while (index < pktlen){ - morse = ax5043_ascii_to_morse(beaconMessage[index]); - - element = 0; - while (morse[element] != '\0'){ - switch(morse[element]){ - case '-': - ax5043_morse_dot_dash(devp, dash); - break; - case '.': - ax5043_morse_dot_dash(devp, ditLength); - break; - } - - if (morse[element] == ' '){ - chThdSleepMilliseconds(word_space); - } - else if (morse[element+1] != '\0'){ - chThdSleepMilliseconds(element_space); - } - else if (morse[element+1] == '\0'){ - chThdSleepMilliseconds(letter_space); - } - element++; - } - - index++; - } -} -/*===========================================================================*/ -/* TODO END CLEANUP */ -/*===========================================================================*/ - -#endif /* AX5043_USE_SPI */ - -/*==========================================================================*/ -/* Interface implementation. */ -/*==========================================================================*/ - -static const struct AX5043VMT vmt_device = { - (size_t)0, -}; - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes an instance of AX5043Driver object. - * - * @param[out] devp pointer to the @p AX5043Driver object - * - * @init - */ -void ax5043ObjectInit(AX5043Driver *devp) { - devp->vmt = &vmt_device; - - devp->config = NULL; - - devp->state = AX5043_STOP; -} - -/** - * @brief Configures and activates the AX5043 Radio Driver. - * - * @param[in] devp pointer to the @p AX5043Driver object - * @param[in] config pointer to the @p AX5043Config object - * - * @api - */ -void ax5043Start(AX5043Driver *devp, const AX5043Config *config) { - osalDbgCheck((devp != NULL) && (config != NULL)); - osalDbgAssert((devp->state == AX5043_STOP) || - (devp->state == AX5043_READY), - "ax5043Start(), invalid state"); - - devp->config = config; - devp->rf_freq_off3 = 0; - devp->rf_freq_off2 = 0; - devp->rf_freq_off1 = 0; - devp->rssi = 0; - devp->error_code = 0; - devp->status_code = 0; - - ax5043_init(devp); - switch(config->ax5043_mode) { - case AX5043_MODE_RX: - ax5043_prepare_rx(devp); - break; - case AX5043_MODE_TX: - ax5043_prepare_tx(devp); - break; - case AX5043_MODE_CW: - ax5043_prepare_cw(devp); - break; - case AX5043_MODE_OFF: - ax5043_set_pwrmode(devp, AX5043_POWERDOWN); - break; - default: - ax5043_prepare_rx(devp); - } -} - -/** - * @brief Deactivates the AX5043 Radio Driver. - * - * @param[in] devp pointer to the @p AX5043Driver object - * - * @api - */ -void ax5043Stop(AX5043Driver *devp) { - ax5043_set_pwrmode(devp, AX5043_POWERDOWN); - devp->state = AX5043_OFF; - /* TODO: verify if additional driver things needs to be done.*/ - devp->state = AX5043_STOP; -} - -/** @} */ diff --git a/src/archive/app_radio/source/ax5043.h b/src/archive/app_radio/source/ax5043.h deleted file mode 100644 index ebe8211e..00000000 --- a/src/archive/app_radio/source/ax5043.h +++ /dev/null @@ -1,741 +0,0 @@ -/** - * @file ax5043.h - * @brief AX5043 Radio. - * - * @addtogroup AX5043 - * @ingroup ORESAT - * @{ - */ -#ifndef _AX5043_H_ -#define _AX5043_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Version Identification - * @{ - */ -/** - * @brief AX5043 Driver version string. - */ -#define AX5043_VERSION "1.0.0" - -/** - * @brief AX5043 Driver version major number. - */ -#define AX5043_MAJOR 1 - -/** - * @brief AX5043 Driver version minor number. - */ -#define AX5043_MINOR 0 - -/** - * @brief AX5043 Driver version patch number. - */ -#define AX5043_PATCH 0 -/** @} */ - -/** - * @name AX5043 Register Addresses - * @{ - */ -/* Status and test registers */ -#define AX5043_REG_REV 0x0 -#define AX5043_REG_SCRATCH 0x1 - -/* Power and voltage regulator */ -#define AX5043_REG_PWRMODE 0x2 -#define AX5043_REG_POWSTAT 0x3 -#define AX5043_REG_POWSTICKYSTAT 0x4 -#define AX5043_REG_POWIRQMASK 0x5 - -/* Interrupt control */ -#define AX5043_REG_IRQMASK1 0x6 -#define AX5043_REG_IRQMASK0 0x7 -#define AX5043_REG_RADIOEVENTMASK1 0x8 -#define AX5043_REG_RADIOEVENTMASK0 0x9 - -#define AX5043_REG_IRQREQUEST1 0xC -#define AX5043_REG_IRQREQUEST0 0xD -#define AX5043_REG_RADIOEVENTREQ1 0xE -#define AX5043_REG_RADIOEVENTREQ0 0xF - -/* Modulation and framing */ -#define AX5043_REG_MODULATION 0x010 -#define AX5043_REG_ENCODING 0x011 -#define AX5043_REG_FRAMING 0x012 -#define AX5043_REG_CRCINIT3 0x014 -#define AX5043_REG_CRCINIT2 0x015 -#define AX5043_REG_CRCINIT1 0x016 -#define AX5043_REG_CRCINIT0 0x017 - -/* FEC */ -#define AX5043_REG_FEC 0x018 -#define AX5043_REG_FECSYNC 0x019 -#define AX5043_REG_FECSTATUS 0x01A - -/* Status */ -#define AX5043_REG_RADIOSTATE 0x01C -#define AX5043_REG_XTALSTATUS 0x01D - -/* Pin configuration */ -#define AX5043_REG_PINSTATE 0x20 -#define AX5043_REG_PINFUNCSYSCLK 0x21 -#define AX5043_REG_PINFUNCDCLK 0x22 -#define AX5043_REG_PINFUNCDATA 0x23 -#define AX5043_REG_PINFUNCIRQ 0x24 -#define AX5043_REG_PINFUNCANTSEL 0x25 -#define AX5043_REG_PINFUNCPWRAMP 0x26 -#define AX5043_REG_PWRAMP 0x27 - -/* FIFO control */ -#define AX5043_REG_FIFOSTAT 0x28 -#define AX5043_REG_FIFODATA 0x29 -#define AX5043_REG_FIFOCOUNT1 0x2A -#define AX5043_REG_FIFOCOUNT0 0x2B -#define AX5043_REG_FIFOFREE1 0x2C -#define AX5043_REG_FIFOFREE0 0x2D -#define AX5043_REG_FIFOTHRESH1 0x2E -#define AX5043_REG_FIFOTHRESH0 0x2F - -/* Frequency Synthesizer */ -#define AX5043_REG_PLLLOOP 0x30 -#define AX5043_REG_PLLCPI 0x31 -#define AX5043_REG_PLLVCODIV 0x32 -#define AX5043_REG_PLLRANGINGA 0x33 -#define AX5043_REG_FREQA3 0x34 -#define AX5043_REG_FREQA2 0x35 -#define AX5043_REG_FREQA1 0x36 -#define AX5043_REG_FREQA0 0x37 -#define AX5043_REG_PLLLOOPBOOST 0x38 -#define AX5043_REG_PLLCPIBOOST 0x39 -#define AX5043_REG_PLLRANGINGB 0x3B -#define AX5043_REG_FREQB3 0x3C -#define AX5043_REG_FREQB2 0x3D -#define AX5043_REG_FREQB1 0x3E -#define AX5043_REG_FREQB0 0x3F - -/* RSSI */ -#define AX5043_REG_RSSI 0x40 -#define AX5043_REG_BGNDRSSI 0x41 -#define AX5043_REG_DIVERSITY 0x42 -#define AX5043_REG_AGCCOUNTER 0x43 - -/* Receiver Tracking */ -#define AX5043_REG_TRKDATARATE2 0x45 -#define AX5043_REG_TRKDATARATE1 0x46 -#define AX5043_REG_TRKDATARATE0 0x47 -#define AX5043_REG_TRKAMPL1 0x48 -#define AX5043_REG_TRKAMPL0 0x49 -#define AX5043_REG_TRKPHASE1 0x4A -#define AX5043_REG_TRKPHASE0 0x4B -#define AX5043_REG_TRKRFFREQ2 0x4D -#define AX5043_REG_TRKRFFREQ1 0x4E -#define AX5043_REG_TRKRFFREQ0 0x4F -#define AX5043_REG_TRKFREQ1 0x50 -#define AX5043_REG_TRKFREQ0 0x51 -#define AX5043_REG_TRKFSKDEMOD1 0x52 -#define AX5043_REG_TRKFSKDEMOD0 0x53 - -/* Timers */ -#define AX5043_REG_TIMER2 0x59 -#define AX5043_REG_TIMER1 0x5A -#define AX5043_REG_TIMER0 0x5B - -/* Wakeup timer */ -#define AX5043_REG_WAKEUPTIMER1 0x68 -#define AX5043_REG_WAKEUPTIMER0 0x69 -#define AX5043_REG_WAKEUP1 0x6A -#define AX5043_REG_WAKEUP0 0x6B -#define AX5043_REG_WAKEUPFREQ1 0x6C -#define AX5043_REG_WAKEUPFREQ0 0x6D -#define AX5043_REG_WAKEUPXOEARLY 0x6E - -/* PHY related registers*/ -#define AX5043_REG_IFFREQ1 0x100 -#define AX5043_REG_IFFREQ0 0x101 -#define AX5043_REG_DECIMATION 0x102 -#define AX5043_REG_RXDATARATE2 0x103 -#define AX5043_REG_RXDATARATE1 0x104 -#define AX5043_REG_RXDATARATE0 0x105 -#define AX5043_REG_MAXDROFFSET2 0x106 -#define AX5043_REG_MAXDROFFSET1 0x107 -#define AX5043_REG_MAXDROFFSET0 0x108 -#define AX5043_REG_MAXRFOFFSET2 0x109 -#define AX5043_REG_MAXRFOFFSET1 0x10A -#define AX5043_REG_MAXRFOFFSET0 0x10B -#define AX5043_REG_FSKDMAX1 0x10C -#define AX5043_REG_FSKDMAX0 0x10D -#define AX5043_REG_FSKDMIN1 0x10E -#define AX5043_REG_FSKDMIN0 0x10F -#define AX5043_REG_AFSKSPACE1 0x110 -#define AX5043_REG_AFSKSPACE0 0x111 -#define AX5043_REG_AFSKMARK1 0x112 -#define AX5043_REG_AFSKMARK0 0x113 -#define AX5043_REG_AFSKCTRL 0x114 -#define AX5043_REG_AMPLFILTER 0x115 -#define AX5043_REG_FREQUENCYLEAK 0x116 -#define AX5043_REG_RXPARAMSETS 0x117 -#define AX5043_REG_RXPARAMCURSET 0x118 - -/* Receiver Parameter Set 0 */ -#define AX5043_REG_AGCGAIN0 0x120 -#define AX5043_REG_AGCTARGET0 0x121 -#define AX5043_REG_AGCAHYST0 0x122 -#define AX5043_REG_AGCMINMAX0 0x123 -#define AX5043_REG_TIMEGAIN0 0x124 -#define AX5043_REG_DRGAIN0 0x125 -#define AX5043_REG_PHASEGAIN0 0x126 -#define AX5043_REG_FREQUENCYGAINA0 0x127 -#define AX5043_REG_FREQUENCYGAINB0 0x128 -#define AX5043_REG_FREQUENCYGAINC0 0x129 -#define AX5043_REG_FREQUENCYGAIND0 0x12A -#define AX5043_REG_AMPLITUDEGAIN0 0x12B -#define AX5043_REG_FREQDEV10 0x12C -#define AX5043_REG_FREQDEV00 0x12D -#define AX5043_REG_FOURFSK0 0x12E -#define AX5043_REG_BBOFFSRES0 0x12F - -/* Receiver Parameter Set 1 */ -#define AX5043_REG_AGCGAIN1 0x130 -#define AX5043_REG_AGCTARGET1 0x131 -#define AX5043_REG_AGCAHYST1 0x132 -#define AX5043_REG_AGCMINMAX1 0x133 -#define AX5043_REG_TIMEGAIN1 0x134 -#define AX5043_REG_DRGAIN1 0x135 -#define AX5043_REG_PHASEGAIN1 0x136 -#define AX5043_REG_FREQUENCYGAINA1 0x137 -#define AX5043_REG_FREQUENCYGAINB1 0x138 -#define AX5043_REG_FREQUENCYGAINC1 0x139 -#define AX5043_REG_FREQUENCYGAIND1 0x13A -#define AX5043_REG_AMPLITUDEGAIN1 0x13B -#define AX5043_REG_FREQDEV11 0x13C -#define AX5043_REG_FREQDEV01 0x13D -#define AX5043_REG_FOURFSK1 0x13E -#define AX5043_REG_BBOFFSRES1 0x13F - -/* Receiver Parameter Set 2 */ -#define AX5043_REG_AGCGAIN2 0x140 -#define AX5043_REG_AGCTARGET2 0x141 -#define AX5043_REG_AGCAHYST2 0x142 -#define AX5043_REG_AGCMINMAX2 0x143 -#define AX5043_REG_TIMEGAIN2 0x144 -#define AX5043_REG_DRGAIN2 0x145 -#define AX5043_REG_PHASEGAIN2 0x146 -#define AX5043_REG_FREQGAINA2 0x147 -#define AX5043_REG_FREQGAINB2 0x148 -#define AX5043_REG_FREQGAINC2 0x149 -#define AX5043_REG_FREQGAIND2 0x14A -#define AX5043_REG_AMPLGAIN2 0x14B -#define AX5043_REG_FREQDEV12 0x14C -#define AX5043_REG_FREQDEV02 0x14D -#define AX5043_REG_FOURFSK2 0x14E -#define AX5043_REG_BBOFFSRES2 0x14F - -/* Receiver Parameter Set 3 */ -#define AX5043_REG_AGCGAIN3 0x150 -#define AX5043_REG_AGCTARGET3 0x151 -#define AX5043_REG_AGCAHYST3 0x152 -#define AX5043_REG_AGCMINMAX3 0x153 -#define AX5043_REG_TIMEGAIN3 0x154 -#define AX5043_REG_DRGAIN3 0x155 -#define AX5043_REG_PHASEGAIN3 0x156 -#define AX5043_REG_FREQUENCYGAINA3 0x157 -#define AX5043_REG_FREQUENCYGAINB3 0x158 -#define AX5043_REG_FREQUENCYGAINC3 0x159 -#define AX5043_REG_FREQUENCYGAIND3 0x15A -#define AX5043_REG_AMPLITUDEGAIN3 0x15B -#define AX5043_REG_FREQDEV13 0x15C -#define AX5043_REG_FREQDEV03 0x15D -#define AX5043_REG_FOURFSK3 0x15E -#define AX5043_REG_BBOFFSRES3 0x15F - -/* Transmitter Parameters */ -#define AX5043_REG_MODCFGF 0x160 -#define AX5043_REG_FSKDEV2 0x161 -#define AX5043_REG_FSKDEV1 0x162 -#define AX5043_REG_FSKDEV0 0x163 -#define AX5043_REG_MODCFGA 0x164 -#define AX5043_REG_TXRATE2 0x165 -#define AX5043_REG_TXRATE1 0x166 -#define AX5043_REG_TXRATE0 0x167 -#define AX5043_REG_TXPWRCOEFFA1 0x168 -#define AX5043_REG_TXPWRCOEFFA0 0x169 -#define AX5043_REG_TXPWRCOEFFB1 0x16A -#define AX5043_REG_TXPWRCOEFFB0 0x16B -#define AX5043_REG_TXPWRCOEFFC1 0x16C -#define AX5043_REG_TXPWRCOEFFC0 0x16D -#define AX5043_REG_TXPWRCOEFFD1 0x16E -#define AX5043_REG_TXPWRCOEFFD0 0x16F -#define AX5043_REG_TXPWRCOEFFE1 0x170 -#define AX5043_REG_TXPWRCOEFFE0 0x171 - -/* PLL parameters */ -#define AX5043_REG_PLLVCOI 0x180 -#define AX5043_REG_PLLVCOIR 0x181 -#define AX5043_REG_PLLLOCKDET 0x182 -#define AX5043_REG_PLLRNGCLK 0x183 - -/* Crystal Oscillator */ -#define AX5043_REG_XTALCAP 0x184 - -/* Baseband */ -#define AX5043_REG_BBTUNE 0x188 -#define AX5043_REG_BBOFFSCAP 0x189 - -/* Packet Format */ -#define AX5043_REG_PKTADDRCFG 0x200 -#define AX5043_REG_PKTLENCFG 0x201 -#define AX5043_REG_PKTLENOFFSET 0x202 -#define AX5043_REG_PKTMAXLEN 0x203 -#define AX5043_REG_PKTADDR3 0x204 -#define AX5043_REG_PKTADDR2 0x205 -#define AX5043_REG_PKTADDR1 0x206 -#define AX5043_REG_PKTADDR0 0x207 -#define AX5043_REG_PKTADDRMASK3 0x208 -#define AX5043_REG_PKTADDRMASK2 0x209 -#define AX5043_REG_PKTADDRMASK1 0x20A -#define AX5043_REG_PKTADDRMASK0 0x20B - -/* Pattern Match */ -#define AX5043_REG_MATCH0PAT3 0x210 -#define AX5043_REG_MATCH0PAT2 0x211 -#define AX5043_REG_MATCH0PAT1 0x212 -#define AX5043_REG_MATCH0PAT0 0x213 -#define AX5043_REG_MATCH0LEN 0x214 -#define AX5043_REG_MATCH0MIN 0x215 -#define AX5043_REG_MATCH0MAX 0x216 -#define AX5043_REG_MATCH1PAT1 0x218 -#define AX5043_REG_MATCH1PAT0 0x219 -#define AX5043_REG_MATCH1LEN 0x21C -#define AX5043_REG_MATCH1MIN 0x21D -#define AX5043_REG_MATCH1MAX 0x21E - -/* Packet Controller */ -#define AX5043_REG_TMGTXBOOST 0x220 -#define AX5043_REG_TMGTXSETTLE 0x221 -#define AX5043_REG_TMGRXBOOST 0x223 -#define AX5043_REG_TMGRXSETTLE 0x224 -#define AX5043_REG_TMGRXOFFSACQ 0x225 -#define AX5043_REG_TMGRXCOARSEAGC 0x226 -#define AX5043_REG_TMGRXAGC 0x227 -#define AX5043_REG_TMGRXRSSI 0x228 -#define AX5043_REG_TMGRXPREAMBLE1 0x229 -#define AX5043_REG_TMGRXPREAMBLE2 0x22A -#define AX5043_REG_TMGRXPREAMBLE3 0x22B -#define AX5043_REG_RSSIREFERENCE 0x22C -#define AX5043_REG_RSSIABSTHR 0x22D -#define AX5043_REG_BGNDRSSIGAIN 0x22E -#define AX5043_REG_BGNDRSSITHR 0x22F -#define AX5043_REG_PKTCHUNKSIZE 0x230 -#define AX5043_REG_PKTMISCFLAGS 0x231 -#define AX5043_REG_PKTSTOREFLAGS 0x232 -#define AX5043_REG_PKTACCEPTFLAGS 0x233 - -/* General Purpose ADC */ -#define AX5043_REG_GPADCCTRL 0x300 -#define AX5043_REG_GPADCPERIOD 0x301 -#define AX5043_REG_GPADC13VALUE1 0x308 -#define AX5043_REG_GPADC13VALUE0 0x309 - -/* Low Power Oscillator Calibration */ -#define AX5043_REG_LPOSCCONFIG 0x310 -#define AX5043_REG_LPOSCSTATUS 0x311 -#define AX5043_REG_LPOSCKFILT1 0x312 -#define AX5043_REG_LPOSCKFILT0 0x313 -#define AX5043_REG_LPOSCREF1 0x314 -#define AX5043_REG_LPOSCREF0 0x315 -#define AX5043_REG_LPOSCFREQ1 0x316 -#define AX5043_REG_LPOSCFREQ0 0x317 -#define AX5043_REG_LPOSCPER1 0x318 -#define AX5043_REG_LPOSCPER0 0x319 - -/* DAC */ -#define AX5043_REG_DACVALUE1 0x330 -#define AX5043_REG_DACVALUE0 0x331 -#define AX5043_REG_DACCONFIG 0x332 - -/* Performance Tuning Registers */ -#define AX5043_REG_REF 0xF00 -#define AX5043_REG_0xF00 0xF00 -#define AX5043_REG_0xF0C 0xF0C -#define AX5043_REG_0xF0D 0xF0D -#define AX5043_REG_XTALOSC 0xF10 -#define AX5043_REG_XTALAMPL 0xF11 -#define AX5043_REG_0xF1C 0xF1C -#define AX5043_REG_0xF18 0xF18 -#define AX5043_REG_0xF21 0xF21 -#define AX5043_REG_0xF22 0xF22 -#define AX5043_REG_0xF23 0xF23 -#define AX5043_REG_0xF26 0xF26 -#define AX5043_REG_0xF30 0xF30 -#define AX5043_REG_0xF31 0xF31 -#define AX5043_REG_0xF32 0xF32 -#define AX5043_REG_0xF33 0xF33 -#define AX5043_REG_0xF34 0xF34 -#define AX5043_REG_0xF35 0xF35 -#define AX5043_REG_0xF44 0xF44 -#define AX5043_REG_0xF72 0xF72 -#define AX5043_REG_XTALDIV 0xF35 - -/* TODO: Clean up from here to Driver pre-compile time settings. */ -/* Not a real register. Indicator of end of registers.*/ -#define AX5043_REG_END 0xFFF -/** @} */ - -/** - * @name AX5043 Register and bit values - * - */ -/* Power modes */ -#define AX5043_RESET_BIT (1 << 7) -#define AX5043_OSC_EN_BIT (1 << 6) -#define AX5043_REF_EN_BIT (1 << 5) - -#define AX5043_POWERDOWN 0x0 -#define AX5043_DEEPSLEEP 0x1 -#define AX5043_STANDBY 0x5 -#define AX5043_FIFO_ENABLED 0x7 -#define AX5043_SYNTH_RX 0x8 -#define AX5043_FULL_RX 0x9 -#define AX5043_WOR_RX 0xB -#define AX5043_SYNTH_TX 0xC -#define AX5043_FULL_TX 0xD - -/** - * @name AX5043 FIFO Commands - * - */ -#define AX5043_FIFOCMD_NOP 0x00 -#define AX5043_FIFOCMD_DATA 0x01 -#define AX5043_FIFOCMD_REPEATDATA 0x02 -#define AX5043_FIFOCMD_TIMER 0x10 -#define AX5043_FIFOCMD_RSSI 0x11 -#define AX5043_FIFOCMD_FREQOFFS 0x12 -#define AX5043_FIFOCMD_RFFREQOFFS 0x13 -#define AX5043_FIFOCMD_DATARATE 0x14 -#define AX5043_FIFOCMD_ANTRSSI 0x15 -#define AX5043_FIFOCMD_TXCTRL 0x1C -#define AX5043_FIFOCMD_TXPWR 0x1D - -/** - * @brief FIFO commit command - */ -#define AX5043_FIFO_COMMIT_CMD (1 << 2) -#define AX5043_FIFO_PKTSTART 1 -#define AX5043_FIFO_PKTEND (1 << 1) -#define AX5043_FIFO_NOCRC (1 << 3) -#define AX5043_FIFO_RAW (1 << 4) - -#define PKTDATA_BUFLEN 260 - -/** - * @brief Error codes - */ -#define AXRADIO_ERR_NOERROR 0x00 -#define AXRADIO_ERR_NOTSUPPORTED 0x01 -#define AXRADIO_ERR_BUSY 0x02 -#define AXRADIO_ERR_TIMEOUT 0x03 -#define AXRADIO_ERR_INVALID 0x04 -#define AXRADIO_ERR_NOCHIP 0x05 -#define AXRADIO_ERR_RANGING 0x06 -#define AXRADIO_ERR_LOCKLOST 0x07 -#define AXRADIO_ERR_RETRANSMISSION 0x08 -#define AXRADIO_ERR_RESYNC 0x09 -#define AXRADIO_ERR_RESYNCTIMEOUT 0x0a -#define AXRADIO_ERR_RECEIVESTART 0x0b -#define AXRADIO_ERR_FIFO_CHUNK 0x0c -#define AXRADIO_ERR_FIFO_CMD 0x0d -#define AXRADIO_ERR_UNEXPECTED_STATE 0x0e -#define AXRADIO_ERR_NOT_CONNECTED 0x0f -#define AXRADIO_ERR_REG_NOT_IN_CONF 0x10 -#define AXRADIO_ERR_VAL_NOT_IN_CONF 0x11 -#define AXRADIO_ERR_PLLRNG_VAL 0x12 - -/** - * @brief PHY and Framing details - */ -#define AXRADIO_PHY_PN9 0 -#define AXRADIO_PHY_NRCHANNELS 1 -#define AXRADIO_PHY_CHANFREQ 2 -#define AXRADIO_PHY_CHANPLLRNGINIT 3 -#define AXRADIO_PHY_CHANVCOIINIT 4 -#define AXRADIO_PHY_CHANPLLRNG 5 -#define AXRADIO_PHY_CHANVCOI 6 -#define AXRADIO_PHY_VCOCALIB 7 -#define AXRADIO_PHY_MAXFREQOFFSET 8 -#define AXRADIO_PHY_RSSIOFFSET 9 -#define AXRADIO_PHY_RSSIREFERENCE 10 -#define AXRADIO_PHY_CHANNELBUSY 11 -#define AXRADIO_PHY_CS_PERIOD 12 -#define AXRADIO_PHY_CS_ENABLED 13 -#define AXRADIO_PHY_LBT_RETRIES 14 -#define AXRADIO_PHY_LBT_FORCETX 15 -#define AXRADIO_PHY_PREAMBLE_WOR_LONGLEN 16 -#define AXRADIO_PHY_PREAMBLE_WOR_LEN 17 -#define AXRADIO_PHY_PREAMBLE_LONGLEN 18 -#define AXRADIO_PHY_PREAMBLE_LEN 19 -#define AXRADIO_PHY_PREAMBLE_BYTE 20 -#define AXRADIO_PHY_PREAMBLE_FLAGS 21 -#define AXRADIO_PHY_PREAMBLE_APPENDBITS 22 -#define AXRADIO_PHY_PREAMBLE_APPENDPATTERN 23 -#define AXRADIO_FRAMING_MACLEN 24 -#define AXRADIO_FRAMING_ADDRLEN 25 -#define AXRADIO_FRAMING_DESTADDRPOS 26 -#define AXRADIO_FRAMING_SOURCEADDRPOS 27 -#define AXRADIO_FRAMING_LENPOS 28 -#define AXRADIO_FRAMING_LENOFFS 29 -#define AXRADIO_FRAMING_LENMASK 30 -#define AXRADIO_FRAMING_SWCRCLEN 31 -#define AXRADIO_FRAMING_SYNCLEN 32 -#define AXRADIO_FRAMING_SYNCWORD0 33 -#define AXRADIO_FRAMING_SYNCWORD1 34 -#define AXRADIO_FRAMING_SYNCWORD2 35 -#define AXRADIO_FRAMING_SYNCWORD3 36 -#define AXRADIO_FRAMING_SYNCFLAGS 37 -#define AXRADIO_FRAMING_ENABLE_SFDCALLBACK 38 -#define AXRADIO_FRAMING_ACK_TIMEOUT 39 -#define AXRADIO_FRAMING_ACK_DELAY 40 -#define AXRADIO_FRAMING_ACK_RETRANSMISSIONS 41 -#define AXRADIO_FRAMING_ACK_SEQNRPOS 42 -#define AXRADIO_FRAMING_MINPAYLOADLEN 43 -#define AXRADIO_WOR_PERIOD 44 -#define AXRADIO_PHY_INNERFREQLOOP 45 -#define AXRADIO_PHY_END 200 - -#define SPACE " " - - -/* END TODO */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief AX5043 SPI interface switch. - * @details If set to @p TRUE the support for SPI is included. - * @note The default is @p TRUE. - */ -#if !defined(AX5043_USE_SPI) || defined(__DOXYGEN__) -#define AX5043_USE_SPI TRUE -#endif - -/** - * @brief AX5043 shared SPI switch. - * @details If set to @p TRUE the device acquires SPI bus ownership - * on each transaction. - * @note The default is @p FALSE. Requires SPI_USE_MUTUAL_EXCLUSION. - */ -#if !defined(AX5043_SHARED_SPI) || defined(__DOXYGEN__) -#define AX5043_SHARED_SPI FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if AX5043_USE_SPI && !HAL_USE_SPI -#error "AX5043_USE_SPI requires HAL_USE_SPI" -#endif - -#if AX5043_SHARED_SPI && !SPI_USE_MUTUAL_EXCLUSION -#error "AX5043_SHARED_SPI requires SPI_USE_MUTUAL_EXCLUSION" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @name AX5043 data structures and types. - * @{ - */ -/** - * @brief Structure representing a AX5043 driver. - */ -typedef struct AX5043Driver AX5043Driver; - -/** - * @brief AX5043 registers are gouped together based on this - */ -typedef enum { - common, - tx, - rx, - rx_cont, - local_address -} ax5043_reg_group_t; - -/** - * @brief Structure containing a four byte sender X.25 address - */ -struct axradio_address { - uint8_t addr[4]; -}; - -/** - * @brief Ax5043 Register values - */ -typedef struct { - uint16_t reg; - uint8_t val; - ax5043_reg_group_t group; -} ax5043_regval_t; - -/** - * @brief Other configuration values - */ -typedef struct { - uint8_t conf_name; - uint32_t val; -} ax5043_confval_t; - -/** - * @brief Other configuration values - */ -typedef enum { - AX5043_MODE_RX, - AX5043_MODE_TX, - AX5043_MODE_CW, - AX5043_MODE_OFF, -} ax5043_mode_t; -/** - * @brief Driver state machine possible states. - */ -typedef enum { - AX5043_UNINIT, /**< Not initialized. */ - AX5043_STOP, /**< Stopped. */ - AX5043_READY, /**< Ready. */ - AX5043_BUSY, /**< Busy. */ - AX5043_IDLE, /**< Idle. */ - AX5043_RX, - AX5043_RX_LOOP, /**< In the middle of receiving packet.*/ - AX5043_TX, - AX5043_PLL_RANGE_DONE, - AX5043_OFF, - AX5043_TX_LONGPREAMBLE, - AX5043_TX_SHORTPREAMBLE, - AX5043_TX_PACKET, - AX5043_CW -} ax5043_state_t; - -/** - * @brief AX5043 configuration structure. - */ -typedef struct{ -#if (AX5043_USE_SPI) || defined(__DOXYGEN__) - /** - * @brief SPI driver associated with this AX5043. - */ - SPIDriver *spip; - /** - * @brief SPI configuration associated with this AX5043. - */ - const SPIConfig *spicfg; -#endif /* AX5043_USE_SPI */ - ioline_t irq; - ax5043_regval_t *reg_values; - ax5043_confval_t *conf_values; - ax5043_mode_t ax5043_mode; - /* TODO: probably move these to an implementation of the driver */ - mailbox_t *mb; -} AX5043Config; - -/** - * @brief @p AX5043 specific methods. - */ -#define _ax5043_methods_alone - -/** - * @brief @p AX5043 specific methods with inherited ones. - */ -#define _ax5043_methods \ - _base_object_methods - -/** - * @extends BaseObjectVMT - * - * @brief @p AX5043 virtual methods table. - */ -struct AX5043VMT { - _ax5043_methods -}; - -/** - * @brief @p AX5043Driver specific data. - */ -#define _ax5043_data \ - _base_object_data \ - /* Driver state.*/ \ - ax5043_state_t state; \ - /* Current configuration data.*/ \ - const AX5043Config *config; \ - /* Ax5043 returned values.*/ \ - uint8_t rf_freq_off1; \ - uint8_t rf_freq_off2; \ - uint8_t rf_freq_off3; \ - uint8_t rssi; \ - uint8_t dropped[250]; \ - uint8_t error_code; \ - uint8_t status_code; \ - -/** - * @brief AX5043 Radio class. - */ -struct AX5043Driver { - /** @brief Virtual Methods Table.*/ - const struct AX5043VMT *vmt; - _ax5043_data -}; - -/** @} */ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -void ax5043ObjectInit(AX5043Driver *devp); -void ax5043Start(AX5043Driver *devp, const AX5043Config *config); -void ax5043Stop(AX5043Driver *devp); - -uint8_t ax5043_set_regs_group(AX5043Driver *devp, ax5043_reg_group_t group); -uint8_t ax5043_get_reg_val(AX5043Driver *devp, uint16_t reg_name); -uint32_t ax5043_get_conf_val(AX5043Driver *devp, uint8_t conf_name); -uint8_t ax5043_set_conf_val(AX5043Driver *devp, uint8_t conf_name, uint32_t value); -void ax5043_prepare_tx(AX5043Driver *devp); -void ax5043_prepare_rx(AX5043Driver *devp); -void ax5043_init_registers_common(AX5043Driver *devp); -uint8_t axradio_get_pllvcoi(AX5043Driver *devp); -void ax5043_init(AX5043Driver *devp); -void transmit_loop(AX5043Driver *devp, uint16_t axradio_txbuffer_len,uint8_t axradio_txbuffer[]); -uint8_t transmit_packet(AX5043Driver *devp, const struct axradio_address *addr, const uint8_t *pkt, uint16_t pktlen); -uint8_t receive_loop(AX5043Driver *devp, uint8_t axradio_rxbuffer[]); - -/* TODO: Abstract these out? */ -void ax5043_morse_dot_dash(AX5043Driver *devp, uint16_t dot_dash_time); -const char *ax5043_ascii_to_morse(char letter); -void ax5043_send_cw(AX5043Driver *devp, int wpm, char beaconMessage[], uint16_t pktlen ); - -#ifdef __cplusplus -} -#endif - -#endif /* _AX5043_H_ */ - -/** @} */ diff --git a/src/archive/app_si41xx/.gitignore b/src/archive/app_si41xx/.gitignore deleted file mode 100644 index 9bf3746b..00000000 --- a/src/archive/app_si41xx/.gitignore +++ /dev/null @@ -1 +0,0 @@ -compile_commands.json diff --git a/src/archive/app_si41xx/Makefile b/src/archive/app_si41xx/Makefile deleted file mode 100644 index aa3f5e89..00000000 --- a/src/archive/app_si41xx/Makefile +++ /dev/null @@ -1,238 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = APP_SI41XX - -# Define board here -BOARD = ST_NUCLEO64_F446RE - -#Project sources -PROJ_ROOT = ../../.. -APP_ROOT = . - -# Imported source files and paths -CHIBIOS = $(PROJ_ROOT)/ChibiOS -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -#Board specific directories -CONFDIR = conf -BUILDDIR = $(APP_ROOT)/build -DEPDIR = $(APP_ROOT)/.dep -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files -include $(PROJ_SRC)/common.mk -#shell files -include $(CHIBIOS)/os/various/shell/shell.mk -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -include $(CHIBIOS)/test/lib/test.mk -include $(CHIBIOS)/test/rt/rt_test.mk -include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(ALLASMSRC) -ASMXSRC = $(ALLXASMSRC) - -INCDIR = $(ALLINC) $(TESTINC) $(CONFDIR) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk diff --git a/src/archive/app_si41xx/Operating-Guide.docx b/src/archive/app_si41xx/Operating-Guide.docx deleted file mode 100644 index eccdfb1339e51d1626a92ec569659f22c3a614ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973561 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
`9nI6Y!J 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˜BpxQ) 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 z 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≈Rf-KqG^Yh1G%FZlA~8e)T*O45(Ox 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

c6l0y)@m_K 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%0ALW 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 - rf1: Update RF1 registers,Usage: rf1 - rf2: Update RF2 registers,Usage: rf2 - if: Update IF registers,Usage: ifr - help: provides list of commands - ?: provides list of commands diff --git a/src/archive/app_si41xx/Si4133-notes.txt b/src/archive/app_si41xx/Si4133-notes.txt deleted file mode 100644 index 4ef17320..00000000 --- a/src/archive/app_si41xx/Si4133-notes.txt +++ /dev/null @@ -1,85 +0,0 @@ -Registers and Functionality for Si4133 family - - -Part RF1 RF2 IF ---------------------- -Si4133 X X X -Si4123 X - X -Si4122 - X X -Si4113 X X - -Si4112 - - X - - -SUMMARY OF DEFAULT VALUES FOR Si4123: -Reg # 17 0 Addr Notes --------------------------------------------------------- -0 00 0011 0000 0000 0100 0000 Main config -1 00 0000 0000 0000 0000 0001 P.D. Gain -2 00 0000 0000 0000 0011 0010 Enable outputs -3 00 0000 1001 1110 0010 0011 N for RF1 (2530) -4 00 0000 0000 0000 0000 0100 N for RF2 (0) -5 00 0000 0011 0110 1001 0101 N for IF (873) -6 00 0000 0000 0010 0000 0110 R for RF1 (32) -7 00 0000 0000 0000 0000 0111 R for RF2 (0) -8 00 0000 0000 0010 0000 1000 R for IF (32) --------------------------------------------------------- - -FYI: EXTERNAL OSC REFERENCE = 16.000 MHz - -NOTES FOR DEFAULTS: -- AUXSEL set to lock detect -- IFDIV disabled -- LPWR disabled -- AUTOPDB disabled -- AutoKp enabled -- Registers 4 and 7 for RF2 are not needed for Si4123 -- For synthesizers with RF1 and RF2 included, the selected - output is determined by the last N/R reg written. - - -REQUESTED FUNCTIONALITY: -- Breakout specific main parameter bits with defaults. - See p. 21 from datasheet for concatenation/padding. - RFPWR (1) = 0 (not used) - AUTOKP (1) = 1 (enabled) - AUTOPDB (1) = 0 (disabled) - LPWR (1) = 0 (disabled) - IFDIV (2) = 00 (no divide) - AUXSEL (2) = 11 (lock detect) - KP1 (2) = 00 (not used when AUTOKP) - KP2 (2) = 00 (not used when AUTOKP) - KPI (2) = 00 (not used when AUTOKP) - PDRB (1) = 1 (enable RF output) - PDIB (1) = 1 (enable IF output) -- Breakout specific N and R parameter bits with defaults. - See p. 21 from datasheet for concatenation/padding. - These are evaluated defaults using equations below. - NRF1 (18) = 000000100111100010 (2530) - NRF2 (17) = 000000000000000000 (0) - NIF (16) = 0000001101101001 (873) - RRF1 (13) = 0000000100000 (32) - RRF2 (13) = 0000000000000 (0) - RIF (13) = 0000000100000 (32) -- Non-register related variables with defaults (decimal values) - Note: Fouts in MHz and Pdets in kHz. - FREF (int) = 16 - FOUTRF1 (float) = 1265 - FOUTRF2 (float) = 0 - FOUTIF (float) = 436.5 - PDETRF1 (int) = 500 - PDETRF2 (int) = 0 - PDETIF (int) = 500 -- Equations for N and R: - RRF1 = FREF * 1000 / PDETRF1 - RRF2 = FREF * 1000 / PDETRF2 - RIF = FREF * 1000 / PDETIF - NRF1 = FOUTRF1 * RRF1 / FREF - NRF2 = FOUTRF2 * RRF2 / FREF - NIF = FOUTIF * RIF / FREF -- Equation Notes: - - Calculate N values only if phase detector not changed - - Calculate R first and N second if phase detector changed -- Evaluated Defaults: - - RF1 output = 1265 MHz - - RF2 output = disabled - - IF output = 436.5 MHz diff --git a/src/archive/app_si41xx/conf/chconf.h b/src/archive/app_si41xx/conf/chconf.h deleted file mode 100644 index a1b8adb8..00000000 --- a/src/archive/app_si41xx/conf/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_si41xx/conf/halconf.h b/src/archive/app_si41xx/conf/halconf.h deleted file mode 100644 index 66155382..00000000 --- a/src/archive/app_si41xx/conf/halconf.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_6_0_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the QSPI subsystem. - */ -#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) -#define HAL_USE_QSPI FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* QSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_WAIT) || defined(__DOXYGEN__) -#define QSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p qspiAcquireBus() and @p qspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(QSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define QSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_si41xx/conf/mcuconf.h b/src/archive/app_si41xx/conf/mcuconf.h deleted file mode 100644 index ea2031f0..00000000 --- a/src/archive/app_si41xx/conf/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_si41xx/main.c b/src/archive/app_si41xx/main.c deleted file mode 100644 index 9592c18b..00000000 --- a/src/archive/app_si41xx/main.c +++ /dev/null @@ -1,335 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/******************************************************************** - * Modification Log - * 09/05/2019 Malay Das Initial Code. - * 09/12/2019 Malay Das Added user entry via chibios shell. - ********************************************************************/ - - -/* - * Include Files - */ -#include -#include -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "util_version.h" -#include "util_numbers.h" -#include "shell.h" - -#include "si41xx.h" - - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - - -/* - * Serial Driver Configuration - */ -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - - - -/* - * Initialize the SPI drivers and configure the ax5043 chips - */ -static void app_init(void) -{ - // Start up debug output, chprintf(DEBUG_CHP,...) - sdStart(&DEBUG_SERIAL, &ser_cfg); - set_util_fwversion(&version_info); - set_util_hwversion(&version_info); - - - //Print FW/HW information - chprintf(DEBUG_CHP, "\r\nFirmware Info\r\n"); - chprintf(DEBUG_CHP, "FW HASH: %s\r\n", version_info.firmware); - chprintf(DEBUG_CHP, "STF0x UNIQUE HW ID (H,C,L):\r\n0x%x\t0x%x\t0x%x\r\n" - , version_info.hardware.id_high - , version_info.hardware.id_center - , version_info.hardware.id_low - ); - -} - - -/* - *This function bit bangs the si41xx registers with default values. - *The dafult values are set as - * RF1 output = 1265 MHz - * RF2 output = disabled - * IF output = 436.5 MHz - *The following pins are connected between M4 and si41xx chip - *LINE_SI_SCLK PAL_LINE(GPIOC, 2U) - *LINE_SI_SDATA PAL_LINE(GPIOC, 3U) - *LINE_SI_SENB PAL_LINE(GPIOC, 4U) - */ - -static void si41xx_init(void) -{ - - palSetLine(LINE_SI_SENB); - palSetLine(LINE_SI_SDATA); - palSetLine(LINE_SI_SCLK); - - si_write_reg(SI41XX_REG_MAIN_CONFIG, 0b000011000000000100); - si_write_reg(SI41XX_REG_PHASE_GAIN, 0b000000000000000000); - si_write_reg(SI41XX_REG_PWRDOWN, 0b000000000000000000); - - // RF1 and IF default for 1265 / 436.5 MHz w/ 500 kHz - si_write_reg(SI41XX_REG_RF1_NDIV, 0b000000100111100010); - si_write_reg(SI41XX_REG_RF1_RDIV, 0b000000000000100000); - si_write_reg(SI41XX_REG_IF_NDIV, 0b000000001101101001); - si_write_reg(SI41XX_REG_IF_RDIV, 0b000000000000100000); - si_write_reg(SI41XX_REG_PWRDOWN, 0b000000000000000011); - - // IF default for 808 MHz w/ 500 kHz - // si_write_reg(SI41XX_REG_IF_NDIV, 0b000000011001010000); - // si_write_reg(SI41XX_REG_IF_RDIV, 0b000000000000100000); - // si_write_reg(SI41XX_REG_PWRDOWN, 0b000000000000000010); - - palSetLine(LINE_SI_SENB); - palSetLine(LINE_SI_SDATA); - palSetLine(LINE_SI_SCLK); - -} - - -/* - * The main loop. - * Currently it does not have any utility. It keeps waiting. - */ -static void main_loop(void) -{ - - while (true) - { - chThdSleepMilliseconds(15000); - } - -} - - -/* - * shell commands for user entry. - * This lets the user update any register via the chibios shell. - * Requires register address and register value as entry. - */ -static void reg(BaseSequentialStream *sd, int argc, char *argv[]) { - - uint32_t reg_address; - uint32_t reg_value; - - if (argc < 2) { - chprintf(sd, "Usage: reg \r\n"); - chprintf(sd, "Example: reg 2 12\r\n"); - chprintf(sd, " reg 2 0xCA\r\n"); - chprintf(sd, " reg 2 0b10\r\n"); - } - - reg_address = strtoul(argv[0], NULL, 0); - reg_value = strtoul((argv[1][0] == '0' && argv[1][1] == 'b') ? argv[1]+2: argv[1], NULL, (argv[1][0] == '0' && argv[1][1] == 'b') ? 2 : 0); - - si_write_reg(reg_address, reg_value); - chprintf(sd, "INFO: Updated register %d with value 0x%x.\r\n", reg_address, reg_value); -} - - -/* - * shell commands for user entry - * This lets the user update RF1 registers via the chibios shell - * Requires frequency and phase values in KHz. - */ -static void rf1(BaseSequentialStream *sd, int argc, char *argv[]) { - - uint32_t freq; - uint32_t phase; - uint32_t ndiv; - uint32_t rdiv; - - if (argc < 2) { - chprintf(sd, "Usage: rf1 \r\n"); - return; - } - - freq = strtoul(argv[0], NULL, 10); - phase = strtoul(argv[1], NULL, 10); - - if (freq == 0) { - chprintf(sd, "ERROR: freqency cannot be 0. \r\nUsage: rf1 \r\n"); - return; - } - if (phase == 0) { - chprintf(sd, "ERROR: phase value cannot be 0. \r\nUsage: rf1 \r\n"); - return; - } - rdiv = SI41XX_FREF * 1000/phase; - ndiv = freq * rdiv / (1000*SI41XX_FREF); - - si_write_reg(SI41XX_REG_RF1_NDIV, ndiv); - si_write_reg(SI41XX_REG_RF1_RDIV, rdiv); - - chprintf(sd, "INFO: freqency set at %d Khz, phase set at %d Khz.\r\n", freq, phase); -} - - -/* - * shell commands for user entry - * This lets the user update RF2 registers via the chibios shell - * Requires frequency and phase values in KHz. This should not be used for si4123 - */ -static void rf2(BaseSequentialStream *sd, int argc, char *argv[]) { - - uint32_t freq; - uint32_t phase; - uint32_t ndiv; - uint32_t rdiv; - - if (argc < 2) { - chprintf(sd, "Usage: rf1 \r\n"); - return; - } - - freq = strtoul(argv[0], NULL, 10); - phase = strtoul(argv[1], NULL, 10); - - if (freq == 0) { - chprintf(sd, "ERROR: freqency cannot be 0. \r\nUsage: rf1 \r\n"); - return; - } - if (phase == 0) { - chprintf(sd, "ERROR: phase value cannot be 0. \r\nUsage: rf1 \r\n"); - return; - } - rdiv = SI41XX_FREF * 1000/phase; - ndiv = freq * rdiv / (1000*SI41XX_FREF); - - si_write_reg(SI41XX_REG_RF2_NDIV, ndiv); - si_write_reg(SI41XX_REG_RF2_RDIV, rdiv); - - chprintf(sd, "INFO: freqency set at %d Khz, phase set at %d Khz.\r\n", freq, phase); -} - - -/* - * shell commands for user entry - * This lets the user update IF registers via the chibios shell - * Requires frequency and phase values in KHz. - */ -static void ifr(BaseSequentialStream *sd, int argc, char *argv[]) { - - uint32_t freq; - uint32_t phase; - uint32_t ndiv; - uint32_t rdiv; - - if (argc < 2) { - chprintf(sd, "Usage: rf1 \r\n"); - return; - } - - freq = strtoul(argv[0], NULL, 10); - phase = strtoul(argv[1], NULL, 10); - - if (freq == 0) { - chprintf(sd, "ERROR: freqency cannot be 0. \r\nUsage: rf1 \r\n"); - return; - } - if (phase == 0) { - chprintf(sd, "ERROR: phase value cannot be 0. \r\nUsage: rf1 \r\n"); - return; - } - rdiv = SI41XX_FREF * 1000/phase; - ndiv = freq * rdiv / (1000*SI41XX_FREF); - - si_write_reg(SI41XX_REG_IF_NDIV, ndiv); - si_write_reg(SI41XX_REG_IF_RDIV, rdiv); - - chprintf(sd, "INFO: freqency set at %d Khz, phase set at %d Khz.\r\n", freq, phase); -} - - -/* - * shell commands for user entry - * Provides a list of comamnds and their description to Chibios shell user. - */ -static void si_help(BaseSequentialStream *sd, int argc, char *argv[]) { - - (void) argc; - (void) argv; - - chprintf(sd, "Available commands:\r\n"); - chprintf(sd, " reg: Update registers,Usage reg \r\n"); - chprintf(sd, " rf1: Update RF1 registers,Usage: rf1 \r\n"); - chprintf(sd, " rf2: Update RF2 registers,Usage: rf2 \r\n"); - chprintf(sd, " if: Update IF registers,Usage: ifr \r\n"); - chprintf(sd, " ?: provides list of commands\n\n\r\n"); -} - - -/* - * shell commands for user entry - * This is the list of shell commands defined in this program - */ -static const ShellCommand commands[] = { - {"reg", reg}, - {"rf1", rf1}, - {"rf2", rf2}, - {"if", ifr}, - {"?", si_help}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - - -/* - * Entry to our code - */ -int main(void) -{ - - halInit(); - chSysInit(); - app_init(); - - si41xx_init(); - - /* - * Shell manager initialization. - */ - shellInit(); - chThdCreateFromHeap(NULL, THD_WORKING_AREA_SIZE(2048), - "shell1", NORMALPRIO + 1, - shellThread, (void *)&shell_cfg1); - - main_loop(); - return 0; -} diff --git a/src/archive/app_si41xx/source/README.md b/src/archive/app_si41xx/source/README.md deleted file mode 100644 index 9250e2c8..00000000 --- a/src/archive/app_si41xx/source/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App-specific Source - -This contains AX5043 specific files - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_si41xx/source/si41xx.c b/src/archive/app_si41xx/source/si41xx.c deleted file mode 100644 index 733a8bfa..00000000 --- a/src/archive/app_si41xx/source/si41xx.c +++ /dev/null @@ -1,62 +0,0 @@ -/*! \file ax5043.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "si41xx.h" - - - -/** - * writes to an SI4123 register. - * @param address: register address, data: Register data. - * @return void. - */ -void si_write_reg(uint8_t address, uint32_t data) -{ - int i; - uint32_t sdata; - uint32_t mask = 1 << 31; - data = (data << 14) | (address << 10); - - palClearLine(LINE_SI_SENB); - - for(i=0; i<22;i++) - { - palClearLine(LINE_SI_SCLK); - chThdSleepMicroseconds(1); - sdata = data & mask; - if(sdata > 0){ - //chprintf(DEBUG_CHP, "1"); - palSetLine(LINE_SI_SDATA); - } - else{ - //chprintf(DEBUG_CHP, "0"); - palClearLine(LINE_SI_SDATA); - } - chThdSleepMicroseconds(1); - palSetLine(LINE_SI_SCLK); - chThdSleepMicroseconds(1); - data = data <<1; - chThdSleepMicroseconds(1); - } - //chprintf(DEBUG_CHP, " \r\n"); - palSetLine(LINE_SI_SENB); - -} - - - -//!@ - diff --git a/src/archive/app_si41xx/source/si41xx.h b/src/archive/app_si41xx/source/si41xx.h deleted file mode 100644 index 6bee53fc..00000000 --- a/src/archive/app_si41xx/source/si41xx.h +++ /dev/null @@ -1,45 +0,0 @@ -/*! \file ax5043_common.h */ - - -/*! - * \addtogroup ax5043 - * * @{ - * - */ -#ifndef _AX5043_COMMON_H -#define _AX5043_COMMON_H - -#define DEBUG_SERIAL SD2 -#define DEBUG_CHP ((BaseSequentialStream *) &DEBUG_SERIAL) - -#include -#include - - - - -/****************************************************************************** - ******************** AX5043 control SPI registers *************************** - *****************************************************************************/ - -/* Status and test registers */ -#define SI41XX_REG_MAIN_CONFIG 0x0 -#define SI41XX_REG_PHASE_GAIN 0x1 -#define SI41XX_REG_PWRDOWN 0x2 -#define SI41XX_REG_RF1_NDIV 0x3 -#define SI41XX_REG_RF2_NDIV 0x4 -#define SI41XX_REG_IF_NDIV 0x5 -#define SI41XX_REG_RF1_RDIV 0x6 -#define SI41XX_REG_RF2_RDIV 0x7 -#define SI41XX_REG_IF_RDIV 0x8 - -#define SI41XX_FREF 16 - - - - -//function declaration starts here -void si_write_reg(uint8_t address, uint32_t data); - -#endif -//! @} diff --git a/src/archive/app_solardemo/Makefile b/src/archive/app_solardemo/Makefile deleted file mode 100644 index a3bc0eb4..00000000 --- a/src/archive/app_solardemo/Makefile +++ /dev/null @@ -1,205 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x200 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x200 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_solardemo - -# Target settings. -MCU = cortex-m0 -BOARD = ST_NUCLEO32_F042K6 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f0xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F0xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F042x6.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/archive/app_solardemo/cfg/chconf.h b/src/archive/app_solardemo/cfg/chconf.h deleted file mode 100644 index 6f3b51a9..00000000 --- a/src/archive/app_solardemo/cfg/chconf.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_0_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM FALSE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/archive/app_solardemo/cfg/halconf.h b/src/archive/app_solardemo/cfg/halconf.h deleted file mode 100644 index 559849b3..00000000 --- a/src/archive/app_solardemo/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/archive/app_solardemo/cfg/mcuconf.h b/src/archive/app_solardemo/cfg/mcuconf.h deleted file mode 100644 index 666f5dba..00000000 --- a/src/archive/app_solardemo/cfg/mcuconf.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_HSI48_ENABLED FALSE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_SYSCLK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_PLLNODIV STM32_PLLNODIV_DIV2 -#define STM32_USBSW STM32_USBSW_HSI48 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_HSI -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI16_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI17_20_IRQ_PRIORITY 3 -#define STM32_IRQ_EXTI21_22_IRQ_PRIORITY 3 -#define STM32_IRQ_USART1_PRIORITY 3 -#define STM32_IRQ_USART2_PRIORITY 3 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_CKMODE STM32_ADC_CKMODE_ADCCLK -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 -#define STM32_GPT_TIM14_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_IRQ_PRIORITY 3 -#define STM32_I2C_USE_DMA TRUE -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI1 FALSE -#define STM32_I2S_SPI1_MODE (STM32_I2S_MODE_MASTER | \ - STM32_I2S_MODE_RX) -#define STM32_I2S_SPI1_IRQ_PRIORITY 2 -#define STM32_I2S_SPI1_DMA_PRIORITY 1 -#define STM32_I2S_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2S_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 2 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/archive/app_solardemo/main.c b/src/archive/app_solardemo/main.c deleted file mode 100644 index 17feaab6..00000000 --- a/src/archive/app_solardemo/main.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -//=== ChibiOS header files -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -//=== Project header files -#include "oresat.h" - -#include "demo.h" - -//=== Serial configuration -static SerialConfig ser_cfg = -{ - 115200, //Baud rate - 0, // - 0, // - 0, // -}; - -/* - * I2C configuration - */ -static const I2CConfig i2cfg1 = -{ - I2C_100KHZ_TIMINGR, - 0, - 0, -}; - -uint8_t data[8]; - -static void app_init(void) { - //=== App initialization - - // Start up debug output - sdStart(&SD2, &ser_cfg); - - i2cInit(); - i2cStart(&I2CD1, &i2cfg1); - - for (uint8_t i = 0; i < 8; ++i) { - data[i] = 0; - } - - canTPDOObjectInit(CAN_PDO_1, CAN_ID_DEFAULT, 0, 0, 8, data); -} - -static void main_app(void) { - //=== Start application threads - - //Example thread creation - chThdCreateStatic(demo_measure_wa, sizeof(demo_measure_wa), NORMALPRIO, demo_measure, NULL); - - /* - * Begin main loop - */ - while (true) - { - chThdSleepMilliseconds(1000); - } -} - -int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - oresat_init(31); - - // Initialize and start app - app_init(); - main_app(); - - return 0; -} diff --git a/src/archive/app_solardemo/source/README.md b/src/archive/app_solardemo/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/archive/app_solardemo/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/archive/app_solardemo/source/demo.c b/src/archive/app_solardemo/source/demo.c deleted file mode 100644 index 92591760..00000000 --- a/src/archive/app_solardemo/source/demo.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "demo.h" - -const uint8_t LTC2990_I2C_ADDR = 0b1001100; -static ltc2990_data monitor_data; -static solar_v1_p params; -extern uint8_t data[]; - -// Example blinker thread -THD_WORKING_AREA(demo_measure_wa, 128); -THD_FUNCTION(demo_measure, arg) { - - i2cflags_t i2c_errors = 0x0; - volatile uint8_t regval = 0xf; - - (void)arg; - chRegSetThreadName("demo_measure"); - - regval = 0xf; - - /* CONTROL Setup */ - regval = LTC2990_CONTROL_ACQ_SINGLE - | LTC2990_CONTROL_ALL_MODE_4_3 - | LTC2990_CONTROL_MODE_1_2_0; - - while (!chThdShouldTerminateX()) { - /* TRIGGER */ - regval = 0xf; - ltc2990_writereg(LTC2990_TRIGGER, regval, &i2c_errors); - chThdSleepMilliseconds(LTC2990_TRIGGER_WAIT_MS); - - regval = ltc2990_readreg(LTC2990_CONTROL, &i2c_errors); - - /* CONTROL check status */ - if(!ltc2990_conversion_done(regval)) - { - chThdSleepS(TIME_S2I(1)); - } - else - { - /* READ ALL */ - ltc2990_read_all(&monitor_data, &i2c_errors); - chSysLock(); - data[0] = monitor_data.T_INT_MSB; - data[1] = monitor_data.T_INT_LSB; - data[2] = monitor_data.VCC_MSB; - data[3] = monitor_data.VCC_LSB; - data[4] = monitor_data.V1_MSB; - data[5] = monitor_data.V1_LSB; - data[6] = monitor_data.V3_MSB; - data[7] = monitor_data.V3_LSB; - chSysUnlock(); - - /* TINT */ - ltc2990_error derror; - params.tint = ltc2990_calc_tint(&monitor_data, &derror); - /* VCC */ - params.vcc = ltc2990_calc_vcc(&monitor_data, &derror ); - /* Current */ - params.current = solar_v1_calc_current(&monitor_data, &derror); - /* External Temp */ - params.temp_ext = solar_v1_calc_temp(&monitor_data, &derror) ; - } - - chThdSleepMilliseconds(1000); - } -} diff --git a/src/archive/app_solardemo/source/demo.h b/src/archive/app_solardemo/source/demo.h deleted file mode 100644 index 5e3b1f98..00000000 --- a/src/archive/app_solardemo/source/demo.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _DEMO_H_ -#define _DEMO_H_ - -#include "ch.h" -#include "hal.h" - -#include "ltc2990.h" -#include "solar_v1.h" - -// Example blinker thread prototypes -extern THD_WORKING_AREA(demo_measure_wa, 128); -extern THD_FUNCTION(demo_measure, arg); - -#endif diff --git a/src/archive/app_solardemo/source/ltc2990.c b/src/archive/app_solardemo/source/ltc2990.c deleted file mode 100644 index cc76907d..00000000 --- a/src/archive/app_solardemo/source/ltc2990.c +++ /dev/null @@ -1,139 +0,0 @@ -/*! \file ltc2990.c - * - * API for ltc2990.c - */ - -/*! - * \defgroup ltc2990 Voltage, current and Temperature Monitor - * - * @{ - */ - -#include -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "util_numbers.h" -#include "ltc2990.h" - -extern const uint8_t LTC2990_I2C_ADDR; - -static uint8_t i2c_txbuf[LTC2990_I2C_TX_BUFSIZE]; -static uint8_t i2c_rxbuf[LTC2990_I2C_RX_BUFSIZE]; - -uint8_t ltc2990_readreg(uint8_t reg, i2cflags_t * i2c_errors) -{ - msg_t status = MSG_OK; - systime_t tmo = TIME_MS2I(4); - - i2c_txbuf[0] = reg; - i2c_rxbuf[0] = 0xff; - i2cAcquireBus(&I2CD1); - status = i2cMasterTransmitTimeout(&I2CD1, LTC2990_I2C_ADDR, i2c_txbuf, 1, i2c_rxbuf, 1, tmo); - i2cReleaseBus(&I2CD1); - - if (status != MSG_OK) - { - *i2c_errors = i2cGetErrors(&I2CD1); - } - - return(i2c_rxbuf[0]); -} - -void ltc2990_writereg(uint8_t reg, uint8_t val, i2cflags_t * i2c_errors) -{ - msg_t status = MSG_OK; - systime_t tmo = TIME_MS2I(4); - - i2c_txbuf[0] = reg; - i2c_txbuf[1] = val; - i2cAcquireBus(&I2CD1); - status = i2cMasterTransmitTimeout(&I2CD1, LTC2990_I2C_ADDR, i2c_txbuf, 2, i2c_rxbuf, 0, tmo); - i2cReleaseBus(&I2CD1); - - if (status != MSG_OK) - { - *i2c_errors = i2cGetErrors(&I2CD1); - } -} - -void ltc2990_read_all(ltc2990_data * d, i2cflags_t * i2c_errors) -{ - msg_t status = MSG_OK; - systime_t tmo = TIME_MS2I(4); - - i2c_txbuf[0] = LTC2990_STATUS; - i2cAcquireBus(&I2CD1); - status = i2cMasterTransmitTimeout(&I2CD1, LTC2990_I2C_ADDR, i2c_txbuf, 1, i2c_rxbuf, 0x10, tmo); - i2cReleaseBus(&I2CD1); - - if (status != MSG_OK) - { - *i2c_errors = i2cGetErrors(&I2CD1); - } - else - { - d->STATUS = i2c_rxbuf[0]; - d->CONTROL = i2c_rxbuf[1]; - d->TRIGGER = i2c_rxbuf[2]; - d->NA = i2c_rxbuf[3]; - d->T_INT_MSB = i2c_rxbuf[4]; - d->T_INT_LSB = i2c_rxbuf[5]; - d->V1_MSB = i2c_rxbuf[6]; - d->V1_LSB = i2c_rxbuf[7]; - d->V2_MSB = i2c_rxbuf[8]; - d->V2_LSB = i2c_rxbuf[9]; - d->V3_MSB = i2c_rxbuf[10]; - d->V3_LSB = i2c_rxbuf[11]; - d->V4_MSB = i2c_rxbuf[12]; - d->V4_LSB = i2c_rxbuf[13]; - d->VCC_MSB = i2c_rxbuf[14]; - d->VCC_LSB = i2c_rxbuf[15]; - } -} - -inline bool ltc2990_conversion_done(uint8_t statusreg) -{ - if( ((statusreg & 0xfe) & 0x1) == 0x1) - { - return false; - } - return true; -} - -/* T Internal in C */ -signed int ltc2990_calc_tint(ltc2990_data * d, ltc2990_error * error) -{ - signed int tint_C = 0; - - *error = LTC2990_DATA_INVALID; - if((0x80 & d->T_INT_MSB) != 0) - { - //clear dv bit - d->T_INT_MSB = ((~(1 << 7)) & d->T_INT_MSB); - tint_C = sign_extend_13bit((d->T_INT_MSB << 8) | d->T_INT_LSB); - *error = LTC2990_OK; - } - return(tint_C / 16); -} - -/* VCC in millivolts */ -signed int ltc2990_calc_vcc(ltc2990_data * d, ltc2990_error * error) -{ - uint16_t vcc_bits = 0; - double vcc_volts_d = 0.0; - signed int vcc_millivolts = 0; - - *error = LTC2990_DATA_INVALID; - if((0x80 & d->VCC_MSB) != 0) - { - vcc_bits = ((d->VCC_MSB << 8) | d->VCC_LSB); - vcc_volts_d = 2.5 + ((double)(vcc_bits & 0x3fff) * 0.00030518 ) ; - vcc_millivolts = (signed int)incr_rnd(vcc_volts_d * 1000, 0.1); - *error = LTC2990_OK; - } - return vcc_millivolts; -} - -//! @} diff --git a/src/archive/app_solardemo/source/ltc2990.h b/src/archive/app_solardemo/source/ltc2990.h deleted file mode 100644 index 6789917a..00000000 --- a/src/archive/app_solardemo/source/ltc2990.h +++ /dev/null @@ -1,98 +0,0 @@ -/*! \file ltc2990.h */ - -/*! - * \addtogroup ltc2990 - * * @{ - * - */ -#ifndef _LTC2990_H_ -#define _LTC2990_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "ch.h" -#include "hal.h" - -extern const uint8_t LTC2990_I2C_ADDR; - -typedef struct ltc2990data -{ - uint8_t STATUS; // 0x0 - uint8_t CONTROL; // 0x1 - uint8_t TRIGGER; // ... - uint8_t NA; - uint8_t T_INT_MSB; - uint8_t T_INT_LSB; - uint8_t V1_MSB; - uint8_t V1_LSB; - uint8_t V2_MSB; - uint8_t V2_LSB; - uint8_t V3_MSB; - uint8_t V3_LSB; - uint8_t V4_MSB; - uint8_t V4_LSB; // ... - uint8_t VCC_MSB; // 0xe - uint8_t VCC_LSB; // 0xf -} ltc2990_data; - -/* HSI Clock selected 8Mhz - see mcuconf.h Wed 03 May 2017 12:54:49 (PDT) */ -/* Ref: 26.4.10 table in Reference Manual for stm32f0 */ -typedef enum -{ - I2C_100KHZ_TIMINGR = 0x10420f13, - I2C_400KHZ_TIMINGR = 0x00310309, -} solar_i2c_cfg; - -typedef enum -{ - LTC2990_OK = 0x0, - LTC2990_DATA_INVALID = (0b1 << 0), - LTC2990_SENSOR_SHORT = (0b1 << 2), - LTC2990_SENSOR_OPEN = (0b1 << 3), -} ltc2990_error; - - -#define LTC2990_I2C_TX_BUFSIZE 4U -#define LTC2990_I2C_RX_BUFSIZE 20U - -#define LTC2990_TRIGGER_WAIT_MS 200U - -#define LTC2990_STATUS 0x00U // R Indicates BUSY State, Conversion Sta -#define LTC2990_CONTROL 0x01U // R/W Controls Mode, Single/Repeat, Celsiu -#define LTC2990_TRIGGER 0x02U // R/W Triggers a Conversion -// #define LTC2990_N/A 0x03 // Unused Address -#define LTC2990_TINT_MSB 0x04U // R Internal Temperature MSB -#define LTC2990_TINT_LSB 0x05U // R Internal Temperature LSB -#define LTC2990_V1_MSB 0x06U // R V1, V1 – V2 or TR1 MSB -#define LTC2990_V1_LSB 0x07U // R V1, V1 – V2 or TR1 LSB -#define LTC2990_V2_MSB 0x08U // R V2, V1 – V2 or TR1 MSB -#define LTC2990_V2_LSB 0x09U // R V2, V1 – V2 or TR1 LSB -#define LTC2990_V3_MSB 0x0AU // R V3, V3 – V4 or TR2 MSB -#define LTC2990_V3_LSB 0x0BU // R V3, V3 – V4 or TR2 LSB -#define LTC2990_V4_MSB 0x0CU // R V4, V3 – V4 or TR2 MSB -#define LTC2990_V4_LSB 0x0DU // R V4, V3 – V4 or TR2 LSB -#define LTC2990_VCC_MSB 0x0EU // R VCC MSB -#define LTC2990_VCC_LSB 0x0FU // R VCC LSB - -#define LTC2990_CONTROL_ACQ_SINGLE (0b1<<6) -#define LTC2990_CONTROL_ALL_MODE_4_3 (0b11<<3) -#define LTC2990_CONTROL_MODE_1_2_0 (0b001<<0) - -uint8_t ltc2990_readreg(uint8_t reg, i2cflags_t * i2c_errors); - -void ltc2990_writereg(uint8_t reg, uint8_t val, i2cflags_t * i2c_errors); -void ltc2990_read_all(ltc2990_data * d, i2cflags_t * i2c_errors); - -bool ltc2990_conversion_done(uint8_t statusreg); -signed int ltc2990_calc_tint(ltc2990_data * d, ltc2990_error * error); -signed int ltc2990_calc_vcc(ltc2990_data * d, ltc2990_error * error); - -#ifdef __cplusplus -} -#endif - -#endif -//! @} diff --git a/src/archive/app_solardemo/source/solar_v1.c b/src/archive/app_solardemo/source/solar_v1.c deleted file mode 100644 index e11715fc..00000000 --- a/src/archive/app_solardemo/source/solar_v1.c +++ /dev/null @@ -1,76 +0,0 @@ -/*! \file solar_v1.c - * - * API for solar_v1.c - */ - -/*! - * \defgroup solar_v1 Voltage, current and Temperature Monitor - * - * @{ - */ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "util_numbers.h" - -#include "ltc2990.h" - -#include "solar_v1.h" - -/* Current through Rsense in mA */ -signed int solar_v1_calc_current(ltc2990_data * d, ltc2990_error * error) -{ - uint8_t SIGN = 0; - uint16_t v_bits = 0; - double v_volts_d = 0.0; - double i_amps_d = 0.0; - signed int i_milliamps = INT_MIN; - - *error = LTC2990_DATA_INVALID; - if((0x80 & d->V1_MSB) != 0) - { - SIGN = ((d->V1_MSB & (1 << 6)) >> 6); - v_bits = ((d->V1_MSB << 8) | d->V1_LSB); - v_volts_d = (double)(v_bits & 0x3fff) * 0.00001942 ; - i_amps_d = v_volts_d / 0.18; - i_milliamps = (signed int)incr_rnd(i_amps_d * 1000, 0.1); - if(SIGN == 1) - { - i_milliamps *= -1; - } - *error = LTC2990_OK; - } - return i_milliamps; -} - -/* External Temp in C */ -signed int solar_v1_calc_temp(ltc2990_data * d, ltc2990_error * error) -{ - signed int text_C = INT_MIN; - - *error = LTC2990_DATA_INVALID; - if(((0x1 << 6) & d->V3_MSB) != 0) - { - *error = LTC2990_SENSOR_SHORT; - } - else if (((0x1 << 5) & d->V3_MSB) != 0) - { - *error = LTC2990_SENSOR_OPEN; - } - else if((0x80 & d->V3_MSB) != 0) - { - //clear dv bit - d->V3_MSB = ((~(1 << 7)) & d->V3_MSB); - text_C = sign_extend_13bit((d->V3_MSB << 8) | d->V3_LSB); - *error = LTC2990_OK; - } - return(text_C / 16); -} - - -//! @} diff --git a/src/archive/app_solardemo/source/solar_v1.h b/src/archive/app_solardemo/source/solar_v1.h deleted file mode 100644 index bceff2a4..00000000 --- a/src/archive/app_solardemo/source/solar_v1.h +++ /dev/null @@ -1,37 +0,0 @@ -/*! \file solar_v1.h */ - -/*! - * \addtogroup solar_v1 - * * @{ - * - */ -#ifndef _SOLAR_V1_H_ -#define _SOLAR_V1_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "ch.h" -#include "hal.h" - -#include "ltc2990.h" -typedef struct solar_v1_params -{ - signed int tint; - signed int vcc; - signed int current; - signed int temp_ext; -} solar_v1_p; - - -signed int solar_v1_calc_temp(ltc2990_data * d, ltc2990_error * error); -signed int solar_v1_calc_current(ltc2990_data * d, ltc2990_error * error); - -#ifdef __cplusplus -} -#endif - -#endif -//! @} diff --git a/src/archive/app_solardemo/source/util_numbers.c b/src/archive/app_solardemo/source/util_numbers.c deleted file mode 100644 index f8f07b9a..00000000 --- a/src/archive/app_solardemo/source/util_numbers.c +++ /dev/null @@ -1,65 +0,0 @@ - -/*! \file util_numbers.c - * - * Number utilities - * - * @defgroup util_numbers Numbers Utilities - * @{ - */ - - -#include "util_numbers.h" - -/* - * Given a number d - * An increment m - * 1. create y = x/m - * 2. q = int(Round y) - * 3. z = q * m - * - */ -double incr_rnd(double d, double m) -{ - - int q; - double y = 0; - double z = 0; - - y = d / m; - - q = round_nearest(y); - - z = q * m; - - return z; - -} - -/*! - * Reference - * https://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend - * - * Note: Clear bits 14->31 prior to calling. - * Warning: Untested on 64 bit integers. - * - * example - * //clear dv bit - * tint_msb = ((~(1 << 7)) & tint_msb); - * tint = sign_extend_12bit((tint_msb << 8) | tint_lsb); - * - */ -signed int sign_extend_13bit(signed int x) -{ - signed int r = 0; - struct - { - signed int x: 13; - } s; - - r = s.x = x; - - return r; -} - - -//! @} diff --git a/src/archive/app_solardemo/source/util_numbers.h b/src/archive/app_solardemo/source/util_numbers.h deleted file mode 100644 index 3a5514a1..00000000 --- a/src/archive/app_solardemo/source/util_numbers.h +++ /dev/null @@ -1,33 +0,0 @@ -/*! \file util_numbers.h - * \addtogroup util_numbers - * @{ - */ - -#ifndef UTIL_NUMBERS_H_ -#define UTIL_NUMBERS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -static inline int round_nearest(float f) -{ - return((f < 0) ? ((int)(f - 0.5f)) : ((int)(f + 0.5f))); - //if(f<0) { - //return((int)(f-0.5f)); - //} - //return (int)(f + 0.5f); -} - - -double incr_rnd(double d, double m) ; -signed int sign_extend_13bit(signed int); - -#ifdef __cplusplus -} -#endif - -#endif - -//! @} - diff --git a/src/f0/app_adcs/Makefile b/src/f0/app_adcs/Makefile index 8cf042b9..f60e5ba7 100644 --- a/src/f0/app_adcs/Makefile +++ b/src/f0/app_adcs/Makefile @@ -126,7 +126,6 @@ endif # Project specific files. include $(PROJ_SRC)/oresat.mk include $(PROJ_SRC)/bmi088.mk -include $(PROJ_SRC)/mmc5883ma.mk include $(PROJ_SRC)/mmc5983ma.mk include $(PROJ_SRC)/ltc4305.mk diff --git a/src/f4/README.md b/src/f4/README.md deleted file mode 100644 index 9c6d5a69..00000000 --- a/src/f4/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# STM32F446RE - -This is the source directory for all STM32F439Zx applications. -This device contains an ARM Cortex-M4, and is also known as an M4 or F4. - -This MCU implements the main Command, Communications, and Control system -for OreSat. - -## Testing the toolchain -After having installed the required toolchain components as described in -the Prerequesites section of the main README, it is good to test that -they all function as expected. This can be done by building and flashing -the `app_blinky` application that simply blinks an LED. - -In order to accomplish this, from this directory simply execute the -following: - -``` -cd app_blinky -make -make write -``` -This should result in a clean no-error build, followed by a successful -write to the board and a flashing green LED. If this all works, -congratulations! Your toolchain is working and you can begin developing. - -## Creating an app -The template to copy for new applications is [app_template](app_template). -To create a new app, simply make a copy of the app_template directory -and name it whatever you like. From this directory: - -``` -cp -R app_template app_ -``` - -Then, open the Makefile `app_/Makefile` and edit the line `PROJECT =` to whatever name -you've chosen: - -If building for a specific board, also update the `BOARD =` line to the -board defined in the `boards` directory. -``` -PROJECT = app_ -``` - -At this point, you simply write code in source files under the `sources` -directory, include the appropriate header file in the main.c file, -and finally register your worker with the main OreSat application. - -See the doc folder for further documentation. diff --git a/src/f4/app_blinky/Makefile b/src/f4/app_blinky/Makefile deleted file mode 100644 index 71b1cd07..00000000 --- a/src/f4/app_blinky/Makefile +++ /dev/null @@ -1,205 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_blinky - -# Target settings. -MCU = cortex-m4 -BOARD = ST_NUCLEO64_F446RE - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Project specific files. -#include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/f4/app_blinky/README.md b/src/f4/app_blinky/README.md deleted file mode 100644 index ae8def29..00000000 --- a/src/f4/app_blinky/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# Toolchain Test Application -`app_blinky` is a simple app that blinks a dev board's LED at 1Hz with a 50% duty cycle. - -To ensure you have your toolchain correctly installed and configured, -you simply need to run the following sequence of commands: - -``` -make -make write -``` - -If you see something like the following output for each, your -toolchain works: - -``` -âžœ make -Compiler Options -arm-none-eabi-gcc -c -mcpu=cortex-m0 -mthumb -Og -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -Wall -Wextra -Wundef -Wstrict-prototypes -Wa,-alms=./build/lst/ -DCORTEX_USE_FPU=FALSE -DPORT_IGNORE_GCC_VERSION_CHECK -MD -MP -MF ./.dep/build.d -I. -I./cfg -I../../../ChibiOS/os/license -I../../../ChibiOS/os/common/portability/GCC -I../../../ChibiOS/os/common/startup/ARMCMx/compilers/GCC -I../../../ChibiOS/os/common/startup/ARMCMx/devices/STM32F0xx -I../../../ChibiOS/os/common/ext/ARM/CMSIS/Core/Include -I../../../ChibiOS/os/common/ext/ST/STM32F0xx -I../../../ChibiOS/os/hal/include -I../../../ChibiOS/os/hal/ports/common/ARMCMx -I../../../ChibiOS/os/hal/ports/STM32/STM32F0xx -I../../../ChibiOS/os/hal/ports/STM32/LLD/ADCv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/CANv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/DACv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/DMAv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/EXTIv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/GPIOv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/I2Cv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/RTCv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/SPIv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/TIMv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/USARTv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/USBv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/xWDGv1 -I../../../boards/ST_NUCLEO32_F042K6 -I../../../ChibiOS/os/hal/osal/rt-nil -I../../../ChibiOS/os/rt/include -I../../../ChibiOS/os/oslib/include -I../../../ChibiOS/os/common/ports/ARMCMx -I../../../ChibiOS/os/common/ports/ARMCMx/compilers/GCC -I../../../common/include main.c -o main.o - -Compiling crt0_v6m.S -Compiling vectors.S -Compiling chcoreasm_v6m.S -Compiling crt1.c -Compiling hal.c -Compiling hal_st.c -Compiling hal_buffers.c -Compiling hal_queues.c -Compiling hal_flash.c -Compiling hal_mmcsd.c -Compiling hal_pal.c -Compiling hal_serial.c -Compiling nvic.c -Compiling stm32_isr.c -Compiling hal_lld.c -Compiling stm32_dma.c -Compiling stm32_exti.c -Compiling hal_pal_lld.c -Compiling hal_st_lld.c -Compiling hal_serial_lld.c -Compiling board.c -Compiling osal.c -Compiling chsys.c -Compiling chdebug.c -Compiling chtrace.c -Compiling chvt.c -Compiling chschd.c -Compiling chthreads.c -Compiling chregistry.c -Compiling chsem.c -Compiling chmtx.c -Compiling chcond.c -Compiling chevents.c -Compiling chmsg.c -Compiling chdynamic.c -Compiling chmboxes.c -Compiling chmemcore.c -Compiling chmempools.c -Compiling chpipes.c -Compiling chcore.c -Compiling chcore_v6m.c -Compiling main.c -Linking build/app_blinky.elf -Creating build/app_blinky.hex -Creating build/app_blinky.bin -Creating build/app_blinky.dmp - - text data bss dec hex filename - 4952 0 6144 11096 2b58 build/app_blinky.elf -Creating build/app_blinky.list - -Done - -âžœ make write -st-flash --reset --format ihex write ./build/app_blinky.hex -st-flash 1.6.1 -2020-07-30T13:29:22 INFO common.c: F09X: 32 KiB SRAM, 256 KiB flash in at least 2 KiB pages. -2020-07-30T13:29:22 INFO common.c: Attempting to write 5192 (0x1448) bytes to stm32 address: 134217728 (0x8000000) -2020-07-30T13:29:22 INFO common.c: Flash page at addr: 0x08000000 erased -2020-07-30T13:29:22 INFO common.c: Flash page at addr: 0x08000800 erased -2020-07-30T13:29:22 INFO common.c: Flash page at addr: 0x08001000 erased -2020-07-30T13:29:22 INFO common.c: Finished erasing 3 pages of 2048 (0x800) bytes -2020-07-30T13:29:22 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id -2020-07-30T13:29:22 INFO flash_loader.c: Successfully loaded flash loader in sram - 3/3 pages written -2020-07-30T13:29:22 INFO common.c: Starting verification of write complete -2020-07-30T13:29:22 INFO common.c: Flash written and verified! jolly good! -``` diff --git a/src/f4/app_blinky/cfg/chconf.h b/src/f4/app_blinky/cfg/chconf.h deleted file mode 100644 index 29b34229..00000000 --- a/src/f4/app_blinky/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE TRUE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/f4/app_blinky/cfg/halconf.h b/src/f4/app_blinky/cfg/halconf.h deleted file mode 100644 index 534c4bb6..00000000 --- a/src/f4/app_blinky/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/f4/app_blinky/cfg/mcuconf.h b/src/f4/app_blinky/cfg/mcuconf.h deleted file mode 100644 index e0792bdb..00000000 --- a/src/f4/app_blinky/cfg/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/f4/app_blinky/main.c b/src/f4/app_blinky/main.c deleted file mode 100644 index 9b287051..00000000 --- a/src/f4/app_blinky/main.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* ChibiOS header files */ -#include "ch.h" -#include "hal.h" - -int main(void) -{ - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - palSetLineMode(LINE_LED,PAL_MODE_OUTPUT_PUSHPULL); - - while (true) - { - palClearLine(LINE_LED); - chThdSleepMilliseconds(500); - palSetLine(LINE_LED); - chThdSleepMilliseconds(500); - } - - return 0; -} diff --git a/src/f4/app_cantest/Makefile b/src/f4/app_cantest/Makefile deleted file mode 100644 index c00a090e..00000000 --- a/src/f4/app_cantest/Makefile +++ /dev/null @@ -1,223 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = hard -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_cantest - -# Target settings. -MCU = cortex-m4 -BOARD = ORESAT_C3_V4 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep -ODDIR := $(APP_ROOT)/od - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -ifeq ($(ORESAT),) - ORESAT = 0.5 -endif - -# generate OD.c/OD.h from oresat-configs -FW_VERSION = $(shell git describe --always) -$(shell oresat-gen-fw-files --oresat $(ORESAT) base -d $(ODDIR) -fw $(FW_VERSION) -hw $(BOARD)) -# add them -ALLCSRC += $(ODDIR)/OD.c -ALLINC += $(ODDIR) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk -include $(PROJ_SRC)/CO_master.mk -include $(PROJ_SRC)/bootloader.mk -include $(PROJ_SRC)/rtc.mk -include $(PROJ_SRC)/fs.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -include $(CHIBIOS)/test/lib/test.mk -include $(CHIBIOS)/test/rt/rt_test.mk -include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk -include $(CHIBIOS)/os/various/shell/shell.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F429xI.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -DSHELL_ENABLE -DSHELL_CONFIG_FILE -DLFS_CONFIG=lfs_util_custom.h - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/f4/app_cantest/README.md b/src/f4/app_cantest/README.md deleted file mode 100644 index e5f134b0..00000000 --- a/src/f4/app_cantest/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# OreSat C3 Firmware Application -This application implements the core C3 firmware, responsible for -interfacing with and managing all subsystems on OreSat, as well as -communicating with ground stations. This initial version simply -implements a command interface via radio, and responds with telemetry -indicating subsystem health status. - -## Directory Structure -This folder contains the root of an applications sources. It contains -several files and folders: -* [main.c](main.c): The main program file called by ChibiOS. Contains - initialization code and registers threads and functions. -* [Makefile](Makefile): The main Makefile for the application. Sources - all other build files. -* [cfg](cfg): The directory containing ChibiOS's configuration files for - this application. -* [source](source): The directory where application code is put. - Everything within this directory automatically builds. diff --git a/src/f4/app_cantest/cfg/CO_driver_custom.h b/src/f4/app_cantest/cfg/CO_driver_custom.h deleted file mode 100644 index 2e98648e..00000000 --- a/src/f4/app_cantest/cfg/CO_driver_custom.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef CO_DRIVER_CUSTOM_H -#define CO_DRIVER_CUSTOM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define CO_CONFIG_NMT (CO_CONFIG_NMT_CALLBACK_CHANGE | \ - CO_CONFIG_NMT_MASTER | \ - CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE | \ - CO_CONFIG_GLOBAL_FLAG_TIMERNEXT) - -#define CO_CONFIG_SDO_CLI (CO_CONFIG_SDO_CLI_ENABLE | \ - CO_CONFIG_SDO_CLI_SEGMENTED | \ - CO_CONFIG_SDO_CLI_BLOCK | \ - CO_CONFIG_SDO_CLI_LOCAL | \ - CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE | \ - CO_CONFIG_GLOBAL_FLAG_TIMERNEXT | \ - CO_CONFIG_GLOBAL_FLAG_OD_DYNAMIC) - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CO_DRIVER_CUSTOM_H */ diff --git a/src/f4/app_cantest/cfg/chconf.h b/src/f4/app_cantest/cfg/chconf.h deleted file mode 100644 index 53dfa662..00000000 --- a/src/f4/app_cantest/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/f4/app_cantest/cfg/halconf.h b/src/f4/app_cantest/cfg/halconf.h deleted file mode 100644 index c6c76917..00000000 --- a/src/f4/app_cantest/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS TRUE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS TRUE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_LINE -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/f4/app_cantest/cfg/mcuconf.h b/src/f4/app_cantest/cfg/mcuconf.h deleted file mode 100644 index 7aff5ad0..00000000 --- a/src/f4/app_cantest/cfg/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 16 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 8 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 8 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 8 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSE -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLL -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 TRUE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/f4/app_cantest/cfg/shellconf.h b/src/f4/app_cantest/cfg/shellconf.h deleted file mode 100644 index c31de933..00000000 --- a/src/f4/app_cantest/cfg/shellconf.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef SHELLCONF_H -#define SHELLCONF_H - -#define SHELL_MAX_ARGUMENTS 10 -#define SHELL_USE_HISTORY TRUE -#define SHELL_USE_ESC_SEQ TRUE -#define SHELL_PROMPT_STR "OreSat> " - -#endif diff --git a/src/f4/app_cantest/main.c b/src/f4/app_cantest/main.c deleted file mode 100644 index f3553a69..00000000 --- a/src/f4/app_cantest/main.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* ChibiOS header files */ -#include "ch.h" -#include "hal.h" -#include "shell.h" - -/* Project header files */ -#include "oresat.h" -#include "rtc.h" -#include "can_bootloader.h" -#ifdef SHELL_ENABLE -#include "cmd.h" -#endif - -/* -static const oresat_node_t nodes[] = { - {0x02, 0x00, 2000, "Battery 1"}, - {0x03, 0x00, 2000, "Battery 2"}, - {0x04, 0x00, 2000, "Solar Panel 1"}, - {0x05, 0x00, 2000, "Solar Panel 2"}, - {0x06, 0x00, 2000, "Solar Panel 3"}, - {0x07, 0x00, 2000, "Solar Panel 4"}, - {0x08, 0x00, 2000, "Solar Panel 5"}, - {0x09, 0x00, 2000, "Solar Panel 6"}, - {0x0A, 0x00, 2000, "Solar Panel 7"}, - {0x0B, 0x00, 2000, "Solar Panel 8"}, - {0x31, 0x18, 2000, "Protocard 1"}, - {0x32, 0x19, 2000, "Protocard 2"}, - {0x33, 0x1A, 2000, "Protocard 3"}, - {0x11, 0x1D, 2000, "Star Tracker"} -}; -*/ - -#ifdef SHELL_ENABLE -static worker_t cmd_worker; -static thread_descriptor_t cmd_desc = { - .name = "Shell", - .wbase = THD_WORKING_AREA_BASE(cmd_wa), - .wend = THD_WORKING_AREA_END(cmd_wa), - .prio = NORMALPRIO, - .funcp = cmd, - .arg = NULL -}; -#endif - -static flt_reg_t fifo1_filters[] = { - { - .scale16.id_mask[0].STID = ORESAT_BOOTLOADER_CAN_COMMAND_GET, - .scale16.id_mask[1].STID = ORESAT_BOOTLOADER_CAN_COMMAND_READ_MEMORY, - }, - { - .scale16.id_mask[0].STID = ORESAT_BOOTLOADER_CAN_COMMAND_GO, - .scale16.id_mask[1].STID = ORESAT_BOOTLOADER_CAN_COMMAND_WRITE_MEMORY, - }, - { - .scale16.id_mask[0].STID = ORESAT_BOOTLOADER_CAN_COMMAND_ERASE, - .scale16.id_mask[1].STID = CAN_BOOTLOADER_WRITE_MEMORY_RESPONSE_SID, - }, - { - .scale16.id_mask[0].STID = STM32_BOOTLOADER_CAN_ACK, - .scale16.id_mask[1].STID = STM32_BOOTLOADER_CAN_NACK, - } -}; - -static oresat_config_t oresat_conf = { - .cand = &CAND1, - .node_id = 0x01, - .bitrate = ORESAT_DEFAULT_BITRATE, - .fifo1_filters = fifo1_filters, - .filter_count = sizeof(fifo1_filters), -}; - -/** - * @brief App Initialization - */ -static void app_init(void) -{ - - /* Initialize shell worker thread */ -#ifdef SHELL_ENABLE - reg_worker(&cmd_worker, &cmd_desc, true, true); -#endif - - /* Initialize shell and start serial interface */ -#ifdef SHELL_ENABLE - shellInit(); -#endif - sdStart(&SD3, NULL); -} - -/** - * @brief Main Application - */ -int main(void) -{ - // Initialize and start - oresat_init(&oresat_conf); - app_init(); - oresat_start(); - return 0; -} diff --git a/src/f4/app_cantest/source/README.md b/src/f4/app_cantest/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/f4/app_cantest/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/f4/app_cantest/source/cmd.c b/src/f4/app_cantest/source/cmd.c deleted file mode 100644 index e8da8ec1..00000000 --- a/src/f4/app_cantest/source/cmd.c +++ /dev/null @@ -1,51 +0,0 @@ -#include -#include -#include - -#include "cmd.h" -#include "test_time.h" -#include "test_lfs.h" -#include "test_bootloader.h" -#include "chprintf.h" -#include "shell.h" - -static thread_t *shell_tp; - -/*===========================================================================*/ -/* Placeholder */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Shell */ -/*===========================================================================*/ -static const ShellCommand commands[] = { - {"time", cmd_time}, - {"lfs", cmd_lfs}, - {"bootloader", cmd_bootloader}, - {NULL, NULL} -}; - -static char histbuf[SHELL_MAX_HIST_BUFF]; - -static const ShellConfig shell_cfg = { - (BaseSequentialStream *)&SD3, - commands, - histbuf, - sizeof(histbuf), -}; - -THD_WORKING_AREA(shell_wa, 0x1000); -THD_WORKING_AREA(cmd_wa, 0x200); -THD_FUNCTION(cmd, arg) -{ - (void)arg; - - /* Start a shell */ - while (!chThdShouldTerminateX()) { - shell_tp = chThdCreateStatic(shell_wa, sizeof(shell_wa), NORMALPRIO, shellThread, (void *)&shell_cfg); - chThdWait(shell_tp); - chThdSleepMilliseconds(500); - } - - chThdExit(MSG_OK); -} diff --git a/src/f4/app_cantest/source/cmd.h b/src/f4/app_cantest/source/cmd.h deleted file mode 100644 index 86c431df..00000000 --- a/src/f4/app_cantest/source/cmd.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _CMD_H_ -#define _CMD_H_ - -#include "ch.h" -#include "hal.h" - -/* Example blinker thread prototypes */ -extern THD_WORKING_AREA(cmd_wa, 0x200); -extern THD_FUNCTION(cmd, arg); - -#endif diff --git a/src/f4/app_cantest/source/test_bootloader.c b/src/f4/app_cantest/source/test_bootloader.c deleted file mode 100644 index 075280ce..00000000 --- a/src/f4/app_cantest/source/test_bootloader.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include "test_bootloader.h" -#include "can_bootloader.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* Time */ -/*===========================================================================*/ -void cmd_bootloader(BaseSequentialStream *chp, int argc, char *argv[]) -{ - - if (argc < 1) { - goto bootloader_usage; - } - if (!strcmp(argv[0], "cmd1")) { - } else if (!strcmp(argv[0], "cmd2")) { - } else { - goto bootloader_usage; - } - - return; - -bootloader_usage: - chprintf(chp, "Usage: bootloader \r\n" - " cmd1: \r\n" - " Does blah\r\n" - " cmd2: \r\n" - " Does other blah\r\n" - "\r\n"); - return; -} diff --git a/src/f4/app_cantest/source/test_bootloader.h b/src/f4/app_cantest/source/test_bootloader.h deleted file mode 100644 index 8180792d..00000000 --- a/src/f4/app_cantest/source/test_bootloader.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _TEST_BOOTLOADER_H_ -#define _TEST_BOOTLOADER_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_bootloader(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif - diff --git a/src/f4/app_cantest/source/test_lfs.c b/src/f4/app_cantest/source/test_lfs.c deleted file mode 100644 index bf035bc3..00000000 --- a/src/f4/app_cantest/source/test_lfs.c +++ /dev/null @@ -1,206 +0,0 @@ -#include -#include -#include "test_lfs.h" -#include "fs.h" - -#define BUF_SIZE 256 - -/*===========================================================================*/ -/* OreSat LFS Operations */ -/*===========================================================================*/ -void cmd_lfs(BaseSequentialStream *chp, int argc, char *argv[]) -{ - int ret; - lfs_file_t *file; - lfs_dir_t *dir; - struct lfs_info info; - char buf[BUF_SIZE]; - - if (!strcmp(argv[0], "ls") && argc > 1) { - dir = dir_open(&FSD1, argv[1]); - if (dir == NULL) { - chprintf(chp, "Error in dir_open: %d\r\n", FSD1.err); - return; - } - do { - ret = dir_read(&FSD1, dir, &info); - if (ret <= 0) { - if (ret < 0) { - chprintf(chp, "Error in dir_read: %d\r\n", ret); - } - continue; - } - if (info.type == LFS_TYPE_REG) { - chprintf(chp, "reg "); - } else if (info.type == LFS_TYPE_DIR) { - chprintf(chp, "dir "); - } else { - chprintf(chp, "? "); - } - chprintf(chp, "%8u %s\r\n", info.size, info.name); - } while (ret > 0); - ret = dir_close(&FSD1, dir); - if (ret < 0) { - chprintf(chp, "Error in dir_close: %d\r\n", ret); - return; - } - chprintf(chp, "\r\n"); - } else if (!strcmp(argv[0], "mkdir") && argc > 1) { - ret = fs_mkdir(&FSD1, argv[1]); - if (ret < 0) { - chprintf(chp, "Error in fs_mkdir: %d\r\n"); - return; - } - } else if (!strcmp(argv[0], "rm") && argc > 1) { - ret = fs_remove(&FSD1, argv[1]); - if (ret < 0) { - chprintf(chp, "Error in fs_remove: %d\r\n"); - return; - } - } else if (!strcmp(argv[0], "cat") && argc > 1) { - file = file_open(&FSD1, argv[1], LFS_O_RDONLY); - if (file == NULL) { - chprintf(chp, "Error in file_open: %d\r\n", FSD1.err); - return; - } - - ret = file_read(&FSD1, file, buf, BUF_SIZE - 1); - if (ret < 0) { - chprintf(chp, "Error in file_read: %d\r\n", ret); - file_close(&FSD1, file); - return; - } - buf[ret] = '\0'; - chprintf(chp, "%s\r\n", buf); - - ret = file_close(&FSD1, file); - if (ret < 0) { - chprintf(chp, "Error in file_close: %d\r\n", ret); - return; - } - } else if (!strcmp(argv[0], "hexdump") && argc > 1) { - file = file_open(&FSD1, argv[1], LFS_O_RDONLY); - if (file == NULL) { - chprintf(chp, "Error in file_open: %d\r\n", FSD1.err); - return; - } - - ret = file_read(&FSD1, file, buf, BUF_SIZE); - if (ret < 0) { - chprintf(chp, "Error in file_read: %d\r\n", ret); - file_close(&FSD1, file); - return; - } - for (int i = 0; i < ret; i++) { - if (i % 0x10 == 0) chprintf(chp, "\r\n%04X:", i); - chprintf(chp, " %02X", buf[i]); - } - chprintf(chp, "\r\n"); - - ret = file_close(&FSD1, file); - if (ret < 0) { - chprintf(chp, "Error in file_close: %d\r\n", ret); - return; - } - } else if (!strcmp(argv[0], "load") && argc > 1) { - uint8_t buf[BUF_SIZE] = {0}; - char line[BUF_SIZE * 2] = {0}; - char c, *p = line; - size_t count = 0; - file = file_open(&FSD1, argv[1], LFS_O_RDWR | LFS_O_CREAT | LFS_O_TRUNC); - if (file == NULL) { - chprintf(chp, "Error in file_open: %d\r\n", FSD1.err); - return; - } - - while (streamRead(chp, (uint8_t*)&c, 1) != 0 && c != 4) { - c = toupper(c); - - if (isdigit(c) || (c >= 'A' && c <= 'F')) { - streamPut(chp, c); - *(p++) = c; - if (p == &line[BUF_SIZE * 2]) { - for (size_t off = 0; off < BUF_SIZE; off++) { - sscanf(&line[off*2], "%2hhx", &buf[off]); - } - p = line; - ret = file_write(&FSD1, file, buf, BUF_SIZE); - if (ret < 0) { - chprintf(chp, "Error in file_write: %d\r\n", ret); - break; - } - count += ret; - } - } else if ((c == 8) || (c == 127)) { - if (p != line) { - streamPut(chp, 0x08); - streamPut(chp, 0x20); - streamPut(chp, 0x08); - p--; - } - } - } - if (p != line) { - size_t len = (p - line) / 2; - for (size_t off = 0; off < len; off++) { - sscanf(&line[off*2], "%2hhx", &buf[off]); - } - ret = file_write(&FSD1, file, buf, len); - if (ret < 0) { - chprintf(chp, "Error in file_write: %d\r\n", ret); - } else { - count += ret; - } - } - chprintf(chp, "\r\nWrote %u bytes to %s\r\n", count, argv[1]); - - ret = file_close(&FSD1, file); - if (ret < 0) { - chprintf(chp, "Error in file_close: %d\r\n", ret); - return; - } - } else if (!strcmp(argv[0], "mount")) { - chprintf(chp, "Attempting to mount LFS...\r\n"); - ret = fs_mount(&FSD1, false); - if (ret < 0) { - chprintf(chp, "Mount failed: %d\r\n", ret); - return; - } - chprintf(chp, "OK\r\n"); - } else if (!strcmp(argv[0], "unmount")) { - chprintf(chp, "Attempting to unmount LFS...\r\n"); - ret = fs_unmount(&FSD1); - if (ret < 0) { - chprintf(chp, "Unmount failed: %d\r\n", ret); - return; - } - chprintf(chp, "OK\r\n"); - } else if (!strcmp(argv[0], "format")) { - chprintf(chp, "Attempting to format LFS...\r\n"); - ret = fs_format(&FSD1); - if (ret < 0) { - chprintf(chp, "Format failed: %d\r\n", ret); - return; - } - chprintf(chp, "OK\r\n"); - } else { - goto lfs_usage; - } - - return; - -lfs_usage: - chprintf(chp, "Usage: lfs \r\n" - " ls: List directories\r\n" - " mkdir: Make a directory\r\n" - " rm: Delete file or directory\r\n" - " cat: Dump 255 bytes of file as string\r\n" - " hexdump: Dump 255 bytes of file as hex\r\n" - "\r\n" - " mount: Mount LFS\r\n" - " unmount: Unmount LFS\r\n" - " format: Format eMMC for LFS\r\n" - "\r\n"); - return; -} - diff --git a/src/f4/app_cantest/source/test_lfs.h b/src/f4/app_cantest/source/test_lfs.h deleted file mode 100644 index 3867f5ce..00000000 --- a/src/f4/app_cantest/source/test_lfs.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_LFS_H_ -#define _TEST_LFS_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_lfs(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_cantest/source/test_time.c b/src/f4/app_cantest/source/test_time.c deleted file mode 100644 index 08bb44d8..00000000 --- a/src/f4/app_cantest/source/test_time.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include "test_time.h" -#include "rtc.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* Time */ -/*===========================================================================*/ -void cmd_time(BaseSequentialStream *chp, int argc, char *argv[]) -{ - RTCDateTime timespec; - uint32_t msec; - time_scet_t scet; - time_utc_t utc; - if (argc < 1) { - goto time_usage; - } - if (!strcmp(argv[0], "unix")) { - if (!strcmp(argv[1], "get")) { - time_t unix_time = rtcGetTimeUnix(&msec); - char *timestr = ctime(&unix_time); - chprintf(chp, "UNIX Time: %d\r\n" - "Date: %s\r\n", - unix_time, timestr); - } else if (!strcmp(argv[1], "set") && argc > 2) { - rtcSetTimeUnix(strtoul(argv[2], NULL, 0), 0); - } else { - goto time_usage; - } - } else if (!strcmp(argv[0], "scet")) { - if (!strcmp(argv[1], "get")) { - rtcGetTimeSCET(&scet); - chprintf(chp, "SCET Time: %u.%u\r\n", scet.coarse, scet.fine); - } else if (!strcmp(argv[1], "set") && argc > 3) { - scet.coarse = strtoul(argv[2], NULL, 0); - scet.fine = strtoul(argv[3], NULL, 0); - rtcSetTimeSCET(&scet); - } else { - goto time_usage; - } - } else if (!strcmp(argv[0], "utc")) { - if (!strcmp(argv[1], "get")) { - rtcGetTimeUTC(&utc); - chprintf(chp, "UTC Time: Day: %u ms: %u us: %u\r\n", utc.day, utc.ms, utc.us); - } else if (!strcmp(argv[1], "set") && argc > 4) { - utc.day = strtoul(argv[2], NULL, 0); - utc.ms = strtoul(argv[3], NULL, 0); - utc.us = strtoul(argv[4], NULL, 0); - rtcSetTimeUTC(&utc); - } else { - goto time_usage; - } - } else if (!strcmp(argv[0], "raw")) { - rtcGetTime(&RTCD1, ×pec); - chprintf(chp, "Year: %u Month: %u DST: %u DoW: %u Day: %u ms: %u\r\n", - timespec.year, timespec.month, timespec.dstflag, timespec.dayofweek, timespec.day, timespec.millisecond); - } else { - goto time_usage; - } - - return; - -time_usage: - chprintf(chp, "Usage: time unix|scet|utc|raw get|set \r\n"); - return; -} - diff --git a/src/f4/app_cantest/source/test_time.h b/src/f4/app_cantest/source/test_time.h deleted file mode 100644 index 277e16ce..00000000 --- a/src/f4/app_cantest/source/test_time.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_TIME_H_ -#define _TEST_TIME_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_time(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/Makefile b/src/f4/app_control/Makefile deleted file mode 100644 index ca05a408..00000000 --- a/src/f4/app_control/Makefile +++ /dev/null @@ -1,225 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = hard -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_control - -# Target settings. -MCU = cortex-m4 -BOARD = ORESAT_C3_V5 - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep -ODDIR := $(APP_ROOT)/od - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -ifeq ($(ORESAT),) - ORESAT = 0.5 -endif - -# generate OD.c/OD.h from oresat-configs -FW_VERSION = $(shell git describe --always) -$(shell oresat-gen-fw-files --oresat $(ORESAT) base -d $(ODDIR) -fw $(FW_VERSION) -hw $(BOARD)) -# add them -ALLCSRC += $(ODDIR)/OD.c -ALLINC += $(ODDIR) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk -include $(PROJ_SRC)/node_mgr.mk -include $(PROJ_SRC)/rtc.mk -include $(PROJ_SRC)/CO_master.mk -include $(PROJ_SRC)/fs.mk -include $(PROJ_SRC)/radio.mk -include $(PROJ_SRC)/fram.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -include $(CHIBIOS)/test/lib/test.mk -include $(CHIBIOS)/test/rt/rt_test.mk -include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk -include $(CHIBIOS)/os/various/shell/shell.mk - -# Define linker script file here -LDSCRIPT= $(PROJ_ROOT)/ld/STM32F439xI.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -DSHELL_ENABLE -DSHELL_CONFIG_FILE -DFRAM_SHARED_I2C=TRUE -DMAX7310_SHARED_I2C=TRUE -DAX5043_SHARED_SPI=TRUE -DSI41XX_DEVICE=SI4112 -DUSLP_USE_SDLS=1 -DLFS_CONFIG=lfs_util_custom.h -DSTM32_FLASH_DUAL_BANK_PERMANENT=TRUE - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/f4/app_control/README.md b/src/f4/app_control/README.md deleted file mode 100644 index e5f134b0..00000000 --- a/src/f4/app_control/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# OreSat C3 Firmware Application -This application implements the core C3 firmware, responsible for -interfacing with and managing all subsystems on OreSat, as well as -communicating with ground stations. This initial version simply -implements a command interface via radio, and responds with telemetry -indicating subsystem health status. - -## Directory Structure -This folder contains the root of an applications sources. It contains -several files and folders: -* [main.c](main.c): The main program file called by ChibiOS. Contains - initialization code and registers threads and functions. -* [Makefile](Makefile): The main Makefile for the application. Sources - all other build files. -* [cfg](cfg): The directory containing ChibiOS's configuration files for - this application. -* [source](source): The directory where application code is put. - Everything within this directory automatically builds. diff --git a/src/f4/app_control/cfg/CO_driver_custom.h b/src/f4/app_control/cfg/CO_driver_custom.h deleted file mode 100644 index 2e98648e..00000000 --- a/src/f4/app_control/cfg/CO_driver_custom.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef CO_DRIVER_CUSTOM_H -#define CO_DRIVER_CUSTOM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define CO_CONFIG_NMT (CO_CONFIG_NMT_CALLBACK_CHANGE | \ - CO_CONFIG_NMT_MASTER | \ - CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE | \ - CO_CONFIG_GLOBAL_FLAG_TIMERNEXT) - -#define CO_CONFIG_SDO_CLI (CO_CONFIG_SDO_CLI_ENABLE | \ - CO_CONFIG_SDO_CLI_SEGMENTED | \ - CO_CONFIG_SDO_CLI_BLOCK | \ - CO_CONFIG_SDO_CLI_LOCAL | \ - CO_CONFIG_GLOBAL_FLAG_CALLBACK_PRE | \ - CO_CONFIG_GLOBAL_FLAG_TIMERNEXT | \ - CO_CONFIG_GLOBAL_FLAG_OD_DYNAMIC) - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CO_DRIVER_CUSTOM_H */ diff --git a/src/f4/app_control/cfg/chconf.h b/src/f4/app_control/cfg/chconf.h deleted file mode 100644 index 53dfa662..00000000 --- a/src/f4/app_control/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/f4/app_control/cfg/halconf.h b/src/f4/app_control/cfg/halconf.h deleted file mode 100644 index 77a58eac..00000000 --- a/src/f4/app_control/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY TRUE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS TRUE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS TRUE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_LINE -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/f4/app_control/cfg/mcuconf.h b/src/f4/app_control/cfg/mcuconf.h deleted file mode 100644 index 709c4c46..00000000 --- a/src/f4/app_control/cfg/mcuconf.h +++ /dev/null @@ -1,373 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED TRUE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 16 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 8 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 8 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 8 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSE -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLL -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 TRUE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 TRUE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -/* - * CRY driver system settings - */ -#define STM32_CRY_USE_CRYP1 FALSE - -#define STM32_CRY_USE_HASH1 TRUE -#define STM32_CRY_CRYP1_IRQ_PRIORITY 9 -#define STM32_CRY_HASH1_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_CRY_HASH1_DMA_PRIORITY 0 -#define STM32_CRY_HASH_SIZE_THRESHOLD 0 -#define STM32_CRY_HASH_DMA_ERROR_HOOK(cryp) osalSysHalt("DMA failure") - -#endif /* MCUCONF_H */ diff --git a/src/f4/app_control/cfg/shellconf.h b/src/f4/app_control/cfg/shellconf.h deleted file mode 100644 index c31de933..00000000 --- a/src/f4/app_control/cfg/shellconf.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef SHELLCONF_H -#define SHELLCONF_H - -#define SHELL_MAX_ARGUMENTS 10 -#define SHELL_USE_HISTORY TRUE -#define SHELL_USE_ESC_SEQ TRUE -#define SHELL_PROMPT_STR "OreSat> " - -#endif diff --git a/src/f4/app_control/main.c b/src/f4/app_control/main.c deleted file mode 100644 index 37ec6040..00000000 --- a/src/f4/app_control/main.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* ChibiOS header files */ -#include "ch.h" -#include "hal.h" -#include "shell.h" - -/* Project header files */ -#include "oresat.h" -#include "wdt.h" -#include "c3.h" -#include "fram.h" -#include "persist.h" -#include "fs.h" -#include "node_mgr.h" -#include "comms.h" -#include "rtc.h" -#include "CO_master.h" -#ifdef SHELL_ENABLE -#include "cli.h" -#endif - -static const oresat_node_t nodes[] = { - {0x04, 0x18, 10000, true, "Battery 0"}, - /*{0x08, 0x1D, 10000, true, "Battery 1"},*/ - {0x0C, 0x00, 10000, false, "Solar Panel 0"}, - {0x10, 0x00, 10000, false, "Solar Panel 1"}, - {0x14, 0x00, 10000, false, "Solar Panel 2"}, - {0x18, 0x00, 10000, false, "Solar Panel 3"}, - /*{0x1C, 0x00, 10000, false, "Solar Panel 4"},*/ - /*{0x20, 0x00, 10000, false, "Solar Panel 5"},*/ - /*{0x24, 0x00, 10000, false, "Solar Panel 6"},*/ - /*{0x28, 0x00, 10000, false, "Solar Panel 7"},*/ - {0x2C, 0x1C, 10000, false, "Star Tracker 0"}, - /*{0x30, 0x00, 10000, false, "Star Tracker 1"},*/ - {0x34, 0x19, 10000, false, "GPS"}, - {0x38, 0x1A, 10000, false, "ACS"}, - /*{0x3C, 0x20, 10000, false, "RWB 0"},*/ - /*{0x40, 0x21, 10000, false, "RWB 1"},*/ - /*{0x44, 0x22, 10000, false, "RWB 2"},*/ - /*{0x48, 0x23, 10000, false, "RWB 3"},*/ - {0x4C, 0x1B, 10000, false, "DxWiFi"}, - {0x50, 0x1E, 10000, false, "CFC"}, - {0, 0, 0, 0, NULL} -}; - -#ifdef SHELL_ENABLE -static worker_t cli_worker; -static thread_descriptor_t cli_desc = { - .name = "Shell", - .wbase = THD_WORKING_AREA_BASE(cli_wa), - .wend = THD_WORKING_AREA_END(cli_wa), - .prio = NORMALPRIO, - .funcp = cli, - .arg = NULL -}; -#endif -static worker_t wdt_worker; -static thread_descriptor_t wdt_desc = { - .name = "WDT", - .wbase = THD_WORKING_AREA_BASE(wdt_wa), - .wend = THD_WORKING_AREA_END(wdt_wa), - .prio = HIGHPRIO, - .funcp = wdt, - .arg = NULL -}; -static worker_t c3_worker; -static thread_descriptor_t c3_desc = { - .name = "C3", - .wbase = THD_WORKING_AREA_BASE(c3_wa), - .wend = THD_WORKING_AREA_END(c3_wa), - .prio = NORMALPRIO + 1, - .funcp = c3, - .arg = NULL -}; -static worker_t node_mgr_worker; -static thread_descriptor_t node_mgr_desc = { - .name = "Node Manager", - .wbase = THD_WORKING_AREA_BASE(node_mgr_wa), - .wend = THD_WORKING_AREA_END(node_mgr_wa), - .prio = NORMALPRIO, - .funcp = node_mgr, - .arg = (void*)&nodes -}; - -static I2CConfig i2ccfg = { - OPMODE_I2C, - 100000, - STD_DUTY_CYCLE, -}; - -static FRAMConfig framcfg = { - .i2cp = &I2CD2, - .i2ccfg = &i2ccfg, - .saddr = 0x50, -}; - -static SDCConfig sdccfg = { - .bus_width = SDC_MODE_4BIT, -}; - -static FSConfig fscfg = { - .sdcp = &SDCD1, - .sdccfg = &sdccfg, - .mmc_pwr = LINE_MMC_PWR, -}; - -static oresat_config_t oresat_conf = { - .cand = &CAND1, - .node_id = 0x01, - .bitrate = ORESAT_DEFAULT_BITRATE, -}; - -/** - * @brief App Initialization - */ -static void app_init(void) -{ -#ifdef SHELL_ENABLE - /* Initialize shell and start serial interface */ - shellInit(); - sdStart(&SD3, NULL); - /* Register shell worker thread */ - reg_worker(&cli_worker, &cli_desc, true, true); -#endif - - /* Register WDT and C3 worker thread */ - reg_worker(&wdt_worker, &wdt_desc, true, true); - reg_worker(&node_mgr_worker, &node_mgr_desc, true, true); - reg_worker(&c3_worker, &c3_desc, true, true); - start_worker(&wdt_worker); - - /* Start crypto driver */ - cryStart(&CRYD1, NULL); - - /* Initialize FRAM */ - framObjectInit(&FRAMD1); - framStart(&FRAMD1, &framcfg); - - /* Restore OD variables if available */ - persistRestoreAll(); - - /* Prepare filesystem */ - fs_init(&FSD1); - fs_start(&FSD1, &fscfg); - - /* Initialize SDO client */ - sdo_init(); - - /* Initialize and start radio systems */ - comms_init(); - comms_start(); -} - -/** - * @brief Main Application - */ -int main(void) -{ - // Initialize and start - oresat_init(&oresat_conf); - app_init(); - oresat_start(); - return 0; -} diff --git a/src/f4/app_control/source/README.md b/src/f4/app_control/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/f4/app_control/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/f4/app_control/source/beacon.c b/src/f4/app_control/source/beacon.c deleted file mode 100644 index 44436ec2..00000000 --- a/src/f4/app_control/source/beacon.c +++ /dev/null @@ -1,365 +0,0 @@ -#include "beacon.h" -#include "comms.h" -#include "CANopen.h" -#include "OD.h" -#include "ax25.h" -#include "rtc.h" -#include "crc.h" -#include "fs.h" - -/* TODO: Re-implement with OD interface */ -static const ax25_link_t ax25 = { - .dest = OD_PERSIST_APP.x6007_APRS.destCallsign, - .dest_ssid = 0, - .src = OD_PERSIST_APP.x6007_APRS.srcCallsign, - .src_ssid = 0, - .control = AX25_CTRL_UFRAME | _VAL2FLD(AX25_CTRL_U_FLD, AX25_UFRAME_UI), - .sid = AX25_PID_NONE, -}; - -static time_t unix_time; -static uint8_t bank_state; - -static const tlm_item_t tlm_aprs0[] = { - /* User-Defined APRS Start */ - { .type = TLM_MSG, .msg = "{{z" }, - /* Satellite ID */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_PERSIST_APP.x6007_APRS.satelliteID }, - /* Telemetry Version */ - { .type = TLM_VAL, .len = 1, .val = 1 }, - /* C3 State */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x6000_C3_State }, - /* Uptime */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_RAM.x7000_C3_Telemetry.uptime }, - /* RTC Time */ - { .type = TLM_PTR, .len = 4, .ptr = &unix_time }, - /* MCU Temperature */ - /*{ .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x2022_MCU_Sensors.temperature },*/ - /* MCU VREFINT */ - /*{ .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x2022_MCU_Sensors.VREFINT },*/ - /* VBUSP Voltage */ - /*{ .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x2022_MCU_Sensors.VBAT },*/ - /* VBUSP Current */ - /*{ .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x2022_MCU_Sensors.VBUSP_Current },*/ - /* WDT Timeouts */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_PERSIST_STATE.x6004_persistentState.powerCycles }, - /* eMMC Usage */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7000_C3_Telemetry.emmcUsage }, - /* L-Band RX Bytes */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_PERSIST_STATE.x6004_persistentState.lbandRX_Bytes }, - /* L-Band Valid Packets */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_PERSIST_STATE.x6004_persistentState.lbandRX_Packets }, - /* L-Band Last RSSI */ - { .type = TLM_PTR, .len = 1, .ptr = &lband.rssi }, - /* L-Band PLL Lock TODO */ - /*{ .type = TLM_VAL, .len = 1, .val = 0 },*/ - /* UHF Temperature */ - /*{ .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7000_C3_Telemetry.UHF_Temperature },*/ - /* UHF Forward Power */ - /*{ .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7000_C3_Telemetry.UHF_FWD_Pwr },*/ - /* UHF Reverse Power */ - /*{ .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7000_C3_Telemetry.UHF_REV_Pwr },*/ - /* UHF RX Bytes */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_PERSIST_STATE.x6004_persistentState.UHF_RX_Bytes }, - /* UHF Valid Packets */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_PERSIST_STATE.x6004_persistentState.UHF_RX_Packets }, - /* UHF Last RSSI */ - { .type = TLM_PTR, .len = 1, .ptr = &uhf.rssi }, - /* UHF PLL Lock TODO */ - /*{ .type = TLM_VAL, .len = 1, .val = 0 },*/ - /* FW Bank TODO */ - { .type = TLM_PTR, .len = 1, .ptr = &bank_state }, - /* EDL Sequence Count */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_PERSIST_STATE.x6004_persistentState.EDL_SequenceCount }, - /* EDL Rejected Count */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_PERSIST_STATE.x6004_persistentState.EDL_RejectedCount }, - /* CAN1 Status TODO */ - /*{ .type = TLM_VAL, .len = 1, .val = 0 },*/ - /* CAN2 Status TODO */ - /*{ .type = TLM_VAL, .len = 1, .val = 0 },*/ - /* OPD Current */ - /*{ .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7000_C3_Telemetry.OPD_Current },*/ - /* OPD State TODO */ - /*{ .type = TLM_VAL, .len = 1, .val = 0 },*/ - /* Battery 0 Pack 1 vbatt */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vbattBP1 }, - /* Battery 0 Pack 1 vcell */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcellBP1 }, - /* Battery 0 Pack 1 vcell Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcellMaxBP1 }, - /* Battery 0 Pack 1 vcell Min */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcellMinBP1 }, - /* Battery 0 Pack 1 vcell 1 */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcell1BP1 }, - /* Battery 0 Pack 1 vcell 2 */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcell2BP1 }, - /* Battery 0 Pack 1 vcell Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcellAvgBP1 }, - /* Battery 0 Pack 1 Temperature */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.temperatureBP1 }, - /* Battery 0 Pack 1 Temperature Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.temperatureAvgBP1 }, - /* Battery 0 Pack 1 Temperature Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.temperatureMaxBP1 }, - /* Battery 0 Pack 1 Temperature Min */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.temperatureMinBP1 }, - /* Battery 0 Pack 1 Current */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.currentBP1 }, - /* Battery 0 Pack 1 Current Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.currentAvgBP1 }, - /* Battery 0 Pack 1 Current Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.currentMaxBP1 }, - /* Battery 0 Pack 1 Current Min */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.currentMinBP1 }, - /* Battery 0 Pack 1 State */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7001_battery.stateBP1 }, - /* Battery 0 Pack 1 Reported State Of Charge */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7001_battery.reportedStateOfChargeBP1 }, - /* Battery 0 Pack 1 Full Capacity */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.fullCapacityBP1 }, - /* Battery 0 Pack 1 Reported Capacity */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.reportedCapacityBP1 }, - /* Battery 0 Pack 2 vbatt */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vbattBP2 }, - /* Battery 0 Pack 2 vcell */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcellBP2 }, - /* Battery 0 Pack 2 vcell Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcellMaxBP2 }, - /* Battery 0 Pack 2 vcell Min */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcellMinBP2 }, - /* Battery 0 Pack 2 vcell 1 */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcell1BP2 }, - /* Battery 0 Pack 2 vcell 2 */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcell2BP2 }, - /* Battery 0 Pack 2 vcell Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.vcellAvgBP2 }, - /* Battery 0 Pack 2 Temperature */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.temperatureBP2 }, - /* Battery 0 Pack 2 Temperature Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.temperatureAvgBP2 }, - /* Battery 0 Pack 2 Temperature Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.temperatureMaxBP2 }, - /* Battery 0 Pack 2 Temperature Min */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.temperatureMinBP2 }, - /* Battery 0 Pack 2 Current */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.currentBP2 }, - /* Battery 0 Pack 2 Current Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.currentAvgBP2 }, - /* Battery 0 Pack 2 Current Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.currentMaxBP2 }, - /* Battery 0 Pack 2 Current Min */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.currentMinBP2 }, - /* Battery 0 Pack 2 State */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7001_battery.stateBP2 }, - /* Battery 0 Pack 2 Reported State Of Charge */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7001_battery.reportedStateOfChargeBP2 }, - /* Battery 0 Pack 2 Full Capacity */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.fullCapacityBP2 }, - /* Battery 0 Pack 2 Reported Capacity */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7001_battery.reportedCapacityBP2 }, - /* Solar 0 Voltage Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7003_solarPanel.voltageAvg }, - /* Solar 0 Current Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7003_solarPanel.currentAvg }, - /* Solar 0 Power Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7003_solarPanel.powerAvg }, - /* Solar 0 Voltage Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7003_solarPanel.voltageMax }, - /* Solar 0 Current Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7003_solarPanel.currentMax }, - /* Solar 0 Power Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7003_solarPanel.powerMax }, - /* Solar 0 Energy */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7003_solarPanel.energy }, - /* Solar 1 Voltage Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7004_solarPanel.voltageAvg }, - /* Solar 1 Current Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7004_solarPanel.currentAvg }, - /* Solar 1 Power Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7004_solarPanel.powerAvg }, - /* Solar 1 Voltage Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7004_solarPanel.voltageMax }, - /* Solar 1 Current Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7004_solarPanel.currentMax }, - /* Solar 1 Power Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7004_solarPanel.powerMax }, - /* Solar 1 Energy */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7004_solarPanel.energy }, - /* Solar 2 Voltage Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7005_solarPanel.voltageAvg }, - /* Solar 2 Current Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7005_solarPanel.currentAvg }, - /* Solar 2 Power Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7005_solarPanel.powerAvg }, - /* Solar 2 Voltage Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7005_solarPanel.voltageMax }, - /* Solar 2 Current Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7005_solarPanel.currentMax }, - /* Solar 2 Power Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7005_solarPanel.powerMax }, - /* Solar 2 Energy */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7005_solarPanel.energy }, - /* Solar 3 Voltage Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7006_solarPanel.voltageAvg }, - /* Solar 3 Current Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7006_solarPanel.currentAvg }, - /* Solar 3 Power Avg */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7006_solarPanel.powerAvg }, - /* Solar 3 Voltage Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7006_solarPanel.voltageMax }, - /* Solar 3 Current Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7006_solarPanel.currentMax }, - /* Solar 3 Power Max */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7006_solarPanel.powerMax }, - /* Solar 3 Energy */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x7006_solarPanel.energy }, - /* Star Tracker FS Usage */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700B_starTracker.rootPartitionPercent }, - /* Star Tracker Readable Files */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700B_starTracker.freadCacheLength }, - /* Star Tracker Updater Status */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700B_starTracker.updaterStatus }, - /* Star Tracker Updates Cached */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700B_starTracker.updatesAvailable }, - /* Star Tracker Right Ascension */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x700B_starTracker.rightAscension }, - /* Star Tracker Declination */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x700B_starTracker.declination }, - /* Star Tracker Roll */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x700B_starTracker.roll }, - /* Star Tracker Timestamp TODO */ - { .type = TLM_VAL, .len = 4, .val = 0 }, - /* GPS FS Usage */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700D_GPS.rootPartitionPercent }, - /* GPS Readable Files */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700D_GPS.freadCacheLength }, - /* GPS Updater Status */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700D_GPS.updaterStatus }, - /* GPS Updates Cached */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700D_GPS.updatesAvailable }, - /* GPS Status */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700D_GPS.GPS_Status }, - /* GPS Number of Satellites Locked */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700D_GPS.satellitesLocked }, - /* GPS X Pos */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_RAM.x700D_GPS.positionX }, - /* GPS Y Pos */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_RAM.x700D_GPS.positionY }, - /* GPS Z Pos */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_RAM.x700D_GPS.positionZ }, - /* GPS X Velocity */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_RAM.x700D_GPS.velocityX }, - /* GPS Y Velocity */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_RAM.x700D_GPS.velocityY }, - /* GPS Z Velocity */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_RAM.x700D_GPS.velocityZ }, - /* GPS Timestamp TODO */ - { .type = TLM_VAL, .len = 4, .val = 0 }, - /* ACS Roll */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x700E_ACS.gyroRoll }, - /* ACS Pitch */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x700E_ACS.gyroPitch }, - /* ACS Yaw */ - { .type = TLM_PTR, .len = 2, .ptr = &OD_RAM.x700E_ACS.gyroYaw }, - /* ACS IMU Temperature */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x700E_ACS.IMU_Temp }, - /* DxWiFi FS Usage */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7013_dxwifi.rootPartitionPercent }, - /* DxWiFi Readable Files */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7013_dxwifi.freadCacheLength }, - /* DxWiFi Updater Status */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7013_dxwifi.updaterStatus }, - /* DxWiFi Updates Cached */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7013_dxwifi.updatesAvailable }, - /* DxWiFi Transmitting */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7013_dxwifi.transmitting }, -#ifdef ORESAT1 - /* CFC FS Usage */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7014_CFC.rootPartitionPercent }, - /* CFC Readable Files */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7014_CFC.freadCacheLength }, - /* CFC Updater Status */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7014_CFC.updaterStatus }, - /* CFC Updates Cached */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7014_CFC.updatesAvailable }, - /* CFC Enable */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7014_CFC.TEC_Enable }, - /* CFC Saturated */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7014_CFC.TEC_Saturated }, - /* CFC Temperature */ - { .type = TLM_PTR, .len = 1, .ptr = &OD_RAM.x7014_CFC.TEC_Temperature }, - /* CFC Captures */ - { .type = TLM_PTR, .len = 4, .ptr = &OD_RAM.x7014_CFC.TEC_Captures }, -#endif /* ORESAT1 */ -}; - -static const tlm_pkt_t aprs0 = { - .item_cnt = sizeof(tlm_aprs0) / sizeof(tlm_item_t), - .item = tlm_aprs0, -}; - -void *tlm_payload(fb_t *fb, const tlm_pkt_t *pkt) -{ - void *tlm_start = fb->tail; - size_t len, total = 0;; - uint32_t crc; - - for (unsigned int i = 0; i < pkt->item_cnt; i++) { - const tlm_item_t *item = &pkt->item[i]; - switch (item->type) { - case TLM_MSG: - len = strlen(item->msg); - memcpy(fb_put(fb, len), item->msg, len); - break; - case TLM_PTR: - len = item->len; - memcpy(fb_put(fb, len), item->ptr, len); - break; - case TLM_VAL: - len = item->len; - memcpy(fb_put(fb, len), &item->val, len); - break; - default: - return NULL; - } - total += len; - } - crc = crc32(tlm_start, total, 0); - memcpy(fb_put(fb, sizeof(crc)), &crc, sizeof(crc)); - - return tlm_start; -} - -void beacon_send(const radio_cfg_t *cfg) -{ - fb_t *fb = NULL; - while (fb == NULL) { - fb = fb_alloc(AX25_MAX_FRAME_LEN, &tx_fifo); - } - - OD_RAM.x7000_C3_Telemetry.uptime = TIME_I2S(chVTGetSystemTime()); - unix_time = rtcGetTimeUnix(NULL); - bank_state = (SYSCFG->MEMRMP & SYSCFG_MEMRMP_UFB_MODE ? 1 : 0) | ((FLASH->OPTCR & FLASH_OPTCR_BFB2 ? 1 : 0) << 1); - OD_RAM.x7000_C3_Telemetry.emmcUsage = fs_usage(&FSD1); - - fb_reserve(fb, AX25_MAX_HDR_LEN); - fb->data_ptr = tlm_payload(fb, &aprs0); - fb->mac_hdr = ax25_sdu(fb, &ax25); - - /* APRS Beacon */ - ax5043TX(cfg->devp, cfg->profile, fb->data, fb->len, fb->len, NULL, NULL, false); - fb_free(fb, &tx_fifo); - fb = NULL; -} - -THD_FUNCTION(beacon, arg) -{ - const radio_cfg_t *cfg = arg; - - while (!chThdShouldTerminateX()) { - beacon_send(cfg); - chThdSleepMilliseconds(OD_PERSIST_APP.x6003_TX_Control.beaconInterval); - } - - chThdExit(MSG_OK); -} diff --git a/src/f4/app_control/source/beacon.h b/src/f4/app_control/source/beacon.h deleted file mode 100644 index c9acd06d..00000000 --- a/src/f4/app_control/source/beacon.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _BEACON_H_ -#define _BEACON_H_ - -#include "ch.h" -#include "hal.h" -#include "radio.h" - -typedef enum { - TLM_MSG, - TLM_PTR, - TLM_VAL, -} tlm_type_t; - -typedef struct tlm_item { - tlm_type_t type; - size_t len; - union { - char *msg; - void *ptr; - uint32_t val; - }; -} tlm_item_t; - -typedef struct tlm_pkt { - size_t item_cnt; - const tlm_item_t *item; -} tlm_pkt_t; - -#ifdef __cplusplus -extern "C" { -#endif - -void beacon_send(const radio_cfg_t *cfg); -THD_FUNCTION(beacon, arg); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/c3.c b/src/f4/app_control/source/c3.c deleted file mode 100644 index 849e0933..00000000 --- a/src/f4/app_control/source/c3.c +++ /dev/null @@ -1,337 +0,0 @@ -#include "c3.h" -#include "rtc.h" -#include "fram.h" -#include "persist.h" -#include "comms.h" -#include "deployer.h" -#include "fw.h" -#include "worker.h" -#include "CANopen.h" -#include "OD.h" - -/* TODO: Re-implement with OD interface */ - -#define CHIBIOS_EPOCH 315532800U /* ChibiOS Epoch in Unix Time */ - -/* Alarm allocations */ -#define ALARM_A 0 -#define ALARM_B 1 -#define PREDEPLOY_ALARM ALARM_A /* Predeploy timeout alarm number */ -#define TX_ENABLE_ALARM ALARM_B /* TX enable timeout alarm number */ -#define EDL_ALARM ALARM_A /* EDL timeout alarm number */ -#define RESET_ALARM ALARM_A /* Hard reset alarm number */ - -#define BAT_LEVEL_LOW 6500U -#define BAT_LEVEL_HIGH 7000U -#define BAT_LOW (OD_RAM.x7001_battery.vbattBP1 < BAT_LEVEL_LOW && OD_RAM.x7001_battery.vbattBP2 < BAT_LEVEL_LOW) - -/* Global State Variables */ -thread_t *c3_tp; -static time_t boot_time; - -/** - * @brief Alarm event callback - * - * @param[in] rtcp Pointer to @p RTCDriver instance - * @param[in] event Alarm event - * - * @notapi - */ -static void alarmcb(RTCDriver *rtcp, rtcevent_t event) -{ - chSysLockFromISR(); - switch (event) { - case RTC_EVENT_ALARM_A: - rtcSetAlarm(rtcp, ALARM_A, NULL); - chEvtSignalI(c3_tp, C3_EVENT_WAKEUP); - break; - case RTC_EVENT_ALARM_B: - rtcSetAlarm(rtcp, ALARM_B, NULL); - chEvtSignalI(c3_tp, C3_EVENT_WAKEUP); - break; - case RTC_EVENT_WAKEUP: - chEvtSignalI(c3_tp, C3_EVENT_WAKEUP); - break; - default: - break; - } - chSysUnlockFromISR(); -} - -static void c3StateSave(void) -{ - /* Do not store state in predeploy */ - if (OD_RAM.x6000_C3_State[0] == PREDEPLOY) - return; - - /* Get the current state of RTC */ - rtcGetTime(&RTCD1, (RTCDateTime*)(&OD_PERSIST_STATE.x6004_persistentState.timestamp)); - if (RTCD1.rtc->CR & RTC_CR_ALRAE) { - rtcGetAlarm(&RTCD1, ALARM_A, (RTCAlarm*)(&OD_PERSIST_STATE.x6004_persistentState.alarmA)); - } else { - OD_PERSIST_STATE.x6004_persistentState.alarmA = 0; - } - if (RTCD1.rtc->CR & RTC_CR_ALRBE) { - rtcGetAlarm(&RTCD1, ALARM_B, (RTCAlarm*)(&OD_PERSIST_STATE.x6004_persistentState.alarmB)); - } else { - OD_PERSIST_STATE.x6004_persistentState.alarmB = 0; - } - if (RTCD1.rtc->CR & RTC_CR_WUTE) { - rtcSTM32GetPeriodicWakeup(&RTCD1, (RTCWakeup*)(&OD_PERSIST_STATE.x6004_persistentState.wakeup)); - } else { - OD_PERSIST_STATE.x6004_persistentState.wakeup = 0; - } - /* Write state to FRAM */ - persistStoreGroup(&OD_PERSIST_STATE); - /* TODO: Backup/sync with external RTC */ -} - -static void c3StateRestore(void) -{ - time_t unix; - - /* Read the stored state from FRAM */ - persistRestoreGroup(&OD_PERSIST_STATE); - unix = rtcConvertDateTimeToUnix((RTCDateTime*)(&OD_PERSIST_STATE.x6004_persistentState.timestamp), NULL); - - /* TODO: Get RTC values from external RTC and reach quorum */ - if (difftime(unix, rtcGetTimeUnix(NULL)) > 0) { - /* Stored state timestamp is greater */ - rtcSetTime(&RTCD1, (RTCDateTime*)(&OD_PERSIST_STATE.x6004_persistentState.timestamp)); - } - - /* Apply state */ - if (OD_PERSIST_STATE.x6004_persistentState.alarmA != 0) { - rtcSetAlarm(&RTCD1, ALARM_A, (RTCAlarm*)(&OD_PERSIST_STATE.x6004_persistentState.alarmA)); - } - if (OD_PERSIST_STATE.x6004_persistentState.alarmB != 0) { - rtcSetAlarm(&RTCD1, ALARM_B, (RTCAlarm*)(&OD_PERSIST_STATE.x6004_persistentState.alarmB)); - } - if (OD_PERSIST_STATE.x6004_persistentState.wakeup != 0) { - rtcSTM32SetPeriodicWakeup(&RTCD1, (RTCWakeup*)(&OD_PERSIST_STATE.x6004_persistentState.wakeup)); - } -} - -bool delay_deploy(void) -{ - return (difftime(rtcGetTimeUnix(NULL), CHIBIOS_EPOCH) < OD_PERSIST_APP.x6002_deploymentControl.timeout); -} - -/* TODO: Re-enable battery monitoring using new OD interface */ -/* -CO_SDO_abortCode_t OD_BATT_CALLBACK(CO_ODF_arg_t *ODF_arg) -{ - if (!ODF_arg->reading) { - chEvtSignal(c3_tp, C3_EVENT_BAT); - } - - return CO_SDO_AB_NONE; -} -*/ - -bool bat_good(void) -{ - static bool good = true; - - if (good && BAT_LOW) { - good = false; - } else if (!good && !BAT_LOW) { - good = true; - } - - return good; -} - -bool tx_enabled(void) -{ - return (difftime(rtcGetTimeUnix(NULL), OD_PERSIST_STATE.x6004_persistentState.lastTX_Enable) < OD_PERSIST_APP.x6003_TX_Control.timeout); -} - -bool edl_enabled(void) -{ - return (difftime(rtcGetTimeUnix(NULL), OD_PERSIST_STATE.x6004_persistentState.lastEDL) < OD_PERSIST_APP.x6001_stateControl.EDL_Timeout); -} - -bool trigger_reset(void) -{ - return (difftime(rtcGetTimeUnix(NULL), boot_time) >= OD_PERSIST_APP.x6001_stateControl.resetTimeout); -} - -void set_alarm(rtcalarm_t alrm, time_t start, int days, int hours, int minutes, int seconds) -{ - RTCDateTime ref_time; - RTCAlarm alarm; - - /* Encode alarm value */ - rtcConvertUnixToDateTime(&ref_time, start, 0); - alarm.alrmr = rtcEncodeRelAlarm(&ref_time, days, hours, minutes, seconds); - - /* Set alarm */ - rtcSetAlarm(&RTCD1, alrm, &alarm); -} - -/* Main Command, Communications, and Control Thread */ -THD_WORKING_AREA(c3_wa, 0x400); -THD_FUNCTION(c3, arg) -{ - (void)arg; - - c3_tp = chThdGetSelfX(); - rtcSetCallback(&RTCD1, alarmcb); - /*CO_OD_configure(CO->SDO[0], OD_7001_battery, OD_BATT_CALLBACK, NULL, NULL, 0);*/ - - /* Restore saved state */ - c3StateRestore(); - - /* Log boot time */ - boot_time = rtcGetTimeUnix(NULL); - - /* Increment power cycles */ - OD_PERSIST_STATE.x6004_persistentState.powerCycles++; - - /* State loop */ - while (!chThdShouldTerminateX()) { - RTCWakeup wakeup; - switch (OD_RAM.x6000_C3_State[0]) { - case PREDEPLOY: - /* Check if pre-deployment timeout has occured */ - if (delay_deploy()) { - /* Must wait for pre-deployment timeout */ - set_alarm(PREDEPLOY_ALARM, CHIBIOS_EPOCH, 0, 0, 0, OD_PERSIST_APP.x6002_deploymentControl.timeout); - /* Initially enable TX */ - tx_enable(true); - chEvtWaitAny(C3_EVENT_WAKEUP | C3_EVENT_TERMINATE); - } else { - /* Enter deploy state */ - OD_RAM.x6000_C3_State[0] = DEPLOY; - } - break; - case DEPLOY: - /* Set RTC wakeup alarm for state saving */ - wakeup.wutr = (RTC_CR_WUCKSEL_2 << 16) | (OD_PERSIST_APP.x6001_stateControl.saveInterval - 1); - rtcSTM32SetPeriodicWakeup(&RTCD1, &wakeup); - - /* Initiate antenna deployment if needed */ - static uint8_t attempts = 0; - if (!OD_PERSIST_STATE.x6004_persistentState.deployed && attempts < OD_PERSIST_APP.x6002_deploymentControl.attempts) { - if (bat_good()) { - deploy_heli(OD_PERSIST_APP.x6002_deploymentControl.actuationTime); - deploy_turn(OD_PERSIST_APP.x6002_deploymentControl.actuationTime); - attempts++; - } else { - chEvtWaitAny(C3_EVENT_WAKEUP | C3_EVENT_TERMINATE | C3_EVENT_BAT); - } - } else { - /* Enter standy state */ - OD_RAM.x6000_C3_State[0] = STANDBY; - OD_PERSIST_STATE.x6004_persistentState.deployed = 1; - attempts = 0; - } - break; - case STANDBY: - beacon_enable(false); - - if (edl_enabled()) { - OD_RAM.x6000_C3_State[0] = EDL; - } else if (trigger_reset()) { - hard_reset(); - } else if (tx_enabled() && bat_good()) { - OD_RAM.x6000_C3_State[0] = BEACON; - } else { - chEvtWaitAny(C3_EVENT_WAKEUP | C3_EVENT_TERMINATE | C3_EVENT_TX | C3_EVENT_BAT | C3_EVENT_EDL); - } - break; - case BEACON: - beacon_enable(true); - - if (edl_enabled()) { - OD_RAM.x6000_C3_State[0] = EDL; - } else if (trigger_reset()) { - hard_reset(); - } else if (!tx_enabled() || !bat_good()) { - OD_RAM.x6000_C3_State[0] = STANDBY; - } else { - chEvtWaitAny(C3_EVENT_WAKEUP | C3_EVENT_TERMINATE | C3_EVENT_TX | C3_EVENT_BAT | C3_EVENT_EDL); - } - break; - case EDL: - beacon_enable(false); - - if (!edl_enabled()) { - set_alarm(RESET_ALARM, rtcGetTimeUnix(NULL), 0, 0, 0, OD_PERSIST_APP.x6001_stateControl.resetTimeout); - if (tx_enabled() && bat_good()) { - OD_RAM.x6000_C3_State[0] = BEACON; - } else { - OD_RAM.x6000_C3_State[0] = STANDBY; - } - } else { - chEvtWaitAny(C3_EVENT_WAKEUP | C3_EVENT_TERMINATE | C3_EVENT_EDL); - } - break; - default: - OD_RAM.x6000_C3_State[0] = PREDEPLOY; - break; - }; - - c3StateSave(); - } - - rtcSetCallback(&RTCD1, NULL); - rtcSTM32SetPeriodicWakeup(&RTCD1, NULL); - rtcSetAlarm(&RTCD1, 0, NULL); - rtcSetAlarm(&RTCD1, 1, NULL); - chThdExit(MSG_OK); -} - -void tx_enable(bool state) -{ - if (state) { - OD_PERSIST_STATE.x6004_persistentState.lastTX_Enable = rtcGetTimeUnix(NULL); - set_alarm(TX_ENABLE_ALARM, OD_PERSIST_STATE.x6004_persistentState.lastTX_Enable, 0, 0, 0, OD_PERSIST_APP.x6003_TX_Control.timeout); - } else { - OD_PERSIST_STATE.x6004_persistentState.lastTX_Enable = 0; - rtcSetAlarm(&RTCD1, TX_ENABLE_ALARM, NULL); - } - chEvtSignal(c3_tp, C3_EVENT_TX); -} - -void edl_enable(bool state) -{ - /* Do not enable EDL if in predeploy state */ - if (OD_RAM.x6000_C3_State[0] == PREDEPLOY) - return; - - if (state) { - OD_PERSIST_STATE.x6004_persistentState.lastEDL = rtcGetTimeUnix(NULL); - set_alarm(EDL_ALARM, OD_PERSIST_STATE.x6004_persistentState.lastEDL, 0, 0, 0, OD_PERSIST_APP.x6001_stateControl.EDL_Timeout); - } else { - OD_PERSIST_STATE.x6004_persistentState.lastEDL = 0; - rtcSetAlarm(&RTCD1, TX_ENABLE_ALARM, NULL); - } - chEvtSignal(c3_tp, C3_EVENT_EDL); -} - -void soft_reset(void) -{ - c3StateSave(); - NVIC_SystemReset(); -} - -void hard_reset(void) -{ - c3StateSave(); - stop_workers(true); - chThdSleepSeconds(60); - NVIC_SystemReset(); -} - -void factory_reset(void) -{ - chThdTerminate(c3_tp); - chEvtSignal(c3_tp, C3_EVENT_TERMINATE); - chThdWait(c3_tp); - framErase(&FRAMD1, FRAM_STATE_ADDR, FRAM_SIZE - FRAM_STATE_ADDR); - RCC->BDCR |= RCC_BDCR_BDRST; - RCC->BDCR &= ~RCC_BDCR_BDRST; - NVIC_SystemReset(); -} diff --git a/src/f4/app_control/source/c3.h b/src/f4/app_control/source/c3.h deleted file mode 100644 index 0c8f6b4a..00000000 --- a/src/f4/app_control/source/c3.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef _C3_H_ -#define _C3_H_ - -#include "ch.h" -#include "hal.h" - -#define C3_EVENT_WAKEUP EVENT_MASK(0) -#define C3_EVENT_TERMINATE EVENT_MASK(1) -#define C3_EVENT_TX EVENT_MASK(2) -#define C3_EVENT_BAT EVENT_MASK(3) -#define C3_EVENT_EDL EVENT_MASK(4) - -typedef enum { - PREDEPLOY = 'B', - DEPLOY = 'C', - STANDBY = 'D', - BEACON = 'E', - EDL = 'F' -} c3_state_t; - -typedef struct { - event_listener_t el; - event_source_t *event; - eventflags_t flags; -} c3_event_t; - -typedef struct { - c3_state_t state; - c3_state_t next_state; - eventmask_t events; -} c3_fsm_t; - -/* Main Command, Communications, and Control Thread Prototype */ -extern THD_WORKING_AREA(c3_wa, 0x400); -extern THD_FUNCTION(c3, arg); - -/* Support function prototypes */ -void tx_enable(bool state); -void edl_enable(bool state); -void soft_reset(void); -void hard_reset(void); -void factory_reset(void); - -bool delay_deploy(void); -bool bat_good(void); -bool tx_enabled(void); -bool edl_enabled(void); - -#endif diff --git a/src/f4/app_control/source/cmd.c b/src/f4/app_control/source/cmd.c deleted file mode 100644 index 87df94e9..00000000 --- a/src/f4/app_control/source/cmd.c +++ /dev/null @@ -1,137 +0,0 @@ -#include "cmd.h" -#include "c3.h" -#include "fw.h" -#include "fs.h" -#include "opd.h" -#include "rtc.h" -#include "node_mgr.h" -#include "CO_master.h" - -void cmd_process(cmd_t *cmd, fb_t *resp_fb) -{ - lfs_file_t *file; - cmd_flash_t *flash_arg; - uint32_t *key; - void *ret; - - //Add 32 bits for sequence number - ret = fb_put(resp_fb, sizeof(uint32_t)); - //Put sequence number into the response buffer - *((uint32_t*)ret) = OD_PERSIST_STATE.x6004_persistentState.EDL_SequenceCount - 1; - - switch (cmd->cmd) { - case CMD_TX_CTRL: - ret = fb_put(resp_fb, 1); - tx_enable(cmd->arg[0]); - *((uint8_t*)ret) = tx_enabled(); - break; - case CMD_FW_FLASH: - ret = fb_put(resp_fb, sizeof(int)); - flash_arg = (cmd_flash_t*)cmd->arg; - *((int*)ret) = fw_flash(&EFLD1, flash_arg->filename, flash_arg->crc); - break; - case CMD_FW_BANK: - ret = fb_put(resp_fb, sizeof(int)); - *((int*)ret) = fw_set_bank(&EFLD1, cmd->arg[0]); - break; - case CMD_FW_VERIFY: - ret = fb_put(resp_fb, sizeof(uint32_t)); - *((uint32_t*)ret) = fw_verify(&EFLD1, cmd->arg[0]); - break; - case CMD_C3_SOFTRESET: - key = (uint32_t*)cmd->arg; - if (key[0] == 0x67452301U && key[1] == 0xEFCDAB89U) - soft_reset(); - break; - case CMD_C3_HARDRESET: - key = (uint32_t*)cmd->arg; - if (key[0] == 0x67452301U && key[1] == 0xEFCDAB89U) - hard_reset(); - break; - case CMD_C3_FACTORYRESET: - key = (uint32_t*)cmd->arg; - if (key[0] == 0x67452301U && key[1] == 0xEFCDAB89U) - factory_reset(); - break; - case CMD_I2C_RESET: - ret = fb_put(resp_fb, 1); - palSetLine(LINE_I2C_PWROFF); - chThdSleepMilliseconds(10); - palClearLine(LINE_I2C_PWROFF); - *((uint8_t*)ret) = 0; - break; - case CMD_FS_FORMAT: - ret = fb_put(resp_fb, sizeof(int)); - *((int*)ret) = fs_format(&FSD1); - break; - case CMD_FS_UNMOUNT: - ret = fb_put(resp_fb, sizeof(int)); - *((int*)ret) = fs_unmount(&FSD1); - break; - case CMD_FS_REMOVE: - ret = fb_put(resp_fb, sizeof(int)); - *((int*)ret) = fs_remove(&FSD1, (char*)cmd->arg); - break; - case CMD_FS_CRC: - ret = fb_put(resp_fb, sizeof(uint32_t)); - file = file_open(&FSD1, (char*)cmd->arg, LFS_O_RDONLY); - if (file == NULL) - return; - *((uint32_t*)ret) = file_crc(&FSD1, file); - file_close(&FSD1, file); - break; - case CMD_NODE_ENABLE: - ret = fb_put(resp_fb, 1); - *((int8_t *)ret) = node_enable(cmd->arg[0], cmd->arg[1]); - break; - case CMD_NODE_STATUS: - ret = fb_put(resp_fb, sizeof(CO_NMT_internalState_t)); - node_status(cmd->arg[0], ret); - break; - case CMD_OPD_SYSENABLE: - ret = fb_put(resp_fb, 1); - opd_start(); - *((uint8_t*)ret) = 0; - break; - case CMD_OPD_SYSDISABLE: - ret = fb_put(resp_fb, 1); - opd_stop(); - *((uint8_t*)ret) = 0; - break; - case CMD_OPD_SCAN: - ret = fb_put(resp_fb, 1); - opd_scan(cmd->arg[0]); - *((uint8_t*)ret) = 0; - break; - case CMD_OPD_ENABLE: - ret = fb_put(resp_fb, 1); - *((int8_t *)ret) = opd_enable(cmd->arg[0], cmd->arg[1]); - break; - case CMD_OPD_RESET: - ret = fb_put(resp_fb, 1); - *((int8_t *)ret) = opd_reset(cmd->arg[0]); - break; - case CMD_OPD_STATUS: - ret = fb_put(resp_fb, sizeof(opd_status_t)); - opd_status(cmd->arg[0], ret); - break; - case CMD_RTC_SETTIME: - ret = fb_put(resp_fb, sizeof(uint32_t)); - rtcSetTimeUnix(*((uint32_t*)cmd->arg), 0); - *((uint32_t*)ret) = rtcGetTimeUnix(NULL); - break; - case CMD_SDO_WRITE: - ret = fb_put(resp_fb, 1); - struct __attribute__((packed)) { - uint8_t node_id; - uint16_t index; - uint8_t subindex; - size_t size; - uint8_t data[]; - } *sdo_arg = (void*)cmd->arg; - sdo_transfer(SDO_CLI_WRITE, sdo_arg->node_id, sdo_arg->index, sdo_arg->subindex, sdo_arg->size, sdo_arg->size, sdo_arg->data); - *((uint8_t*)ret) = 0; - default: - break; - } -} diff --git a/src/f4/app_control/source/cmd.h b/src/f4/app_control/source/cmd.h deleted file mode 100644 index 937e19ea..00000000 --- a/src/f4/app_control/source/cmd.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef _CMD_H_ -#define _CMD_H_ - -#include "frame_buf.h" - -typedef enum { - CMD_TX_CTRL = 0, - CMD_FW_FLASH, - CMD_FW_BANK, - CMD_FW_VERIFY, - CMD_C3_SOFTRESET, - CMD_C3_HARDRESET, - CMD_C3_FACTORYRESET, - CMD_I2C_RESET, - CMD_FS_FORMAT, - CMD_FS_UNMOUNT, - CMD_FS_REMOVE, - CMD_FS_CRC, - CMD_NODE_ENABLE, - CMD_NODE_STATUS, - CMD_OPD_SYSENABLE, - CMD_OPD_SYSDISABLE, - CMD_OPD_SCAN, - CMD_OPD_ENABLE, - CMD_OPD_RESET, - CMD_OPD_STATUS, - CMD_RTC_SETTIME, - CMD_SDO_WRITE, -} cmd_code_t; - -typedef struct { - uint32_t crc; - char filename[]; -} cmd_flash_t; - -typedef struct { - cmd_code_t cmd; - uint8_t arg[]; -} cmd_t; - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_process(cmd_t *cmd, fb_t *resp_fb); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/comms.c b/src/f4/app_control/source/comms.c deleted file mode 100644 index 9bfb5dd0..00000000 --- a/src/f4/app_control/source/comms.c +++ /dev/null @@ -1,739 +0,0 @@ -#include "ch.h" -#include "hal.h" -#include "comms.h" -#include "beacon.h" -#include "c3.h" -#include "cmd.h" -#include "file_xfr.h" -#include "rtc.h" -#include "uslp.h" -#include "hmac.h" -#include "CANopen.h" -#include "OD.h" - -static inline void vc_lock(void *arg) { - mutex_t *mutex = arg; - chMtxLock(mutex); -} - -static inline void vc_unlock(void *arg) { - mutex_t *mutex = arg; - chMtxUnlock(mutex); -} - -#if (USLP_USE_SDLS == TRUE) -static const sdls_cfg_t sdls_cfg = { - .spi = 1, - .iv_len = 0, - .seq_num_len = sizeof(OD_PERSIST_STATE.x6004_persistentState.EDL_SequenceCount), - .pad_len = 0, - .mac_len = 32, - .send_func = NULL, - .send_arg = NULL, - .recv_func = hmac_recv, - .recv_arg = OD_PERSIST_KEYS.x6005_cryptoKeys[0], -}; -#endif - -static const uslp_map_t map_cmd = { - .sdu = SDU_MAP_ACCESS, - .upid = UPID_MAPA_SDU, - .max_pkt_len = CMD_RESP_LEN, - .incomplete = false, - .map_recv = comms_cmd, -}; - -static const uslp_map_t map_file = { - .sdu = SDU_MAP_ACCESS, - .upid = UPID_MAPA_SDU, - .max_pkt_len = FILE_BUF_LEN + sizeof(file_xfr_t), - .incomplete = false, - .map_recv = comms_file, -}; - -static const uslp_map_t map_beacon = { - .sdu = SDU_MAP_ACCESS, - .upid = UPID_MAPA_SDU, - .max_pkt_len = 32, - .incomplete = false, - .map_recv = comms_beacon, -}; - -static const uslp_vc_t vc0 = { - .seq_ctrl_len = 0, - .expedited_len = 0, - .seq_ctrl_cnt = NULL, - .expedited_cnt = NULL, - .cop = COP_NONE, - .mapid[0] = &map_cmd, - .trunc_tf_len = USLP_MAX_LEN, - .ocf = false, -#if (USLP_USE_SDLS == TRUE) - .sdls_cfg = &sdls_cfg, -#endif -}; - -static const uslp_vc_t vc1 = { - .seq_ctrl_len = 0, - .expedited_len = 0, - .seq_ctrl_cnt = NULL, - .expedited_cnt = NULL, - .cop = COP_NONE, - .mapid[0] = &map_file, - .mapid[1] = &map_beacon, - .trunc_tf_len = USLP_MAX_LEN, - .ocf = false, -#if (USLP_USE_SDLS == TRUE) - .sdls_cfg = NULL, -#endif -}; - -/* -static MUTEX_DECL(vc2_lock); -static const uslp_vc_t vc2 = { - .seq_ctrl_len = sizeof(OD_PERSIST_STATE.x6004_persistentState.VC2_SequenceCount), - .expedited_len = sizeof(OD_PERSIST_STATE.x6004_persistentState.VC2_ExpediteCount), - .seq_ctrl_cnt = &OD_PERSIST_STATE.x6004_persistentState.VC2_SequenceCount, - .expedited_cnt = &OD_PERSIST_STATE.x6004_persistentState.VC2_ExpediteCount, - .cop = COP_1, - .mapid[0] = &map_cmd, - .mapid[1] = &map_file, - .trunc_tf_len = USLP_MAX_LEN, - .ocf = true, - .lock_arg = &vc2_lock, - .lock = vc_lock, - .unlock = vc_unlock, -#if (USLP_USE_SDLS == TRUE) - .sdls_cfg = &sdls_cfg, -#endif -}; -*/ - -const uslp_mc_t mc = { - .scid = &OD_PERSIST_APP.x6006_CCSDS.spacecraftID, - .owner = true, - .vcid[0] = &vc0, - .vcid[1] = &vc1, - /*.vcid[2] = &vc2,*/ -}; - -static const uslp_pc_t lband_pc = { - .name = "L-Band", - .tf_len = USLP_MAX_LEN, - .fecf = FECF_HW, - .fecf_len = FECF_LEN, -}; - -static const uslp_pc_t uhf_pc = { - .name = "UHF", - .tf_len = USLP_MAX_LEN, - .fecf = FECF_HW, - .fecf_len = FECF_LEN, - .phy_send = pdu_send, - .phy_send_ahead = pdu_send_ahead, - .send_arg = &tx_fifo, - .send_ahead_arg = &tx_fifo, -}; - -static const uslp_link_t edl_lband_link = { - .mc = &mc, - .pc_rx = &lband_pc, - .pc_tx = &uhf_pc, -}; - -static const uslp_link_t edl_uhf_link = { - .mc = &mc, - .pc_rx = &uhf_pc, - .pc_tx = &uhf_pc, -}; - -static const ax5043_profile_t lband_high[] = { - /* Modulation and Framing */ - {AX5043_REG_MODULATION, AX5043_MODULATION_MSK, 1}, - {AX5043_REG_ENCODING, AX5043_ENCODING_NRZI_SCRAM, 1}, - {AX5043_REG_FRAMING, _VAL2FLD(AX5043_FRAMING_FRMMODE, AX5043_FRMMODE_HDLC) | - _VAL2FLD(AX5043_FRAMING_CRCMODE, AX5043_CRCMODE_CCITT), 1}, - - /* Pin Configuration */ - {AX5043_REG_PINFUNCSYSCLK, AX5043_PFSYSCLK_OUT_XTAL_DIV1, 1}, - - /* Synthesizer */ - {AX5043_REG_PLLCPI, 0x01, 1}, - {AX5043_REG_FREQA, 0x1C900001, 4}, - - /* PHY Layer Parameters */ - /* Receiver Parameters */ - {AX5043_REG_IFFREQ, 0x170A, 2}, - {AX5043_REG_DECIMATION, 0x01, 1}, - {AX5043_REG_RXDATARATE, 0x0042AB, 3}, - {AX5043_REG_MAXDROFFSET, 0x000000, 3}, - {AX5043_REG_MAXRFOFFSET, 0x0003BE | AX5043_MAXRFOFFSET_FREQOFFSCORR, 3}, - - /* Receiver Parameter Set 0 */ - {AX5043_REG_AGCGAIN0, _VAL2FLD(AX5043_AGCGAIN_AGCDECAY, 0x08) | - _VAL2FLD(AX5043_AGCGAIN_AGCATTACK, 0x03), 1}, - {AX5043_REG_AGCTARGET0, 0x89, 1}, - {AX5043_REG_TIMEGAIN0, _VAL2FLD(AX5043_TIMEGAIN_E, 0x09) | - _VAL2FLD(AX5043_TIMEGAIN_M, 0x08), 1}, - {AX5043_REG_DRGAIN0, _VAL2FLD(AX5043_DRGAIN_E, 0x03) | - _VAL2FLD(AX5043_DRGAIN_M, 0x08), 1}, - {AX5043_REG_FREQDEV0, 0x0000, 2}, - - /* Receiver Parameter Set 1 */ - /* TODO */ - - /* Receiver Parameter Set 2 */ - /* TODO */ - - /* Receiver Parameter Set 3 */ - /* TODO */ - - /* Transmitter Parameters */ - {AX5043_REG_TXPWRCOEFFB, 0x0000, 2}, - - /* PLL Parameters */ - {AX5043_REG_PLLVCOI, _VAL2FLD(AX5043_PLLVCOI_VCOI, 0x16) | - AX5043_PLLVCOI_VCOIE, 1}, - - /* MAC Layer Parameters */ - /* Packet Format */ - {AX5043_REG_PKTADDRCFG, AX5043_PKTADDRCFG_MSBFIRST | AX5043_PKTADDRCFG_FECSYNCDIS, 1}, - {AX5043_REG_PKTLENCFG, _VAL2FLD(AX5043_PKTLENCFG_LENBITS, 0xF), 1}, - {AX5043_REG_PKTMAXLEN, 0xFF, 1}, - /*{AX5043_REG_PKTADDR, _VAL2FLD(USLP_TFPH_ID_MCID, MCID) | USLP_TFPH_ID_SRC_DST, 4},*/ - /*{AX5043_REG_PKTADDRMASK, USLP_TFPH_ID_MCID | USLP_TFPH_ID_SRC_DST, 4},*/ - - /* Pattern Match */ - - /* Packet Controller */ - {AX5043_REG_PKTCHUNKSIZE, AX5043_PKTCHUNKSIZE_240, 1}, - {AX5043_REG_PKTMISCFLAGS, AX5043_PKTMISCFLAGS_BGNDRSSI, 1}, - {AX5043_REG_PKTSTOREFLAGS, AX5043_PKTSTOREFLAGS_RSSI | AX5043_PKTSTOREFLAGS_CRCB, 1}, - {AX5043_REG_PKTACCEPTFLAGS, AX5043_PKTACCEPTFLAGS_LRGP, 1}, - - /* Performance Tuning Registers */ - {AX5043_REG_0xF00, AX5043_0xF00_DEFVAL, 1}, - {AX5043_REG_0xF08, AX5043_0xF08_DEFVAL, 1}, - {AX5043_REG_0xF0D, AX5043_0xF0D_DEFVAL, 1}, - {AX5043_REG_0xF10, AX5043_0xF10_TCXO, 1}, - {AX5043_REG_0xF11, AX5043_0xF11_TCXO, 1}, - {AX5043_REG_0xF18, 0x02, 1}, - {AX5043_REG_0xF1C, AX5043_0xF1C_DEFVAL, 1}, - {AX5043_REG_0xF21, 0x68, 1}, - {AX5043_REG_0xF22, 0xFF, 1}, - {AX5043_REG_0xF23, 0x84, 1}, - {AX5043_REG_0xF26, 0x98, 1}, - {AX5043_REG_0xF35, AX5043_0xF35_XTALDIV1, 1}, - {AX5043_REG_0xF44, 0x25, 1}, - {AX5043_REG_0xF72, AX5043_0xF72_NORAWSOFTBITS, 1}, - {0, 0, 0} -}; - -static const ax5043_profile_t lband_low[] = { - /* Modulation and Framing */ - {AX5043_REG_MODULATION, AX5043_MODULATION_FSK, 1}, - {AX5043_REG_ENCODING, AX5043_ENCODING_NRZI_SCRAM, 1}, - {AX5043_REG_FRAMING, _VAL2FLD(AX5043_FRAMING_FRMMODE, AX5043_FRMMODE_HDLC) | - _VAL2FLD(AX5043_FRAMING_CRCMODE, AX5043_CRCMODE_CCITT), 1}, - - /* Pin Configuration */ - {AX5043_REG_PINFUNCSYSCLK, AX5043_PFSYSCLK_OUT_XTAL_DIV1, 1}, - - /* Synthesizer */ - {AX5043_REG_PLLCPI, 0x01, 1}, - {AX5043_REG_FREQA, 0x1C900001, 4}, - - /* PHY Layer Parameters */ - /* Receiver Parameters */ - {AX5043_REG_IFFREQ, 0x0E78, 2}, - {AX5043_REG_DECIMATION, 0x02, 1}, - {AX5043_REG_RXDATARATE, 0x0042AB, 3}, - {AX5043_REG_MAXDROFFSET, 0x000000, 3}, - {AX5043_REG_MAXRFOFFSET, 0x0003BE | AX5043_MAXRFOFFSET_FREQOFFSCORR, 3}, - - /* Receiver Parameter Set 0 */ - {AX5043_REG_AGCGAIN0, _VAL2FLD(AX5043_AGCGAIN_AGCDECAY, 0x09) | - _VAL2FLD(AX5043_AGCGAIN_AGCATTACK, 0x03), 1}, - {AX5043_REG_AGCTARGET0, 0x89, 1}, - {AX5043_REG_TIMEGAIN0, _VAL2FLD(AX5043_TIMEGAIN_E, 0x09) | - _VAL2FLD(AX5043_TIMEGAIN_M, 0x08), 1}, - {AX5043_REG_DRGAIN0, _VAL2FLD(AX5043_DRGAIN_E, 0x03) | - _VAL2FLD(AX5043_DRGAIN_M, 0x08), 1}, - {AX5043_REG_FREQDEV0, 0x0000, 2}, - - /* Receiver Parameter Set 1 */ - /* TODO */ - - /* Receiver Parameter Set 2 */ - /* TODO */ - - /* Receiver Parameter Set 3 */ - /* TODO */ - - /* Transmitter Parameters */ - {AX5043_REG_TXPWRCOEFFB, 0x0000, 2}, - - /* PLL Parameters */ - {AX5043_REG_PLLVCOI, _VAL2FLD(AX5043_PLLVCOI_VCOI, 0x16) | - AX5043_PLLVCOI_VCOIE, 1}, - - /* MAC Layer Parameters */ - /* Packet Format */ - {AX5043_REG_PKTADDRCFG, AX5043_PKTADDRCFG_MSBFIRST | AX5043_PKTADDRCFG_FECSYNCDIS, 1}, - {AX5043_REG_PKTLENCFG, _VAL2FLD(AX5043_PKTLENCFG_LENBITS, 0xF), 1}, - {AX5043_REG_PKTMAXLEN, 0xFF, 1}, - /*{AX5043_REG_PKTADDR, _VAL2FLD(USLP_TFPH_ID_MCID, MCID) | USLP_TFPH_ID_SRC_DST, 4},*/ - /*{AX5043_REG_PKTADDRMASK, USLP_TFPH_ID_MCID | USLP_TFPH_ID_SRC_DST, 4},*/ - - /* Pattern Match */ - - /* Packet Controller */ - {AX5043_REG_PKTCHUNKSIZE, AX5043_PKTCHUNKSIZE_240, 1}, - {AX5043_REG_PKTMISCFLAGS, AX5043_PKTMISCFLAGS_BGNDRSSI, 1}, - {AX5043_REG_PKTSTOREFLAGS, AX5043_PKTSTOREFLAGS_RSSI | AX5043_PKTSTOREFLAGS_CRCB, 1}, - {AX5043_REG_PKTACCEPTFLAGS, AX5043_PKTACCEPTFLAGS_LRGP, 1}, - - /* Performance Tuning Registers */ - {AX5043_REG_0xF00, AX5043_0xF00_DEFVAL, 1}, - {AX5043_REG_0xF08, AX5043_0xF08_DEFVAL, 1}, - {AX5043_REG_0xF0D, AX5043_0xF0D_DEFVAL, 1}, - {AX5043_REG_0xF10, AX5043_0xF10_TCXO, 1}, - {AX5043_REG_0xF11, AX5043_0xF11_TCXO, 1}, - {AX5043_REG_0xF18, 0x02, 1}, - {AX5043_REG_0xF1C, AX5043_0xF1C_DEFVAL, 1}, - {AX5043_REG_0xF21, 0x68, 1}, - {AX5043_REG_0xF22, 0xFF, 1}, - {AX5043_REG_0xF23, 0x84, 1}, - {AX5043_REG_0xF26, 0x98, 1}, - {AX5043_REG_0xF35, AX5043_0xF35_XTALDIV1, 1}, - {AX5043_REG_0xF44, 0x25, 1}, - {AX5043_REG_0xF72, AX5043_0xF72_NORAWSOFTBITS, 1}, - {0, 0, 0} -}; - -static const ax5043_profile_t uhf_eng[] = { - /* Modulation and Framing */ - {AX5043_REG_MODULATION, AX5043_MODULATION_MSK, 1}, - {AX5043_REG_ENCODING, AX5043_ENCODING_NRZI_SCRAM, 1}, - {AX5043_REG_FRAMING, _VAL2FLD(AX5043_FRAMING_FRMMODE, AX5043_FRMMODE_HDLC) | - _VAL2FLD(AX5043_FRAMING_CRCMODE, AX5043_CRCMODE_CCITT), 1}, - - /* Pin Configuration */ - {AX5043_REG_PINFUNCSYSCLK, AX5043_PFSYSCLK_OUT_0, 1}, - - /* Synthesizer */ - {AX5043_REG_PLLCPI, 0x02, 1}, - {AX5043_REG_FREQA, 0x1B480001, 4}, - - /* PHY Layer Parameters */ - /* Receiver Parameters */ - {AX5043_REG_IFFREQ, 0x1058, 2}, - {AX5043_REG_DECIMATION, 0x01, 1}, - {AX5043_REG_RXDATARATE, 0x005355, 3}, - {AX5043_REG_MAXDROFFSET, 0x000000, 3}, - {AX5043_REG_MAXRFOFFSET, 0x000393 | AX5043_MAXRFOFFSET_FREQOFFSCORR, 3}, - - /* Receiver Parameter Set 0 */ - {AX5043_REG_AGCGAIN0, _VAL2FLD(AX5043_AGCGAIN_AGCDECAY, 0x08) | - _VAL2FLD(AX5043_AGCGAIN_AGCATTACK, 0x03), 1}, - {AX5043_REG_AGCTARGET0, 0x89, 1}, - {AX5043_REG_TIMEGAIN0, _VAL2FLD(AX5043_TIMEGAIN_E, 0x09) | - _VAL2FLD(AX5043_TIMEGAIN_M, 0x0A), 1}, - {AX5043_REG_DRGAIN0, _VAL2FLD(AX5043_DRGAIN_E, 0x03) | - _VAL2FLD(AX5043_DRGAIN_M, 0x0A), 1}, - {AX5043_REG_FREQDEV0, 0x0000, 2}, - - /* Receiver Parameter Set 1 */ - /* TODO */ - - /* Receiver Parameter Set 2 */ - /* TODO */ - - /* Receiver Parameter Set 3 */ - /* TODO */ - - /* Transmitter Parameters */ - {AX5043_REG_MODCFGF, AX5043_FREQSHAPE_GAUSS_BT_0_5, 1}, - {AX5043_REG_FSKDEV, 0x00624E, 3}, - {AX5043_REG_MODCFGA, AX5043_MODCFGA_TXSE | _VAL2FLD(AX5043_MODCFGA_AMPLSHAPE, AX5043_AMPLSHAPE_RAISEDCOS), 1}, - {AX5043_REG_TXRATE, 0x018937, 3}, - {AX5043_REG_TXPWRCOEFFB, 0x0FFF, 2}, - - /* PLL Parameters */ - {AX5043_REG_PLLVCOI, _VAL2FLD(AX5043_PLLVCOI_VCOI, 0x16) | - AX5043_PLLVCOI_VCOIE, 1}, - - /* MAC Layer Parameters */ - /* Packet Format */ - {AX5043_REG_PKTADDRCFG, AX5043_PKTADDRCFG_MSBFIRST | AX5043_PKTADDRCFG_FECSYNCDIS, 1}, - {AX5043_REG_PKTLENCFG, _VAL2FLD(AX5043_PKTLENCFG_LENBITS, 0xF), 1}, - {AX5043_REG_PKTMAXLEN, 0xFF, 1}, - /*{AX5043_REG_PKTADDR, _VAL2FLD(USLP_TFPH_ID_MCID, MCID) | USLP_TFPH_ID_SRC_DST, 4},*/ - /*{AX5043_REG_PKTADDRMASK, USLP_TFPH_ID_MCID | USLP_TFPH_ID_SRC_DST, 4},*/ - - /* Pattern Match */ - - /* Packet Controller */ - {AX5043_REG_PKTCHUNKSIZE, AX5043_PKTCHUNKSIZE_240, 1}, - {AX5043_REG_PKTMISCFLAGS, AX5043_PKTMISCFLAGS_BGNDRSSI, 1}, - {AX5043_REG_PKTSTOREFLAGS, AX5043_PKTSTOREFLAGS_RSSI | AX5043_PKTSTOREFLAGS_CRCB, 1}, - {AX5043_REG_PKTACCEPTFLAGS, AX5043_PKTACCEPTFLAGS_LRGP, 1}, - - /* Performance Tuning Registers */ - {AX5043_REG_0xF00, AX5043_0xF00_DEFVAL, 1}, - {AX5043_REG_0xF08, AX5043_0xF08_DEFVAL, 1}, - {AX5043_REG_0xF0D, AX5043_0xF0D_DEFVAL, 1}, - {AX5043_REG_0xF10, AX5043_0xF10_TCXO, 1}, - {AX5043_REG_0xF11, AX5043_0xF11_TCXO, 1}, - {AX5043_REG_0xF18, 0x06, 1}, - {AX5043_REG_0xF1C, AX5043_0xF1C_DEFVAL, 1}, - {AX5043_REG_0xF21, 0x68, 1}, - {AX5043_REG_0xF22, 0xFF, 1}, - {AX5043_REG_0xF23, 0x84, 1}, - {AX5043_REG_0xF26, 0x98, 1}, - {AX5043_REG_0xF35, AX5043_0xF35_XTALDIV1, 1}, - {AX5043_REG_0xF44, 0x25, 1}, - {AX5043_REG_0xF72, AX5043_0xF72_NORAWSOFTBITS, 1}, - {0, 0, 0} -}; - -static const ax5043_profile_t uhf_ax25[] = { - /* Modulation and Framing */ - {AX5043_REG_MODULATION, AX5043_MODULATION_MSK, 1}, - {AX5043_REG_ENCODING, AX5043_ENCODING_NRZI_SCRAM, 1}, - {AX5043_REG_FRAMING, _VAL2FLD(AX5043_FRAMING_FRMMODE, AX5043_FRMMODE_HDLC) | - _VAL2FLD(AX5043_FRAMING_CRCMODE, AX5043_CRCMODE_CCITT), 1}, - - /* Pin Configuration */ - {AX5043_REG_PINFUNCSYSCLK, AX5043_PFSYSCLK_OUT_0, 1}, - - /* Synthesizer */ - {AX5043_REG_PLLCPI, 0x02, 1}, - {AX5043_REG_FREQA, 0x1B480001, 4}, - - /* PHY Layer Parameters */ - /* Receiver Parameters */ - {AX5043_REG_IFFREQ, 0x01D8, 2}, - {AX5043_REG_DECIMATION, 0x11, 1}, - {AX5043_REG_RXDATARATE, 0x003106, 3}, - {AX5043_REG_MAXDROFFSET, 0x000000, 3}, - {AX5043_REG_MAXRFOFFSET, 0x000EBF | AX5043_MAXRFOFFSET_FREQOFFSCORR, 3}, - - /* Receiver Parameter Set 0 */ - {AX5043_REG_AGCGAIN0, _VAL2FLD(AX5043_AGCGAIN_AGCDECAY, 0x07) | - _VAL2FLD(AX5043_AGCGAIN_AGCATTACK, 0x04), 1}, - {AX5043_REG_AGCTARGET0, 0x89, 1}, - {AX5043_REG_TIMEGAIN0, _VAL2FLD(AX5043_TIMEGAIN_E, 0x08) | - _VAL2FLD(AX5043_TIMEGAIN_M, 0x09), 1}, - {AX5043_REG_DRGAIN0, _VAL2FLD(AX5043_DRGAIN_E, 0x04) | - _VAL2FLD(AX5043_DRGAIN_M, 0x09), 1}, - {AX5043_REG_FREQDEV0, 0x0000, 2}, - - /* Receiver Parameter Set 1 */ - /* TODO */ - - /* Receiver Parameter Set 2 */ - /* TODO */ - - /* Receiver Parameter Set 3 */ - /* TODO */ - - /* Transmitter Parameters */ - {AX5043_REG_MODCFGF, AX5043_FREQSHAPE_GAUSS_BT_0_5, 1}, - {AX5043_REG_FSKDEV, 0x0009D5, 3}, - {AX5043_REG_MODCFGA, AX5043_MODCFGA_TXSE | _VAL2FLD(AX5043_MODCFGA_AMPLSHAPE, AX5043_AMPLSHAPE_RAISEDCOS), 1}, - {AX5043_REG_TXRATE, 0x002753, 3}, - {AX5043_REG_TXPWRCOEFFB, 0x0FFF, 2}, - - /* PLL Parameters */ - {AX5043_REG_PLLVCOI, _VAL2FLD(AX5043_PLLVCOI_VCOI, 0x16) | - AX5043_PLLVCOI_VCOIE, 1}, - - /* MAC Layer Parameters */ - /* Packet Format */ - {AX5043_REG_PKTADDRCFG, AX5043_PKTADDRCFG_FECSYNCDIS, 1}, - {AX5043_REG_PKTLENCFG, _VAL2FLD(AX5043_PKTLENCFG_LENBITS, 0xF), 1}, - {AX5043_REG_PKTMAXLEN, 0xFF, 1}, - /*{AX5043_REG_PKTADDR, _VAL2FLD(USLP_TFPH_ID_MCID, MCID) | USLP_TFPH_ID_SRC_DST, 4},*/ - /*{AX5043_REG_PKTADDRMASK, USLP_TFPH_ID_MCID | USLP_TFPH_ID_SRC_DST, 4},*/ - - /* Pattern Match */ - - /* Packet Controller */ - {AX5043_REG_PKTCHUNKSIZE, AX5043_PKTCHUNKSIZE_240, 1}, - {AX5043_REG_PKTMISCFLAGS, AX5043_PKTMISCFLAGS_BGNDRSSI, 1}, - {AX5043_REG_PKTSTOREFLAGS, AX5043_PKTSTOREFLAGS_RSSI | AX5043_PKTSTOREFLAGS_CRCB, 1}, - {AX5043_REG_PKTACCEPTFLAGS, AX5043_PKTACCEPTFLAGS_LRGP, 1}, - - /* Performance Tuning Registers */ - {AX5043_REG_0xF00, AX5043_0xF00_DEFVAL, 1}, - {AX5043_REG_0xF08, AX5043_0xF08_DEFVAL, 1}, - {AX5043_REG_0xF0D, AX5043_0xF0D_DEFVAL, 1}, - {AX5043_REG_0xF10, AX5043_0xF10_TCXO, 1}, - {AX5043_REG_0xF11, AX5043_0xF11_TCXO, 1}, - {AX5043_REG_0xF18, 0x06, 1}, - {AX5043_REG_0xF1C, AX5043_0xF1C_DEFVAL, 1}, - {AX5043_REG_0xF21, 0x68, 1}, - {AX5043_REG_0xF22, 0xFF, 1}, - {AX5043_REG_0xF23, 0x84, 1}, - {AX5043_REG_0xF26, 0x98, 1}, - {AX5043_REG_0xF35, AX5043_0xF35_XTALDIV1, 1}, - {AX5043_REG_0xF44, 0x25, 1}, - {AX5043_REG_0xF72, AX5043_0xF72_NORAWSOFTBITS, 1}, - {0, 0, 0} -}; - -static const uint8_t preamble[] = { - AX5043_CHUNKCMD_TXCTRL | _VAL2FLD(AX5043_FIFOCHUNK_SIZE, 1), - AX5043_CHUNK_TXCTRL_SETPA | AX5043_CHUNK_TXCTRL_PASTATE, - AX5043_CHUNKCMD_REPEATDATA | _VAL2FLD(AX5043_FIFOCHUNK_SIZE, 3), - AX5043_CHUNK_REPEATDATA_RAW | AX5043_CHUNK_REPEATDATA_NOCRC, - 50, - 0x7E -}; - -static const uint8_t postamble[] = { - AX5043_CHUNKCMD_REPEATDATA | _VAL2FLD(AX5043_FIFOCHUNK_SIZE, 3), - AX5043_CHUNK_REPEATDATA_RAW | AX5043_CHUNK_REPEATDATA_NOCRC, - 5, - 0x7E, - AX5043_CHUNKCMD_TXCTRL | _VAL2FLD(AX5043_FIFOCHUNK_SIZE, 1), - AX5043_CHUNK_TXCTRL_SETPA -}; - -static const SPIConfig lband_spicfg = { - false, - NULL, /* Operation complete callback */ - LINE_LBAND_CS, - // SPI_CR1 - SPI_CR1_SPE | /* SPI enable */ - SPI_CR1_MSTR | /* Master */ - SPI_CR1_BR_1 | /* f_pclk/8 (f_pclk = 84MHz, so 10.5MHz) */ - SPI_CR1_SSM, - 0, -}; - -static const SPIConfig uhf_spicfg = { - false, - NULL, /* Operation complete callback */ - LINE_UHF_CS, - // SPI_CR1 - SPI_CR1_SPE | /* SPI enable */ - SPI_CR1_MSTR | /* Master */ - SPI_CR1_BR_1 | /* f_pclk/8 (f_pclk = 84MHz, so 10.5MHz) */ - SPI_CR1_SSM, - 0, -}; - -static const AX5043Config lbandcfg = { - .spip = &SPID1, - .spicfg = &lband_spicfg, - .miso = LINE_SPI1_MISO, - .irq = LINE_LBAND_IRQ, - .xtal_freq = XTAL_CLK, - .fifo = &rx_fifo, - .phy_arg = &edl_lband_link, - .profile = lband_low, -}; - -static const AX5043Config uhfcfg = { - .spip = &SPID1, - .spicfg = &uhf_spicfg, - .miso = LINE_SPI1_MISO, - .irq = LINE_UHF_IRQ, - .xtal_freq = XTAL_CLK, - .fifo = &rx_fifo, - .phy_arg = &edl_uhf_link, - .profile = uhf_eng, - .preamble = preamble, - .preamble_len = sizeof(preamble), - .postamble = postamble, - .postamble_len = sizeof(postamble), -}; - -static SI41XXConfig synthcfg = { - .sen = LINE_LO_SEN, - .sclk = LINE_LO_SCLK, - .sdata = LINE_LO_SDATA, - .ref_freq = XTAL_CLK, - .if_div = SI41XX_IFDIV_DIV1, - .if_n = 1616, - .if_r = 32, -}; - -AX5043Driver lband; -AX5043Driver uhf; -SI41XXDriver synth; - -static const radio_cfg_t lband_high_cfg = { - .devp = &lband, - .profile = lband_high, - .name = "L-Band High Data Rate Engineering", -}; - -static const radio_cfg_t lband_low_cfg = { - .devp = &lband, - .profile = lband_low, - .name = "L-Band Low Data Rate Engineering", -}; - -static const radio_cfg_t uhf_eng_cfg = { - .devp = &uhf, - .profile = uhf_eng, - .name = "UHF Engineering", -}; - -static const radio_cfg_t uhf_ax25_cfg = { - .devp = &uhf, - .profile = uhf_ax25, - .name = "UHF AX.25", -}; - -synth_dev_t synth_devices[] = { - {&synth, &synthcfg, "LO"}, - {NULL, NULL, ""}, -}; - -radio_dev_t radio_devices[] = { - {&lband, &lbandcfg, "L-Band"}, - {&uhf, &uhfcfg, "UHF"}, - {NULL, NULL, ""}, -}; - -radio_cfg_t radio_cfgs[] = { - lband_high_cfg, - lband_low_cfg, - uhf_eng_cfg, - uhf_ax25_cfg, - {NULL, NULL, ""}, -}; - -const radio_cfg_t *tx_eng = &uhf_eng_cfg; -const radio_cfg_t *tx_ax25 = &uhf_ax25_cfg; - -static thread_t *edl_tp[EDL_WORKERS] = {NULL}; -static thread_t *tx_tp = NULL; -static thread_t *beacon_tp = NULL; - -THD_FUNCTION(edl_thd, arg) -{ - (void)arg; - fb_t *fb; - size_t len; - - while (!chThdShouldTerminateX()) { - if ((fb = pdu_recv(&rx_fifo)) == NULL) - continue; - if (uslp_recv(fb->phy_arg, fb)) { - edl_enable(true); - len = fb->len; - if (fb->phy_arg == &edl_lband_link) { - OD_PERSIST_STATE.x6004_persistentState.lbandRX_Bytes += len; - OD_PERSIST_STATE.x6004_persistentState.lbandRX_Packets += 1; - } else if (fb->phy_arg == &edl_uhf_link) { - OD_PERSIST_STATE.x6004_persistentState.UHF_RX_Bytes += len; - OD_PERSIST_STATE.x6004_persistentState.UHF_RX_Packets += 1; - } - } else { - OD_PERSIST_STATE.x6004_persistentState.EDL_RejectedCount += 1; - } - fb_free(fb, &rx_fifo); - } - - chThdExit(MSG_OK); -} - -THD_FUNCTION(tx_worker, arg) -{ - const radio_cfg_t *cfg = arg; - fb_t *fb; - - while (!chThdShouldTerminateX()) { - if ((fb = pdu_recv(&tx_fifo)) == NULL) - continue; - ax5043TX(cfg->devp, cfg->profile, fb->data, fb->len, fb->len, NULL, NULL, false); - fb_free(fb, &tx_fifo); - } - - /* Free remaining frame buffers */ - while ((fb = pdu_recv(&tx_fifo)) != NULL) { - fb_free(fb, &tx_fifo); - } - - chThdExit(MSG_OK); -} - -void comms_init(void) -{ - radio_init(); -} - -void comms_start(void) -{ - radio_start(); - for (int i = 0; i < EDL_WORKERS; i++) { - edl_tp[i] = chThdCreateFromHeap(NULL, THD_WORKING_AREA_SIZE(0x1000), "EDL Worker", NORMALPRIO, edl_thd, NULL); - } - ax5043RX(&lband, false, false); - ax5043RX(&uhf, false, false); - tx_tp = chThdCreateFromHeap(NULL, THD_WORKING_AREA_SIZE(0x400), "TX Worker", NORMALPRIO, tx_worker, (void*)tx_eng); -} - -void comms_stop(void) -{ - /* Stop transmissions */ - beacon_enable(false); - chThdTerminate(tx_tp); - chThdWait(tx_tp); - tx_tp = NULL; - - /* Stop receiving */ - radio_stop(); - - /* Terminate receive threads */ - for (int i = 0; i < EDL_WORKERS; i++) { - chThdTerminate(edl_tp[i]); - chThdWait(edl_tp[i]); - edl_tp[i] = NULL; - } -} - -void comms_cmd(fb_t *fb, void *arg) -{ - (void)arg; - osalDbgCheck(fb != NULL); - fb_t *resp_fb = fb_alloc(CMD_RESP_ALLOC, &tx_fifo); - fb_reserve(resp_fb, USLP_MAX_HEADER_LEN + 6); /* TODO: Replace 6 with some calculation of SDLS overhead */ - cmd_process((cmd_t*)fb->data, resp_fb); - uslp_map_send(fb->phy_arg, resp_fb, 0, 0, true); -} - -void comms_file(fb_t *fb, void *arg) -{ - (void)arg; - osalDbgCheck(fb != NULL); - fb_t *resp_fb = fb_alloc(CMD_RESP_ALLOC, &tx_fifo); - fb_reserve(resp_fb, USLP_MAX_HEADER_LEN + 6); /* TODO: Replace 6 with some calculation of SDLS overhead */ - int *ret = fb_put(resp_fb, sizeof(int)); - uint32_t *crc = fb_put(resp_fb, sizeof(uint32_t)); - *ret = file_recv((file_xfr_t*)fb->data, crc); - uslp_map_send(fb->phy_arg, resp_fb, 1, 0, true); -} - -void comms_beacon(fb_t *fb, void *arg) -{ - (void)fb; - (void)arg; - beacon_send(tx_ax25); -} - -void beacon_enable(bool enable) -{ - if (enable && beacon_tp == NULL) { - beacon_tp = chThdCreateFromHeap(NULL, THD_WORKING_AREA_SIZE(0x800), "Beacon", NORMALPRIO, beacon, (void*)tx_ax25); - } else if (!enable && beacon_tp != NULL) { - chThdTerminate(beacon_tp); - chThdWait(beacon_tp); - beacon_tp = NULL; - } -} diff --git a/src/f4/app_control/source/comms.h b/src/f4/app_control/source/comms.h deleted file mode 100644 index 158423d8..00000000 --- a/src/f4/app_control/source/comms.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _COMMS_H_ -#define _COMMS_H_ - -#include "radio.h" - -#define XTAL_CLK 16000000U -#define EDL_WORKERS 1 - -#define SCID 0x4F53U -#define MCID ((USLP_TFVN << 16) | SCID) -/* 16-bit FECF provided by AX5043 driver */ -#define FECF_LEN 2 -#define USLP_MAX_LEN (FB_MAX_LEN + FECF_LEN) -#define CMD_RESP_LEN 64 -#define CMD_RESP_ALLOC (CMD_RESP_LEN + USLP_MAX_HEADER_LEN) -#define FILE_BUF_LEN 1024 - -#ifdef __cplusplus -extern "C" { -#endif - -extern AX5043Driver lband; -extern AX5043Driver uhf; - -void comms_init(void); -void comms_start(void); -void comms_stop(void); - -void comms_cmd(fb_t *fb, void *arg); -void comms_file(fb_t *fb, void *arg); -void comms_beacon(fb_t *fb, void *arg); -void beacon_enable(bool enable); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/deployer.c b/src/f4/app_control/source/deployer.c deleted file mode 100644 index ee7b0ce0..00000000 --- a/src/f4/app_control/source/deployer.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "ch.h" -#include "hal.h" -#include "deployer.h" - -void deploy_heli(uint32_t duration) -{ - palSetLine(LINE_FIRE_HELI_1); - palSetLine(LINE_FIRE_HELI_2); - chThdSleepMilliseconds(duration); - palClearLine(LINE_FIRE_HELI_1); - palClearLine(LINE_FIRE_HELI_2); - - return; -} - -void deploy_turn(uint32_t duration) -{ - palSetLine(LINE_FIRE_TURN_1); - palSetLine(LINE_FIRE_TURN_2); - chThdSleepMilliseconds(duration); - palClearLine(LINE_FIRE_TURN_1); - palClearLine(LINE_FIRE_TURN_2); - - return; -} diff --git a/src/f4/app_control/source/deployer.h b/src/f4/app_control/source/deployer.h deleted file mode 100644 index 7625582d..00000000 --- a/src/f4/app_control/source/deployer.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _DEPLOYER_H_ -#define _DEPLOYER_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void deploy_heli(uint32_t duration); -void deploy_turn(uint32_t duration); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/file_xfr.c b/src/f4/app_control/source/file_xfr.c deleted file mode 100644 index 82d984ab..00000000 --- a/src/f4/app_control/source/file_xfr.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "file_xfr.h" -#include "crc.h" - -int file_recv(file_xfr_t *xfr, uint32_t *crc) -{ - char filename[9] = {0}; - lfs_file_t *file; - int ret; - - memcpy(filename, xfr->filename, 8); - file = file_open(&FSD1, filename, LFS_O_WRONLY | LFS_O_CREAT); - if (file == NULL) { - return FSD1.err; - } - - ret = file_seek(&FSD1, file, xfr->off, LFS_SEEK_SET); - if (ret < 0) - goto file_recv_fail; - - ret = file_write(&FSD1, file, xfr->data, xfr->len); - if (ret < 0) - goto file_recv_fail; - - *crc = crc32(xfr->data, xfr->len, 0); - -file_recv_fail: - file_close(&FSD1, file); - return ret; -} diff --git a/src/f4/app_control/source/file_xfr.h b/src/f4/app_control/source/file_xfr.h deleted file mode 100644 index c1c90834..00000000 --- a/src/f4/app_control/source/file_xfr.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _FILE_XFR_H_ -#define _FILE_XFR_H_ - -#include "fs.h" - -typedef struct { - char filename[8]; - uint32_t off; - uint32_t len; - uint8_t data[]; -} file_xfr_t; - -#ifdef __cplusplus -extern "C" { -#endif - -int file_recv(file_xfr_t *xfr, uint32_t *crc); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/fw.c b/src/f4/app_control/source/fw.c deleted file mode 100644 index 61b902c7..00000000 --- a/src/f4/app_control/source/fw.c +++ /dev/null @@ -1,188 +0,0 @@ -#include -#include - -#include "fw.h" -#include "fs.h" -#include "crc.h" -#include "persist.h" -#include "fram.h" - -#define FLASH_OPTKEY1 0x08192A3BU -#define FLASH_OPTKEY2 0x4C5D6E7FU -#define FLASH_BANK_OFFSET 0x100000U -#define BUF_SIZE 256 - -uint8_t buf[BUF_SIZE]; - -int fw_read(EFlashDriver *eflp, char *filename, flash_offset_t offset, size_t len) -{ - lfs_file_t *file; - int ret; - - file = file_open(&FSD1, filename, LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC); - if (file == NULL) { - return FSD1.err; - } - - eflStart(&EFLD1, NULL); - while (len) { - ssize_t n = (len > BUF_SIZE ? BUF_SIZE : len); - - ret = flashRead(eflp, offset, n, buf); - if (ret != FLASH_NO_ERROR) { - break; - } - n = file_write(&FSD1, file, buf, n); - if (n < 0) { - ret = n; - break; - } - offset += n; - len -= n; - }; - eflStop(&EFLD1); - - file_close(&FSD1, file); - return ret; -} - -int fw_write(EFlashDriver *eflp, char *filename, flash_offset_t offset) -{ - lfs_file_t *file; - ssize_t n; - int ret; - - file = file_open(&FSD1, filename, LFS_O_RDONLY); - if (file == NULL) { - return FSD1.err; - } - - eflStart(&EFLD1, NULL); - while ((n = file_read(&FSD1, file, buf, BUF_SIZE)) > 0) { - ret = flashProgram(eflp, offset, n, buf); - if (ret != FLASH_NO_ERROR) { - break; - } - offset += n; - } - eflStop(&EFLD1); - if (n != 0) { - ret = n; - } - - file_close(&FSD1, file); - return ret; -} - -uint32_t fw_crc(EFlashDriver *eflp, fw_bank_t bank, size_t len) -{ - uint32_t crc = 0; - flash_offset_t offset; - offset = (((SYSCFG->MEMRMP & SYSCFG_MEMRMP_UFB_MODE) >> SYSCFG_MEMRMP_UFB_MODE_Pos) ^ bank ? FLASH_BANK_OFFSET : 0); - eflStart(eflp, NULL); - while (len) { - ssize_t n = len; - if (n > BUF_SIZE) { - n = BUF_SIZE; - } - - if (flashRead(eflp, offset, n, buf) != FLASH_NO_ERROR) { - break; - } - crc = crc32(buf, n, crc); - offset += n; - len -= n; - }; - eflStop(eflp); - return crc; -} - -uint32_t fw_verify(EFlashDriver *eflp, fw_bank_t bank) -{ - fw_info_t fw_info[2] = {0}; - uint32_t crc = 0; - size_t len; - - framRead(&FRAMD1, FRAM_FWINFO_ADDR, &fw_info, sizeof(fw_info)); - len = fw_info[bank].len; - if (len == 0) - return 0; - - crc = fw_crc(eflp, bank, len); - - return (crc == fw_info[bank].crc ? crc : 0); -} - -void fw_set_info(fw_info_t fw_info, fw_bank_t bank) -{ - uint16_t addr = (bank ? FRAM_FWINFO_ADDR + sizeof(fw_info_t) : FRAM_FWINFO_ADDR); - framWrite(&FRAMD1, addr, &fw_info, sizeof(fw_info_t)); -} - -int fw_flash(EFlashDriver *eflp, char *filename, uint32_t expected_crc) -{ - lfs_file_t *file; - fw_info_t fw_info = {0}; - int ret; - - /* Verify the file matches the expected CRC */ - file = file_open(&FSD1, filename, LFS_O_RDONLY); - if (file == NULL) { - return FSD1.err; - } - fw_info.crc = file_crc(&FSD1, file); - fw_info.len = file_size(&FSD1, file); - file_close(&FSD1, file); - if (FSD1.err != LFS_ERR_OK) { - return FSD1.err; - } - if (fw_info.crc != expected_crc) { - return FLASH_ERROR_VERIFY; - } - - /* Erase the offline flash bank */ - eflStart(&EFLD1, NULL); - ret = flashStartEraseAll(eflp); - if (ret != FLASH_NO_ERROR) - return ret; - /* Wait for erase operation to complete */ - ret = flashWaitErase((BaseFlash*)eflp); - if (ret != FLASH_NO_ERROR) - return ret; - eflStop(&EFLD1); - - /* Write new firmware image to offline bank */ - ret = fw_write(eflp, filename, FLASH_BANK_OFFSET); - if (ret != FLASH_NO_ERROR) - return ret; - - /* Commit new FW info to FRAM */ - fw_set_info(fw_info, !(SYSCFG->MEMRMP & SYSCFG_MEMRMP_UFB_MODE)); - - return !fw_verify(eflp, !(SYSCFG->MEMRMP & SYSCFG_MEMRMP_UFB_MODE)); -} - -int fw_set_bank(EFlashDriver *eflp, fw_bank_t bank) -{ - int ret; - - ret = flashQueryErase(eflp, NULL); - if (ret != FLASH_NO_ERROR) - return ret; - /* Unlock option byte control register */ - eflp->flash->OPTKEYR |= FLASH_OPTKEY1; - eflp->flash->OPTKEYR |= FLASH_OPTKEY2; - - /* Set bank bit appropriately */ - eflp->flash->OPTCR &= ~FLASH_OPTCR_BFB2; - eflp->flash->OPTCR |= (bank << FLASH_OPTCR_BFB2_Pos); - eflp->flash->OPTCR |= FLASH_OPTCR_OPTSTRT; - - /* Wait for operation to finish */ - while ((eflp->flash->SR & FLASH_SR_BSY) != 0); - - /* Lock option byte control register */ - eflp->flash->OPTCR |= FLASH_OPTCR_OPTLOCK; - - return ret; -} diff --git a/src/f4/app_control/source/fw.h b/src/f4/app_control/source/fw.h deleted file mode 100644 index 847d79ff..00000000 --- a/src/f4/app_control/source/fw.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _FW_H_ -#define _FW_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - BANK_0 = 0, - BANK_1 = 1 -} fw_bank_t; - -typedef struct { - uint32_t crc; - size_t len; -} fw_info_t; - -int fw_read(EFlashDriver *eflp, char *filename, flash_offset_t offset, size_t len); -int fw_write(EFlashDriver *eflp, char *filename, flash_offset_t offset); -uint32_t fw_crc(EFlashDriver *eflp, fw_bank_t bank, size_t len); -uint32_t fw_verify(EFlashDriver *eflp, fw_bank_t bank); -void fw_set_info(fw_info_t fw_info, fw_bank_t bank); -int fw_flash(EFlashDriver *eflp, char *filename, uint32_t expected_crc); -int fw_set_bank(EFlashDriver *eflp, fw_bank_t bank); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/hmac.c b/src/f4/app_control/source/hmac.c deleted file mode 100644 index b98f0438..00000000 --- a/src/f4/app_control/source/hmac.c +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include "hmac.h" -#include "CANopen.h" -#include "OD.h" - -int hmac_send(void *data, size_t len, void *iv, void *seq_num, void *mac, void *arg) -{ - (void)iv; - cryerror_t err; - HMACSHA256Context ctx = {0}; - - *((uint32_t*)seq_num) = __builtin_bswap32(OD_PERSIST_STATE.x6004_persistentState.EDL_SequenceCount); - - err = cryLoadHMACTransientKey(&CRYD1, 32, arg); - if (err != CRY_NOERROR) { - return err; - } - - err = cryHMACSHA256Init(&CRYD1, &ctx); - if (err != CRY_NOERROR) { - return err; - } - - err = cryHMACSHA256Update(&CRYD1, &ctx, len, data); - if (err != CRY_NOERROR) { - return err; - } - - err = cryHMACSHA256Final(&CRYD1, &ctx, mac); - if (err != CRY_NOERROR) { - return err; - } - - return 0; -} -int hmac_recv(void *data, size_t len, void *iv, void *seq_num, void *mac, void *arg) -{ - (void)iv; - cryerror_t err; - HMACSHA256Context ctx = {0}; - uint8_t hmac[32] = {0}; - uint32_t recv_seq = __builtin_bswap32(*((uint32_t*)seq_num)); - - /* Check sequence number first */ - if (recv_seq < OD_PERSIST_STATE.x6004_persistentState.EDL_SequenceCount) { - return -1; - } - - /* Calculate HMAC */ - err = cryLoadHMACTransientKey(&CRYD1, 32, arg); - if (err != CRY_NOERROR) { - return err; - } - err = cryHMACSHA256Init(&CRYD1, &ctx); - if (err != CRY_NOERROR) { - return err; - } - err = cryHMACSHA256Update(&CRYD1, &ctx, len, data); - if (err != CRY_NOERROR) { - return err; - } - err = cryHMACSHA256Final(&CRYD1, &ctx, hmac); - if (err != CRY_NOERROR) { - return err; - } - - /* Compare HMAC */ - if (memcmp(hmac, mac, 32) != 0) { - return -1; - } - - /* Set new sequence number */ - OD_PERSIST_STATE.x6004_persistentState.EDL_SequenceCount = recv_seq + 1; - - return 0; -} diff --git a/src/f4/app_control/source/hmac.h b/src/f4/app_control/source/hmac.h deleted file mode 100644 index 1cc9ef61..00000000 --- a/src/f4/app_control/source/hmac.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _HMAC_H_ -#define _HMAC_H_ - -#include "ch.h" -#include "hal.h" - -int hmac_send(void *data, size_t len, void *iv, void *seq_num, void *mac, void *arg); -int hmac_recv(void *data, size_t len, void *iv, void *seq_num, void *mac, void *arg); - -#endif diff --git a/src/f4/app_control/source/persist.c b/src/f4/app_control/source/persist.c deleted file mode 100644 index 0a278f6d..00000000 --- a/src/f4/app_control/source/persist.c +++ /dev/null @@ -1,94 +0,0 @@ -#include -#include "persist.h" -#include "fram.h" -#include "crc.h" -#include "CANopen.h" -#include "OD.h" - -typedef struct { - uint32_t crc; - uint8_t data[]; -} buf_t; - -typedef struct { - void *data; - size_t len; - uint16_t fram_addr; -} persist_group_t; - -persist_group_t storage[] = { - {&OD_PERSIST_KEYS, sizeof(OD_PERSIST_KEYS), FRAM_KEYS_ADDR}, - {&OD_PERSIST_STATE, sizeof(OD_PERSIST_STATE), FRAM_STATE_ADDR}, - {&OD_PERSIST_COMM, sizeof(OD_PERSIST_COMM), FRAM_COMM_ADDR}, - {&OD_PERSIST_MFR, sizeof(OD_PERSIST_MFR), FRAM_MFR_ADDR}, - {&OD_PERSIST_APP, sizeof(OD_PERSIST_APP), FRAM_APP_ADDR}, - {NULL, 0, 0} -}; - -void persistStoreGroup(void *group) -{ - persist_group_t *ptr = storage; - while (ptr->data != NULL && ptr->data != group) - ptr++; - osalDbgCheck(ptr != NULL); - - /* Checksum data and store */ - buf_t *buf = malloc(sizeof(buf_t) + ptr->len); - memcpy(buf->data, ptr->data, ptr->len); - buf->crc = crc32(buf->data, ptr->len, 0); - framWrite(&FRAMD1, ptr->fram_addr, buf, sizeof(buf) + ptr->len); - free(buf); -} - -void persistRestoreGroup(void *group) -{ - persist_group_t *ptr = storage; - while (ptr->data != NULL && ptr->data != group) - ptr++; - osalDbgCheck(ptr != NULL); - - /* Check that data is valid and restore */ - buf_t *buf = malloc(sizeof(buf_t) + ptr->len); - framRead(&FRAMD1, ptr->fram_addr, buf, sizeof(buf) + ptr->len); - if (buf->crc == crc32(buf->data, ptr->len, 0)) { - memcpy(ptr->data, buf->data, ptr->len); - } - free(buf); -} - -void persistResetGroup(void *group) -{ - persist_group_t *ptr = storage; - while (ptr->data != NULL && ptr->data != group) - ptr++; - osalDbgCheck(ptr != NULL); - - framErase(&FRAMD1, ptr->fram_addr, sizeof(buf_t) + ptr->len); -} - -void persistStoreAll(void) -{ - persist_group_t *ptr = storage; - while (ptr->data != NULL) { - persistStoreGroup(ptr->data); - ptr++; - } -} - -void persistRestoreAll(void) -{ - persist_group_t *ptr = storage; - while (ptr->data != NULL) { - persistRestoreGroup(ptr->data); - ptr++; - } -} - -void persistResetAll(void) -{ - persist_group_t *ptr = storage; - while (ptr->data != NULL) { - persistRestoreGroup(ptr->data); - ptr++; - } -} diff --git a/src/f4/app_control/source/persist.h b/src/f4/app_control/source/persist.h deleted file mode 100644 index 3b219b21..00000000 --- a/src/f4/app_control/source/persist.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _PERSIST_H_ -#define _PERSIST_H_ - -#include "ch.h" -#include "hal.h" - -#define FRAM_FWINFO_ADDR 0x0000U -#define FRAM_KEYS_ADDR 0x0010U -#define FRAM_STATE_ADDR 0x0100U -#define FRAM_COMM_ADDR 0x0200U -#define FRAM_MFR_ADDR 0x0300U -#define FRAM_APP_ADDR 0x0400U - -void persistStoreGroup(void *group); -void persistRestoreGroup(void *group); -void persistResetGroup(void *group); -void persistStoreAll(void); -void persistRestoreAll(void); -void persistResetAll(void); - -#endif diff --git a/src/f4/app_control/source/test/cli.c b/src/f4/app_control/source/test/cli.c deleted file mode 100644 index 8ed119d8..00000000 --- a/src/f4/app_control/source/test/cli.c +++ /dev/null @@ -1,174 +0,0 @@ -#include -#include -#include -#include - -#include "cli.h" -#include "c3.h" -#include "CANopen.h" -#include "OD.h" -#include "test_fw.h" -#include "test_canopen.h" -#include "test_opd.h" -#include "test_time.h" -#include "test_fram.h" -#include "test_persist.h" -#include "test_lfs.h" -#include "test_mmc.h" -#include "test_radio.h" -#include "test_comms.h" -#include "test_deploy.h" -#include "test_crc.h" -#include "test_hmac.h" -#include "chprintf.h" -#include "shell.h" - -static thread_t *shell_tp; -extern thread_t *c3_tp; - -/*===========================================================================*/ -/* OreSat C3 State Control */ -/*===========================================================================*/ -void cmd_state(BaseSequentialStream *chp, int argc, char *argv[]) -{ - if (argc < 1) { - goto state_usage; - } - if (!strcmp(argv[0], "status")) { - chprintf(chp, "C3 State: %c\r\n", OD_RAM.x6000_C3_State[0]); - chprintf(chp, "TX Enable: %s\r\n", (tx_enabled() ? "TRUE" : "FALSE")); - chprintf(chp, "Bat Good: %s\r\n", (bat_good() ? "TRUE" : "FALSE")); - chprintf(chp, "EDL Mode: %s\r\n", (edl_enabled() ? "TRUE" : "FALSE")); - chprintf(chp, "Auth Sequence Number: %d\r\n", OD_PERSIST_STATE.x6004_persistentState.EDL_SequenceCount); - chprintf(chp, "Current Bank: %d\r\n" - "Next Boot Bank: %d\r\n\r\n", - (SYSCFG->MEMRMP & SYSCFG_MEMRMP_UFB_MODE ? 1 : 0), - (FLASH->OPTCR & FLASH_OPTCR_BFB2 ? 1 : 0)); - chprintf(chp, "===RTC===\r\n" - "Date: %08X\r\n" - "Time: %08X\r\n" - "Wakeup: %08X (%s)\r\n" - "Alarm A: %08X (%s)\r\n" - "Alarm B: %08X (%s)\r\n", - RTCD1.rtc->DR, RTCD1.rtc->TR, - RTCD1.rtc->WUTR, (RTCD1.rtc->CR & RTC_CR_WUTE ? "ENABLED" : "DISABLED"), - RTCD1.rtc->ALRMAR, (RTCD1.rtc->CR & RTC_CR_ALRAE ? "ENABLED" : "DISABLED"), - RTCD1.rtc->ALRMBR, (RTCD1.rtc->CR & RTC_CR_ALRBE ? "ENABLED" : "DISABLED")); - } else if (!strcmp(argv[0], "tx") && argc > 1) { - tx_enable(argv[1][0] == 't'); - } else if (!strcmp(argv[0], "edl") && argc > 1) { - edl_enable(argv[1][0] == 't'); - } else if (!strcmp(argv[0], "keyload") && argc > 1) { - uint8_t index = strtoul(argv[1], NULL, 0); - char line[32 * 2] = {0}; - char c, *p = line; - - while (streamRead(chp, (uint8_t*)&c, 1) != 0 && c != 4) { - c = toupper(c); - - if (isdigit(c) || (c >= 'A' && c <= 'F')) { - streamPut(chp, c); - *(p++) = c; - if (p == &line[32 * 2]) { - for (size_t off = 0; off < 32; off++) { - sscanf(&line[off*2], "%2hhx", &OD_PERSIST_KEYS.x6005_cryptoKeys[index][off]); - } - break; - } - } else if ((c == 8) || (c == 127)) { - if (p != line) { - streamPut(chp, 0x08); - streamPut(chp, 0x20); - streamPut(chp, 0x08); - p--; - } - } - } - - chprintf(chp, "\r\nKEY[%u]:", index); - for (int i = 0; i < 32; i++) { - chprintf(chp, " %02X", OD_PERSIST_KEYS.x6005_cryptoKeys[index][i]); - } - chprintf(chp, "\r\n"); - } else if (!strcmp(argv[0], "i2c_cycle")) { - palSetLine(LINE_I2C_PWROFF); - chThdSleepMilliseconds(10); - palClearLine(LINE_I2C_PWROFF); - } else if (!strcmp(argv[0], "softreset")) { - soft_reset(); - } else if (!strcmp(argv[0], "hardreset")) { - hard_reset(); - } else if (!strcmp(argv[0], "factoryreset")) { - chprintf(chp, "Initiating factory reset..."); - factory_reset(); - } else { - goto state_usage; - } - - return; - -state_usage: - chprintf(chp, "Usage: state \r\n" - " status: Get current system state\r\n" - " tx : Override TX enable state\r\n" - " edl : Override EDL state\r\n" - " keyload : Load key into \r\n" - " i2c_cycle: Power cycle I2C peripheral bus\r\n" - " softreset: Soft reset C3\r\n" - " hardreset: Hard reset C3\r\n" - " factoryreset: Reset C3 to factory defaults\r\n" - "\r\n"); - return; -} - -/*===========================================================================*/ -/* Shell */ -/*===========================================================================*/ -static const ShellCommand commands[] = { - {"fw", cmd_fw}, - {"nmt", cmd_nmt}, - {"sdo", cmd_sdo}, - {"opd", cmd_opd}, - {"node", cmd_node}, - {"mmc", cmd_mmc}, - {"time", cmd_time}, - {"lfs", cmd_lfs}, - {"radio", cmd_radio}, - {"synth", cmd_synth}, - {"rf", cmd_rf}, - {"rftest", cmd_rftest}, - {"beacon", cmd_beacon}, - {"state", cmd_state}, - {"fram", cmd_fram}, - {"persist", cmd_persist}, - {"crc", cmd_crc}, - {"hmac", cmd_hmac}, - {"deploy", cmd_deploy}, - {"edl", cmd_edl}, - {NULL, NULL} -}; - -static char histbuf[SHELL_MAX_HIST_BUFF]; - -static const ShellConfig shell_cfg = { - (BaseSequentialStream *)&SD3, - commands, - histbuf, - sizeof(histbuf), -}; - -THD_WORKING_AREA(shell_wa, 0x1000); -THD_WORKING_AREA(cli_wa, 0x100); -THD_FUNCTION(cli, arg) -{ - (void)arg; - - /* Start a shell */ - while (!chThdShouldTerminateX()) { - shell_tp = chThdCreateStatic(shell_wa, sizeof(shell_wa), NORMALPRIO, shellThread, (void *)&shell_cfg); - chThdWait(shell_tp); - chThdSleepMilliseconds(500); - } - - chThdExit(MSG_OK); -} diff --git a/src/f4/app_control/source/test/cli.h b/src/f4/app_control/source/test/cli.h deleted file mode 100644 index ffedc25b..00000000 --- a/src/f4/app_control/source/test/cli.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _CLI_H_ -#define _CLI_H_ - -#include "ch.h" -#include "hal.h" - -extern THD_WORKING_AREA(cli_wa, 0x100); -extern THD_FUNCTION(cli, arg); - -#endif diff --git a/src/f4/app_control/source/test/test_canopen.c b/src/f4/app_control/source/test/test_canopen.c deleted file mode 100644 index 1e3bea22..00000000 --- a/src/f4/app_control/source/test/test_canopen.c +++ /dev/null @@ -1,128 +0,0 @@ -#include -#include "test_canopen.h" -#include "CO_master.h" -#include "chprintf.h" - -extern CO_t *CO; - -/*===========================================================================*/ -/* Support functions */ -/*===========================================================================*/ -/* -bool sdo_file_cb(sdocli_t *sdocli, CO_SDO_return_t ret, CO_SDO_abortCode_t *abort_code, void *arg) -{ - struct cb_arg *data = arg; - ssize_t size, space; - - if (ret < 0) { - chprintf((BaseSequentialStream*)&SD3, "Error in SDO transfer. Ret: %d Abort: %X", ret, *abort_code); - return true; - } - - if (sdocli->state == SDOCLI_ST_DOWNLOAD) { - space = CO_fifo_getSpace(&sdocli->sdo_c->bufFifo); - do { - size = file_read(&FSD1, data->file, data->buf, lfs_min(space, BUF_SIZE)); - if (size < 0) { - *abort_code = CO_SDO_AB_NO_DATA; - return true; - } - CO_SDOclientDownloadBufWrite(sdocli->sdo_c, data->buf, size); - } while (size && (space -= size)); - } else if (sdocli->state == SDOCLI_ST_UPLOAD) { - if (ret == CO_SDO_RT_uploadDataBufferFull || ret == CO_SDO_RT_ok_communicationEnd) { - do { - size = CO_SDOclientUploadBufRead(sdocli->sdo_c, data->buf, BUF_SIZE); - file_write(&FSD1, data->file, data->buf, size); - } while (size); - } - } - - return false; -} -*/ - -/*===========================================================================*/ -/* OreSat CAN Bus NMT */ -/*===========================================================================*/ -void cmd_nmt(BaseSequentialStream *chp, int argc, char *argv[]) -{ - CO_ReturnError_t err; - uint8_t node_id = 0; - - if (argc < 1) { - goto nmt_usage; - } - - if (argc > 1) { - node_id = strtoul(argv[1], NULL, 0); - } - - if (!strcmp(argv[0], "op")) { - err = CO_NMT_sendCommand(CO->NMT, CO_NMT_ENTER_OPERATIONAL, node_id); - } else if (!strcmp(argv[0], "preop")) { - err = CO_NMT_sendCommand(CO->NMT, CO_NMT_ENTER_PRE_OPERATIONAL, node_id); - } else if (!strcmp(argv[0], "stop")) { - err = CO_NMT_sendCommand(CO->NMT, CO_NMT_ENTER_STOPPED, node_id); - } else if (!strcmp(argv[0], "resetcomms")) { - err = CO_NMT_sendCommand(CO->NMT, CO_NMT_RESET_COMMUNICATION, node_id); - } else if (!strcmp(argv[0], "resetnode")) { - err = CO_NMT_sendCommand(CO->NMT, CO_NMT_RESET_NODE, node_id); - } else { - goto nmt_usage; - } - if (err != CO_ERROR_NO) { - chprintf(chp, "Error executing NMT command: %d\r\n", err); - } - return; - -nmt_usage: - chprintf(chp, "Usage: nmt \r\n" - " op: Set device operational\r\n" - " preop: Set device pre-operational\r\n" - " stop: Stop device\r\n" - " resetcomms: Reset CAN communications on device\r\n" - " resetnode: Reset device\r\n" - "\r\n"); - return; -} - -/*===========================================================================*/ -/* OreSat CAN Bus SDO Client */ -/*===========================================================================*/ -void cmd_sdo(BaseSequentialStream *chp, int argc, char *argv[]) -{ - sdocli_op_t op; - uint16_t index = 0; - uint8_t node_id = 0, subindex = 0; - size_t size = 0; - uint32_t value = 0; - - if (argc < 5) { - goto sdo_usage; - } - - if (argv[0][0] == 'w') { - op = SDO_CLI_WRITE; - } else if (argv[0][0] == 'r') { - op = SDO_CLI_READ; - } else { - goto sdo_usage; - } - node_id = strtoul(argv[1], NULL, 0); - index = strtoul(argv[2], NULL, 0); - subindex = strtoul(argv[3], NULL, 0); - size = strtoul(argv[4], NULL, 0); - if (op == SDO_CLI_WRITE) { - value = strtoul(argv[5], NULL, 0); - } - - chprintf(chp, "Initiating transfer... "); - sdo_transfer(op, node_id, index, subindex, size, size, &value); - chprintf(chp, "Started!\r\n"); - return; - -sdo_usage: - chprintf(chp, "Usage: sdo (r)ead|(w)rite [value]\r\n"); - return; -} diff --git a/src/f4/app_control/source/test/test_canopen.h b/src/f4/app_control/source/test/test_canopen.h deleted file mode 100644 index 23abae9a..00000000 --- a/src/f4/app_control/source/test/test_canopen.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _TEST_CANOPEN_H_ -#define _TEST_CANOPEN_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_nmt(BaseSequentialStream *chp, int argc, char *argv[]); -void cmd_sdo(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_comms.c b/src/f4/app_control/source/test/test_comms.c deleted file mode 100644 index d2147606..00000000 --- a/src/f4/app_control/source/test/test_comms.c +++ /dev/null @@ -1,398 +0,0 @@ -#include -#include -#include "test_comms.h" -#include "c3.h" -#include "cmd.h" -#include "file_xfr.h" -#include "comms.h" -#include "uslp.h" -#include "hmac.h" -#include "CANopen.h" -#include "OD.h" -#include "chprintf.h" - -#define COMMS_EVENT_LOOPBACK_RX EVENT_MASK(0) - -extern const uslp_mc_t mc; - -static fb_t *tx_fb; - -static thread_t *cli_tp; - -static uint8_t resp_buf[CMD_RESP_LEN]; -static size_t buf_len; - -static void pdu_loopback(fb_t *fb, void *arg); -static void resp_recv(fb_t *fb, void *arg); - -#if (USLP_USE_SDLS == TRUE) -static const sdls_cfg_t sdls_cfg = { - .spi = 1, - .iv_len = 0, - .seq_num_len = sizeof(OD_PERSIST_STATE.x6004_persistentState.EDL_SequenceCount), - .pad_len = 0, - .mac_len = 32, - .send_func = hmac_send, - .send_arg = OD_PERSIST_KEYS.x6005_cryptoKeys[0], - .recv_func = NULL, - .recv_arg = NULL, -}; -#endif - -static const uslp_map_t map_cmd = { - .sdu = SDU_MAP_ACCESS, - .upid = UPID_MAPA_SDU, - .max_pkt_len = CMD_RESP_LEN, - .incomplete = false, - .map_recv = resp_recv, -}; - -static const uslp_map_t map_file = { - .sdu = SDU_MAP_ACCESS, - .upid = UPID_MAPA_SDU, - .max_pkt_len = FILE_BUF_LEN + sizeof(file_xfr_t), - .incomplete = false, - .map_recv = resp_recv, -}; - -static const uslp_vc_t vc0 = { - .seq_ctrl_len = 0, - .expedited_len = 0, - .seq_ctrl_cnt = NULL, - .expedited_cnt = NULL, - .cop = COP_NONE, - .mapid[0] = &map_cmd, - .trunc_tf_len = USLP_MAX_LEN, - .ocf = false, -#if (USLP_USE_SDLS == TRUE) - .sdls_cfg = &sdls_cfg, -#endif -}; - -static const uslp_vc_t vc1 = { - .seq_ctrl_len = 0, - .expedited_len = 0, - .seq_ctrl_cnt = NULL, - .expedited_cnt = NULL, - .cop = COP_NONE, - .mapid[0] = &map_file, - .trunc_tf_len = USLP_MAX_LEN, - .ocf = false, -#if (USLP_USE_SDLS == TRUE) - .sdls_cfg = NULL, -#endif -}; - -static const uslp_mc_t loopback_mc = { - .scid = &OD_PERSIST_APP.x6006_CCSDS.spacecraftID, - .owner = false, - .vcid[0] = &vc0, - .vcid[1] = &vc1, -}; - -static const uslp_pc_t loopback_pc = { - .name = "Loopback", - .tf_len = USLP_MAX_LEN, - .fecf = FECF_SW, - .fecf_len = FECF_LEN, - .phy_send = pdu_loopback, - .phy_send_ahead = pdu_loopback, -}; - -static const uslp_link_t edl_loopback_rx_link = { - .mc = &mc, - .pc_rx = &loopback_pc, - .pc_tx = &loopback_pc, -}; - -static const uslp_link_t edl_loopback_tx_link = { - .mc = &loopback_mc, - .pc_rx = &loopback_pc, - .pc_tx = &loopback_pc, -}; - -static void pdu_loopback(fb_t *fb, void *arg) -{ - (void)arg; - if (fb == tx_fb) { - fb->phy_arg = (void*)&edl_loopback_rx_link; - pdu_send(fb, &rx_fifo); - } else { - uslp_recv(&edl_loopback_tx_link, fb); - fb_free(fb, &tx_fifo); - } -} - -static void resp_recv(fb_t *fb, void *arg) -{ - (void)arg; - osalDbgCheck(fb != NULL); - memcpy(resp_buf, fb->data, fb->len); - buf_len = fb->len; - chEvtSignal(cli_tp, COMMS_EVENT_LOOPBACK_RX); -} - -static void print_response(BaseSequentialStream *chp) -{ - if (chEvtWaitAnyTimeout(COMMS_EVENT_LOOPBACK_RX, TIME_S2I(30)) != 0) { - chprintf(chp, "Response buffer:"); - for (size_t i = 0; i < buf_len; i++) { - if (i % 0x10 == 0) chprintf(chp, "\r\n%04X:", i); - chprintf(chp, " %02X", resp_buf[i]); - } - chprintf(chp, "\r\n"); - } else { - chprintf(chp, "No response!\r\n"); - } -} - -static void send_cmd(cmd_code_t cmd_code, void *arg, size_t arg_len) -{ - cmd_t *cmd; - tx_fb = fb_alloc(CMD_RESP_ALLOC, &rx_fifo); - /* TODO: What's the 2 for? */ - fb_reserve(tx_fb, USLP_MAX_HEADER_LEN + 2 + 6); /* TODO: Replace 6 with some calculation of SDLS overhead */ - cmd = fb_put(tx_fb, sizeof(cmd_t) + arg_len); - cmd->cmd = cmd_code; - if (arg != NULL) - memcpy(cmd->arg, arg, arg_len); - uslp_map_send(&edl_loopback_tx_link, tx_fb, 0, 0, true); -} - -static int send_file_seg(BaseSequentialStream *chp, char *src, char *dest, lfs_soff_t off, lfs_size_t len) -{ - file_xfr_t *xfr; - lfs_file_t *file; - uint8_t *data; - int ret; - - file = file_open(&FSD1, src, LFS_O_RDONLY); - if (file == NULL) { - return FSD1.err; - } - ret = file_seek(&FSD1, file, off, LFS_SEEK_SET); - if (ret < 0) { - file_close(&FSD1, file); - return ret; - } - - tx_fb = fb_alloc(FB_MAX_LEN, &rx_fifo); - /* TODO: What's the 2 for? */ - fb_reserve(tx_fb, USLP_MAX_HEADER_LEN + sizeof(file_xfr_t) + 2 + 6); /* TODO: Replace 6 with some calculation of SDLS overhead */ - data = fb_put(tx_fb, len); - ret = file_read(&FSD1, file, data, len); - file_close(&FSD1, file); - if (ret < 0) { - fb_free(tx_fb, &rx_fifo); - return ret; - } - xfr = fb_push(tx_fb, sizeof(file_xfr_t)); - memcpy(xfr->filename, dest, strlen(dest) + 1); - xfr->off = off; - xfr->len = len; - chprintf(chp, "Sending %d byte block to offset %d...\r\n", len, off); - uslp_map_send(&edl_loopback_tx_link, tx_fb, 0, 1, true); - print_response(chp); - - return ret; -} - -static int send_file(BaseSequentialStream *chp, char *src, char *dest) -{ - lfs_ssize_t len; - lfs_soff_t off = 0; - lfs_file_t *file; - - if (!strcmp(src, dest)) { - return LFS_ERR_INVAL; - } - - file = file_open(&FSD1, src, LFS_O_RDONLY); - if (file == NULL) { - return FSD1.err; - } - len = file_size(&FSD1, file); - file_close(&FSD1, file); - if (len < 0) { - return FSD1.err; - } - - while (len) { - lfs_ssize_t n = (len > FILE_BUF_LEN ? FILE_BUF_LEN : len); - n = send_file_seg(chp, src, dest, off, n); - if (n < 0) { - return n; - } - off += n; - len -= n; - } - return off; -} - -/*===========================================================================*/ -/* OreSat C3 EDL */ -/*===========================================================================*/ -void cmd_edl(BaseSequentialStream *chp, int argc, char *argv[]) -{ - cli_tp = chThdGetSelfX(); - - if (argc < 1) { - goto edl_usage; - } - if (!strcmp(argv[0], "tx_enable") && argc > 1) { - uint8_t arg = strtoul(argv[1], NULL, 0); - send_cmd(CMD_TX_CTRL, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "fw_flash") && argc > 2) { - struct { - uint32_t crc; - char filename[strlen(argv[1]) + 1]; - } arg; - arg.crc = strtoul(argv[2], NULL, 0); - memcpy(arg.filename, argv[1], strlen(argv[1]) + 1); - send_cmd(CMD_FW_FLASH, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "fw_bank") && argc > 1) { - uint8_t arg = strtoul(argv[1], NULL, 0); - send_cmd(CMD_FW_BANK, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "fw_verify") && argc > 1) { - uint8_t arg = strtoul(argv[1], NULL, 0); - send_cmd(CMD_FW_VERIFY, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "c3_softreset")) { - uint32_t arg[] = {0x01234567U, 0x89ABCDEFU}; - send_cmd(CMD_C3_SOFTRESET, arg, sizeof(arg)); - } else if (!strcmp(argv[0], "c3_hardreset")) { - uint32_t arg[] = {0x01234567U, 0x89ABCDEFU}; - send_cmd(CMD_C3_HARDRESET, arg, sizeof(arg)); - } else if (!strcmp(argv[0], "c3_factoryreset")) { - uint32_t arg[] = {0x01234567U, 0x89ABCDEFU}; - send_cmd(CMD_C3_FACTORYRESET, arg, sizeof(arg)); - } else if (!strcmp(argv[0], "fs_upload") && argc > 2) { - chprintf(chp, "File send result: %d\r\n", send_file(chp, argv[1], argv[2])); - } else if (!strcmp(argv[0], "fs_upload_seg") && argc > 4) { - lfs_soff_t off = strtoul(argv[3], NULL, 0); - lfs_ssize_t len = strtoul(argv[4], NULL, 0); - chprintf(chp, "File send result: %d\r\n", send_file_seg(chp, argv[1], argv[2], off, len)); - } else if (!strcmp(argv[0], "fs_format")) { - send_cmd(CMD_FS_FORMAT, NULL, 0); - print_response(chp); - } else if (!strcmp(argv[0], "fs_unmount")) { - send_cmd(CMD_FS_UNMOUNT, NULL, 0); - print_response(chp); - } else if (!strcmp(argv[0], "fs_remove") && argc > 1) { - send_cmd(CMD_FS_REMOVE, argv[1], strlen(argv[1]) + 1); - print_response(chp); - } else if (!strcmp(argv[0], "fs_crc") && argc > 1) { - send_cmd(CMD_FS_CRC, argv[1], strlen(argv[1]) + 1); - print_response(chp); - } else if (!strcmp(argv[0], "node_enable") && argc > 2) { - uint8_t arg[2]; - arg[0] = strtoul(argv[1], NULL, 0); - arg[1] = strtoul(argv[2], NULL, 0); - send_cmd(CMD_NODE_ENABLE, arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "node_status") && argc > 1) { - uint8_t arg = strtoul(argv[1], NULL, 0); - send_cmd(CMD_NODE_STATUS, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "opd_sysenable")) { - send_cmd(CMD_OPD_SYSENABLE, NULL, 0); - print_response(chp); - } else if (!strcmp(argv[0], "opd_sysdisable")) { - send_cmd(CMD_OPD_SYSDISABLE, NULL, 0); - print_response(chp); - } else if (!strcmp(argv[0], "opd_scan") && argc > 1) { - uint8_t arg = strtoul(argv[1], NULL, 0); - send_cmd(CMD_OPD_SCAN, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "opd_enable") && argc > 2) { - uint8_t arg[2]; - arg[0] = strtoul(argv[1], NULL, 0); - arg[1] = strtoul(argv[2], NULL, 0); - send_cmd(CMD_OPD_ENABLE, arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "opd_reset") && argc > 1) { - uint8_t arg = strtoul(argv[1], NULL, 0); - send_cmd(CMD_OPD_RESET, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "opd_status") && argc > 1) { - uint8_t arg = strtoul(argv[1], NULL, 0); - send_cmd(CMD_OPD_STATUS, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "rtc_settime") && argc > 1) { - uint32_t arg = strtoul(argv[1], NULL, 0); - send_cmd(CMD_RTC_SETTIME, &arg, sizeof(arg)); - print_response(chp); - } else if (!strcmp(argv[0], "send")) { - uint8_t buf[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, - 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F - }; - edl_enable(true); - tx_fb = fb_alloc(sizeof(buf), &tx_fifo); - tx_fb->data_ptr = fb_put(tx_fb, sizeof(buf)); - memcpy(tx_fb->data_ptr, buf, sizeof(buf)); - pdu_send(tx_fb, &tx_fifo); - } else { - goto edl_usage; - } - - return; - -edl_usage: - chprintf(chp, "Usage: edl \r\n" - " tx_enable :\r\n" - " Post a TX Enable command to EDL RX queue with \r\n" - " fw_flash :\r\n" - " Post a FW Flash command to EDL RX queue\r\n" - " fw_bank :\r\n" - " Post a FW Bank command to EDL RX queue\r\n" - " fw_verify :\r\n" - " Post a FW Verify command to EDL RX queue\r\n" - " c3_softreset:\r\n" - " Post a C3 Soft Reset command to EDL RX queue\r\n" - " c3_hardreset:\r\n" - " Post a C3 Hard Reset command to EDL RX queue\r\n" - " c3_factoryreset:\r\n" - " Post a C3 Factory Reset command to EDL RX queue\r\n" - " fs_upload :\r\n" - " Upload to via EDL\r\n" - " fs_upload_seg :\r\n" - " Upload bytes starting at from to via EDL\r\n" - " fs_format:\r\n" - " Post FS Format command to EDL RX queue\r\n" - " fs_unmount:\r\n" - " Post FS Unmount command to EDL RX queue\r\n" - " fs_remove :\r\n" - " Post FS Remove command to EDL RX queue\r\n" - " fs_crc :\r\n" - " Post FS CRC command to EDL RX queue\r\n" - " node_enable :\r\n" - " Post a Node Enable command for to EDL RX queue\r\n" - " node_status :\r\n" - " Post a Node Status command for to EDL RX queue\r\n" - " opd_sysenable:\r\n" - " Post a OPD SysEnable command to EDL RX queue\r\n" - " opd_sysdisable:\r\n" - " Post a OPD SysDisable command to EDL RX queue\r\n" - " opd_scan :\r\n" - " Post a OPD Scan command for to EDL RX queue\r\n" - " opd_enable :\r\n" - " Post a OPD Enable command for to EDL RX queue\r\n" - " opd_reset :\r\n" - " Post a OPD Reset command for to EDL RX queue\r\n" - " opd_status :\r\n" - " Post a OPD Status command for to EDL RX queue\r\n" - " send:\r\n" - " Send a packet on EDL link\r\n" - "\r\n"); - return; -} diff --git a/src/f4/app_control/source/test/test_comms.h b/src/f4/app_control/source/test/test_comms.h deleted file mode 100644 index 1d8a6510..00000000 --- a/src/f4/app_control/source/test/test_comms.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _TEST_COMMS_H_ -#define _TEST_COMMS_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_edl(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif - diff --git a/src/f4/app_control/source/test/test_crc.c b/src/f4/app_control/source/test/test_crc.c deleted file mode 100644 index 6a7ce433..00000000 --- a/src/f4/app_control/source/test/test_crc.c +++ /dev/null @@ -1,123 +0,0 @@ -#include -#include -#include "test_crc.h" -#include "crc.h" -#include "301/crc16-ccitt.h" -#include "fs.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* CRC Subsystem */ -/*===========================================================================*/ -void cmd_crc(BaseSequentialStream *chp, int argc, char *argv[]) -{ - if (argc < 1) { - goto crc_usage; - } - - if (!strcmp(argv[0], "check")) { - uint8_t test[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F - }; - uint32_t hw_32 = 0xFFFFFFFFU, sw_32 = 0xFFFFFFFFU; - uint32_t lfscrc= 0xFFFFFFFFU; - uint16_t hw_16 = 0xFFFFU; - uint16_t sw_16 = 0xFFFFU; - uint16_t ccitt = 0xFFFFU; - - hw_32 = crc32_hw(test, sizeof(test), hw_32); - sw_32 = crc32_sw(test, sizeof(test), sw_32); -#if (STM32_CRC_PROGRAMMABLE == TRUE) - hw_16 = crc16_ccitt_hw(test, sizeof(test), hw_16); -#endif - sw_16 = crc16_ccitt_sw(test, sizeof(test), sw_16); - ccitt = crc16_ccitt(test, sizeof(test), ccitt); - lfscrc = lfs_crc(lfscrc, test, sizeof(test)); -#if (STM32_CRC_PROGRAMMABLE == FALSE) - chprintf(chp, "CRC16_HW NOT SUPPORTED\r\n"); -#endif - chprintf(chp, "=== All At Once ===\r\n"); - chprintf(chp, "CRC32_HW: 0x%08X\r\n" - "CRC32_SW: 0x%08X\r\n" - "LFS_CRC: 0x%08X\r\n" - "CRC16_HW: 0x%04X\r\n" - "CRC16_SW: 0x%04X\r\n" - "CCITT: 0x%04X\r\n\r\n", - ~hw_32, ~sw_32, ~lfscrc, hw_16, sw_16, ccitt); - - hw_32 = sw_32 = lfscrc = 0xFFFFFFFFU; - hw_16 = sw_16 = ccitt = 0xFFFFU; - for (size_t i = 0; i < sizeof(test); i+=4) { - hw_32 = crc32_hw(&test[i], sizeof(uint32_t), hw_32); - } - for (size_t i = 0; i < sizeof(test); i+=4) { - sw_32 = crc32_sw(&test[i], sizeof(uint32_t), sw_32); - } - for (size_t i = 0; i < sizeof(test); i+=4) { - lfscrc = lfs_crc(lfscrc, &test[i], sizeof(uint32_t)); - } -#if (STM32_CRC_PROGRAMMABLE == TRUE) - for (size_t i = 0; i < sizeof(test); i+=4) { - hw_16 = crc16_ccitt_hw(&test[i], sizeof(uint32_t), hw_16); - } -#endif - for (size_t i = 0; i < sizeof(test); i+=4) { - sw_16 = crc16_ccitt_sw(&test[i], sizeof(uint32_t), sw_16); - } - for (size_t i = 0; i < sizeof(test); i+=4) { - ccitt = crc16_ccitt(&test[i], sizeof(uint32_t), ccitt); - } - chprintf(chp, "=== Word At A Time ===\r\n"); - chprintf(chp, "CRC32_HW: 0x%08X\r\n" - "CRC32_SW: 0x%08X\r\n" - "LFS_CRC: 0x%08X\r\n" - "CRC16_HW: 0x%04X\r\n" - "CRC16_SW: 0x%04X\r\n" - "CCITT: 0x%04X\r\n\r\n", - ~hw_32, ~sw_32, ~lfscrc, hw_16, sw_16, ccitt); - hw_32 = sw_32 = lfscrc = 0xFFFFFFFFU; - hw_16 = sw_16 = ccitt = 0xFFFFU; - for (size_t i = 0; i < sizeof(test); i++) { - hw_32 = crc32_hw(&test[i], 1, hw_32); - } - for (size_t i = 0; i < sizeof(test); i++) { - sw_32 = crc32_sw(&test[i], 1, sw_32); - } - for (size_t i = 0; i < sizeof(test); i++) { - lfscrc = lfs_crc(lfscrc, &test[i], 1); - } -#if (STM32_CRC_PROGRAMMABLE == TRUE) - for (size_t i = 0; i < sizeof(test); i++) { - hw_16 = crc16_ccitt_hw(&test[i], 1, hw_16); - } -#endif - for (size_t i = 0; i < sizeof(test); i++) { - sw_16 = crc16_ccitt_sw(&test[i], 1, sw_16); - } - for (size_t i = 0; i < sizeof(test); i++) { - ccitt = crc16_ccitt(&test[i], 1, ccitt); - } - chprintf(chp, "=== Byte At A Time ===\r\n"); - chprintf(chp, "CRC32_HW: 0x%08X\r\n" - "CRC32_SW: 0x%08X\r\n" - "LFS_CRC: 0x%08X\r\n" - "CRC16_HW: 0x%04X\r\n" - "CRC16_SW: 0x%04X\r\n" - "CCITT: 0x%04X\r\n\r\n", - ~hw_32, ~sw_32, ~lfscrc, hw_16, sw_16, ccitt); - } else { - goto crc_usage; - } - - return; - -crc_usage: - chprintf(chp, "Usage: crc \r\n" - " check:\r\n" - " Check consistency of CRC implementations\r\n" - "\r\n"); - return; -} diff --git a/src/f4/app_control/source/test/test_crc.h b/src/f4/app_control/source/test/test_crc.h deleted file mode 100644 index ab66a3fc..00000000 --- a/src/f4/app_control/source/test/test_crc.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_CRC_H_ -#define _TEST_CRC_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_crc(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_deploy.c b/src/f4/app_control/source/test/test_deploy.c deleted file mode 100644 index 78a947dd..00000000 --- a/src/f4/app_control/source/test/test_deploy.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include - -#include "test_deploy.h" -#include "chprintf.h" -#include "deployer.h" - - -/*===========================================================================*/ -/* Deployer Testing */ -/*===========================================================================*/ -void cmd_deploy(BaseSequentialStream *chp, int argc, char *argv[]) { - if (argc < 2) { - goto deploy_usage; - } - - uint32_t duration = strtoul(argv[1], NULL, 0); - - if (argv[0][0] == 'h') { - chprintf(chp, "Attempting to deploy helical antenna..."); - deploy_heli(duration); - } else if (argv[0][0] == 't') { - chprintf(chp, "Attempting to deploy turnstile antenna..."); - deploy_turn(duration); - } else { - goto deploy_usage; - } - - chprintf(chp, "Done!\r\n"); - - return; - -deploy_usage: - chprintf(chp, "Usage: deploy (h)eli|(t)urn \r\n"); - return; -} diff --git a/src/f4/app_control/source/test/test_deploy.h b/src/f4/app_control/source/test/test_deploy.h deleted file mode 100644 index 9ef77ac6..00000000 --- a/src/f4/app_control/source/test/test_deploy.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_DEPLOY_H_ -#define _TEST_DEPLOY_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_deploy(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_fram.c b/src/f4/app_control/source/test/test_fram.c deleted file mode 100644 index 027da78a..00000000 --- a/src/f4/app_control/source/test/test_fram.c +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include "test_fram.h" -#include "fram.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* OreSat C3 FRAM */ -/*===========================================================================*/ -void cmd_fram(BaseSequentialStream *chp, int argc, char *argv[]) -{ - if (argc < 1) { - goto fram_usage; - } - if (!strcmp(argv[0], "read") && argc > 2) { - uint16_t addr = strtoul(argv[1], NULL, 0); - size_t len = strtoul(argv[2], NULL, 0); - uint8_t *buf = calloc(len, sizeof(uint8_t)); - - framRead(&FRAMD1, addr, buf, len); - - for (uint32_t i = 0; i < len; i++) { - if (i % 0x10 == 0) chprintf(chp, "\r\n%04X:", i + addr); - chprintf(chp, " %02X", buf[i]); - } - chprintf(chp, "\r\n"); - - free(buf); - } else if (!strcmp(argv[0], "write") && argc > 3) { - chprintf(chp, "Unimplemented\r\n"); - } else if (!strcmp(argv[0], "erase") && argc > 2) { - uint16_t addr = strtoul(argv[1], NULL, 0); - size_t len = strtoul(argv[2], NULL, 0); - framErase(&FRAMD1, addr, len); - } else if (!strcmp(argv[0], "eraseall")) { - framEraseAll(&FRAMD1); - } else { - goto fram_usage; - } - - return; - -fram_usage: - chprintf(chp, "Usage: fram \r\n" - " read :\r\n" - " Read bytes starting at \r\n" - " erase :\r\n" - " Erase (set to 0) bytes starting at \r\n" - " eraseall\r\n" - " Erase (set to 0) entirety of FRAM\r\n" - "\r\n"); - return; -} - diff --git a/src/f4/app_control/source/test/test_fram.h b/src/f4/app_control/source/test/test_fram.h deleted file mode 100644 index c90fe144..00000000 --- a/src/f4/app_control/source/test/test_fram.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _TEST_FRAM_H_ -#define _TEST_FRAM_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_fram(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif - diff --git a/src/f4/app_control/source/test/test_fw.c b/src/f4/app_control/source/test/test_fw.c deleted file mode 100644 index 2e836573..00000000 --- a/src/f4/app_control/source/test/test_fw.c +++ /dev/null @@ -1,194 +0,0 @@ -#include -#include -#include "test_fw.h" -#include "fw.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* Firmware control */ -/*===========================================================================*/ -void cmd_fw(BaseSequentialStream *chp, int argc, char *argv[]) -{ - - if (argc < 1) { - goto fw_usage; - } - - if (!strcmp(argv[0], "erase")) { - flash_error_t ret; - - /* Start the driver, unlocking the flash */ - eflStart(&EFLD1, NULL); - - /* Start erase operation */ - if (argc > 1) { - /* Get sector and sanity check */ - flash_sector_t sector = strtoul(argv[1], NULL, 0); - if (sector >= EFLD1.descriptor->sectors_count) { - chprintf(chp, "Invalid sector\r\n"); - goto fw_usage; - } - - /* Erase Sector */ - chprintf(chp, "Erasing sector %u... ", sector); - ret = flashStartEraseSector(&EFLD1, sector); - } else { - /* Erase Bank 2 */ - chprintf(chp, "Erasing Bank %d... ", (SYSCFG->MEMRMP & SYSCFG_MEMRMP_UFB_MODE ? BANK_0 : BANK_1)); - ret = flashStartEraseAll(&EFLD1); - } - - /* Wait for erase operation to complete */ - if (ret == FLASH_NO_ERROR) { - /* Initiated successfully, wait for completion */ - ret = flashWaitErase((BaseFlash*)&EFLD1); - } - - /* Verify completion */ - if (ret != FLASH_NO_ERROR) { - chprintf(chp, "Error with erase operation: %d\r\n", ret); - return; - } - chprintf(chp, "Done!\r\n"); - - /* Stop the driver, locking the flash */ - eflStop(&EFLD1); - } else if (!strcmp(argv[0], "verifyerase") && argc > 1) { - /* Start the driver, unlocking the flash */ - eflStart(&EFLD1, NULL); - - /* Get sector and sanity check */ - flash_sector_t sector = strtoul(argv[1], NULL, 0); - if (sector >= EFLD1.descriptor->sectors_count) { - chprintf(chp, "Invalid sector\r\n"); - goto fw_usage; - } - - /* Query for completion status and verify erase */ - chprintf(chp, "Erase query returned %d\r\n", flashQueryErase(&EFLD1, NULL)); - chprintf(chp, "Erase verify returned %d\r\n", flashVerifyErase(&EFLD1, sector)); - - /* Stop the driver, locking the flash */ - eflStop(&EFLD1); - } else if (!strcmp(argv[0], "read") && argc > 3) { - flash_offset_t offset = strtoul(argv[1], NULL, 0); - size_t len = strtoul(argv[2], NULL, 0); - int err; - - chprintf(chp, "Reading %d bytes of flash to %s starting at offset 0x%06X... ", len, argv[3], offset); - err = fw_read(&EFLD1, argv[3], offset, len); - if (err != 0) { - chprintf(chp, "Error: Return code %d\r\n", err); - return; - } - chprintf(chp, "Done!\r\n"); - } else if (!strcmp(argv[0], "write") && argc > 2) { - uint32_t offset = strtoul(argv[1], NULL, 0); - int err; - - chprintf(chp, "Writing %s to flash at offset %05X... ", argv[2], offset); - err = fw_write(&EFLD1, argv[2], offset); - if (err != 0) { - chprintf(chp, "Error: Return code %d\r\n", err); - return; - } - chprintf(chp, "Done!\r\n"); - } else if (!strcmp(argv[0], "flash") && argc > 2) { - uint32_t crc = strtoul(argv[2], NULL, 0); - int err; - - chprintf(chp, "Erasing offline bank and writing %s... ", argv[1]); - err = fw_flash(&EFLD1, argv[1], crc); - if (err != 0) { - chprintf(chp, "Error: Return code %d\r\n", err); - return; - } - chprintf(chp, "Done!\r\n"); - } else if (!strcmp(argv[0], "crc") && argc > 2) { - fw_bank_t bank; - size_t len = strtoul(argv[2], NULL, 0); - if (argv[1][0] == '0') { - bank = BANK_0; - } else if (argv[1][0] == '1') { - bank = BANK_1; - } else { - goto fw_usage; - } - - chprintf(chp, "Bank %d CRC: 0x%08X\r\n\r\n", bank, fw_crc(&EFLD1, bank, len)); - } else if (!strcmp(argv[0], "verify") && argc > 1) { - fw_bank_t bank; - uint32_t crc; - if (argv[1][0] == '0') { - bank = BANK_0; - } else if (argv[1][0] == '1') { - bank = BANK_1; - } else { - goto fw_usage; - } - - chprintf(chp, "Verifying FW in bank %d... ", bank); - crc = fw_verify(&EFLD1, bank); - chprintf(chp, "%s! CRC: 0x%08X\r\n\r\n", (crc ? "VALID" : "INVALID"), crc); - } else if (!strcmp(argv[0], "setinfo") && argc > 3) { - fw_bank_t bank; - fw_info_t fw_info; - fw_info.crc = strtoul(argv[2], NULL, 0); - fw_info.len = strtoul(argv[3], NULL, 0); - if (argv[1][0] == '0') { - bank = BANK_0; - } else if (argv[1][0] == '1') { - bank = BANK_1; - } else { - goto fw_usage; - } - - chprintf(chp, "Setting FW info for bank %d... ", bank); - fw_set_info(fw_info, bank); - chprintf(chp, "Done\r\n"); - } else if (!strcmp(argv[0], "bank") && argc > 1) { - uint32_t bank; - if (argv[1][0] == '0') { - bank = BANK_0; - } else if (argv[1][0] == '1') { - bank = BANK_1; - } else { - goto fw_usage; - } - - chprintf(chp, "Setting next boot bank to %d... ", bank); - int err = fw_set_bank(&EFLD1, bank); - if (err != FLASH_NO_ERROR) { - chprintf(chp, "Error: Return code %d\r\n\r\n", err); - return; - } - chprintf(chp, "Done!\r\n\r\n"); - } else { - goto fw_usage; - } - - return; - -fw_usage: - chprintf(chp, "Usage: fw \r\n" - " erase [sector]:\r\n" - " Erase [sector] or the offline bank if no sector provided\r\n" - " verifyerase :\r\n" - " Verify sector erased\r\n" - " read :\r\n" - " Read bytes of flash starting at into \r\n" - " write :\r\n" - " Write to flash starting at \r\n" - " flash :\r\n" - " Write to offline bank\r\n" - " crc :\r\n" - " Print CRC for assuming length \r\n" - " verify :\r\n" - " Verify firmware in against CRC\r\n" - " setinfo :\r\n" - " Set health info to and \r\n" - " bank :\r\n" - " Set flash bank to for next boot\r\n" - "\r\n"); - return; -} diff --git a/src/f4/app_control/source/test/test_fw.h b/src/f4/app_control/source/test/test_fw.h deleted file mode 100644 index a26b8803..00000000 --- a/src/f4/app_control/source/test/test_fw.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_FW_H_ -#define _TEST_FW_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_fw(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_hmac.c b/src/f4/app_control/source/test/test_hmac.c deleted file mode 100644 index 4b02131e..00000000 --- a/src/f4/app_control/source/test/test_hmac.c +++ /dev/null @@ -1,323 +0,0 @@ -#include -#include -#include - -#include "test_hmac.h" -#include "chprintf.h" - -struct TestCase { - const uint8_t *key; - const size_t keylen; - const uint8_t *data; - const size_t datalen; - const uint8_t *hmac; - const size_t hmaclen; -}; - -void testHMACSHA256(BaseSequentialStream *chp, CRYDriver *cryp, const struct TestCase * tc) { - HMACSHA256Context ctx = {0}; - - chprintf(chp, "cryLoadHMACTransientKey() ... "); - if (cryLoadHMACTransientKey(cryp, tc->keylen, tc->key) != CRY_NOERROR) { - chprintf(chp, "failed\r\n"); - return; - } else { - chprintf(chp, "good\r\n"); - } - - chprintf(chp, "cryHMACSHA256Init() ... "); - if (cryHMACSHA256Init(cryp, &ctx) != CRY_NOERROR) { - chprintf(chp, "failed\r\n"); - return; - } else { - chprintf(chp, "good\r\n"); - } - - chprintf(chp, "cryHMACSHA256Update() ... "); - if (cryHMACSHA256Update(cryp, &ctx, tc->datalen, tc->data) != CRY_NOERROR) { - chprintf(chp, "failed\r\n"); - return; - } else { - chprintf(chp, "good\r\n"); - } - - chprintf(chp, "cryHMACSHA256Final() ... "); - uint8_t out[32] = {0}; - if (cryHMACSHA256Final(cryp, &ctx, out) != CRY_NOERROR) { - chprintf(chp, "HMACFinal failed\r\n"); - return; - } else { - chprintf(chp, "good\r\n"); - } - - chprintf(chp, "HMAC result comparison ... "); - if (memcmp(out, tc->hmac, sizeof(out) < tc->hmaclen ? sizeof(out) : tc->hmaclen) != 0) { - chprintf(chp, "failed\r\n"); - chprintf(chp, "- Expect:"); - for(size_t i = 0; i < tc->hmaclen; ++i) { - chprintf(chp, " %02x", tc->hmac[i]); - } - chprintf(chp, "\r\n- Result:"); - for(size_t i = 0; i < sizeof(out); ++i) { - chprintf(chp, " %02x", out[i]); - } - chprintf(chp, "\r\n"); - } else { - chprintf(chp, "good\r\n"); - } -} - - -void cmd_hmac(BaseSequentialStream *chp, int argc, char *argv[]) -{ - (void) argc; - (void) argv; - - /* Taken from RFC 4231: Test Vectors for HMAC-SHA-256 */ - // 4.2. Test Case 1 - static const uint8_t tc1_key[] = { // 20 bytes - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, }; - static const uint8_t tc1_data[] = { // "Hi There" - 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65 }; - static const uint8_t tc1_hmac[] = { - 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, - 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, - 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7 }; - static_assert(sizeof(tc1_key) == 20); - static_assert(sizeof(tc1_data) == sizeof("Hi There")-1); - osalDbgAssert(memcmp(tc1_data, "Hi There", - sizeof(tc1_data)) == 0, "TC1 data does not match expected string"); - static_assert(sizeof(tc1_hmac) == 32); - - const struct TestCase TC1 = { - .key = tc1_key, - .keylen = sizeof(tc1_key), - .data = tc1_data, - .datalen = sizeof(tc1_data), - .hmac = tc1_hmac, - .hmaclen = sizeof(tc1_hmac), - }; - - // 4.3. Test Case 2: Test with a key shorter than the length of the HMAC - // output. - static const uint8_t tc2_key[] = { 0x4a, 0x65, 0x66, 0x65 }; // "Jefe" - static const uint8_t tc2_data[] = { // "what do ya want for nothing?" - 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x79, 0x61, 0x20, 0x77, - 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68, - 0x69, 0x6e, 0x67, 0x3f }; - static const uint8_t tc2_hmac[] = { - 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, - 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, - 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 }; - static_assert(sizeof(tc2_key) == sizeof("Jefe")-1); - osalDbgAssert(memcmp(tc2_key, "Jefe", - sizeof(tc2_key)) == 0, "TC2 key does not match expected string"); - static_assert(sizeof(tc2_data) == sizeof("what do ya want for nothing?")-1); - osalDbgAssert(memcmp(tc2_data, "what do ya want for nothing?", - sizeof(tc2_data)) == 0, "TC2 data does not match expected string"); - static_assert(sizeof(tc2_hmac) == 32); - - const struct TestCase TC2 = { - .key = tc2_key, - .keylen = sizeof(tc2_key), - .data = tc2_data, - .datalen = sizeof(tc2_data), - .hmac = tc2_hmac, - .hmaclen = sizeof(tc2_hmac), - }; - - // 4.4. Test Case 3: Test with a combined length of key and data that is - // larger than 64 bytes (= block-size of SHA-224 and SHA-256). - static const uint8_t tc3_key[] = { // 20 bytes - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }; - static const uint8_t tc3_data[] = { // 50 bytes - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd }; - static const uint8_t tc3_hmac[] = { - 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, - 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, - 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe }; - static_assert(sizeof(tc3_key) == 20); - static_assert(sizeof(tc3_data) == 50); - static_assert(sizeof(tc3_hmac) == 32); - - const struct TestCase TC3 = { - .key = tc3_key, - .keylen = sizeof(tc3_key), - .data = tc3_data, - .datalen = sizeof(tc3_data), - .hmac = tc3_hmac, - .hmaclen = sizeof(tc3_hmac), - }; - - // 4.5. Test Case 4: Test with a combined length of key and data that is - // larger than 64 bytes (= block-size of SHA-224 and SHA-256). - static const uint8_t tc4_key[] = { // 25 bytes - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, - 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19 }; - static const uint8_t tc4_data[] = { // 50 bytes - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd }; - static const uint8_t tc4_hmac[] = { - 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, - 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, - 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b }; - static_assert(sizeof(tc4_key) == 25); - static_assert(sizeof(tc4_data) == 50); - static_assert(sizeof(tc4_hmac) == 32); - - const struct TestCase TC4 = { - .key = tc4_key, - .keylen = sizeof(tc4_key), - .data = tc4_data, - .datalen = sizeof(tc4_data), - .hmac = tc4_hmac, - .hmaclen = sizeof(tc4_hmac), - }; - - // 4.6. Test Case 5: Test with a truncation of output to 128 bits. - static const uint8_t tc5_key[] = { // 20 bytes - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c }; - static const uint8_t tc5_data[] = { // "Test With Truncation" - 0x54, 0x65, 0x73, 0x74, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x54, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e }; - static const uint8_t tc5_hmac[] = { - 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0, 0x6e, 0x0c, 0x79, 0x6c, - 0x29, 0x55, 0x55, 0x2b }; - static_assert(sizeof(tc5_key) == 20); - static_assert(sizeof(tc5_data) == sizeof("Test With Truncation") - 1); - osalDbgAssert(memcmp(tc5_data, "Test With Truncation", - sizeof(tc5_data)) == 0, "TC5 data does not match expected string"); - static_assert(sizeof(tc5_hmac)*CHAR_BIT == 128); - - const struct TestCase TC5 = { - .key = tc5_key, - .keylen = sizeof(tc5_key), - .data = tc5_data, - .datalen = sizeof(tc5_data), - .hmac = tc5_hmac, - .hmaclen = sizeof(tc5_hmac), - }; - - // 4.7. Test Case 6: Test with a key larger than 128 bytes (= block-size - // of SHA-384 and SHA-512) - static const uint8_t tc6_key[] = { // 131 bytes - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }; - static const uint8_t tc6_data[] = { // "Test Using Larger Than Block-Size - // Key - Hash Key First" - 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, - 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x4b, 0x65, - 0x79, 0x20, 0x2d, 0x20, 0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79, - 0x20, 0x46, 0x69, 0x72, 0x73, 0x74 }; - static const uint8_t tc6_hmac[] = { - 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, - 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, - 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54 }; - static_assert(sizeof(tc6_key) == 131); - static_assert(sizeof(tc6_data) == sizeof("Test Using Larger Than Block-" - "Size Key - Hash Key First") - 1); - osalDbgAssert(memcmp(tc6_data, "Test Using Larger Than Block-Size Key - " - "Hash Key First", - sizeof(tc6_data)) == 0, "TC6 Data does not match expected string"); - static_assert(sizeof(tc6_hmac) == 32); - - const struct TestCase TC6 = { - .key = tc6_key, - .keylen = sizeof(tc6_key), - .data = tc6_data, - .datalen = sizeof(tc6_data), - .hmac = tc6_hmac, - .hmaclen = sizeof(tc6_hmac), - }; - - // 4.8. Test Case 7: Test with a key and data that is larger than 128 - // bytes (= block-size of SHA-384 and SHA-512). - static const uint8_t tc7_key[] = { // 131 bytes - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }; - static const uint8_t tc7_data[] = { // "This is a test using a larger than - // block-size key and a larger than block-size data. The key needs to - // be hashed before being used by the HMAC algorithm." - 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, - 0x73, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c, - 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65, - 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, - 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x20, 0x54, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, - 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62, - 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c, - 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e}; - static const uint8_t tc7_hmac[] = { - 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, - 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, - 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2 }; - - static_assert(sizeof(tc7_key) == 131); - static_assert(sizeof(tc7_data) == sizeof("This is a test using a larger " - "than block-size key and a larger than block-size data. The key needs " - "to be hashed before being used by the HMAC algorithm.") - 1); - osalDbgAssert(memcmp(tc7_data, "This is a test using a larger than block-" - "size key and a larger than block-size data. The key needs to be " - "hashed before being used by the HMAC algorithm.", - sizeof(tc7_data)) == 0, "Test 7 data does not match expected string"); - static_assert(sizeof(tc7_hmac) == 32); - - const struct TestCase TC7 = { - .key = tc7_key, - .keylen = sizeof(tc7_key), - .data = tc7_data, - .datalen = sizeof(tc7_data), - .hmac = tc7_hmac, - .hmaclen = sizeof(tc7_hmac), - }; - - chprintf(chp, "TC1\r\n"); - testHMACSHA256(chp, &CRYD1, &TC1); - chprintf(chp, "TC2\r\n"); - testHMACSHA256(chp, &CRYD1, &TC2); - chprintf(chp, "TC3\r\n"); - testHMACSHA256(chp, &CRYD1, &TC3); - chprintf(chp, "TC4\r\n"); - testHMACSHA256(chp, &CRYD1, &TC4); - chprintf(chp, "TC5\r\n"); - testHMACSHA256(chp, &CRYD1, &TC5); - chprintf(chp, "TC6\r\n"); - testHMACSHA256(chp, &CRYD1, &TC6); - chprintf(chp, "TC7\r\n"); - testHMACSHA256(chp, &CRYD1, &TC7); - chprintf(chp, "HMAC test complete\r\n"); -} diff --git a/src/f4/app_control/source/test/test_hmac.h b/src/f4/app_control/source/test/test_hmac.h deleted file mode 100644 index 39574c6a..00000000 --- a/src/f4/app_control/source/test/test_hmac.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_HMAC_H_ -#define _TEST_HMAC_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_hmac(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_lfs.c b/src/f4/app_control/source/test/test_lfs.c deleted file mode 100644 index 0686dc1c..00000000 --- a/src/f4/app_control/source/test/test_lfs.c +++ /dev/null @@ -1,221 +0,0 @@ -#include -#include -#include "test_lfs.h" -#include "fs.h" - -#define BUF_SIZE 256 - -/*===========================================================================*/ -/* OreSat LFS Operations */ -/*===========================================================================*/ -void cmd_lfs(BaseSequentialStream *chp, int argc, char *argv[]) -{ - int ret; - lfs_file_t *file; - lfs_dir_t *dir; - struct lfs_info info; - char buf[BUF_SIZE]; - - if (!strcmp(argv[0], "ls") && argc > 1) { - dir = dir_open(&FSD1, argv[1]); - if (dir == NULL) { - chprintf(chp, "Error in dir_open: %d\r\n", FSD1.err); - return; - } - do { - ret = dir_read(&FSD1, dir, &info); - if (ret <= 0) { - if (ret < 0) { - chprintf(chp, "Error in dir_read: %d\r\n", ret); - } - continue; - } - if (info.type == LFS_TYPE_REG) { - chprintf(chp, "reg "); - } else if (info.type == LFS_TYPE_DIR) { - chprintf(chp, "dir "); - } else { - chprintf(chp, "? "); - } - chprintf(chp, "%8u %s\r\n", info.size, info.name); - } while (ret > 0); - ret = dir_close(&FSD1, dir); - if (ret < 0) { - chprintf(chp, "Error in dir_close: %d\r\n", ret); - return; - } - chprintf(chp, "\r\n"); - } else if (!strcmp(argv[0], "mkdir") && argc > 1) { - ret = fs_mkdir(&FSD1, argv[1]); - if (ret < 0) { - chprintf(chp, "Error in fs_mkdir: %d\r\n"); - return; - } - } else if (!strcmp(argv[0], "rm") && argc > 1) { - ret = fs_remove(&FSD1, argv[1]); - if (ret < 0) { - chprintf(chp, "Error in fs_remove: %d\r\n"); - return; - } - } else if (!strcmp(argv[0], "crc") && argc > 1) { - file = file_open(&FSD1, argv[1], LFS_O_RDONLY); - if (file == NULL) { - chprintf(chp, "Error in file_open: %d\r\n", FSD1.err); - return; - } - - chprintf(chp, "CRC32: 0x%08X\r\n", file_crc(&FSD1, file)); - - ret = file_close(&FSD1, file); - if (ret < 0) { - chprintf(chp, "Error in file_close: %d\r\n", ret); - return; - } - } else if (!strcmp(argv[0], "cat") && argc > 1) { - file = file_open(&FSD1, argv[1], LFS_O_RDONLY); - if (file == NULL) { - chprintf(chp, "Error in file_open: %d\r\n", FSD1.err); - return; - } - - ret = file_read(&FSD1, file, buf, BUF_SIZE - 1); - if (ret < 0) { - chprintf(chp, "Error in file_read: %d\r\n", ret); - file_close(&FSD1, file); - return; - } - buf[ret] = '\0'; - chprintf(chp, "%s\r\n", buf); - - ret = file_close(&FSD1, file); - if (ret < 0) { - chprintf(chp, "Error in file_close: %d\r\n", ret); - return; - } - } else if (!strcmp(argv[0], "hexdump") && argc > 1) { - file = file_open(&FSD1, argv[1], LFS_O_RDONLY); - if (file == NULL) { - chprintf(chp, "Error in file_open: %d\r\n", FSD1.err); - return; - } - - ret = file_read(&FSD1, file, buf, BUF_SIZE); - if (ret < 0) { - chprintf(chp, "Error in file_read: %d\r\n", ret); - file_close(&FSD1, file); - return; - } - for (int i = 0; i < ret; i++) { - if (i % 0x10 == 0) chprintf(chp, "\r\n%04X:", i); - chprintf(chp, " %02X", buf[i]); - } - chprintf(chp, "\r\n"); - - ret = file_close(&FSD1, file); - if (ret < 0) { - chprintf(chp, "Error in file_close: %d\r\n", ret); - return; - } - } else if (!strcmp(argv[0], "load") && argc > 1) { - uint8_t buf[BUF_SIZE] = {0}; - char line[BUF_SIZE * 2] = {0}; - char c, *p = line; - size_t count = 0; - file = file_open(&FSD1, argv[1], LFS_O_RDWR | LFS_O_CREAT | LFS_O_TRUNC); - if (file == NULL) { - chprintf(chp, "Error in file_open: %d\r\n", FSD1.err); - return; - } - - while (streamRead(chp, (uint8_t*)&c, 1) != 0 && c != 4) { - c = toupper(c); - - if (isdigit(c) || (c >= 'A' && c <= 'F')) { - streamPut(chp, c); - *(p++) = c; - if (p == &line[BUF_SIZE * 2]) { - for (size_t off = 0; off < BUF_SIZE; off++) { - sscanf(&line[off*2], "%2hhx", &buf[off]); - } - p = line; - ret = file_write(&FSD1, file, buf, BUF_SIZE); - if (ret < 0) { - chprintf(chp, "Error in file_write: %d\r\n", ret); - break; - } - count += ret; - } - } else if ((c == 8) || (c == 127)) { - if (p != line) { - streamPut(chp, 0x08); - streamPut(chp, 0x20); - streamPut(chp, 0x08); - p--; - } - } - } - if (p != line) { - size_t len = (p - line) / 2; - for (size_t off = 0; off < len; off++) { - sscanf(&line[off*2], "%2hhx", &buf[off]); - } - ret = file_write(&FSD1, file, buf, len); - if (ret < 0) { - chprintf(chp, "Error in file_write: %d\r\n", ret); - } else { - count += ret; - } - } - chprintf(chp, "\r\nWrote %u bytes to %s\r\n", count, argv[1]); - - ret = file_close(&FSD1, file); - if (ret < 0) { - chprintf(chp, "Error in file_close: %d\r\n", ret); - return; - } - } else if (!strcmp(argv[0], "mount")) { - chprintf(chp, "Attempting to mount LFS...\r\n"); - ret = fs_mount(&FSD1, false); - if (ret < 0) { - chprintf(chp, "Mount failed: %d\r\n", ret); - return; - } - chprintf(chp, "OK\r\n"); - } else if (!strcmp(argv[0], "unmount")) { - chprintf(chp, "Attempting to unmount LFS...\r\n"); - ret = fs_unmount(&FSD1); - if (ret < 0) { - chprintf(chp, "Unmount failed: %d\r\n", ret); - return; - } - chprintf(chp, "OK\r\n"); - } else if (!strcmp(argv[0], "format")) { - chprintf(chp, "Attempting to format LFS...\r\n"); - ret = fs_format(&FSD1); - if (ret < 0) { - chprintf(chp, "Format failed: %d\r\n", ret); - return; - } - chprintf(chp, "OK\r\n"); - } else { - goto lfs_usage; - } - - return; - -lfs_usage: - chprintf(chp, "Usage: lfs \r\n" - " ls: List directories\r\n" - " mkdir: Make a directory\r\n" - " rm: Delete file or directory\r\n" - " crc: Print CRC32 of file\r\n" - " cat: Dump 255 bytes of file as string\r\n" - " hexdump: Dump 255 bytes of file as hex\r\n" - "\r\n" - " mount: Mount LFS\r\n" - " unmount: Unmount LFS\r\n" - " format: Format eMMC for LFS\r\n" - "\r\n"); - return; -} - diff --git a/src/f4/app_control/source/test/test_lfs.h b/src/f4/app_control/source/test/test_lfs.h deleted file mode 100644 index 3867f5ce..00000000 --- a/src/f4/app_control/source/test/test_lfs.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_LFS_H_ -#define _TEST_LFS_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_lfs(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_mmc.c b/src/f4/app_control/source/test/test_mmc.c deleted file mode 100644 index d86467d2..00000000 --- a/src/f4/app_control/source/test/test_mmc.c +++ /dev/null @@ -1,198 +0,0 @@ -#include - -#include "ch.h" -#include "hal.h" -#include "test_mmc.h" -#include "chprintf.h" -#include "fs.h" - -#define SDC_BURST_SIZE 16 -#define SDC (FSD1.config->sdcp) - -int mmc_enable(FSDriver *fsp); -int mmc_disable(FSDriver *fsp); - -/* Buffer for block read/write operations, note that extra bytes are - allocated in order to support unaligned operations.*/ -static uint8_t buf[MMCSD_BLOCK_SIZE * SDC_BURST_SIZE + 4]; - -/* Additional buffer for sdcErase() test */ -static uint8_t buf2[MMCSD_BLOCK_SIZE * SDC_BURST_SIZE ]; - -/*===========================================================================*/ -/* eMMC Testing */ -/*===========================================================================*/ -void cmd_mmc(BaseSequentialStream *chp, int argc, char *argv[]) { - systime_t start, end; - uint32_t n, startblk; - - if (argc < 1) { - chprintf(chp, "Usage: mmc \r\n" - " enable: Enable eMMC subsystem\r\n" - " disable: Disable eMMC subsystem\r\n" - "\r\n" - " testread: Test read functionality\r\n" - " testwrite: Test write functionality\r\n" - " testall: Test all functionality\r\n"); - return; - } - - if (strcmp(argv[0], "enable") == 0) { - int err; - chprintf(chp, "Enabling eMMC... "); - - /* Attempt to enable eMMC subsystem */ - err = mmc_enable(&FSD1); - if (err) { - chprintf(chp, "failed with code %d\r\n", err); - return; - } - - /* Print details of the device */ - chprintf(chp, "OK\r\n\r\nDevice Info\r\n"); - chprintf(chp, "CSD : %08X %8X %08X %08X \r\n", - SDC->csd[3], SDC->csd[2], SDC->csd[1], SDC->csd[0]); - chprintf(chp, "CID : %08X %8X %08X %08X \r\n", - SDC->cid[3], SDC->cid[2], SDC->cid[1], SDC->cid[0]); - chprintf(chp, "Capacity : %DMB\r\n", SDC->capacity / 2048); - chprintf(chp, "\r\n"); - - return; - } else if (strcmp(argv[0], "disable") == 0) { - int err; - chprintf(chp, "Disabling eMMC... "); - - /* Disable eMMC subsystem */ - err = mmc_disable(&FSD1); - if (err) { - chprintf(chp, "failed with code %d\r\n", err); - return; - } - - chprintf(chp, "OK\r\n"); - return; - } - - /* The test is performed in the middle of the flash area.*/ - startblk = (SDC->capacity / MMCSD_BLOCK_SIZE) / 2; - if ((strcmp(argv[0], "testread") == 0) || - (strcmp(argv[0], "testall") == 0)) { - - /* Single block read performance, aligned.*/ - chprintf(chp, "Single block aligned read performance: "); - start = chVTGetSystemTime(); - end = chTimeAddX(start, TIME_MS2I(1000)); - n = 0; - do { - if (blkRead(SDC, startblk, buf, 1)) { - chprintf(chp, "failed\r\n"); - return; - } - n++; - } while (chVTIsSystemTimeWithin(start, end)); - chprintf(chp, "%D blocks/S, %D bytes/S\r\n", n, n * MMCSD_BLOCK_SIZE); - - /* Multiple sequential blocks read performance, aligned.*/ - chprintf(chp, "16 sequential blocks aligned read performance: "); - start = chVTGetSystemTime(); - end = chTimeAddX(start, TIME_MS2I(1000)); - n = 0; - do { - if (blkRead(SDC, startblk, buf, SDC_BURST_SIZE)) { - chprintf(chp, "failed\r\n"); - return; - } - n += SDC_BURST_SIZE; - } while (chVTIsSystemTimeWithin(start, end)); - chprintf(chp, "%D blocks/S, %D bytes/S\r\n", n, n * MMCSD_BLOCK_SIZE); - -#if STM32_SDC_SDIO_UNALIGNED_SUPPORT - /* Single block read performance, unaligned.*/ - chprintf(chp, "Single block unaligned read performance: "); - start = chVTGetSystemTime(); - end = chTimeAddX(start, TIME_MS2I(1000)); - n = 0; - do { - if (blkRead(SDC, startblk, buf + 1, 1)) { - chprintf(chp, "failed\r\n"); - return; - } - n++; - } while (chVTIsSystemTimeWithin(start, end)); - chprintf(chp, "%D blocks/S, %D bytes/S\r\n", n, n * MMCSD_BLOCK_SIZE); - - /* Multiple sequential blocks read performance, unaligned.*/ - chprintf(chp, "16 sequential blocks unaligned read performance: "); - start = chVTGetSystemTime(); - end = chTimeAddX(start, TIME_MS2I(1000)); - n = 0; - do { - if (blkRead(SDC, startblk, buf + 1, SDC_BURST_SIZE)) { - chprintf(chp, "failed\r\n"); - return; - } - n += SDC_BURST_SIZE; - } while (chVTIsSystemTimeWithin(start, end)); - chprintf(chp, "%D blocks/S, %D bytes/S\r\n", n, n * MMCSD_BLOCK_SIZE); -#endif /* STM32_SDC_SDIO_UNALIGNED_SUPPORT */ - } - - if ((strcmp(argv[0], "testwrite") == 0) || - (strcmp(argv[0], "testall") == 0)) { - uint8_t backup[MMCSD_BLOCK_SIZE * 2]; - - /* Backup data */ - blkRead(SDC, startblk, backup, 2); - - memset(buf, 0xAA, MMCSD_BLOCK_SIZE * 2); - chprintf(chp, "Writing..."); - if(blkWrite(SDC, startblk, buf, 2)) { - chprintf(chp, "failed\r\n"); - return; - } - chprintf(chp, "OK\r\n"); - - memset(buf2, 0x55, MMCSD_BLOCK_SIZE * 2); - chprintf(chp, "Reading..."); - if (blkRead(SDC, startblk, buf2, 1)) { - chprintf(chp, "failed\r\n"); - return; - } - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Comparing..."); - if(memcmp(buf, buf2, MMCSD_BLOCK_SIZE) != 0) { - chprintf(chp, "Compare failed\r\n"); - return; - } - chprintf(chp, "OK\r\n"); - - for (unsigned int i = 0; i < MMCSD_BLOCK_SIZE; i++) { - buf[i] = i + 8; - } - chprintf(chp, "Writing..."); - if(blkWrite(SDC, startblk, buf, 2)) { - chprintf(chp, "failed\r\n"); - return; - } - chprintf(chp, "OK\r\n"); - - memset(buf2, 0, MMCSD_BLOCK_SIZE * 2); - chprintf(chp, "Reading..."); - if (blkRead(SDC, startblk, buf2, 1)) { - chprintf(chp, "failed\r\n"); - return; - } - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Comparing..."); - if(memcmp(buf, buf2, MMCSD_BLOCK_SIZE) != 0) { - chprintf(chp, "Compare failed\r\n"); - return; - } - chprintf(chp, "OK\r\n"); - - /* Restore data */ - blkWrite(SDC, startblk, backup, 2); - } -} diff --git a/src/f4/app_control/source/test/test_mmc.h b/src/f4/app_control/source/test/test_mmc.h deleted file mode 100644 index a41e8625..00000000 --- a/src/f4/app_control/source/test/test_mmc.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_MMC_H_ -#define _TEST_MMC_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_mmc(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_opd.c b/src/f4/app_control/source/test/test_opd.c deleted file mode 100644 index 10f0cce8..00000000 --- a/src/f4/app_control/source/test/test_opd.c +++ /dev/null @@ -1,203 +0,0 @@ -#include -#include -#include "test_opd.h" -#include "opd.h" -#include "node_mgr.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* OreSat Node Control */ -/*===========================================================================*/ -void cmd_node(BaseSequentialStream *chp, int argc, char *argv[]) -{ - static uint8_t node_id = 0; - - if (argc < 1) { - goto node_usage; - } else if (argc > 1) { - node_id = strtoul(argv[1], NULL, 0); - chprintf(chp, "Setting persistent Node ID to 0x%02X\r\n", node_id); - } - - if (node_id == 0) { - chprintf(chp, "Please specify an node address at least once (it will persist)\r\n"); - goto node_usage; - } - if (!strcmp(argv[0], "enable")) { - chprintf(chp, "Enabling Node 0x%02X: ", node_id); - if (!node_enable(node_id, true)) { - chprintf(chp, "ENABLED\r\n"); - } else { - chprintf(chp, "NOT CONNECTED\r\n"); - } - } else if (!strcmp(argv[0], "disable")) { - chprintf(chp, "Disabling Node 0x%02X: ", node_id); - if (!node_enable(node_id, false)) { - chprintf(chp, "DISABLED\r\n"); - } else { - chprintf(chp, "NOT CONNECTED\r\n"); - } - } else if (!strcmp(argv[0], "status")) { - CO_NMT_internalState_t state; - chprintf(chp, "Status of node 0x%02X: ", node_id); - switch (node_status(node_id, &state)) { - case -1: - chprintf(chp, "NOT CONNECTED\r\n"); - break; - case 0: - chprintf(chp, "DISABLED\r\n"); - break; - case 1: - chprintf(chp, "ENABLED\r\n"); - chprintf(chp, "State: %d\r\n", state); - break; - default: - chprintf(chp, "Invalid return code!\r\n"); - break; - } - } else { - goto node_usage; - } - - return; - -node_usage: - chprintf(chp, "Usage: node \r\n" - " enable: Enable managing a node\r\n" - " disable: Disable managing a node\r\n" - " status: Get Node Status\r\n" - "\r\n"); - return; -} - -/*===========================================================================*/ -/* OreSat Power Domain Control */ -/*===========================================================================*/ -void cmd_opd(BaseSequentialStream *chp, int argc, char *argv[]) -{ - static i2caddr_t opd_addr = 0; - opd_status_t status = {0}; - - if (argc < 1) { - goto opd_usage; - } else if (argc > 1) { - opd_addr = strtoul(argv[1], NULL, 0); - chprintf(chp, "Setting persistent board address to 0x%02X\r\n", opd_addr); - } - - if (!strcmp(argv[0], "sysenable")) { - chprintf(chp, "Enabling OPD subsystem\r\n"); - opd_start(); - } else if (!strcmp(argv[0], "sysdisable")) { - chprintf(chp, "Disabling OPD subsystem\r\n"); - opd_stop(); - } else if (!strcmp(argv[0], "sysrestart")) { - chprintf(chp, "Restarting OPD subsystem\r\n"); - opd_stop(); - opd_start(); - } else if (!strcmp(argv[0], "rescan")) { - chprintf(chp, "Re-scanning OPD devices\r\n"); - opd_scan(false); - } else if (!strcmp(argv[0], "summary")) { - chprintf(chp, "Board summary:\r\n"); - for (i2caddr_t i = OPD_MIN_ADDR; i <= OPD_MAX_ADDR; i++) { - if (!opd_status(i, &status)) { - chprintf(chp, "0x%02X: CONNECTED - %s - %s\r\n", i, - (status.odr & OPD_PIN_MASK(OPD_EN) ? "ENABLED" : "DISABLED"), - (status.input & OPD_PIN_MASK(OPD_FAULT) ? "TRIPPED" : "NOT TRIPPED")); - } else { - chprintf(chp, "0x%02X: NOT CONNECTED\r\n", i); - } - } - } else { - if (opd_addr == 0) { - chprintf(chp, "Please specify an OPD address at least once (it will persist)\r\n"); - goto opd_usage; - } - if (!strcmp(argv[0], "enable")) { - chprintf(chp, "Enabling board 0x%02X: ", opd_addr); - if (!opd_enable(opd_addr, true)) { - chprintf(chp, "ENABLED\r\n"); - } else { - chprintf(chp, "NOT CONNECTED\r\n"); - } - } else if (!strcmp(argv[0], "disable")) { - chprintf(chp, "Disabling board 0x%02X: ", opd_addr); - if (!opd_enable(opd_addr, false)) { - chprintf(chp, "DISABLED\r\n"); - } else { - chprintf(chp, "NOT CONNECTED\r\n"); - } - } else if (!strcmp(argv[0], "reset")) { - chprintf(chp, "Resetting board 0x%02X: ", opd_addr); - if (!opd_reset(opd_addr)) { - chprintf(chp, "RESET\r\n"); - } else { - chprintf(chp, "NOT CONNECTED\r\n"); - } - } else if (!strcmp(argv[0], "reinit")) { - chprintf(chp, "Attempting to reinitialize 0x%02X: ", opd_addr); - if (opd_probe(opd_addr, true)) { - chprintf(chp, "CONNECTED\r\n"); - } else { - chprintf(chp, "NOT CONNECTED\r\n"); - } - } else if (!strcmp(argv[0], "probe")) { - chprintf(chp, "Probing board 0x%02X: ", opd_addr); - if (opd_probe(opd_addr, false)) { - chprintf(chp, "CONNECTED\r\n"); - } else { - chprintf(chp, "NOT CONNECTED\r\n"); - } - } else if (!strcmp(argv[0], "status")) { - chprintf(chp, "Status of board 0x%02X: ", opd_addr); - if (!opd_status(opd_addr, &status)) { - chprintf(chp, "CONNECTED\r\n"); - chprintf(chp, "State: %s-%s\r\n", - (status.odr & OPD_PIN_MASK(OPD_EN) ? "ENABLED" : "DISABLED"), - (status.input & OPD_PIN_MASK(OPD_FAULT) ? "TRIPPED" : "NOT TRIPPED")); - chprintf(chp, "Raw register values:\r\n"); - chprintf(chp, "Input: %02X\r\n", status.input); - chprintf(chp, "Output: %02X\r\n", status.odr); - chprintf(chp, "Polarity: %02X\r\n", status.pol); - chprintf(chp, "Mode: %02X\r\n", status.mode); - chprintf(chp, "Timeout: %02X\r\n", status.timeout); - } else { - chprintf(chp, "NOT CONNECTED\r\n"); - } - } else if (!strcmp(argv[0], "boot")) { - int retval = opd_boot(opd_addr); - chprintf(chp, "Boot returned 0x%02X\r\n", retval); - } else if (!strcmp(argv[0], "linux_normal")) { - chprintf(chp, "Linux boot normal\r\n"); - opd_linux_recover(opd_addr, false); - } else if (!strcmp(argv[0], "linux_recover")) { - chprintf(chp, "Linux boot recovery\r\n"); - opd_linux_recover(opd_addr, true); - } else { - goto opd_usage; - } - } - - return; - -opd_usage: - chprintf(chp, "Usage: opd \r\n" - " sysenable: Enable OPD subsystem (Power On)\r\n" - " sysdisable: Disable OPD subsystem (Power Off)\r\n" - " sysrestart: Cycle power on OPD subsystem\r\n" - " rescan: Rescans devices on OPD\r\n" - " enable: Enable an OPD attached card\r\n" - " disable: Disable an OPD attached card\r\n" - " reset: Reset the circuit breaker of a card\r\n" - " reinit: Reinitialize a device\r\n" - " probe: Probe an address to see if a card responds\r\n" - " status: Report the status of a card\r\n" - " summary: Report the status of all cards\r\n" - "\r\n" - " boot: Attempt to bootstrap a card via OPD\r\n" - " linux_normal: Set linux boot pin to normal\r\n" - " linux_recover: Set linux boot pin to recovery\r\n" - "\r\n"); - return; -} diff --git a/src/f4/app_control/source/test/test_opd.h b/src/f4/app_control/source/test/test_opd.h deleted file mode 100644 index da344798..00000000 --- a/src/f4/app_control/source/test/test_opd.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _TEST_OPD_H_ -#define _TEST_OPD_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_node(BaseSequentialStream *chp, int argc, char *argv[]); -void cmd_opd(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_persist.c b/src/f4/app_control/source/test/test_persist.c deleted file mode 100644 index 25d30ad7..00000000 --- a/src/f4/app_control/source/test/test_persist.c +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include "CANopen.h" -#include "OD.h" -#include "test_persist.h" -#include "persist.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* OreSat C3 Persistent Storage */ -/*===========================================================================*/ -void cmd_persist(BaseSequentialStream *chp, int argc, char *argv[]) -{ - void *group = NULL; - if (argc < 2) { - goto persist_usage; - } - if (!strcmp(argv[1], "keys")) { - group = &OD_PERSIST_KEYS; - } else if (!strcmp(argv[1], "state")) { - group = &OD_PERSIST_STATE; - } else if (!strcmp(argv[1], "comm")) { - group = &OD_PERSIST_COMM; - } else if (!strcmp(argv[1], "mfr")) { - group = &OD_PERSIST_MFR; - } else if (!strcmp(argv[1], "app")) { - group = &OD_PERSIST_APP; - } else { - goto persist_usage; - } - if (!strcmp(argv[0], "store")) { - persistStoreGroup(group); - } else if (!strcmp(argv[0], "restore")) { - persistRestoreGroup(group); - } else if (!strcmp(argv[0], "reset")) { - persistResetGroup(group); - } else { - goto persist_usage; - } - - return; - -persist_usage: - chprintf(chp, "Usage: persist \r\n" - " Commands:\r\n" - " store:\r\n" - " Store OD to FRAM\r\n" - " restore:\r\n" - " Restore OD from FRAM\r\n" - " reset:\r\n" - " Reset OD in FRAM\r\n" - " Groups:\r\n" - " keys\r\n" - " state\r\n" - " comm\r\n" - " mfr\r\n" - " app\r\n" - "\r\n"); - return; -} diff --git a/src/f4/app_control/source/test/test_persist.h b/src/f4/app_control/source/test/test_persist.h deleted file mode 100644 index 834e4251..00000000 --- a/src/f4/app_control/source/test/test_persist.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_PERSIST_H_ -#define _TEST_PERSIST_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_persist(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_radio.c b/src/f4/app_control/source/test/test_radio.c deleted file mode 100644 index 8cf2b3d6..00000000 --- a/src/f4/app_control/source/test/test_radio.c +++ /dev/null @@ -1,461 +0,0 @@ -#include -#include -#include "test_radio.h" -#include "radio.h" -#include "beacon.h" -#include "chprintf.h" - -#define PA_SAMPLES 8 - -typedef struct { - adcsample_t therm; - adcsample_t fwd; - adcsample_t rev; -} pa_samples_t; - -static pa_samples_t pa_samples[PA_SAMPLES * 2]; -static pa_samples_t pa_avg = {0}; - -static void adccallback(ADCDriver *adcp) { - uint32_t start, end; - pa_samples_t pa_sum = {0}; - if (adcIsBufferComplete(adcp)) { - start = PA_SAMPLES; - end = PA_SAMPLES * 2; - } else { - start = 0; - end = PA_SAMPLES; - } - for (uint32_t i = start; i < end; i++) { - pa_sum.therm += pa_samples[i].therm; - pa_sum.fwd += pa_samples[i].fwd; - pa_sum.rev += pa_samples[i].rev; - } - pa_avg.therm = pa_sum.therm / PA_SAMPLES; - pa_avg.fwd = pa_sum.fwd / PA_SAMPLES; - pa_avg.rev = pa_sum.rev / PA_SAMPLES; -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - (void)adcp; - (void)err; -} - -static const ADCConversionGroup pa_pwr_cfg = { - TRUE, - sizeof(pa_samples_t) / sizeof(adcsample_t), - adccallback, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - ADC_SMPR1_SMP_AN15(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN14(ADC_SAMPLE_480),/* SMPR1 */ - ADC_SMPR2_SMP_AN4(ADC_SAMPLE_480), /* SMPR2 */ - 0, /* HTR */ - 0, /* LTR */ - 0, /* SQR1 */ - 0, /* SQR2 */ - ADC_SQR3_SQ3_N(ADC_CHANNEL_IN15) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN14) | /* SQR3 */ - ADC_SQR3_SQ1_N(ADC_CHANNEL_IN4) -}; - -extern const radio_cfg_t *tx_eng; -extern const radio_cfg_t *tx_ax25; - -/*===========================================================================*/ -/* OreSat Radio Control */ -/*===========================================================================*/ -void cmd_radio(BaseSequentialStream *chp, int argc, char *argv[]) -{ - static AX5043Driver *devp = NULL; - static const AX5043Config *cfgp = NULL; - if (argc < 1) { - goto radio_usage; - } - - if (!strcmp(argv[0], "list")) { - for (uint32_t i = 0; radio_devices[i].devp != NULL; i++) { - chprintf(chp, "%u:\t%s\r\n", i, radio_devices[i].name); - } - chprintf(chp, "\r\n"); - return; - } else if (!strcmp(argv[0], "dev") && argc > 1) { - uint32_t i, index; - /* Find max index */ - for (i = 0; radio_devices[i].devp != NULL; i++); - index = strtoul(argv[1], NULL, 0); - if (index >= i) { - chprintf(chp, "ERROR: Invalid device\r\n"); - goto radio_usage; - } - devp = radio_devices[index].devp; - cfgp = radio_devices[index].cfgp; - return; - } - - if (devp == NULL) { - chprintf(chp, "Error: Set the device via 'dev' first.\r\n"); - goto radio_usage; - } - - if (!strcmp(argv[0], "start")) { - chprintf(chp, "Starting AX5043 driver..."); - ax5043Start(devp, cfgp); - if (devp->state < AX5043_READY) { - chprintf(chp, "Error: Failed to start driver. Error code %d.\r\n", devp->error); - } else { - chprintf(chp, "OK\r\n"); - } - } else if (!strcmp(argv[0], "stop")) { - chprintf(chp, "Stopping AX5043 driver..."); - ax5043Stop(devp); - chprintf(chp, "OK\r\n"); - } else if (!strcmp(argv[0], "idle")) { - ax5043Idle(devp); - } else if (!strcmp(argv[0], "rx")) { - ax5043RX(devp, false, false); - } else if (!strcmp(argv[0], "dump")) { - chprintf(chp, "\r\n"); - for (int i = 0; i < 0x1000; i++) { - if (i % 0x20 == 0) chprintf(chp, "\r\n%03X:", i); - chprintf(chp, " %02X", ax5043ReadU8(devp, i)); - } - chprintf(chp, "\r\n"); - } else if (!strcmp(argv[0], "setfreq") && argc > 1) { - uint32_t freq = strtoul(argv[1], NULL, 0); - uint8_t vcor = (argc > 2 ? strtoul(argv[2], NULL, 0) : 0); - bool chan_b = (argc > 3 && !strcmp(argv[3], "true") ? true : false); - - if (devp->state < AX5043_READY) { - chprintf(chp, "Error: Please start the AX5043 driver first\r\n"); - goto radio_usage; - } - - chprintf(chp, "Setting Channel %s frequency to %u...", (chan_b ? "B" : "A"), freq); - ax5043SetFreq(devp, freq, vcor, chan_b); - if (devp->error != AX5043_ERR_NOERROR) { - chprintf(chp, "Error: Failed to set frequency. Error code %d.\r\n", devp->error); - } else { - chprintf(chp, "OK\r\n"); - } - } else if (!strcmp(argv[0], "getfreq")) { - chprintf(chp, "Current frequency is %u\r\n", ax5043GetFreq(devp)); - } else if (!strcmp(argv[0], "profile")) { - if (argc > 1) { - uint32_t i, index; - /* Find max index */ - for (i = 0; radio_cfgs[i].profile != NULL; i++); - index = strtoul(argv[1], NULL, 0); - if (index >= i) { - chprintf(chp, "ERROR: Invalid profile\r\n"); - goto radio_usage; - } - ax5043SetProfile(devp, radio_cfgs[index].profile); - return; - } else { - const ax5043_profile_t *profile; - profile = ax5043GetProfile(devp); - for (uint32_t i = 0; radio_cfgs[i].profile != NULL; i++) { - if (radio_cfgs[i].profile == profile) { - chprintf(chp, "Current profile is %s\r\n", radio_cfgs[i].name); - } - } - chprintf(chp, "Available profiles:\r\n"); - for (uint32_t i = 0; radio_cfgs[i].profile != NULL; i++) { - chprintf(chp, "%u:\t%s\r\n", i, radio_cfgs[i].name); - } - chprintf(chp, "\r\n"); - return; - } - } else if (!strcmp(argv[0], "rssi")) { - chprintf(chp, "AGCCOUNTER: %u\r\nRSSI: %d\r\nBGNDRSSI: %d\r\n", ax5043ReadU8(devp, AX5043_REG_AGCCOUNTER), (int8_t)ax5043ReadU8(devp, AX5043_REG_RSSI), (int8_t)ax5043ReadU8(devp, AX5043_REG_BGNDRSSI)); - } else if (!strcmp(argv[0], "read") && argc > 2) { - uint16_t reg = strtoul(argv[1], NULL, 0); - - if (devp->state < AX5043_READY) { - chprintf(chp, "Error: Please start the AX5043 driver first\r\n"); - goto radio_usage; - } - - if (!strcmp(argv[2], "u8")) { - chprintf(chp, "0x%02X\r\n", ax5043ReadU8(devp, reg)); - } else if (!strcmp(argv[2], "u16")) { - chprintf(chp, "0x%04X\r\n", ax5043ReadU16(devp, reg)); - } else if (!strcmp(argv[2], "u24")) { - chprintf(chp, "0x%06X\r\n", ax5043ReadU24(devp, reg)); - } else if (!strcmp(argv[2], "u32")) { - chprintf(chp, "0x%08X\r\n", ax5043ReadU32(devp, reg)); - } else { - goto radio_usage; - } - } else if (!strcmp(argv[0], "write") && argc > 3) { - uint16_t reg = strtoul(argv[1], NULL, 0); - - if (!strcmp(argv[3], "u8")) { - uint8_t value = strtoul(argv[2], NULL, 0); - ax5043WriteU8(devp, reg, value); - } else if (!strcmp(argv[3], "u16")) { - uint16_t value = strtoul(argv[2], NULL, 0); - ax5043WriteU16(devp, reg, value); - } else if (!strcmp(argv[3], "u24")) { - uint32_t value = strtoul(argv[2], NULL, 0); - ax5043WriteU24(devp, reg, value); - } else if (!strcmp(argv[3], "u32")) { - uint32_t value = strtoul(argv[2], NULL, 0); - ax5043WriteU32(devp, reg, value); - } else { - goto radio_usage; - } - } else { - goto radio_usage; - } - - return; - -radio_usage: - chprintf(chp, "\r\n" - "Usage: radio \r\n" - " list: List available devices\r\n" - " dev : Set the device to as shown by 'list'\r\n" - "\r\n" - " start: Start AX5043 device\r\n" - " stop: Stop AX5043 device\r\n" - " setfreq [vcor] [chan_b]:\r\n" - " Sets frequency of channel A/B to \r\n" - " Optionally provide VCOR. [chan_b] specifies channel B\r\n" - " getfreq: Get the current frequency in use\r\n" - " profile [num]:\r\n" - " Print current profile and list available profiles,\r\n" - " or set the profile to [num] if provided\r\n" - "\r\n" - " rssi: Get the current RSSI value\r\n" - "\r\n" - " read :\r\n" - " Read where is u8|u16|u24|u32\r\n" - "\r\n" - " write :\r\n" - " Write with where is u8|u16|u24|u32\r\n" - " dump: Dump all register values\r\n" - "\r\n"); - return; -} - -/*===========================================================================*/ -/* OreSat Synthesizer Control */ -/*===========================================================================*/ -void cmd_synth(BaseSequentialStream *chp, int argc, char *argv[]) -{ - static SI41XXDriver *devp = NULL; - static SI41XXConfig *cfgp = NULL; - if (argc < 1) { - goto synth_usage; - } - - if (!strcmp(argv[0], "list")) { - for (uint32_t i = 0; synth_devices[i].devp != NULL; i++) { - chprintf(chp, "%u:\t%s\r\n", i, synth_devices[i].name); - } - chprintf(chp, "\r\n"); - return; - } else if (!strcmp(argv[0], "dev") && argc > 1) { - uint32_t i, index; - /* Find max index */ - for (i = 0; synth_devices[i].devp != NULL; i++); - index = strtoul(argv[1], NULL, 0); - if (index >= i) { - chprintf(chp, "ERROR: Invalid device\r\n"); - goto synth_usage; - } - devp = synth_devices[index].devp; - cfgp = synth_devices[index].cfgp; - return; - } - - if (devp == NULL) { - chprintf(chp, "Error: Set the device via 'dev' first.\r\n"); - goto synth_usage; - } - - if (!strcmp(argv[0], "start")) { - si41xxStart(devp, cfgp); - } else if (!strcmp(argv[0], "stop")) { - si41xxStop(devp); - } else if (!strcmp(argv[0], "reg") && argc > 2) { - uint32_t reg = strtoul(argv[1], NULL, 0); - uint32_t value = strtoul(argv[2], NULL, 0); - si41xxWriteRaw(devp, reg, value); - } else if (!strcmp(argv[0], "freq") && argc > 1) { - uint32_t freq = strtoul(argv[1], NULL, 0); - if (!si41xxSetIF(devp, freq)) { - chprintf(chp, "Failed to set frequency\r\n"); - goto synth_usage; - } - chprintf(chp, "N=%u R=%u\r\n", cfgp->if_n, cfgp->if_r); - } else if (!strcmp(argv[0], "ifdiv") && argc > 1) { - uint32_t div = strtoul(argv[1], NULL, 0); - if (!si41xxSetIFDiv(devp, div)) { - chprintf(chp, "Failed to set IF divider value\r\n"); - goto synth_usage; - } - chprintf(chp, "IFDIV=%u\r\n", cfgp->if_div); - } else if (!strcmp(argv[0], "status")) { - chprintf(chp, "PLL: %s\r\n", (palReadLine(LINE_LO_PLL) ? "NOT LOCKED" : "LOCKED")); - } else { - goto synth_usage; - } - - return; -synth_usage: - chprintf(chp, "\r\n" - "Usage: synth \r\n" - " list: List available devices\r\n" - " dev : Set the device to as shown by 'list'\r\n" - "\r\n" - " start: Start the device\r\n" - " stop: Stop the device\r\n" - " reg :\r\n" - " Write with \r\n" - "\r\n" - " freq : Sets frequency of IF output to \r\n" - " ifdiv

: Sets IF output divider to
(1,2,4,8)\r\n" - " status: Print PLL lock status\r\n" - "\r\n"); - return; -} - -/*===========================================================================*/ -/* OreSat RF Path Control */ -/*===========================================================================*/ -void cmd_rf(BaseSequentialStream *chp, int argc, char *argv[]) -{ - if (argc < 1) { - goto rf_usage; - } - - if (!strcmp(argv[0], "pa") && argc > 1) { - if (!strcmp(argv[1], "enable")) { - palSetLine(LINE_PA_ENABLE); - } else if (!strcmp(argv[1], "disable")) { - palClearLine(LINE_PA_ENABLE); - } - } else if (!strcmp(argv[0], "lna") && argc > 1) { - if (!strcmp(argv[1], "enable")) { - palClearLine(LINE_LNA_ENABLE); - } else if (!strcmp(argv[1], "disable")) { - palSetLine(LINE_LNA_ENABLE); - } - } else if (!strcmp(argv[0], "totclear")) { - palSetLine(LINE_TOT_RESET); - chThdSleepMicroseconds(10); - palClearLine(LINE_TOT_RESET); - } else if (!strcmp(argv[0], "start")) { - adcStartConversion(&ADCD1, &pa_pwr_cfg, (adcsample_t*)pa_samples, PA_SAMPLES * 2); - } else if (!strcmp(argv[0], "stop")) { - adcStopConversion(&ADCD1); - } else if (!strcmp(argv[0], "status")) { - chprintf(chp, "PA State: %s\r\nLNA State: %s\r\nTOT State: %s\r\n" - "PA THERM AVG: %u\r\nPA FWD AVG: %u\r\nPA REV AVG: %u\r\n\r\n", - (palReadLine(LINE_PA_ENABLE) ? "ENABLED" : "DISABLED"), - (palReadLine(LINE_LNA_ENABLE) ? "DISABLED" : "ENABLED"), - (palReadLine(LINE_TOT_STATE) ? "NOT TRIPPED" : "TRIPPED"), - pa_avg.therm, pa_avg.fwd, pa_avg.rev); - } else { - goto rf_usage; - } - - return; -rf_usage: - chprintf(chp, "\r\n" - "Usage: rf \r\n" - " pa :\r\n" - " Enable or Disable the PA\r\n" - " lna :\r\n" - " Enable or Disable the LNA\r\n" - " totclear\r\n" - " Clear the Time Out Timer\r\n" - " start\r\n" - " Start a continuous measure of PA PWR and THERM\r\n" - " stop\r\n" - " Stop measure of PA PWR and THERM\r\n" - " status\r\n" - " RF path status\r\n" - "\r\n"); - return; -} - -/*===========================================================================*/ -/* OreSat RF System Test */ -/*===========================================================================*/ -static const ax5043_chunk_repeatdata_t cw = { - .header = AX5043_CHUNKCMD_REPEATDATA | _VAL2FLD(AX5043_FIFOCHUNK_SIZE, 3), - .flags = AX5043_CHUNK_REPEATDATA_UNENC | AX5043_CHUNK_REPEATDATA_NOCRC, - .repeatcnt = 0xFF, - .data = 0xFF, -}; - -size_t tx_cb(void *arg) -{ - (void)arg; - return sizeof(cw); -} - -void cmd_rftest(BaseSequentialStream *chp, int argc, char *argv[]) -{ - if (argc < 1) { - goto rftest_usage; - } - - palSetLine(LINE_LNA_ENABLE); - palSetLine(LINE_PA_ENABLE); - ax5043WriteU16(tx_eng->devp, AX5043_REG_TXPWRCOEFFB, 0); - ax5043WriteU8(tx_eng->devp, AX5043_REG_PWRAMP, 1); - - if (!strcmp(argv[0], "cw") && argc > 2) { - uint16_t txpwr = strtoul(argv[1], NULL, 0); - uint32_t cnt = strtoul(argv[2], NULL, 0); - if (cnt == 0) cnt = 1; - ax5043WriteU16(tx_eng->devp, AX5043_REG_TXPWRCOEFFB, txpwr); - adcStartConversion(&ADCD1, &pa_pwr_cfg, (adcsample_t*)pa_samples, PA_SAMPLES * 2); - ax5043TXRaw(tx_eng->devp, NULL, &cw, sizeof(cw), sizeof(cw) * cnt, tx_cb, NULL, false); - adcStopConversion(&ADCD1); - } else { - ax5043WriteU8(tx_eng->devp, AX5043_REG_PWRAMP, 0); - palClearLine(LINE_PA_ENABLE); - palClearLine(LINE_LNA_ENABLE); - goto rftest_usage; - } - - ax5043WriteU8(tx_eng->devp, AX5043_REG_PWRAMP, 0); - palClearLine(LINE_PA_ENABLE); - palClearLine(LINE_LNA_ENABLE); - return; -rftest_usage: - chprintf(chp, "\r\n" - "Usage: rftest \r\n" - " cw :\r\n" - " Transmit CW with for iterations of a CW REPEATDATA buffer\r\n" - "\r\n"); - return; -} - -void cmd_beacon(BaseSequentialStream *chp, int argc, char *argv[]) -{ - int count = 1; - if (argc > 0) { - count = strtoul(argv[0], NULL, 0); - if (count < 1 || count > 10) - goto beacon_usage; - } - - for (int i = 0; i < count; i++) { - beacon_send(tx_ax25); - if (count > 1) - chThdSleepMilliseconds(1000); - } - - return; -beacon_usage: - chprintf(chp, "\r\n" - "Usage: beacon [count]\r\n" - "\r\n"); - return; -} diff --git a/src/f4/app_control/source/test/test_radio.h b/src/f4/app_control/source/test/test_radio.h deleted file mode 100644 index ef5cfb92..00000000 --- a/src/f4/app_control/source/test/test_radio.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _TEST_RADIO_H_ -#define _TEST_RADIO_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_radio(BaseSequentialStream *chp, int argc, char *argv[]); -void cmd_synth(BaseSequentialStream *chp, int argc, char *argv[]); -void cmd_rf(BaseSequentialStream *chp, int argc, char *argv[]); -void cmd_rftest(BaseSequentialStream *chp, int argc, char *argv[]); -void cmd_beacon(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/test/test_time.c b/src/f4/app_control/source/test/test_time.c deleted file mode 100644 index 08bb44d8..00000000 --- a/src/f4/app_control/source/test/test_time.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include "test_time.h" -#include "rtc.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* Time */ -/*===========================================================================*/ -void cmd_time(BaseSequentialStream *chp, int argc, char *argv[]) -{ - RTCDateTime timespec; - uint32_t msec; - time_scet_t scet; - time_utc_t utc; - if (argc < 1) { - goto time_usage; - } - if (!strcmp(argv[0], "unix")) { - if (!strcmp(argv[1], "get")) { - time_t unix_time = rtcGetTimeUnix(&msec); - char *timestr = ctime(&unix_time); - chprintf(chp, "UNIX Time: %d\r\n" - "Date: %s\r\n", - unix_time, timestr); - } else if (!strcmp(argv[1], "set") && argc > 2) { - rtcSetTimeUnix(strtoul(argv[2], NULL, 0), 0); - } else { - goto time_usage; - } - } else if (!strcmp(argv[0], "scet")) { - if (!strcmp(argv[1], "get")) { - rtcGetTimeSCET(&scet); - chprintf(chp, "SCET Time: %u.%u\r\n", scet.coarse, scet.fine); - } else if (!strcmp(argv[1], "set") && argc > 3) { - scet.coarse = strtoul(argv[2], NULL, 0); - scet.fine = strtoul(argv[3], NULL, 0); - rtcSetTimeSCET(&scet); - } else { - goto time_usage; - } - } else if (!strcmp(argv[0], "utc")) { - if (!strcmp(argv[1], "get")) { - rtcGetTimeUTC(&utc); - chprintf(chp, "UTC Time: Day: %u ms: %u us: %u\r\n", utc.day, utc.ms, utc.us); - } else if (!strcmp(argv[1], "set") && argc > 4) { - utc.day = strtoul(argv[2], NULL, 0); - utc.ms = strtoul(argv[3], NULL, 0); - utc.us = strtoul(argv[4], NULL, 0); - rtcSetTimeUTC(&utc); - } else { - goto time_usage; - } - } else if (!strcmp(argv[0], "raw")) { - rtcGetTime(&RTCD1, ×pec); - chprintf(chp, "Year: %u Month: %u DST: %u DoW: %u Day: %u ms: %u\r\n", - timespec.year, timespec.month, timespec.dstflag, timespec.dayofweek, timespec.day, timespec.millisecond); - } else { - goto time_usage; - } - - return; - -time_usage: - chprintf(chp, "Usage: time unix|scet|utc|raw get|set \r\n"); - return; -} - diff --git a/src/f4/app_control/source/test/test_time.h b/src/f4/app_control/source/test/test_time.h deleted file mode 100644 index 277e16ce..00000000 --- a/src/f4/app_control/source/test/test_time.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _TEST_TIME_H_ -#define _TEST_TIME_H_ - -#include "ch.h" -#include "hal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void cmd_time(BaseSequentialStream *chp, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif /*__cplusplus*/ -#endif diff --git a/src/f4/app_control/source/wdt.c b/src/f4/app_control/source/wdt.c deleted file mode 100644 index 2aa2c6b7..00000000 --- a/src/f4/app_control/source/wdt.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "wdt.h" - -/* Watchdog Timer Thread */ -THD_WORKING_AREA(wdt_wa, 0x40); -THD_FUNCTION(wdt, arg) -{ - (void)arg; - - while (!chThdShouldTerminateX()) { - palToggleLine(LINE_WDT); - if (!palReadLine(LINE_TOT_STATE)) { - palSetLine(LINE_TOT_RESET); - chThdSleepMilliseconds(10); - palClearLine(LINE_TOT_RESET); - } - chThdSleepMilliseconds(250); - } - - palClearLine(LINE_WDT); - chThdExit(MSG_OK); -} diff --git a/src/f4/app_control/source/wdt.h b/src/f4/app_control/source/wdt.h deleted file mode 100644 index 20c7c211..00000000 --- a/src/f4/app_control/source/wdt.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _WDT_H_ -#define _WDT_H_ - -#include "ch.h" -#include "hal.h" - -/* Watchdog Timer Thread Prototypes */ -extern THD_WORKING_AREA(wdt_wa, 0x40); -extern THD_FUNCTION(wdt, arg); - -#endif diff --git a/src/f4/app_control/stm32f42x_43x_efl.patch b/src/f4/app_control/stm32f42x_43x_efl.patch deleted file mode 100644 index 6e3243df..00000000 --- a/src/f4/app_control/stm32f42x_43x_efl.patch +++ /dev/null @@ -1,263 +0,0 @@ -diff --git os/hal/ports/STM32/STM32F4xx/hal_efl_lld.c os/hal/ports/STM32/STM32F4xx/hal_efl_lld.c -index bfaf5dff0..b8a6bdf9d 100644 ---- os/hal/ports/STM32/STM32F4xx/hal_efl_lld.c -+++ os/hal/ports/STM32/STM32F4xx/hal_efl_lld.c -@@ -48,6 +48,10 @@ - #define FLASH_SR_OPERR FLASH_SR_SOP - #endif - -+#if !defined(STM32_FLASH_DUAL_BANK_PERMANENT) -+#define STM32_FLASH_DUAL_BANK_PERMANENT FALSE -+#endif -+ - /*===========================================================================*/ - /* Driver exported variables. */ - /*===========================================================================*/ -@@ -137,6 +141,134 @@ static const efl_lld_size_t efl_lld_flash_sizes[] = { - .desc = efl_lld_size2 - } - }; -+#elif defined(STM32F429_439xx) || defined(STM32F427_437xx) || \ -+ defined(__DOXYGEN__) -+ -+/* Sector table for 1M device in SBM. */ -+static const flash_sector_descriptor_t efl_lld_sect_1m_sbm[STM32_FLASH_SECTORS_TOTAL_1M_SBM] = { -+ { 0, 16384}, /* Sector 0. */ -+ { 1 * 16384, 16384}, /* Sector 1. */ -+ { 2 * 16384, 16384}, /* Sector 2. */ -+ { 3 * 16384, 16384}, /* Sector 3. */ -+ { 4 * 16384, 65536}, /* Sector 4. */ -+ { 4 * 16384 + 1 * 65536, 131072}, /* Sector 5. */ -+ { 4 * 16384 + 1 * 65536 + 1 * 131072, 131072}, /* Sector 6. */ -+ { 4 * 16384 + 1 * 65536 + 2 * 131072, 131072}, /* Sector 7. */ -+ { 4 * 16384 + 1 * 65536 + 3 * 131072, 131072}, /* Sector 8. */ -+ { 4 * 16384 + 1 * 65536 + 4 * 131072, 131072}, /* Sector 9. */ -+ { 4 * 16384 + 1 * 65536 + 5 * 131072, 131072}, /* Sector 10. */ -+ { 4 * 16384 + 1 * 65536 + 6 * 131072, 131072} /* Sector 11. */ -+}; -+ -+/* Sector table for 1M device in DBM. */ -+static const flash_sector_descriptor_t efl_lld_sect_1m_dbm[STM32_FLASH_SECTORS_TOTAL_1M_DBM] = { -+ { 0, 16384}, /* Sector 0. */ -+ { 1 * 16384, 16384}, /* Sector 1. */ -+ { 2 * 16384, 16384}, /* Sector 2. */ -+ { 3 * 16384, 16384}, /* Sector 3. */ -+ { 4 * 16384, 65536}, /* Sector 4. */ -+ { 4 * 16384 + 1 * 65536, 131072}, /* Sector 5. */ -+ { 4 * 16384 + 1 * 65536 + 1 * 131072, 131072}, /* Sector 6. */ -+ { 4 * 16384 + 1 * 65536 + 2 * 131072, 131072}, /* Sector 7. */ -+ { 4 * 16384 + 1 * 65536 + 3 * 131072, 0}, /* Invalid. */ -+ { 4 * 16384 + 1 * 65536 + 3 * 131072, 0}, /* Invalid. */ -+ { 4 * 16384 + 1 * 65536 + 3 * 131072, 0}, /* Invalid. */ -+ { 4 * 16384 + 1 * 65536 + 3 * 131072, 0}, /* Invalid. */ -+ { 4 * 16384 + 1 * 65536 + 3 * 131072, 16384}, /* Sector 12. */ -+ { 5 * 16384 + 1 * 65536 + 3 * 131072, 16384}, /* Sector 13. */ -+ { 6 * 16384 + 1 * 65536 + 3 * 131072, 16384}, /* Sector 14. */ -+ { 7 * 16384 + 1 * 65536 + 3 * 131072, 16384}, /* Sector 15. */ -+ { 8 * 16384 + 1 * 65536 + 3 * 131072, 65536}, /* Sector 16. */ -+ { 8 * 16384 + 2 * 65536 + 3 * 131072, 131072}, /* Sector 17. */ -+ { 8 * 16384 + 2 * 65536 + 4 * 131072, 131072}, /* Sector 18. */ -+ { 8 * 16384 + 2 * 65536 + 5 * 131072, 131072} /* Sector 19. */ -+}; -+ -+/* Sector table for 2M device banks. */ -+static const flash_sector_descriptor_t efl_lld_sect_2m[STM32_FLASH_SECTORS_TOTAL_2M] = { -+ { 0, 16384}, /* Sector 0. */ -+ { 1 * 16384, 16384}, /* Sector 1. */ -+ { 2 * 16384, 16384}, /* Sector 2. */ -+ { 3 * 16384, 16384}, /* Sector 3. */ -+ { 4 * 16384, 65536}, /* Sector 4. */ -+ { 4 * 16384 + 1 * 65536, 131072}, /* Sector 5. */ -+ { 4 * 16384 + 1 * 65536 + 1 * 131072, 131072}, /* Sector 6. */ -+ { 4 * 16384 + 1 * 65536 + 2 * 131072, 131072}, /* Sector 7. */ -+ { 4 * 16384 + 1 * 65536 + 3 * 131072, 131072}, /* Sector 8. */ -+ { 4 * 16384 + 1 * 65536 + 4 * 131072, 131072}, /* Sector 9. */ -+ { 4 * 16384 + 1 * 65536 + 5 * 131072, 131072}, /* Sector 10. */ -+ { 4 * 16384 + 1 * 65536 + 6 * 131072, 131072}, /* Sector 11. */ -+ { 4 * 16384 + 1 * 65536 + 7 * 131072, 16384}, /* Sector 12. */ -+ { 5 * 16384 + 1 * 65536 + 7 * 131072, 16384}, /* Sector 13. */ -+ { 6 * 16384 + 1 * 65536 + 7 * 131072, 16384}, /* Sector 14. */ -+ { 7 * 16384 + 1 * 65536 + 7 * 131072, 16384}, /* Sector 15. */ -+ { 8 * 16384 + 1 * 65536 + 7 * 131072, 65536}, /* Sector 16. */ -+ { 8 * 16384 + 2 * 65536 + 7 * 131072, 131072}, /* Sector 17. */ -+ { 8 * 16384 + 2 * 65536 + 8 * 131072, 131072}, /* Sector 18. */ -+ { 8 * 16384 + 2 * 65536 + 9 * 131072, 131072}, /* Sector 19. */ -+ { 8 * 16384 + 2 * 65536 + 10 * 131072, 131072}, /* Sector 20. */ -+ { 8 * 16384 + 2 * 65536 + 11 * 131072, 131072}, /* Sector 21. */ -+ { 8 * 16384 + 2 * 65536 + 12 * 131072, 131072}, /* Sector 22. */ -+ { 8 * 16384 + 2 * 65536 + 13 * 131072, 131072} /* Sector 23. */ -+}; -+ -+/* The descriptors for 1M device. */ -+static const flash_descriptor_t efl_lld_size_1m[STM32_FLASH_NUMBER_OF_BANKS] = { -+ { /* Bank 1 (SBM) organisation. */ -+ .attributes = FLASH_ATTR_ERASED_IS_ONE | -+ FLASH_ATTR_MEMORY_MAPPED, -+ .page_size = STM32_FLASH_LINE_SIZE, -+ .sectors_count = STM32_FLASH_SECTORS_TOTAL_1M_SBM, -+ .sectors = efl_lld_sect_1m_sbm, -+ .sectors_size = 0, -+ .address = (uint8_t *)FLASH_BASE, -+ .size = STM32_FLASH_SIZE_1M * STM32_FLASH_SIZE_SCALE -+ }, -+ { /* Bank 1 & 2 (DBM) organisation. */ -+ .attributes = FLASH_ATTR_ERASED_IS_ONE | -+ FLASH_ATTR_MEMORY_MAPPED, -+ .page_size = STM32_FLASH_LINE_SIZE, -+ .sectors_count = STM32_FLASH_SECTORS_TOTAL_1M_DBM, -+ .sectors = efl_lld_sect_1m_dbm, -+ .sectors_size = 0, -+ .address = (uint8_t *)FLASH_BASE, -+ .size = STM32_FLASH_SIZE_1M * STM32_FLASH_SIZE_SCALE -+ } -+}; -+ -+/* The descriptors for 2M device. */ -+static const flash_descriptor_t efl_lld_size_2m[STM32_FLASH_NUMBER_OF_BANKS] = { -+ { /* Dual bank organisation. */ -+ .attributes = FLASH_ATTR_ERASED_IS_ONE | -+ FLASH_ATTR_MEMORY_MAPPED, -+ .page_size = STM32_FLASH_LINE_SIZE, -+ .sectors_count = STM32_FLASH_SECTORS_TOTAL_2M, -+ .sectors = efl_lld_sect_2m, -+ .sectors_size = 0, -+ .address = (uint8_t *)FLASH_BASE, -+ .size = STM32_FLASH_SIZE_2M * STM32_FLASH_SIZE_SCALE -+ }, -+ { /* Dual bank organisation. */ -+ .attributes = FLASH_ATTR_ERASED_IS_ONE | -+ FLASH_ATTR_MEMORY_MAPPED, -+ .page_size = STM32_FLASH_LINE_SIZE, -+ .sectors_count = STM32_FLASH_SECTORS_TOTAL_2M, -+ .sectors = efl_lld_sect_2m, -+ .sectors_size = 0, -+ .address = (uint8_t *)FLASH_BASE, -+ .size = STM32_FLASH_SIZE_2M * STM32_FLASH_SIZE_SCALE -+ } -+}; -+ -+/* Table describing possible flash sizes and descriptors for this device. */ -+static const efl_lld_size_t efl_lld_flash_sizes[] = { -+ { -+ .desc = efl_lld_size_1m -+ }, -+ { -+ .desc = efl_lld_size_2m -+ } -+}; - #else - #error "This EFL driver does not support the selected device" - #endif -@@ -190,7 +322,7 @@ static inline size_t stm32_flash_get_size(void) { - static inline bool stm32_flash_dual_bank(EFlashDriver *eflp) { - - #if STM32_FLASH_NUMBER_OF_BANKS > 1 -- return ((eflp->flash->OPTCR & FLASH_OPTCR_DB1M) != 0U); -+ return ((eflp->flash->OPTCR & FLASH_OPTCR_DB1M) != 0U || STM32_FLASH_DUAL_BANK_PERMANENT); - #endif - (void)eflp; - return false; -@@ -460,9 +592,10 @@ flash_error_t efl_lld_program(void *instance, flash_offset_t offset, - - /** - * @brief Starts a whole-device erase operation. -- * @note This function only erases bank 2 if it is present. Bank 1 is not -- * allowed since it is normally where the primary program is located. -- * Sectors on bank 1 can be individually erased. -+ * @note This function only erases the unused bank if in dual bank mode. The -+ * currently in use bank is not allowed since it is normally where the -+ * currently running program is executing from. -+ * Sectors on the in-use bank can be individually erased. - * - * @param[in] ip pointer to a @p EFlashDriver instance - * @return An error code. -@@ -484,7 +617,7 @@ flash_error_t efl_lld_start_erase_all(void *instance) { - return FLASH_BUSY_ERASING; - } - --#if defined(FLASH_CR_MER1) -+#if defined(FLASH_CR_MER2) - /* If dual bank is active then mass erase bank2. */ - if (stm32_flash_dual_bank(devp)) { - -@@ -494,7 +627,15 @@ flash_error_t efl_lld_start_erase_all(void *instance) { - /* Clearing error status bits.*/ - stm32_flash_clear_status(devp); - -- devp->flash->CR |= FLASH_CR_MER1; -+ /* Erase the currently unused bank, based on Flash Bank Mode */ -+ if ((SYSCFG->MEMRMP & SYSCFG_MEMRMP_UFB_MODE) != 0U) { -+ /* Bank 2 in use, erase Bank 1 */ -+ devp->flash->CR |= FLASH_CR_MER; -+ } -+ else { -+ /* Bank 1 in use, erase Bank 2 */ -+ devp->flash->CR |= FLASH_CR_MER2; -+ } - devp->flash->CR |= FLASH_CR_STRT; - return FLASH_NO_ERROR; - } -@@ -545,6 +686,17 @@ flash_error_t efl_lld_start_erase_sector(void *instance, - devp->flash->CR &= ~FLASH_CR_SNB; - devp->flash->CR &= ~FLASH_CR_PSIZE; - -+#if defined(FLASH_CR_MER2) -+ /* Adjust sector value for dual-bank devices -+ * For STM32F42x_43x devices (dual-bank), FLASH_CR_SNB values jump to 0b10000 -+ * for sectors 12 and up. -+ */ -+ if (sector >= 12) { -+ sector -= 12; -+ sector |= 0x10U; -+ } -+#endif -+ - /* Set sector and parallelism. */ - devp->flash->CR |= (sector << FLASH_CR_SNB_Pos) | - (STM32_FLASH_PSIZE << FLASH_CR_PSIZE_Pos); -@@ -582,8 +734,8 @@ flash_error_t efl_lld_query_erase(void *instance, uint32_t *msec) { - - /* Disabling the various erase control bits.*/ - devp->flash->CR &= ~(FLASH_CR_MER | --#if defined(FLASH_CR_MER1) -- FLASH_CR_MER1 | -+#if defined(FLASH_CR_MER2) -+ FLASH_CR_MER2 | - #endif - FLASH_CR_SER); - -diff --git os/hal/ports/STM32/STM32F4xx/hal_efl_lld.h os/hal/ports/STM32/STM32F4xx/hal_efl_lld.h -index 21614b461..40ee5e346 100644 ---- os/hal/ports/STM32/STM32F4xx/hal_efl_lld.h -+++ os/hal/ports/STM32/STM32F4xx/hal_efl_lld.h -@@ -67,6 +67,30 @@ - #define STM32_FLASH2_SIZE 1024U - #define STM32_FLASH1_SECTORS_TOTAL 16 - #define STM32_FLASH2_SECTORS_TOTAL 12 -+ -+#elif defined(STM32F429_439xx) || defined(STM32F427_437xx) || \ -+ defined(__DOXYGEN__) -+ -+/* Flash size register. */ -+#define STM32_FLASH_SIZE_REGISTER 0x1FFF7A22 -+#define STM32_FLASH_SIZE_SCALE 1024U -+ -+/* -+ * Device flash size is: -+ * 1M for STM32F4x7/4x9 suffix G devices -+ * 2M for STM32F4x7/4x9 suffix I devices. -+ * -+ * For 1M devices SBM is organised as 16K x 4 + 64K + 128K x 7 sectors. -+ * For 1M devices DBM is organised as 16K x 4 + 64K + 128K x 3 sectors per bank. -+ * -+ * For 2M devices are organised as 16K x 4 + 64K + 128K x 7 sectors per bank. -+ */ -+#define STM32_FLASH_NUMBER_OF_BANKS 2 -+#define STM32_FLASH_SIZE_1M 1024U -+#define STM32_FLASH_SIZE_2M 2048U -+#define STM32_FLASH_SECTORS_TOTAL_1M_SBM 12 -+#define STM32_FLASH_SECTORS_TOTAL_1M_DBM 20 -+#define STM32_FLASH_SECTORS_TOTAL_2M 24 - #else - #error "This EFL driver does not support the selected device" - #endif diff --git a/src/f4/app_control/stm32f439_hmacsha256.patch b/src/f4/app_control/stm32f439_hmacsha256.patch deleted file mode 100644 index 467afc39..00000000 --- a/src/f4/app_control/stm32f439_hmacsha256.patch +++ /dev/null @@ -1,332 +0,0 @@ -diff --git a/os/hal/ports/STM32/LLD/CRYPv1/hal_crypto_lld.c b/os/hal/ports/STM32/LLD/CRYPv1/hal_crypto_lld.c -index 1d83e199b..322d172c1 100644 ---- a/os/hal/ports/STM32/LLD/CRYPv1/hal_crypto_lld.c -+++ b/os/hal/ports/STM32/LLD/CRYPv1/hal_crypto_lld.c -@@ -361,6 +361,8 @@ void cry_lld_init(void) { - #endif - - #if STM32_CRY_USE_HASH1 -+ CRYD1.hmac_keyp = NULL; -+ CRYD1.hmac_keylen = 0; - #if STM32_CRY_HASH_SIZE_THRESHOLD != 0 - CRYD1.hash_tr = NULL; - CRYD1.hash_dma = NULL; -@@ -451,6 +453,7 @@ void cry_lld_start(CRYDriver *cryp) { - #endif - } - -+#if STM32_CRY_USE_CRYP1 - /* Resetting trasient key data.*/ - cryp->cryp_ktype = cryp_key_none; - cryp->cryp_ksize = 0U; -@@ -463,7 +466,6 @@ void cry_lld_start(CRYDriver *cryp) { - cryp->cryp_k[6] = 0U; - cryp->cryp_k[7] = 0U; - --#if STM32_CRY_USE_CRYP1 - /* CRYP setup.*/ - CRYP->CR = CRYP_CR_DATATYPE_1; - CRYP->DMACR = CRYP_DMACR_DIEN | CRYP_DMACR_DOEN; -@@ -1711,7 +1713,8 @@ cryerror_t cry_lld_SHA512_final(CRYDriver *cryp, SHA512Context *sha512ctxp, - /** - * @brief Initializes the HMAC transient key. - * @note It is the underlying implementation to decide which key sizes are -- * allowable. -+ * allowable. The key must not be moved, freed, or fall out of scope -+ * until the relevent HMAC*_final() function has been called. - * - * @param[in] cryp pointer to the @p CRYDriver object - * @param[in] size key size in bytes -@@ -1727,14 +1730,66 @@ cryerror_t cry_lld_SHA512_final(CRYDriver *cryp, SHA512Context *sha512ctxp, - cryerror_t cry_lld_hmac_loadkey(CRYDriver *cryp, - size_t size, - const uint8_t *keyp) { -- -- (void)cryp; -- (void)size; -- (void)keyp; -+ /* The HASH peripheral doesn't really match up to this API so this gets a -+ * little awkward. The described use is loadkey() -> init() -> update() -> -+ * final() but the key can only be loaded after the configuration in init(). -+ * At the same time init() needs to know the length of the key and so -+ * init() -> loadkey() does not work. Finally, the key needs to be loaded -+ * again, after update() and before final(), but final() feeds the last word -+ * of data into HASH so update() -> loadkey() -> final() is out as well. -+ * -+ * This is the least worst option that I could come up with, doing an -+ * allocation and copying the secret around seemed less desirable. The -+ * downside being users must ensure that the key has not been moved, freed, -+ * or fallen out of scope until final() is called. -+ */ -+ cryp->hmac_keyp = keyp; -+ cryp->hmac_keylen = size; - - return CRY_NOERROR; - } - -+/** -+ * @brief Actually loads a key into the HASH peripheral. -+ * @note The hardware will pad to extend or hash to shorten to -+ * ensure the actual key is the right size -+ * -+ * @param[in] cryp pointer to the @p CRYDriver object -+ * @param[in] size key size in bytes -+ * @param[in] keyp pointer to the key data -+ * -+ * @notapi -+ */ -+ -+static void hmac_loadkey(CRYDriver *cryp, size_t size, const uint8_t *keyp) { -+ /* The API accepts bytes but HASH only takes words so special handling is -+ * needed for the end word */ -+ uint32_t words = size / sizeof(uint32_t); -+ uint32_t bytes = size % sizeof(uint32_t); -+ uint32_t end = 0; -+ switch (bytes) { -+ case 3: -+ end = keyp[size-1] << 16 | keyp[size-2] << 8 | keyp[size-3]; -+ break; -+ case 2: -+ end = keyp[size-1] << 8 | keyp[size-2]; -+ break; -+ case 1: -+ end = keyp[size-1]; -+ break; -+ default: -+ break; -+ } -+ cry_lld_hash_push(cryp, words, (const uint32_t *)keyp); -+ if (bytes) { -+ HASH->DIN = end; -+ } -+ /* It is not possible to configure NBLW and set DCAL at the same time. -+ * Additinally NBLW is not reset by HASH_CR_INIT and so must always be set */ -+ HASH->STR = (8 * bytes) & HASH_STR_NBLW; -+ HASH->STR = HASH_STR_DCAL; -+} -+ - /** - * @brief Hash initialization using HMAC_SHA256. - * -@@ -1752,11 +1807,25 @@ cryerror_t cry_lld_hmac_loadkey(CRYDriver *cryp, - */ - cryerror_t cry_lld_HMACSHA256_init(CRYDriver *cryp, - HMACSHA256Context *hmacsha256ctxp) { -+ hmacsha256ctxp->last_data = 0; -+ hmacsha256ctxp->last_size = 0; - -- (void)cryp; -- (void)hmacsha256ctxp; -+ if (!cryp->hmac_keyp || !cryp->hmac_keylen) { -+ return CRY_ERR_OP_FAILURE; -+ } - -- return CRY_ERR_INV_ALGO; -+ //FIXME: DMA -+ /* SHA256 | HMAC | LE Byte data */ -+ uint32_t cr = HASH_CR_ALGO_1 | HASH_CR_ALGO_0 | HASH_CR_MODE | HASH_CR_DATATYPE_1; -+ if (cryp->hmac_keylen > 64) { -+ /* Can only be set when the INIT bit is also set */ -+ cr |= HASH_CR_LKEY; -+ } -+ HASH->CR = cr | HASH_CR_INIT; -+ -+ /* Load the "inner" key */ -+ hmac_loadkey(cryp, cryp->hmac_keylen, cryp->hmac_keyp); -+ return CRY_NOERROR; - } - - /** -@@ -1779,13 +1848,31 @@ cryerror_t cry_lld_HMACSHA256_update(CRYDriver *cryp, - HMACSHA256Context *hmacsha256ctxp, - size_t size, - const uint8_t *in) { -+ /* This HW is unable to hash blocks that are not a multiple of 4 bytes -+ except for the last block in the stream which is handled in the -+ "final" function. */ -+ if (hmacsha256ctxp->last_size) { -+ return CRY_ERR_OP_FAILURE; -+ } - -- (void)cryp; -- (void)hmacsha256ctxp; -- (void)size; -- (void)in; -+ /* Any unaligned data is deferred to the "final" function. */ -+ hmacsha256ctxp->last_size = size % sizeof(uint32_t); -+ switch (hmacsha256ctxp->last_size) { -+ case 3: -+ hmacsha256ctxp->last_data = in[size-1] << 16 | in[size-2] << 8 | in[size-3]; -+ break; -+ case 2: -+ hmacsha256ctxp->last_data = in[size-1] << 8 | in[size-2]; -+ break; -+ case 1: -+ hmacsha256ctxp->last_data = in[size-1]; -+ break; -+ default: -+ break; -+ } - -- return CRY_ERR_INV_ALGO; -+ cry_lld_hash_push(cryp, size / sizeof(uint32_t), (const uint32_t *)in); -+ return CRY_NOERROR; - } - - /** -@@ -1806,12 +1893,34 @@ cryerror_t cry_lld_HMACSHA256_update(CRYDriver *cryp, - cryerror_t cry_lld_HMACSHA256_final(CRYDriver *cryp, - HMACSHA256Context *hmacsha256ctxp, - uint8_t *out) { -+ if (hmacsha256ctxp->last_size) { -+ HASH->DIN = hmacsha256ctxp->last_data; -+ } -+ /* It is not possible to configure NBLW and set DCAL at the same time. -+ * Additinally NBLW is not reset by HASH_CR_INIT and so must always be set */ -+ HASH->STR = (8 * hmacsha256ctxp->last_size) & HASH_STR_NBLW; -+ HASH->STR = HASH_STR_DCAL; -+ /* Wait for calculation result */ -+ while (HASH->SR & HASH_SR_BUSY) {} - -- (void)cryp; -- (void)hmacsha256ctxp; -- (void)out; -+ /* Feed in the "outer" key (which should be the same as the inner key) */ -+ hmac_loadkey(cryp, cryp->hmac_keylen, cryp->hmac_keyp); - -- return CRY_ERR_INV_ALGO; -+ uint32_t digest[8]; -+ /* Reading digest.*/ -+ digest[0] = __REV(HASH_DIGEST->HR[0]); -+ digest[1] = __REV(HASH_DIGEST->HR[1]); -+ digest[2] = __REV(HASH_DIGEST->HR[2]); -+ digest[3] = __REV(HASH_DIGEST->HR[3]); -+ digest[4] = __REV(HASH_DIGEST->HR[4]); -+ digest[5] = __REV(HASH_DIGEST->HR[5]); -+ digest[6] = __REV(HASH_DIGEST->HR[6]); -+ digest[7] = __REV(HASH_DIGEST->HR[7]); -+ memcpy(out, digest, sizeof(digest)); -+ -+ cryp->hmac_keyp = NULL; -+ cryp->hmac_keylen = 0; -+ return CRY_NOERROR; - } - #endif - -diff --git a/os/hal/ports/STM32/LLD/CRYPv1/hal_crypto_lld.h b/os/hal/ports/STM32/LLD/CRYPv1/hal_crypto_lld.h -index 257d39624..55f263df7 100644 ---- a/os/hal/ports/STM32/LLD/CRYPv1/hal_crypto_lld.h -+++ b/os/hal/ports/STM32/LLD/CRYPv1/hal_crypto_lld.h -@@ -195,17 +195,20 @@ - #endif /* !STM32_DMA_SUPPORTS_DMAMUX */ - - /* DMA priority check.*/ --#if !STM32_DMA_IS_VALID_PRIORITY(STM32_CRY_CRYP1_IN_DMA_PRIORITY) -+#if STM32_CRY_USE_CRYP1 && \ -+ !STM32_DMA_IS_VALID_PRIORITY(STM32_CRY_CRYP1_IN_DMA_PRIORITY) - #error "Invalid DMA priority assigned to CRYP1_IN" - #endif - - /* DMA priority check.*/ --#if !STM32_DMA_IS_VALID_PRIORITY(STM32_CRY_CRYP1_OUT_DMA_PRIORITY) -+#if STM32_CRY_USE_CRYP1 && \ -+ !STM32_DMA_IS_VALID_PRIORITY(STM32_CRY_CRYP1_OUT_DMA_PRIORITY) - #error "Invalid DMA priority assigned to CRYP1_OUT" - #endif - - /* DMA priority check.*/ --#if !STM32_DMA_IS_VALID_PRIORITY(STM32_CRY_HASH1_DMA_PRIORITY) -+#if STM32_CRY_USE_HASH1 && \ -+ !STM32_DMA_IS_VALID_PRIORITY(STM32_CRY_HASH1_DMA_PRIORITY) - #error "Invalid DMA priority assigned to HASH1" - #endif - -@@ -335,6 +338,14 @@ struct CRYDriver { - #endif /* STM32_CRY_CRYP_SIZE_THRESHOLD != 0 */ - #endif /* STM32_CRY_USE_CRYP1 == TRUE */ - #if (STM32_CRY_USE_HASH1 == TRUE) || defined (__DOXYGEN__) -+ /** -+ * @brief Pointer to HMAC transient key -+ */ -+ const uint8_t *hmac_keyp; -+ /** -+ * #brief Length of the key pointed to by hmac_keyp -+ */ -+ size_t hmac_keylen; - #if (STM32_CRY_HASH_SIZE_THRESHOLD != 0) || defined (__DOXYGEN__) - /** - * @brief Thread reference for hash operations. -@@ -387,7 +398,14 @@ typedef struct { - * @brief Type of a HMAC_SHA256 context. - */ - typedef struct { -- uint32_t dummy; -+ /** -+ * @brief Last data to be hashed on finalization. -+ */ -+ uint32_t last_data; -+ /** -+ * @brief Size, in bits, of the last data. -+ */ -+ uint32_t last_size; - } HMACSHA256Context; - #endif - -diff --git a/os/hal/ports/STM32/STM32F4xx/stm32_rcc.h b/os/hal/ports/STM32/STM32F4xx/stm32_rcc.h -index cc401ce05..ec445db3e 100644 ---- a/os/hal/ports/STM32/STM32F4xx/stm32_rcc.h -+++ b/os/hal/ports/STM32/STM32F4xx/stm32_rcc.h -@@ -1596,6 +1596,34 @@ - #define rccResetCRC() rccResetAHB1(RCC_AHB1RSTR_CRCRST) - /** @} */ - -+/** -+ * @name HASH peripheral specific RCC operations -+ * @{ -+ */ -+/** -+ * @brief Enables the HASH peripheral clock. -+ * -+ * @param[in] lp low power enable flag -+ * -+ * @api -+ */ -+#define rccEnableHASH(lp) rccEnableAHB2(RCC_AHB2ENR_HASHEN, lp) -+ -+/** -+ * @brief Disables the HASH peripheral clock. -+ * -+ * @api -+ */ -+#define rccDisableHASH() rccDisableAHB2(RCC_AHB2ENR_HASHEN) -+ -+/** -+ * @brief Resets the HASH peripheral. -+ * -+ * @api -+ */ -+#define rccResetHASH() rccResetAHB2(RCC_AHB2RSTR_HASHRST) -+/** @} */ -+ - /** - * @name FSMC peripherals specific RCC operations - * @{ -diff --git a/os/hal/ports/STM32/STM32F4xx/stm32_registry.h b/os/hal/ports/STM32/STM32F4xx/stm32_registry.h -index 5072ce744..267b313b4 100644 ---- a/os/hal/ports/STM32/STM32F4xx/stm32_registry.h -+++ b/os/hal/ports/STM32/STM32F4xx/stm32_registry.h -@@ -1219,6 +1219,14 @@ - #define STM32_HAS_CRC TRUE - #define STM32_CRC_PROGRAMMABLE FALSE - -+/* CRY attributes.*/ -+#if defined(STM32F437xx) || defined(STM32F439xx) || defined(__DOXYGEN__) -+#define STM32_HAS_HASH1 TRUE -+#define STM32_HASH1_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 7) -+#define STM32_HASH1_DMA_CHN 0x20000000 -+ -+#endif -+ - #endif /* defined(STM32F429_439xx) || defined(STM32F427_437xx) */ - - /*===========================================================================*/ diff --git a/src/f4/app_devboard/Makefile b/src/f4/app_devboard/Makefile deleted file mode 100644 index 6fdd0d1e..00000000 --- a/src/f4/app_devboard/Makefile +++ /dev/null @@ -1,217 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_devboard - -# Target settings. -MCU = cortex-m4 -BOARD = ST_NUCLEO64_F446RE - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep -ODDIR := $(APP_ROOT)/od - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -ifeq ($(ORESAT),) - ORESAT = 0.5 -endif - -# generate OD.c/OD.h from oresat-configs -FW_VERSION = $(shell git describe --always) -$(shell oresat-gen-fw-files --oresat $(ORESAT) base -d $(ODDIR) -fw $(FW_VERSION) -hw $(BOARD)) -# add them -ALLCSRC += $(ODDIR)/OD.c -ALLINC += $(ODDIR) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(PROJ_ROOT)/ld/STM32F446xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/f4/app_devboard/README.md b/src/f4/app_devboard/README.md deleted file mode 100644 index 1df5134b..00000000 --- a/src/f4/app_devboard/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Application Main Directory -## Directory Structure -This folder contains the root of an applications sources. It contains -several files and folders: -* [main.c](main.c): The main program file called by ChibiOS. Contains - initialization code and registers threads and functions. -* [Makefile](Makefile): The main Makefile for the application. Sources - all other build files. -* [cfg](cfg): The directory containing ChibiOS's configuration files for - this application. -* [source](source): The directory where application code is put. - Everything within this directory automatically builds. diff --git a/src/f4/app_devboard/cfg/CO_driver_custom.h b/src/f4/app_devboard/cfg/CO_driver_custom.h deleted file mode 100644 index d1a11777..00000000 --- a/src/f4/app_devboard/cfg/CO_driver_custom.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef CO_DRIVER_CUSTOM_H -#define CO_DRIVER_CUSTOM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define CO_CONFIG_SDO_CLI (CO_CONFIG_SDO_CLI_ENABLE | \ - CO_CONFIG_SDO_CLI_SEGMENTED | \ - CO_CONFIG_SDO_CLI_BLOCK | \ - CO_CONFIG_SDO_CLI_LOCAL | \ - CO_CONFIG_FLAG_CALLBACK_PRE | \ - CO_CONFIG_FLAG_TIMERNEXT | \ - CO_CONFIG_FLAG_OD_DYNAMIC) - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CO_DRIVER_CUSTOM_H */ diff --git a/src/f4/app_devboard/cfg/chconf.h b/src/f4/app_devboard/cfg/chconf.h deleted file mode 100644 index 29b34229..00000000 --- a/src/f4/app_devboard/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE TRUE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/f4/app_devboard/cfg/halconf.h b/src/f4/app_devboard/cfg/halconf.h deleted file mode 100644 index 5d81faa8..00000000 --- a/src/f4/app_devboard/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS TRUE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/f4/app_devboard/cfg/mcuconf.h b/src/f4/app_devboard/cfg/mcuconf.h deleted file mode 100644 index 50d24450..00000000 --- a/src/f4/app_devboard/cfg/mcuconf.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 360 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SM_VALUE 4 -#define STM32_PLLI2SR_VALUE 4 -#define STM32_PLLI2SP_VALUE 4 -#define STM32_PLLI2SQ_VALUE 4 -#define STM32_PLLSAIN_VALUE 192 -#define STM32_PLLSAIM_VALUE 4 -#define STM32_PLLSAIP_VALUE 8 -#define STM32_PLLSAIQ_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_PLLI2S -#define STM32_MCO2PRE STM32_MCO2PRE_DIV1 -#define STM32_I2SSRC STM32_I2SSRC_PLLI2S -#define STM32_SAI1SEL STM32_SAI2SEL_PLLR -#define STM32_SAI2SEL STM32_SAI2SEL_PLLR -#define STM32_CK48MSEL STM32_CK48MSEL_PLLALT -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_BKPRAM_ENABLE FALSE - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 15 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_PRIORITY 15 -#define STM32_IRQ_EXTI22_PRIORITY 15 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_DUAL_MODE FALSE -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_USE_DAC1_CH2 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * I2S driver system settings. - */ -#define STM32_I2S_USE_SPI2 FALSE -#define STM32_I2S_USE_SPI3 FALSE -#define STM32_I2S_SPI2_IRQ_PRIORITY 10 -#define STM32_I2S_SPI3_IRQ_PRIORITY 10 -#define STM32_I2S_SPI2_DMA_PRIORITY 1 -#define STM32_I2S_SPI3_DMA_PRIORITY 1 -#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#define STM32_SDC_WRITE_TIMEOUT_MS 1000 -#define STM32_SDC_READ_TIMEOUT_MS 1000 -#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10 -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USE_UART7 FALSE -#define STM32_SERIAL_USE_UART8 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 -#define STM32_SERIAL_UART7_PRIORITY 12 -#define STM32_SERIAL_UART8_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_USE_SPI4 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI4_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_SPI4_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USE_UART5 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_UART5_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_UART5_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/src/f4/app_devboard/main.c b/src/f4/app_devboard/main.c deleted file mode 100644 index a0818a85..00000000 --- a/src/f4/app_devboard/main.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* ChibiOS header files */ -#include "ch.h" -#include "hal.h" - -/* Project header files */ -#include "oresat.h" -#include "blink.h" - -static worker_t worker1; -static thread_descriptor_t worker1_desc = { - .name = "Example blinky thread", - .wbase = THD_WORKING_AREA_BASE(blink_wa), - .wend = THD_WORKING_AREA_END(blink_wa), - .prio = NORMALPRIO, - .funcp = blink, - .arg = NULL -}; - -static oresat_config_t oresat_conf = { - .cand = &CAND1, - .node_id = ORESAT_DEFAULT_ID, - .bitrate = ORESAT_DEFAULT_BITRATE, -}; - -/** - * @brief App Initialization - */ -static void app_init(void) -{ - /* App initialization */ - reg_worker(&worker1, &worker1_desc, false, true); - - /* Start up debug output */ - sdStart(&SD2, NULL); -} - -/** - * @brief Main Application - */ -int main(void) -{ - // Initialize and start - oresat_init(&oresat_conf); - app_init(); - oresat_start(); - return 0; -} diff --git a/src/f4/app_devboard/source/README.md b/src/f4/app_devboard/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/f4/app_devboard/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/f4/app_devboard/source/blink.c b/src/f4/app_devboard/source/blink.c deleted file mode 100644 index 93010401..00000000 --- a/src/f4/app_devboard/source/blink.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "blink.h" - -/* Example blinker thread */ -THD_WORKING_AREA(blink_wa, 0x40); -THD_FUNCTION(blink, arg) -{ - (void)arg; - - palSetLineMode(LINE_LED,PAL_MODE_OUTPUT_PUSHPULL); - - while (!chThdShouldTerminateX()) { - palToggleLine(LINE_LED); - chThdSleepMilliseconds(500); - } - - palClearLine(LINE_LED); - chThdExit(MSG_OK); -} diff --git a/src/f4/app_devboard/source/blink.h b/src/f4/app_devboard/source/blink.h deleted file mode 100644 index c9178eb2..00000000 --- a/src/f4/app_devboard/source/blink.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _BLINK_H_ -#define _BLINK_H_ - -#include "ch.h" -#include "hal.h" - -/* Example blinker thread prototypes */ -extern THD_WORKING_AREA(blink_wa, 0x40); -extern THD_FUNCTION(blink, arg); - -#endif diff --git a/src/l4/README.md b/src/l4/README.md deleted file mode 100644 index 54cf4959..00000000 --- a/src/l4/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# STM32L452RE - -This is the source directory for all STM32L452RE applications. -This device contains an ARM Cortex-M4, and is also known as an L4. - -This MCU typically implements higher power OreSat subsystems, -such as Reaction Wheels and Magnetorquers. - -## Testing the toolchain -After having installed the required toolchain components as described in -the Prerequesites section of the main README, it is good to test that -they all function as expected. This can be done by building and flashing -the `app_blinky` application that simply blinks an LED. - -In order to accomplish this, from this directory simply execute the -following: - -``` -cd app_blinky -make -make write -``` -This should result in a clean no-error build, followed by a successful -write to the board and a flashing green LED. If this all works, -congratulations! Your toolchain is working and you can begin developing. - -## Creating an app -The template to copy for new applications is [app_template](app_template). -To create a new app, simply make a copy of the app_template directory -and name it whatever you like. From this directory: - -``` -cp -R app_template app_ -``` - -Then, open the Makefile `app_/Makefile` and edit the line `PROJECT =` to whatever name -you've chosen: - -If building for a specific board, also update the `BOARD =` line to the -board defined in the `boards` directory. -``` -PROJECT = app_ -``` - -At this point, you simply write code in source files under the `sources` -directory, include the appropriate header file in the main.c file, -and finally register your worker with the main OreSat application. - -See the doc folder for further documentation. diff --git a/src/l4/app_blinky/Makefile b/src/l4/app_blinky/Makefile deleted file mode 100644 index 15872963..00000000 --- a/src/l4/app_blinky/Makefile +++ /dev/null @@ -1,202 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_blinky - -# Target settings. -MCU = cortex-m4 -BOARD = ST_NUCLEO64_L452RE_P - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32l4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32L452xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/l4/app_blinky/README.md b/src/l4/app_blinky/README.md deleted file mode 100644 index ae8def29..00000000 --- a/src/l4/app_blinky/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# Toolchain Test Application -`app_blinky` is a simple app that blinks a dev board's LED at 1Hz with a 50% duty cycle. - -To ensure you have your toolchain correctly installed and configured, -you simply need to run the following sequence of commands: - -``` -make -make write -``` - -If you see something like the following output for each, your -toolchain works: - -``` -âžœ make -Compiler Options -arm-none-eabi-gcc -c -mcpu=cortex-m0 -mthumb -Og -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -Wall -Wextra -Wundef -Wstrict-prototypes -Wa,-alms=./build/lst/ -DCORTEX_USE_FPU=FALSE -DPORT_IGNORE_GCC_VERSION_CHECK -MD -MP -MF ./.dep/build.d -I. -I./cfg -I../../../ChibiOS/os/license -I../../../ChibiOS/os/common/portability/GCC -I../../../ChibiOS/os/common/startup/ARMCMx/compilers/GCC -I../../../ChibiOS/os/common/startup/ARMCMx/devices/STM32F0xx -I../../../ChibiOS/os/common/ext/ARM/CMSIS/Core/Include -I../../../ChibiOS/os/common/ext/ST/STM32F0xx -I../../../ChibiOS/os/hal/include -I../../../ChibiOS/os/hal/ports/common/ARMCMx -I../../../ChibiOS/os/hal/ports/STM32/STM32F0xx -I../../../ChibiOS/os/hal/ports/STM32/LLD/ADCv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/CANv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/DACv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/DMAv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/EXTIv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/GPIOv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/I2Cv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/RTCv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/SPIv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/TIMv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/USARTv2 -I../../../ChibiOS/os/hal/ports/STM32/LLD/USBv1 -I../../../ChibiOS/os/hal/ports/STM32/LLD/xWDGv1 -I../../../boards/ST_NUCLEO32_F042K6 -I../../../ChibiOS/os/hal/osal/rt-nil -I../../../ChibiOS/os/rt/include -I../../../ChibiOS/os/oslib/include -I../../../ChibiOS/os/common/ports/ARMCMx -I../../../ChibiOS/os/common/ports/ARMCMx/compilers/GCC -I../../../common/include main.c -o main.o - -Compiling crt0_v6m.S -Compiling vectors.S -Compiling chcoreasm_v6m.S -Compiling crt1.c -Compiling hal.c -Compiling hal_st.c -Compiling hal_buffers.c -Compiling hal_queues.c -Compiling hal_flash.c -Compiling hal_mmcsd.c -Compiling hal_pal.c -Compiling hal_serial.c -Compiling nvic.c -Compiling stm32_isr.c -Compiling hal_lld.c -Compiling stm32_dma.c -Compiling stm32_exti.c -Compiling hal_pal_lld.c -Compiling hal_st_lld.c -Compiling hal_serial_lld.c -Compiling board.c -Compiling osal.c -Compiling chsys.c -Compiling chdebug.c -Compiling chtrace.c -Compiling chvt.c -Compiling chschd.c -Compiling chthreads.c -Compiling chregistry.c -Compiling chsem.c -Compiling chmtx.c -Compiling chcond.c -Compiling chevents.c -Compiling chmsg.c -Compiling chdynamic.c -Compiling chmboxes.c -Compiling chmemcore.c -Compiling chmempools.c -Compiling chpipes.c -Compiling chcore.c -Compiling chcore_v6m.c -Compiling main.c -Linking build/app_blinky.elf -Creating build/app_blinky.hex -Creating build/app_blinky.bin -Creating build/app_blinky.dmp - - text data bss dec hex filename - 4952 0 6144 11096 2b58 build/app_blinky.elf -Creating build/app_blinky.list - -Done - -âžœ make write -st-flash --reset --format ihex write ./build/app_blinky.hex -st-flash 1.6.1 -2020-07-30T13:29:22 INFO common.c: F09X: 32 KiB SRAM, 256 KiB flash in at least 2 KiB pages. -2020-07-30T13:29:22 INFO common.c: Attempting to write 5192 (0x1448) bytes to stm32 address: 134217728 (0x8000000) -2020-07-30T13:29:22 INFO common.c: Flash page at addr: 0x08000000 erased -2020-07-30T13:29:22 INFO common.c: Flash page at addr: 0x08000800 erased -2020-07-30T13:29:22 INFO common.c: Flash page at addr: 0x08001000 erased -2020-07-30T13:29:22 INFO common.c: Finished erasing 3 pages of 2048 (0x800) bytes -2020-07-30T13:29:22 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id -2020-07-30T13:29:22 INFO flash_loader.c: Successfully loaded flash loader in sram - 3/3 pages written -2020-07-30T13:29:22 INFO common.c: Starting verification of write complete -2020-07-30T13:29:22 INFO common.c: Flash written and verified! jolly good! -``` diff --git a/src/l4/app_blinky/cfg/chconf.h b/src/l4/app_blinky/cfg/chconf.h deleted file mode 100644 index 6bf327ae..00000000 --- a/src/l4/app_blinky/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE TRUE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/l4/app_blinky/cfg/halconf.h b/src/l4/app_blinky/cfg/halconf.h deleted file mode 100644 index 534c4bb6..00000000 --- a/src/l4/app_blinky/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/l4/app_blinky/cfg/mcuconf.h b/src/l4/app_blinky/cfg/mcuconf.h deleted file mode 100644 index 10eb53d4..00000000 --- a/src/l4/app_blinky/cfg/mcuconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#ifndef MCUCONF_H -#define MCUCONF_H - -#define STM32L4xx_MCUCONF -#define STM32L452_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_VOS STM32_VOS_RANGE1 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI16_ENABLED FALSE -#define STM32_HSI48_ENABLED FALSE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_MSIPLL_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_4M -#define STM32_MSISRANGE STM32_MSISRANGE_4M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_MSI -#define STM32_PLLM_VALUE 1 -#define STM32_PLLN_VALUE 80 -#define STM32_PLLPDIV_VALUE 0 -#define STM32_PLLP_VALUE 7 -#define STM32_PLLQ_VALUE 6 -#define STM32_PLLR_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_STOPWUCK STM32_STOPWUCK_MSI -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_LSCOSEL STM32_LSCOSEL_NOCLOCK -#define STM32_PLLSAI1N_VALUE 72 -#define STM32_PLLSAI1PDIV_VALUE 6 -#define STM32_PLLSAI1P_VALUE 7 -#define STM32_PLLSAI1Q_VALUE 6 -#define STM32_PLLSAI1R_VALUE 6 - -/* - * Peripherals clock sources. - */ -#define STM32_USART1SEL STM32_USART1SEL_SYSCLK -#define STM32_USART2SEL STM32_USART2SEL_SYSCLK -#define STM32_USART3SEL STM32_USART3SEL_SYSCLK -#define STM32_UART4SEL STM32_UART4SEL_SYSCLK -#define STM32_LPUART1SEL STM32_LPUART1SEL_SYSCLK -#define STM32_I2C1SEL STM32_I2C1SEL_SYSCLK -#define STM32_I2C2SEL STM32_I2C2SEL_SYSCLK -#define STM32_I2C3SEL STM32_I2C3SEL_SYSCLK -#define STM32_I2C4SEL STM32_I2C4SEL_SYSCLK -#define STM32_LPTIM1SEL STM32_LPTIM1SEL_PCLK1 -#define STM32_LPTIM2SEL STM32_LPTIM2SEL_PCLK1 -#define STM32_SAI1SEL STM32_SAI1SEL_OFF -#define STM32_CLK48SEL STM32_CLK48SEL_PLLSAI1 -#define STM32_ADCSEL STM32_ADCSEL_SYSCLK -#define STM32_SWPMI1SEL STM32_SWPMI1SEL_PCLK1 -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI1635_38_PRIORITY 6 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_22_PRIORITY 15 - -#define STM32_IRQ_TIM1_BRK_TIM15_PRIORITY 7 -#define STM32_IRQ_TIM1_UP_TIM16_PRIORITY 7 -#define STM32_IRQ_TIM1_TRGCO_TIM17_PRIORITY 7 -#define STM32_IRQ_TIM1_CC_PRIORITY 7 -#define STM32_IRQ_TIM2_PRIORITY 7 -#define STM32_IRQ_TIM3_PRIORITY 7 -#define STM32_IRQ_TIM6_PRIORITY 7 - -#define STM32_IRQ_USART1_PRIORITY 12 -#define STM32_IRQ_USART2_PRIORITY 12 -#define STM32_IRQ_USART3_PRIORITY 12 -#define STM32_IRQ_UART4_PRIORITY 12 -#define STM32_IRQ_LPUART1_PRIORITY 12 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_COMPACT_SAMPLES FALSE -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC123_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC123_PRESC ADC_CCR_PRESC_DIV2 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM15 FALSE -#define STM32_GPT_USE_TIM16 FALSE - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_USE_I2C4 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C4_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C4_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM15 FALSE -#define STM32_ICU_USE_TIM16 FALSE - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM15 FALSE -#define STM32_PWM_USE_TIM16 FALSE - -/* - * RTC driver system settings. - */ -#define STM32_RTC_PRESA_VALUE 32 -#define STM32_RTC_PRESS_VALUE 1024 -#define STM32_RTC_CR_INIT 0 -#define STM32_RTC_TAMPCR_INIT 0 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_USE_SDMMC1 FALSE -#define STM32_SDC_SDMMC_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDMMC_WRITE_TIMEOUT 1000 -#define STM32_SDC_SDMMC_READ_TIMEOUT 1000 -#define STM32_SDC_SDMMC_CLOCK_DELAY 10 -#define STM32_SDC_SDMMC1_DMA_PRIORITY 3 -#define STM32_SDC_SDMMC1_IRQ_PRIORITY 9 -#define STM32_SDC_SDMMC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_LPUART1 TRUE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_LPUART1_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * TRNG driver system settings. - */ -#define STM32_TRNG_USE_RNG1 FALSE - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 6) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -/* - * WSPI driver system settings. - */ -#define STM32_WSPI_USE_QUADSPI1 FALSE -#define STM32_WSPI_QUADSPI1_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) - -#endif /* MCUCONF_H */ diff --git a/src/l4/app_blinky/main.c b/src/l4/app_blinky/main.c deleted file mode 100644 index c5a48d2a..00000000 --- a/src/l4/app_blinky/main.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* ChibiOS header files */ -#include "ch.h" -#include "hal.h" - -int main(void) -{ - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - while (true) - { - palClearLine(LINE_LED); - chThdSleepMilliseconds(500); - palSetLine(LINE_LED); - chThdSleepMilliseconds(500); - } - - return 0; -} diff --git a/src/l4/app_devboard/Makefile b/src/l4/app_devboard/Makefile deleted file mode 100644 index 61f98e20..00000000 --- a/src/l4/app_devboard/Makefile +++ /dev/null @@ -1,217 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_devboard - -# Target settings. -MCU = cortex-m4 -BOARD = ST_NUCLEO64_L452RE_P - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep -ODDIR := $(APP_ROOT)/od - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -ifeq ($(ORESAT),) - ORESAT = 0.5 -endif - -# generate OD.c/OD.h from oresat-configs -FW_VERSION = $(shell git describe --always) -$(shell oresat-gen-fw-files --oresat $(ORESAT) base -d $(ODDIR) -fw $(FW_VERSION) -hw $(BOARD)) -# add them -ALLCSRC += $(ODDIR)/OD.c -ALLINC += $(ODDIR) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32l4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(PROJ_ROOT)/ld/STM32L452xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/l4/app_devboard/README.md b/src/l4/app_devboard/README.md deleted file mode 100644 index 1df5134b..00000000 --- a/src/l4/app_devboard/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Application Main Directory -## Directory Structure -This folder contains the root of an applications sources. It contains -several files and folders: -* [main.c](main.c): The main program file called by ChibiOS. Contains - initialization code and registers threads and functions. -* [Makefile](Makefile): The main Makefile for the application. Sources - all other build files. -* [cfg](cfg): The directory containing ChibiOS's configuration files for - this application. -* [source](source): The directory where application code is put. - Everything within this directory automatically builds. diff --git a/src/l4/app_devboard/cfg/CO_driver_custom.h b/src/l4/app_devboard/cfg/CO_driver_custom.h deleted file mode 100644 index 4d72b881..00000000 --- a/src/l4/app_devboard/cfg/CO_driver_custom.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef CO_DRIVER_CUSTOM_H -#define CO_DRIVER_CUSTOM_H - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CO_DRIVER_CUSTOM_H */ diff --git a/src/l4/app_devboard/cfg/chconf.h b/src/l4/app_devboard/cfg/chconf.h deleted file mode 100644 index 29b34229..00000000 --- a/src/l4/app_devboard/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE TRUE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/l4/app_devboard/cfg/halconf.h b/src/l4/app_devboard/cfg/halconf.h deleted file mode 100644 index 5d81faa8..00000000 --- a/src/l4/app_devboard/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS TRUE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/l4/app_devboard/cfg/mcuconf.h b/src/l4/app_devboard/cfg/mcuconf.h deleted file mode 100644 index 10774df3..00000000 --- a/src/l4/app_devboard/cfg/mcuconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#ifndef MCUCONF_H -#define MCUCONF_H - -#define STM32L4xx_MCUCONF -#define STM32L452_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_VOS STM32_VOS_RANGE1 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI16_ENABLED FALSE -#define STM32_HSI48_ENABLED FALSE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_MSIPLL_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_4M -#define STM32_MSISRANGE STM32_MSISRANGE_4M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_MSI -#define STM32_PLLM_VALUE 1 -#define STM32_PLLN_VALUE 80 -#define STM32_PLLPDIV_VALUE 0 -#define STM32_PLLP_VALUE 7 -#define STM32_PLLQ_VALUE 6 -#define STM32_PLLR_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_STOPWUCK STM32_STOPWUCK_MSI -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_LSCOSEL STM32_LSCOSEL_NOCLOCK -#define STM32_PLLSAI1N_VALUE 72 -#define STM32_PLLSAI1PDIV_VALUE 6 -#define STM32_PLLSAI1P_VALUE 7 -#define STM32_PLLSAI1Q_VALUE 6 -#define STM32_PLLSAI1R_VALUE 6 - -/* - * Peripherals clock sources. - */ -#define STM32_USART1SEL STM32_USART1SEL_SYSCLK -#define STM32_USART2SEL STM32_USART2SEL_SYSCLK -#define STM32_USART3SEL STM32_USART3SEL_SYSCLK -#define STM32_UART4SEL STM32_UART4SEL_SYSCLK -#define STM32_LPUART1SEL STM32_LPUART1SEL_SYSCLK -#define STM32_I2C1SEL STM32_I2C1SEL_SYSCLK -#define STM32_I2C2SEL STM32_I2C2SEL_SYSCLK -#define STM32_I2C3SEL STM32_I2C3SEL_SYSCLK -#define STM32_I2C4SEL STM32_I2C4SEL_SYSCLK -#define STM32_LPTIM1SEL STM32_LPTIM1SEL_PCLK1 -#define STM32_LPTIM2SEL STM32_LPTIM2SEL_PCLK1 -#define STM32_SAI1SEL STM32_SAI1SEL_OFF -#define STM32_CLK48SEL STM32_CLK48SEL_PLLSAI1 -#define STM32_ADCSEL STM32_ADCSEL_SYSCLK -#define STM32_SWPMI1SEL STM32_SWPMI1SEL_PCLK1 -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI1635_38_PRIORITY 6 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_22_PRIORITY 15 - -#define STM32_IRQ_TIM1_BRK_TIM15_PRIORITY 7 -#define STM32_IRQ_TIM1_UP_TIM16_PRIORITY 7 -#define STM32_IRQ_TIM1_TRGCO_TIM17_PRIORITY 7 -#define STM32_IRQ_TIM1_CC_PRIORITY 7 -#define STM32_IRQ_TIM2_PRIORITY 7 -#define STM32_IRQ_TIM3_PRIORITY 7 -#define STM32_IRQ_TIM6_PRIORITY 7 - -#define STM32_IRQ_USART1_PRIORITY 12 -#define STM32_IRQ_USART2_PRIORITY 12 -#define STM32_IRQ_USART3_PRIORITY 12 -#define STM32_IRQ_UART4_PRIORITY 12 -#define STM32_IRQ_LPUART1_PRIORITY 12 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_COMPACT_SAMPLES FALSE -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC123_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC123_PRESC ADC_CCR_PRESC_DIV2 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM15 FALSE -#define STM32_GPT_USE_TIM16 FALSE - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_USE_I2C4 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C4_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C4_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM15 FALSE -#define STM32_ICU_USE_TIM16 FALSE - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM15 FALSE -#define STM32_PWM_USE_TIM16 FALSE - -/* - * RTC driver system settings. - */ -#define STM32_RTC_PRESA_VALUE 32 -#define STM32_RTC_PRESS_VALUE 1024 -#define STM32_RTC_CR_INIT 0 -#define STM32_RTC_TAMPCR_INIT 0 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_USE_SDMMC1 FALSE -#define STM32_SDC_SDMMC_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDMMC_WRITE_TIMEOUT 1000 -#define STM32_SDC_SDMMC_READ_TIMEOUT 1000 -#define STM32_SDC_SDMMC_CLOCK_DELAY 10 -#define STM32_SDC_SDMMC1_DMA_PRIORITY 3 -#define STM32_SDC_SDMMC1_IRQ_PRIORITY 9 -#define STM32_SDC_SDMMC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_LPUART1 TRUE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_LPUART1_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * TRNG driver system settings. - */ -#define STM32_TRNG_USE_RNG1 FALSE - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 6) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -/* - * WSPI driver system settings. - */ -#define STM32_WSPI_USE_QUADSPI1 FALSE -#define STM32_WSPI_QUADSPI1_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) - -#endif /* MCUCONF_H */ diff --git a/src/l4/app_devboard/main.c b/src/l4/app_devboard/main.c deleted file mode 100644 index eca517c2..00000000 --- a/src/l4/app_devboard/main.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* ChibiOS header files */ -#include "ch.h" -#include "hal.h" - -/* Project header files */ -#include "oresat.h" -#include "blink.h" - -static worker_t worker1; -static thread_descriptor_t worker1_desc = { - .name = "Example blinky thread", - .wbase = THD_WORKING_AREA_BASE(blink_wa), - .wend = THD_WORKING_AREA_END(blink_wa), - .prio = NORMALPRIO, - .funcp = blink, - .arg = NULL -}; - -static oresat_config_t oresat_conf = { - .cand = &CAND1, - .node_id = ORESAT_DEFAULT_ID, - .bitrate = ORESAT_DEFAULT_BITRATE, -}; - -/** - * @brief App Initialization - */ -static void app_init(void) -{ - /* App initialization */ - reg_worker(&worker1, &worker1_desc, false, true); - - /* Start up debug output */ - sdStart(&LPSD1, NULL); -} - -/** - * @brief Main Application - */ -int main(void) -{ - // Initialize and start - oresat_init(&oresat_conf); - app_init(); - oresat_start(); - return 0; -} diff --git a/src/l4/app_devboard/od/app.eds b/src/l4/app_devboard/od/app.eds deleted file mode 100644 index 116bbad9..00000000 --- a/src/l4/app_devboard/od/app.eds +++ /dev/null @@ -1,4863 +0,0 @@ -[FileInfo] -FileName=app.eds -FileVersion=0 -FileRevision=1 -EDSVersion=4.0 -Description=OreSat Template Application Object Dictionary -CreationTime=02:51PM -CreationDate=08-12-2019 -CreatedBy=Miles Simpson -ModificationTime=11:45AM -ModificationDate=04-25-2021 -ModifiedBy= - -[DeviceInfo] -VendorName=Portland State Aerospace Society -VendorNumber=0 -ProductName=OreSat Template -ProductNumber=0 -RevisionNumber=0 -OrderCode= -BaudRate_10=1 -BaudRate_20=1 -BaudRate_50=1 -BaudRate_125=1 -BaudRate_250=1 -BaudRate_500=1 -BaudRate_800=1 -BaudRate_1000=1 -SimpleBootUpMaster=0 -SimpleBootUpSlave=0 -Granularity=0 -DynamicChannelsSupported=0 -GroupMessaging=0 -NrOfRXPDO=16 -NrOfTXPDO=16 -LSS_Supported=0 - -[DummyUsage] -Dummy0000=1 -Dummy0001=1 -Dummy0002=1 -Dummy0003=1 -Dummy0004=1 -Dummy0005=1 -Dummy0006=1 -Dummy0007=1 - -[Comments] -Lines=0 - -[MandatoryObjects] -SupportedObjects=3 -1=0x1000 -2=0x1001 -3=0x1018 - -[1000] -ParameterName=Device type -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1001] -ParameterName=Error register -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=ro -DefaultValue=0x00 -PDOMapping=1 - -[1018] -ParameterName=Identity -ObjectType=0x09 -;StorageLocation=ROM -SubNumber=5 - -[1018sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=const -DefaultValue=0x04 - -[1018sub1] -ParameterName=Vendor-ID -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1018sub2] -ParameterName=Product code -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1018sub3] -ParameterName=Revision number -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1018sub4] -ParameterName=Serial number -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[OptionalObjects] -SupportedObjects=82 -1=0x1002 -2=0x1003 -3=0x1005 -4=0x1006 -5=0x1007 -6=0x1008 -7=0x1009 -8=0x100A -9=0x1010 -10=0x1011 -11=0x1014 -12=0x1015 -13=0x1016 -14=0x1017 -15=0x1019 -16=0x1029 -17=0x1200 -18=0x1400 -19=0x1401 -20=0x1402 -21=0x1403 -22=0x1404 -23=0x1405 -24=0x1406 -25=0x1407 -26=0x1408 -27=0x1409 -28=0x140A -29=0x140B -30=0x140C -31=0x140D -32=0x140E -33=0x140F -34=0x1600 -35=0x1601 -36=0x1602 -37=0x1603 -38=0x1604 -39=0x1605 -40=0x1606 -41=0x1607 -42=0x1608 -43=0x1609 -44=0x160A -45=0x160B -46=0x160C -47=0x160D -48=0x160E -49=0x160F -50=0x1800 -51=0x1801 -52=0x1802 -53=0x1803 -54=0x1804 -55=0x1805 -56=0x1806 -57=0x1807 -58=0x1808 -59=0x1809 -60=0x180A -61=0x180B -62=0x180C -63=0x180D -64=0x180E -65=0x180F -66=0x1A00 -67=0x1A01 -68=0x1A02 -69=0x1A03 -70=0x1A04 -71=0x1A05 -72=0x1A06 -73=0x1A07 -74=0x1A08 -75=0x1A09 -76=0x1A0A -77=0x1A0B -78=0x1A0C -79=0x1A0D -80=0x1A0E -81=0x1A0F -82=0x1F80 - -[1002] -ParameterName=Manufacturer status register -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[1003] -ParameterName=Pre-defined error field -ObjectType=0x08 -;StorageLocation=RAM -SubNumber=9 - -[1003sub0] -ParameterName=Number of errors -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1003sub1] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub2] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub3] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub4] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub5] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub6] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub7] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub8] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1005] -ParameterName=COB-ID SYNC message -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000080 - -[1006] -ParameterName=Communication cycle period -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0 - -[1007] -ParameterName=Synchronous window length -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0 - -[1008] -ParameterName=Manufacturer device name -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0009 -AccessType=ro -DefaultValue=OreSat Node - -[1009] -ParameterName=Manufacturer hardware version -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0009 -AccessType=ro -DefaultValue=0.0 - -[100A] -ParameterName=Manufacturer software version -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0009 -AccessType=ro -DefaultValue=0.0.0 - -[1010] -ParameterName=Store parameters -ObjectType=0x08 -;StorageLocation=RAM -SubNumber=5 - -[1010sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x04 - -[1010sub1] -ParameterName=Save all parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1010sub2] -ParameterName=Save communication parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1010sub3] -ParameterName=Save application parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1010sub4] -ParameterName=Save manufacturer defined parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1011] -ParameterName=Restore default parameters -ObjectType=0x08 -;StorageLocation=RAM -SubNumber=5 - -[1011sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x04 - -[1011sub1] -ParameterName=Restore all default parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1011sub2] -ParameterName=Restore communication default parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1011sub3] -ParameterName=Restore application default parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1011sub4] -ParameterName=Restore manufacturer defined default parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1014] -ParameterName=COB-ID EMCY -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80+$NODEID - -[1015] -ParameterName=Inhibit time EMCY -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1016] -ParameterName=Consumer heartbeat time -ObjectType=0x08 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1016sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1016sub1] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub2] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub3] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub4] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub5] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub6] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub7] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub8] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1017] -ParameterName=Producer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=1000 - -[1019] -ParameterName=Synchronous counter overflow value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1029] -ParameterName=Error behavior -ObjectType=0x08 -;StorageLocation=ROM -SubNumber=7 - -[1029sub0] -ParameterName=max sub-index -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=const -DefaultValue=0x06 - -[1029sub1] -ParameterName=Communication -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub2] -ParameterName=Communication other -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub3] -ParameterName=Communication passive -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub4] -ParameterName=Generic -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub5] -ParameterName=Device profile -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub6] -ParameterName=Manufacturer specific -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1200] -ParameterName=SDO server parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1200sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1200sub1] -ParameterName=COB-ID client to server -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000000 -PDOMapping=1 - -[1200sub2] -ParameterName=COB-ID server to client -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000000 -PDOMapping=1 - -[1200sub3] -ParameterName=Node-ID of the SDO client -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1400] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1400sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1400sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000200+$NODEID - -[1400sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1400sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1401] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1401sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1401sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000300+$NODEID - -[1401sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1401sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1402] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1402sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1402sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000400+$NODEID - -[1402sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1402sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1403] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1403sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1403sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000500+$NODEID - -[1403sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1403sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1404] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1404sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1404sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000200+$NODEID - -[1404sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1404sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1405] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1405sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1405sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000300+$NODEID - -[1405sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1405sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1406] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1406sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1406sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000400+$NODEID - -[1406sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1406sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1407] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1407sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1407sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000500+$NODEID - -[1407sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1407sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1408] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1408sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1408sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000200+$NODEID - -[1408sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1408sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1409] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1409sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1409sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000300+$NODEID - -[1409sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1409sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140A] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Asub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Asub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000400+$NODEID - -[140Asub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Asub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140B] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Bsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Bsub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000500+$NODEID - -[140Bsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Bsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140C] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Csub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Csub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000200+$NODEID - -[140Csub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Csub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140D] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Dsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Dsub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000300+$NODEID - -[140Dsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Dsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140E] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Esub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Esub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000400+$NODEID - -[140Esub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Esub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140F] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Fsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Fsub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000500+$NODEID - -[140Fsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Fsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1600] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1600sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1600sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1601sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1601sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1602sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1602sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1603sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1603sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1604sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1604sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1605sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1605sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1606sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1606sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1607sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1607sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1608sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1608sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1609sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1609sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160A] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Asub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Asub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160B] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Bsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Bsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160C] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Csub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Csub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160D] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Dsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Dsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160E] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Esub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Esub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160F] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Fsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Fsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1800] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1800sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1800sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000180+$NODEID - -[1800sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1800sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1800sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1800sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1801] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1801sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1801sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000280+$NODEID - -[1801sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1801sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1801sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1801sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1802] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1802sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1802sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000380+$NODEID - -[1802sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1802sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1802sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1802sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1803] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1803sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1803sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000480+$NODEID - -[1803sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1803sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1803sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1803sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1804] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1804sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1804sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000180+$NODEID - -[1804sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1804sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1804sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1804sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1805] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1805sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1805sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000280+$NODEID - -[1805sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1805sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1805sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1805sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1806] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1806sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1806sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000380+$NODEID - -[1806sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1806sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1806sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1806sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1807] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1807sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1807sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000480+$NODEID - -[1807sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1807sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1807sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1807sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1808] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1808sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1808sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000180+$NODEID - -[1808sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1808sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1808sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1808sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1809] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1809sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1809sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000280+$NODEID - -[1809sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1809sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1809sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1809sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180A] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Asub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Asub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000380+$NODEID - -[180Asub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Asub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Asub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Asub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180B] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Bsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Bsub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000480+$NODEID - -[180Bsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Bsub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Bsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Bsub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180C] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Csub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Csub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000180+$NODEID - -[180Csub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Csub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Csub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Csub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180D] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Dsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Dsub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000280+$NODEID - -[180Dsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Dsub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Dsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Dsub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180E] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Esub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Esub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000380+$NODEID - -[180Esub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Esub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Esub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Esub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180F] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Fsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Fsub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000480+$NODEID - -[180Fsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Fsub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Fsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Fsub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1A00] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A00sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A00sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A01sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A01sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A02sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A02sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A03sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A03sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A04sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A04sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A05sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A05sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A06sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A06sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A07sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A07sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A08sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A08sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A09sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A09sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0A] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Asub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Asub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0B] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Bsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Bsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0C] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Csub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Csub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0D] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Dsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Dsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0E] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Esub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Esub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0F] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Fsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Fsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1F80] -ParameterName=NMTStartup -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000008 - -[ManufacturerObjects] -SupportedObjects=7 -1=0x2000 -2=0x2010 -3=0x2011 -4=0x2020 -5=0x2021 -6=0x2022 -7=0x2100 - -[2000] -ParameterName=BUS Management -ObjectType=0x09 -;StorageLocation=PERSIST_MFR -SubNumber=5 - -[2000sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=const -DefaultValue=0x04 - -[2000sub1] -ParameterName=Bdefault -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[2000sub2] -ParameterName=Ttoggle -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[2000sub3] -ParameterName=Ntoggle -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[2000sub4] -ParameterName=Ctoggle -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[2010] -ParameterName=SCET -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x001B -AccessType=rw -DefaultValue=0 -PDOMapping=1 - -[2011] -ParameterName=UTC -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x001B -AccessType=rw -DefaultValue=0 -PDOMapping=1 - -[2020] -ParameterName=MCU Unique Device ID -ObjectType=0x08 -;StorageLocation=RAM -SubNumber=4 - -[2020sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[2020sub1] -ParameterName=UID -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0 - -[2020sub2] -ParameterName=UID -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0 - -[2020sub3] -ParameterName=UID -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0 - -[2021] -ParameterName=MCU Calibration -ObjectType=0x09 -;StorageLocation=RAM -SubNumber=4 - -[2021sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[2021sub1] -ParameterName=TS_CAL1 -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 - -[2021sub2] -ParameterName=TS_CAL2 -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 - -[2021sub3] -ParameterName=VREFINT_CAL -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 - -[2022] -ParameterName=MCU Sensors -ObjectType=0x09 -;StorageLocation=RAM -SubNumber=9 - -[2022sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[2022sub1] -ParameterName=Temperature -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0002 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub2] -ParameterName=VREFINT -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub3] -ParameterName=VBAT -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub4] -ParameterName=VBUSP Current -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub5] -ParameterName=Temperature (Raw) -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub6] -ParameterName=VREFINT (Raw) -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub7] -ParameterName=VBAT (Raw) -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub8] -ParameterName=VBUSP Current (Raw) -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2100] -ParameterName=Error Status Bits -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x000A -AccessType=ro -DefaultValue=00 00 00 00 00 00 00 00 00 00 - diff --git a/src/l4/app_devboard/source/README.md b/src/l4/app_devboard/source/README.md deleted file mode 100644 index b6bc7530..00000000 --- a/src/l4/app_devboard/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/l4/app_devboard/source/blink.c b/src/l4/app_devboard/source/blink.c deleted file mode 100644 index 93010401..00000000 --- a/src/l4/app_devboard/source/blink.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "blink.h" - -/* Example blinker thread */ -THD_WORKING_AREA(blink_wa, 0x40); -THD_FUNCTION(blink, arg) -{ - (void)arg; - - palSetLineMode(LINE_LED,PAL_MODE_OUTPUT_PUSHPULL); - - while (!chThdShouldTerminateX()) { - palToggleLine(LINE_LED); - chThdSleepMilliseconds(500); - } - - palClearLine(LINE_LED); - chThdExit(MSG_OK); -} diff --git a/src/l4/app_devboard/source/blink.h b/src/l4/app_devboard/source/blink.h deleted file mode 100644 index c9178eb2..00000000 --- a/src/l4/app_devboard/source/blink.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _BLINK_H_ -#define _BLINK_H_ - -#include "ch.h" -#include "hal.h" - -/* Example blinker thread prototypes */ -extern THD_WORKING_AREA(blink_wa, 0x40); -extern THD_FUNCTION(blink, arg); - -#endif diff --git a/src/l4/app_devboard_cpp/Makefile b/src/l4/app_devboard_cpp/Makefile deleted file mode 100644 index 6b3f8672..00000000 --- a/src/l4/app_devboard_cpp/Makefile +++ /dev/null @@ -1,217 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -Og -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -std=gnu++11 -fno-exceptions -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = app_devboard_cpp - -# Target settings. -MCU = cortex-m4 -BOARD = ST_NUCLEO64_L452RE_P - -#Project sources. -PROJ_ROOT = ../../.. -APP_ROOT = . -PROJ_SRC = $(PROJ_ROOT)/common -PROJ_INC = $(PROJ_SRC)/include -TOOLCHAIN = $(PROJ_ROOT)/toolchain -ODDIR := $(APP_ROOT)/od - -# Imported source files and paths. -CHIBIOS := $(PROJ_ROOT)/ext/ChibiOS -CONFDIR := $(APP_ROOT)/cfg -BUILDDIR := $(APP_ROOT)/build -DEPDIR := $(APP_ROOT)/.dep - -#Board specific directories. -BOARDDIR = $(PROJ_ROOT)/boards/$(BOARD) - -ifeq ($(ORESAT),) - ORESAT = 0.5 -endif - -# generate OD.c/OD.h from oresat-configs -FW_VERSION = $(shell git describe --always) -$(shell oresat-gen-fw-files --oresat $(ORESAT) base -d $(ODDIR) -fw $(FW_VERSION) -hw $(BOARD)) -# add them -ALLCSRC += $(ODDIR)/OD.c -ALLINC += $(ODDIR) - -# Project specific files. -include $(PROJ_SRC)/oresat.mk - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32l4xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk -include $(BOARDDIR)/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -#include $(CHIBIOS)/test/lib/test.mk -#include $(CHIBIOS)/test/rt/rt_test.mk -#include $(CHIBIOS)/test/oslib/oslib_test.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(PROJ_ROOT)/ld/STM32L452xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) \ - $(TESTSRC) - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) \ - main.cpp - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = $(PROJ_INC) - -# List the user directory to look for the libraries here -ULIBDIR = $(PROJ_SRC) - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk -include $(TOOLCHAIN)/toolchain.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/src/l4/app_devboard_cpp/README.md b/src/l4/app_devboard_cpp/README.md deleted file mode 100644 index 1df5134b..00000000 --- a/src/l4/app_devboard_cpp/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Application Main Directory -## Directory Structure -This folder contains the root of an applications sources. It contains -several files and folders: -* [main.c](main.c): The main program file called by ChibiOS. Contains - initialization code and registers threads and functions. -* [Makefile](Makefile): The main Makefile for the application. Sources - all other build files. -* [cfg](cfg): The directory containing ChibiOS's configuration files for - this application. -* [source](source): The directory where application code is put. - Everything within this directory automatically builds. diff --git a/src/l4/app_devboard_cpp/cfg/CO_driver_custom.h b/src/l4/app_devboard_cpp/cfg/CO_driver_custom.h deleted file mode 100644 index 4d72b881..00000000 --- a/src/l4/app_devboard_cpp/cfg/CO_driver_custom.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef CO_DRIVER_CUSTOM_H -#define CO_DRIVER_CUSTOM_H - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CO_DRIVER_CUSTOM_H */ diff --git a/src/l4/app_devboard_cpp/cfg/chconf.h b/src/l4/app_devboard_cpp/cfg/chconf.h deleted file mode 100644 index 29b34229..00000000 --- a/src/l4/app_devboard_cpp/cfg/chconf.h +++ /dev/null @@ -1,763 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 10000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY FALSE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS TRUE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE TRUE -#endif - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/src/l4/app_devboard_cpp/cfg/halconf.h b/src/l4/app_devboard_cpp/cfg/halconf.h deleted file mode 100644 index 1b285cb2..00000000 --- a/src/l4/app_devboard_cpp/cfg/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS TRUE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 115200 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/src/l4/app_devboard_cpp/cfg/mcuconf.h b/src/l4/app_devboard_cpp/cfg/mcuconf.h deleted file mode 100644 index 10774df3..00000000 --- a/src/l4/app_devboard_cpp/cfg/mcuconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#ifndef MCUCONF_H -#define MCUCONF_H - -#define STM32L4xx_MCUCONF -#define STM32L452_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_VOS STM32_VOS_RANGE1 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI16_ENABLED FALSE -#define STM32_HSI48_ENABLED FALSE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_MSIPLL_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_4M -#define STM32_MSISRANGE STM32_MSISRANGE_4M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_MSI -#define STM32_PLLM_VALUE 1 -#define STM32_PLLN_VALUE 80 -#define STM32_PLLPDIV_VALUE 0 -#define STM32_PLLP_VALUE 7 -#define STM32_PLLQ_VALUE 6 -#define STM32_PLLR_VALUE 4 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_STOPWUCK STM32_STOPWUCK_MSI -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_LSCOSEL STM32_LSCOSEL_NOCLOCK -#define STM32_PLLSAI1N_VALUE 72 -#define STM32_PLLSAI1PDIV_VALUE 6 -#define STM32_PLLSAI1P_VALUE 7 -#define STM32_PLLSAI1Q_VALUE 6 -#define STM32_PLLSAI1R_VALUE 6 - -/* - * Peripherals clock sources. - */ -#define STM32_USART1SEL STM32_USART1SEL_SYSCLK -#define STM32_USART2SEL STM32_USART2SEL_SYSCLK -#define STM32_USART3SEL STM32_USART3SEL_SYSCLK -#define STM32_UART4SEL STM32_UART4SEL_SYSCLK -#define STM32_LPUART1SEL STM32_LPUART1SEL_SYSCLK -#define STM32_I2C1SEL STM32_I2C1SEL_SYSCLK -#define STM32_I2C2SEL STM32_I2C2SEL_SYSCLK -#define STM32_I2C3SEL STM32_I2C3SEL_SYSCLK -#define STM32_I2C4SEL STM32_I2C4SEL_SYSCLK -#define STM32_LPTIM1SEL STM32_LPTIM1SEL_PCLK1 -#define STM32_LPTIM2SEL STM32_LPTIM2SEL_PCLK1 -#define STM32_SAI1SEL STM32_SAI1SEL_OFF -#define STM32_CLK48SEL STM32_CLK48SEL_PLLSAI1 -#define STM32_ADCSEL STM32_ADCSEL_SYSCLK -#define STM32_SWPMI1SEL STM32_SWPMI1SEL_PCLK1 -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI1635_38_PRIORITY 6 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 -#define STM32_IRQ_EXTI20_PRIORITY 6 -#define STM32_IRQ_EXTI21_22_PRIORITY 15 - -#define STM32_IRQ_TIM1_BRK_TIM15_PRIORITY 7 -#define STM32_IRQ_TIM1_UP_TIM16_PRIORITY 7 -#define STM32_IRQ_TIM1_TRGCO_TIM17_PRIORITY 7 -#define STM32_IRQ_TIM1_CC_PRIORITY 7 -#define STM32_IRQ_TIM2_PRIORITY 7 -#define STM32_IRQ_TIM3_PRIORITY 7 -#define STM32_IRQ_TIM6_PRIORITY 7 - -#define STM32_IRQ_USART1_PRIORITY 12 -#define STM32_IRQ_USART2_PRIORITY 12 -#define STM32_IRQ_USART3_PRIORITY 12 -#define STM32_IRQ_UART4_PRIORITY 12 -#define STM32_IRQ_LPUART1_PRIORITY 12 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_COMPACT_SAMPLES FALSE -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC123_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC123_PRESC ADC_CCR_PRESC_DIV2 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * DAC driver system settings. - */ -#define STM32_DAC_USE_DAC1_CH1 FALSE -#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 -#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 -#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM15 FALSE -#define STM32_GPT_USE_TIM16 FALSE - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_USE_I2C4 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_I2C_I2C4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C4_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C4_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM15 FALSE -#define STM32_ICU_USE_TIM16 FALSE - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM15 FALSE -#define STM32_PWM_USE_TIM16 FALSE - -/* - * RTC driver system settings. - */ -#define STM32_RTC_PRESA_VALUE 32 -#define STM32_RTC_PRESS_VALUE 1024 -#define STM32_RTC_CR_INIT 0 -#define STM32_RTC_TAMPCR_INIT 0 - -/* - * SDC driver system settings. - */ -#define STM32_SDC_USE_SDMMC1 FALSE -#define STM32_SDC_SDMMC_UNALIGNED_SUPPORT TRUE -#define STM32_SDC_SDMMC_WRITE_TIMEOUT 1000 -#define STM32_SDC_SDMMC_READ_TIMEOUT 1000 -#define STM32_SDC_SDMMC_CLOCK_DELAY 10 -#define STM32_SDC_SDMMC1_DMA_PRIORITY 3 -#define STM32_SDC_SDMMC1_IRQ_PRIORITY 9 -#define STM32_SDC_SDMMC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_LPUART1 TRUE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_LPUART1_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * TRNG driver system settings. - */ -#define STM32_TRNG_USE_RNG1 FALSE - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_UART4 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 6) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_UART4_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_UART4_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -/* - * WSPI driver system settings. - */ -#define STM32_WSPI_USE_QUADSPI1 FALSE -#define STM32_WSPI_QUADSPI1_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) - -#endif /* MCUCONF_H */ diff --git a/src/l4/app_devboard_cpp/main.cpp b/src/l4/app_devboard_cpp/main.cpp deleted file mode 100644 index eca517c2..00000000 --- a/src/l4/app_devboard_cpp/main.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* ChibiOS header files */ -#include "ch.h" -#include "hal.h" - -/* Project header files */ -#include "oresat.h" -#include "blink.h" - -static worker_t worker1; -static thread_descriptor_t worker1_desc = { - .name = "Example blinky thread", - .wbase = THD_WORKING_AREA_BASE(blink_wa), - .wend = THD_WORKING_AREA_END(blink_wa), - .prio = NORMALPRIO, - .funcp = blink, - .arg = NULL -}; - -static oresat_config_t oresat_conf = { - .cand = &CAND1, - .node_id = ORESAT_DEFAULT_ID, - .bitrate = ORESAT_DEFAULT_BITRATE, -}; - -/** - * @brief App Initialization - */ -static void app_init(void) -{ - /* App initialization */ - reg_worker(&worker1, &worker1_desc, false, true); - - /* Start up debug output */ - sdStart(&LPSD1, NULL); -} - -/** - * @brief Main Application - */ -int main(void) -{ - // Initialize and start - oresat_init(&oresat_conf); - app_init(); - oresat_start(); - return 0; -} diff --git a/src/l4/app_devboard_cpp/od/app.eds b/src/l4/app_devboard_cpp/od/app.eds deleted file mode 100644 index 116bbad9..00000000 --- a/src/l4/app_devboard_cpp/od/app.eds +++ /dev/null @@ -1,4863 +0,0 @@ -[FileInfo] -FileName=app.eds -FileVersion=0 -FileRevision=1 -EDSVersion=4.0 -Description=OreSat Template Application Object Dictionary -CreationTime=02:51PM -CreationDate=08-12-2019 -CreatedBy=Miles Simpson -ModificationTime=11:45AM -ModificationDate=04-25-2021 -ModifiedBy= - -[DeviceInfo] -VendorName=Portland State Aerospace Society -VendorNumber=0 -ProductName=OreSat Template -ProductNumber=0 -RevisionNumber=0 -OrderCode= -BaudRate_10=1 -BaudRate_20=1 -BaudRate_50=1 -BaudRate_125=1 -BaudRate_250=1 -BaudRate_500=1 -BaudRate_800=1 -BaudRate_1000=1 -SimpleBootUpMaster=0 -SimpleBootUpSlave=0 -Granularity=0 -DynamicChannelsSupported=0 -GroupMessaging=0 -NrOfRXPDO=16 -NrOfTXPDO=16 -LSS_Supported=0 - -[DummyUsage] -Dummy0000=1 -Dummy0001=1 -Dummy0002=1 -Dummy0003=1 -Dummy0004=1 -Dummy0005=1 -Dummy0006=1 -Dummy0007=1 - -[Comments] -Lines=0 - -[MandatoryObjects] -SupportedObjects=3 -1=0x1000 -2=0x1001 -3=0x1018 - -[1000] -ParameterName=Device type -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1001] -ParameterName=Error register -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=ro -DefaultValue=0x00 -PDOMapping=1 - -[1018] -ParameterName=Identity -ObjectType=0x09 -;StorageLocation=ROM -SubNumber=5 - -[1018sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=const -DefaultValue=0x04 - -[1018sub1] -ParameterName=Vendor-ID -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1018sub2] -ParameterName=Product code -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1018sub3] -ParameterName=Revision number -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1018sub4] -ParameterName=Serial number -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[OptionalObjects] -SupportedObjects=82 -1=0x1002 -2=0x1003 -3=0x1005 -4=0x1006 -5=0x1007 -6=0x1008 -7=0x1009 -8=0x100A -9=0x1010 -10=0x1011 -11=0x1014 -12=0x1015 -13=0x1016 -14=0x1017 -15=0x1019 -16=0x1029 -17=0x1200 -18=0x1400 -19=0x1401 -20=0x1402 -21=0x1403 -22=0x1404 -23=0x1405 -24=0x1406 -25=0x1407 -26=0x1408 -27=0x1409 -28=0x140A -29=0x140B -30=0x140C -31=0x140D -32=0x140E -33=0x140F -34=0x1600 -35=0x1601 -36=0x1602 -37=0x1603 -38=0x1604 -39=0x1605 -40=0x1606 -41=0x1607 -42=0x1608 -43=0x1609 -44=0x160A -45=0x160B -46=0x160C -47=0x160D -48=0x160E -49=0x160F -50=0x1800 -51=0x1801 -52=0x1802 -53=0x1803 -54=0x1804 -55=0x1805 -56=0x1806 -57=0x1807 -58=0x1808 -59=0x1809 -60=0x180A -61=0x180B -62=0x180C -63=0x180D -64=0x180E -65=0x180F -66=0x1A00 -67=0x1A01 -68=0x1A02 -69=0x1A03 -70=0x1A04 -71=0x1A05 -72=0x1A06 -73=0x1A07 -74=0x1A08 -75=0x1A09 -76=0x1A0A -77=0x1A0B -78=0x1A0C -79=0x1A0D -80=0x1A0E -81=0x1A0F -82=0x1F80 - -[1002] -ParameterName=Manufacturer status register -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[1003] -ParameterName=Pre-defined error field -ObjectType=0x08 -;StorageLocation=RAM -SubNumber=9 - -[1003sub0] -ParameterName=Number of errors -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1003sub1] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub2] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub3] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub4] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub5] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub6] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub7] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1003sub8] -ParameterName=Standard error field -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0x00000000 - -[1005] -ParameterName=COB-ID SYNC message -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000080 - -[1006] -ParameterName=Communication cycle period -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0 - -[1007] -ParameterName=Synchronous window length -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0 - -[1008] -ParameterName=Manufacturer device name -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0009 -AccessType=ro -DefaultValue=OreSat Node - -[1009] -ParameterName=Manufacturer hardware version -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0009 -AccessType=ro -DefaultValue=0.0 - -[100A] -ParameterName=Manufacturer software version -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0009 -AccessType=ro -DefaultValue=0.0.0 - -[1010] -ParameterName=Store parameters -ObjectType=0x08 -;StorageLocation=RAM -SubNumber=5 - -[1010sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x04 - -[1010sub1] -ParameterName=Save all parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1010sub2] -ParameterName=Save communication parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1010sub3] -ParameterName=Save application parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1010sub4] -ParameterName=Save manufacturer defined parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1011] -ParameterName=Restore default parameters -ObjectType=0x08 -;StorageLocation=RAM -SubNumber=5 - -[1011sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x04 - -[1011sub1] -ParameterName=Restore all default parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1011sub2] -ParameterName=Restore communication default parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1011sub3] -ParameterName=Restore application default parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1011sub4] -ParameterName=Restore manufacturer defined default parameters -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000001 - -[1014] -ParameterName=COB-ID EMCY -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80+$NODEID - -[1015] -ParameterName=Inhibit time EMCY -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1016] -ParameterName=Consumer heartbeat time -ObjectType=0x08 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1016sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1016sub1] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub2] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub3] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub4] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub5] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub6] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub7] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1016sub8] -ParameterName=Consumer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1017] -ParameterName=Producer heartbeat time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=1000 - -[1019] -ParameterName=Synchronous counter overflow value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1029] -ParameterName=Error behavior -ObjectType=0x08 -;StorageLocation=ROM -SubNumber=7 - -[1029sub0] -ParameterName=max sub-index -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=const -DefaultValue=0x06 - -[1029sub1] -ParameterName=Communication -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub2] -ParameterName=Communication other -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub3] -ParameterName=Communication passive -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub4] -ParameterName=Generic -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub5] -ParameterName=Device profile -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1029sub6] -ParameterName=Manufacturer specific -ObjectType=0x07 -;StorageLocation=ROM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1200] -ParameterName=SDO server parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1200sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1200sub1] -ParameterName=COB-ID client to server -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000000 -PDOMapping=1 - -[1200sub2] -ParameterName=COB-ID server to client -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000000 -PDOMapping=1 - -[1200sub3] -ParameterName=Node-ID of the SDO client -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0x01 - -[1400] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1400sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1400sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000200+$NODEID - -[1400sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1400sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1401] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1401sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1401sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000300+$NODEID - -[1401sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1401sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1402] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1402sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1402sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000400+$NODEID - -[1402sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1402sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1403] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1403sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1403sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000500+$NODEID - -[1403sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1403sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1404] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1404sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1404sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000200+$NODEID - -[1404sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1404sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1405] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1405sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1405sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000300+$NODEID - -[1405sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1405sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1406] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1406sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1406sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000400+$NODEID - -[1406sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1406sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1407] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1407sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1407sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000500+$NODEID - -[1407sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1407sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1408] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1408sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1408sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000200+$NODEID - -[1408sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1408sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1409] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[1409sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[1409sub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000300+$NODEID - -[1409sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1409sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140A] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Asub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Asub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000400+$NODEID - -[140Asub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Asub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140B] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Bsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Bsub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000500+$NODEID - -[140Bsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Bsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140C] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Csub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Csub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000200+$NODEID - -[140Csub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Csub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140D] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Dsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Dsub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000300+$NODEID - -[140Dsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Dsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140E] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Esub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Esub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000400+$NODEID - -[140Esub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Esub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[140F] -ParameterName=RPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=4 - -[140Fsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[140Fsub1] -ParameterName=COB-ID used by RPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x80000500+$NODEID - -[140Fsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[140Fsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1600] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1600sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1600sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1600sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1601sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1601sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1601sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1602sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1602sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1602sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1603sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1603sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1603sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1604sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1604sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1604sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1605sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1605sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1605sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1606sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1606sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1606sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1607sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1607sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1607sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1608sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1608sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1608sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1609sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1609sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1609sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160A] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Asub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Asub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Asub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160B] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Bsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Bsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Bsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160C] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Csub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Csub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Csub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160D] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Dsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Dsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Dsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160E] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Esub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Esub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Esub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160F] -ParameterName=RPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[160Fsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[160Fsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[160Fsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1800] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1800sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1800sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000180+$NODEID - -[1800sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1800sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1800sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1800sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1801] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1801sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1801sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000280+$NODEID - -[1801sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1801sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1801sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1801sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1802] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1802sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1802sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000380+$NODEID - -[1802sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1802sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1802sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1802sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1803] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1803sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1803sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000480+$NODEID - -[1803sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1803sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1803sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1803sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1804] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1804sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1804sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000180+$NODEID - -[1804sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1804sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1804sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1804sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1805] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1805sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1805sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000280+$NODEID - -[1805sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1805sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1805sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1805sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1806] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1806sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1806sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000380+$NODEID - -[1806sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1806sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1806sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1806sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1807] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1807sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1807sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000480+$NODEID - -[1807sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1807sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1807sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1807sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1808] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1808sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1808sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000180+$NODEID - -[1808sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1808sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1808sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1808sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1809] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[1809sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[1809sub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000280+$NODEID - -[1809sub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[1809sub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1809sub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[1809sub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180A] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Asub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Asub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000380+$NODEID - -[180Asub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Asub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Asub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Asub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180B] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Bsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Bsub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000480+$NODEID - -[180Bsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Bsub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Bsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Bsub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180C] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Csub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Csub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000180+$NODEID - -[180Csub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Csub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Csub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Csub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180D] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Dsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Dsub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000280+$NODEID - -[180Dsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Dsub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Dsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Dsub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180E] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Esub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Esub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000380+$NODEID - -[180Esub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Esub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Esub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Esub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[180F] -ParameterName=TPDO communication parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=6 - -[180Fsub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x05 - -[180Fsub1] -ParameterName=COB-ID used by TPDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0xC0000480+$NODEID - -[180Fsub2] -ParameterName=Transmission type -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=254 - -[180Fsub3] -ParameterName=Inhibit time -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Fsub5] -ParameterName=Event timer -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0006 -AccessType=rw -DefaultValue=0 - -[180Fsub6] -ParameterName=SYNC start value -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[1A00] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A00sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A00sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A00sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A01sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A01sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A01sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A02sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A02sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A02sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A03sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A03sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A03sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A04sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A04sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A04sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A05sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A05sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A05sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A06sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A06sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A06sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A07sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A07sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A07sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A08sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A08sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A08sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A09sub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A09sub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A09sub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0A] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Asub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Asub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Asub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0B] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Bsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Bsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Bsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0C] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Csub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Csub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Csub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0D] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Dsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Dsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Dsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0E] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Esub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Esub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Esub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0F] -ParameterName=TPDO mapping parameter -ObjectType=0x09 -;StorageLocation=PERSIST_COMM -SubNumber=9 - -[1A0Fsub0] -ParameterName=Number of mapped application objects in PDO -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[1A0Fsub1] -ParameterName=Application object 1 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub2] -ParameterName=Application object 2 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub3] -ParameterName=Application object 3 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub4] -ParameterName=Application object 4 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub5] -ParameterName=Application object 5 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub6] -ParameterName=Application object 6 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub7] -ParameterName=Application object 7 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1A0Fsub8] -ParameterName=Application object 8 -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000000 - -[1F80] -ParameterName=NMTStartup -ObjectType=0x07 -;StorageLocation=PERSIST_COMM -DataType=0x0007 -AccessType=rw -DefaultValue=0x00000008 - -[ManufacturerObjects] -SupportedObjects=7 -1=0x2000 -2=0x2010 -3=0x2011 -4=0x2020 -5=0x2021 -6=0x2022 -7=0x2100 - -[2000] -ParameterName=BUS Management -ObjectType=0x09 -;StorageLocation=PERSIST_MFR -SubNumber=5 - -[2000sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=const -DefaultValue=0x04 - -[2000sub1] -ParameterName=Bdefault -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[2000sub2] -ParameterName=Ttoggle -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[2000sub3] -ParameterName=Ntoggle -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[2000sub4] -ParameterName=Ctoggle -ObjectType=0x07 -;StorageLocation=PERSIST_MFR -DataType=0x0005 -AccessType=rw -DefaultValue=0 - -[2010] -ParameterName=SCET -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x001B -AccessType=rw -DefaultValue=0 -PDOMapping=1 - -[2011] -ParameterName=UTC -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x001B -AccessType=rw -DefaultValue=0 -PDOMapping=1 - -[2020] -ParameterName=MCU Unique Device ID -ObjectType=0x08 -;StorageLocation=RAM -SubNumber=4 - -[2020sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[2020sub1] -ParameterName=UID -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0 - -[2020sub2] -ParameterName=UID -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0 - -[2020sub3] -ParameterName=UID -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0007 -AccessType=ro -DefaultValue=0 - -[2021] -ParameterName=MCU Calibration -ObjectType=0x09 -;StorageLocation=RAM -SubNumber=4 - -[2021sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x03 - -[2021sub1] -ParameterName=TS_CAL1 -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 - -[2021sub2] -ParameterName=TS_CAL2 -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 - -[2021sub3] -ParameterName=VREFINT_CAL -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 - -[2022] -ParameterName=MCU Sensors -ObjectType=0x09 -;StorageLocation=RAM -SubNumber=9 - -[2022sub0] -ParameterName=Highest sub-index supported -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=const -DefaultValue=0x08 - -[2022sub1] -ParameterName=Temperature -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0002 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub2] -ParameterName=VREFINT -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub3] -ParameterName=VBAT -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub4] -ParameterName=VBUSP Current -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0005 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub5] -ParameterName=Temperature (Raw) -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub6] -ParameterName=VREFINT (Raw) -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub7] -ParameterName=VBAT (Raw) -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2022sub8] -ParameterName=VBUSP Current (Raw) -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x0006 -AccessType=ro -DefaultValue=0 -PDOMapping=1 - -[2100] -ParameterName=Error Status Bits -ObjectType=0x07 -;StorageLocation=RAM -DataType=0x000A -AccessType=ro -DefaultValue=00 00 00 00 00 00 00 00 00 00 - diff --git a/src/l4/app_devboard_cpp/source/README.md b/src/l4/app_devboard_cpp/source/README.md deleted file mode 100644 index a38d5d9b..00000000 --- a/src/l4/app_devboard_cpp/source/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# App-specific Source - -Put any .h or .c files (besides main.c) you want to compile with your app in here. They will automatically build when you run make. - -If you don't want them to build, move them to another directory or the app's top level directory to effectively "disable" them. diff --git a/src/l4/app_devboard_cpp/source/blink.cpp b/src/l4/app_devboard_cpp/source/blink.cpp deleted file mode 100644 index 93010401..00000000 --- a/src/l4/app_devboard_cpp/source/blink.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "blink.h" - -/* Example blinker thread */ -THD_WORKING_AREA(blink_wa, 0x40); -THD_FUNCTION(blink, arg) -{ - (void)arg; - - palSetLineMode(LINE_LED,PAL_MODE_OUTPUT_PUSHPULL); - - while (!chThdShouldTerminateX()) { - palToggleLine(LINE_LED); - chThdSleepMilliseconds(500); - } - - palClearLine(LINE_LED); - chThdExit(MSG_OK); -} diff --git a/src/l4/app_devboard_cpp/source/blink.h b/src/l4/app_devboard_cpp/source/blink.h deleted file mode 100644 index c9178eb2..00000000 --- a/src/l4/app_devboard_cpp/source/blink.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _BLINK_H_ -#define _BLINK_H_ - -#include "ch.h" -#include "hal.h" - -/* Example blinker thread prototypes */ -extern THD_WORKING_AREA(blink_wa, 0x40); -extern THD_FUNCTION(blink, arg); - -#endif

j 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](yK`Eg#v& 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 z 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 m{?i}$9UUfmO-&&}S@f3UUBj>IK*A2)A^jD!xx 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�PRe24)s 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�Sddc%Q#!Fxp%%dW>%uAE^V&@7-W(i}2}0 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�dB2_v`mBEbP~lu4$MBvOWj>oM$4gIVg8* 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