From dae8a7f51ab70afea6a656941ed4338dc8a2ead7 Mon Sep 17 00:00:00 2001 From: neo Date: Mon, 3 Jun 2024 17:22:54 +0200 Subject: [PATCH] main fts module dev --- boards/px4/fmu-v6c/default.px4board | 1 + .../px4/fmu-v6c/nuttx-config/include/board.h | 5 +- boards/px4/fmu-v6u/default.px4board | 97 --- .../fmu-v6u/extras/px4_fmu-v6u_bootloader.bin | Bin 43232 -> 0 bytes boards/px4/fmu-v6u/firmware.prototype | 13 - boards/px4/fmu-v6u/init/rc.board_defaults | 6 - boards/px4/fmu-v6u/init/rc.board_sensors | 25 - .../fmu-v6u/nuttx-config/bootloader/defconfig | 90 --- .../px4/fmu-v6u/nuttx-config/include/board.h | 530 ----------------- .../nuttx-config/include/board_dma_map.h | 48 -- boards/px4/fmu-v6u/nuttx-config/nsh/defconfig | 275 --------- .../nuttx-config/scripts/bootloader_script.ld | 215 ------- .../fmu-v6u/nuttx-config/scripts/script.ld | 229 ------- boards/px4/fmu-v6u/src/CMakeLists.txt | 71 --- boards/px4/fmu-v6u/src/board_config.h | 440 -------------- boards/px4/fmu-v6u/src/bootloader_main.c | 75 --- boards/px4/fmu-v6u/src/hw_config.h | 128 ---- boards/px4/fmu-v6u/src/i2c.cpp | 41 -- boards/px4/fmu-v6u/src/init.c | 278 --------- boards/px4/fmu-v6u/src/led.c | 235 -------- boards/px4/fmu-v6u/src/manifest.c | 131 ---- boards/px4/fmu-v6u/src/spi.cpp | 58 -- boards/px4/fmu-v6u/src/timer_config.cpp | 80 --- boards/px4/fmu-v6x/bootloader.px4board | 3 - .../fmu-v6x/extras/px4_fmu-v6x_bootloader.bin | Bin 46688 -> 0 bytes boards/px4/fmu-v6x/init/rc.board_defaults | 21 - boards/px4/fmu-v6x/init/rc.board_sensors | 134 ----- boards/px4/fmu-v6x/nuttx-config/Kconfig | 17 - .../fmu-v6x/nuttx-config/bootloader/defconfig | 95 --- .../px4/fmu-v6x/nuttx-config/include/board.h | 558 ------------------ .../nuttx-config/include/board_dma_map.h | 87 --- boards/px4/fmu-v6x/nuttx-config/nsh/defconfig | 328 ---------- .../nuttx-config/scripts/bootloader_script.ld | 215 ------- .../fmu-v6x/nuttx-config/scripts/script.ld | 229 ------- boards/px4/fmu-v6x/src/CMakeLists.txt | 76 --- boards/px4/fmu-v6x/src/board_config.h | 534 ----------------- boards/px4/fmu-v6x/src/can.c | 142 ----- boards/px4/fmu-v6x/src/hw_config.h | 128 ---- boards/px4/fmu-v6x/src/i2c.cpp | 41 -- boards/px4/fmu-v6x/src/init.c | 286 --------- boards/px4/fmu-v6x/src/led.c | 235 -------- boards/px4/fmu-v6x/src/manifest.c | 205 ------- boards/px4/fmu-v6x/src/mtd.cpp | 133 ----- boards/px4/fmu-v6x/src/sdio.c | 177 ------ boards/px4/fmu-v6x/src/spi.cpp | 321 ---------- boards/px4/fmu-v6x/src/timer_config.cpp | 80 --- boards/px4/fmu-v6x/src/usb.c | 105 ---- .../{fmu-v6u => fts-auto}/bootloader.px4board | 0 .../{fmu-v6x => fts-auto}/default.px4board | 29 +- .../extras/px4_fmu-v6c_bootloader.bin | Bin 0 -> 46040 bytes .../extras/px4_io-v2_default.bin | Bin .../{fmu-v6x => fts-auto}/firmware.prototype | 6 +- boards/px4/fts-auto/init/rc.board_defaults | 13 + boards/px4/fts-auto/init/rc.board_sensors | 21 + .../nuttx-config/Kconfig | 0 .../nuttx-config/bootloader/defconfig | 6 +- .../nuttx-config/include/board.h | 48 +- .../nuttx-config/include/board_dma_map.h | 0 .../nuttx-config/nsh/defconfig | 6 +- .../nuttx-config/scripts/bootloader_script.ld | 0 .../nuttx-config/scripts/script.ld | 0 .../src/CMakeLists.txt | 0 .../src/board_config.h | 19 +- .../src/bootloader_main.c | 0 boards/px4/{fmu-v6u => fts-auto}/src/can.c | 0 .../{fts-proto => fts-auto}/src/hw_config.h | 0 .../px4/{fts-proto => fts-auto}/src/i2c.cpp | 0 boards/px4/{fts-proto => fts-auto}/src/init.c | 0 boards/px4/{fts-proto => fts-auto}/src/led.c | 0 .../{fts-proto => fts-auto}/src/manifest.c | 16 + .../px4/{fts-proto => fts-auto}/src/mtd.cpp | 4 +- boards/px4/{fmu-v6u => fts-auto}/src/sdio.c | 0 .../px4/{fts-proto => fts-auto}/src/spi.cpp | 0 .../src/timer_config.cpp | 0 boards/px4/{fmu-v6u => fts-auto}/src/usb.c | 0 boards/px4/fts-can/default.px4board | 13 +- .../fts-can/extras/px4_fts-can_bootloader.bin | Bin 0 -> 46060 bytes boards/px4/fts-can/firmware.prototype | 4 +- boards/px4/fts-can/init/rc.board_defaults | 33 +- boards/px4/fts-can/init/rc.board_sensors | 17 +- .../px4/fts-can/nuttx-config/include/board.h | 98 +-- boards/px4/fts-can/src/board_config.h | 41 +- boards/px4/fts-can/src/mtd.cpp | 4 +- boards/px4/fts-proto/bootloader.px4board | 3 - boards/px4/fts-proto/default.px4board | 35 -- .../extras/px4_fmu-v6c_bootloader.bin | Bin 46288 -> 0 bytes .../fts-proto/extras/px4_io-v2_default.bin | Bin 40140 -> 0 bytes boards/px4/fts-proto/firmware.prototype | 13 - boards/px4/fts-proto/init/rc.board_defaults | 35 -- boards/px4/fts-proto/init/rc.board_sensors | 6 - boards/px4/fts-proto/nuttx-config/Kconfig | 17 - boards/px4/fts-proto/src/bootloader_main.c | 62 -- boards/px4/fts-proto/src/can.c | 128 ---- boards/px4/fts-proto/src/sdio.c | 177 ------ boards/px4/fts-proto/src/usb.c | 105 ---- boards/px4/io-v2/default.px4board | 5 + .../px4/io-v2/extras/px4_io-v2_bootloader.bin | Bin 0 -> 4096 bytes boards/px4/io-v2/firmware.prototype | 13 + boards/px4/io-v2/nuttx-config/include/board.h | 141 +++++ boards/px4/io-v2/nuttx-config/nsh/defconfig | 61 ++ .../px4/io-v2/nuttx-config/scripts/script.ld | 131 ++++ .../upload.cmake => io-v2/src/CMakeLists.txt} | 21 +- boards/px4/io-v2/src/board_config.h | 165 ++++++ boards/px4/io-v2/src/init.c | 163 +++++ .../mtd.cpp => io-v2/src/timer_config.cpp} | 64 +- build_afts.sh | 5 +- build_bl.sh | 3 +- build_mfts.sh | 7 +- flash_afts.sh | 6 + flash_bl.sh | 3 + flash_fw.sh | 6 - flash_mfts.sh | 7 + init.sh | 10 +- src/drivers/fts/fts.cpp | 13 - 114 files changed, 883 insertions(+), 8121 deletions(-) delete mode 100644 boards/px4/fmu-v6u/default.px4board delete mode 100755 boards/px4/fmu-v6u/extras/px4_fmu-v6u_bootloader.bin delete mode 100644 boards/px4/fmu-v6u/firmware.prototype delete mode 100644 boards/px4/fmu-v6u/init/rc.board_defaults delete mode 100644 boards/px4/fmu-v6u/init/rc.board_sensors delete mode 100644 boards/px4/fmu-v6u/nuttx-config/bootloader/defconfig delete mode 100644 boards/px4/fmu-v6u/nuttx-config/include/board.h delete mode 100644 boards/px4/fmu-v6u/nuttx-config/include/board_dma_map.h delete mode 100644 boards/px4/fmu-v6u/nuttx-config/nsh/defconfig delete mode 100644 boards/px4/fmu-v6u/nuttx-config/scripts/bootloader_script.ld delete mode 100644 boards/px4/fmu-v6u/nuttx-config/scripts/script.ld delete mode 100644 boards/px4/fmu-v6u/src/CMakeLists.txt delete mode 100644 boards/px4/fmu-v6u/src/board_config.h delete mode 100644 boards/px4/fmu-v6u/src/bootloader_main.c delete mode 100644 boards/px4/fmu-v6u/src/hw_config.h delete mode 100644 boards/px4/fmu-v6u/src/i2c.cpp delete mode 100644 boards/px4/fmu-v6u/src/init.c delete mode 100644 boards/px4/fmu-v6u/src/led.c delete mode 100644 boards/px4/fmu-v6u/src/manifest.c delete mode 100644 boards/px4/fmu-v6u/src/spi.cpp delete mode 100644 boards/px4/fmu-v6u/src/timer_config.cpp delete mode 100644 boards/px4/fmu-v6x/bootloader.px4board delete mode 100755 boards/px4/fmu-v6x/extras/px4_fmu-v6x_bootloader.bin delete mode 100644 boards/px4/fmu-v6x/init/rc.board_defaults delete mode 100644 boards/px4/fmu-v6x/init/rc.board_sensors delete mode 100644 boards/px4/fmu-v6x/nuttx-config/Kconfig delete mode 100644 boards/px4/fmu-v6x/nuttx-config/bootloader/defconfig delete mode 100644 boards/px4/fmu-v6x/nuttx-config/include/board.h delete mode 100644 boards/px4/fmu-v6x/nuttx-config/include/board_dma_map.h delete mode 100644 boards/px4/fmu-v6x/nuttx-config/nsh/defconfig delete mode 100644 boards/px4/fmu-v6x/nuttx-config/scripts/bootloader_script.ld delete mode 100644 boards/px4/fmu-v6x/nuttx-config/scripts/script.ld delete mode 100644 boards/px4/fmu-v6x/src/CMakeLists.txt delete mode 100644 boards/px4/fmu-v6x/src/board_config.h delete mode 100644 boards/px4/fmu-v6x/src/can.c delete mode 100644 boards/px4/fmu-v6x/src/hw_config.h delete mode 100644 boards/px4/fmu-v6x/src/i2c.cpp delete mode 100644 boards/px4/fmu-v6x/src/init.c delete mode 100644 boards/px4/fmu-v6x/src/led.c delete mode 100644 boards/px4/fmu-v6x/src/manifest.c delete mode 100644 boards/px4/fmu-v6x/src/mtd.cpp delete mode 100644 boards/px4/fmu-v6x/src/sdio.c delete mode 100644 boards/px4/fmu-v6x/src/spi.cpp delete mode 100644 boards/px4/fmu-v6x/src/timer_config.cpp delete mode 100644 boards/px4/fmu-v6x/src/usb.c rename boards/px4/{fmu-v6u => fts-auto}/bootloader.px4board (100%) rename boards/px4/{fmu-v6x => fts-auto}/default.px4board (80%) create mode 100755 boards/px4/fts-auto/extras/px4_fmu-v6c_bootloader.bin rename boards/px4/{fmu-v6x => fts-auto}/extras/px4_io-v2_default.bin (100%) rename boards/px4/{fmu-v6x => fts-auto}/firmware.prototype (59%) create mode 100644 boards/px4/fts-auto/init/rc.board_defaults create mode 100644 boards/px4/fts-auto/init/rc.board_sensors rename boards/px4/{fmu-v6u => fts-auto}/nuttx-config/Kconfig (100%) rename boards/px4/{fts-proto => fts-auto}/nuttx-config/bootloader/defconfig (94%) rename boards/px4/{fts-proto => fts-auto}/nuttx-config/include/board.h (89%) rename boards/px4/{fts-proto => fts-auto}/nuttx-config/include/board_dma_map.h (100%) rename boards/px4/{fts-proto => fts-auto}/nuttx-config/nsh/defconfig (97%) rename boards/px4/{fts-proto => fts-auto}/nuttx-config/scripts/bootloader_script.ld (100%) rename boards/px4/{fts-proto => fts-auto}/nuttx-config/scripts/script.ld (100%) rename boards/px4/{fts-proto => fts-auto}/src/CMakeLists.txt (100%) rename boards/px4/{fts-proto => fts-auto}/src/board_config.h (94%) rename boards/px4/{fmu-v6x => fts-auto}/src/bootloader_main.c (100%) rename boards/px4/{fmu-v6u => fts-auto}/src/can.c (100%) rename boards/px4/{fts-proto => fts-auto}/src/hw_config.h (100%) rename boards/px4/{fts-proto => fts-auto}/src/i2c.cpp (100%) rename boards/px4/{fts-proto => fts-auto}/src/init.c (100%) rename boards/px4/{fts-proto => fts-auto}/src/led.c (100%) rename boards/px4/{fts-proto => fts-auto}/src/manifest.c (90%) rename boards/px4/{fts-proto => fts-auto}/src/mtd.cpp (98%) rename boards/px4/{fmu-v6u => fts-auto}/src/sdio.c (100%) rename boards/px4/{fts-proto => fts-auto}/src/spi.cpp (100%) rename boards/px4/{fts-proto => fts-auto}/src/timer_config.cpp (100%) rename boards/px4/{fmu-v6u => fts-auto}/src/usb.c (100%) create mode 100755 boards/px4/fts-can/extras/px4_fts-can_bootloader.bin delete mode 100644 boards/px4/fts-proto/bootloader.px4board delete mode 100644 boards/px4/fts-proto/default.px4board delete mode 100755 boards/px4/fts-proto/extras/px4_fmu-v6c_bootloader.bin delete mode 100755 boards/px4/fts-proto/extras/px4_io-v2_default.bin delete mode 100644 boards/px4/fts-proto/firmware.prototype delete mode 100644 boards/px4/fts-proto/init/rc.board_defaults delete mode 100644 boards/px4/fts-proto/init/rc.board_sensors delete mode 100644 boards/px4/fts-proto/nuttx-config/Kconfig delete mode 100644 boards/px4/fts-proto/src/bootloader_main.c delete mode 100644 boards/px4/fts-proto/src/can.c delete mode 100644 boards/px4/fts-proto/src/sdio.c delete mode 100644 boards/px4/fts-proto/src/usb.c create mode 100644 boards/px4/io-v2/default.px4board create mode 100644 boards/px4/io-v2/extras/px4_io-v2_bootloader.bin create mode 100644 boards/px4/io-v2/firmware.prototype create mode 100644 boards/px4/io-v2/nuttx-config/include/board.h create mode 100644 boards/px4/io-v2/nuttx-config/nsh/defconfig create mode 100644 boards/px4/io-v2/nuttx-config/scripts/script.ld rename boards/px4/{fmu-v6x/cmake/upload.cmake => io-v2/src/CMakeLists.txt} (75%) create mode 100644 boards/px4/io-v2/src/board_config.h create mode 100644 boards/px4/io-v2/src/init.c rename boards/px4/{fmu-v6u/src/mtd.cpp => io-v2/src/timer_config.cpp} (58%) create mode 100755 flash_afts.sh delete mode 100755 flash_fw.sh create mode 100755 flash_mfts.sh diff --git a/boards/px4/fmu-v6c/default.px4board b/boards/px4/fmu-v6c/default.px4board index 94957c2..f669d83 100644 --- a/boards/px4/fmu-v6c/default.px4board +++ b/boards/px4/fmu-v6c/default.px4board @@ -13,6 +13,7 @@ CONFIG_DRIVERS_CAMERA_TRIGGER=y CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y CONFIG_COMMON_DISTANCE_SENSOR=y CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_FTS=n CONFIG_DRIVERS_GPS=y CONFIG_DRIVERS_HEATER=y CONFIG_DRIVERS_IMU_BOSCH_BMI055=y diff --git a/boards/px4/fmu-v6c/nuttx-config/include/board.h b/boards/px4/fmu-v6c/nuttx-config/include/board.h index e7fa4f6..8042d46 100644 --- a/boards/px4/fmu-v6c/nuttx-config/include/board.h +++ b/boards/px4/fmu-v6c/nuttx-config/include/board.h @@ -93,10 +93,9 @@ * CPUCLK <= 480 MHz */ -#define STM32_BOARD_USEHSI 1 -#define STM32_BOARD_HSIDIV 1 +#define STM32_BOARD_USEHSE -#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSI +#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE /* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR * diff --git a/boards/px4/fmu-v6u/default.px4board b/boards/px4/fmu-v6u/default.px4board deleted file mode 100644 index 50b4f6b..0000000 --- a/boards/px4/fmu-v6u/default.px4board +++ /dev/null @@ -1,97 +0,0 @@ -CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" -CONFIG_BOARD_ARCHITECTURE="cortex-m7" -CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" -CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS7" -CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS6" -CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS4" -CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS1" -CONFIG_DRIVERS_ADC_ADS1115=y -CONFIG_DRIVERS_ADC_BOARD_ADC=y -CONFIG_COMMON_BAROMETERS=y -CONFIG_DRIVERS_BATT_SMBUS=y -CONFIG_DRIVERS_CAMERA_CAPTURE=y -CONFIG_DRIVERS_CAMERA_TRIGGER=y -CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y -CONFIG_COMMON_DISTANCE_SENSOR=y -CONFIG_DRIVERS_DSHOT=y -CONFIG_DRIVERS_GPS=y -CONFIG_DRIVERS_HEATER=y -CONFIG_DRIVERS_IMU_BOSCH_BMI088=y -CONFIG_DRIVERS_IMU_INVENSENSE_ICM20602=y -CONFIG_DRIVERS_IMU_INVENSENSE_ICM20948=y -CONFIG_DRIVERS_IMU_INVENSENSE_ICM42605=y -CONFIG_DRIVERS_IRLOCK=y -CONFIG_COMMON_LIGHT=y -CONFIG_COMMON_MAGNETOMETER=y -CONFIG_COMMON_OPTICAL_FLOW=y -CONFIG_DRIVERS_PCA9685_PWM_OUT=y -CONFIG_DRIVERS_POWER_MONITOR_INA226=y -CONFIG_DRIVERS_PWM_OUT=y -CONFIG_DRIVERS_RC_INPUT=y -CONFIG_DRIVERS_SAFETY_BUTTON=y -CONFIG_DRIVERS_SMART_BATTERY_BATMON=y -CONFIG_COMMON_TELEMETRY=y -CONFIG_DRIVERS_TONE_ALARM=y -CONFIG_DRIVERS_UAVCAN=y -CONFIG_BOARD_UAVCAN_INTERFACES=1 -CONFIG_MODULES_AIRSPEED_SELECTOR=y -CONFIG_MODULES_BATTERY_STATUS=y -CONFIG_MODULES_CAMERA_FEEDBACK=y -CONFIG_MODULES_COMMANDER=y -CONFIG_MODULES_CONTROL_ALLOCATOR=y -CONFIG_MODULES_DATAMAN=y -CONFIG_MODULES_EKF2=y -CONFIG_MODULES_ESC_BATTERY=y -CONFIG_MODULES_EVENTS=y -CONFIG_MODULES_FLIGHT_MODE_MANAGER=y -CONFIG_MODULES_FW_ATT_CONTROL=y -CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=y -CONFIG_MODULES_FW_POS_CONTROL=y -CONFIG_MODULES_FW_RATE_CONTROL=y -CONFIG_MODULES_GIMBAL=y -CONFIG_MODULES_GYRO_CALIBRATION=y -CONFIG_MODULES_GYRO_FFT=y -CONFIG_MODULES_LAND_DETECTOR=y -CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=y -CONFIG_MODULES_LOAD_MON=y -CONFIG_MODULES_LOGGER=y -CONFIG_MODULES_MAG_BIAS_ESTIMATOR=y -CONFIG_MODULES_MANUAL_CONTROL=y -CONFIG_MODULES_MAVLINK=y -CONFIG_MODULES_MC_ATT_CONTROL=y -CONFIG_MODULES_MC_AUTOTUNE_ATTITUDE_CONTROL=y -CONFIG_MODULES_MC_HOVER_THRUST_ESTIMATOR=y -CONFIG_MODULES_MC_POS_CONTROL=y -CONFIG_MODULES_MC_RATE_CONTROL=y -CONFIG_MODULES_NAVIGATOR=y -CONFIG_MODULES_RC_UPDATE=y -CONFIG_MODULES_ROVER_POS_CONTROL=y -CONFIG_MODULES_SENSORS=y -CONFIG_MODULES_SIMULATION_SIMULATOR_SIH=y -CONFIG_MODULES_TEMPERATURE_COMPENSATION=y -CONFIG_MODULES_UXRCE_DDS_CLIENT=y -CONFIG_MODULES_VTOL_ATT_CONTROL=y -CONFIG_SYSTEMCMDS_ACTUATOR_TEST=y -CONFIG_SYSTEMCMDS_BSONDUMP=y -CONFIG_SYSTEMCMDS_DMESG=y -CONFIG_SYSTEMCMDS_DUMPFILE=y -CONFIG_SYSTEMCMDS_GPIO=y -CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y -CONFIG_SYSTEMCMDS_I2CDETECT=y -CONFIG_SYSTEMCMDS_LED_CONTROL=y -CONFIG_SYSTEMCMDS_MFT=y -CONFIG_SYSTEMCMDS_MTD=y -CONFIG_SYSTEMCMDS_NSHTERM=y -CONFIG_SYSTEMCMDS_PARAM=y -CONFIG_SYSTEMCMDS_PERF=y -CONFIG_SYSTEMCMDS_REBOOT=y -CONFIG_SYSTEMCMDS_SD_BENCH=y -CONFIG_SYSTEMCMDS_SD_STRESS=y -CONFIG_SYSTEMCMDS_SYSTEM_TIME=y -CONFIG_SYSTEMCMDS_TOP=y -CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y -CONFIG_SYSTEMCMDS_TUNE_CONTROL=y -CONFIG_SYSTEMCMDS_UORB=y -CONFIG_SYSTEMCMDS_VER=y -CONFIG_SYSTEMCMDS_WORK_QUEUE=y -CONFIG_EXAMPLES_FAKE_GPS=y diff --git a/boards/px4/fmu-v6u/extras/px4_fmu-v6u_bootloader.bin b/boards/px4/fmu-v6u/extras/px4_fmu-v6u_bootloader.bin deleted file mode 100755 index f5b0a7e5008ecb8c1c9834d31213e387270ceca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43232 zcmeFZd3;k<{y%)~lH|52ZMp#I0?oqG4Gb+v0Ubk9ZkM2CaYhzLgGJ}oDpWwN%9NC% zBIpQ|nSs`sQExqiS9d9~4=?#D3cwUprRT#l^Hu`dYVXOXH+VgQex-StY|mWLvQD;$UecwehlU zlhs1Y$F#Y6g^jM>sExI~@f#}(1)hu(nn#xq<7h{n&3J5-V|2;r;?1`7V?gpx$bEHhl9b7An_Lo#uUla=Q7#)T)8REJ4={tOg+gWy$vp=fn-~If9sl8 zGQSvY_Enad=~OuCn!!RVhvu@h%%6vVe`m!_Z+--X!C@>_UH|Y5oM{PoOO# z4(PFsm4zwNR_?Z|%l0z$%*;hTQot@!ZrV!pc%~s_AS76=WERV5Zekf`qtHfTir7VZ z1RkLe={Y=EL=0qs4)Hq?<{>OX5Sr5+jFA{9#2Abwtt1{nhmb5qThoedvJPKU@s;++ zh0*IDAo7z+C=e4G6^10ijM0^ogwdur7b-%I9U;CX!4WTM?TOC#@b@Ls5@)?sk8~dC ze9kH9lv8LWZFDR`4Vh2-^{a1(y9o&~If!>4oJQzE2r)!=5zorP&}GYh?2Qe?>@t1Z ztE*l0*Y#NKwY|EHbiIyrj4DZ$;x}@Au1Blf%#?Un!p2A42i?R>Q@?E5fV_L$yutD} zB0CNgyO|kZ`$*Qe9($i_wYntH$(Xx+WRlNg#ygAmb3V)8Dhts^z>w}Iw7ecI8zU{( zTyI%jOy}ISTI(c6-jVD&)gn*8Jre@rXrd=w87$8<*LpZSlR_hd6?nEcPb%lYZ%ZT~|L}WtOe>_m#J%&~_@Zf@u9yQGZ;9u6fFtm;E|EJtz7!=Xct< ztIOK11u|yrq3EjPs~ZmBAuT@)Vys9CMj_eQ_D*y&4B? z9jm2{|AKT02r&pcgmHj{u8VYyanQQQ6ziH(B@P&ENgC(RH!sU;AhUrhH`@lhqaCA* z^>dS*rLt>E@-m}y=dy*&$dbtDmfLN>t#!y157@^SYYiz*BCiY*Q(Q4;Ao7DjGw|Lz zyIt}TrF9$R}X=Ge*gClhjrDmpGHd8|2uwC(LBF4D~GCo-=veAt9>zl^ZUpTTBi1x}q+UizZ6 zdz2J!EG7_qWKn|G$hcBWqeG9V6OIHz@3^((Xk2^4@fN zX?Ie={k`c0rQIXvJkXmyr?h*N_^aM@v9x=1q12mRSlX>GD(_7%D(y}#ey}&axU@T^ zq@p*yq_jKL@lbENgZ96)J8drN{3HUi&rZ?t@L9j_r0}}Y7JcsW^Xx(2jq&|I%?6(p zx>mK9mZ$TEzM5~;6PZVz#eO91Sl=E5p_!2%9bm9muqF&bGm(ix|8E@tR*{7R#DJ$! z5E)s2ke9c&GDVDBc9671#ju2)E4R#L%(vYByovW$s8kh@eCK2*RfbjR@@sZy^*X5@FWUM7Wwt zaS0h03M>h!9Ho8v_boS)?L7K>QZa}WmykApJrTz3isYkt$bG}t^K^ZeXYmLkOhukQ zXH+(;#27K919;>a;E^AktZ6Nwz$-&0Q8QO4y4GY>rddhP2gK%l2G|et*}765Nd_>E zDX~Pjh<^S#Luiiah$>m2SS(B3Y)?D8K-y8L2K|9RsST6Lam|+^(lRvvjj_`50zIRD z0+-!vWQsxo&+u*NuL>A1+pQ`|kP=!_o@a7XHiTDI8?A@ptVD;dIYoNkoq&9MTIiYo z!x1(08!RL{>NGJYZiq&%g)I@Pgcx+K%&dl{#0@0-s`pzTBOeO-eK+bofVwN2pJ`Ny z&l_UJ&o1$~ocxu-iyk*Iept(GjoHa=)$U}rM(;d>G_o~QByygj8ml@**KoU%A*vfI zTMgn@5|N+i5BOHfT2-Gfy;=Pd*%poZn5o2^jI-gh5RW-bZ`QoTZdbqb*(EYHQH&N@ zV<^xbPDyO$uYV<`P@pG7XMED7-oj_rZ4_1FR&k1$E}l^`UMBJ%`}wgmJJGJpsfm0F zZ!w+Ex)+Eu#0>1fLqUG53aLb1iVU3lvZ*SM~qu0&v;XR$64h%o6=pp+LW)QA}~ z^6ZaKtFsDu1)=7ccuFDjh@nFvI%ZlvXp|kc5uG}z9s72&GPOh{k_^!sYI+u{4-h0X zyO>Fd(t$Q+JToiXI$tqwVR~v~Tl^%>;{B&Wtf8i_oS&dZn*ZG9YfXPpEIOR!4JNsa zWn_+-u%>KTw4K429$2$`*|}QYU%(Q%7X9C#q-|m3`+}jshr^?RWjOi0e%@qyJQVon za1m%KjP6Bd8e@6emng*+FC~diV$w?JH{p7Yt#0Zmi{m?4`AFy^w7%UpPcacDS1WP; z(9aG_vE3XuM=_HN*aLKrzluQjINj@09TZw5GpTK(xI@&4WZXz`wx~B%S~&T_fK_}} z*=XhDlLKPf?T2zic51$;?%BXF^45Me&Wa6DB%{DXdZMD=@C#A|}<=!^wXhU@T8ns0;pR z8+DYKI(LrWyHZw@OFoCfm;PMg(}Byka`LtTm&oiih=QLHIQdrt1qB|g?1ymxsK6npcRO`O9h>aq9s3>dKb z>lM1Mbqzyw5Ype5zpep-`SPR1K2AE$dqeto#dN8}xci2S=lq07X~m+-|lB~QoX{Utl- z4FxtGq_~sf%=~6v)bDGT8r|4glr#DPe-q;%<5MMO7H8EK5y`5U=S6s<-4%&$3W+kD z2%*4RA=>K0!^Dt}^W(<3qco2elO1ZD4r8QHz%~@;u6Ssc^Ehp(mYBkLb^WTpQXXtQ zxIcDsyoZ~d&mliyrRsph9K1_QW3jKOt%48-tK z`5L$BiA^@Om-FixON#)w{3*nD8N_jt-^a?kLti&h-q9fDx9Xa?r)nc-%nw#|Y%wb@ z58YVTY<7$n?fnGDtSavIG1*^xTQBOYto$}$pC3)eSrGDZDl_AZSj()efDd4%8gc?& z@HbOw%XHR>f3AwA&I`?J;r(}p<0YZ|7Uao2aw(q9q;!LS74I)16gp0Kwqy{`-(Mk_A0X!4%ZV(7!nDGK{ay6=s+3uUy68%!u!r=3!k$VG zc9$o*^-pZH3ErbkRHBgQ&Vsz+LC7n*e5sP``vuPG0r$^~Sowd34J~)#d2EkQB6k9x>s7Qb#{2X*=+pzMU;c!ngPIz?&R{my?WbF2U-(CF~ zU~_mNv+8Bwk7EOBoIyDrt5md)$p0E384k~C^q@&v@9dQt)coWx5@kGGPKos!zP?B-@_>s_`?87Z2T!`tFr~~58-=Y_}<_~Wg{(dli*=aVMnPg zBF?88U^4ap_{{56*_@XLEluQvpn07p`&(~zm5_beOTT>Bf6+(jrW@<-AZ4I`qGm z`xEB(*;Rji4n2Do^LuVH_xrO=36R4@d+2%0${!Cg4V;s0DBGY3pQrOg)izqEs-D95 zvgeDcO3Xq@0x)(B zFbUgpm|IlUZYMGWK8MNEX8UncRTesNF6K8sEiHj`EQRJKHMZn%Zk69a?w0-*#w|Zy z2Q>9dtenmvDoq2;+ePdAm)A#E_tQVl&&n-B-(xM(M%%?4+Mkhd2HsvOvr&edUlyNk zv;fNQ4pm62-8WS+ZxGXGO3apgN}J|0W+Fe+KSQKB>V}x9!ZdA8H>d{{owr(ApRW1v zW?oEHjXXZH#U*99?KtmPZw{dHSKw_TYs2SE)gV1>ULHEX8B(pX^R+tQP+&6IfK&=$ zP@o4W=F7+ayBQP_0d5^Xi_3;IQT|nsH*2sL%Qg`C z_F!aI@>?}VA`cG)eE*F~BJu}=H%=3ao7wU|I>{J17n&HU2!)Z8ti4Np){~sbw-&xrj zREb4y;&*Ct9?cN-)23iueLAq$7VtVT^HYMnxQM2z*omX>nE0qc)K8^34h{SnIjqQG zxSqqRA`^9YOk8acb>SRuewQQeyBzF9;ooxX4Chc<^*Cb<2pROOMWAQye}g_(On2Mb z0lM2Le@)9$95_<^MM-+b(~U0zq917m=TrKT(?vu_t zU-HcZ{GI*0_)(Y+Wa?4ha}gcDbHKR7KaVwti^Zg=pIu_jto%igt>+rH+xol_Jd0k` zvUN-YN^M;ASK8u6#1>(8F9+EMUX0{w3)Ait&cr;udA-EY6Xoe2a`M~Db6O%hh}l7< z+{P!E*IC&&`fDqZqHJ0(vJUZIpY@q^L|{mTlt=QqcQ8iz_;s7%puJx93ICptCU2_lbF zavslb#hM8QeP2RmrE;+Abj=HuTpgtcW(JAb{5ahsG)>p6mDsiW+-YmK+tf#wNcXk0 zUn04SoPsm4D;0A@-*nC*a9uH7k@zA=z)K{O<@e$}@4ZWeFyP4Oc|5&2;r1LUCp=eA z1{vUQOKTi@z9tCXFtJ=Ly%tmXwn8i~D6EzFEo3vp47jyon+AFA3tsT4@w^9T`8n_a zMHt@!oLQX+>fJ<`gTRBjs3FlZ8*;%1#u3Jx z?B<}m-LedL*V6BEq5PyviXC}J^P+GQx#D$|I~FPv=aET7{=`N4tT;d8)cdZIn~40j zYu{BXo_p|g-DH*DaJBam$anq`Vjz3_Dax45w8}eNNqv>2M|!zik~{`YsT?Ob+Wz7f zxIA&3!C+`0^AuH=5ag7YAlEy&TZpxH$8z@hrQM>ynKL9VlM4#HhHj3m?B-$_#O>XL z%XY5x@O{=i^y9XNJm}qRF>S1Y7Wp=bA1*F&fMgtPa=a3>U@o%Vyti0zJvEtQ!V+RK=rdTlyUEf?=5d+C!yx7n}`Tg4A*UMh7Xmm5l7t4&YhKWikFC+4&O3!9ufDU$HPi=my zy<)fRvWLh&SE%&Q=RF5lhAdZnQFDc6^MBDdspTT*$2wLJnGMTU7!i7aW^xwX!vJ(n zCGBRRn3+X2Yy)03FFX(UAGs8pS5`*l zOPVRQ6}*UXtDbV(EB4r8Padww5(%h9$m;sfRd8Zf!MU>gDi);PSEk1~LCga_j>=yR z$>NRCgf3HwxpwXZ(EqL>Dqo%TT|ci}?`I|YslMLNO7IP5zLQT^Vm{R32r)@CyKB}_ z86@QEp`3yYah$B-m!*DqDfZ`&U`9CTZD~F-rnZr$k-aAIiIy2-T5K6@Gw2w& z}EFD%h7+j_$pkZCBXdAlL z*$*5yy|<#~fmcwj>w)3Gd;RBEMDnXkXuC8&ZTb9)FTa!7KRto+S0f-(l+Ax$5z*I{ ztuTlYZt=(al9)5ZvIj69!x4Fuu6e@>rmti5%gQ_*BQuN%))yVC5~2NFzk=GpFkG^I ztCR9DKTR)$0{{9>1|&Bht_bJ)k=$(O3Rs+gGh}5(B{=`}@VzS@5tyDr#yxP&zdUp1 zNoESTS8K6gK%V*)I%oX~ud`11h0a{UWU}3a&GXv&+V87V?jlhctVhVOc%Rs3gM|y~ zb?#VErz~>LmW+MY`LS;B((`ABzb$sw&~J~7b>Fj+es?`mLi_bxYw1qL0N=&XWRy5F*xWkO4t1vI1SDWf9^vrT~GMzdJEj*k&5k#lMDqsA!4Gj z_%Ihe97sBt-~2&^x;RVxExry1V!#dQTWEYJ@Xs&>{9b05XRk;S>(EBFySAdC+yq_L zjzY7j7oiC=_M`qJaodVxV9~&?6%@`3Vb$~Ng;8!u3l=VPW{A61#8ZnVYoe2;|6GS%2x~RE6Ybrz z%j%q=fMa;q3SywvWn`gU9s!FM#{8->k8Duxv|v_Y4@9igj){9Wlm}jQ!jTFUbUk-c z>EW|3Qy%#Df9H;-h?JKa7>a0|deHX~=)20B3*CUrs73FO4eeTy2wXs0qT@Ij9>?bx zhu#f}gvyK#DgV~)x@K*$gmd`#Ffm8no+d(zk~+hEPnso95?@fFpyfF-m`#OzpBR&A(0+}o})v~)>it+V$qSN7N^kdBnp z>?ka&zCZk)-#Q(qW4jbBy4;+!U%5v|wi?AhNW6ax_j)18;7*y>+5toJ8cJ2KlzDQ^ zCpYueQ}-o`%bBFouNF_{M;?ENOSq$`ZI0}^f3h{tZtt$KGjb_omtEA-&VGKrz50EZ zSuO=moc$PAO$-ci~; zcXaFGY<~3dJ)F)FX(t;})bHBqejf7~Y3tB`v_+~Jv#O-lN(>QOx2{$aMeENSr1d+V zh<@VZDqA;avRBj7wo}cV2nCL`g#y26n_bOTf1)n!wk6DM6C6>F=QN20)WVJ=6ov6x ziql@b5)iaM7N+~!!u6u>jEsZ(2G0M1zU5i{@Y;{v>P%Ay_`)FLpJMg8nelIlF+o*t zvh9!1Sxo4TRe#wuyoO@BG;@XBAyUGPS@L}Kt`AGW(& zD7Q`JIIw`DE0mU|QgcUj6y~2K>Io8~ zMf7RNT%HQeL@3Z1>i1=acj3C>K0qRThW@DEE9Hm7=SN2v-%|`ktxQxc(C`@;ISSGW zy;~1SA|rbtfz*Mns-!jjgshZXdrBR9g4zXiYNAg>-Jvo}l?t#o#>oty=ft!tQ?K*S zls+SE6s{C5YKNu-cA|c#?Wl5bCVTCo36^&Dh&`PSYer85r`)WnHk3Zh^epCNVkcR7 zo)0(PId*En{()pERLdD=((c6?Z^G@9 zq_0(XwuScsaGY6o*|}WW);8Vl`E=igfJJpnX@GW6L$r@ZHm*t-h&vDYImeO(yp(nO9c*K<|3s5~a0wV`__|+78QK$78wA zUETPmO*mFoy;!X}4jHU5g5%t+Wz}z|tn7UzkxVLkEc(p(jeBgG)1$n3VW~k`xOCZL z#%jHzggLsXCv96(Q_t==;nc_y#;lVzTRA}LW8WC@YhT`TS>hDnujGPI;8!79l1DGh z)#jF`)~ZbR^=cBIT9f-+@5Ye@Z#V6+O{;mQqpW&~de89#6t7@RdW5MMm!+8ljh-?l zHD#xboVI`-KisPs&no;atis)m_#A{XR$=dE73P*i>^+p%0WKNq8`WnZ4K3#LqG5f& zYzv;I_MS8?Vku)PU(#Z(PAOW-BrlpRlV!<()qP=DRknIJCWFfg1u}-qsMSXiA18}2dQq;kiyTUzKFuYUg$A0GwTAlEgoeD*TEIDc70 z`csKBTF1wW9ORHg!xpg@I<6N(-JmSu2y}*Rggh7GLATqWIidE|37WwZl<%c$J-^vr z4N0AP<_WHPD%Q->MPvBf6F;FU)!fZ;S|{Dv6rw%XH5gPw{nIUl0crw`!+*9o6c`;e zSI3sH#-)t5Xy?3LS7)!H)~>FyM5n2mlUT?(8Ple4dz|w_I(E7@5a{_qVJ{#M6Xh`D zMW-bcNF6R)%ZKNuYz^gRLILtFO$`MeKo6n~(Z#d}*r9fNA4yy|Zz%A2zq%w$m4sWR zb1h(1Q#l!}pTg8u&51|V%<)j*R2y5ZE?U6EF9N+D9}jDoCDk@rV3#~b;ZOVa->_gN zD5u|krzZ#nPJ|R-Ocwan)M5{>Q9ErDvZj**WjNXB{$8rNdfX_oVaX@X#CJU-V1t6b zLcU#?DCNziv{fSLDsHGt(t~<1ik-0M8a7WVJ*ymXkqM9tM3>5GQRml~AB`GNU(FX` z@$xdAH9U7QH-`eTLn?n2r@H#mqZLS8q@on?fK0*?r`DVZYjAM3w=7VSZZY=_m)Y>Nn#`Lb{tG;3UeB7% zt3rX#2du#KLJ`%YLOTWPkSTyOg)tqQB^GuDh$kWRAx`I++E0%+Y}dE zKiuMviOcASyTV5=Q8MKxrV*j|W+J?Z=PTEr_US};`g(W)&pikX(rNfT!gfX1o(6vu z6)b%@?dY=!RZ zRplN_#HLFvr>mLCQ#|bC5gs!6n3rUFy`O>t`Lx#>^UC9MyX`R>lriliyEu6rr_Mgy zaTwaqXf?EqY-x8bH@D51N2wfh!BR@Ma%GRhO5kx&qB!+e4t~F{LV;flzTx}T_<2VRq@kNjxNe@LS*f%FG6DH@ z*LW`W#IufPOU6hE(n#y17%Bya=E1n3BsB)UNpgd$jEg%_?O1m`$JYL;?h_S`F_H?>^aFl%+|N&|`sBojlzvT3L`wf_JY6>xc|Yil9!Vw@ zcCngg8tbHNQR5#& zUT?FS(}T4Gq;4_rOXC1(xR??Od^GSoU=r5!AaLSp?G^Eo*@!%+CKRCB@rd}R$bgQCCJ;9hq$stm#2$lvV-ja=VFLTc9IPXN@&o2fW&<>~w zMgt3~-vnunWuU+|PJI2^)35|(<+xbvY*>_55^Hy??o)hAUQ@qj zCSWIoTN_YoPS}b_j~3W(W)LDh^dKMn2h-qaAq}&NXy5W3G<_`2;LM;aoa14ET3TxT zY1&%v+6!ofWwVZ>KgmI_kDgwC2>LGMKR3K_mUMH9zTh3(>ur<8^x!kfY^1FYzMdKi zJRh9#+{S{}6v5Sb!Q@zaeZ8*hJMm6BFbd!V+UTDbQg0WGD*s3Vc}(!P{Uc#D9o?C= zuBUooH)~dTD%Mi0rb(<=({iC=Eo)MIyZLojRqyCf!>((6thp})$&7}hoWuJ{U;a@= znNIP=`*>2URf%)5ePN=r=POFD>k#Pq9F`4WzHiKVezSINm(wV6z#}^fRp8@@`8*^+ z`K^x{1_RPC16ztvV247_{$9{-w2n&9Vw6U7O}L@$rgmMFTgF*75TSo#Z#Rf$DN|gE zT9FsFc@e()M$ShKUp5T}V9{fw5S1XwyBL;?Ql2l;M#k+IB`T}>D1`DqVH=0B7}H@_ z777$Aj~a4T4F-mWjG{?=6ufeQ5;7;3K!)T5*3Nxj>6()0d|x5ChTQ+XC#8;}9cj+H zop;}N+F6gakq7(AIZDOa*v_uVJyOr4a z7g6R{#dQ8(4pHePmXkxiQG>H2$Xz>`TLNCj zoaemTkt-bqu4HCW*##Ll7*Gu^!kAsTNnx+A_m!WQ)ott&XL0UfrOQD7zYPCh z4F6va|I6Y3KEp8l!iEE7p&4P?H)Kq6%6WF>@?5*}DZ<5^sU>#h%ei{VkVi81L)r{H zXs|1W7`viFx<0MWCVO+>xfU{H7pKu&IpJIdWE^rKhb{-XVm2e!xZ?3e(bPUDcN`=% ztYmhWu-+HOH#4#bghu-FURfBzk}6#xF7+VY?8k6eFO!uBJhu=Y{5n#sYo4c2LyHSp&Zk6MQ}>?@MjcskIzzpIbtgb&lz6-LT}7 z-|B}~=ylsfD&yth0YEZh;H|;S`-3C{JA>LL$)umdKIuIj@EOGJuw5t%Ntm{Um%lz( zSs2kLt3*MHLE9r0Tbine=u|yyLT$O(oh-$>4N{Fwb!@xy2rS?^_i5+>Q^W???lxX^ z#c7UmSRza|>A*Z%mJ0p81jrU6GL<)gNBS~-(?hffANHuAGp+N7PFHx-@W1sI#h8=b&Py-mZUZncm zHEjy?^>Or+`HB7#lLtNRY-&fpX@5!1Oz;#pdo=#hs_}B1YOl@GLACpnLd}3n-cefj zijW$x+)&Q%GfBIpH*HzR&PjE!{nEP6!AsjLElQ2ch&gF4SeERZf4g(M^TtRl;u2v0 zsi87Sm}779zEPKSwZkM|j_Sz{@w6g?u zkx^b~B#{up`QC(K_>5N}R+@ zEr%)#6P*Fy5(Eus0cI=NM&ymuBT)Bp;b5S7z~XMYN=mt-2~DhvO2Z>IltS}=eitBr zempb^Jprz?1bi88BWy1rVQr%JLEqb5_FlKU3q}!VA*NT3D;MXDhpZCzNs0xSqgg4i zG-xy@7|=WL)l_coHmEb&)Z!$m$ESu|R%x~ao5YDE`)8ev;k+|p4c4waR6gkbrhLCm z6UImXqg*a8FJGQQ*IxF6FWDw|Z%)k>jiLnYrw!JQBToHR5g}z@xu@|2?KI3w%Wbs9 zgUXjazToDRI5(O6)#-}z2?agN_S=qoddioibuUX&nCz5F=pe>j^sSTy{+~We^K-C3 zA3-tx>kMZ16W~=MS1FkyQ%^la_VufvH6ZeDfFYxR@r34~z{9|F+^JCDg<*KY*aX;v zFeX?Z8*|VTCWJYj22UHmh1?IDh&g#ghL5p-EjgmN<`H=&;vXUY>AZ;LNiOV^c`?T_ z6tKbO?TDhEa$HH8|1dl;@gJ&VBv(%Q|!kE8uGF|3POrCjtW!U8Ps~5hJ=JixBOv*z60rT{xQsK5D{LL!_% zD7%vgB+Ks6$xIw4&hRiZIfY4Ovhq*L&9l3i@qg63-IVQNXPOmuDVL=`dADXxw@Mt< zmXw|(;!cYSlgRb(F`BHzj&s6FS)&0BX}iVBWtj^$wDB`(4kn8|87a@YlPl%cw|ZEO zF!S%1$OGqnT-N6uvX9C7s3WH83$)OaGkJBe zDkWxfB_~F8B`Qn|JfF2B!|z>`!sP2(wIaS{(|RE95mS&qzKUc9y}FdjLbiaJ!HK%& zI-ACW7D_Qr2Z4`IosD>Pt@N!Q@QVdSXK6lmiQM@-@aqT5YQZ_V7E+2K*$G~?WTgOl&a+Ig#u-9hd4sa+OiytAX{ znj~9G^zG4iXd%(faW!K+jM?m@{v*&$&pKqgddxnj_vns7zpouKQ5J`O%Ad2F3onvd1aOgjl{oSZM} z;GSQfMpM~s*f0~LO+OP4hzI<)#W^|-`m^J1^(5hGh@0g(=r_mx%=4z-!gV%9WtVp7 zv7!>%*a6M-BH1Od1L~VKT?hS>;xdub64&i5k{N+*z%1-x>u4{Id*AfWf%L4ZBie6> zF6twT?hS4V(prQz^~8hz`{VkXtnwxoGo`4{RrGNaF>UTDl3Afh=7m$fB3Tgr2mdtGv1vZCCBaw};}i_(s<0+t5?#`u1k6vsg-eTTL$_N`9`YN``+~5kCAUYdC*^m*?7AqT0YAygp{hI=A`&1 z$6|%wLm?!z)r+*h^TZ_BnE@9}fv3WtMttdugZ>BN*7ZHMH(Eq*isFn~za}a!Q+Pd7 z)Jvsxk-4E#YE2We0g%VgO+dYO&0dG(Or!h%L7&=nY>6Xlq=0ziwzCAINp z&b-eSb4o7@aewLI)Pi@qXqF7%>UR_}xAl9c6_5!uC-1qjVs;eL`UT9~>Qd;t;#LEn zq>F#<(L_i0XjG$tEy`P_i&QfA@%m{6pNMQj>xEKzQuJY1F=j`%`wpNs#$%ZAaTD4> zE9ZTOo6abPMy76=gQ?edb8#u&L{WHy&(jt#JCog5JIR*JOi!wxkIU|?o0EC!5Nedh0Ax|p3sW8Z6Hw*CWmz}!3bUp_MNv`>#ar}S-1p3g_2z}IalA z0FANY51~OJ7vpUb`L1YxXr?6$IkQA_(fq#@4!_MLjXTBd4B5FI%!~uJjB2DF; zj8+)hvp+Bmhvr0k|DcRFOv_5?P$4!B@-ZD&(G;^uf^8r6_?E((VFhJ?EcT#3beqb% zCykcpfdh7+h8EuxGjP?PiEs;o6@j#eLa0$^5T|60ZKJbomUY|<^obJWCbM+w8Fm`< zLeaFI9ffzz!ObkEuutx#Gn&*k$9O;NnCL9=ow>9}mQMBL6QB5rc9JnN=N983e^lIr z(~&o`r1e`E^k~|S!Y?i`^|a3m=4@(+A!&lomebb_*_eO8= z(ebAI$9OYjwf3NYQ5+qei1T43cd98WtGFX7yAXO9PM$YG#Ba1HPN(&2{d`m>q_K>L z7{Bn*7J}DXa5c3z_4zX7QQBz8>m!ijJfkV3*vTFWrwSk2kXrSN>}W5GTc6lEyObhn zwlSEaP@rn?!>=5GcPe1PcmQ#S&U_}aUhviqxe>qmgpbbWcq3gm5uCQ8aL-qQ`D5P! zvA|~+Pl=21f0r+%&sB<5mPfkSyv`=4Z}t^6o6^n3-PX5sZ!fI_YluM|+8!0o!hN=@ zoj33cor!V4ml0e*>q)?BJt%tSWOu&SBaj1gK7t3Es(@m`OfS=rT`)$x|EofA7TP5D zs{E|VEG4xqGFF9G={edmmjb+a#*+eUuJSYC^lYQSh`R69w@os3qd&AYibHl3{=f4`RxwKnkWlR?{NP5vZ`)Bg>8lJeF6{RS--%M#K|Y}oH;SXgv^Fy= zEwQ_!(!?{P^KtuuNz4X~yQV)X>!5fTcOq;QqfT3L_smg)wi4QQ&AEJ(`nxJG(t95m z&-7fs@2=c$K|4_$lb=Dxa5&r9=X*S(W`(O(|+sQf4v<0KLy}Hx_yn`v_JKyuL~;netoLp$UOfq-=Dso{nY+%{vK}QmnUq+f;nzHWBAk8KdadKweBgyHyWgV7%rhYL4w?1 z<2QxcKlj9_m|4P%eZY`C-dy+i?ypuec_{_IgYtAw-4tI+nm+BpBRPRq+z6pWC2P9$48Qz1KRu;V6&7tbsZmx^RZ zF<|-+h4?Koi>a5|ww+=$yu$>A`Gl9>Ro07}#S6ZX*ZYosR~WugW2Aqtpd;lwBmEY& z_ZQsg^=0pF(DBr+KNS9byN-~l6RuXo*omua`V)s|+x34T!aU%255@7W4_~c*fg`xX z40ewiLb-_%ehmSCA)6JF!Jh`@0UvcLt%}YGdMV$yRC6uNpN0YlkV8HNI~DNm@b@gx zHE*&dii}sEqH9g7f^0D7npc4@yJB~NXB{QlT80DLD2F#S3LG}|8dYkW!d$HS_;BFq z5dBJ1^<4|gXSGl{VkIO+mxlPU7f)UB>8Sjq-vaD-2ihHRisqy;7H2=n={WVf>m2Pf zczS)GUsBJTlwz2~c++o6>u9y%Zj`oL#Vql)9#zyp;DKOoc~iO2qvEp*>TJEs_@gcU z^thyxrJ|;b7-^jjw9t3zGhcx?6MQr6#b3ZTf6&PnyxJr1hkbO7_j`6jbivFKXu<-L%tT~-Va-dDcG2Ctg(?Mk686&(7JOBxd~El$~> z6dE8mlt-Xt?i9sheM%SPf1!X3tp~7|*hwXW2PmgG05vc)-85|CD;45Y>lYxXN>kt!uZaPG7H6!xe zuulk)KRT4(9Cte}W>qD~Lvc~w_aU7iaxvtVTxYa{HKkPYUD;LeG7jG;m*2Wu6GVCo z(yw(w+H3m8_W}5oPm{Ez{ap(8ngzVn?b=%|>yMA+_^fv)mr+nWZ=XjA2-H{wuPAibf3>V#-py5TU5yc{#eDhjbg?UFEo7vcg#Y`l@59o?k$69z%}a<7LRh*Kcf=w*g+TKr-c5vbq_b!z z5Ay~Nb3NZcrJQ`-yWSs!nFs^}X2e_hmz|FuQ3FKs+z;nR5eQH3{ZwrE}t1=vu|q(1LgK3a1h zIA!~Bq40OY%kL{4(2(!8jqTtY zpogKj7`GDfb%3dr0Tq$j0)2CRYE@$8>?;WzYt+0>CcdqtK^}E@ScEQ@L67vxQS3%u z&QKVORsMMmKlQjT7k%13Oh^7?%}D5*tnyNfjY;XH;^)Oa%TvS9bt$q4Y!qDL&o1EPVOR; zW_TY-o9@y4Zd}QH>AjZiqE-|PoXo^772X9#(|Bs-hwZg}`CM%uXRnnF9FvdRe5T9= z9q7hbd|p7tsDm7anevpC&+KfX9(uLiqbK%x`Dql!du*R}VCG)e{5}*IKTO90x77>u zCZOj-nk|QYbRW_E;KUiUAMpbS6gPaDh=A{O|I+=T*#jU@1nJC`mWZNAv!KAx9$R6lW(HLlO9ga2;Eq*Z-mob+{$ozJ<=ca zXx>NyoYO)okvFQhsIjhpHjHg%7qc%p*vEbvownN7;i2u<6&+kldgK1 zsWQbwj|RhKV0mzjUnPijHeGX~2cF)m>LBSZy~f}nCrtp`1#geOvksllQ!soy(D0P+CO?t&GrI;&w=z05=tvXy5EibPMIIY>Id^m`nRQSFy!x5i3i$({e4~ z^#}s)>l1fZfK%Jr`5+`(J3%RV==;(KsWqj}sxPEm%ADtUv9W)GWurK$2|kZn+#@_~ z4`eQ6{O;#dVdoz0DSLiW)2;`p?g{qmuKPDc_!0&uuLZZ3$8Uo53hvt33~l4Huycu& z8tXk*h1(mV&b2VcU1)Pz<+cYQv+<|EGO1=@7yM9*#cdB#xeS$TY(m-dRb?$?@)6u2 z#F5WnKSpl_Sf~CL|Iy?F8Yl0Ast%OaN-oeuxFw>T_vb_vVbv|h?P%$pWIXsbEz|G^ z8-MhCRi}GI3(BZ=S1{lW8_IVSo_oRkn}nv+rh43pv%4bo!BjUf86Z2}QAq3f^#Jg7 zc=wxsbMA%Yri7+Vwy~c3Dwwdy!jepC^V0KyWIH^#op0Vq*{Uk0w^?m+QHvkIjB02p%yv~! zKNAXxZRJ}Ezj(p)n<(^Pt8JopSGfQG`IYrhcs=JkSG5Z|pEUTFv5lJw#!wDi7bkRV&?7uJ-H0cXhpudm7E1 zy{P48Z(bE>Rym}Z>S1o0M91(GcSPkqL1i};E&D1g(7{5!1}zZ18;W9v&w`Z3lxt{O zLpW_;1$SzxWC8py`x?p_a3DJhY3}Kj7ieGk^Y|alcliR%v9Lq1YH+)U>Mn(MJdc}6 zcELJE&*i~KYq!$@D+5D0a7aI0k?d&$_Qmgldu(o z>-hw%q4C}#k*+`7M-rs#r!Yv@SCJT5VPo4?W2Z9Q7(4FR3ZAd3bI+0Ws)#Sq??WSS zXA+-%7`hvHJZM%gQ*}KGJ5XMA0xRaSm-g`HU_PLw)UGavFlZEV+=|7z@O;G!zizV9<x`?2JHDqQT>bQh_s|A3 zlGX0_Fg{X+?U>)Fgxk7yVeKGU5vnT&ju~NpQjHdOX%dFDq4Y2Pd+E4rhWBM^MfP_%J__c6Ht3Yxij=%w-6dxT!; zD4r~s?|P+ALg5n-=3sy&=Ajhldx!_1@_pB1Mw~5UqkgI z7oFC|vjzvPB8YP^h^3{5e`;TO$Ul~qhy1^RKd=WvqY!g%<@J_7+}yZ&z?nbXT)+Cr zwU3>9ZmwUU0oD0OC-F;HZEtRV>-|66w5=ZJwq6U*`K|3|aKqs06%FZE+P4-PJBLP{ zbrS{rJLgO7XxEy5Z`Y(v=QjrXiT><)%&BphQ@6){r6Bx4n$A?!p0ueQAuzjJSku5* zAB~Q?r1RE>@=$y7XUjLdg;nv4_pJ?fyu-|Zn1BBd@qX$D+A|Fs79t*fpPO{pyKuwK z+p!16-k|t*k>VT+y@fE(`HkjZ(Rvl_x(DMD>-c?KrutO*29wZG8;}YDx0*=e@^!E6 znsFI%PG0PDw16v+sUkE!*5z#gb=Y<0ZTqhXNh7Dh{-T%aZpw{EKO|l57)CnizqLiU z{{Rj2?>#K@JWvhK0~5tu)*+UcRbfs#gY)%tyScIoC=4C;h29`H=I(i}K_5NpSl1GR zzL3;gUTt>KnqL7_?EeWgRHxtWIUMk5gE8RInzJIn-pVBDvdJNVlmaa!DIyo(<^a zIV$C*!0&BN;YauRjokP*W!@Oqw6LnR$ulRti5q)1!VbqiQBJr=LrTYJ9rEiyk0yEmI5vb`i9%}#cGqXl zRLp!fKO}SPsVzB>P0J80N-LWnf#ei7Bh_dZ&2XDPL5hh^F(AGC3GEo}-bX%PvH|ip z?w*qUzyh%BN>YvFCe`9DUyKlA9j2t;Eqm0#lD0X{IAWJQy6ns{AT>B1T|Rud-mELL z2*;e9IbvB3%Cxl@K9(y@#M>dn1;V?N6|BK)M2{6K-@nV6#X4WmSp~l|wtI{G80w<} zh!OLF`BdgncWwzkDQ~f}(bL__MV6Se&L}nk9WJI2Eo0i(!RyhQIdp2ay{R4?er8VE zv=K8?y)E5i#vEA>`k2~~19i+zV7@AOu+oZsJ^P9hPL-e*ALIPR?&_$Xn-r$a5Si89=6={a!RgG_W7W1`d}*|Lr~psksmekK9#0cUSR5U{oGaLGJ{WN5@@xh z770i_eVn;go{y08S>9pXnZ~vhpuGsGoBS^;GeTGNG5LeGSqk^hK6GS9Uc z?H3K%C?{MR7ySrrcs9~Gf)DuRYa3AmYn&rg_3U4C1>CY@GjWah-?YeDi#EEe+2ZX6Nv9F=si$>Wq;UwPHe)^paZ#_Mw>G)%|Id9RdGIU z1JazL6`F?cHksqHDZEvWncQ&l5Uk2G`yglOtricX^C*Y@| z*Fch;P>;R=)(a4@oae=8tgo}NzMimek;^Uo{(nb)SqS78Rhl7${6hScdW3!Sf8oE> z+fM>vqZcdhA0hQ{UitEy&SN(?LVZk z3v^j94Wi3-fxbHH-L;_t?}#qT4ANzH`F0uT^I$xp%gPXszRgW)^_FdT`*!T9aW_C8 z4c5G<^g}`gebA+Y)(v#JWzyau8iD#4Rwc+X()ytm>Vab8l;;@1)AYA5;l=r&9861t zt{pB>F7w5hVxor)!de=acj?*Sk70J54vs`XIv!x=TTNB9@6}S@HjDEi?T&dFG*Ix% zv`45F2M8=Zpz=6q`A_enMgTc=JQYPTAJt*v8KI&^ctQTfn9+m4D*KW z|Hv0`u44!O&4$3|@&%`1+$X@xEL(bK?DD7Xo==QG9cCKG^DRM2E)n18|K`Z2n7O>R zp_bNoE7pujUHKwQ^STLX=aGOiVwLssZ_2(_ona^Rx6zm&^5%RXDm50jKWPDnXP`O_`#bQA17+>Cb}os&zePTPaH>!^6H>Y4 zu7&h>(C?t)*H~=F`@ew$@Pk%;bN$b04z0Dj1ZyJIMZ4c&XQ`9idt_asw#+c@VOTU9 zR{C(!3Hw#7uYcBpPo}pgQdy26WZr&l*}cC^~}$ z9ppGGF*YG9(`^<<;XV%X99xU&q?-5x*Ykt@Fj9CKC`SzEN@3IA|kygAL-d4Ue*mJ&< z3!OXc)OY?Q8=Ta$iIUL>juu*P4db|+Pi(a2Uhxq34H!ol5kGYOQ90SI?Ax!5t41%C zjrcQB!fUen$b+kXvugS!F2l3R4c)-kWPY=7i5s!G`krd*rSQ?GEc#-jwu$Wmfv`}v==;hvT*6u;05lq z>?l%UPq3qCnTKU81+RywWB42CZaDTUfAH3%l`An=`V;>v#zTlP8@(mofit;`2R*Z@ zO%wT14`2mS`39*n@7tAD9136HnJYh@6=q7u8QVcwZQADCDr-&KmeqL^)5dzjM(0pC z)0UzvPXTlzzK|a`ZL8ZWFEnjmRVOd9oRUS*lPzv$+FJYv#E1{28smwCbuIF(ljpXx z^u2D*bOru~kiQNt#oXamnf{IzHZc+ZkFyFd;Q$gH^GaiK63N48aGusHP3t1`Z?$;_ z&Pj1)}zSzG`0McqeVU(|2!k)G~V3wapj5n)RK%0utto}S75?FF9AxM3?un6?3TgeRbb+`N6K zF|igUo^j*e6}2$UrS8z_%YTL008jH8MWMXhcB{Soe69NC{1pugjio><%#A8tFRM30 zpT{yuP)<^PkM+s zwPM6HW8$ynN3d#$pnoU!h>&J@7nCH$(LnaUTPp5J#Z!9^S)QQyv}UMN)6wG4fJ)?t z4QGQNpk0lz3tY+gp~4!Qs#B#J)MjP8S!F4A9BDE+wC%iEZ7Owyn{|$t9bY&chr=KE z!5jX-_qf`k2*)}R)^KfDVAD!gtJyoa#%;!$|Kur#oN8Z!SfebFh?S1KWFSPEy;jad z=+U^ca9NJj%4677q?dyb+3?Lp%(3tpXRMXS!#9uZt+Zo@TPsh%HPKWnPeO>v2yvhB zeo&9T8j{M;fuG0uK7jlNp-%awQ7y0!+afowfej5>1I)*du|Rs#sddbXo%cIkVS?y- zyV?l~;WK}+oWdL}+DwQHPmi?Q4{e08%{K3er|f$i%tX7= zA+SzE{KXz=$6?wVudU|p3p;KXd!&uncM-p$Te@=aL*^J!E}oiaDKy^CfR}!6rxEhN z^rlBz<^K_FE6*T1QFV}s945ftg3sMsga5bt)Cu>uk@WC`!W**6ajK*X)cTA|F9YXCJ+NLhaVJ_n zm6=oBag0KlX3ymdpRnW3G9P!py?s|AoU=pc5#tY~c;y7-j<{T7wl3owBt1Dj<%T8C zF1mI$qEp3DJ{~|m4z*D_GcJ9lo{jcCim%W!-3Pxwcfl{v-8p*$aezP@M+wku^*!9H z6?`u6nA_G=H+LM3iaWz##X+4A)wV*sWYhpBb~aG|S%+ruefIan99KH{6_XGz6?vq# z(5Y`>#Ol=&{&ngbK+RiAdJn!)M7{e0I71)Q#xe%9y;pqzsfVBW-dF`Gn=s^+QdJLX z5OZ2cgNF4XKGWc=#4IcUU1$u85p_Ax^@`6H4%zrm?-g!&jA(P3nHI5$l|86YQxyoH_Vk-~bIs7{4` zQ0jHJ)s}}n@M3#<4c{KS4m_Of*c$NeTI;|Iq7%_S_UTLbbsVhOKu@iPIGF{gi*}?$ zT0%N#1-BpKCh;|-cS~`AgO1rFM$v)6sECWV^hl-MF_3S{8g(5SF|0F&=O#n9D{Ej2 z^G``x*V{G2?LcAU&tJB2*q1Z3e31WIT%Q){>CTs_itj9WSZ z_to6zsuH0)SRmSqY0gXe9$Z^`-f6!DUIl3O)bsAKx5EHQ$bRm22x@<$`dj=DR>Pia zH7`Ia(K5!Bl_o=%fXg0Qos|X&W1Jz&;E8F3*y^lNI`_zFgDfMba=uQv3TI6D?sR)f zX{s16^3_@C_j%Ze@xt_$Bw;CNqfuo*|5tx@QT1F5`klIS2vA&XEdqC9$6 z)~F$#fb^#TUwz1RejVX$@acox4dMvc5Q}I}g1^eWrATw)`_n9$(o7Ogc+16+LcDOy ztAbXj3N-CkC_zLJ8=L>qOLe{gYYx>rY~LZ@zjWn-PF^G$Tsy%PqkdH2XJ+Ir2YJgO zE?zDy`%zdmBzy)7_q)bbj>eVXY6LYm;0!dBGjR@|sduN)IXrMC7mCq^EM0CZx7$TJ zXMTiThE+U+z`x7A1`Rhl*>B^v0smnu(aB^RkNW%7+x`8W?w>R+kFJYGsiWL{b>OMvnsBT-W#-EUvM%`R;)}Z4~w* zT5d1*>Y!HRcAUhl(*7o<^@Pkeqqo^19rYwE06xilE}YH|ZBza3LG&%6&(#S7+8{%{ z6g9GkTFdCxyg{S&Bhalt4+AxuC%lI-v$tEjRYdPQAnV)xp|&!5CRN6Zxh>kQJ6mWE zqV&p_(k|)vSpuc9v-m7*MTH|&97@ySPQ{+%gttd}P4=SRG-|TBHdy^VYF{nOD@$G5#Yrw`mX*dRHA{C?$2y#V z{M4pXFkk%CrhmIjn;yRXCA9VdwYWP>_w5>SzAFx2X#0PDfqQM9i+?vD4ftQ*IH!Dr z`dha$TVA?drn)=6wM(|u@LJ`&L^*#&K`^vdm3>6m5Ls!c)!&8}-ELyn)mG*W0OQlFg+UP))$O8Y;(>6P3* z@}c@uCwSYq@mIaOY#+6LAPy2Bw=olX>OBKoyNaT)v(Y)ez?;FY_ttSa@1b6rdsx;P zH_h*?3$t$SGq7gCjWVEZzY5&FeKe-j36NUa zKFrR&N$GqP5bXm>KEJ5aK!X@^xg@<{F!?24A1};wahqAP#=ckFiV?h9{t@Ht5!kMy zwdA6A3)Z`%;ymz7{@hAETER1 z`_6kB+Q%KPc>7G@OF1SVmSE9pJ<{L1U{{bQi=Zjji0h~m^@;etx znGBAO!kc*MOLB!d!Nvu&^5Gc90r*m$WZ&$2?N{s zecT%~>y5(<65a+av*a`D2pPi$goUFQ)fH#ZLO*~aC8~yOIt8Q_#M87Dg%uYr}kLD+gx5Y-le387m&q4}Rc3(@YI*?QQk;Ys&0$ zDj>QVyA0M`*Qe`jKBMZ>8p70stRPNSO+q(nm17b@s?npY=r7%Yo%ok9>L^EkY2RTA zTLrt1s*sdA&cYOV1Qn!Bwu;P^Y;hEmjfW`3evMk#-(@nfQTlVSFYqsHgG7UVY8U1V z$S0e~7K;|v<+`K^y(+WG#lwPWk{JCw^oO1g+O|E2bb#lH^?H5_FY-xTO6>EHHlFI2 z=738HR5e(8VJSBiOnqN-G$anAr>jQrBa?8(76;6QQoHZ)K(WbH56r>AFT7tQpMFTh zI(YJ~>;Y_pb_daj74}U&ZD2F~tx_!1i;d$9R8&+n3yMk|1IfCWNK&gVb`(%s7 z?1~W^yPZC3IM70HmPp|^oKp6OA^A?SOX+ZRNyEB#x;jEuL&Mzr#5KT_;Biu5U}5d4 zLP3?;zNV@i$m7h^V9x{9&S6HU^zxeTg>3-v3-5CNdJi+fT^{r=lhxs}>bLO4FoJO8Cpfp&A z7q77m0EaZ0bx9Yn>fmf(QJ3^~Uoa*!eGeqyAcFik@EJ~_9*CkM+J$U~`K7+z{&k)> z29TCdICdH0Q1m=e~`;zfS zooLwR@16`1U--}A@=t} z2PEU}-fCTv2eaIjrkyU;Y6GkRWg9WJd+BVM_Ho%5lNIu=)i_50Dmk4b$kNcm=fN2S>@K0cAS+!8 zyHqIx8^KN7W;ct`pc|o4a?Wv>a&)1`tk|upQS4R~h=TnH&QD+ux0T{U`V_osD)S__ zO&kt1{_*{m%m2kT>38xX^od(dIL~zYrCGgX=Y{%6o^0%lh*Aq$51r-^rLD-Eu6YSE zjFfA2H_3)^TPFw&9Xi!!+xpfcvCL#GWWI}C6oVuq2SYNFwFbW2Hi_iKRI9b4^d9TA zK+;Z}U$0DZf}6{dR8MwEmp&%G>qN5Y47zCm>~kyg&0XX+!*GVsCDnE1Ss}kEahqYG zXRj>v^w4>^EbZyZbg7{Kqn?5pRIIXVSIN?m9TKN9nuTzw>NT7Cz(bmq(cNRIjb0tqut7&47G-eDWLSe$e`YL}%?WMHQ!MVVrOIia&k(l0*=%nDsoT@^xL+6OI}1I}H*N&&sw{fMl4|DhtoDfMw+kK;rf`!jhm zT)*U0BxdDTAoCip?a)Ug0uQPU^}8(gOjxNny_HVy9+vgawlE#^>F2cSL`dWpzGqv0 z!dmophhFo*@x8VOk7veWZ#~NH_FPmI?64bL$8Z+B8G7F;t#CR*+#WltFv6Z~*NIlF zOb&Yq>(64tC&y?cx9J^nWOc#-g- z7o#KPeQ%Da@8DG{Alb|D+4dFo{+vWpPArGKlZ8WG8)Wr4AjB2ek9#TQt6hmoT|EaI zBP?~wjVC{xAkcRt>7Tt5;FAy3p7~zi0fQI;KI4F)mExCSLr=!c`}U%0NNQmVP`9p# zU)zU?Z^XpU`ye)@@XeXifB{t~Zl9|L=6-xZq1__*KK4tWwh&S`P*6_15wkmXhZ1T# zP_{X~%6`@B!$_lkHlf>Er8`U*QG82@ozS6pg+n_~9H?MTaUQ?)`bUID6$8J(Wvm{{ zH;2}e2)nAZpn#c5;Y0n`(Od|5NtFmR>CzvE=t|D}RYhUbOfhJ6zNmx4I6Bj9fea&7 zyH@Jw{rz4ijB#-jRB5@8k6O!UmUI+H9^jk#(5{-0m{ba46YZf52lTKlwXSiQi=%zI zFR3eHpZ*OMP>uZ3%-(P%9AV#)Uq+V?d(lmegD{t91@&J3H42}E{ik}bA2ePV@bHYF z(f!gZSbOY9k=v$2JQ-L~X@U-6M)u~~BeBaTjf`$DG=3AYdpbBC92e|vUfaB%L+Esp z;@&o_Ix~}Vr)NTUJcp}K6u7O-mm+6oMtK@L*^Kbhe(7RYlA<@utS__-Zf7Z%z1^UI zfaU{!pdUEAC0DTZu{`+ z%q)C2D@OS)2bnnL6J$-oK&08&#gYk+YsvocE{;%LGCopLB;Dp5dr~_a`45t?%!7WH z|E8?*>$;X+3J-^s;eBaBOf@X3%X3|YMf@p#yV3JTQ6y4)2`6BIT*_%?)(Oud8ykJx zLwgq5v#R}?Tn;+^T>Uw(8XPi~=Jyzcf1(8j2nKO;i@DkY*oX4!C*ye_smx6u=1~d8 z#GUxgBKe?8m1{I**d2$Bso@?9DI;Vs+;xvCx6`{OAtwE*qPuz-(uo(nxzLFFhqBu_ zB34z##n!{lS2Xap;syP=^vWb5rcjcEo(^$TB}+6HcGx|0X!itL&5#xhGm>5r&ddY- zc5St#Ku)r2OKoKZc1`IT>{*Unk(?HNmY&1Yub;N3YR)~35PF1ogumjo;&~jN zRd^oH|A^D17)Zj( zdn$05n+82j;5PcO))L)AC;2CLR?ZK^ajtAw%p*NP?Ehfz!;HHw zuUWBpa1*ZihO@lW+s}18?H&W(CG+LT-+3n?J&&7G{fnF1XT4^4FepQMyzMad(>cz+ zV5QfwW8TOE&o_sCz`YB6s4DjBKIviX&9!Z`c5>j-(&-TGB)X;3f&QHY(I^guV;IB@ z`_g4>(cwG`R5td$H^E!)YE#2fJJDYzd8cS<`FzXyNA_y5D(&_FFQV!o9Vy*dWNnVk5Eq+PpE=x#{0iPV_3#me^13M<1E!^_{qGfpt zOZxJtLo!)$QN`mP_p@x}9R<9jIOsCpjDHL9lVAQFe*N)gw@gF+g1JJD#sqV<>8D)z zM%)q0QT)3r5mot@hX5BMV*W^=G<$kgJ>ZG_Do9 zi;RB0`xJ-y@`?Ygds8iJz-(jnt#Pim4H1e@H+8>w&F1MnzBRo2r9Pei-ai#w;tI6>$j&!xSQTQlodJu}H?-yroAuhgHLCk370!>{ z-L&5?`*eO|PT?iKkohC~_7sJmo;;LcZ|(GHYW5Uauc>NOd6NsRm$cU19g%7_Vwmfs zRXJNI7y~-a_mZk5@Hfg68#U8&EDpK&8NM%bBli3IdJ+wh{`ef&Q^?o(4cA|`g`Hj% zV?aJs$4MXhqO(@`GPa?~zlAzKlXn({h4P>}zO#s3I}Lr?-9TBeUNTr) zy)UCQEE7C_Sh)Z{9}+~teC+RDbBm3h=6TtsI`JY>Kj^HDE$iSp&V>5Q-0Mcz>2G^c zZ@j6SzxBG6>sI+Fx2LU^0^Wc;P`$~K{(C7Os5c$zP2H`!5vse%PTxi+)!lk$uz+yZE`bTQvI zT|w>7X5axgg11Yw<=1%M+{F-n8~%g->wvXuAUipriOEjREZDRO2Y=!o-0P+$`S#9A zx?u$7sdgH@NxI?0J>?Zv(B~R)F&5x5lzbq+cILBm&+u`|P6(&SAJJEv{6Qb%9X|Sx zAQ}4+_+d&~x+|gMXfX4eG_vWUyW1;3mMO=XiI%@~mrpG-Y8zgs?I}5A2g6$8qkvbZ-1F zTQZVgw8cBP(_7;ob68`2;D&wcotJXaJ2%DaeK_SutkTd!S^T3n29y`-4S70(_TWm7 z%vI{~Lg#QURRxI{wHwcgsuEdBIRr~zCEebla5XE$#ifF>MhG4u$bax5?qB?M&Ey~9 z)*TLqzu)h~PV7%jT3E#aa=O&}kp^#lp|>hvMzGfYv;n={>#e%;GpW$c#pYVWAh z9kzTAN{6@Wdq;xK$hF^+*7l~9FrOZJ6UlJ3elxW1BRwg==}rRwBOE-zgiP%z>c4Dc zQNjDRyw(gM96kPZ#F*Ri2)NWuy_8~E@4(UwjI--6s^~1yb?CO z3Nn$=kgo}IQ;9z4;U?eo(8)sH;TWOEYb~7)ekYy(YjCar`?xqIQ7h*qdw?qMhSfXb zd=FH2V}}7rRD_y~P`^hgjS}iJU|aV|AKwuUnB7xo7SSJPH=WFi-9>$XuXKt(#IlY; zqcK!p6iU}T;5eb?Ff;2kskmy+5=bKi!xwF`Cq~fWy92;+mz$$fk$rz*Lq3xt7(Pz)^LfHWnc z`n?UZEg6GA3#uWjh_Q^kt8u0t{Lc~9kg7$=a>-8G07mi(YRD@P&xy_%2O|{@c_4YY zPn~PT{h$s$aqb(+-*iTAQz(T#=_bynD%$8&U|_(BkXGM5r%5o4hm?7r#hl_B9$`p~ z6fpw}Rl|+9^ru59f8D1$R4#@?@0xnpk)=bhTT-D8$?wBHP@g$0X^`@? z7ra7x$1?M=OYVbw8tDqjujo2Wx(}%~G*@Z=eLMW-zHIRk(-&aH)IYPS|IF9R}lY&y5z~1&)gIYB_}R%NA8Ef8v?4$|Wq{;jk^Q zT=LXI4pzB*Sr)D*o?TK=?WibUS+S^c#d3Up@{*-X%ATpXpHX_JV}K78a`}*}g~wsM z55qILIy|?))rb7U@l5d|LeGYfJ0Rq)s90XUbjietrlMK1X3Uys%3r*^qHNJB6J9P+ z@}Xy;Af{OrPgSm1SwT5A6%-a^dg6-%sT)R@4 zu5%>n5pEH#U3m8(+iCx9>o1@ zxbt$D?xANYooIJd+K8+y2y8773Sy z-^ZfhRxWvxEh$^VQkS5?)2Jq1dyFYKien0bxQabC#x^JX`Qy*wT7TSOc?~XmYfJ27 zV*5= zxlz~~^>+4~uW$H9_tE^6f~D^-O4WWr)sJ7YRdLw7pj&rTaclqjdVa8+`2|CkXquZ3 z)(bbgrd;G_F7`QhR5x+dbG4yrl~JsV{%|IMaQNEBGzO zJfZusWlZi=LF(_M4`pKb;EIov5vGhG(0 z)6fs`D~p4!Iphuqz3)Ug+p~+SSn;#ZtXNrD&1TNcHQBKAJn)d| zxp5DTu4V(#(Nt*C4RPZbtdFR84(KmBx~L52LvG57tdteVSLciPZVl5Na|ZoS;QqtV zJ%!J@qkb~Rj2WA42~`uuJj!Nav*$dJlRYK)3qF*LpP&1}*vG0VIwLw?g@1JT#t{?4 z8&6&dtmYJ-|DV4MZnq&g-_uB(j`LeLWJ(e9uJa29bg-Q;*2Yuvkt4%c3A5(C5Y8sx zqF)eOG!Q5Oo$f?BloxtOes})p{UU_ve>blG25x((0B^&83Z7?TZfFYKlb7OcVzY32 RJHGNRk=_|~%1b9>{}&J_04o3h diff --git a/boards/px4/fmu-v6u/firmware.prototype b/boards/px4/fmu-v6u/firmware.prototype deleted file mode 100644 index 72f892d..0000000 --- a/boards/px4/fmu-v6u/firmware.prototype +++ /dev/null @@ -1,13 +0,0 @@ -{ - "board_id": 54, - "magic": "PX4FWv1", - "description": "Firmware for the PX4FMUv6U board", - "image": "", - "build_time": 0, - "summary": "PX4FMUv6U", - "version": "0.1", - "image_size": 0, - "image_maxsize": 1966080, - "git_identity": "", - "board_revision": 0 -} diff --git a/boards/px4/fmu-v6u/init/rc.board_defaults b/boards/px4/fmu-v6u/init/rc.board_defaults deleted file mode 100644 index 9c542a7..0000000 --- a/boards/px4/fmu-v6u/init/rc.board_defaults +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -# -# board specific defaults -#------------------------------------------------------------------------------ - -safety_button start diff --git a/boards/px4/fmu-v6u/init/rc.board_sensors b/boards/px4/fmu-v6u/init/rc.board_sensors deleted file mode 100644 index 3014a8c..0000000 --- a/boards/px4/fmu-v6u/init/rc.board_sensors +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# -# PX4 FMUv6U specific board sensors init -#------------------------------------------------------------------------------ - -board_adc start - -# Internal SPI bus ICM-20602 -icm20602 -R 12 -s start - -# Internal SPI bus ICM-42605 -icm42605 -R 14 -s start - -# Internal SPI bus BMI088 accel/gyro -bmi088 -A -R 14 -s start -bmi088 -G -R 14 -s start - -# internal compass -bmm150 -I -R 12 start - -# internal baro -bmp388 -I start - -# Baro on I2C3 -ms5611 -X start diff --git a/boards/px4/fmu-v6u/nuttx-config/bootloader/defconfig b/boards/px4/fmu-v6u/nuttx-config/bootloader/defconfig deleted file mode 100644 index 745b587..0000000 --- a/boards/px4/fmu-v6u/nuttx-config/bootloader/defconfig +++ /dev/null @@ -1,90 +0,0 @@ -# -# This file is autogenerated: PLEASE DO NOT EDIT IT. -# -# You can use "make menuconfig" to make any modifications to the installed .config file. -# You can then do "make savedefconfig" to generate a new defconfig file that includes your -# modifications. -# -# CONFIG_DEV_CONSOLE is not set -# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set -# CONFIG_SPI_EXCHANGE is not set -# CONFIG_STM32H7_SYSCFG is not set -CONFIG_ARCH="arm" -CONFIG_ARCH_BOARD_CUSTOM=y -CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/px4/fmu-v6u/nuttx-config" -CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y -CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" -CONFIG_ARCH_CHIP="stm32h7" -CONFIG_ARCH_CHIP_STM32H753II=y -CONFIG_ARCH_CHIP_STM32H7=y -CONFIG_ARCH_INTERRUPTSTACK=768 -CONFIG_ARMV7M_BASEPRI_WAR=y -CONFIG_ARMV7M_ICACHE=y -CONFIG_ARMV7M_MEMCPY=y -CONFIG_ARMV7M_USEBASEPRI=y -CONFIG_BOARDCTL=y -CONFIG_BOARDCTL_RESET=y -CONFIG_BOARD_ASSERT_RESET_VALUE=0 -CONFIG_BOARD_INITTHREAD_PRIORITY=254 -CONFIG_BOARD_LATE_INITIALIZE=y -CONFIG_BOARD_LOOPSPERMSEC=95150 -CONFIG_BOARD_RESET_ON_ASSERT=2 -CONFIG_CDCACM=y -CONFIG_CDCACM_IFLOWCONTROL=y -CONFIG_CDCACM_PRODUCTID=0x0036 -CONFIG_CDCACM_PRODUCTSTR="PX4 BL FMU v6U.x" -CONFIG_CDCACM_RXBUFSIZE=600 -CONFIG_CDCACM_TXBUFSIZE=12000 -CONFIG_CDCACM_VENDORID=0x1B8C -CONFIG_CDCACM_VENDORSTR="Gumstix" -CONFIG_DEBUG_FULLOPT=y -CONFIG_DEBUG_SYMBOLS=y -CONFIG_DEBUG_TCBINFO=y -CONFIG_DEFAULT_SMALL=y -CONFIG_EXPERIMENTAL=y -CONFIG_FDCLONE_DISABLE=y -CONFIG_FDCLONE_STDIO=y -CONFIG_HAVE_CXX=y -CONFIG_HAVE_CXXINITIALIZE=y -CONFIG_IDLETHREAD_STACKSIZE=750 -CONFIG_INIT_ENTRYPOINT="bootloader_main" -CONFIG_INIT_STACKSIZE=2944 -CONFIG_LIBC_FLOATINGPOINT=y -CONFIG_LIBC_LONG_LONG=y -CONFIG_LIBC_STRERROR=y -CONFIG_MEMSET_64BIT=y -CONFIG_MEMSET_OPTSPEED=y -CONFIG_PREALLOC_TIMERS=50 -CONFIG_PTHREAD_STACK_MIN=512 -CONFIG_RAM_SIZE=245760 -CONFIG_RAM_START=0x20010000 -CONFIG_RAW_BINARY=y -CONFIG_SERIAL_TERMIOS=y -CONFIG_SIG_DEFAULT=y -CONFIG_SIG_SIGALRM_ACTION=y -CONFIG_SIG_SIGUSR1_ACTION=y -CONFIG_SIG_SIGUSR2_ACTION=y -CONFIG_SPI=y -CONFIG_STACK_COLORATION=y -CONFIG_START_DAY=30 -CONFIG_START_MONTH=11 -CONFIG_STDIO_BUFFER_SIZE=32 -CONFIG_STM32H7_BKPSRAM=y -CONFIG_STM32H7_DMA1=y -CONFIG_STM32H7_OTGFS=y -CONFIG_STM32H7_PROGMEM=y -CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y -CONFIG_STM32H7_TIM1=y -CONFIG_STM32H7_USART3=y -CONFIG_SYSTEMTICK_HOOK=y -CONFIG_SYSTEM_CDCACM=y -CONFIG_TASK_NAME_SIZE=24 -CONFIG_TTY_SIGINT=y -CONFIG_TTY_SIGINT_CHAR=0x03 -CONFIG_TTY_SIGTSTP=y -CONFIG_USART3_RXBUFSIZE=600 -CONFIG_USART3_TXBUFSIZE=300 -CONFIG_USBDEV=y -CONFIG_USBDEV_BUSPOWERED=y -CONFIG_USBDEV_MAXPOWER=500 -CONFIG_USEC_PER_TICK=1000 diff --git a/boards/px4/fmu-v6u/nuttx-config/include/board.h b/boards/px4/fmu-v6u/nuttx-config/include/board.h deleted file mode 100644 index a82a7bf..0000000 --- a/boards/px4/fmu-v6u/nuttx-config/include/board.h +++ /dev/null @@ -1,530 +0,0 @@ -/************************************************************************************ - * nuttx-configs/px4_fmu-v6u/include/board.h - * - * Copyright (C) 2016-2019 Gregory Nutt. All rights reserved. - * Authors: David Sidrane - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ************************************************************************************/ -#ifndef __NUTTX_CONFIG_PX4_FMU_V6U_INCLUDE_BOARD_H -#define __NUTTX_CONFIG_PX4_FMU_V6U_INCLUDE_BOARD_H - -/************************************************************************************ - * Included Files - ************************************************************************************/ - -#include "board_dma_map.h" - -#include - -#ifndef __ASSEMBLY__ -# include -#endif - -#include "stm32_rcc.h" -#include "stm32_sdmmc.h" - -/************************************************************************************ - * Pre-processor Definitions - ************************************************************************************/ - -/* Clocking *************************************************************************/ -/* The px4_fmu-v6u board provides the following clock sources: - * - * X1: 16 MHz crystal for HSE - * - * So we have these clock source available within the STM32 - * - * HSI: 16 MHz RC factory-trimmed - * HSE: 16 MHz crystal for HSE - */ - -#define STM32_BOARD_XTAL 16000000ul - -#define STM32_HSI_FREQUENCY 16000000ul -#define STM32_LSI_FREQUENCY 32000 -#define STM32_HSE_FREQUENCY STM32_BOARD_XTAL -#define STM32_LSE_FREQUENCY 32768 - -/* Main PLL Configuration. - * - * PLL source is HSE = 16,000,000 - * - * PLL_VCOx = (STM32_HSE_FREQUENCY / PLLM) * PLLN - * Subject to: - * - * 1 <= PLLM <= 63 - * 4 <= PLLN <= 512 - * 150 MHz <= PLL_VCOL <= 420MHz - * 192 MHz <= PLL_VCOH <= 836MHz - * - * SYSCLK = PLL_VCO / PLLP - * CPUCLK = SYSCLK / D1CPRE - * Subject to - * - * PLLP1 = {2, 4, 6, 8, ..., 128} - * PLLP2,3 = {2, 3, 4, ..., 128} - * CPUCLK <= 480 MHz - */ - -#define STM32_BOARD_USEHSE - -#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE - -/* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR - * - * PLL1_VCO = (16,000,000 / 1) * 60 = 960 MHz - * - * PLL1P = PLL1_VCO/2 = 960 MHz / 2 = 480 MHz - * PLL1Q = PLL1_VCO/4 = 960 MHz / 4 = 240 MHz - * PLL1R = PLL1_VCO/8 = 960 MHz / 8 = 120 MHz - */ - -#define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ - RCC_PLLCFGR_PLL1RGE_4_8_MHZ | \ - RCC_PLLCFGR_DIVP1EN | \ - RCC_PLLCFGR_DIVQ1EN | \ - RCC_PLLCFGR_DIVR1EN) -#define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(1) -#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(60) -#define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) -#define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(4) -#define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) - -#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 60) -#define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) -#define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 4) -#define STM32_PLL1R_FREQUENCY (STM32_VCO1_FREQUENCY / 8) - -/* PLL2 */ - -#define STM32_PLLCFG_PLL2CFG (RCC_PLLCFGR_PLL2VCOSEL_WIDE | \ - RCC_PLLCFGR_PLL2RGE_4_8_MHZ | \ - RCC_PLLCFGR_DIVP2EN | \ - RCC_PLLCFGR_DIVQ2EN | \ - RCC_PLLCFGR_DIVR2EN) -#define STM32_PLLCFG_PLL2M RCC_PLLCKSELR_DIVM2(4) -#define STM32_PLLCFG_PLL2N RCC_PLL2DIVR_N2(48) -#define STM32_PLLCFG_PLL2P RCC_PLL2DIVR_P2(2) -#define STM32_PLLCFG_PLL2Q RCC_PLL2DIVR_Q2(2) -#define STM32_PLLCFG_PLL2R RCC_PLL2DIVR_R2(2) - -#define STM32_VCO2_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) -#define STM32_PLL2P_FREQUENCY (STM32_VCO2_FREQUENCY / 2) -#define STM32_PLL2Q_FREQUENCY (STM32_VCO2_FREQUENCY / 2) -#define STM32_PLL2R_FREQUENCY (STM32_VCO2_FREQUENCY / 2) - -/* PLL3 */ - -#define STM32_PLLCFG_PLL3CFG (RCC_PLLCFGR_PLL3VCOSEL_WIDE | \ - RCC_PLLCFGR_PLL3RGE_4_8_MHZ | \ - RCC_PLLCFGR_DIVQ3EN) -#define STM32_PLLCFG_PLL3M RCC_PLLCKSELR_DIVM3(4) -#define STM32_PLLCFG_PLL3N RCC_PLL3DIVR_N3(48) -#define STM32_PLLCFG_PLL3P RCC_PLL3DIVR_P3(2) -#define STM32_PLLCFG_PLL3Q RCC_PLL3DIVR_Q3(4) -#define STM32_PLLCFG_PLL3R RCC_PLL3DIVR_R3(2) - -#define STM32_VCO3_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) -#define STM32_PLL3P_FREQUENCY (STM32_VCO3_FREQUENCY / 2) -#define STM32_PLL3Q_FREQUENCY (STM32_VCO3_FREQUENCY / 4) -#define STM32_PLL3R_FREQUENCY (STM32_VCO3_FREQUENCY / 2) - -/* SYSCLK = PLL1P = 480MHz - * CPUCLK = SYSCLK / 1 = 480 MHz - */ - -#define STM32_RCC_D1CFGR_D1CPRE (RCC_D1CFGR_D1CPRE_SYSCLK) -#define STM32_SYSCLK_FREQUENCY (STM32_PLL1P_FREQUENCY) -#define STM32_CPUCLK_FREQUENCY (STM32_SYSCLK_FREQUENCY / 1) - -/* Configure Clock Assignments */ - -/* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) - * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 - */ - -#define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ -#define STM32_ACLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* ACLK in D1, HCLK3 in D1 */ -#define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ -#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ - -/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ - -#define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ -#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) - -/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ - -#define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ -#define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) - -/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ - -#define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ -#define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) - -/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ - -#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ -#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) - -/* Timer clock frequencies */ - -/* Timers driven from APB1 will be twice PCLK1 */ - -#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) - -/* Timers driven from APB2 will be twice PCLK2 */ - -#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) -#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) -#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) -#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) -#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) - -/* Kernel Clock Configuration - * - * Note: look at Table 54 in ST Manual - */ - -/* I2C123 clock source */ - -#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI - -/* I2C4 clock source */ - -#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI - -/* SPI123 clock source */ - -#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 - -/* SPI45 clock source */ - -#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 - -/* SPI6 clock source */ - -#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 - -/* USB 1 and 2 clock source */ - -#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 - -/* ADC 1 2 3 clock source */ - -#define STM32_RCC_D3CCIPR_ADCSEL RCC_D3CCIPR_ADCSEL_PLL2 - -/* CAN FD clock source */ -#define STM32_FDCANCLK STM32_HSE_FREQUENCY - -/* FLASH wait states - * - * ------------ ---------- ----------- - * Vcore MAX ACLK WAIT STATES - * ------------ ---------- ----------- - * 1.15-1.26 V 70 MHz 0 - * (VOS1 level) 140 MHz 1 - * 210 MHz 2 - * 1.05-1.15 V 55 MHz 0 - * (VOS2 level) 110 MHz 1 - * 165 MHz 2 - * 220 MHz 3 - * 0.95-1.05 V 45 MHz 0 - * (VOS3 level) 90 MHz 1 - * 135 MHz 2 - * 180 MHz 3 - * 225 MHz 4 - * ------------ ---------- ----------- - */ - -#define BOARD_FLASH_WAITSTATES 2 - -/* SDMMC definitions ********************************************************/ - -/* Init 400kHz, freq = PLL1Q/(2*div) div = PLL1Q/(2*freq) */ - -#define STM32_SDMMC_INIT_CLKDIV (300 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) - -/* 25 MHz Max for now, 25 mHZ = PLL1Q/(2*div), div = PLL1Q/(2*freq) - * div = 4.8 = 240 / 50, So round up to 5 for default speed 24 MB/s - */ - -#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) -# define STM32_SDMMC_MMCXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) -#else -# define STM32_SDMMC_MMCXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) -#endif -#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) -# define STM32_SDMMC_SDXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) -#else -# define STM32_SDMMC_SDXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) -#endif - -#define STM32_SDMMC_CLKCR_EDGE STM32_SDMMC_CLKCR_NEGEDGE - -/* LED definitions ******************************************************************/ -/* The PX4 FMUV6U board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and - * LED_RED a Red LED, that can be controlled by software. - * - * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. - * The following definitions are used to access individual LEDs. - */ - -/* LED index values for use with board_userled() */ - -/* LED definitions ******************************************************************/ -/* The px4_fmu-v6u board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and - * LED_RED a Red LED, that can be controlled by software. - * - * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. - * The following definitions are used to access individual LEDs. - */ - -/* LED index values for use with board_userled() */ - -#define BOARD_LED1 0 -#define BOARD_LED2 1 -#define BOARD_LED3 2 -#define BOARD_NLEDS 3 - -#define BOARD_LED_RED BOARD_LED1 -#define BOARD_LED_GREEN BOARD_LED2 -#define BOARD_LED_BLUE BOARD_LED3 - -/* LED bits for use with board_userled_all() */ - -#define BOARD_LED1_BIT (1 << BOARD_LED1) -#define BOARD_LED2_BIT (1 << BOARD_LED2) -#define BOARD_LED3_BIT (1 << BOARD_LED3) - -/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in - * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related - * events as follows: - * - * - * SYMBOL Meaning LED state - * Red Green Blue - * ---------------------- -------------------------- ------ ------ ----*/ - -#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ -#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ -#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ -#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ -#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ -#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ -#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ -#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ -#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ - -/* Thus if the Green LED is statically on, NuttX has successfully booted and - * is, apparently, running normally. If the Red LED is flashing at - * approximately 2Hz, then a fatal error has been detected and the system - * has halted. - */ - -/* Alternate function pin selections ************************************************/ - -#define GPIO_USART1_RX GPIO_USART1_RX_3 /* PB7 */ -#define GPIO_USART1_TX GPIO_USART1_TX_3 /* PB6 */ - -#define GPIO_USART2_RX GPIO_USART2_RX_2 /* PD6 */ -#define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ -#define GPIO_USART2_RTS GPIO_USART2_RTS_2 /* PD4 */ -#define GPIO_USART2_CTS GPIO_USART2_CTS_NSS_2 /* PD3 */ - -#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ -#define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ - -#define GPIO_UART4_RX GPIO_UART4_RX_6 /* PH14 */ -#define GPIO_UART4_TX GPIO_UART4_TX_6 /* PH13 */ - -#define GPIO_UART5_RX GPIO_UART5_RX_3 /* PD2 */ -#define GPIO_UART5_TX GPIO_UART5_TX_3 /* PC12 */ -// GPIO_UART5_RTS no remap /* PC8 */ -// GPIO_UART5_CTS No remap /* PC9 */ - -#define GPIO_USART6_RX GPIO_USART6_RX_1 /* PC7 */ -#define GPIO_USART6_TX GPIO_USART6_TX_1 /* PC6 */ - -#define GPIO_UART7_RX GPIO_UART7_RX_4 /* PF6 */ -#define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ -#define GPIO_UART7_RTS GPIO_UART7_RTS_2 /* PF8 */ -#define GPIO_UART7_CTS GPIO_UART7_CTS_1 /* PE10 */ - -#define GPIO_UART8_RX GPIO_UART8_RX_1 /* PE0 */ -#define GPIO_UART8_TX GPIO_UART8_TX_1 /* PE1 */ - - -/* CAN - * - * CAN1 is routed to transceiver. - * CAN2 is routed to transceiver. - */ -#define GPIO_CAN1_RX GPIO_CAN1_RX_3 /* PD0 */ -#define GPIO_CAN1_TX GPIO_CAN1_TX_3 /* PD1 */ - -/* SPI - * SPI1 is sensors1 - * SPI2 is sensors2 - * SPI3 is sensors3 - * SPI4 is Not Used - * SPI5 is FRAM - * SPI6 is EXTERNAL1 - * - */ - -#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) - -#define GPIO_SPI1_MISO GPIO_SPI1_MISO_3 /* PG9 */ -#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_1 /* PA7 */ -#define GPIO_SPI1_SCK ADJ_SLEW_RATE(GPIO_SPI1_SCK_3) /* PG11 */ - -#define GPIO_SPI2_MISO GPIO_SPI2_MISO_3 /* PI2 */ -#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_4 /* PI3 */ -#define GPIO_SPI2_SCK ADJ_SLEW_RATE(GPIO_SPI2_SCK_6) /* PI1 */ - -#define GPIO_SPI3_MISO GPIO_SPI3_MISO_2 /* PC11 */ -#define GPIO_SPI3_MOSI GPIO_SPI3_MOSI_3 /* PB2 */ -#define GPIO_SPI3_SCK ADJ_SLEW_RATE(GPIO_SPI3_SCK_2) /* PC10 */ - -#define GPIO_SPI5_MISO GPIO_SPI5_MISO_2 /* PH7 */ -#define GPIO_SPI5_MOSI GPIO_SPI5_MOSI_1 /* PF11 */ -#define GPIO_SPI5_SCK ADJ_SLEW_RATE(GPIO_SPI5_SCK_1) /* PF7 */ - -#define GPIO_SPI6_MISO GPIO_SPI6_MISO_2 /* PA6 */ -#define GPIO_SPI6_MOSI GPIO_SPI6_MOSI_1 /* PG14 */ -#define GPIO_SPI6_SCK ADJ_SLEW_RATE(GPIO_SPI6_SCK_1) /* PG13 */ - -/* I2C - * - * The optional _GPIO configurations allow the I2C driver to manually - * reset the bus to clear stuck slaves. They match the pin configuration, - * but are normally-high GPIOs. - * - */ - -#define GPIO_I2C1_SCL GPIO_I2C1_SCL_2 /* PB8 */ -#define GPIO_I2C1_SDA GPIO_I2C1_SDA_2 /* PB9 */ - -#define GPIO_I2C1_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN8) -#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN9) - -#define GPIO_I2C2_SCL GPIO_I2C2_SCL_2 /* PF1 */ -#define GPIO_I2C2_SDA GPIO_I2C2_SDA_2 /* PF0 */ - -#define GPIO_I2C2_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN1) -#define GPIO_I2C2_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN0) - -#define GPIO_I2C3_SCL GPIO_I2C3_SCL_1 /* PA8 */ -#define GPIO_I2C3_SDA GPIO_I2C3_SDA_2 /* PH8 */ - -#define GPIO_I2C3_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTA | GPIO_PIN8) -#define GPIO_I2C3_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTH | GPIO_PIN8) - -#define GPIO_I2C4_SCL GPIO_I2C4_SCL_2 /* PF14 */ -#define GPIO_I2C4_SDA GPIO_I2C4_SDA_2 /* PF15 */ - -#define GPIO_I2C4_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN14) -#define GPIO_I2C4_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN15) - -/* SDMMC2 - * - * VDD 3.3 - * GND - * SDMMC2_CK PD6 - * SDMMC2_CMD PD7 - * SDMMC2_D0 PB14 - * SDMMC2_D1 PB15 - * SDMMC2_D2 PG11 - * SDMMC2_D3 PB4 - */ - -#define GPIO_SDMMC2_CK GPIO_SDMMC2_CK_2 /* PC1 */ -#define GPIO_SDMMC2_CMD GPIO_SDMMC2_CMD_1 /* PD7 */ -// GPIO_SDMMC2_D0 No Remap /* PB14 */ -// GPIO_SDMMC2_D1 No Remap /* PB15 */ -#define GPIO_SDMMC2_D2 GPIO_SDMMC2_D2_2 /* PB3 */ -// GPIO_SDMMC2_D3 No Remap /* PB4 */ - - -/* USB - * - * OTG_FS_DM PA11 - * OTG_FS_DP PA12 - * VBUS PA9 - */ - - -/* Board provides GPIO or other Hardware for signaling to timing analyzer */ - -#if defined(CONFIG_BOARD_USE_PROBES) -# include "stm32_gpio.h" -# define PROBE_N(n) (1<<((n)-1)) -# define PROBE_1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN0) /* PI0 AUX1 */ -# define PROBE_2 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN12) /* PH12 AUX2 */ -# define PROBE_3 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN11) /* PH11 AUX3 */ -# define PROBE_4 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN10) /* PH10 AUX4 */ -# define PROBE_5 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN13) /* PD13 AUX5 */ -# define PROBE_6 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14) /* PD14 AUX6 */ -# define PROBE_7 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN6) /* PH6 AUX7 */ -# define PROBE_8 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN9) /* PH9 AUX8 */ -# define PROBE_9 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN11) /* PE11 CAP1 */ - -# define PROBE_INIT(mask) \ - do { \ - if ((mask)& PROBE_N(1)) { stm32_configgpio(PROBE_1); } \ - if ((mask)& PROBE_N(2)) { stm32_configgpio(PROBE_2); } \ - if ((mask)& PROBE_N(3)) { stm32_configgpio(PROBE_3); } \ - if ((mask)& PROBE_N(4)) { stm32_configgpio(PROBE_4); } \ - if ((mask)& PROBE_N(5)) { stm32_configgpio(PROBE_5); } \ - if ((mask)& PROBE_N(6)) { stm32_configgpio(PROBE_6); } \ - if ((mask)& PROBE_N(7)) { stm32_configgpio(PROBE_7); } \ - if ((mask)& PROBE_N(8)) { stm32_configgpio(PROBE_8); } \ - if ((mask)& PROBE_N(9)) { stm32_configgpio(PROBE_9); } \ - } while(0) - -# define PROBE(n,s) do {stm32_gpiowrite(PROBE_##n,(s));}while(0) -# define PROBE_MARK(n) PROBE(n,false);PROBE(n,true) -#else -# define PROBE_INIT(mask) -# define PROBE(n,s) -# define PROBE_MARK(n) -#endif - -#endif /*__NUTTX_CONFIG_PX4_FMU_V6U_INCLUDE_BOARD_H */ diff --git a/boards/px4/fmu-v6u/nuttx-config/include/board_dma_map.h b/boards/px4/fmu-v6u/nuttx-config/include/board_dma_map.h deleted file mode 100644 index f17c289..0000000 --- a/boards/px4/fmu-v6u/nuttx-config/include/board_dma_map.h +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#pragma once - -// DMAMUX1 -#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* DMA1:37 */ -#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* DMA1:38 */ - -#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* DMA1:39 */ -#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* DMA1:40 */ - -// DMAMUX2 -#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_1 /* DMA2:61 */ -#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_1 /* DMA2:62 */ - -#define DMAMAP_SPI6_RX DMAMAP_BDMA_SPI6_RX /* BDMA:11 */ -#define DMAMAP_SPI6_TX DMAMAP_BDMA_SPI6_TX /* BDMA:12 */ diff --git a/boards/px4/fmu-v6u/nuttx-config/nsh/defconfig b/boards/px4/fmu-v6u/nuttx-config/nsh/defconfig deleted file mode 100644 index f716ae6..0000000 --- a/boards/px4/fmu-v6u/nuttx-config/nsh/defconfig +++ /dev/null @@ -1,275 +0,0 @@ -# -# This file is autogenerated: PLEASE DO NOT EDIT IT. -# -# You can use "make menuconfig" to make any modifications to the installed .config file. -# You can then do "make savedefconfig" to generate a new defconfig file that includes your -# modifications. -# -# CONFIG_DISABLE_ENVIRON is not set -# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set -# CONFIG_DISABLE_PTHREAD is not set -# CONFIG_MMCSD_HAVE_CARDDETECT is not set -# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set -# CONFIG_MMCSD_MMCSUPPORT is not set -# CONFIG_MMCSD_SPI is not set -# CONFIG_NSH_DISABLEBG is not set -# CONFIG_NSH_DISABLESCRIPT is not set -# CONFIG_NSH_DISABLE_CAT is not set -# CONFIG_NSH_DISABLE_CD is not set -# CONFIG_NSH_DISABLE_CP is not set -# CONFIG_NSH_DISABLE_DATE is not set -# CONFIG_NSH_DISABLE_DF is not set -# CONFIG_NSH_DISABLE_ECHO is not set -# CONFIG_NSH_DISABLE_ENV is not set -# CONFIG_NSH_DISABLE_EXEC is not set -# CONFIG_NSH_DISABLE_EXIT is not set -# CONFIG_NSH_DISABLE_EXPORT is not set -# CONFIG_NSH_DISABLE_FREE is not set -# CONFIG_NSH_DISABLE_GET is not set -# CONFIG_NSH_DISABLE_HELP is not set -# CONFIG_NSH_DISABLE_ITEF is not set -# CONFIG_NSH_DISABLE_KILL is not set -# CONFIG_NSH_DISABLE_LOOPS is not set -# CONFIG_NSH_DISABLE_LS is not set -# CONFIG_NSH_DISABLE_MKDIR is not set -# CONFIG_NSH_DISABLE_MKFATFS is not set -# CONFIG_NSH_DISABLE_MOUNT is not set -# CONFIG_NSH_DISABLE_MV is not set -# CONFIG_NSH_DISABLE_PS is not set -# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set -# CONFIG_NSH_DISABLE_PWD is not set -# CONFIG_NSH_DISABLE_RM is not set -# CONFIG_NSH_DISABLE_RMDIR is not set -# CONFIG_NSH_DISABLE_SEMICOLON is not set -# CONFIG_NSH_DISABLE_SET is not set -# CONFIG_NSH_DISABLE_SLEEP is not set -# CONFIG_NSH_DISABLE_SOURCE is not set -# CONFIG_NSH_DISABLE_TEST is not set -# CONFIG_NSH_DISABLE_TIME is not set -# CONFIG_NSH_DISABLE_UMOUNT is not set -# CONFIG_NSH_DISABLE_UNSET is not set -# CONFIG_NSH_DISABLE_USLEEP is not set -CONFIG_ARCH="arm" -CONFIG_ARCH_BOARD_CUSTOM=y -CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/px4/fmu-v6u/nuttx-config" -CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y -CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" -CONFIG_ARCH_CHIP="stm32h7" -CONFIG_ARCH_CHIP_STM32H753II=y -CONFIG_ARCH_CHIP_STM32H7=y -CONFIG_ARCH_INTERRUPTSTACK=768 -CONFIG_ARCH_STACKDUMP=y -CONFIG_ARMV7M_BASEPRI_WAR=y -CONFIG_ARMV7M_DCACHE=y -CONFIG_ARMV7M_DTCM=y -CONFIG_ARMV7M_ICACHE=y -CONFIG_ARMV7M_MEMCPY=y -CONFIG_ARMV7M_USEBASEPRI=y -CONFIG_ARM_MPU_EARLY_RESET=y -CONFIG_BOARDCTL_RESET=y -CONFIG_BOARD_ASSERT_RESET_VALUE=0 -CONFIG_BOARD_CRASHDUMP=y -CONFIG_BOARD_LOOPSPERMSEC=95751 -CONFIG_BOARD_RESET_ON_ASSERT=2 -CONFIG_BUILTIN=y -CONFIG_CDCACM=y -CONFIG_CDCACM_IFLOWCONTROL=y -CONFIG_CDCACM_PRODUCTID=0x0036 -CONFIG_CDCACM_PRODUCTSTR="PX4 FMU v6U.x" -CONFIG_CDCACM_RXBUFSIZE=600 -CONFIG_CDCACM_TXBUFSIZE=12000 -CONFIG_CDCACM_VENDORID=0x1B8C -CONFIG_CDCACM_VENDORSTR="Gumstix" -CONFIG_DEBUG_FULLOPT=y -CONFIG_DEBUG_HARDFAULT_ALERT=y -CONFIG_DEBUG_MEMFAULT=y -CONFIG_DEBUG_SYMBOLS=y -CONFIG_DEBUG_TCBINFO=y -CONFIG_DEFAULT_SMALL=y -CONFIG_DEV_FIFO_SIZE=0 -CONFIG_DEV_PIPE_MAXSIZE=1024 -CONFIG_DEV_PIPE_SIZE=70 -CONFIG_EXPERIMENTAL=y -CONFIG_FAT_DMAMEMORY=y -CONFIG_FAT_LCNAMES=y -CONFIG_FAT_LFN=y -CONFIG_FAT_LFN_ALIAS_HASH=y -CONFIG_FDCLONE_STDIO=y -CONFIG_FS_BINFS=y -CONFIG_FS_CROMFS=y -CONFIG_FS_FAT=y -CONFIG_FS_FATTIME=y -CONFIG_FS_PROCFS=y -CONFIG_FS_PROCFS_INCLUDE_PROGMEM=y -CONFIG_FS_PROCFS_MAX_TASKS=64 -CONFIG_FS_PROCFS_REGISTER=y -CONFIG_FS_ROMFS=y -CONFIG_GRAN=y -CONFIG_GRAN_INTR=y -CONFIG_HAVE_CXX=y -CONFIG_HAVE_CXXINITIALIZE=y -CONFIG_I2C=y -CONFIG_I2C_RESET=y -CONFIG_IDLETHREAD_STACKSIZE=750 -CONFIG_INIT_ENTRYPOINT="nsh_main" -CONFIG_INIT_STACKSIZE=2944 -CONFIG_IOB_NBUFFERS=24 -CONFIG_IOB_NCHAINS=24 -CONFIG_LIBC_FLOATINGPOINT=y -CONFIG_LIBC_LONG_LONG=y -CONFIG_LIBC_MAX_EXITFUNS=1 -CONFIG_LIBC_STRERROR=y -CONFIG_MEMSET_64BIT=y -CONFIG_MEMSET_OPTSPEED=y -CONFIG_MMCSD=y -CONFIG_MMCSD_SDIO=y -CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y -CONFIG_MM_IOB=y -CONFIG_MM_REGIONS=4 -CONFIG_MTD=y -CONFIG_MTD_BYTE_WRITE=y -CONFIG_MTD_PARTITION=y -CONFIG_MTD_PROGMEM=y -CONFIG_MTD_RAMTRON=y -CONFIG_NAME_MAX=40 -CONFIG_NSH_ARCHINIT=y -CONFIG_NSH_ARGCAT=y -CONFIG_NSH_BUILTIN_APPS=y -CONFIG_NSH_CMDPARMS=y -CONFIG_NSH_CROMFSETC=y -CONFIG_NSH_LINELEN=128 -CONFIG_NSH_MAXARGUMENTS=15 -CONFIG_NSH_NESTDEPTH=8 -CONFIG_NSH_QUOTE=y -CONFIG_NSH_ROMFSETC=y -CONFIG_NSH_ROMFSSECTSIZE=128 -CONFIG_NSH_STRERROR=y -CONFIG_NSH_VARS=y -CONFIG_OTG_ID_GPIO_DISABLE=y -CONFIG_PIPES=y -CONFIG_PREALLOC_TIMERS=50 -CONFIG_PRIORITY_INHERITANCE=y -CONFIG_PTHREAD_MUTEX_ROBUST=y -CONFIG_PTHREAD_STACK_MIN=512 -CONFIG_RAMTRON_SETSPEED=y -CONFIG_RAM_SIZE=245760 -CONFIG_RAM_START=0x20010000 -CONFIG_RAW_BINARY=y -CONFIG_READLINE_CMD_HISTORY=y -CONFIG_READLINE_TABCOMPLETION=y -CONFIG_RTC_DATETIME=y -CONFIG_SCHED_HPWORK=y -CONFIG_SCHED_HPWORKPRIORITY=249 -CONFIG_SCHED_HPWORKSTACKSIZE=1280 -CONFIG_SCHED_INSTRUMENTATION=y -CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y -CONFIG_SCHED_INSTRUMENTATION_SWITCH=y -CONFIG_SCHED_LPWORK=y -CONFIG_SCHED_LPWORKPRIORITY=50 -CONFIG_SCHED_LPWORKSTACKSIZE=1632 -CONFIG_SCHED_WAITPID=y -CONFIG_SDMMC2_SDIO_PULLUP=y -CONFIG_SEM_PREALLOCHOLDERS=32 -CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS=y -CONFIG_SERIAL_TERMIOS=y -CONFIG_SIG_DEFAULT=y -CONFIG_SIG_SIGALRM_ACTION=y -CONFIG_SIG_SIGUSR1_ACTION=y -CONFIG_SIG_SIGUSR2_ACTION=y -CONFIG_SIG_SIGWORK=4 -CONFIG_STACK_COLORATION=y -CONFIG_START_DAY=30 -CONFIG_START_MONTH=11 -CONFIG_STDIO_BUFFER_SIZE=256 -CONFIG_STM32H7_ADC1=y -CONFIG_STM32H7_ADC3=y -CONFIG_STM32H7_BBSRAM=y -CONFIG_STM32H7_BBSRAM_FILES=5 -CONFIG_STM32H7_BDMA=y -CONFIG_STM32H7_BKPSRAM=y -CONFIG_STM32H7_DMA1=y -CONFIG_STM32H7_DMA2=y -CONFIG_STM32H7_DMACAPABLE=y -CONFIG_STM32H7_FLASH_OVERRIDE_I=y -CONFIG_STM32H7_FLOWCONTROL_BROKEN=y -CONFIG_STM32H7_I2C1=y -CONFIG_STM32H7_I2C2=y -CONFIG_STM32H7_I2C3=y -CONFIG_STM32H7_I2C4=y -CONFIG_STM32H7_I2C_DYNTIMEO=y -CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 -CONFIG_STM32H7_OTGFS=y -CONFIG_STM32H7_PROGMEM=y -CONFIG_STM32H7_RTC=y -CONFIG_STM32H7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y -CONFIG_STM32H7_RTC_MAGIC_REG=1 -CONFIG_STM32H7_SAVE_CRASHDUMP=y -CONFIG_STM32H7_SDMMC2=y -CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y -CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y -CONFIG_STM32H7_SPI1=y -CONFIG_STM32H7_SPI1_DMA=y -CONFIG_STM32H7_SPI1_DMA_BUFFER=1024 -CONFIG_STM32H7_SPI2=y -CONFIG_STM32H7_SPI2_DMA=y -CONFIG_STM32H7_SPI2_DMA_BUFFER=4096 -CONFIG_STM32H7_SPI3=y -CONFIG_STM32H7_SPI3_DMA=y -CONFIG_STM32H7_SPI3_DMA_BUFFER=1024 -CONFIG_STM32H7_SPI5=y -CONFIG_STM32H7_SPI6=y -CONFIG_STM32H7_SPI6_DMA=y -CONFIG_STM32H7_SPI6_DMA_BUFFER=1024 -CONFIG_STM32H7_TIM12=y -CONFIG_STM32H7_TIM1=y -CONFIG_STM32H7_TIM4=y -CONFIG_STM32H7_TIM5=y -CONFIG_STM32H7_UART4=y -CONFIG_STM32H7_UART5=y -CONFIG_STM32H7_UART7=y -CONFIG_STM32H7_UART8=y -CONFIG_STM32H7_USART1=y -CONFIG_STM32H7_USART2=y -CONFIG_STM32H7_USART3=y -CONFIG_STM32H7_USART6=y -CONFIG_STM32H7_USART_BREAKS=y -CONFIG_STM32H7_USART_INVERT=y -CONFIG_STM32H7_USART_SINGLEWIRE=y -CONFIG_STM32H7_USART_SWAP=y -CONFIG_SYSTEM_CDCACM=y -CONFIG_SYSTEM_NSH=y -CONFIG_TASK_NAME_SIZE=24 -CONFIG_UART4_BAUD=57600 -CONFIG_UART4_RXBUFSIZE=600 -CONFIG_UART4_TXBUFSIZE=1500 -CONFIG_UART5_IFLOWCONTROL=y -CONFIG_UART5_OFLOWCONTROL=y -CONFIG_UART7_BAUD=57600 -CONFIG_UART7_IFLOWCONTROL=y -CONFIG_UART7_OFLOWCONTROL=y -CONFIG_UART7_RXBUFSIZE=600 -CONFIG_UART7_TXBUFSIZE=3000 -CONFIG_UART8_BAUD=57600 -CONFIG_UART8_RXBUFSIZE=600 -CONFIG_UART8_TXBUFSIZE=1500 -CONFIG_USART1_BAUD=57600 -CONFIG_USART1_RXBUFSIZE=600 -CONFIG_USART1_TXBUFSIZE=1500 -CONFIG_USART2_BAUD=57600 -CONFIG_USART2_IFLOWCONTROL=y -CONFIG_USART2_OFLOWCONTROL=y -CONFIG_USART2_RXBUFSIZE=600 -CONFIG_USART2_TXBUFSIZE=3000 -CONFIG_USART3_BAUD=57600 -CONFIG_USART3_RXBUFSIZE=180 -CONFIG_USART3_SERIAL_CONSOLE=y -CONFIG_USART3_TXBUFSIZE=1500 -CONFIG_USART6_BAUD=57600 -CONFIG_USART6_RXBUFSIZE=600 -CONFIG_USART6_TXBUFSIZE=1500 -CONFIG_USBDEV=y -CONFIG_USBDEV_BUSPOWERED=y -CONFIG_USBDEV_MAXPOWER=500 -CONFIG_USEC_PER_TICK=1000 -CONFIG_WATCHDOG=y -CONFIG_WQUEUE_NOTIFIER=y diff --git a/boards/px4/fmu-v6u/nuttx-config/scripts/bootloader_script.ld b/boards/px4/fmu-v6u/nuttx-config/scripts/bootloader_script.ld deleted file mode 100644 index 5d8eb37..0000000 --- a/boards/px4/fmu-v6u/nuttx-config/scripts/bootloader_script.ld +++ /dev/null @@ -1,215 +0,0 @@ -/**************************************************************************** - * scripts/script.ld - * - * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/* The PX4 FMUV6U uses an STM32H753II has 2048Kb of main FLASH memory. - * The flash memory is partitioned into a User Flash memory and a System - * Flash memory. Each of these memories has two banks: - * - * 1) User Flash memory: - * - * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each - * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each - * - * 2) System Flash memory: - * - * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector - * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector - * - * 3) User option bytes for user configuration, only in Bank 1. - * - * In the STM32H743II, two different boot spaces can be selected through - * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and - * BOOT_ADD1 option bytes: - * - * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. - * ST programmed value: Flash memory at 0x0800:0000 - * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. - * ST programmed value: System bootloader at 0x1FF0:0000 - * - * The PX4 FMUV6U has a test point on board, the BOOT0 pin is at ground so by - * default, the STM32 will boot to address 0x0800:0000 in FLASH unless the test - * point is pulled to 3.3V.then the boot will be from 0x1FF0:0000 - * - * The STM32H743II also has 1024Kb of data SRAM. - * SRAM is split up into several blocks and into three power domains: - * - * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with - * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus - * - * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 - * - * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit - * DTCM ports. The DTCM-RAM could be used for critical real-time - * data, such as interrupt service routines or stack / heap memory. - * Both DTCM-RAMs can be used in parallel (for load/store operations) - * thanks to the Cortex-M7 dual issue capability. - * - * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 - * - * This RAM is connected to ITCM 64-bit interface designed for - * execution of critical real-times routines by the CPU. - * - * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA - * through D1 domain AXI bus matrix - * - * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 - * - * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA - * through D2 domain AHB bus matrix - * - * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 - * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 - * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 - * - * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 - * - * 4) AHB SRAM (D3 domain) accessible by most of system masters - * through D3 domain AHB bus matrix - * - * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 - * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 - * - * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 - * where the code expects to begin execution by jumping to the entry point in - * the 0x0800:0000 address range. - * - * The bootloader uses the first sector of the flash, which is 128K in length. - */ - -MEMORY -{ - itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K - flash (rx) : ORIGIN = 0x08000000, LENGTH = 128K - dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K - sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K - sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K - sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K - sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K - sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K - bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K -} - -OUTPUT_ARCH(arm) -EXTERN(_vectors) -ENTRY(_stext) - -/* - * Ensure that abort() is present in the final object. The exception handling - * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). - */ -EXTERN(abort) -EXTERN(_bootdelay_signature) - -SECTIONS -{ - .text : { - _stext = ABSOLUTE(.); - *(.vectors) - . = ALIGN(32); - /* - This signature provides the bootloader with a way to delay booting - */ - _bootdelay_signature = ABSOLUTE(.); - FILL(0xffecc2925d7d05c5) - . += 8; - *(.text .text.*) - *(.fixup) - *(.gnu.warning) - *(.rodata .rodata.*) - *(.gnu.linkonce.t.*) - *(.glue_7) - *(.glue_7t) - *(.got) - *(.gcc_except_table) - *(.gnu.linkonce.r.*) - _etext = ABSOLUTE(.); - - } > flash - - /* - * Init functions (static constructors and the like) - */ - .init_section : { - _sinit = ABSOLUTE(.); - KEEP(*(.init_array .init_array.*)) - _einit = ABSOLUTE(.); - } > flash - - - .ARM.extab : { - *(.ARM.extab*) - } > flash - - __exidx_start = ABSOLUTE(.); - .ARM.exidx : { - *(.ARM.exidx*) - } > flash - __exidx_end = ABSOLUTE(.); - - _eronly = ABSOLUTE(.); - - .data : { - _sdata = ABSOLUTE(.); - *(.data .data.*) - *(.gnu.linkonce.d.*) - CONSTRUCTORS - _edata = ABSOLUTE(.); - } > sram AT > flash - - .bss : { - _sbss = ABSOLUTE(.); - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - _ebss = ABSOLUTE(.); - } > sram - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_info 0 : { *(.debug_info) } - .debug_line 0 : { *(.debug_line) } - .debug_pubnames 0 : { *(.debug_pubnames) } - .debug_aranges 0 : { *(.debug_aranges) } -} diff --git a/boards/px4/fmu-v6u/nuttx-config/scripts/script.ld b/boards/px4/fmu-v6u/nuttx-config/scripts/script.ld deleted file mode 100644 index 673116d..0000000 --- a/boards/px4/fmu-v6u/nuttx-config/scripts/script.ld +++ /dev/null @@ -1,229 +0,0 @@ -/**************************************************************************** - * scripts/script.ld - * - * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/* The PX4 FMUV6U uses an STM32H753II has 2048Kb of main FLASH memory. - * The flash memory is partitioned into a User Flash memory and a System - * Flash memory. Each of these memories has two banks: - * - * 1) User Flash memory: - * - * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each - * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each - * - * 2) System Flash memory: - * - * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector - * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector - * - * 3) User option bytes for user configuration, only in Bank 1. - * - * In the STM32H743II, two different boot spaces can be selected through - * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and - * BOOT_ADD1 option bytes: - * - * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. - * ST programmed value: Flash memory at 0x0800:0000 - * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. - * ST programmed value: System bootloader at 0x1FF0:0000 - * - * The PX4 FMUV6U has a test point on board, the BOOT0 pin is at ground so by - * default, the STM32 will boot to address 0x0800:0000 in FLASH unless the test - * point is pulled to 3.3V.then the boot will be from 0x1FF0:0000 - * - * The STM32H743II also has 1024Kb of data SRAM. - * SRAM is split up into several blocks and into three power domains: - * - * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with - * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus - * - * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 - * - * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit - * DTCM ports. The DTCM-RAM could be used for critical real-time - * data, such as interrupt service routines or stack / heap memory. - * Both DTCM-RAMs can be used in parallel (for load/store operations) - * thanks to the Cortex-M7 dual issue capability. - * - * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 - * - * This RAM is connected to ITCM 64-bit interface designed for - * execution of critical real-times routines by the CPU. - * - * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA - * through D1 domain AXI bus matrix - * - * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 - * - * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA - * through D2 domain AHB bus matrix - * - * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 - * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 - * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 - * - * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 - * - * 4) AHB SRAM (D3 domain) accessible by most of system masters - * through D3 domain AHB bus matrix - * - * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 - * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 - * - * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 - * where the code expects to begin execution by jumping to the entry point in - * the 0x0800:0000 address range. - */ - -MEMORY -{ - ITCM_RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 64K - FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1920K - - DTCM1_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - DTCM2_RAM (rwx) : ORIGIN = 0x20010000, LENGTH = 64K - AXI_SRAM (rwx) : ORIGIN = 0x24000000, LENGTH = 512K /* D1 domain AXI bus */ - SRAM1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K /* D2 domain AHB bus */ - SRAM2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K /* D2 domain AHB bus */ - SRAM3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K /* D2 domain AHB bus */ - SRAM4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K /* D3 domain */ - BKPRAM (rwx) : ORIGIN = 0x38800000, LENGTH = 4K -} - -OUTPUT_ARCH(arm) -EXTERN(_vectors) -ENTRY(_stext) - -/* - * Ensure that abort() is present in the final object. The exception handling - * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). - */ -EXTERN(abort) -EXTERN(_bootdelay_signature) -EXTERN(board_get_manifest) - -SECTIONS -{ - .text : { - _stext = ABSOLUTE(.); - *(.vectors) - . = ALIGN(32); - /* - This signature provides the bootloader with a way to delay booting - */ - _bootdelay_signature = ABSOLUTE(.); - FILL(0xffecc2925d7d05c5) - . += 8; - *(.text .text.*) - *(.fixup) - *(.gnu.warning) - *(.rodata .rodata.*) - *(.gnu.linkonce.t.*) - *(.glue_7) - *(.glue_7t) - *(.got) - *(.gcc_except_table) - *(.gnu.linkonce.r.*) - _etext = ABSOLUTE(.); - - } > FLASH - - /* - * Init functions (static constructors and the like) - */ - .init_section : { - _sinit = ABSOLUTE(.); - KEEP(*(.init_array .init_array.*)) - _einit = ABSOLUTE(.); - } > FLASH - - - .ARM.extab : { - *(.ARM.extab*) - } > FLASH - - __exidx_start = ABSOLUTE(.); - .ARM.exidx : { - *(.ARM.exidx*) - } > FLASH - __exidx_end = ABSOLUTE(.); - - _eronly = ABSOLUTE(.); - - .data : { - _sdata = ABSOLUTE(.); - *(.data .data.*) - *(.gnu.linkonce.d.*) - CONSTRUCTORS - _edata = ABSOLUTE(.); - - /* Pad out last section as the STM32H7 Flash write size is 256 bits. 32 bytes */ - . = ALIGN(16); - FILL(0xffff) - . += 16; - } > AXI_SRAM AT > FLASH = 0xffff - - .bss : { - _sbss = ABSOLUTE(.); - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - _ebss = ABSOLUTE(.); - } > AXI_SRAM - - /* Emit the the D3 power domain section for locating BDMA data */ - - .sram4_reserve (NOLOAD) : - { - *(.sram4) - . = ALIGN(4); - _sram4_heap_start = ABSOLUTE(.); - } > SRAM4 - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_info 0 : { *(.debug_info) } - .debug_line 0 : { *(.debug_line) } - .debug_pubnames 0 : { *(.debug_pubnames) } - .debug_aranges 0 : { *(.debug_aranges) } -} diff --git a/boards/px4/fmu-v6u/src/CMakeLists.txt b/boards/px4/fmu-v6u/src/CMakeLists.txt deleted file mode 100644 index c84d6f2..0000000 --- a/boards/px4/fmu-v6u/src/CMakeLists.txt +++ /dev/null @@ -1,71 +0,0 @@ -############################################################################ -# -# Copyright (c) 2016 PX4 Development Team. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# 3. Neither the name PX4 nor the names of its contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -############################################################################ -if("${PX4_BOARD_LABEL}" STREQUAL "bootloader") - add_library(drivers_board - bootloader_main.c - usb.c - ) - target_link_libraries(drivers_board - PRIVATE - nuttx_arch # sdio - nuttx_drivers # sdio - bootloader - ) - target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) - -else() - add_library(drivers_board - can.c - i2c.cpp - init.c - led.c - mtd.cpp - manifest.c - sdio.c - spi.cpp - timer_config.cpp - usb.c - ) - add_dependencies(drivers_board arch_board_hw_info) - - target_link_libraries(drivers_board - PRIVATE - arch_io_pins - arch_spi - arch_board_hw_info - drivers__led # drv_led_start - nuttx_arch # sdio - nuttx_drivers # sdio - px4_layer - ) -endif() diff --git a/boards/px4/fmu-v6u/src/board_config.h b/boards/px4/fmu-v6u/src/board_config.h deleted file mode 100644 index a61f2a5..0000000 --- a/boards/px4/fmu-v6u/src/board_config.h +++ /dev/null @@ -1,440 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2016, 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file board_config.h - * - * PX4FMU-v6u internal definitions - */ - -#pragma once - -/**************************************************************************************************** - * Included Files - ****************************************************************************************************/ - -#include -#include -#include - -#include - -/**************************************************************************************************** - * Definitions - ****************************************************************************************************/ - -/* Configuration ************************************************************************************/ - -#define BOARD_HAS_LTC44XX_VALIDS 2 // N Bricks -#define BOARD_HAS_USB_VALID 1 // LTC Has USB valid -#define BOARD_HAS_NBAT_V 2d // 2 Digital Voltage -#define BOARD_HAS_NBAT_I 2d // 2 Digital Current - -/* PX4FMU GPIOs ***********************************************************************************/ - -/* Trace Clock and D0-D3 are available on the trace connector - * - * TRACECLK PE2 - Dedicated - Trace Connector Pin 1 - * TRACED0 PE3 - nLED_RED - Trace Connector Pin 3 - * TRACED1 PE4 - nLED_GREEN - Trace Connector Pin 5 - * TRACED2 PE5 - nLED_BLUE - Trace Connector Pin 7 - * TRACED3 PC12 - UART5_TX_TELEM2 - Trace Connector Pin 8 - - */ -#undef TRACE_PINS - -/* LEDs are driven with push open drain to support Anode to 5V or 3.3V or used as TRACE0-2 */ - -#if !defined(TRACE_PINS) -# define GPIO_nLED_RED /* PE3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN3) -# define GPIO_nLED_GREEN /* PE4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN4) -# define GPIO_nLED_BLUE /* PE5 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN5) - -# define BOARD_HAS_CONTROL_STATUS_LEDS 1 -# define BOARD_OVERLOAD_LED LED_RED -# define BOARD_ARMED_STATE_LED LED_BLUE - -#else -# if defined(CONFIG_STM32H7_UART5) && (GPIO_UART5_TX == GPIO_UART5_TX_3) -# error Need to disable CONFIG_STM32H7_UART5 for Trace 3 (Retarget to CAN2 if need be) -# endif -#endif - - -/* SPI */ - -#define SPI6_nRESET_EXTERNAL1 /* PF10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN10) -#define GPIO_SYNC /* PE9 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_100MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN9) - -/* I2C busses */ - -/* Devices on the onboard buses. - * - * Note that these are unshifted addresses. - */ -#define PX4_I2C_OBDEV_SE050 0x48 - -#define GPIO_I2C4_DRDY1_BMP388 /* PG5 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTG|GPIO_PIN5) - -/* - * ADC channels - * - * These are the channel numbers of the ADCs of the microcontroller that - * can be used by the Px4 Firmware in the adc driver - */ - -/* ADC defines to be used in sensors.cpp to read from a particular channel */ - -#define ADC1_CH(n) (n) - -/* N.B. there is no offset mapping needed for ADC3 because */ -#define ADC3_CH(n) (n) - -/* We are only use ADC3 for REV/VER. - * ADC3_6V6 and ADC3_3V3 are mapped back to ADC1 - * To do this We are relying on PC2_C, PC3_C being connected to PC2, PC3 - * respectively by the SYSCFG_PMCR default of setting for PC3SO PC2SO PA1SO - * PA0SO of 0. - * - * 0 Analog switch closed (pads are connected through the analog switch) - * - * So ADC3_INP0 is GPIO_ADC123_INP12 - * ADC3_INP1 is GPIO_ADC12_INP13 - */ - -/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ - -#define PX4_ADC_GPIO \ - /* PA0 */ GPIO_ADC1_INP16, \ - /* PA4 */ GPIO_ADC12_INP18, \ - /* PC2 */ GPIO_ADC123_INP12, \ - /* PC4 */ GPIO_ADC12_INP4, \ - /* PH3 */ GPIO_ADC3_INP14, \ - /* PH4 */ GPIO_ADC3_INP15 - -/* Define Channel numbers must match above GPIO pin IN(n)*/ -#define ADC_SCALED_VDD_3V3_SENSORS_CHANNEL /* PC4 */ ADC1_CH(4) -#define ADC_SCALED_V5_CHANNEL /* PA0 */ ADC1_CH(16) -#define ADC_ADC3_6V6_CHANNEL /* PC2 */ ADC3_CH(12) -#define ADC_ADC3_3V3_CHANNEL /* PA4 */ ADC1_CH(18) -#define ADC_HW_VER_SENSE_CHANNEL /* PH3 */ ADC3_CH(14) -#define ADC_HW_REV_SENSE_CHANNEL /* PH4 */ ADC3_CH(15) -#define ADC_BATTERY_VOLTAGE_CHANNEL ADC_ADC3_3V3_CHANNEL -#define ADC_BATTERY_CURRENT_CHANNEL ADC_ADC3_6V6_CHANNEL - -#define ADC_CHANNELS \ - ((1 << ADC_SCALED_VDD_3V3_SENSORS_CHANNEL) | \ - (1 << ADC_SCALED_V5_CHANNEL) | \ - (1 << ADC_ADC3_6V6_CHANNEL) | \ - (1 << ADC_ADC3_3V3_CHANNEL)) - -/* HW has to large of R termination on ADC todo:change when HW value is chosen */ - -#define HW_REV_VER_ADC_BASE STM32_ADC3_BASE - -#define SYSTEM_ADC_BASE STM32_ADC1_BASE - -/* HW has to large of R termination on ADC todo:change when HW value is chosen */ -#define BOARD_ADC_OPEN_CIRCUIT_V (5.6f) - -/* HW Version and Revision drive signals Default to 1 to detect */ -#define BOARD_HAS_HW_VERSIONING - -#define GPIO_HW_VER_REV_DRIVE /* PG0 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN0) -#define GPIO_HW_REV_SENSE /* PH4 */ GPIO_ADC3_INP15 -#define GPIO_HW_VER_SENSE /* PH3 */ GPIO_ADC3_INP14 -#define HW_INFO_INIT_PREFIX "V6U" -#define V6U00 HW_VER_REV(0x0,0x0) - -/* HEATER - * PWM in future - */ -#define GPIO_HEATER_OUTPUT /* PA2 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN2) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) - -/* PE6 is nARMED - * The GPIO will be set as input while not armed HW will have external HW Pull UP. - * While armed it shall be configured at a GPIO OUT set LOW - */ -#define GPIO_nARMED_INIT /* PE6 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN6) -#define GPIO_nARMED /* PE6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN6) - -#define BOARD_INDICATE_ARMED_STATE(on_armed) px4_arch_configgpio((on_armed) ? GPIO_nARMED : GPIO_nARMED_INIT) - -/* PWM - */ -#define DIRECT_PWM_OUTPUT_CHANNELS 9 - - -/* Power supply control and monitoring GPIOs */ - -#define GPIO_nPOWER_IN_A /* PG1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN1) -#define GPIO_nPOWER_IN_B /* PG2 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN2) -#define GPIO_nPOWER_IN_C /* PG3 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN3) - -#define GPIO_nVDD_BRICK1_VALID GPIO_nPOWER_IN_A /* Brick 1 Is Chosen */ -#define GPIO_nVDD_BRICK2_VALID GPIO_nPOWER_IN_B /* Brick 2 Is Chosen */ -#define BOARD_NUMBER_BRICKS 2 -#define BOARD_NUMBER_DIGITAL_BRICKS 2 -#define GPIO_nVDD_USB_VALID GPIO_nPOWER_IN_C /* USB Is Chosen */ - -#define GPIO_VDD_5V_PERIPH_nEN /* PG4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN4) -#define GPIO_VDD_5V_PERIPH_nOC /* PE15 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTE|GPIO_PIN15) -#define GPIO_VDD_5V_HIPOWER_nEN /* PG10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN10) -#define GPIO_VDD_5V_HIPOWER_nOC /* PF13 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTF|GPIO_PIN13) -#define GPIO_VDD_3V3_SENSORS_EN /* PG12 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN12) -#define GPIO_VDD_3V3_SPEKTRUM_POWER_EN /* PH2 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN2) -#define GPIO_VDD_3V3_SD_CARD_EN /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) - -/* Spare GPIO */ - -#define GPIO_PG6 /* PG6 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN6) -#define GPIO_PD15 /* PD15 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN15) -#define GPIO_PG15 /* PG15 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN15) - - -/* Define True logic Power Control in arch agnostic form */ - -#define VDD_5V_PERIPH_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_5V_PERIPH_nEN, !(on_true)) -#define VDD_5V_HIPOWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_5V_HIPOWER_nEN, !(on_true)) -#define VDD_3V3_SENSORS_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SENSORS_EN, (on_true)) -#define VDD_3V3_SPEKTRUM_POWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SPEKTRUM_POWER_EN, (on_true)) -#define READ_VDD_3V3_SPEKTRUM_POWER_EN() px4_arch_gpioread(GPIO_VDD_3V3_SPEKTRUM_POWER_EN) -#define VDD_3V3_SD_CARD_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SD_CARD_EN, (on_true)) - - -/* Tone alarm output */ - -#define TONE_ALARM_TIMER 14 /* Timer 14 */ -#define TONE_ALARM_CHANNEL 1 /* PF9 GPIO_TIM14_CH1OUT_2 */ - -#define GPIO_BUZZER_1 /* PF9 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN9) - -#define GPIO_TONE_ALARM_IDLE GPIO_BUZZER_1 -#define GPIO_TONE_ALARM GPIO_TIM14_CH1OUT_2 - -/* USB OTG FS - * - * PA9 OTG_FS_VBUS VBUS sensing - */ -#define GPIO_OTGFS_VBUS /* PA9 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN9) - -/* High-resolution timer */ -#define HRT_TIMER 8 /* use timer8 for the HRT */ -#define HRT_TIMER_CHANNEL 3 /* use capture/compare channel 3 */ - -#define HRT_PPM_CHANNEL /* T8C1 */ 1 /* use capture/compare channel 1 */ -#define GPIO_PPM_IN /* PI5 T8C1 */ GPIO_TIM8_CH1IN_2 - -/* RC Serial port */ - -#define RC_SERIAL_PORT "/dev/ttyS5" -#define RC_SERIAL_SINGLEWIRE -#define RC_SERIAL_SWAP_RXTX - -/* Input Capture Channels. */ -#define INPUT_CAP1_TIMER 1 -#define INPUT_CAP1_CHANNEL /* T1C2 */ 2 -#define GPIO_INPUT_CAP1 /* PE11 */ GPIO_TIM1_CH2IN - -/* PWM input driver. Use FMU AUX5 pins attached to timer4 channel 2 */ -#define PWMIN_TIMER 4 -#define PWMIN_TIMER_CHANNEL /* T4C2 */ 2 -#define GPIO_PWM_IN /* PD13 */ GPIO_TIM4_CH2IN_2 - -/* Safety Switch is HW version dependent on having an PX4IO - * So we init to a benign state with the _INIT definition - * and provide the the non _INIT one for the driver to make a run time - * decision to use it. - */ -#define GPIO_nSAFETY_SWITCH_LED_OUT_INIT /* PD10 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN10) -#define GPIO_nSAFETY_SWITCH_LED_OUT /* PD10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN10) - -/* Enable the FMU to control it if there is no px4io fixme:This should be BOARD_SAFETY_LED(__ontrue) */ -#define GPIO_LED_SAFETY GPIO_nSAFETY_SWITCH_LED_OUT - -#define GPIO_SAFETY_SWITCH_IN /* PF5 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN5) -/* Enable the FMU to use the switch it if there is no px4io fixme:This should be BOARD_SAFTY_BUTTON() */ -#define GPIO_BTN_SAFETY GPIO_SAFETY_SWITCH_IN /* Enable the FMU to control it if there is no px4io */ - -/* Power switch controls ******************************************************/ - -#define SPEKTRUM_POWER(_on_true) VDD_3V3_SPEKTRUM_POWER_EN(_on_true) - -/* - * FMUv6U has a separate RC_IN - * - * GPIO PPM_IN on PI5 T8CH1 - * SPEKTRUM_RX (it's TX or RX in Bind) on UART6 PC7 - * Inversion is possible in the UART and can drive GPIO PPM_IN as an output - */ - -#define GPIO_PPM_IN_AS_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTI|GPIO_PIN5) -#define SPEKTRUM_RX_AS_GPIO_OUTPUT() px4_arch_configgpio(GPIO_PPM_IN_AS_OUT) -#define SPEKTRUM_RX_AS_UART() /* Can be left as uart */ -#define SPEKTRUM_OUT(_one_true) px4_arch_gpiowrite(GPIO_PPM_IN_AS_OUT, (_one_true)) - -#define SDIO_SLOTNO 0 /* Only one slot */ -#define SDIO_MINOR 0 - -/* SD card bringup does not work if performed on the IDLE thread because it - * will cause waiting. Use either: - * - * CONFIG_BOARDCTL=y, OR - * CONFIG_BOARD_INITIALIZE=y && CONFIG_BOARD_INITTHREAD=y - */ - -#if defined(CONFIG_BOARD_INITIALIZE) && !defined(CONFIG_BOARDCTL) && \ - !defined(CONFIG_BOARD_INITTHREAD) -# warning SDIO initialization cannot be perfomed on the IDLE thread -#endif - -/* By Providing BOARD_ADC_USB_CONNECTED (using the px4_arch abstraction) - * this board support the ADC system_power interface, and therefore - * provides the true logic GPIO BOARD_ADC_xxxx macros. - */ -#define BOARD_ADC_USB_CONNECTED (px4_arch_gpioread(GPIO_OTGFS_VBUS)) -#define BOARD_ADC_USB_VALID (!px4_arch_gpioread(GPIO_nVDD_USB_VALID)) - -/* FMUv6U never powers off the Servo rail */ - -#define BOARD_ADC_SERVO_VALID (1) - -#if !defined(BOARD_HAS_LTC44XX_VALIDS) || BOARD_HAS_LTC44XX_VALIDS == 0 -# define BOARD_ADC_BRICK1_VALID (1) -# define BOARD_ADC_BRICK2_VALID (0) -#elif BOARD_HAS_LTC44XX_VALIDS == 1 -# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -# define BOARD_ADC_BRICK2_VALID (0) -#elif BOARD_HAS_LTC44XX_VALIDS == 2 -# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) -#elif BOARD_HAS_LTC44XX_VALIDS == 3 -# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) -# define BOARD_ADC_BRICK3_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK3_VALID)) -#elif BOARD_HAS_LTC44XX_VALIDS == 4 -# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) -# define BOARD_ADC_BRICK3_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK3_VALID)) -# define BOARD_ADC_BRICK4_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK4_VALID)) -#else -# error Unsupported BOARD_HAS_LTC44XX_VALIDS value -#endif - -#define BOARD_ADC_PERIPH_5V_OC (!px4_arch_gpioread(GPIO_VDD_5V_PERIPH_nOC)) -#define BOARD_ADC_HIPOWER_5V_OC (!px4_arch_gpioread(GPIO_VDD_5V_HIPOWER_nOC)) - - -/* This board provides a DMA pool and APIs */ -#define BOARD_DMA_ALLOC_POOL_SIZE 5120 - -/* This board provides the board_on_reset interface */ - -#define BOARD_HAS_ON_RESET 1 - -#define PX4_GPIO_INIT_LIST { \ - PX4_ADC_GPIO, \ - GPIO_HW_VER_REV_DRIVE, \ - GPIO_CAN1_TX, \ - GPIO_CAN1_RX, \ - GPIO_HEATER_OUTPUT, \ - GPIO_nPOWER_IN_A, \ - GPIO_nPOWER_IN_B, \ - GPIO_nPOWER_IN_C, \ - GPIO_VDD_5V_PERIPH_nEN, \ - GPIO_VDD_5V_PERIPH_nOC, \ - GPIO_VDD_5V_HIPOWER_nEN, \ - GPIO_VDD_5V_HIPOWER_nOC, \ - GPIO_VDD_3V3_SENSORS_EN, \ - GPIO_VDD_3V3_SPEKTRUM_POWER_EN, \ - GPIO_VDD_3V3_SD_CARD_EN, \ - GPIO_PD15, \ - GPIO_SYNC, \ - SPI6_nRESET_EXTERNAL1, \ - GPIO_TONE_ALARM_IDLE, \ - GPIO_nSAFETY_SWITCH_LED_OUT_INIT, \ - GPIO_SAFETY_SWITCH_IN, \ - GPIO_PG6, \ - GPIO_nARMED_INIT \ - } - -#define BOARD_ENABLE_CONSOLE_BUFFER - -#define BOARD_NUM_IO_TIMERS 5 - -__BEGIN_DECLS - -/**************************************************************************************************** - * Public Types - ****************************************************************************************************/ - -/**************************************************************************************************** - * Public data - ****************************************************************************************************/ - -#ifndef __ASSEMBLY__ - -/**************************************************************************************************** - * Public Functions - ****************************************************************************************************/ - -/**************************************************************************** - * Name: stm32_sdio_initialize - * - * Description: - * Initialize SDIO-based MMC/SD card support - * - ****************************************************************************/ - -int stm32_sdio_initialize(void); - -/**************************************************************************************************** - * Name: stm32_spiinitialize - * - * Description: - * Called to configure SPI chip select GPIO pins for the PX4FMU board. - * - ****************************************************************************************************/ - -extern void stm32_spiinitialize(void); - -extern void stm32_usbinitialize(void); - -extern void board_peripheral_reset(int ms); - -#include - -#endif /* __ASSEMBLY__ */ - -__END_DECLS diff --git a/boards/px4/fmu-v6u/src/bootloader_main.c b/boards/px4/fmu-v6u/src/bootloader_main.c deleted file mode 100644 index cec6abd..0000000 --- a/boards/px4/fmu-v6u/src/bootloader_main.c +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2019-2021 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file bootloader_main.c - * - * FMU-specific early startup code for bootloader -*/ - -#include "board_config.h" -#include "bl.h" - -#include -#include -#include -#include -#include -#include "arm_internal.h" -#include - -extern int sercon_main(int c, char **argv); - -__EXPORT void board_on_reset(int status) {} - -__EXPORT void stm32_boardinitialize(void) -{ - /* configure USB interfaces */ - stm32_usbinitialize(); -} - -__EXPORT int board_app_initialize(uintptr_t arg) -{ - return 0; -} - -void board_late_initialize(void) -{ - sercon_main(0, NULL); -} - -extern void sys_tick_handler(void); -void board_timerhook(void) -{ - sys_tick_handler(); -} diff --git a/boards/px4/fmu-v6u/src/hw_config.h b/boards/px4/fmu-v6u/src/hw_config.h deleted file mode 100644 index 2910288..0000000 --- a/boards/px4/fmu-v6u/src/hw_config.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * hw_config.h - * - * Created on: May 17, 2015 - * Author: david_s5 - */ - -#ifndef HW_CONFIG_H_ -#define HW_CONFIG_H_ - -/**************************************************************************** - * 10-8--2016: - * To simplify the ripple effect on the tools, we will be using - * /dev/serial/by-id/PX4 to locate PX4 devices. Therefore - * moving forward all Bootloaders must contain the prefix "PX4 BL " - * in the USBDEVICESTRING - * This Change will be made in an upcoming BL release - ****************************************************************************/ -/* - * Define usage to configure a bootloader - * - * - * Constant example Usage - * APP_LOAD_ADDRESS 0x08004000 - The address in Linker Script, where the app fw is org-ed - * BOOTLOADER_DELAY 5000 - Ms to wait while under USB pwr or bootloader request - * BOARD_FMUV2 - * INTERFACE_USB 1 - (Optional) Scan and use the USB interface for bootloading - * INTERFACE_USART 1 - (Optional) Scan and use the Serial interface for bootloading - * USBDEVICESTRING "PX4 BL FMU v2.x" - USB id string - * USBPRODUCTID 0x0011 - PID Should match defconfig - * BOOT_DELAY_ADDRESS 0x000001a0 - (Optional) From the linker script from Linker Script to get a custom - * delay provided by an APP FW - * BOARD_TYPE 9 - Must match .prototype boad_id - * _FLASH_KBYTES (*(uint16_t *)0x1fff7a22) - Run time flash size detection - * BOARD_FLASH_SECTORS ((_FLASH_KBYTES == 0x400) ? 11 : 23) - Run time determine the physical last sector - * BOARD_FLASH_SECTORS 11 - Hard coded zero based last sector - * BOARD_FLASH_SIZE (_FLASH_KBYTES*1024)- Total Flash size of device, determined at run time. - * (1024 * 1024) - Hard coded Total Flash of device - The bootloader and app reserved will be deducted - * programmatically - * - * BOARD_FIRST_FLASH_SECTOR_TO_ERASE 2 - Optional sectors index in the flash_sectors table (F4 only), to begin erasing. - * This is to allow sectors to be reserved for app fw usage. That will NOT be erased - * during a FW upgrade. - * The default is 0, and selects the first sector to be erased, as the 0th entry in the - * flash_sectors table. Which is the second physical sector of FLASH in the device. - * The first physical sector of FLASH is used by the bootloader, and is not defined - * in the table. - * - * APP_RESERVATION_SIZE (BOARD_FIRST_FLASH_SECTOR_TO_ERASE * 16 * 1024) - Number of bytes reserved by the APP FW. This number plus - * BOOTLOADER_RESERVATION_SIZE will be deducted from - * BOARD_FLASH_SIZE to determine the size of the App FW - * and hence the address space of FLASH to erase and program. - * USBMFGSTRING "PX4 AP" - Optional USB MFG string (default is '3D Robotics' if not defined.) - * SERIAL_BREAK_DETECT_DISABLED - Optional prevent break selection on Serial port from entering or staying in BL - * - * * Other defines are somewhat self explanatory. - */ - -/* Boot device selection list*/ -#define USB0_DEV 0x01 -#define SERIAL0_DEV 0x02 -#define SERIAL1_DEV 0x04 - -#define APP_LOAD_ADDRESS 0x08020000 -#define BOOTLOADER_DELAY 5000 -#define INTERFACE_USB 1 -#define INTERFACE_USB_CONFIG "/dev/ttyACM0" -#define BOARD_VBUS MK_GPIO_INPUT(GPIO_OTGFS_VBUS) - -//#define USE_VBUS_PULL_DOWN -#define INTERFACE_USART 1 -#define INTERFACE_USART_CONFIG "/dev/ttyS0,115200" -#define BOOT_DELAY_ADDRESS 0x000001a0 -#define BOARD_TYPE 54 -#define _FLASH_KBYTES (*(uint32_t *)0x1FF1E880) -#define BOARD_FLASH_SECTORS (15) -#define BOARD_FLASH_SIZE (_FLASH_KBYTES * 1024) - -#define OSC_FREQ 16 - -#define BOARD_PIN_LED_ACTIVITY GPIO_nLED_BLUE // BLUE -#define BOARD_PIN_LED_BOOTLOADER GPIO_nLED_GREEN // GREEN -#define BOARD_LED_ON 0 -#define BOARD_LED_OFF 1 - -#define SERIAL_BREAK_DETECT_DISABLED 1 - -/* - * Uncommenting this allows to force the bootloader through - * a PWM output pin. As this can accidentally initialize - * an ESC prematurely, it is not recommended. This feature - * has not been used and hence defaults now to off. - * - * # define BOARD_FORCE_BL_PIN_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN14) - * # define BOARD_FORCE_BL_PIN_IN (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN11) - * - * # define BOARD_POWER_PIN_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN4) - * # define BOARD_POWER_ON 1 - * # define BOARD_POWER_OFF 0 - * # undef BOARD_POWER_PIN_RELEASE // Leave pin enabling Power - un comment to release (disable power) - * -*/ - -#if !defined(ARCH_SN_MAX_LENGTH) -# define ARCH_SN_MAX_LENGTH 12 -#endif - -#if !defined(APP_RESERVATION_SIZE) -# define APP_RESERVATION_SIZE 0 -#endif - -#if !defined(BOARD_FIRST_FLASH_SECTOR_TO_ERASE) -# define BOARD_FIRST_FLASH_SECTOR_TO_ERASE 1 -#endif - -#if !defined(USB_DATA_ALIGN) -# define USB_DATA_ALIGN -#endif - -#ifndef BOOT_DEVICES_SELECTION -# define BOOT_DEVICES_SELECTION USB0_DEV|SERIAL0_DEV|SERIAL1_DEV -#endif - -#ifndef BOOT_DEVICES_FILTER_ONUSB -# define BOOT_DEVICES_FILTER_ONUSB USB0_DEV|SERIAL0_DEV|SERIAL1_DEV -#endif - -#endif /* HW_CONFIG_H_ */ diff --git a/boards/px4/fmu-v6u/src/i2c.cpp b/boards/px4/fmu-v6u/src/i2c.cpp deleted file mode 100644 index 8a55707..0000000 --- a/boards/px4/fmu-v6u/src/i2c.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include - -constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { - initI2CBusExternal(1), - initI2CBusExternal(2), - initI2CBusExternal(3), - initI2CBusInternal(4), -}; diff --git a/boards/px4/fmu-v6u/src/init.c b/boards/px4/fmu-v6u/src/init.c deleted file mode 100644 index 1563331..0000000 --- a/boards/px4/fmu-v6u/src/init.c +++ /dev/null @@ -1,278 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2012-2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file init.c - * - * PX4FMU-specific early startup code. This file implements the - * board_app_initialize() function that is called early by nsh during startup. - * - * Code here is run before the rcS script is invoked; it should start required - * subsystems and perform board-specific initialization. - */ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include "board_config.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "arm_internal.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -/**************************************************************************** - * Pre-Processor Definitions - ****************************************************************************/ - -/* Configuration ************************************************************/ - -/* - * Ideally we'd be able to get these from arm_internal.h, - * but since we want to be able to disable the NuttX use - * of leds for system indication at will and there is no - * separate switch, we need to build independent of the - * CONFIG_ARCH_LEDS configuration switch. - */ -__BEGIN_DECLS -extern void led_init(void); -extern void led_on(int led); -extern void led_off(int led); -__END_DECLS - - -/************************************************************************************ - * Name: board_peripheral_reset - * - * Description: - * - ************************************************************************************/ -__EXPORT void board_peripheral_reset(int ms) -{ - /* set the peripheral rails off */ - - VDD_5V_PERIPH_EN(false); - board_control_spi_sensors_power(false, 0xffff); - VDD_3V3_SENSORS_EN(false); - - bool last = READ_VDD_3V3_SPEKTRUM_POWER_EN(); - /* Keep Spektum on to discharge rail*/ - VDD_3V3_SPEKTRUM_POWER_EN(false); - - /* wait for the peripheral rail to reach GND */ - usleep(ms * 1000); - syslog(LOG_DEBUG, "reset done, %d ms\n", ms); - - /* re-enable power */ - - /* switch the peripheral rail back on */ - VDD_3V3_SPEKTRUM_POWER_EN(last); - board_control_spi_sensors_power(true, 0xffff); - VDD_3V3_SENSORS_EN(true); - VDD_5V_PERIPH_EN(true); - -} - -/************************************************************************************ - * Name: board_on_reset - * - * Description: - * Optionally provided function called on entry to board_system_reset - * It should perform any house keeping prior to the rest. - * - * status - 1 if resetting to boot loader - * 0 if just resetting - * - ************************************************************************************/ -__EXPORT void board_on_reset(int status) -{ - for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { - px4_arch_configgpio(PX4_MAKE_GPIO_INPUT(io_timer_channel_get_as_pwm_input(i))); - } - - if (status >= 0) { - up_mdelay(6); - } -} - -/************************************************************************************ - * Name: stm32_boardinitialize - * - * Description: - * All STM32 architectures must provide the following entry point. This entry point - * is called early in the initialization -- after all memory has been configured - * and mapped but before any devices have been initialized. - * - ************************************************************************************/ - -__EXPORT void -stm32_boardinitialize(void) -{ - board_on_reset(-1); /* Reset PWM first thing */ - - /* configure LEDs */ - - board_autoled_initialize(); - - /* configure pins */ - - const uint32_t gpio[] = PX4_GPIO_INIT_LIST; - px4_gpio_init(gpio, arraySize(gpio)); - - /* configure SPI interfaces (we can do this here as long as we only have a single SPI hw config version - - * otherwise we need to move this after board_determine_hw_info()) */ - _Static_assert(BOARD_NUM_SPI_CFG_HW_VERSIONS == 1, "Need to move the SPI initialization for multi-version support"); - - stm32_spiinitialize(); - - /* configure USB interfaces */ - - stm32_usbinitialize(); - -} - -/**************************************************************************** - * Name: board_app_initialize - * - * Description: - * Perform application specific initialization. This function is never - * called directly from application code, but only indirectly via the - * (non-standard) boardctl() interface using the command BOARDIOC_INIT. - * - * Input Parameters: - * arg - The boardctl() argument is passed to the board_app_initialize() - * implementation without modification. The argument has no - * meaning to NuttX; the meaning of the argument is a contract - * between the board-specific initalization logic and the the - * matching application logic. The value cold be such things as a - * mode enumeration value, a set of DIP switch switch settings, a - * pointer to configuration data read from a file or serial FLASH, - * or whatever you would like to do with it. Every implementation - * should accept zero/NULL as a default configuration. - * - * Returned Value: - * Zero (OK) is returned on success; a negated errno value is returned on - * any failure to indicate the nature of the failure. - * - ****************************************************************************/ - - -__EXPORT int board_app_initialize(uintptr_t arg) -{ - /* Power on Interfaces */ - VDD_3V3_SD_CARD_EN(true); - VDD_5V_PERIPH_EN(true); - VDD_5V_HIPOWER_EN(true); - board_spi_reset(10, 0xffff); - VDD_3V3_SENSORS_EN(true); - VDD_3V3_SPEKTRUM_POWER_EN(true); - - /* Need hrt running before using the ADC */ - - px4_platform_init(); - - - if (OK == board_determine_hw_info()) { - syslog(LOG_INFO, "[boot] Rev 0x%1x : Ver 0x%1x %s\n", board_get_hw_revision(), board_get_hw_version(), - board_get_hw_type_name()); - - } else { - syslog(LOG_ERR, "[boot] Failed to read HW revision and version\n"); - } - - /* configure the DMA allocator */ - - if (board_dma_alloc_init() < 0) { - syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); - } - -#if defined(SERIAL_HAVE_RXDMA) - // set up the serial DMA polling at 1ms intervals for received bytes that have not triggered a DMA event. - static struct hrt_call serial_dma_call; - hrt_call_every(&serial_dma_call, 1000, 1000, (hrt_callout)stm32_serial_dma_poll, NULL); -#endif - - /* initial LED state */ - drv_led_start(); - led_off(LED_RED); - led_on(LED_GREEN); // Indicate Power. - led_off(LED_BLUE); - - if (board_hardfault_init(2, true) != 0) { - led_on(LED_RED); - } - - // Ensure Power is off for > 10 mS - usleep(15 * 1000); - VDD_3V3_SD_CARD_EN(true); - usleep(500 * 1000); - -#ifdef CONFIG_MMCSD - int ret = stm32_sdio_initialize(); - - if (ret != OK) { - led_on(LED_RED); - } - -#endif /* CONFIG_MMCSD */ - - /* Configure the HW based on the manifest */ - - px4_platform_configure(); - - return OK; -} diff --git a/boards/px4/fmu-v6u/src/led.c b/boards/px4/fmu-v6u/src/led.c deleted file mode 100644 index bff4b09..0000000 --- a/boards/px4/fmu-v6u/src/led.c +++ /dev/null @@ -1,235 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2013 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file px4fmu2_led.c - * - * PX4FMU LED backend. - */ - -#include - -#include - -#include "chip.h" -#include "stm32_gpio.h" -#include "board_config.h" - -#include -#include - -/* - * Ideally we'd be able to get these from arm_internal.h, - * but since we want to be able to disable the NuttX use - * of leds for system indication at will and there is no - * separate switch, we need to build independent of the - * CONFIG_ARCH_LEDS configuration switch. - */ -__BEGIN_DECLS -extern void led_init(void); -extern void led_on(int led); -extern void led_off(int led); -extern void led_toggle(int led); -__END_DECLS - -#ifdef CONFIG_ARCH_LEDS -static bool nuttx_owns_leds = true; -// B R S G -// 0 1 2 3 -static const uint8_t xlatpx4[] = {1, 2, 4, 0}; -# define xlat(p) xlatpx4[(p)] -static uint32_t g_ledmap[] = { - GPIO_nLED_GREEN, // Indexed by BOARD_LED_GREEN - GPIO_nLED_BLUE, // Indexed by BOARD_LED_BLUE - GPIO_nLED_RED, // Indexed by BOARD_LED_RED - GPIO_nSAFETY_SWITCH_LED_OUT, // Indexed by LED_SAFETY by xlatpx4 -}; - -#else - -# define xlat(p) (p) -static uint32_t g_ledmap[] = { - GPIO_nLED_BLUE, // Indexed by LED_BLUE - GPIO_nLED_RED, // Indexed by LED_RED, LED_AMBER - 0, // Indexed by LED_SAFETY (defaulted to an input) - GPIO_nLED_GREEN, // Indexed by LED_GREEN -}; - -#endif - -__EXPORT void led_init(void) -{ - for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) { - if (g_ledmap[l] != 0) { - stm32_configgpio(g_ledmap[l]); - } - } -} - -static void phy_set_led(int led, bool state) -{ - /* Drive Low to switch on */ - - if (g_ledmap[led] != 0) { - stm32_gpiowrite(g_ledmap[led], !state); - } -} - -static bool phy_get_led(int led) -{ - /* If Low it is on */ - if (g_ledmap[led] != 0) { - return !stm32_gpioread(g_ledmap[led]); - } - - return false; -} - -__EXPORT void led_on(int led) -{ - phy_set_led(xlat(led), true); -} - -__EXPORT void led_off(int led) -{ - phy_set_led(xlat(led), false); -} - -__EXPORT void led_toggle(int led) -{ - phy_set_led(xlat(led), !phy_get_led(xlat(led))); -} - -#ifdef CONFIG_ARCH_LEDS -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: board_autoled_initialize - ****************************************************************************/ - -void board_autoled_initialize(void) -{ - led_init(); -} - -/**************************************************************************** - * Name: board_autoled_on - ****************************************************************************/ - -void board_autoled_on(int led) -{ - if (!nuttx_owns_leds) { - return; - } - - switch (led) { - default: - break; - - case LED_HEAPALLOCATE: - phy_set_led(BOARD_LED_BLUE, true); - break; - - case LED_IRQSENABLED: - phy_set_led(BOARD_LED_BLUE, false); - phy_set_led(BOARD_LED_GREEN, true); - break; - - case LED_STACKCREATED: - phy_set_led(BOARD_LED_GREEN, true); - phy_set_led(BOARD_LED_BLUE, true); - break; - - case LED_INIRQ: - phy_set_led(BOARD_LED_BLUE, true); - break; - - case LED_SIGNAL: - phy_set_led(BOARD_LED_GREEN, true); - break; - - case LED_ASSERTION: - phy_set_led(BOARD_LED_RED, true); - phy_set_led(BOARD_LED_BLUE, true); - break; - - case LED_PANIC: - phy_set_led(BOARD_LED_RED, true); - break; - - case LED_IDLE : /* IDLE */ - phy_set_led(BOARD_LED_RED, true); - break; - } -} - -/**************************************************************************** - * Name: board_autoled_off - ****************************************************************************/ - -void board_autoled_off(int led) -{ - if (!nuttx_owns_leds) { - return; - } - - switch (led) { - default: - break; - - case LED_SIGNAL: - phy_set_led(BOARD_LED_GREEN, false); - break; - - case LED_INIRQ: - phy_set_led(BOARD_LED_BLUE, false); - break; - - case LED_ASSERTION: - phy_set_led(BOARD_LED_RED, false); - phy_set_led(BOARD_LED_BLUE, false); - break; - - case LED_PANIC: - phy_set_led(BOARD_LED_RED, false); - break; - - case LED_IDLE : /* IDLE */ - phy_set_led(BOARD_LED_RED, false); - break; - } -} - -#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/px4/fmu-v6u/src/manifest.c b/boards/px4/fmu-v6u/src/manifest.c deleted file mode 100644 index e13f3d0..0000000 --- a/boards/px4/fmu-v6u/src/manifest.c +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2018-2021 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file manifest.c - * - * This module supplies the interface to the manifest of hardware that is - * optional and dependent on the HW REV and HW VER IDs - * - * The manifest allows the system to know whether a hardware option - * say for example the PX4IO is an no-pop option vs it is broken. - * - */ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include -#include - -#include -#include -#include - -#include "systemlib/px4_macros.h" - -/**************************************************************************** - * Pre-Processor Definitions - ****************************************************************************/ - -typedef struct { - uint32_t hw_ver_rev; /* the version and revision */ - const px4_hw_mft_item_t *mft; /* The first entry */ - uint32_t entries; /* the lenght of the list */ -} px4_hw_mft_list_entry_t; - -typedef px4_hw_mft_list_entry_t *px4_hw_mft_list_entry; -#define px4_hw_mft_list_uninitialized (px4_hw_mft_list_entry) -1 - -static const px4_hw_mft_item_t device_unsupported = {0, 0, 0}; - -// List of components on a specific board configuration -// The index of those components is given by the enum (px4_hw_mft_item_id_t) -// declared in board_common.h -static const px4_hw_mft_item_t hw_mft_list_v0600[] = { - { - .present = 0, - .mandatory = 0, - .connection = px4_hw_con_unknown, - }, -}; - -static px4_hw_mft_list_entry_t mft_lists[] = { - {V6U00, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, -}; - -/************************************************************************************ - * Name: board_query_manifest - * - * Description: - * Optional returns manifest item. - * - * Input Parameters: - * manifest_id - the ID for the manifest item to retrieve - * - * Returned Value: - * 0 - item is not in manifest => assume legacy operations - * pointer to a manifest item - * - ************************************************************************************/ - -__EXPORT px4_hw_mft_item board_query_manifest(px4_hw_mft_item_id_t id) -{ - static px4_hw_mft_list_entry boards_manifest = px4_hw_mft_list_uninitialized; - - if (boards_manifest == px4_hw_mft_list_uninitialized) { - uint32_t ver_rev = board_get_hw_version() << 16; - ver_rev |= board_get_hw_revision(); - - for (unsigned i = 0; i < arraySize(mft_lists); i++) { - if (mft_lists[i].hw_ver_rev == ver_rev) { - boards_manifest = &mft_lists[i]; - break; - } - } - - if (boards_manifest == px4_hw_mft_list_uninitialized) { - syslog(LOG_ERR, "[boot] Board %08" PRIx32 " is not supported!\n", ver_rev); - } - } - - px4_hw_mft_item rv = &device_unsupported; - - if (boards_manifest != px4_hw_mft_list_uninitialized && - id < boards_manifest->entries) { - rv = &boards_manifest->mft[id]; - } - - return rv; -} diff --git a/boards/px4/fmu-v6u/src/spi.cpp b/boards/px4/fmu-v6u/src/spi.cpp deleted file mode 100644 index 7e54358..0000000 --- a/boards/px4/fmu-v6u/src/spi.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include -#include -#include - -constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20602, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42605, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin6}), - }), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), -}; - -static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/px4/fmu-v6u/src/timer_config.cpp b/boards/px4/fmu-v6u/src/timer_config.cpp deleted file mode 100644 index 928f491..0000000 --- a/boards/px4/fmu-v6u/src/timer_config.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2012 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include - -/* Timer allocation - * - * TIM5_CH4 T FMU_CH1 - * TIM5_CH3 T FMU_CH2 - * TIM5_CH2 T FMU_CH3 - * TIM5_CH1 T FMU_CH4 - * - * TIM4_CH2 T FMU_CH5 - * TIM4_CH3 T FMU_CH6 - * - * TIM12_CH1 T FMU_CH7 - * TIM12_CH2 T FMU_CH8 - * - * TIM1_CH2 T FMU_CAP1 < Capture - * TIM1_CH3 T SPI2_DRDY2_ISM330_INT2 < Capture or GPIO INT - * TIM1_CH1 T SPIX_SYNC > Pulse or GPIO strobe - * - * TIM2_CH3 T HEATER > PWM OUT or GPIO - * - * TIM14_CH1 T BUZZER_1 - Driven by other driver - * TIM8_CH1_IN T FMU_PPM_INPUT - Sampled byt HRT by other driver - */ - -constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { - initIOTimer(Timer::Timer5, DMA{DMA::Index1}), - initIOTimer(Timer::Timer4, DMA{DMA::Index1}), - initIOTimer(Timer::Timer12), - initIOTimer(Timer::Timer1), - initIOTimer(Timer::Timer2), -}; - -constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { - initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel4}, {GPIO::PortI, GPIO::Pin0}), - initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {GPIO::PortH, GPIO::Pin12}), - initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel2}, {GPIO::PortH, GPIO::Pin11}), - initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {GPIO::PortH, GPIO::Pin10}), - initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel2}, {GPIO::PortD, GPIO::Pin13}), - initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {GPIO::PortD, GPIO::Pin14}), - initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel1}, {GPIO::PortH, GPIO::Pin6}), - initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel2}, {GPIO::PortH, GPIO::Pin9}), - initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel2}, {GPIO::PortE, GPIO::Pin11}), -}; - -constexpr io_timers_channel_mapping_t io_timers_channel_mapping = - initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/px4/fmu-v6x/bootloader.px4board b/boards/px4/fmu-v6x/bootloader.px4board deleted file mode 100644 index 19b6e66..0000000 --- a/boards/px4/fmu-v6x/bootloader.px4board +++ /dev/null @@ -1,3 +0,0 @@ -CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" -CONFIG_BOARD_ARCHITECTURE="cortex-m7" -CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/px4/fmu-v6x/extras/px4_fmu-v6x_bootloader.bin b/boards/px4/fmu-v6x/extras/px4_fmu-v6x_bootloader.bin deleted file mode 100755 index 9668fdb20b107f7ce6facff73cf1c71d5655ac66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46688 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 - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ************************************************************************************/ -#ifndef __NUTTX_CONFIG_PX4_FMU_V6X_INCLUDE_BOARD_H -#define __NUTTX_CONFIG_PX4_FMU_V6X_INCLUDE_BOARD_H - -/************************************************************************************ - * Included Files - ************************************************************************************/ - -#include "board_dma_map.h" - -#include - -#ifndef __ASSEMBLY__ -# include -#endif - -#include "stm32_rcc.h" -#include "stm32_sdmmc.h" - -/************************************************************************************ - * Pre-processor Definitions - ************************************************************************************/ - -/* Clocking *************************************************************************/ -/* The px4_fmu-v6X board provides the following clock sources: - * - * X1: 16 MHz crystal for HSE - * - * So we have these clock source available within the STM32 - * - * HSI: 16 MHz RC factory-trimmed - * HSE: 16 MHz crystal for HSE - */ - -#define STM32_BOARD_XTAL 16000000ul - -#define STM32_HSI_FREQUENCY 16000000ul -#define STM32_LSI_FREQUENCY 32000 -#define STM32_HSE_FREQUENCY STM32_BOARD_XTAL -#define STM32_LSE_FREQUENCY 32768 - -/* Main PLL Configuration. - * - * PLL source is HSE = 16,000,000 - * - * PLL_VCOx = (STM32_HSE_FREQUENCY / PLLM) * PLLN - * Subject to: - * - * 1 <= PLLM <= 63 - * 4 <= PLLN <= 512 - * 150 MHz <= PLL_VCOL <= 420MHz - * 192 MHz <= PLL_VCOH <= 836MHz - * - * SYSCLK = PLL_VCO / PLLP - * CPUCLK = SYSCLK / D1CPRE - * Subject to - * - * PLLP1 = {2, 4, 6, 8, ..., 128} - * PLLP2,3 = {2, 3, 4, ..., 128} - * CPUCLK <= 480 MHz - */ - -#define STM32_BOARD_USEHSE - -#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE - -/* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR - * - * PLL1_VCO = (16,000,000 / 1) * 60 = 960 MHz - * - * PLL1P = PLL1_VCO/2 = 960 MHz / 2 = 480 MHz - * PLL1Q = PLL1_VCO/4 = 960 MHz / 4 = 240 MHz - * PLL1R = PLL1_VCO/8 = 960 MHz / 8 = 120 MHz - */ - -#define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ - RCC_PLLCFGR_PLL1RGE_4_8_MHZ | \ - RCC_PLLCFGR_DIVP1EN | \ - RCC_PLLCFGR_DIVQ1EN | \ - RCC_PLLCFGR_DIVR1EN) -#define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(1) -#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(60) -#define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) -#define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(4) -#define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) - -#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 60) -#define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) -#define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 4) -#define STM32_PLL1R_FREQUENCY (STM32_VCO1_FREQUENCY / 8) - -/* PLL2 */ - -#define STM32_PLLCFG_PLL2CFG (RCC_PLLCFGR_PLL2VCOSEL_WIDE | \ - RCC_PLLCFGR_PLL2RGE_4_8_MHZ | \ - RCC_PLLCFGR_DIVP2EN | \ - RCC_PLLCFGR_DIVQ2EN | \ - RCC_PLLCFGR_DIVR2EN) -#define STM32_PLLCFG_PLL2M RCC_PLLCKSELR_DIVM2(4) -#define STM32_PLLCFG_PLL2N RCC_PLL2DIVR_N2(48) -#define STM32_PLLCFG_PLL2P RCC_PLL2DIVR_P2(2) -#define STM32_PLLCFG_PLL2Q RCC_PLL2DIVR_Q2(2) -#define STM32_PLLCFG_PLL2R RCC_PLL2DIVR_R2(2) - -#define STM32_VCO2_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) -#define STM32_PLL2P_FREQUENCY (STM32_VCO2_FREQUENCY / 2) -#define STM32_PLL2Q_FREQUENCY (STM32_VCO2_FREQUENCY / 2) -#define STM32_PLL2R_FREQUENCY (STM32_VCO2_FREQUENCY / 2) - -/* PLL3 */ - -#define STM32_PLLCFG_PLL3CFG (RCC_PLLCFGR_PLL3VCOSEL_WIDE | \ - RCC_PLLCFGR_PLL3RGE_4_8_MHZ | \ - RCC_PLLCFGR_DIVQ3EN) -#define STM32_PLLCFG_PLL3M RCC_PLLCKSELR_DIVM3(4) -#define STM32_PLLCFG_PLL3N RCC_PLL3DIVR_N3(48) -#define STM32_PLLCFG_PLL3P RCC_PLL3DIVR_P3(2) -#define STM32_PLLCFG_PLL3Q RCC_PLL3DIVR_Q3(4) -#define STM32_PLLCFG_PLL3R RCC_PLL3DIVR_R3(2) - -#define STM32_VCO3_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) -#define STM32_PLL3P_FREQUENCY (STM32_VCO3_FREQUENCY / 2) -#define STM32_PLL3Q_FREQUENCY (STM32_VCO3_FREQUENCY / 4) -#define STM32_PLL3R_FREQUENCY (STM32_VCO3_FREQUENCY / 2) - -/* SYSCLK = PLL1P = 480MHz - * CPUCLK = SYSCLK / 1 = 480 MHz - */ - -#define STM32_RCC_D1CFGR_D1CPRE (RCC_D1CFGR_D1CPRE_SYSCLK) -#define STM32_SYSCLK_FREQUENCY (STM32_PLL1P_FREQUENCY) -#define STM32_CPUCLK_FREQUENCY (STM32_SYSCLK_FREQUENCY / 1) - -/* Configure Clock Assignments */ - -/* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) - * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 - */ - -#define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ -#define STM32_ACLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* ACLK in D1, HCLK3 in D1 */ -#define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ -#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ - -/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ - -#define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ -#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) - -/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ - -#define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ -#define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) - -/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ - -#define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ -#define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) - -/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ - -#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ -#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) - -/* Timer clock frequencies */ - -/* Timers driven from APB1 will be twice PCLK1 */ - -#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) -#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) - -/* Timers driven from APB2 will be twice PCLK2 */ - -#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) -#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) -#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) -#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) -#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) - -/* Kernel Clock Configuration - * - * Note: look at Table 54 in ST Manual - */ - -/* I2C123 clock source */ - -#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI - -/* I2C4 clock source */ - -#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI - -/* SPI123 clock source */ - -#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 - -/* SPI45 clock source */ - -#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 - -/* SPI6 clock source */ - -#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 - -/* USB 1 and 2 clock source */ - -#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 - -/* ADC 1 2 3 clock source */ - -#define STM32_RCC_D3CCIPR_ADCSEL RCC_D3CCIPR_ADCSEL_PLL2 - -/* FDCAN 1 2 clock source */ - -#define STM32_RCC_D2CCIP1R_FDCANSEL RCC_D2CCIP1R_FDCANSEL_HSE /* FDCAN 1 2 clock source */ - -#define STM32_FDCANCLK STM32_HSE_FREQUENCY - -/* FLASH wait states - * - * ------------ ---------- ----------- - * Vcore MAX ACLK WAIT STATES - * ------------ ---------- ----------- - * 1.15-1.26 V 70 MHz 0 - * (VOS1 level) 140 MHz 1 - * 210 MHz 2 - * 1.05-1.15 V 55 MHz 0 - * (VOS2 level) 110 MHz 1 - * 165 MHz 2 - * 220 MHz 3 - * 0.95-1.05 V 45 MHz 0 - * (VOS3 level) 90 MHz 1 - * 135 MHz 2 - * 180 MHz 3 - * 225 MHz 4 - * ------------ ---------- ----------- - */ - -#define BOARD_FLASH_WAITSTATES 2 - -/* SDMMC definitions ********************************************************/ - -/* Init 400kHz, freq = PLL1Q/(2*div) div = PLL1Q/(2*freq) */ - -#define STM32_SDMMC_INIT_CLKDIV (300 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) - -/* 25 MHz Max for now, 25 mHZ = PLL1Q/(2*div), div = PLL1Q/(2*freq) - * div = 4.8 = 240 / 50, So round up to 5 for default speed 24 MB/s - */ - -#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) -# define STM32_SDMMC_MMCXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) -#else -# define STM32_SDMMC_MMCXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) -#endif -#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) -# define STM32_SDMMC_SDXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) -#else -# define STM32_SDMMC_SDXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) -#endif - -#define STM32_SDMMC_CLKCR_EDGE STM32_SDMMC_CLKCR_NEGEDGE - -/* LED definitions ******************************************************************/ -/* The PX4 FMUV6X board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and - * LED_RED a Red LED, that can be controlled by software. - * - * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. - * The following definitions are used to access individual LEDs. - */ - -/* LED index values for use with board_userled() */ - -/* LED definitions ******************************************************************/ -/* The px4_fmu-v6x board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and - * LED_RED a Red LED, that can be controlled by software. - * - * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. - * The following definitions are used to access individual LEDs. - */ - -/* LED index values for use with board_userled() */ - -#define BOARD_LED1 0 -#define BOARD_LED2 1 -#define BOARD_LED3 2 -#define BOARD_NLEDS 3 - -#define BOARD_LED_RED BOARD_LED1 -#define BOARD_LED_GREEN BOARD_LED2 -#define BOARD_LED_BLUE BOARD_LED3 - -/* LED bits for use with board_userled_all() */ - -#define BOARD_LED1_BIT (1 << BOARD_LED1) -#define BOARD_LED2_BIT (1 << BOARD_LED2) -#define BOARD_LED3_BIT (1 << BOARD_LED3) - -/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in - * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related - * events as follows: - * - * - * SYMBOL Meaning LED state - * Red Green Blue - * ---------------------- -------------------------- ------ ------ ----*/ - -#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ -#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ -#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ -#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ -#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ -#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ -#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ -#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ -#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ - -/* Thus if the Green LED is statically on, NuttX has successfully booted and - * is, apparently, running normally. If the Red LED is flashing at - * approximately 2Hz, then a fatal error has been detected and the system - * has halted. - */ - -/* Alternate function pin selections ************************************************/ - -#define GPIO_USART1_RX GPIO_USART1_RX_3 /* PB7 */ -#define GPIO_USART1_TX GPIO_USART1_TX_3 /* PB6 */ - -#define GPIO_USART2_RX GPIO_USART2_RX_1 /* PA3 */ -#define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ -#define GPIO_USART2_RTS GPIO_USART2_RTS_2 /* PD4 */ -#define GPIO_USART2_CTS GPIO_USART2_CTS_NSS_2 /* PD3 */ - -#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ -#define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ - -#define GPIO_UART4_RX GPIO_UART4_RX_6 /* PH14 */ -#define GPIO_UART4_TX GPIO_UART4_TX_6 /* PH13 */ - -#define GPIO_UART5_RX GPIO_UART5_RX_3 /* PD2 */ -#define GPIO_UART5_TX GPIO_UART5_TX_3 /* PC12 */ -// GPIO_UART5_RTS no remap /* PC8 */ -// GPIO_UART5_CTS No remap /* PC9 */ - -#define GPIO_USART6_RX GPIO_USART6_RX_1 /* PC7 */ -#define GPIO_USART6_TX GPIO_USART6_TX_1 /* PC6 */ - -#define GPIO_UART7_RX GPIO_UART7_RX_4 /* PF6 */ -#define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ -#define GPIO_UART7_RTS GPIO_UART7_RTS_2 /* PF8 */ -#define GPIO_UART7_CTS (GPIO_UART7_CTS_1 | GPIO_PULLDOWN) /* PE10 */ - -#define GPIO_UART8_RX GPIO_UART8_RX_1 /* PE0 */ -#define GPIO_UART8_TX GPIO_UART8_TX_1 /* PE1 */ - - -/* CAN - * - * CAN1 is routed to transceiver. - * CAN2 is routed to transceiver. - */ -#define GPIO_CAN1_RX GPIO_CAN1_RX_3 /* PD0 */ -#define GPIO_CAN1_TX GPIO_CAN1_TX_3 /* PD1 */ -#define GPIO_CAN2_RX GPIO_CAN2_RX_1 /* PB12 */ -#define GPIO_CAN2_TX GPIO_CAN2_TX_1 /* PB13 */ - -/* SPI - * SPI1 is sensors1 - * SPI2 is sensors2 - * SPI3 is sensors3 - * SPI4 is Not Used - * SPI5 is FRAM - * SPI6 is EXTERNAL1 - * - */ - -#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) - -#define GPIO_SPI1_MISO GPIO_SPI1_MISO_3 /* PG9 */ -#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_2 /* PB5 */ -#define GPIO_SPI1_SCK ADJ_SLEW_RATE(GPIO_SPI1_SCK_1) /* PA5 */ - -#define GPIO_SPI2_MISO GPIO_SPI2_MISO_3 /* PI2 */ -#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_4 /* PI3 */ -#define GPIO_SPI2_SCK ADJ_SLEW_RATE(GPIO_SPI2_SCK_6) /* PI1 */ - -#define GPIO_SPI3_MISO GPIO_SPI3_MISO_2 /* PC11 */ -#define GPIO_SPI3_MOSI GPIO_SPI3_MOSI_3 /* PB2 */ -#define GPIO_SPI3_SCK ADJ_SLEW_RATE(GPIO_SPI3_SCK_2) /* PC10 */ - -#define GPIO_SPI5_MISO GPIO_SPI5_MISO_2 /* PH7 */ -#define GPIO_SPI5_MOSI GPIO_SPI5_MOSI_1 /* PF11 */ -#define GPIO_SPI5_SCK ADJ_SLEW_RATE(GPIO_SPI5_SCK_1) /* PF7 */ - -#define GPIO_SPI6_MISO GPIO_SPI6_MISO_2 /* PA6 */ -#define GPIO_SPI6_MOSI GPIO_SPI6_MOSI_1 /* PG14 */ -#define GPIO_SPI6_SCK ADJ_SLEW_RATE(GPIO_SPI6_SCK_3) /* PB3 */ - -/* I2C - * - * The optional _GPIO configurations allow the I2C driver to manually - * reset the bus to clear stuck slaves. They match the pin configuration, - * but are normally-high GPIOs. - * - */ - -#define GPIO_I2C1_SCL GPIO_I2C1_SCL_2 /* PB8 */ -#define GPIO_I2C1_SDA GPIO_I2C1_SDA_2 /* PB9 */ - -#define GPIO_I2C1_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN8) -#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN9) - -#define GPIO_I2C2_SCL GPIO_I2C2_SCL_2 /* PF1 */ -#define GPIO_I2C2_SDA GPIO_I2C2_SDA_2 /* PF0 */ - -#define GPIO_I2C2_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN1) -#define GPIO_I2C2_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN0) - -#define GPIO_I2C3_SCL GPIO_I2C3_SCL_1 /* PA8 */ -#define GPIO_I2C3_SDA GPIO_I2C3_SDA_2 /* PH8 */ - -#define GPIO_I2C3_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTA | GPIO_PIN8) -#define GPIO_I2C3_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTH | GPIO_PIN8) - -#define GPIO_I2C4_SCL GPIO_I2C4_SCL_2 /* PF14 */ -#define GPIO_I2C4_SDA GPIO_I2C4_SDA_2 /* PF15 */ - -#define GPIO_I2C4_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN14) -#define GPIO_I2C4_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN15) - -/* SDMMC2 - * - * VDD 3.3 - * GND - * SDMMC2_CK PD6 - * SDMMC2_CMD PD7 - * SDMMC2_D0 PB14 - * SDMMC2_D1 PB15 - * SDMMC2_D2 PG11 - * SDMMC2_D3 PB4 - */ - -#define GPIO_SDMMC2_CK GPIO_SDMMC2_CK_1 /* PD6 */ -#define GPIO_SDMMC2_CMD GPIO_SDMMC2_CMD_1 /* PD7 */ -// GPIO_SDMMC2_D0 No Remap /* PB14 */ -// GPIO_SDMMC2_D1 No Remap /* PB15 */ -#define GPIO_SDMMC2_D2 GPIO_SDMMC2_D2_1 /* PG11 */ -// GPIO_SDMMC2_D3 No Remap /* PB4 */ - -/* The STM32 H7 connects to a TI DP83848TSQ/NOPB - * using RMII - * - * STM32 H7 BOARD DP83848TSQ/NOPB - * GPIO SIGNAL PIN NAME - * -------- ------------ ------------- - * PA7 ETH_CRS_DV CRS_DV - * PC1 ETH_MDC MDC - * PA2 ETH_MDIO MDIO - * PA1 ETH_REF_CL X1 - * PC4 ETH_RXD0 RX_D0 - * PC5 ETH_RXD1 RX_D1 - * PB11 ETH_TX_EN TX_EN - * PG13 ETH_TXD0 TX_D0 - * PG12 ETH_TXD1 TX_D1 - * - * The PHY address is 1, since COL/PHYAD0 features a pull up. - */ - -#define GPIO_ETH_RMII_TX_EN GPIO_ETH_RMII_TX_EN_1 /* PB11 */ -#define GPIO_ETH_RMII_TXD0 GPIO_ETH_RMII_TXD0_2 /* PG13 */ -#define GPIO_ETH_RMII_TXD1 GPIO_ETH_RMII_TXD1_2 /* PG12 */ - - -/* USB - * - * OTG_FS_DM PA11 - * OTG_FS_DP PA12 - * VBUS PA9 - */ - - -/* Board provides GPIO or other Hardware for signaling to timing analyzer */ - -#if defined(CONFIG_BOARD_USE_PROBES) -# include "stm32_gpio.h" -# define PROBE_N(n) (1<<((n)-1)) -# define PROBE_1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN0) /* PI0 AUX1 */ -# define PROBE_2 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN12) /* PH12 AUX2 */ -# define PROBE_3 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN11) /* PH11 AUX3 */ -# define PROBE_4 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN10) /* PH10 AUX4 */ -# define PROBE_5 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN13) /* PD13 AUX5 */ -# define PROBE_6 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14) /* PD14 AUX6 */ -# define PROBE_7 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN6) /* PH6 AUX7 */ -# define PROBE_8 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN9) /* PH9 AUX8 */ -# define PROBE_9 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN11) /* PE11 CAP1 */ - -# define PROBE_INIT(mask) \ - do { \ - if ((mask)& PROBE_N(1)) { stm32_configgpio(PROBE_1); } \ - if ((mask)& PROBE_N(2)) { stm32_configgpio(PROBE_2); } \ - if ((mask)& PROBE_N(3)) { stm32_configgpio(PROBE_3); } \ - if ((mask)& PROBE_N(4)) { stm32_configgpio(PROBE_4); } \ - if ((mask)& PROBE_N(5)) { stm32_configgpio(PROBE_5); } \ - if ((mask)& PROBE_N(6)) { stm32_configgpio(PROBE_6); } \ - if ((mask)& PROBE_N(7)) { stm32_configgpio(PROBE_7); } \ - if ((mask)& PROBE_N(8)) { stm32_configgpio(PROBE_8); } \ - if ((mask)& PROBE_N(9)) { stm32_configgpio(PROBE_9); } \ - } while(0) - -# define PROBE(n,s) do {stm32_gpiowrite(PROBE_##n,(s));}while(0) -# define PROBE_MARK(n) PROBE(n,false);PROBE(n,true) -#else -# define PROBE_INIT(mask) -# define PROBE(n,s) -# define PROBE_MARK(n) -#endif - -#endif /*__NUTTX_CONFIG_PX4_FMU_V6X_INCLUDE_BOARD_H */ diff --git a/boards/px4/fmu-v6x/nuttx-config/include/board_dma_map.h b/boards/px4/fmu-v6x/nuttx-config/include/board_dma_map.h deleted file mode 100644 index 1f45efc..0000000 --- a/boards/px4/fmu-v6x/nuttx-config/include/board_dma_map.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#pragma once - -// DMAMUX1 Using at most 8 Channels on DMA1 -------- Assigned -// V - -#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* 1 DMA1:37 ICM-20649 */ -#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* 2 DMA1:38 ICM-20649 */ - -#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* 3 DMA1:39 ICM-42688-P */ -#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* 4 DMA1:40 ICM-42688-P */ - -//#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* DMA1:41 GPS1 */ -//#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* DMA1:42 GPS1 */ - -//#define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_0 /* DMA1:43 Telem3 */ -//#define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_0 /* DMA1:44 Telem3 */ - -//#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_0 /* DMA1:45 DEBUG */ -//#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_0 /* DMA1:46 DEBUG */ - -//#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* DMA1:63 EXT2 */ -//#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* DMA1:64 EXT2 */ - -#define DMAMAP_USART6_RX DMAMAP_DMA12_USART6RX_0 /* 5 DMA1:71 PX4IO */ -#define DMAMAP_USART6_TX DMAMAP_DMA12_USART6TX_0 /* 6 DMA1:72 PX4IO */ - -// Assigned in timer_config.cpp - -// Timer 4 /* 7 DMA1:32 TIM4UP */ -// Timer 5 /* 8 DMA1:50 TIM5UP */ - -// DMAMUX2 Using at most 8 Channels on DMA2 -------- Assigned -// V - -#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_1 /* 1 DMA2:61 BMI088 */ -#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_1 /* 2 DMA2:62 BMI088 */ - -#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* 3 DMA2:45 DEBUG */ -#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* 4 DMA2:46 DEBUG */ - -#define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_1 /* 5 DMA2:65 TELEM2 */ -#define DMAMAP_UART5_TX DMAMAP_DMA12_UART5TX_1 /* 6 DMA2:66 TELEM2 */ - -#define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_1 /* 7 DMA1:79 TELEM1 */ -#define DMAMAP_UART7_TX DMAMAP_DMA12_UART7TX_1 /* 8 DMA1:80 TELEM1 */ - -//#define DMAMAP_UART8_RX DMAMAP_DMA12_UART8RX_1 /* DMA1:81 GPS2 */ -//#define DMAMAP_UART8_TX DMAMAP_DMA12_UART8TX_1 /* DMA1:82 GPS2 */ - -// DMAMUX2 Using at most 8 Channels on BDMA -------- Assigned -// V - -#define DMAMAP_SPI6_RX DMAMAP_BDMA_SPI6_RX /* 1 BDMA:11 SPI J11 */ -#define DMAMAP_SPI6_TX DMAMAP_BDMA_SPI6_TX /* 2 BDMA:12 SPI J11 */ diff --git a/boards/px4/fmu-v6x/nuttx-config/nsh/defconfig b/boards/px4/fmu-v6x/nuttx-config/nsh/defconfig deleted file mode 100644 index edb5e8a..0000000 --- a/boards/px4/fmu-v6x/nuttx-config/nsh/defconfig +++ /dev/null @@ -1,328 +0,0 @@ -# -# This file is autogenerated: PLEASE DO NOT EDIT IT. -# -# You can use "make menuconfig" to make any modifications to the installed .config file. -# You can then do "make savedefconfig" to generate a new defconfig file that includes your -# modifications. -# -# CONFIG_DISABLE_ENVIRON is not set -# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set -# CONFIG_DISABLE_PTHREAD is not set -# CONFIG_MMCSD_HAVE_CARDDETECT is not set -# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set -# CONFIG_MMCSD_MMCSUPPORT is not set -# CONFIG_MMCSD_SPI is not set -# CONFIG_NSH_DISABLEBG is not set -# CONFIG_NSH_DISABLESCRIPT is not set -# CONFIG_NSH_DISABLE_ARP is not set -# CONFIG_NSH_DISABLE_CAT is not set -# CONFIG_NSH_DISABLE_CD is not set -# CONFIG_NSH_DISABLE_CP is not set -# CONFIG_NSH_DISABLE_DATE is not set -# CONFIG_NSH_DISABLE_DF is not set -# CONFIG_NSH_DISABLE_ECHO is not set -# CONFIG_NSH_DISABLE_ENV is not set -# CONFIG_NSH_DISABLE_EXEC is not set -# CONFIG_NSH_DISABLE_EXPORT is not set -# CONFIG_NSH_DISABLE_FREE is not set -# CONFIG_NSH_DISABLE_GET is not set -# CONFIG_NSH_DISABLE_HELP is not set -# CONFIG_NSH_DISABLE_IFCONFIG is not set -# CONFIG_NSH_DISABLE_IFUPDOWN is not set -# CONFIG_NSH_DISABLE_ITEF is not set -# CONFIG_NSH_DISABLE_KILL is not set -# CONFIG_NSH_DISABLE_LOOPS is not set -# CONFIG_NSH_DISABLE_LS is not set -# CONFIG_NSH_DISABLE_MKDIR is not set -# CONFIG_NSH_DISABLE_MKFATFS is not set -# CONFIG_NSH_DISABLE_MOUNT is not set -# CONFIG_NSH_DISABLE_MV is not set -# CONFIG_NSH_DISABLE_NSLOOKUP is not set -# CONFIG_NSH_DISABLE_PS is not set -# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set -# CONFIG_NSH_DISABLE_PWD is not set -# CONFIG_NSH_DISABLE_RM is not set -# CONFIG_NSH_DISABLE_RMDIR is not set -# CONFIG_NSH_DISABLE_SEMICOLON is not set -# CONFIG_NSH_DISABLE_SET is not set -# CONFIG_NSH_DISABLE_SLEEP is not set -# CONFIG_NSH_DISABLE_SOURCE is not set -# CONFIG_NSH_DISABLE_TELNETD is not set -# CONFIG_NSH_DISABLE_TEST is not set -# CONFIG_NSH_DISABLE_TIME is not set -# CONFIG_NSH_DISABLE_UMOUNT is not set -# CONFIG_NSH_DISABLE_UNSET is not set -# CONFIG_NSH_DISABLE_USLEEP is not set -CONFIG_ARCH="arm" -CONFIG_ARCH_BOARD_CUSTOM=y -CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/px4/fmu-v6x/nuttx-config" -CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y -CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" -CONFIG_ARCH_CHIP="stm32h7" -CONFIG_ARCH_CHIP_STM32H753II=y -CONFIG_ARCH_CHIP_STM32H7=y -CONFIG_ARCH_INTERRUPTSTACK=768 -CONFIG_ARCH_STACKDUMP=y -CONFIG_ARMV7M_BASEPRI_WAR=y -CONFIG_ARMV7M_DCACHE=y -CONFIG_ARMV7M_DTCM=y -CONFIG_ARMV7M_ICACHE=y -CONFIG_ARMV7M_MEMCPY=y -CONFIG_ARMV7M_USEBASEPRI=y -CONFIG_ARM_MPU_EARLY_RESET=y -CONFIG_BOARDCTL_RESET=y -CONFIG_BOARD_ASSERT_RESET_VALUE=0 -CONFIG_BOARD_CRASHDUMP=y -CONFIG_BOARD_LOOPSPERMSEC=95751 -CONFIG_BOARD_RESET_ON_ASSERT=2 -CONFIG_BUILTIN=y -CONFIG_CDCACM=y -CONFIG_CDCACM_IFLOWCONTROL=y -CONFIG_CDCACM_PRODUCTID=0x0035 -CONFIG_CDCACM_PRODUCTSTR="PX4 FMU v6X.x" -CONFIG_CDCACM_RXBUFSIZE=600 -CONFIG_CDCACM_TXBUFSIZE=12000 -CONFIG_CDCACM_VENDORID=0x3185 -CONFIG_CDCACM_VENDORSTR="Auterion" -CONFIG_DEBUG_FULLOPT=y -CONFIG_DEBUG_HARDFAULT_ALERT=y -CONFIG_DEBUG_MEMFAULT=y -CONFIG_DEBUG_SYMBOLS=y -CONFIG_DEBUG_TCBINFO=y -CONFIG_DEFAULT_SMALL=y -CONFIG_DEV_FIFO_SIZE=0 -CONFIG_DEV_PIPE_MAXSIZE=1024 -CONFIG_DEV_PIPE_SIZE=70 -CONFIG_ETH0_PHY_LAN8742A=y -CONFIG_EXPERIMENTAL=y -CONFIG_FAT_DMAMEMORY=y -CONFIG_FAT_LCNAMES=y -CONFIG_FAT_LFN=y -CONFIG_FAT_LFN_ALIAS_HASH=y -CONFIG_FDCLONE_STDIO=y -CONFIG_FSUTILS_IPCFG=y -CONFIG_FS_BINFS=y -CONFIG_FS_CROMFS=y -CONFIG_FS_FAT=y -CONFIG_FS_FATTIME=y -CONFIG_FS_PROCFS=y -CONFIG_FS_PROCFS_INCLUDE_PROGMEM=y -CONFIG_FS_PROCFS_MAX_TASKS=64 -CONFIG_FS_PROCFS_REGISTER=y -CONFIG_FS_ROMFS=y -CONFIG_GRAN=y -CONFIG_GRAN_INTR=y -CONFIG_HAVE_CXX=y -CONFIG_HAVE_CXXINITIALIZE=y -CONFIG_I2C=y -CONFIG_I2C_RESET=y -CONFIG_IDLETHREAD_STACKSIZE=750 -CONFIG_INIT_ENTRYPOINT="nsh_main" -CONFIG_INIT_STACKSIZE=2944 -CONFIG_IOB_NBUFFERS=24 -CONFIG_IOB_THROTTLE=0 -CONFIG_IPCFG_BINARY=y -CONFIG_IPCFG_CHARDEV=y -CONFIG_IPCFG_PATH="/fs/mtd_net" -CONFIG_LIBC_FLOATINGPOINT=y -CONFIG_LIBC_LONG_LONG=y -CONFIG_LIBC_MAX_EXITFUNS=1 -CONFIG_LIBC_STRERROR=y -CONFIG_MEMSET_64BIT=y -CONFIG_MEMSET_OPTSPEED=y -CONFIG_MMCSD=y -CONFIG_MMCSD_SDIO=y -CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y -CONFIG_MM_REGIONS=4 -CONFIG_MTD=y -CONFIG_MTD_BYTE_WRITE=y -CONFIG_MTD_PARTITION=y -CONFIG_MTD_PROGMEM=y -CONFIG_MTD_RAMTRON=y -CONFIG_NAME_MAX=40 -CONFIG_NET=y -CONFIG_NETDB_DNSCLIENT=y -CONFIG_NETDB_DNSCLIENT_ENTRIES=8 -CONFIG_NETDB_DNSSERVER_NOADDR=y -CONFIG_NETDEV_PHY_IOCTL=y -CONFIG_NETINIT_DHCPC=y -CONFIG_NETINIT_DNS=y -CONFIG_NETINIT_DNSIPADDR=0XC0A800FE -CONFIG_NETINIT_DRIPADDR=0XC0A800FE -CONFIG_NETINIT_MONITOR=y -CONFIG_NETINIT_THREAD=y -CONFIG_NETINIT_THREAD_PRIORITY=49 -CONFIG_NETUTILS_TELNETD=y -CONFIG_NET_ARP_IPIN=y -CONFIG_NET_ARP_SEND=y -CONFIG_NET_BROADCAST=y -CONFIG_NET_ETH_PKTSIZE=1518 -CONFIG_NET_ICMP=y -CONFIG_NET_ICMP_SOCKET=y -CONFIG_NET_NACTIVESOCKETS=16 -CONFIG_NET_SOLINGER=y -CONFIG_NET_TCP=y -CONFIG_NET_TCPBACKLOG=y -CONFIG_NET_TCP_DELAYED_ACK=y -CONFIG_NET_TCP_WRITE_BUFFERS=y -CONFIG_NET_UDP=y -CONFIG_NET_UDP_CHECKSUMS=y -CONFIG_NET_UDP_WRITE_BUFFERS=y -CONFIG_NSH_ARCHINIT=y -CONFIG_NSH_ARGCAT=y -CONFIG_NSH_BUILTIN_APPS=y -CONFIG_NSH_CMDPARMS=y -CONFIG_NSH_CROMFSETC=y -CONFIG_NSH_LINELEN=128 -CONFIG_NSH_MAXARGUMENTS=15 -CONFIG_NSH_NESTDEPTH=8 -CONFIG_NSH_QUOTE=y -CONFIG_NSH_ROMFSETC=y -CONFIG_NSH_ROMFSSECTSIZE=128 -CONFIG_NSH_STRERROR=y -CONFIG_NSH_TELNET=y -CONFIG_NSH_TELNET_LOGIN=y -CONFIG_NSH_VARS=y -CONFIG_OTG_ID_GPIO_DISABLE=y -CONFIG_PIPES=y -CONFIG_PREALLOC_TIMERS=50 -CONFIG_PRIORITY_INHERITANCE=y -CONFIG_PTHREAD_MUTEX_ROBUST=y -CONFIG_PTHREAD_STACK_MIN=512 -CONFIG_RAMTRON_SETSPEED=y -CONFIG_RAM_SIZE=245760 -CONFIG_RAM_START=0x20010000 -CONFIG_RAW_BINARY=y -CONFIG_READLINE_CMD_HISTORY=y -CONFIG_READLINE_TABCOMPLETION=y -CONFIG_RTC_DATETIME=y -CONFIG_SCHED_HPWORK=y -CONFIG_SCHED_HPWORKPRIORITY=249 -CONFIG_SCHED_HPWORKSTACKSIZE=1280 -CONFIG_SCHED_INSTRUMENTATION=y -CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y -CONFIG_SCHED_INSTRUMENTATION_SWITCH=y -CONFIG_SCHED_LPWORK=y -CONFIG_SCHED_LPWORKPRIORITY=50 -CONFIG_SCHED_LPWORKSTACKSIZE=1632 -CONFIG_SCHED_WAITPID=y -CONFIG_SDMMC2_SDIO_PULLUP=y -CONFIG_SEM_PREALLOCHOLDERS=32 -CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS=y -CONFIG_SERIAL_TERMIOS=y -CONFIG_SIG_DEFAULT=y -CONFIG_SIG_SIGALRM_ACTION=y -CONFIG_SIG_SIGUSR1_ACTION=y -CONFIG_SIG_SIGUSR2_ACTION=y -CONFIG_SIG_SIGWORK=4 -CONFIG_STACK_COLORATION=y -CONFIG_START_DAY=30 -CONFIG_START_MONTH=11 -CONFIG_STDIO_BUFFER_SIZE=256 -CONFIG_STM32H7_ADC1=y -CONFIG_STM32H7_ADC3=y -CONFIG_STM32H7_BBSRAM=y -CONFIG_STM32H7_BBSRAM_FILES=5 -CONFIG_STM32H7_BDMA=y -CONFIG_STM32H7_BKPSRAM=y -CONFIG_STM32H7_DMA1=y -CONFIG_STM32H7_DMA2=y -CONFIG_STM32H7_DMACAPABLE=y -CONFIG_STM32H7_ETHMAC=y -CONFIG_STM32H7_FLASH_OVERRIDE_I=y -CONFIG_STM32H7_FLOWCONTROL_BROKEN=y -CONFIG_STM32H7_I2C1=y -CONFIG_STM32H7_I2C2=y -CONFIG_STM32H7_I2C3=y -CONFIG_STM32H7_I2C4=y -CONFIG_STM32H7_I2C_DYNTIMEO=y -CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 -CONFIG_STM32H7_OTGFS=y -CONFIG_STM32H7_PHYSR=31 -CONFIG_STM32H7_PHYSR_100MBPS=0x8 -CONFIG_STM32H7_PHYSR_FULLDUPLEX=0x10 -CONFIG_STM32H7_PHYSR_MODE=0x10 -CONFIG_STM32H7_PHYSR_SPEED=0x8 -CONFIG_STM32H7_PHY_POLLING=y -CONFIG_STM32H7_PROGMEM=y -CONFIG_STM32H7_RTC=y -CONFIG_STM32H7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y -CONFIG_STM32H7_RTC_MAGIC_REG=1 -CONFIG_STM32H7_SAVE_CRASHDUMP=y -CONFIG_STM32H7_SDMMC2=y -CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y -CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y -CONFIG_STM32H7_SPI1=y -CONFIG_STM32H7_SPI1_DMA=y -CONFIG_STM32H7_SPI1_DMA_BUFFER=1024 -CONFIG_STM32H7_SPI2=y -CONFIG_STM32H7_SPI2_DMA=y -CONFIG_STM32H7_SPI2_DMA_BUFFER=4096 -CONFIG_STM32H7_SPI3=y -CONFIG_STM32H7_SPI3_DMA=y -CONFIG_STM32H7_SPI3_DMA_BUFFER=1024 -CONFIG_STM32H7_SPI5=y -CONFIG_STM32H7_SPI6=y -CONFIG_STM32H7_SPI6_DMA=y -CONFIG_STM32H7_SPI6_DMA_BUFFER=1024 -CONFIG_STM32H7_TIM12=y -CONFIG_STM32H7_TIM1=y -CONFIG_STM32H7_TIM4=y -CONFIG_STM32H7_TIM5=y -CONFIG_STM32H7_UART4=y -CONFIG_STM32H7_UART5=y -CONFIG_STM32H7_UART7=y -CONFIG_STM32H7_UART8=y -CONFIG_STM32H7_USART1=y -CONFIG_STM32H7_USART2=y -CONFIG_STM32H7_USART3=y -CONFIG_STM32H7_USART6=y -CONFIG_STM32H7_USART_BREAKS=y -CONFIG_STM32H7_USART_INVERT=y -CONFIG_STM32H7_USART_SINGLEWIRE=y -CONFIG_STM32H7_USART_SWAP=y -CONFIG_SYSTEM_CDCACM=y -CONFIG_SYSTEM_DHCPC_RENEW=y -CONFIG_SYSTEM_NSH=y -CONFIG_SYSTEM_PING=y -CONFIG_TASK_NAME_SIZE=24 -CONFIG_UART4_BAUD=57600 -CONFIG_UART4_RXBUFSIZE=600 -CONFIG_UART4_TXBUFSIZE=1500 -CONFIG_UART5_IFLOWCONTROL=y -CONFIG_UART5_OFLOWCONTROL=y -CONFIG_UART5_RXDMA=y -CONFIG_UART5_TXBUFSIZE=3000 -CONFIG_UART5_TXDMA=y -CONFIG_UART7_BAUD=57600 -CONFIG_UART7_IFLOWCONTROL=y -CONFIG_UART7_OFLOWCONTROL=y -CONFIG_UART7_RXBUFSIZE=600 -CONFIG_UART7_RXDMA=y -CONFIG_UART7_TXBUFSIZE=3000 -CONFIG_UART7_TXDMA=y -CONFIG_UART8_BAUD=57600 -CONFIG_UART8_RXBUFSIZE=600 -CONFIG_UART8_TXBUFSIZE=1500 -CONFIG_USART1_BAUD=57600 -CONFIG_USART1_RXBUFSIZE=600 -CONFIG_USART1_TXBUFSIZE=1500 -CONFIG_USART2_BAUD=57600 -CONFIG_USART2_IFLOWCONTROL=y -CONFIG_USART2_OFLOWCONTROL=y -CONFIG_USART2_RXBUFSIZE=600 -CONFIG_USART2_TXBUFSIZE=3000 -CONFIG_USART3_BAUD=57600 -CONFIG_USART3_RXBUFSIZE=180 -CONFIG_USART3_RXDMA=y -CONFIG_USART3_SERIAL_CONSOLE=y -CONFIG_USART3_TXBUFSIZE=1500 -CONFIG_USART3_TXDMA=y -CONFIG_USART6_BAUD=57600 -CONFIG_USART6_RXBUFSIZE=600 -CONFIG_USART6_TXBUFSIZE=1500 -CONFIG_USBDEV=y -CONFIG_USBDEV_BUSPOWERED=y -CONFIG_USBDEV_MAXPOWER=500 -CONFIG_USEC_PER_TICK=1000 -CONFIG_WATCHDOG=y diff --git a/boards/px4/fmu-v6x/nuttx-config/scripts/bootloader_script.ld b/boards/px4/fmu-v6x/nuttx-config/scripts/bootloader_script.ld deleted file mode 100644 index 2e6eba3..0000000 --- a/boards/px4/fmu-v6x/nuttx-config/scripts/bootloader_script.ld +++ /dev/null @@ -1,215 +0,0 @@ -/**************************************************************************** - * scripts/script.ld - * - * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/* The PX4 FMUV6X uses an STM32H753II has 2048Kb of main FLASH memory. - * The flash memory is partitioned into a User Flash memory and a System - * Flash memory. Each of these memories has two banks: - * - * 1) User Flash memory: - * - * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each - * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each - * - * 2) System Flash memory: - * - * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector - * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector - * - * 3) User option bytes for user configuration, only in Bank 1. - * - * In the STM32H743II, two different boot spaces can be selected through - * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and - * BOOT_ADD1 option bytes: - * - * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. - * ST programmed value: Flash memory at 0x0800:0000 - * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. - * ST programmed value: System bootloader at 0x1FF0:0000 - * - * The PX4 FMUV6X has a test point on board, the BOOT0 pin is at ground so by - * default, the STM32 will boot to address 0x0800:0000 in FLASH unless the test - * point is pulled to 3.3V.then the boot will be from 0x1FF0:0000 - * - * The STM32H743II also has 1024Kb of data SRAM. - * SRAM is split up into several blocks and into three power domains: - * - * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with - * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus - * - * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 - * - * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit - * DTCM ports. The DTCM-RAM could be used for critical real-time - * data, such as interrupt service routines or stack / heap memory. - * Both DTCM-RAMs can be used in parallel (for load/store operations) - * thanks to the Cortex-M7 dual issue capability. - * - * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 - * - * This RAM is connected to ITCM 64-bit interface designed for - * execution of critical real-times routines by the CPU. - * - * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA - * through D1 domain AXI bus matrix - * - * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 - * - * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA - * through D2 domain AHB bus matrix - * - * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 - * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 - * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 - * - * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 - * - * 4) AHB SRAM (D3 domain) accessible by most of system masters - * through D3 domain AHB bus matrix - * - * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 - * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 - * - * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 - * where the code expects to begin execution by jumping to the entry point in - * the 0x0800:0000 address range. - * - * The bootloader uses the first sector of the flash, which is 128K in length. - */ - -MEMORY -{ - itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K - flash (rx) : ORIGIN = 0x08000000, LENGTH = 128K - dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K - sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K - sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K - sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K - sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K - sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K - bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K -} - -OUTPUT_ARCH(arm) -EXTERN(_vectors) -ENTRY(_stext) - -/* - * Ensure that abort() is present in the final object. The exception handling - * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). - */ -EXTERN(abort) -EXTERN(_bootdelay_signature) - -SECTIONS -{ - .text : { - _stext = ABSOLUTE(.); - *(.vectors) - . = ALIGN(32); - /* - This signature provides the bootloader with a way to delay booting - */ - _bootdelay_signature = ABSOLUTE(.); - FILL(0xffecc2925d7d05c5) - . += 8; - *(.text .text.*) - *(.fixup) - *(.gnu.warning) - *(.rodata .rodata.*) - *(.gnu.linkonce.t.*) - *(.glue_7) - *(.glue_7t) - *(.got) - *(.gcc_except_table) - *(.gnu.linkonce.r.*) - _etext = ABSOLUTE(.); - - } > flash - - /* - * Init functions (static constructors and the like) - */ - .init_section : { - _sinit = ABSOLUTE(.); - KEEP(*(.init_array .init_array.*)) - _einit = ABSOLUTE(.); - } > flash - - - .ARM.extab : { - *(.ARM.extab*) - } > flash - - __exidx_start = ABSOLUTE(.); - .ARM.exidx : { - *(.ARM.exidx*) - } > flash - __exidx_end = ABSOLUTE(.); - - _eronly = ABSOLUTE(.); - - .data : { - _sdata = ABSOLUTE(.); - *(.data .data.*) - *(.gnu.linkonce.d.*) - CONSTRUCTORS - _edata = ABSOLUTE(.); - } > sram AT > flash - - .bss : { - _sbss = ABSOLUTE(.); - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - _ebss = ABSOLUTE(.); - } > sram - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_info 0 : { *(.debug_info) } - .debug_line 0 : { *(.debug_line) } - .debug_pubnames 0 : { *(.debug_pubnames) } - .debug_aranges 0 : { *(.debug_aranges) } -} diff --git a/boards/px4/fmu-v6x/nuttx-config/scripts/script.ld b/boards/px4/fmu-v6x/nuttx-config/scripts/script.ld deleted file mode 100644 index b6b341d..0000000 --- a/boards/px4/fmu-v6x/nuttx-config/scripts/script.ld +++ /dev/null @@ -1,229 +0,0 @@ -/**************************************************************************** - * scripts/script.ld - * - * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/* The PX4 FMUV6X uses an STM32H753II has 2048Kb of main FLASH memory. - * The flash memory is partitioned into a User Flash memory and a System - * Flash memory. Each of these memories has two banks: - * - * 1) User Flash memory: - * - * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each - * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each - * - * 2) System Flash memory: - * - * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector - * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector - * - * 3) User option bytes for user configuration, only in Bank 1. - * - * In the STM32H743II, two different boot spaces can be selected through - * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and - * BOOT_ADD1 option bytes: - * - * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. - * ST programmed value: Flash memory at 0x0800:0000 - * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. - * ST programmed value: System bootloader at 0x1FF0:0000 - * - * The PX4 FMUV6X has a test point on board, the BOOT0 pin is at ground so by - * default, the STM32 will boot to address 0x0800:0000 in FLASH unless the test - * point is pulled to 3.3V.then the boot will be from 0x1FF0:0000 - * - * The STM32H743II also has 1024Kb of data SRAM. - * SRAM is split up into several blocks and into three power domains: - * - * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with - * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus - * - * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 - * - * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit - * DTCM ports. The DTCM-RAM could be used for critical real-time - * data, such as interrupt service routines or stack / heap memory. - * Both DTCM-RAMs can be used in parallel (for load/store operations) - * thanks to the Cortex-M7 dual issue capability. - * - * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 - * - * This RAM is connected to ITCM 64-bit interface designed for - * execution of critical real-times routines by the CPU. - * - * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA - * through D1 domain AXI bus matrix - * - * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 - * - * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA - * through D2 domain AHB bus matrix - * - * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 - * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 - * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 - * - * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 - * - * 4) AHB SRAM (D3 domain) accessible by most of system masters - * through D3 domain AHB bus matrix - * - * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 - * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 - * - * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 - * where the code expects to begin execution by jumping to the entry point in - * the 0x0800:0000 address range. - */ - -MEMORY -{ - ITCM_RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 64K - FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1920K - - DTCM1_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - DTCM2_RAM (rwx) : ORIGIN = 0x20010000, LENGTH = 64K - AXI_SRAM (rwx) : ORIGIN = 0x24000000, LENGTH = 512K /* D1 domain AXI bus */ - SRAM1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K /* D2 domain AHB bus */ - SRAM2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K /* D2 domain AHB bus */ - SRAM3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K /* D2 domain AHB bus */ - SRAM4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K /* D3 domain */ - BKPRAM (rwx) : ORIGIN = 0x38800000, LENGTH = 4K -} - -OUTPUT_ARCH(arm) -EXTERN(_vectors) -ENTRY(_stext) - -/* - * Ensure that abort() is present in the final object. The exception handling - * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). - */ -EXTERN(abort) -EXTERN(_bootdelay_signature) -EXTERN(board_get_manifest) - -SECTIONS -{ - .text : { - _stext = ABSOLUTE(.); - *(.vectors) - . = ALIGN(32); - /* - This signature provides the bootloader with a way to delay booting - */ - _bootdelay_signature = ABSOLUTE(.); - FILL(0xffecc2925d7d05c5) - . += 8; - *(.text .text.*) - *(.fixup) - *(.gnu.warning) - *(.rodata .rodata.*) - *(.gnu.linkonce.t.*) - *(.glue_7) - *(.glue_7t) - *(.got) - *(.gcc_except_table) - *(.gnu.linkonce.r.*) - _etext = ABSOLUTE(.); - - } > FLASH - - /* - * Init functions (static constructors and the like) - */ - .init_section : { - _sinit = ABSOLUTE(.); - KEEP(*(.init_array .init_array.*)) - _einit = ABSOLUTE(.); - } > FLASH - - - .ARM.extab : { - *(.ARM.extab*) - } > FLASH - - __exidx_start = ABSOLUTE(.); - .ARM.exidx : { - *(.ARM.exidx*) - } > FLASH - __exidx_end = ABSOLUTE(.); - - _eronly = ABSOLUTE(.); - - .data : { - _sdata = ABSOLUTE(.); - *(.data .data.*) - *(.gnu.linkonce.d.*) - CONSTRUCTORS - _edata = ABSOLUTE(.); - - /* Pad out last section as the STM32H7 Flash write size is 256 bits. 32 bytes */ - . = ALIGN(16); - FILL(0xffff) - . += 16; - } > AXI_SRAM AT > FLASH = 0xffff - - .bss : { - _sbss = ABSOLUTE(.); - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - _ebss = ABSOLUTE(.); - } > AXI_SRAM - - /* Emit the the D3 power domain section for locating BDMA data */ - - .sram4_reserve (NOLOAD) : - { - *(.sram4) - . = ALIGN(4); - _sram4_heap_start = ABSOLUTE(.); - } > SRAM4 - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_info 0 : { *(.debug_info) } - .debug_line 0 : { *(.debug_line) } - .debug_pubnames 0 : { *(.debug_pubnames) } - .debug_aranges 0 : { *(.debug_aranges) } -} diff --git a/boards/px4/fmu-v6x/src/CMakeLists.txt b/boards/px4/fmu-v6x/src/CMakeLists.txt deleted file mode 100644 index d4a16ff..0000000 --- a/boards/px4/fmu-v6x/src/CMakeLists.txt +++ /dev/null @@ -1,76 +0,0 @@ -############################################################################ -# -# Copyright (c) 2016 PX4 Development Team. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# 3. Neither the name PX4 nor the names of its contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -############################################################################ -if("${PX4_BOARD_LABEL}" STREQUAL "bootloader") - add_compile_definitions(BOOTLOADER) - add_library(drivers_board - bootloader_main.c - init.c - usb.c - timer_config.cpp - ) - target_link_libraries(drivers_board - PRIVATE - nuttx_arch # sdio - nuttx_drivers # sdio - px4_layer #gpio - arch_io_pins # iotimer - bootloader - ) - target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) - -else() - add_library(drivers_board - can.c - i2c.cpp - init.c - led.c - mtd.cpp - manifest.c - sdio.c - spi.cpp - timer_config.cpp - usb.c - ) - add_dependencies(drivers_board arch_board_hw_info) - - target_link_libraries(drivers_board - PRIVATE - arch_io_pins - arch_spi - arch_board_hw_info - drivers__led # drv_led_start - nuttx_arch # sdio - nuttx_drivers # sdio - px4_layer - ) -endif() diff --git a/boards/px4/fmu-v6x/src/board_config.h b/boards/px4/fmu-v6x/src/board_config.h deleted file mode 100644 index fecd7ef..0000000 --- a/boards/px4/fmu-v6x/src/board_config.h +++ /dev/null @@ -1,534 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2016-2022 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file board_config.h - * - * PX4FMU-v6x internal definitions - */ - -#pragma once - -/**************************************************************************************************** - * Included Files - ****************************************************************************************************/ - -#include -#include -#include - - -#include - -/**************************************************************************************************** - * Definitions - ****************************************************************************************************/ - -#undef TRACE_PINS - -/* PX4IO connection configuration */ - -#define BOARD_USES_PX4IO_VERSION 2 -#define PX4IO_SERIAL_DEVICE "/dev/ttyS5" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ - -/* Configuration ************************************************************************************/ - -#define BOARD_HAS_LTC44XX_VALIDS 2 // N Bricks -#define BOARD_HAS_USB_VALID 1 // LTC Has USB valid -#define BOARD_HAS_NBAT_V 2d // 2 Digital Voltage -#define BOARD_HAS_NBAT_I 2d // 2 Digital Current - -/* PX4FMU GPIOs ***********************************************************************************/ - -/* Trace Clock and D0-D3 are available on the trace connector - * - * TRACECLK PE2 - Dedicated - Trace Connector Pin 1 - * TRACED0 PE3 - nLED_RED - Trace Connector Pin 3 - * TRACED1 PE4 - nLED_GREEN - Trace Connector Pin 5 - * TRACED2 PE5 - nLED_BLUE - Trace Connector Pin 7 - * TRACED3 PE6 - nARMED - Trace Connector Pin 8 - - */ - -/* LEDs are driven with push open drain to support Anode to 5V or 3.3V or used as TRACE0-2 */ - -#if !defined(TRACE_PINS) -# define GPIO_nLED_RED /* PE3 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN3) -# define GPIO_nLED_GREEN /* PE4 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN4) -# define GPIO_nLED_BLUE /* PE5 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN5) - -# define BOARD_HAS_CONTROL_STATUS_LEDS 1 -# define BOARD_OVERLOAD_LED LED_RED -# define BOARD_ARMED_STATE_LED LED_BLUE - -#else - -# define GPIO_TRACECLK1 (GPIO_TRACECLK |GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN2) -# define GPIO_TRACED0 (GPIO_TRACED0_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN3) -# define GPIO_TRACED1 (GPIO_TRACED1_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN4) -# define GPIO_TRACED2 (GPIO_TRACED2_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN5) -# define GPIO_TRACED3 (GPIO_TRACED3_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN6) -//#define GPIO_TRACESWO //(GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN3) - -# undef BOARD_HAS_CONTROL_STATUS_LEDS -# undef BOARD_OVERLOAD_LED -# undef BOARD_ARMED_STATE_LED - -# define GPIO_nLED_RED GPIO_TRACED0 -# define GPIO_nLED_GREEN GPIO_TRACED1 -# define GPIO_nLED_BLUE GPIO_TRACED2 -# define GPIO_nARMED GPIO_TRACED3 -# define GPIO_nARMED_INIT GPIO_TRACED3 -#endif - - -/* SPI */ - -#define SPI6_nRESET_EXTERNAL1 /* PF10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN10) -#define GPIO_SYNC /* PE9 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_100MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN9) - -/* I2C busses */ - -/* Devices on the onboard buses. - * - * Note that these are unshifted addresses. - */ -#define BOARD_MTD_NUM_EEPROM 2 /* MTD: base_eeprom, imu_eeprom*/ - -#define PX4_I2C_OBDEV_SE050 0x48 - -#define GPIO_I2C2_DRDY1_BMP388 /* PG5 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTG|GPIO_PIN5) - -/* - * ADC channels - * - * These are the channel numbers of the ADCs of the microcontroller that - * can be used by the Px4 Firmware in the adc driver - */ - -/* ADC defines to be used in sensors.cpp to read from a particular channel */ - -#define ADC1_CH(n) (n) - -/* N.B. there is no offset mapping needed for ADC3 because */ -#define ADC3_CH(n) (n) - -/* We are only use ADC3 for REV/VER. - * ADC3_6V6 and ADC3_3V3 are mapped back to ADC1 - * To do this We are relying on PC2_C, PC3_C being connected to PC2, PC3 - * respectively by the SYSCFG_PMCR default of setting for PC3SO PC2SO PA1SO - * PA0SO of 0. - * - * 0 Analog switch closed (pads are connected through the analog switch) - * - * So ADC3_INP0 is GPIO_ADC123_INP12 - * ADC3_INP1 is GPIO_ADC12_INP13 - */ - -/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ - -#define PX4_ADC_GPIO \ - /* PA0 */ GPIO_ADC1_INP16, \ - /* PA4 */ GPIO_ADC12_INP18, \ - /* PB0 */ GPIO_ADC12_INP9, \ - /* PB1 */ GPIO_ADC12_INP5, \ - /* PC2 */ GPIO_ADC123_INP12, \ - /* PC3 */ GPIO_ADC12_INP13, \ - /* PF12 */ GPIO_ADC1_INP6, \ - /* PH3 */ GPIO_ADC3_INP14, \ - /* PH4 */ GPIO_ADC3_INP15 - -/* Define Channel numbers must match above GPIO pin IN(n)*/ -#define ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL /* PA0 */ ADC1_CH(16) -#define ADC_SCALED_VDD_3V3_SENSORS2_CHANNEL /* PA4 */ ADC1_CH(18) -#define ADC_SCALED_VDD_3V3_SENSORS3_CHANNEL /* PB0 */ ADC1_CH(9) -#define ADC_SCALED_V5_CHANNEL /* PB1 */ ADC1_CH(5) -#define ADC_ADC3_6V6_CHANNEL /* PC2 */ ADC3_CH(12) -#define ADC_ADC3_3V3_CHANNEL /* PC3 */ ADC3_CH(13) -#define ADC_SCALED_VDD_3V3_SENSORS4_CHANNEL /* PF12 */ ADC1_CH(6) -#define ADC_HW_VER_SENSE_CHANNEL /* PH3 */ ADC3_CH(14) -#define ADC_HW_REV_SENSE_CHANNEL /* PH4 */ ADC3_CH(15) - -#define ADC_CHANNELS \ - ((1 << ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL) | \ - (1 << ADC_SCALED_VDD_3V3_SENSORS2_CHANNEL) | \ - (1 << ADC_SCALED_VDD_3V3_SENSORS3_CHANNEL) | \ - (1 << ADC_SCALED_V5_CHANNEL) | \ - (1 << ADC_ADC3_6V6_CHANNEL) | \ - (1 << ADC_ADC3_3V3_CHANNEL)) | \ - (1 << ADC_SCALED_VDD_3V3_SENSORS4_CHANNEL) - -/* HW has to large of R termination on ADC todo:change when HW value is chosen */ - -#define HW_REV_VER_ADC_BASE STM32_ADC3_BASE - -#define SYSTEM_ADC_BASE STM32_ADC1_BASE - -/* HW has to large of R termination on ADC todo:change when HW value is chosen */ -#define BOARD_ADC_OPEN_CIRCUIT_V (5.6f) - -/* HW Version and Revision drive signals Default to 1 to detect */ -#define BOARD_HAS_HW_VERSIONING - -#define GPIO_HW_VER_REV_DRIVE /* PG0 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN0) -#define GPIO_HW_REV_SENSE /* PH4 */ GPIO_ADC3_INP15 -#define GPIO_HW_VER_SENSE /* PH3 */ GPIO_ADC3_INP14 -#define HW_INFO_INIT_PREFIX "V6X" - -#define BOARD_NUM_SPI_CFG_HW_VERSIONS 11 // Rev 0 and Rev 3,4 Sensor sets -// Base/FMUM -#define V6X00 HW_VER_REV(0x0,0x0) // FMUV6X, Rev 0 -#define V6X01 HW_VER_REV(0x0,0x1) // FMUV6X, BMI388 I2C2 Rev 1 -#define V6X03 HW_VER_REV(0x0,0x3) // FMUV6X, Sensor Set Rev 3 -#define V6X04 HW_VER_REV(0x0,0x4) // FMUV6X, Sensor Set Rev 4 -#define V6X10 HW_VER_REV(0x1,0x0) // NO PX4IO, Rev 0 -#define V6X13 HW_VER_REV(0x1,0x3) // NO PX4IO, Sensor Set Rev 3 -#define V6X14 HW_VER_REV(0x1,0x4) // NO PX4IO, Sensor Set Rev 4 -#define V6X21 HW_VER_REV(0x2,0x1) // FMUV6X, CUAV Sensor Set -#define V6X40 HW_VER_REV(0x4,0x0) // FMUV6X, HB CM4 base Rev 0 -#define V6X41 HW_VER_REV(0x4,0x1) // FMUV6X, BMI388 I2C2 HB CM4 base Rev 1 -#define V6X43 HW_VER_REV(0x4,0x3) // FMUV6X, Sensor Set HB CM4 base Rev 3 -#define V6X44 HW_VER_REV(0x4,0x4) // FMUV6X, Sensor Set HB CM4 base Rev 4 -#define V6X50 HW_VER_REV(0x5,0x0) // FMUV6X, HB Mini Rev 0 -#define V6X51 HW_VER_REV(0x5,0x1) // FMUV6X, BMI388 I2C2 HB Mini Rev 1 -#define V6X53 HW_VER_REV(0x5,0x3) // FMUV6X, Sensor Set HB Mini Rev 3 -#define V6X54 HW_VER_REV(0x5,0x4) // FMUV6X, Sensor Set HB Mini Rev 4 -#define V6X90 HW_VER_REV(0x9,0x0) // Rev 0 -#define V6X0910 HW_VER_REV(0x9,0x10) // FMUV6X, rev from EEPROM Auterion Skynode ver9 -#define V6X1010 HW_VER_REV(0x10,0x10) // FMUV6X, rev from EEPROM Auterion Skynode ver10 - - - -#define UAVCAN_NUM_IFACES_RUNTIME 1 - -/* HEATER - * PWM in future - */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) - -/* PE6 is nARMED - * The GPIO will be set as input while not armed HW will have external HW Pull UP. - * While armed it shall be configured at a GPIO OUT set LOW - */ -#if !defined(TRACE_PINS) -#define GPIO_nARMED_INIT /* PE6 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN6) -#define GPIO_nARMED /* PE6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN6) -#define BOARD_INDICATE_EXTERNAL_LOCKOUT_STATE(enabled) px4_arch_configgpio((enabled) ? GPIO_nARMED : GPIO_nARMED_INIT) -#define BOARD_GET_EXTERNAL_LOCKOUT_STATE() px4_arch_gpioread(GPIO_nARMED) -#endif - - -/* PWM - */ -#define DIRECT_PWM_OUTPUT_CHANNELS 9 - - -/* Power supply control and monitoring GPIOs */ - -#define GPIO_nPOWER_IN_A /* PG1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN1) -#define GPIO_nPOWER_IN_B /* PG2 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN2) -#define GPIO_nPOWER_IN_C /* PG3 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN3) - -#define GPIO_nVDD_BRICK1_VALID GPIO_nPOWER_IN_A /* Brick 1 Is Chosen */ -#define GPIO_nVDD_BRICK2_VALID GPIO_nPOWER_IN_B /* Brick 2 Is Chosen */ -#define BOARD_NUMBER_BRICKS 2 -#define BOARD_NUMBER_DIGITAL_BRICKS 2 -#define GPIO_nVDD_USB_VALID GPIO_nPOWER_IN_C /* USB Is Chosen */ - -#define GPIO_VDD_5V_PERIPH_nEN /* PG4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN4) -#define GPIO_VDD_5V_PERIPH_nOC /* PE15 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTE|GPIO_PIN15) -#define GPIO_VDD_5V_HIPOWER_nEN /* PG10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN10) -#define GPIO_VDD_5V_HIPOWER_nOC /* PF13 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTF|GPIO_PIN13) -#define GPIO_VDD_3V3_SENSORS4_EN /* PG8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN8) -#define GPIO_VDD_3V3_SPEKTRUM_POWER_EN /* PH2 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN2) -#define GPIO_VDD_3V3_SD_CARD_EN /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) - -/* Spare GPIO */ - -#define GPIO_PG6 /* PG6 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN6) -#define GPIO_PD15 /* PD15 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN15) - -/* ETHERNET GPIO */ - -#define GPIO_ETH_POWER_EN /* PG15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN15) - -/* NFC GPIO */ - -#define GPIO_NFC_GPIO /* PC0 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTC|GPIO_PIN0) - - -/* Define True logic Power Control in arch agnostic form */ - -#define VDD_5V_PERIPH_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_5V_PERIPH_nEN, !(on_true)) -#define VDD_5V_HIPOWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_5V_HIPOWER_nEN, !(on_true)) -#define VDD_3V3_SENSORS4_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SENSORS4_EN, (on_true)) -#define VDD_3V3_SPEKTRUM_POWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SPEKTRUM_POWER_EN, (on_true)) -#define READ_VDD_3V3_SPEKTRUM_POWER_EN() px4_arch_gpioread(GPIO_VDD_3V3_SPEKTRUM_POWER_EN) -#define VDD_3V3_SD_CARD_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SD_CARD_EN, (on_true)) -#define VDD_3V3_ETH_POWER_EN(on_true) px4_arch_gpiowrite(GPIO_ETH_POWER_EN, (on_true)) - - -/* Tone alarm output */ - -#define TONE_ALARM_TIMER 14 /* Timer 14 */ -#define TONE_ALARM_CHANNEL 1 /* PF9 GPIO_TIM14_CH1OUT_2 */ - -#define GPIO_BUZZER_1 /* PF9 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN9) - -#define GPIO_TONE_ALARM_IDLE GPIO_BUZZER_1 -#define GPIO_TONE_ALARM GPIO_TIM14_CH1OUT_2 - -/* USB OTG FS - * - * PA9 OTG_FS_VBUS VBUS sensing - */ -#define GPIO_OTGFS_VBUS /* PA9 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN9) - -/* High-resolution timer */ -#define HRT_TIMER 8 /* use timer8 for the HRT */ -#define HRT_TIMER_CHANNEL 3 /* use capture/compare channel 3 */ - -#define HRT_PPM_CHANNEL /* T8C1 */ 1 /* use capture/compare channel 1 */ -#define GPIO_PPM_IN /* PI5 T8C1 */ GPIO_TIM8_CH1IN_2 - -/* RC Serial port */ - -#define RC_SERIAL_PORT "/dev/ttyS5" -#define RC_SERIAL_SINGLEWIRE - -/* Input Capture Channels. */ -#define INPUT_CAP1_TIMER 1 -#define INPUT_CAP1_CHANNEL /* T1C2 */ 2 -#define GPIO_INPUT_CAP1 /* PE11 */ GPIO_TIM1_CH2IN - -/* PWM input driver. Use FMU AUX5 pins attached to timer4 channel 2 */ -#define PWMIN_TIMER 4 -#define PWMIN_TIMER_CHANNEL /* T4C2 */ 2 -#define GPIO_PWM_IN /* PD13 */ GPIO_TIM4_CH2IN_2 - -/* Safety Switch is HW version dependent on having an PX4IO - * So we init to a benign state with the _INIT definition - * and provide the the non _INIT one for the driver to make a run time - * decision to use it. - */ -#define GPIO_nSAFETY_SWITCH_LED_OUT_INIT /* PD10 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN10) -#define GPIO_nSAFETY_SWITCH_LED_OUT /* PD10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN10) - -/* Enable the FMU to control it if there is no px4io fixme:This should be BOARD_SAFETY_LED(__ontrue) */ -#define GPIO_LED_SAFETY GPIO_nSAFETY_SWITCH_LED_OUT - -#define GPIO_SAFETY_SWITCH_IN /* PF5 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN5) -/* Enable the FMU to use the switch it if there is no px4io fixme:This should be BOARD_SAFTY_BUTTON() */ -#define GPIO_BTN_SAFETY GPIO_SAFETY_SWITCH_IN /* Enable the FMU to control it if there is no px4io */ - -/* Power switch controls ******************************************************/ - -#define SPEKTRUM_POWER(_on_true) VDD_3V3_SPEKTRUM_POWER_EN(_on_true) - -/* - * FMUv6X has a separate RC_IN - * - * GPIO PPM_IN on PI5 T8CH1 - * SPEKTRUM_RX (it's TX or RX in Bind) on UART6 PC7 - * Inversion is possible in the UART and can drive GPIO PPM_IN as an output - */ - -#define GPIO_PPM_IN_AS_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTI|GPIO_PIN5) -#define SPEKTRUM_RX_AS_GPIO_OUTPUT() px4_arch_configgpio(GPIO_PPM_IN_AS_OUT) -#define SPEKTRUM_RX_AS_UART() /* Can be left as uart */ -#define SPEKTRUM_OUT(_one_true) px4_arch_gpiowrite(GPIO_PPM_IN_AS_OUT, (_one_true)) - -#define SDIO_SLOTNO 0 /* Only one slot */ -#define SDIO_MINOR 0 - -/* SD card bringup does not work if performed on the IDLE thread because it - * will cause waiting. Use either: - * - * CONFIG_BOARDCTL=y, OR - * CONFIG_BOARD_INITIALIZE=y && CONFIG_BOARD_INITTHREAD=y - */ - -#if defined(CONFIG_BOARD_INITIALIZE) && !defined(CONFIG_BOARDCTL) && \ - !defined(CONFIG_BOARD_INITTHREAD) -# warning SDIO initialization cannot be perfomed on the IDLE thread -#endif - -/* By Providing BOARD_ADC_USB_CONNECTED (using the px4_arch abstraction) - * this board support the ADC system_power interface, and therefore - * provides the true logic GPIO BOARD_ADC_xxxx macros. - */ -#define BOARD_ADC_USB_CONNECTED (px4_arch_gpioread(GPIO_OTGFS_VBUS)) -#define BOARD_ADC_USB_VALID (!px4_arch_gpioread(GPIO_nVDD_USB_VALID)) - -/* FMUv6X never powers off the Servo rail */ - -#define BOARD_ADC_SERVO_VALID (1) - -#if !defined(BOARD_HAS_LTC44XX_VALIDS) || BOARD_HAS_LTC44XX_VALIDS == 0 -# define BOARD_ADC_BRICK1_VALID (1) -# define BOARD_ADC_BRICK2_VALID (0) -#elif BOARD_HAS_LTC44XX_VALIDS == 1 -# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -# define BOARD_ADC_BRICK2_VALID (0) -#elif BOARD_HAS_LTC44XX_VALIDS == 2 -# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) -#elif BOARD_HAS_LTC44XX_VALIDS == 3 -# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) -# define BOARD_ADC_BRICK3_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK3_VALID)) -#elif BOARD_HAS_LTC44XX_VALIDS == 4 -# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) -# define BOARD_ADC_BRICK3_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK3_VALID)) -# define BOARD_ADC_BRICK4_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK4_VALID)) -#else -# error Unsupported BOARD_HAS_LTC44XX_VALIDS value -#endif - -#define BOARD_ADC_PERIPH_5V_OC (!px4_arch_gpioread(GPIO_VDD_5V_PERIPH_nOC)) -#define BOARD_ADC_HIPOWER_5V_OC (!px4_arch_gpioread(GPIO_VDD_5V_HIPOWER_nOC)) - - -/* This board provides a DMA pool and APIs */ -#define BOARD_DMA_ALLOC_POOL_SIZE 5120 - -/* This board provides the board_on_reset interface */ - -#define BOARD_HAS_ON_RESET 1 - -#if defined(TRACE_PINS) -#define GPIO_TRACE \ - GPIO_TRACECLK1, \ - GPIO_TRACED0, \ - GPIO_TRACED1, \ - GPIO_TRACED2, \ - GPIO_TRACED3 -#else -#define GPIO_TRACE (GPIO_OUTPUT|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN2) -#endif - -#define PX4_GPIO_INIT_LIST { \ - GPIO_TRACE, \ - PX4_ADC_GPIO, \ - GPIO_HW_VER_REV_DRIVE, \ - GPIO_CAN1_TX, \ - GPIO_CAN1_RX, \ - GPIO_CAN2_TX, \ - GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ - GPIO_nPOWER_IN_A, \ - GPIO_nPOWER_IN_B, \ - GPIO_nPOWER_IN_C, \ - GPIO_VDD_5V_PERIPH_nEN, \ - GPIO_VDD_5V_PERIPH_nOC, \ - GPIO_VDD_5V_HIPOWER_nEN, \ - GPIO_VDD_5V_HIPOWER_nOC, \ - GPIO_VDD_3V3_SENSORS4_EN, \ - GPIO_VDD_3V3_SPEKTRUM_POWER_EN, \ - GPIO_VDD_3V3_SD_CARD_EN, \ - GPIO_PD15, \ - GPIO_SYNC, \ - SPI6_nRESET_EXTERNAL1, \ - GPIO_ETH_POWER_EN, \ - GPIO_NFC_GPIO, \ - GPIO_TONE_ALARM_IDLE, \ - GPIO_nSAFETY_SWITCH_LED_OUT_INIT, \ - GPIO_SAFETY_SWITCH_IN, \ - GPIO_PG6, \ - GPIO_nARMED_INIT \ - } - -#define BOARD_ENABLE_CONSOLE_BUFFER - -#define PX4_I2C_BUS_MTD 4,5 - - -#define BOARD_NUM_IO_TIMERS 5 - -__BEGIN_DECLS - -/**************************************************************************************************** - * Public Types - ****************************************************************************************************/ - -/**************************************************************************************************** - * Public data - ****************************************************************************************************/ - -#ifndef __ASSEMBLY__ - -/**************************************************************************************************** - * Public Functions - ****************************************************************************************************/ - -/**************************************************************************** - * Name: stm32_sdio_initialize - * - * Description: - * Initialize SDIO-based MMC/SD card support - * - ****************************************************************************/ - -int stm32_sdio_initialize(void); - -/**************************************************************************************************** - * Name: stm32_spiinitialize - * - * Description: - * Called to configure SPI chip select GPIO pins for the PX4FMU board. - * - ****************************************************************************************************/ - -extern void stm32_spiinitialize(void); - -extern void stm32_usbinitialize(void); - -extern void board_peripheral_reset(int ms); - -#include - -#endif /* __ASSEMBLY__ */ - -__END_DECLS diff --git a/boards/px4/fmu-v6x/src/can.c b/boards/px4/fmu-v6x/src/can.c deleted file mode 100644 index 1f4e1f2..0000000 --- a/boards/px4/fmu-v6x/src/can.c +++ /dev/null @@ -1,142 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2012 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file px4fmu_can.c - * - * Board-specific CAN functions. - */ - -#if !defined(CONFIG_CAN) - -#include - -#include "board_config.h" - - -__EXPORT -uint16_t board_get_can_interfaces(void) -{ - uint16_t enabled_interfaces = 0x3; - - if (!PX4_MFT_HW_SUPPORTED(PX4_MFT_CAN2)) { - enabled_interfaces &= ~(1 << 1); - } - - return enabled_interfaces; -} - -#else - -#include -#include - -#include -#include - -#include "chip.h" -#include "arm_internal.h" - -#include "chip.h" -#include "stm32_can.h" -#include "board_config.h" - -/************************************************************************************ - * Pre-processor Definitions - ************************************************************************************/ -/* Configuration ********************************************************************/ - -#if defined(CONFIG_STM32_CAN1) && defined(CONFIG_STM32_CAN2) -# warning "Both CAN1 and CAN2 are enabled. Assuming only CAN1." -# undef CONFIG_STM32_CAN2 -#endif - -#ifdef CONFIG_STM32_CAN1 -# define CAN_PORT 1 -#else -# define CAN_PORT 2 -#endif - -/************************************************************************************ - * Private Functions - ************************************************************************************/ - -/************************************************************************************ - * Public Functions - ************************************************************************************/ -int can_devinit(void); - -/************************************************************************************ - * Name: can_devinit - * - * Description: - * All STM32 architectures must provide the following interface to work with - * examples/can. - * - ************************************************************************************/ - -int can_devinit(void) -{ - static bool initialized = false; - struct can_dev_s *can; - int ret; - - /* Check if we have already initialized */ - - if (!initialized) { - /* Call stm32_caninitialize() to get an instance of the CAN interface */ - - can = stm32_caninitialize(CAN_PORT); - - if (can == NULL) { - canerr("ERROR: Failed to get CAN interface\n"); - return -ENODEV; - } - - /* Register the CAN driver at "/dev/can0" */ - - ret = can_register("/dev/can0", can); - - if (ret < 0) { - canerr("ERROR: can_register failed: %d\n", ret); - return ret; - } - - /* Now we are initialized */ - - initialized = true; - } - - return OK; -} -#endif /* CONFIG_CAN */ diff --git a/boards/px4/fmu-v6x/src/hw_config.h b/boards/px4/fmu-v6x/src/hw_config.h deleted file mode 100644 index 4ad1049..0000000 --- a/boards/px4/fmu-v6x/src/hw_config.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * hw_config.h - * - * Created on: May 17, 2015 - * Author: david_s5 - */ - -#ifndef HW_CONFIG_H_ -#define HW_CONFIG_H_ - -/**************************************************************************** - * 10-8--2016: - * To simplify the ripple effect on the tools, we will be using - * /dev/serial/by-id/PX4 to locate PX4 devices. Therefore - * moving forward all Bootloaders must contain the prefix "PX4 BL " - * in the USBDEVICESTRING - * This Change will be made in an upcoming BL release - ****************************************************************************/ -/* - * Define usage to configure a bootloader - * - * - * Constant example Usage - * APP_LOAD_ADDRESS 0x08004000 - The address in Linker Script, where the app fw is org-ed - * BOOTLOADER_DELAY 5000 - Ms to wait while under USB pwr or bootloader request - * BOARD_FMUV2 - * INTERFACE_USB 1 - (Optional) Scan and use the USB interface for bootloading - * INTERFACE_USART 1 - (Optional) Scan and use the Serial interface for bootloading - * USBDEVICESTRING "PX4 BL FMU v2.x" - USB id string - * USBPRODUCTID 0x0011 - PID Should match defconfig - * BOOT_DELAY_ADDRESS 0x000001a0 - (Optional) From the linker script from Linker Script to get a custom - * delay provided by an APP FW - * BOARD_TYPE 9 - Must match .prototype boad_id - * _FLASH_KBYTES (*(uint16_t *)0x1fff7a22) - Run time flash size detection - * BOARD_FLASH_SECTORS ((_FLASH_KBYTES == 0x400) ? 11 : 23) - Run time determine the physical last sector - * BOARD_FLASH_SECTORS 11 - Hard coded zero based last sector - * BOARD_FLASH_SIZE (_FLASH_KBYTES*1024)- Total Flash size of device, determined at run time. - * (1024 * 1024) - Hard coded Total Flash of device - The bootloader and app reserved will be deducted - * programmatically - * - * BOARD_FIRST_FLASH_SECTOR_TO_ERASE 2 - Optional sectors index in the flash_sectors table (F4 only), to begin erasing. - * This is to allow sectors to be reserved for app fw usage. That will NOT be erased - * during a FW upgrade. - * The default is 0, and selects the first sector to be erased, as the 0th entry in the - * flash_sectors table. Which is the second physical sector of FLASH in the device. - * The first physical sector of FLASH is used by the bootloader, and is not defined - * in the table. - * - * APP_RESERVATION_SIZE (BOARD_FIRST_FLASH_SECTOR_TO_ERASE * 16 * 1024) - Number of bytes reserved by the APP FW. This number plus - * BOOTLOADER_RESERVATION_SIZE will be deducted from - * BOARD_FLASH_SIZE to determine the size of the App FW - * and hence the address space of FLASH to erase and program. - * USBMFGSTRING "PX4 AP" - Optional USB MFG string (default is '3D Robotics' if not defined.) - * SERIAL_BREAK_DETECT_DISABLED - Optional prevent break selection on Serial port from entering or staying in BL - * - * * Other defines are somewhat self explanatory. - */ - -/* Boot device selection list*/ -#define USB0_DEV 0x01 -#define SERIAL0_DEV 0x02 -#define SERIAL1_DEV 0x04 - -#define APP_LOAD_ADDRESS 0x08020000 -#define BOOTLOADER_DELAY 5000 -#define INTERFACE_USB 1 -#define INTERFACE_USB_CONFIG "/dev/ttyACM0" -#define BOARD_VBUS MK_GPIO_INPUT(GPIO_OTGFS_VBUS) - -//#define USE_VBUS_PULL_DOWN -#define INTERFACE_USART 1 -#define INTERFACE_USART_CONFIG "/dev/ttyS0,1500000" -#define BOOT_DELAY_ADDRESS 0x000001a0 -#define BOARD_TYPE 53 -#define _FLASH_KBYTES (*(uint32_t *)0x1FF1E880) -#define BOARD_FLASH_SECTORS (15) -#define BOARD_FLASH_SIZE (_FLASH_KBYTES * 1024) - -#define OSC_FREQ 16 - -#define BOARD_PIN_LED_ACTIVITY GPIO_nLED_BLUE // BLUE -#define BOARD_PIN_LED_BOOTLOADER GPIO_nLED_GREEN // GREEN -#define BOARD_LED_ON 0 -#define BOARD_LED_OFF 1 - -#define SERIAL_BREAK_DETECT_DISABLED 1 - -/* - * Uncommenting this allows to force the bootloader through - * a PWM output pin. As this can accidentally initialize - * an ESC prematurely, it is not recommended. This feature - * has not been used and hence defaults now to off. - * - * # define BOARD_FORCE_BL_PIN_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN14) - * # define BOARD_FORCE_BL_PIN_IN (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN11) - * - * # define BOARD_POWER_PIN_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN4) - * # define BOARD_POWER_ON 1 - * # define BOARD_POWER_OFF 0 - * # undef BOARD_POWER_PIN_RELEASE // Leave pin enabling Power - un comment to release (disable power) - * -*/ - -#if !defined(ARCH_SN_MAX_LENGTH) -# define ARCH_SN_MAX_LENGTH 12 -#endif - -#if !defined(APP_RESERVATION_SIZE) -# define APP_RESERVATION_SIZE 0 -#endif - -#if !defined(BOARD_FIRST_FLASH_SECTOR_TO_ERASE) -# define BOARD_FIRST_FLASH_SECTOR_TO_ERASE 1 -#endif - -#if !defined(USB_DATA_ALIGN) -# define USB_DATA_ALIGN -#endif - -#ifndef BOOT_DEVICES_SELECTION -# define BOOT_DEVICES_SELECTION USB0_DEV|SERIAL0_DEV|SERIAL1_DEV -#endif - -#ifndef BOOT_DEVICES_FILTER_ONUSB -# define BOOT_DEVICES_FILTER_ONUSB USB0_DEV|SERIAL0_DEV|SERIAL1_DEV -#endif - -#endif /* HW_CONFIG_H_ */ diff --git a/boards/px4/fmu-v6x/src/i2c.cpp b/boards/px4/fmu-v6x/src/i2c.cpp deleted file mode 100644 index 8a55707..0000000 --- a/boards/px4/fmu-v6x/src/i2c.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include - -constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { - initI2CBusExternal(1), - initI2CBusExternal(2), - initI2CBusExternal(3), - initI2CBusInternal(4), -}; diff --git a/boards/px4/fmu-v6x/src/init.c b/boards/px4/fmu-v6x/src/init.c deleted file mode 100644 index cd6714a..0000000 --- a/boards/px4/fmu-v6x/src/init.c +++ /dev/null @@ -1,286 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2012-2022 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file init.c - * - * PX4FMU-specific early startup code. This file implements the - * board_app_initialize() function that is called early by nsh during startup. - * - * Code here is run before the rcS script is invoked; it should start required - * subsystems and perform board-specific initialization. - */ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include "board_config.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "arm_internal.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/**************************************************************************** - * Pre-Processor Definitions - ****************************************************************************/ - -/* Configuration ************************************************************/ - -/* - * Ideally we'd be able to get these from arm_internal.h, - * but since we want to be able to disable the NuttX use - * of leds for system indication at will and there is no - * separate switch, we need to build independent of the - * CONFIG_ARCH_LEDS configuration switch. - */ -__BEGIN_DECLS -extern void led_init(void); -extern void led_on(int led); -extern void led_off(int led); -__END_DECLS - - -/************************************************************************************ - * Name: board_peripheral_reset - * - * Description: - * - ************************************************************************************/ -__EXPORT void board_peripheral_reset(int ms) -{ - /* set the peripheral rails off */ - - VDD_5V_PERIPH_EN(false); - board_control_spi_sensors_power(false, 0xffff); - VDD_3V3_SENSORS4_EN(false); - - bool last = READ_VDD_3V3_SPEKTRUM_POWER_EN(); - /* Keep Spektum on to discharge rail*/ - VDD_3V3_SPEKTRUM_POWER_EN(false); - - /* wait for the peripheral rail to reach GND */ - usleep(ms * 1000); - syslog(LOG_DEBUG, "reset done, %d ms\n", ms); - - /* re-enable power */ - - /* switch the peripheral rail back on */ - VDD_3V3_SPEKTRUM_POWER_EN(last); - board_control_spi_sensors_power(true, 0xffff); - VDD_3V3_SENSORS4_EN(true); - VDD_5V_PERIPH_EN(true); - -} - -/************************************************************************************ - * Name: board_on_reset - * - * Description: - * Optionally provided function called on entry to board_system_reset - * It should perform any house keeping prior to the rest. - * - * status - 1 if resetting to boot loader - * 0 if just resetting - * - ************************************************************************************/ -__EXPORT void board_on_reset(int status) -{ - for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { - px4_arch_configgpio(io_timer_channel_get_gpio_output(i)); - } - - if (status >= 0) { - up_mdelay(6); - } -} - -/************************************************************************************ - * Name: stm32_boardinitialize - * - * Description: - * All STM32 architectures must provide the following entry point. This entry point - * is called early in the initialization -- after all memory has been configured - * and mapped but before any devices have been initialized. - * - ************************************************************************************/ - -__EXPORT void -stm32_boardinitialize(void) -{ - board_on_reset(-1); /* Reset PWM first thing */ - - /* configure LEDs */ - - board_autoled_initialize(); - - /* configure pins */ - - const uint32_t gpio[] = PX4_GPIO_INIT_LIST; - px4_gpio_init(gpio, arraySize(gpio)); - - /* configure USB interfaces */ - - stm32_usbinitialize(); - - VDD_3V3_ETH_POWER_EN(true); - -} - -/**************************************************************************** - * Name: board_app_initialize - * - * Description: - * Perform application specific initialization. This function is never - * called directly from application code, but only indirectly via the - * (non-standard) boardctl() interface using the command BOARDIOC_INIT. - * - * Input Parameters: - * arg - The boardctl() argument is passed to the board_app_initialize() - * implementation without modification. The argument has no - * meaning to NuttX; the meaning of the argument is a contract - * between the board-specific initalization logic and the the - * matching application logic. The value cold be such things as a - * mode enumeration value, a set of DIP switch switch settings, a - * pointer to configuration data read from a file or serial FLASH, - * or whatever you would like to do with it. Every implementation - * should accept zero/NULL as a default configuration. - * - * Returned Value: - * Zero (OK) is returned on success; a negated errno value is returned on - * any failure to indicate the nature of the failure. - * - ****************************************************************************/ - -__EXPORT int board_app_initialize(uintptr_t arg) -{ -#if !defined(BOOTLOADER) - - /* Power on Interfaces */ - VDD_3V3_SD_CARD_EN(true); - VDD_5V_PERIPH_EN(true); - VDD_5V_HIPOWER_EN(true); - VDD_3V3_SENSORS4_EN(true); - VDD_3V3_SPEKTRUM_POWER_EN(true); - - /* Need hrt running before using the ADC */ - - px4_platform_init(); - - // Use the default HW_VER_REV(0x0,0x0) for Ramtron - - stm32_spiinitialize(); - - /* Configure the HW based on the manifest */ - - px4_platform_configure(); - - if (OK == board_determine_hw_info()) { - syslog(LOG_INFO, "[boot] Rev 0x%1x : Ver 0x%1x %s\n", board_get_hw_revision(), board_get_hw_version(), - board_get_hw_type_name()); - - } else { - syslog(LOG_ERR, "[boot] Failed to read HW revision and version\n"); - } - - /* Configure the Actual SPI interfaces (after we determined the HW version) */ - - stm32_spiinitialize(); - - board_spi_reset(10, 0xffff); - - /* Configure the DMA allocator */ - - if (board_dma_alloc_init() < 0) { - syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); - } - -# if defined(SERIAL_HAVE_RXDMA) - // set up the serial DMA polling at 1ms intervals for received bytes that have not triggered a DMA event. - static struct hrt_call serial_dma_call; - hrt_call_every(&serial_dma_call, 1000, 1000, (hrt_callout)stm32_serial_dma_poll, NULL); -# endif - - /* initial LED state */ - drv_led_start(); - led_off(LED_RED); - led_on(LED_GREEN); // Indicate Power. - led_off(LED_BLUE); - - if (board_hardfault_init(2, true) != 0) { - led_on(LED_RED); - } - - // Ensure Power is off for > 10 mS - usleep(15 * 1000); - VDD_3V3_SD_CARD_EN(true); - usleep(500 * 1000); - -# ifdef CONFIG_MMCSD - int ret = stm32_sdio_initialize(); - - if (ret != OK) { - led_on(LED_RED); - return ret; - } - -# endif /* CONFIG_MMCSD */ - -#endif /* !defined(BOOTLOADER) */ - - return OK; -} diff --git a/boards/px4/fmu-v6x/src/led.c b/boards/px4/fmu-v6x/src/led.c deleted file mode 100644 index bff4b09..0000000 --- a/boards/px4/fmu-v6x/src/led.c +++ /dev/null @@ -1,235 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2013 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file px4fmu2_led.c - * - * PX4FMU LED backend. - */ - -#include - -#include - -#include "chip.h" -#include "stm32_gpio.h" -#include "board_config.h" - -#include -#include - -/* - * Ideally we'd be able to get these from arm_internal.h, - * but since we want to be able to disable the NuttX use - * of leds for system indication at will and there is no - * separate switch, we need to build independent of the - * CONFIG_ARCH_LEDS configuration switch. - */ -__BEGIN_DECLS -extern void led_init(void); -extern void led_on(int led); -extern void led_off(int led); -extern void led_toggle(int led); -__END_DECLS - -#ifdef CONFIG_ARCH_LEDS -static bool nuttx_owns_leds = true; -// B R S G -// 0 1 2 3 -static const uint8_t xlatpx4[] = {1, 2, 4, 0}; -# define xlat(p) xlatpx4[(p)] -static uint32_t g_ledmap[] = { - GPIO_nLED_GREEN, // Indexed by BOARD_LED_GREEN - GPIO_nLED_BLUE, // Indexed by BOARD_LED_BLUE - GPIO_nLED_RED, // Indexed by BOARD_LED_RED - GPIO_nSAFETY_SWITCH_LED_OUT, // Indexed by LED_SAFETY by xlatpx4 -}; - -#else - -# define xlat(p) (p) -static uint32_t g_ledmap[] = { - GPIO_nLED_BLUE, // Indexed by LED_BLUE - GPIO_nLED_RED, // Indexed by LED_RED, LED_AMBER - 0, // Indexed by LED_SAFETY (defaulted to an input) - GPIO_nLED_GREEN, // Indexed by LED_GREEN -}; - -#endif - -__EXPORT void led_init(void) -{ - for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) { - if (g_ledmap[l] != 0) { - stm32_configgpio(g_ledmap[l]); - } - } -} - -static void phy_set_led(int led, bool state) -{ - /* Drive Low to switch on */ - - if (g_ledmap[led] != 0) { - stm32_gpiowrite(g_ledmap[led], !state); - } -} - -static bool phy_get_led(int led) -{ - /* If Low it is on */ - if (g_ledmap[led] != 0) { - return !stm32_gpioread(g_ledmap[led]); - } - - return false; -} - -__EXPORT void led_on(int led) -{ - phy_set_led(xlat(led), true); -} - -__EXPORT void led_off(int led) -{ - phy_set_led(xlat(led), false); -} - -__EXPORT void led_toggle(int led) -{ - phy_set_led(xlat(led), !phy_get_led(xlat(led))); -} - -#ifdef CONFIG_ARCH_LEDS -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: board_autoled_initialize - ****************************************************************************/ - -void board_autoled_initialize(void) -{ - led_init(); -} - -/**************************************************************************** - * Name: board_autoled_on - ****************************************************************************/ - -void board_autoled_on(int led) -{ - if (!nuttx_owns_leds) { - return; - } - - switch (led) { - default: - break; - - case LED_HEAPALLOCATE: - phy_set_led(BOARD_LED_BLUE, true); - break; - - case LED_IRQSENABLED: - phy_set_led(BOARD_LED_BLUE, false); - phy_set_led(BOARD_LED_GREEN, true); - break; - - case LED_STACKCREATED: - phy_set_led(BOARD_LED_GREEN, true); - phy_set_led(BOARD_LED_BLUE, true); - break; - - case LED_INIRQ: - phy_set_led(BOARD_LED_BLUE, true); - break; - - case LED_SIGNAL: - phy_set_led(BOARD_LED_GREEN, true); - break; - - case LED_ASSERTION: - phy_set_led(BOARD_LED_RED, true); - phy_set_led(BOARD_LED_BLUE, true); - break; - - case LED_PANIC: - phy_set_led(BOARD_LED_RED, true); - break; - - case LED_IDLE : /* IDLE */ - phy_set_led(BOARD_LED_RED, true); - break; - } -} - -/**************************************************************************** - * Name: board_autoled_off - ****************************************************************************/ - -void board_autoled_off(int led) -{ - if (!nuttx_owns_leds) { - return; - } - - switch (led) { - default: - break; - - case LED_SIGNAL: - phy_set_led(BOARD_LED_GREEN, false); - break; - - case LED_INIRQ: - phy_set_led(BOARD_LED_BLUE, false); - break; - - case LED_ASSERTION: - phy_set_led(BOARD_LED_RED, false); - phy_set_led(BOARD_LED_BLUE, false); - break; - - case LED_PANIC: - phy_set_led(BOARD_LED_RED, false); - break; - - case LED_IDLE : /* IDLE */ - phy_set_led(BOARD_LED_RED, false); - break; - } -} - -#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/px4/fmu-v6x/src/manifest.c b/boards/px4/fmu-v6x/src/manifest.c deleted file mode 100644 index 313d49f..0000000 --- a/boards/px4/fmu-v6x/src/manifest.c +++ /dev/null @@ -1,205 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2018-2021 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file manifest.c - * - * This module supplies the interface to the manifest of hardware that is - * optional and dependent on the HW REV and HW VER IDs - * - * The manifest allows the system to know whether a hardware option - * say for example the PX4IO is an no-pop option vs it is broken. - * - */ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include -#include - -#include -#include -#include - -#include "systemlib/px4_macros.h" - -/**************************************************************************** - * Pre-Processor Definitions - ****************************************************************************/ - -typedef struct { - uint32_t hw_ver_rev; /* the version and revision */ - const px4_hw_mft_item_t *mft; /* The first entry */ - uint32_t entries; /* the lenght of the list */ -} px4_hw_mft_list_entry_t; - -typedef px4_hw_mft_list_entry_t *px4_hw_mft_list_entry; -#define px4_hw_mft_list_uninitialized (px4_hw_mft_list_entry) -1 - -static const px4_hw_mft_item_t device_unsupported = {0, 0, 0}; - -// List of components on a specific board configuration -// The index of those components is given by the enum (px4_hw_mft_item_id_t) -// declared in board_common.h -static const px4_hw_mft_item_t hw_mft_list_v0600[] = { - { - // PX4_MFT_PX4IO - .present = 1, - .mandatory = 1, - .connection = px4_hw_con_onboard, - }, - { - // PX4_MFT_USB - .present = 1, - .mandatory = 1, - .connection = px4_hw_con_onboard, - }, - { - // PX4_MFT_CAN2 - .present = 1, - .mandatory = 1, - .connection = px4_hw_con_onboard, - }, -}; - -static const px4_hw_mft_item_t hw_mft_list_v0610[] = { - { - // PX4_MFT_PX4IO - .present = 0, - .mandatory = 0, - .connection = px4_hw_con_unknown, - }, - { - // PX4_MFT_USB - .present = 1, - .mandatory = 1, - .connection = px4_hw_con_onboard, - }, - { - // PX4_MFT_CAN2 - .present = 1, - .mandatory = 1, - .connection = px4_hw_con_onboard, - }, -}; - -static const px4_hw_mft_item_t hw_mft_list_v0650[] = { - { - // PX4_MFT_PX4IO - .present = 1, - .mandatory = 1, - .connection = px4_hw_con_unknown, - }, - { - // PX4_MFT_USB - .present = 1, - .mandatory = 1, - .connection = px4_hw_con_onboard, - }, - { - // PX4_MFT_CAN2 - .present = 0, - .mandatory = 0, - .connection = px4_hw_con_unknown, - }, -}; - - -static px4_hw_mft_list_entry_t mft_lists[] = { -// ver_rev - {V6X00, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, - {V6X01, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // BMP388 moved to I2C2 - {V6X03, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // BMP388 moved to I2C2, Sensor Set 3 - {V6X40, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // HB CM4 base - {V6X41, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // BMP388 moved to I2C2 HB CM4 base - {V6X43, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // BMP388 moved to I2C2, HB CM4 base Sensor Set 3 - {V6X44, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // BMP388 moved to I2C2, HB CM4 base Sensor Set 4 - {V6X50, hw_mft_list_v0650, arraySize(hw_mft_list_v0650)}, // HB Mini - {V6X51, hw_mft_list_v0650, arraySize(hw_mft_list_v0650)}, // BMP388 moved to I2C2 HB Mini - {V6X53, hw_mft_list_v0650, arraySize(hw_mft_list_v0650)}, // BMP388 moved to I2C2, HB Mini Sensor Set 3 - {V6X54, hw_mft_list_v0650, arraySize(hw_mft_list_v0650)}, // BMP388 moved to I2C2, HB Mini Sensor Set 4 - {V6X10, hw_mft_list_v0610, arraySize(hw_mft_list_v0610)}, // No PX4IO - {V6X13, hw_mft_list_v0610, arraySize(hw_mft_list_v0610)}, // No PX4IO BMP388 moved to I2C2, Sensor Set 3 - {V6X04, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // BMP388 moved to I2C2, Sensor Set 4 - {V6X14, hw_mft_list_v0610, arraySize(hw_mft_list_v0610)}, // No PX4IO BMP388 moved to I2C2, Sensor Set 4 - {V6X21, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, - {V6X0910, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // FMUV6X, rev from EEPROM Auterion Skynode ver9 - {V6X1010, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // FMUV6X, rev from EEPROM Auterion Skynode ver10 -}; - -/************************************************************************************ - * Name: board_query_manifest - * - * Description: - * Optional returns manifest item. - * - * Input Parameters: - * manifest_id - the ID for the manifest item to retrieve - * - * Returned Value: - * 0 - item is not in manifest => assume legacy operations - * pointer to a manifest item - * - ************************************************************************************/ - -__EXPORT px4_hw_mft_item board_query_manifest(px4_hw_mft_item_id_t id) -{ - static px4_hw_mft_list_entry boards_manifest = px4_hw_mft_list_uninitialized; - - if (boards_manifest == px4_hw_mft_list_uninitialized) { - uint32_t ver_rev = board_get_hw_version() << 16; - ver_rev |= board_get_hw_revision(); - - for (unsigned i = 0; i < arraySize(mft_lists); i++) { - if (mft_lists[i].hw_ver_rev == ver_rev) { - boards_manifest = &mft_lists[i]; - break; - } - } - - if (boards_manifest == px4_hw_mft_list_uninitialized) { - syslog(LOG_ERR, "[boot] Board %08" PRIx32 " is not supported!\n", ver_rev); - } - } - - px4_hw_mft_item rv = &device_unsupported; - - if (boards_manifest != px4_hw_mft_list_uninitialized && - id < boards_manifest->entries) { - rv = &boards_manifest->mft[id]; - } - - return rv; -} diff --git a/boards/px4/fmu-v6x/src/mtd.cpp b/boards/px4/fmu-v6x/src/mtd.cpp deleted file mode 100644 index fc1e97d..0000000 --- a/boards/px4/fmu-v6x/src/mtd.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include -#include -// KiB BS nB -static const px4_mft_device_t spi5 = { // FM25V02A on FMUM 32K 512 X 64 - .bus_type = px4_mft_device_t::SPI, - .devid = SPIDEV_FLASH(0) -}; -static const px4_mft_device_t i2c3 = { // 24LC64T on Base 8K 32 X 256 - .bus_type = px4_mft_device_t::I2C, - .devid = PX4_MK_I2C_DEVID(3, 0x51) -}; -static const px4_mft_device_t i2c4 = { // 24LC64T on IMU 8K 32 X 256 - .bus_type = px4_mft_device_t::I2C, - .devid = PX4_MK_I2C_DEVID(4, 0x50) -}; - - -static const px4_mtd_entry_t fmum_fram = { - .device = &spi5, - .npart = 2, - .partd = { - { - .type = MTD_PARAMETERS, - .path = "/fs/mtd_params", - .nblocks = 32 - }, - { - .type = MTD_WAYPOINTS, - .path = "/fs/mtd_waypoints", - .nblocks = 32 - - } - }, -}; - -static const px4_mtd_entry_t base_eeprom = { - .device = &i2c3, - .npart = 2, - .partd = { - { - .type = MTD_MFT_VER, - .path = "/fs/mtd_mft_ver", - .nblocks = 248 - }, - { - .type = MTD_NET, - .path = "/fs/mtd_net", - .nblocks = 8 // 256 = 32 * 8 - - } - }, -}; - -static const px4_mtd_entry_t imu_eeprom = { - .device = &i2c4, - .npart = 3, - .partd = { - { - .type = MTD_CALDATA, - .path = "/fs/mtd_caldata", - .nblocks = 240 - }, - { - .type = MTD_MFT_REV, - .path = "/fs/mtd_mft_rev", - .nblocks = 8 - }, - { - .type = MTD_ID, - .path = "/fs/mtd_id", - .nblocks = 8 // 256 = 32 * 8 - } - }, -}; - -static const px4_mtd_manifest_t board_mtd_config = { - .nconfigs = 3, - .entries = { - &fmum_fram, - &base_eeprom, - &imu_eeprom - } -}; - -static const px4_mft_entry_s mtd_mft = { - .type = MTD, - .pmft = (void *) &board_mtd_config, -}; - -static const px4_mft_s mft = { - .nmft = 1, - .mfts = { - &mtd_mft - } -}; - -const px4_mft_s *board_get_manifest(void) -{ - return &mft; -} diff --git a/boards/px4/fmu-v6x/src/sdio.c b/boards/px4/fmu-v6x/src/sdio.c deleted file mode 100644 index 869d757..0000000 --- a/boards/px4/fmu-v6x/src/sdio.c +++ /dev/null @@ -1,177 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2014, 2016 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "chip.h" -#include "board_config.h" -#include "stm32_gpio.h" -#include "stm32_sdmmc.h" - -#ifdef CONFIG_MMCSD - - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/* Card detections requires card support and a card detection GPIO */ - -#define HAVE_NCD 1 -#if !defined(GPIO_SDMMC1_NCD) -# undef HAVE_NCD -#endif - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -static FAR struct sdio_dev_s *sdio_dev; -#ifdef HAVE_NCD -static bool g_sd_inserted = 0xff; /* Impossible value */ -#endif - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: stm32_ncd_interrupt - * - * Description: - * Card detect interrupt handler. - * - ****************************************************************************/ - -#ifdef HAVE_NCD -static int stm32_ncd_interrupt(int irq, FAR void *context) -{ - bool present; - - present = !stm32_gpioread(GPIO_SDMMC1_NCD); - - if (sdio_dev && present != g_sd_inserted) { - sdio_mediachange(sdio_dev, present); - g_sd_inserted = present; - } - - return OK; -} -#endif - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: stm32_sdio_initialize - * - * Description: - * Initialize SDIO-based MMC/SD card support - * - ****************************************************************************/ - -int stm32_sdio_initialize(void) -{ - int ret; - -#ifdef HAVE_NCD - /* Card detect */ - - bool cd_status; - - /* Configure the card detect GPIO */ - - stm32_configgpio(GPIO_SDMMC1_NCD); - - /* Register an interrupt handler for the card detect pin */ - - stm32_gpiosetevent(GPIO_SDMMC1_NCD, true, true, true, stm32_ncd_interrupt); -#endif - - /* Mount the SDIO-based MMC/SD block driver */ - /* First, get an instance of the SDIO interface */ - - finfo("Initializing SDIO slot %d\n", SDIO_SLOTNO); - - sdio_dev = sdio_initialize(SDIO_SLOTNO); - - if (!sdio_dev) { - syslog(LOG_ERR, "[boot] Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); - return -ENODEV; - } - - /* Now bind the SDIO interface to the MMC/SD driver */ - - finfo("Bind SDIO to the MMC/SD driver, minor=%d\n", SDIO_MINOR); - - ret = mmcsd_slotinitialize(SDIO_MINOR, sdio_dev); - - if (ret != OK) { - syslog(LOG_ERR, "[boot] Failed to bind SDIO to the MMC/SD driver: %d\n", ret); - return ret; - } - - finfo("Successfully bound SDIO to the MMC/SD driver\n"); - -#ifdef HAVE_NCD - /* Use SD card detect pin to check if a card is g_sd_inserted */ - - cd_status = !stm32_gpioread(GPIO_SDMMC1_NCD); - finfo("Card detect : %d\n", cd_status); - - sdio_mediachange(sdio_dev, cd_status); -#else - /* Assume that the SD card is inserted. What choice do we have? */ - - sdio_mediachange(sdio_dev, true); -#endif - - return OK; -} - -#endif /* CONFIG_MMCSD */ diff --git a/boards/px4/fmu-v6x/src/spi.cpp b/boards/px4/fmu-v6x/src/spi.cpp deleted file mode 100644 index d3bbdb9..0000000 --- a/boards/px4/fmu-v6x/src/spi.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2020, 2022 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include -#include -#include - -constexpr px4_spi_bus_all_hw_t px4_spi_buses_all_hw[BOARD_NUM_SPI_CFG_HW_VERSIONS] = { - initSPIHWVersion(V6X00, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20649, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin6}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - - initSPIHWVersion(V6X03, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42670P, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin6}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - - initSPIHWVersion(V6X21, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20649, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - - initSPIHWVersion(V6X43, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42670P, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin6}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - - initSPIHWVersion(V6X50, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20649, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin6}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - - initSPIHWVersion(V6X44, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42670P, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20649, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - - // never shipped - //initSPIHWVersion(V6X50, { - // initSPIBus(SPI::Bus::SPI1, { - // initSPIDevice(DRV_IMU_DEVTYPE_ICM20649, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - // }, {GPIO::PortI, GPIO::Pin11}), - // initSPIBus(SPI::Bus::SPI2, { - // initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - // }, {GPIO::PortF, GPIO::Pin4}), - // initSPIBus(SPI::Bus::SPI3, { - // initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - // initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin6}), - // }, {GPIO::PortE, GPIO::Pin7}), - // // initSPIBus(SPI::Bus::SPI4, { - // // // no devices - // // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // // }, {GPIO::PortG, GPIO::Pin8}), - // initSPIBus(SPI::Bus::SPI5, { - // initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - // }), - // initSPIBusExternal(SPI::Bus::SPI6, { - // initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - // initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - // }), - //}), - initSPIHWVersion(V6X04, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42670P, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20649, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - initSPIHWVersion(V6X53, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42670P, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin6}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - initSPIHWVersion(V6X54, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42670P, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20649, SPI::CS{GPIO::PortI, GPIO::Pin4}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - initSPIHWVersion(V6X0910, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20602, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), - initSPIHWVersion(V6X1010, { - initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20602, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), - }, {GPIO::PortI, GPIO::Pin11}), - initSPIBus(SPI::Bus::SPI2, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), - }, {GPIO::PortF, GPIO::Pin4}), - initSPIBus(SPI::Bus::SPI3, { - initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}), - }, {GPIO::PortE, GPIO::Pin7}), - // initSPIBus(SPI::Bus::SPI4, { - // // no devices - // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h - // }, {GPIO::PortG, GPIO::Pin8}), - initSPIBus(SPI::Bus::SPI5, { - initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) - }), - initSPIBusExternal(SPI::Bus::SPI6, { - initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), - initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), - }), - }), -}; - -static constexpr bool unused = validateSPIConfig(px4_spi_buses_all_hw); diff --git a/boards/px4/fmu-v6x/src/timer_config.cpp b/boards/px4/fmu-v6x/src/timer_config.cpp deleted file mode 100644 index 928f491..0000000 --- a/boards/px4/fmu-v6x/src/timer_config.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2012 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include - -/* Timer allocation - * - * TIM5_CH4 T FMU_CH1 - * TIM5_CH3 T FMU_CH2 - * TIM5_CH2 T FMU_CH3 - * TIM5_CH1 T FMU_CH4 - * - * TIM4_CH2 T FMU_CH5 - * TIM4_CH3 T FMU_CH6 - * - * TIM12_CH1 T FMU_CH7 - * TIM12_CH2 T FMU_CH8 - * - * TIM1_CH2 T FMU_CAP1 < Capture - * TIM1_CH3 T SPI2_DRDY2_ISM330_INT2 < Capture or GPIO INT - * TIM1_CH1 T SPIX_SYNC > Pulse or GPIO strobe - * - * TIM2_CH3 T HEATER > PWM OUT or GPIO - * - * TIM14_CH1 T BUZZER_1 - Driven by other driver - * TIM8_CH1_IN T FMU_PPM_INPUT - Sampled byt HRT by other driver - */ - -constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { - initIOTimer(Timer::Timer5, DMA{DMA::Index1}), - initIOTimer(Timer::Timer4, DMA{DMA::Index1}), - initIOTimer(Timer::Timer12), - initIOTimer(Timer::Timer1), - initIOTimer(Timer::Timer2), -}; - -constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { - initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel4}, {GPIO::PortI, GPIO::Pin0}), - initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {GPIO::PortH, GPIO::Pin12}), - initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel2}, {GPIO::PortH, GPIO::Pin11}), - initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {GPIO::PortH, GPIO::Pin10}), - initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel2}, {GPIO::PortD, GPIO::Pin13}), - initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {GPIO::PortD, GPIO::Pin14}), - initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel1}, {GPIO::PortH, GPIO::Pin6}), - initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel2}, {GPIO::PortH, GPIO::Pin9}), - initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel2}, {GPIO::PortE, GPIO::Pin11}), -}; - -constexpr io_timers_channel_mapping_t io_timers_channel_mapping = - initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/px4/fmu-v6x/src/usb.c b/boards/px4/fmu-v6x/src/usb.c deleted file mode 100644 index 6d42476..0000000 --- a/boards/px4/fmu-v6x/src/usb.c +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2016 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file px4fmu_usb.c - * - * Board-specific USB functions. - */ - -/************************************************************************************ - * Included Files - ************************************************************************************/ - -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include "board_config.h" - -/************************************************************************************ - * Definitions - ************************************************************************************/ - -/************************************************************************************ - * Private Functions - ************************************************************************************/ - -/************************************************************************************ - * Public Functions - ************************************************************************************/ - -/************************************************************************************ - * Name: stm32_usbinitialize - * - * Description: - * Called to setup USB-related GPIO pins for the PX4FMU board. - * - ************************************************************************************/ - -__EXPORT void stm32_usbinitialize(void) -{ - /* The OTG FS has an internal soft pull-up */ - - /* Configure the OTG FS VBUS sensing GPIO, Power On, and Overcurrent GPIOs */ - -#ifdef CONFIG_STM32H7_OTGFS - stm32_configgpio(GPIO_OTGFS_VBUS); -#endif -} - -/************************************************************************************ - * Name: stm32_usbsuspend - * - * Description: - * Board logic must provide the stm32_usbsuspend logic if the USBDEV driver is - * used. This function is called whenever the USB enters or leaves suspend mode. - * This is an opportunity for the board logic to shutdown clocks, power, etc. - * while the USB is suspended. - * - ************************************************************************************/ - -__EXPORT void stm32_usbsuspend(FAR struct usbdev_s *dev, bool resume) -{ - uinfo("resume: %d\n", resume); -} diff --git a/boards/px4/fmu-v6u/bootloader.px4board b/boards/px4/fts-auto/bootloader.px4board similarity index 100% rename from boards/px4/fmu-v6u/bootloader.px4board rename to boards/px4/fts-auto/bootloader.px4board diff --git a/boards/px4/fmu-v6x/default.px4board b/boards/px4/fts-auto/default.px4board similarity index 80% rename from boards/px4/fmu-v6x/default.px4board rename to boards/px4/fts-auto/default.px4board index 484b844..f371ebf 100644 --- a/boards/px4/fmu-v6x/default.px4board +++ b/boards/px4/fts-auto/default.px4board @@ -1,16 +1,11 @@ CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" CONFIG_BOARD_ARCHITECTURE="cortex-m7" -CONFIG_BOARD_ETHERNET=y CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" -CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS7" -CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS6" -CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS4" +CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS6" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS5" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS1" -CONFIG_BOARD_SERIAL_EXT2="/dev/ttyS3" -CONFIG_DRIVERS_ADC_ADS1115=y CONFIG_DRIVERS_ADC_BOARD_ADC=y -CONFIG_DRIVERS_BAROMETER_BMP388=y -CONFIG_DRIVERS_BAROMETER_INVENSENSE_ICP201XX=y CONFIG_DRIVERS_BAROMETER_MS5611=y CONFIG_DRIVERS_BATT_SMBUS=y CONFIG_DRIVERS_CAMERA_CAPTURE=y @@ -18,26 +13,21 @@ CONFIG_DRIVERS_CAMERA_TRIGGER=y CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y CONFIG_COMMON_DISTANCE_SENSOR=y CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_FTS=n CONFIG_DRIVERS_GPS=y CONFIG_DRIVERS_HEATER=y -CONFIG_DRIVERS_IMU_BOSCH_BMI088=y -CONFIG_DRIVERS_IMU_INVENSENSE_ICM20602=y -CONFIG_DRIVERS_IMU_INVENSENSE_ICM20649=y -CONFIG_DRIVERS_IMU_INVENSENSE_ICM20948=y -CONFIG_DRIVERS_IMU_INVENSENSE_ICM42670P=y +CONFIG_DRIVERS_IMU_BOSCH_BMI055=y CONFIG_DRIVERS_IMU_INVENSENSE_ICM42688P=y CONFIG_COMMON_INS=y CONFIG_COMMON_LIGHT=y CONFIG_COMMON_MAGNETOMETER=y CONFIG_COMMON_OPTICAL_FLOW=y -CONFIG_COMMON_OSD=y CONFIG_DRIVERS_POWER_MONITOR_INA226=y CONFIG_DRIVERS_POWER_MONITOR_INA228=y CONFIG_DRIVERS_POWER_MONITOR_INA238=y CONFIG_DRIVERS_PWM_OUT=y CONFIG_DRIVERS_PX4IO=y -CONFIG_DRIVERS_RC_INPUT=y -CONFIG_DRIVERS_SAFETY_BUTTON=y +CONFIG_COMMON_TELEMETRY=y CONFIG_DRIVERS_TONE_ALARM=y CONFIG_DRIVERS_UAVCAN=y CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE=2 @@ -47,6 +37,7 @@ CONFIG_MODULES_CAMERA_FEEDBACK=y CONFIG_MODULES_COMMANDER=y CONFIG_MODULES_CONTROL_ALLOCATOR=y CONFIG_MODULES_DATAMAN=y +CONFIG_MODULES_FTS_CONTROL=n CONFIG_MODULES_EKF2=y CONFIG_MODULES_ESC_BATTERY=y CONFIG_MODULES_EVENTS=y @@ -57,6 +48,7 @@ CONFIG_MODULES_FW_POS_CONTROL=y CONFIG_MODULES_FW_RATE_CONTROL=y CONFIG_MODULES_GIMBAL=y CONFIG_MODULES_GYRO_CALIBRATION=y +CONFIG_MODULES_GYRO_FFT=y CONFIG_MODULES_LAND_DETECTOR=y CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=y CONFIG_MODULES_LOAD_MON=y @@ -71,24 +63,25 @@ CONFIG_MODULES_MC_POS_CONTROL=y CONFIG_MODULES_MC_RATE_CONTROL=y CONFIG_MODULES_NAVIGATOR=y CONFIG_MODULES_RC_UPDATE=y +CONFIG_MODULES_ROVER_POS_CONTROL=y CONFIG_MODULES_SENSORS=y +CONFIG_MODULES_SIMULATION_SIMULATOR_SIH=y CONFIG_MODULES_TEMPERATURE_COMPENSATION=y CONFIG_MODULES_UXRCE_DDS_CLIENT=y CONFIG_MODULES_VTOL_ATT_CONTROL=y CONFIG_SYSTEMCMDS_ACTUATOR_TEST=y CONFIG_SYSTEMCMDS_BSONDUMP=y CONFIG_SYSTEMCMDS_DMESG=y -CONFIG_SYSTEMCMDS_GPIO=y CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y CONFIG_SYSTEMCMDS_I2CDETECT=y CONFIG_SYSTEMCMDS_LED_CONTROL=y CONFIG_SYSTEMCMDS_MFT=y CONFIG_SYSTEMCMDS_MTD=y -CONFIG_SYSTEMCMDS_NETMAN=y CONFIG_SYSTEMCMDS_NSHTERM=y CONFIG_SYSTEMCMDS_PARAM=y CONFIG_SYSTEMCMDS_PERF=y CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y CONFIG_SYSTEMCMDS_SYSTEM_TIME=y CONFIG_SYSTEMCMDS_TOP=y CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y diff --git a/boards/px4/fts-auto/extras/px4_fmu-v6c_bootloader.bin b/boards/px4/fts-auto/extras/px4_fmu-v6c_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..21cc353f8ac88793327fa90bd661923b7f37cffa GIT binary patch literal 46040 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 - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ************************************************************************************/ -#ifndef __NUTTX_CONFIG_PX4_FTS_CAN_INCLUDE_BOARD_H -#define __NUTTX_CONFIG_PX4_FTS_CAN_INCLUDE_BOARD_H + * nuttx-configs/px4_fts-auto/include/board.h +************************************************************************************/ +#ifndef __NUTTX_CONFIG_PX4_FMU_V6C_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_PX4_FMU_V6C_INCLUDE_BOARD_H /************************************************************************************ * Included Files @@ -55,7 +24,7 @@ ************************************************************************************/ /* Clocking *************************************************************************/ -/* The FTS_CAN board provides the following clock sources: +/* The px4_fts-auto board provides the following clock sources: * * X1: 16 MHz crystal for HSE * @@ -93,10 +62,9 @@ * CPUCLK <= 480 MHz */ -#define STM32_BOARD_USEHSI 1 -#define STM32_BOARD_HSIDIV 1 +#define STM32_BOARD_USEHSE -#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSI +#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE /* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR * @@ -313,7 +281,7 @@ /* LED index values for use with board_userled() */ /* LED definitions ******************************************************************/ -/* The px4_fmu-v6c board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and +/* The px4_fts-auto board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and * LED_RED a Red LED, that can be controlled by software. * * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. diff --git a/boards/px4/fts-proto/nuttx-config/include/board_dma_map.h b/boards/px4/fts-auto/nuttx-config/include/board_dma_map.h similarity index 100% rename from boards/px4/fts-proto/nuttx-config/include/board_dma_map.h rename to boards/px4/fts-auto/nuttx-config/include/board_dma_map.h diff --git a/boards/px4/fts-proto/nuttx-config/nsh/defconfig b/boards/px4/fts-auto/nuttx-config/nsh/defconfig similarity index 97% rename from boards/px4/fts-proto/nuttx-config/nsh/defconfig rename to boards/px4/fts-auto/nuttx-config/nsh/defconfig index 0cca1fa..d4e3940 100644 --- a/boards/px4/fts-proto/nuttx-config/nsh/defconfig +++ b/boards/px4/fts-auto/nuttx-config/nsh/defconfig @@ -51,7 +51,7 @@ # CONFIG_NSH_DISABLE_USLEEP is not set CONFIG_ARCH="arm" CONFIG_ARCH_BOARD_CUSTOM=y -CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/px4/fts-proto/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/px4/fts-auto/nuttx-config" CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" CONFIG_ARCH_CHIP="stm32h7" @@ -75,11 +75,11 @@ CONFIG_BUILTIN=y CONFIG_CDCACM=y CONFIG_CDCACM_IFLOWCONTROL=y CONFIG_CDCACM_PRODUCTID=0x0038 -CONFIG_CDCACM_PRODUCTSTR="FTS-PROTO" +CONFIG_CDCACM_PRODUCTSTR="PX4 FMU v6C.x" CONFIG_CDCACM_RXBUFSIZE=600 CONFIG_CDCACM_TXBUFSIZE=12000 CONFIG_CDCACM_VENDORID=0x3185 -CONFIG_CDCACM_VENDORSTR="Nimbus" +CONFIG_CDCACM_VENDORSTR="Auterion" CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_HARDFAULT_ALERT=y CONFIG_DEBUG_MEMFAULT=y diff --git a/boards/px4/fts-proto/nuttx-config/scripts/bootloader_script.ld b/boards/px4/fts-auto/nuttx-config/scripts/bootloader_script.ld similarity index 100% rename from boards/px4/fts-proto/nuttx-config/scripts/bootloader_script.ld rename to boards/px4/fts-auto/nuttx-config/scripts/bootloader_script.ld diff --git a/boards/px4/fts-proto/nuttx-config/scripts/script.ld b/boards/px4/fts-auto/nuttx-config/scripts/script.ld similarity index 100% rename from boards/px4/fts-proto/nuttx-config/scripts/script.ld rename to boards/px4/fts-auto/nuttx-config/scripts/script.ld diff --git a/boards/px4/fts-proto/src/CMakeLists.txt b/boards/px4/fts-auto/src/CMakeLists.txt similarity index 100% rename from boards/px4/fts-proto/src/CMakeLists.txt rename to boards/px4/fts-auto/src/CMakeLists.txt diff --git a/boards/px4/fts-proto/src/board_config.h b/boards/px4/fts-auto/src/board_config.h similarity index 94% rename from boards/px4/fts-proto/src/board_config.h rename to boards/px4/fts-auto/src/board_config.h index edea3c2..0ed1f0f 100644 --- a/boards/px4/fts-proto/src/board_config.h +++ b/boards/px4/fts-auto/src/board_config.h @@ -34,7 +34,7 @@ /** * @file board_config.h * - * PX4FMU-v6c internal definitions + * PX4fts-auto internal definitions */ #pragma once @@ -57,7 +57,7 @@ #undef TRACE_PINS /* PX4IO connection configuration */ -/* + #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS4" #define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX @@ -69,8 +69,8 @@ #define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR #define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN #define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 // 1.5Mbps -> max rate for IO -*/ +#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ + /* PX4FMU GPIOs ***********************************************************************************/ @@ -139,7 +139,7 @@ #define GPIO_HW_VER_REV_DRIVE /* PE12 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN12) #define GPIO_HW_REV_SENSE /* PC0 */ GPIO_ADC123_INP10 #define GPIO_HW_VER_SENSE /* PC1 */ GPIO_ADC123_INP11 -#define HW_INFO_INIT_PREFIX "FTSCAN" +#define HW_INFO_INIT_PREFIX "V6C" #define BOARD_NUM_SPI_CFG_HW_VERSIONS 3 // Rev 0, 10 and Mini Sensor sets // Base/FMUM @@ -149,11 +149,6 @@ #define V6C11 HW_VER_REV(0x1,0x1) // NO PX4IO, Rev 1 I2C4 Internal I2C2 External #define V6C21 HW_VER_REV(0x2,0x1) // FMUV6CMini, Rev 1 I2C4 Internal I2C2 External -/*FTS*/ -#define GPIO_FTS_CAN_OUTPUT /* PB9 FTS CAN CUT */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN13) -#define GPIO_FTS_CHUTE_OUTPUT /* PB9 FTS CHUTE FIRE */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN14) -#define FTS_TERMINATE_CAN(on_true) px4_arch_gpiowrite(GPIO_FTS_CAN_OUTPUT, (on_true)) -#define FTS_TRIGGER_CHUTE(on_true) px4_arch_gpiowrite(GPIO_FTS_CHUTE_OUTPUT, (on_true)) /* HEATER * PWM in future @@ -236,7 +231,7 @@ #define BOARD_ADC_USB_CONNECTED (px4_arch_gpioread(GPIO_OTGFS_VBUS)) #define BOARD_ADC_USB_VALID (!px4_arch_gpioread(GPIO_nVDD_USB_VALID)) -/* FTS-CAN never powers off the Servo rail */ +/* FMUv6C never powers off the Servo rail */ #define BOARD_ADC_SERVO_VALID (1) @@ -271,8 +266,6 @@ GPIO_VDD_5V_HIPOWER_nOC, \ GPIO_VDD_3V3_SENSORS_EN, \ GPIO_TONE_ALARM_IDLE, \ - GPIO_FTS_CAN_OUTPUT, \ - GPIO_FTS_CHUTE_OUTPUT, \ } #define BOARD_ENABLE_CONSOLE_BUFFER diff --git a/boards/px4/fmu-v6x/src/bootloader_main.c b/boards/px4/fts-auto/src/bootloader_main.c similarity index 100% rename from boards/px4/fmu-v6x/src/bootloader_main.c rename to boards/px4/fts-auto/src/bootloader_main.c diff --git a/boards/px4/fmu-v6u/src/can.c b/boards/px4/fts-auto/src/can.c similarity index 100% rename from boards/px4/fmu-v6u/src/can.c rename to boards/px4/fts-auto/src/can.c diff --git a/boards/px4/fts-proto/src/hw_config.h b/boards/px4/fts-auto/src/hw_config.h similarity index 100% rename from boards/px4/fts-proto/src/hw_config.h rename to boards/px4/fts-auto/src/hw_config.h diff --git a/boards/px4/fts-proto/src/i2c.cpp b/boards/px4/fts-auto/src/i2c.cpp similarity index 100% rename from boards/px4/fts-proto/src/i2c.cpp rename to boards/px4/fts-auto/src/i2c.cpp diff --git a/boards/px4/fts-proto/src/init.c b/boards/px4/fts-auto/src/init.c similarity index 100% rename from boards/px4/fts-proto/src/init.c rename to boards/px4/fts-auto/src/init.c diff --git a/boards/px4/fts-proto/src/led.c b/boards/px4/fts-auto/src/led.c similarity index 100% rename from boards/px4/fts-proto/src/led.c rename to boards/px4/fts-auto/src/led.c diff --git a/boards/px4/fts-proto/src/manifest.c b/boards/px4/fts-auto/src/manifest.c similarity index 90% rename from boards/px4/fts-proto/src/manifest.c rename to boards/px4/fts-auto/src/manifest.c index 5e89cb9..4a0401b 100644 --- a/boards/px4/fts-proto/src/manifest.c +++ b/boards/px4/fts-auto/src/manifest.c @@ -73,6 +73,18 @@ static const px4_hw_mft_item_t device_unsupported = {0, 0, 0}; // List of components on a specific board configuration // The index of those components is given by the enum (px4_hw_mft_item_id_t) // declared in board_common.h +static const px4_hw_mft_item_t hw_mft_list_v0600[] = { + { + .present = 1, + .mandatory = 1, + .connection = px4_hw_con_onboard, + }, + { + .present = 1, + .mandatory = 1, + .connection = px4_hw_con_onboard, + }, +}; static const px4_hw_mft_item_t hw_mft_list_v0610[] = { { @@ -90,7 +102,11 @@ static const px4_hw_mft_item_t hw_mft_list_v0610[] = { static px4_hw_mft_list_entry_t mft_lists[] = { // ver_rev + {V6C00, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // Rev 0 + {V6C01, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // Rev 1 {V6C10, hw_mft_list_v0610, arraySize(hw_mft_list_v0610)}, // Rev 0 No PX4IO + {V6C11, hw_mft_list_v0610, arraySize(hw_mft_list_v0610)}, // Rev 1 No PX4IO + {V6C21, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, // Rev 1 MINI }; /************************************************************************************ diff --git a/boards/px4/fts-proto/src/mtd.cpp b/boards/px4/fts-auto/src/mtd.cpp similarity index 98% rename from boards/px4/fts-proto/src/mtd.cpp rename to boards/px4/fts-auto/src/mtd.cpp index b3784bc..b315ff3 100644 --- a/boards/px4/fts-proto/src/mtd.cpp +++ b/boards/px4/fts-auto/src/mtd.cpp @@ -86,10 +86,10 @@ static const px4_mtd_entry_t imu_eeprom = { }; static const px4_mtd_manifest_t board_mtd_config = { - .nconfigs = 1, + .nconfigs = 2, .entries = { &fmum_fram, - //&imu_eeprom + &imu_eeprom } }; diff --git a/boards/px4/fmu-v6u/src/sdio.c b/boards/px4/fts-auto/src/sdio.c similarity index 100% rename from boards/px4/fmu-v6u/src/sdio.c rename to boards/px4/fts-auto/src/sdio.c diff --git a/boards/px4/fts-proto/src/spi.cpp b/boards/px4/fts-auto/src/spi.cpp similarity index 100% rename from boards/px4/fts-proto/src/spi.cpp rename to boards/px4/fts-auto/src/spi.cpp diff --git a/boards/px4/fts-proto/src/timer_config.cpp b/boards/px4/fts-auto/src/timer_config.cpp similarity index 100% rename from boards/px4/fts-proto/src/timer_config.cpp rename to boards/px4/fts-auto/src/timer_config.cpp diff --git a/boards/px4/fmu-v6u/src/usb.c b/boards/px4/fts-auto/src/usb.c similarity index 100% rename from boards/px4/fmu-v6u/src/usb.c rename to boards/px4/fts-auto/src/usb.c diff --git a/boards/px4/fts-can/default.px4board b/boards/px4/fts-can/default.px4board index cbae8d0..f7fb7ca 100644 --- a/boards/px4/fts-can/default.px4board +++ b/boards/px4/fts-can/default.px4board @@ -1,32 +1,23 @@ CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" CONFIG_BOARD_ARCHITECTURE="cortex-m7" -CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" -CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS6" CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS5" CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS1" CONFIG_DRIVERS_ADC_BOARD_ADC=y CONFIG_DRIVERS_DSHOT=y -CONFIG_COMMON_INS=y CONFIG_COMMON_LIGHT=y -CONFIG_DRIVERS_PWM_OUT=y CONFIG_COMMON_TELEMETRY=y -CONFIG_DRIVERS_TONE_ALARM=y -CONFIG_DRIVERS_UAVCAN=y -CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE=2 -CONFIG_MODULES_BATTERY_STATUS=y +CONFIG_MODULES_BATTERY_STATUS=n CONFIG_MODULES_CONTROL_ALLOCATOR=y CONFIG_MODULES_DATAMAN=y -CONFIG_MODULES_ESC_BATTERY=y +CONFIG_MODULES_FTS_CONTROL=y CONFIG_MODULES_EVENTS=y -CONFIG_MODULES_LOAD_MON=y CONFIG_MODULES_LOGGER=y CONFIG_MODULES_MAVLINK=y CONFIG_MODULES_UXRCE_DDS_CLIENT=y CONFIG_SYSTEMCMDS_BSONDUMP=y CONFIG_SYSTEMCMDS_DMESG=y CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y -CONFIG_SYSTEMCMDS_I2CDETECT=y CONFIG_SYSTEMCMDS_LED_CONTROL=y CONFIG_SYSTEMCMDS_MFT=y CONFIG_SYSTEMCMDS_MTD=y diff --git a/boards/px4/fts-can/extras/px4_fts-can_bootloader.bin b/boards/px4/fts-can/extras/px4_fts-can_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..db685ea88baef323b4b789bf10dc378423323432 GIT binary patch literal 46060 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 aYl>2%&5XwA&-tkLEOgIABNZD3#{M6fpa)O@ literal 0 HcmV?d00001 diff --git a/boards/px4/fts-can/firmware.prototype b/boards/px4/fts-can/firmware.prototype index 981905d..5de7113 100644 --- a/boards/px4/fts-can/firmware.prototype +++ b/boards/px4/fts-can/firmware.prototype @@ -1,10 +1,10 @@ { - "board_id": 56, + "board_id": 0, "magic": "PX4FWv1", "description": "Firmware for the Nimbus FTS-CAN systems", "image": "", "build_time": 0, - "summary": "NIMBUSFTS", + "summary": "NIMBUSMFTS", "version": "0.1", "image_size": 0, "image_maxsize": 1966080, diff --git a/boards/px4/fts-can/init/rc.board_defaults b/boards/px4/fts-can/init/rc.board_defaults index d13ce43..504b3ec 100644 --- a/boards/px4/fts-can/init/rc.board_defaults +++ b/boards/px4/fts-can/init/rc.board_defaults @@ -4,11 +4,32 @@ #------------------------------------------------------------------------------ -param set-default BAT1_V_DIV 18.1 -param set-default BAT2_V_DIV 18.1 +#param set-default FTS_TYPE 1 +#param set-default FTS_SIM_MODE 0 -param set-default BAT1_A_PER_V 36.367515152 -param set-default BAT2_A_PER_V 36.367515152 +#param set-default SYS_USE_IO 0 +#param set-default SENS_IMU_MODE 0 -param set-default SYS_USE_IO 0 -param set-default SENS_IMU_MODE 0 \ No newline at end of file +# FC INTERFACE (9600 BAUD) +# MAV_0 - TELEM 1 - TTYS5 - UART7 (PE7/PE8) +param set-default MAV_0_CONFIG 101 +param set-default MAV_0_FORWARD 0 +param set-default MAV_0_MODE 1 +param set-default MAV_0_RADIO_CTL 0 +param set-default MAV_0_RATE 2400 + +# GROUND FTS INTERFACE (9600 BAUD) +# MAV_1 - TELEM 2 - TTYS3 - UART5 (PD2/PC12) +param set-default MAV_1_CONFIG 102 +param set-default MAV_1_FORWARD 0 +param set-default MAV_1_MODE 1 +param set-default MAV_1_RADIO_CTL 0 +param set-default MAV_1_RATE 2400 + +# AUTO FTS INTERFACE (9600 BAUD) +# MAV_2 - TELEM 3 - TTYS1 - USART2 (PA3/PD5) +param set-default MAV_2_CONFIG 103 +param set-default MAV_2_FORWARD 0 +param set-default MAV_2_MODE 1 +param set-default MAV_2_RADIO_CTL 0 +param set-default MAV_2_RATE 2400 diff --git a/boards/px4/fts-can/init/rc.board_sensors b/boards/px4/fts-can/init/rc.board_sensors index 4be6269..2935cad 100644 --- a/boards/px4/fts-can/init/rc.board_sensors +++ b/boards/px4/fts-can/init/rc.board_sensors @@ -3,19 +3,4 @@ # PX4 FTS-CAN specific board sensors init #------------------------------------------------------------------------------ board_adc start - -# Internal SPI bus BMI055 accel/gyro -#bmi055 -A -R 4 -s start -#bmi055 -G -R 4 -s start - -# Internal SPI bus ICM42688p -#icm42688p -R 6 -s start - -# Internal barometer on I2C4 (The same bus is also exposed externally, and therefore marked as external) -#ms5611 -X -b 4 -a 0x77 start - -# Internal compass on IMU I2C4 (The same bus is also exposed externally, and therefore marked as external) -#ist8310 -X -b 4 -a 0xc start - -# External compass on GPS/I2C1 (the 3rd external bus): standard Holybro Pixhawk 4 or CUAV V5 GPS/compass puck (with lights, safety button, and buzzer) -#ist8310 -X -b 1 -R 10 start +fts_control start diff --git a/boards/px4/fts-can/nuttx-config/include/board.h b/boards/px4/fts-can/nuttx-config/include/board.h index 99ca17b..4b45c7a 100644 --- a/boards/px4/fts-can/nuttx-config/include/board.h +++ b/boards/px4/fts-can/nuttx-config/include/board.h @@ -1,37 +1,6 @@ /************************************************************************************ * nuttx-configs/px4_fts-can/include/board.h - * - * Copyright (C) 2016-2019 Gregory Nutt. All rights reserved. - * Authors: David Sidrane - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ************************************************************************************/ +************************************************************************************/ #ifndef __NUTTX_CONFIG_PX4_FTS_CAN_INCLUDE_BOARD_H #define __NUTTX_CONFIG_PX4_FTS_CAN_INCLUDE_BOARD_H @@ -93,10 +62,9 @@ * CPUCLK <= 480 MHz */ -#define STM32_BOARD_USEHSI 1 -#define STM32_BOARD_HSIDIV 1 +#define STM32_BOARD_USEHSE -#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSI +#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE /* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR * @@ -302,65 +270,7 @@ #define STM32_SDMMC_CLKCR_EDGE STM32_SDMMC_CLKCR_NEGEDGE -/* LED definitions ******************************************************************/ -/* The PX4 FMUV6C board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and - * LED_RED a Red LED, that can be controlled by software. - * - * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. - * The following definitions are used to access individual LEDs. - */ - -/* LED index values for use with board_userled() */ - -/* LED definitions ******************************************************************/ -/* The px4_fmu-v6c board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and - * LED_RED a Red LED, that can be controlled by software. - * - * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. - * The following definitions are used to access individual LEDs. - */ - -/* LED index values for use with board_userled() */ - -#define BOARD_LED1 0 -#define BOARD_LED2 1 -#define BOARD_LED3 2 -#define BOARD_NLEDS 3 - -#define BOARD_LED_RED BOARD_LED1 -#define BOARD_LED_GREEN BOARD_LED2 -#define BOARD_LED_BLUE BOARD_LED3 - -/* LED bits for use with board_userled_all() */ - -#define BOARD_LED1_BIT (1 << BOARD_LED1) -#define BOARD_LED2_BIT (1 << BOARD_LED2) -#define BOARD_LED3_BIT (1 << BOARD_LED3) - -/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in - * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related - * events as follows: - * - * - * SYMBOL Meaning LED state - * Red Green Blue - * ---------------------- -------------------------- ------ ------ ----*/ - -#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ -#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ -#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ -#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ -#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ -#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ -#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ -#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ -#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ - -/* Thus if the Green LED is statically on, NuttX has successfully booted and - * is, apparently, running normally. If the Red LED is flashing at - * approximately 2Hz, then a fatal error has been detected and the system - * has halted. - */ +#define BOARD_NLEDS 0 /* Alternate function pin selections ************************************************/ diff --git a/boards/px4/fts-can/src/board_config.h b/boards/px4/fts-can/src/board_config.h index d69d253..598e81f 100644 --- a/boards/px4/fts-can/src/board_config.h +++ b/boards/px4/fts-can/src/board_config.h @@ -111,19 +111,15 @@ /* PA4 */ GPIO_ADC12_INP18 \ /* Define Channel numbers must match above GPIO pin IN(n)*/ -#define ADC_BATTERY1_CURRENT_CHANNEL /* PC4 */ ADC1_CH(4) -#define ADC_BATTERY2_VOLTAGE_CHANNEL /* PB1 */ ADC1_CH(5) -#define ADC_BATTERY1_VOLTAGE_CHANNEL /* PC5 */ ADC1_CH(8) +#define ADC_BATTERY_CURRENT_CHANNEL /* PC4 */ ADC1_CH(4) +#define ADC_BATTERY_VOLTAGE_CHANNEL /* PC5 */ ADC1_CH(8) #define ADC_HW_REV_SENSE_CHANNEL /* PC0 */ ADC3_CH(10) #define ADC_HW_VER_SENSE_CHANNEL /* PC1 */ ADC3_CH(11) -#define ADC_BATTERY2_CURRENT_CHANNEL /* PA2 */ ADC1_CH(14) #define ADC_SCALED_V5_CHANNEL /* PA4 */ ADC1_CH(18) #define ADC_CHANNELS \ - ((1 << ADC_BATTERY1_CURRENT_CHANNEL) | \ - (1 << ADC_BATTERY2_VOLTAGE_CHANNEL) | \ - (1 << ADC_BATTERY1_VOLTAGE_CHANNEL) | \ - (1 << ADC_BATTERY2_CURRENT_CHANNEL) | \ + ((1 << ADC_BATTERY_CURRENT_CHANNEL) | \ + (1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ (1 << ADC_SCALED_V5_CHANNEL )) #define HW_REV_VER_ADC_BASE STM32_ADC3_BASE @@ -149,12 +145,16 @@ #define V6C11 HW_VER_REV(0x1,0x1) // NO PX4IO, Rev 1 I2C4 Internal I2C2 External #define V6C21 HW_VER_REV(0x2,0x1) // FMUV6CMini, Rev 1 I2C4 Internal I2C2 External +/*FTS*/ +#define GPIO_FTS_ARM /* PE0 FTS CAN ARM NEGATED */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN0) +#define GPIO_FTS_CAN_OUTPUT /* PE2 FTS CAN CUT */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN2) +#define GPIO_FTS_CHUTE_OUTPUT /* PE4 FTS CHUTE FIRE */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN4) +#define FTS_TERMINATE_CAN(on_true) px4_arch_gpiowrite(GPIO_FTS_CAN_OUTPUT, (on_true)) +#define FTS_TRIGGER_CHUTE(on_true) px4_arch_gpiowrite(GPIO_FTS_CHUTE_OUTPUT, (on_true)) -/* HEATER - * PWM in future - */ -#define GPIO_HEATER_OUTPUT /* PB9 T17CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN9) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +/*EBYTE MODULE MODE PINS*/ +#define GPIO_GFTS_M0 /* PE13 EBYTE MODE PIN M0 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN13) +#define GPIO_GFTS_M1 /* PE14 EBYTE MODE PIN M0 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN14) /* PWM */ @@ -168,8 +168,7 @@ #define GPIO_nPOWER_IN_C /* PE15 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN15) #define GPIO_nVDD_BRICK1_VALID GPIO_nPOWER_IN_A /* Brick 1 Is Chosen */ -#define GPIO_nVDD_BRICK2_VALID GPIO_nPOWER_IN_B /* Brick 2 Is Chosen */ -#define BOARD_NUMBER_BRICKS 2 +#define BOARD_NUMBER_BRICKS 0 #define GPIO_nVDD_USB_VALID GPIO_nPOWER_IN_C /* USB Is Chosen */ #define GPIO_VDD_5V_PERIPH_nEN /* PE2 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN2) @@ -231,12 +230,10 @@ #define BOARD_ADC_USB_CONNECTED (px4_arch_gpioread(GPIO_OTGFS_VBUS)) #define BOARD_ADC_USB_VALID (!px4_arch_gpioread(GPIO_nVDD_USB_VALID)) -/* FTS-CAN never powers off the Servo rail */ #define BOARD_ADC_SERVO_VALID (1) -#define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) -#define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) +#define BOARD_ADC_BRICK_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) #define BOARD_ADC_PERIPH_5V_OC (!px4_arch_gpioread(GPIO_VDD_5V_PERIPH_nOC)) #define BOARD_ADC_HIPOWER_5V_OC (!px4_arch_gpioread(GPIO_VDD_5V_HIPOWER_nOC)) @@ -256,7 +253,6 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ @@ -266,7 +262,12 @@ GPIO_VDD_5V_HIPOWER_nOC, \ GPIO_VDD_3V3_SENSORS_EN, \ GPIO_TONE_ALARM_IDLE, \ - } + GPIO_FTS_CAN_OUTPUT, \ + GPIO_FTS_CHUTE_OUTPUT, \ + GPIO_FTS_ARM, \ + GPIO_GFTS_M0, \ + GPIO_GFTS_M1 \ + } #define BOARD_ENABLE_CONSOLE_BUFFER diff --git a/boards/px4/fts-can/src/mtd.cpp b/boards/px4/fts-can/src/mtd.cpp index b315ff3..b3784bc 100644 --- a/boards/px4/fts-can/src/mtd.cpp +++ b/boards/px4/fts-can/src/mtd.cpp @@ -86,10 +86,10 @@ static const px4_mtd_entry_t imu_eeprom = { }; static const px4_mtd_manifest_t board_mtd_config = { - .nconfigs = 2, + .nconfigs = 1, .entries = { &fmum_fram, - &imu_eeprom + //&imu_eeprom } }; diff --git a/boards/px4/fts-proto/bootloader.px4board b/boards/px4/fts-proto/bootloader.px4board deleted file mode 100644 index 19b6e66..0000000 --- a/boards/px4/fts-proto/bootloader.px4board +++ /dev/null @@ -1,3 +0,0 @@ -CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" -CONFIG_BOARD_ARCHITECTURE="cortex-m7" -CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/px4/fts-proto/default.px4board b/boards/px4/fts-proto/default.px4board deleted file mode 100644 index f0240dc..0000000 --- a/boards/px4/fts-proto/default.px4board +++ /dev/null @@ -1,35 +0,0 @@ -CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" -CONFIG_BOARD_ARCHITECTURE="cortex-m7" -CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS5" -CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" -CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS1" -CONFIG_DRIVERS_ADC_BOARD_ADC=y -CONFIG_DRIVERS_DSHOT=y -CONFIG_COMMON_LIGHT=y -CONFIG_COMMON_TELEMETRY=y -CONFIG_MODULES_BATTERY_STATUS=y -CONFIG_MODULES_CONTROL_ALLOCATOR=y -CONFIG_MODULES_DATAMAN=y -CONFIG_MODULES_FTS_CONTROL=y -CONFIG_MODULES_EVENTS=y -CONFIG_MODULES_LOGGER=y -CONFIG_MODULES_MAVLINK=y -CONFIG_MODULES_UXRCE_DDS_CLIENT=y -CONFIG_SYSTEMCMDS_BSONDUMP=y -CONFIG_SYSTEMCMDS_DMESG=y -CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y -CONFIG_SYSTEMCMDS_LED_CONTROL=y -CONFIG_SYSTEMCMDS_MFT=y -CONFIG_SYSTEMCMDS_MTD=y -CONFIG_SYSTEMCMDS_NSHTERM=y -CONFIG_SYSTEMCMDS_PARAM=y -CONFIG_SYSTEMCMDS_PERF=y -CONFIG_SYSTEMCMDS_REBOOT=y -CONFIG_SYSTEMCMDS_SD_BENCH=y -CONFIG_SYSTEMCMDS_SYSTEM_TIME=y -CONFIG_SYSTEMCMDS_TOP=y -CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y -CONFIG_SYSTEMCMDS_TUNE_CONTROL=y -CONFIG_SYSTEMCMDS_UORB=y -CONFIG_SYSTEMCMDS_VER=y -CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/px4/fts-proto/extras/px4_fmu-v6c_bootloader.bin b/boards/px4/fts-proto/extras/px4_fmu-v6c_bootloader.bin deleted file mode 100755 index 536dcc40aadf6d66a059507a3a23e55153c4fe6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46288 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 diff --git a/boards/px4/fts-proto/extras/px4_io-v2_default.bin b/boards/px4/fts-proto/extras/px4_io-v2_default.bin deleted file mode 100755 index 957f0f13a12e8eb8a7979955f29ad98d82433933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40140 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 -#include -#include -#include -#include -#include "arm_internal.h" -#include - -extern int sercon_main(int c, char **argv); - -void board_late_initialize(void) -{ - sercon_main(0, NULL); -} - -extern void sys_tick_handler(void); -void board_timerhook(void) -{ - sys_tick_handler(); -} diff --git a/boards/px4/fts-proto/src/can.c b/boards/px4/fts-proto/src/can.c deleted file mode 100644 index c71b2e8..0000000 --- a/boards/px4/fts-proto/src/can.c +++ /dev/null @@ -1,128 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2012 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file px4fmu_can.c - * - * Board-specific CAN functions. - */ - -#ifdef CONFIG_CAN - -#include -#include - -#include -#include - -#include "chip.h" -#include "arm_internal.h" - -#include "chip.h" -#include "stm32_can.h" -#include "board_config.h" - -#ifdef CONFIG_CAN - -/************************************************************************************ - * Pre-processor Definitions - ************************************************************************************/ -/* Configuration ********************************************************************/ - -#if defined(CONFIG_STM32_CAN1) && defined(CONFIG_STM32_CAN2) -# warning "Both CAN1 and CAN2 are enabled. Assuming only CAN1." -# undef CONFIG_STM32_CAN2 -#endif - -#ifdef CONFIG_STM32_CAN1 -# define CAN_PORT 1 -#else -# define CAN_PORT 2 -#endif - -/************************************************************************************ - * Private Functions - ************************************************************************************/ - -/************************************************************************************ - * Public Functions - ************************************************************************************/ -int can_devinit(void); - -/************************************************************************************ - * Name: can_devinit - * - * Description: - * All STM32 architectures must provide the following interface to work with - * examples/can. - * - ************************************************************************************/ - -int can_devinit(void) -{ - static bool initialized = false; - struct can_dev_s *can; - int ret; - - /* Check if we have already initialized */ - - if (!initialized) { - /* Call stm32_caninitialize() to get an instance of the CAN interface */ - - can = stm32_caninitialize(CAN_PORT); - - if (can == NULL) { - canerr("ERROR: Failed to get CAN interface\n"); - return -ENODEV; - } - - /* Register the CAN driver at "/dev/can0" */ - - ret = can_register("/dev/can0", can); - - if (ret < 0) { - canerr("ERROR: can_register failed: %d\n", ret); - return ret; - } - - /* Now we are initialized */ - - initialized = true; - } - - return OK; -} - -#endif - -#endif /* CONFIG_CAN */ diff --git a/boards/px4/fts-proto/src/sdio.c b/boards/px4/fts-proto/src/sdio.c deleted file mode 100644 index 869d757..0000000 --- a/boards/px4/fts-proto/src/sdio.c +++ /dev/null @@ -1,177 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2014, 2016 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "chip.h" -#include "board_config.h" -#include "stm32_gpio.h" -#include "stm32_sdmmc.h" - -#ifdef CONFIG_MMCSD - - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/* Card detections requires card support and a card detection GPIO */ - -#define HAVE_NCD 1 -#if !defined(GPIO_SDMMC1_NCD) -# undef HAVE_NCD -#endif - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -static FAR struct sdio_dev_s *sdio_dev; -#ifdef HAVE_NCD -static bool g_sd_inserted = 0xff; /* Impossible value */ -#endif - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: stm32_ncd_interrupt - * - * Description: - * Card detect interrupt handler. - * - ****************************************************************************/ - -#ifdef HAVE_NCD -static int stm32_ncd_interrupt(int irq, FAR void *context) -{ - bool present; - - present = !stm32_gpioread(GPIO_SDMMC1_NCD); - - if (sdio_dev && present != g_sd_inserted) { - sdio_mediachange(sdio_dev, present); - g_sd_inserted = present; - } - - return OK; -} -#endif - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: stm32_sdio_initialize - * - * Description: - * Initialize SDIO-based MMC/SD card support - * - ****************************************************************************/ - -int stm32_sdio_initialize(void) -{ - int ret; - -#ifdef HAVE_NCD - /* Card detect */ - - bool cd_status; - - /* Configure the card detect GPIO */ - - stm32_configgpio(GPIO_SDMMC1_NCD); - - /* Register an interrupt handler for the card detect pin */ - - stm32_gpiosetevent(GPIO_SDMMC1_NCD, true, true, true, stm32_ncd_interrupt); -#endif - - /* Mount the SDIO-based MMC/SD block driver */ - /* First, get an instance of the SDIO interface */ - - finfo("Initializing SDIO slot %d\n", SDIO_SLOTNO); - - sdio_dev = sdio_initialize(SDIO_SLOTNO); - - if (!sdio_dev) { - syslog(LOG_ERR, "[boot] Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); - return -ENODEV; - } - - /* Now bind the SDIO interface to the MMC/SD driver */ - - finfo("Bind SDIO to the MMC/SD driver, minor=%d\n", SDIO_MINOR); - - ret = mmcsd_slotinitialize(SDIO_MINOR, sdio_dev); - - if (ret != OK) { - syslog(LOG_ERR, "[boot] Failed to bind SDIO to the MMC/SD driver: %d\n", ret); - return ret; - } - - finfo("Successfully bound SDIO to the MMC/SD driver\n"); - -#ifdef HAVE_NCD - /* Use SD card detect pin to check if a card is g_sd_inserted */ - - cd_status = !stm32_gpioread(GPIO_SDMMC1_NCD); - finfo("Card detect : %d\n", cd_status); - - sdio_mediachange(sdio_dev, cd_status); -#else - /* Assume that the SD card is inserted. What choice do we have? */ - - sdio_mediachange(sdio_dev, true); -#endif - - return OK; -} - -#endif /* CONFIG_MMCSD */ diff --git a/boards/px4/fts-proto/src/usb.c b/boards/px4/fts-proto/src/usb.c deleted file mode 100644 index 6d42476..0000000 --- a/boards/px4/fts-proto/src/usb.c +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2016 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file px4fmu_usb.c - * - * Board-specific USB functions. - */ - -/************************************************************************************ - * Included Files - ************************************************************************************/ - -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include "board_config.h" - -/************************************************************************************ - * Definitions - ************************************************************************************/ - -/************************************************************************************ - * Private Functions - ************************************************************************************/ - -/************************************************************************************ - * Public Functions - ************************************************************************************/ - -/************************************************************************************ - * Name: stm32_usbinitialize - * - * Description: - * Called to setup USB-related GPIO pins for the PX4FMU board. - * - ************************************************************************************/ - -__EXPORT void stm32_usbinitialize(void) -{ - /* The OTG FS has an internal soft pull-up */ - - /* Configure the OTG FS VBUS sensing GPIO, Power On, and Overcurrent GPIOs */ - -#ifdef CONFIG_STM32H7_OTGFS - stm32_configgpio(GPIO_OTGFS_VBUS); -#endif -} - -/************************************************************************************ - * Name: stm32_usbsuspend - * - * Description: - * Board logic must provide the stm32_usbsuspend logic if the USBDEV driver is - * used. This function is called whenever the USB enters or leaves suspend mode. - * This is an opportunity for the board logic to shutdown clocks, power, etc. - * while the USB is suspended. - * - ************************************************************************************/ - -__EXPORT void stm32_usbsuspend(FAR struct usbdev_s *dev, bool resume) -{ - uinfo("resume: %d\n", resume); -} diff --git a/boards/px4/io-v2/default.px4board b/boards/px4/io-v2/default.px4board new file mode 100644 index 0000000..9e69a1e --- /dev/null +++ b/boards/px4/io-v2/default.px4board @@ -0,0 +1,5 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m3" +CONFIG_BOARD_ROMFSROOT="" +CONFIG_BOARD_CONSTRAINED_FLASH=y +CONFIG_MODULES_PX4IOFIRMWARE=y diff --git a/boards/px4/io-v2/extras/px4_io-v2_bootloader.bin b/boards/px4/io-v2/extras/px4_io-v2_bootloader.bin new file mode 100644 index 0000000000000000000000000000000000000000..235c65c934c044b0064fbd5172e82e781e6ec2c4 GIT binary patch literal 4096 zcmd@X3vXNH_1uT;>%@uO+HIUi+w0gAr^&j!r~)10#%^v}J8258SSu>cEStDIWmb)4 zY*X!IpzfiOtxTc~OhDOG9@;{?NQ7b>)*&GVo4t}Pp@p_9#A!O9B8*-KaNQq~Awbv!-%Nj5=Xx9eZ*!`KN`ZXz z^+-E_ZHVh|_fWO;c$ciz+v0sDbrj_HRPbIpMY+2pvuQ|F0q{gF90vI#Rm**%f%K)!#m zEBk0caJTa+S!0tQDo_u# zAio_0Udwf8Og}RKwel$<^OnjCxHj8rC&sAf@$_;h1Kd7@a|kJ{>&vi>Ezsu>|JnfD z-w>?E0`G<;97KFK>e0B%S22Ge|1L%k_+^Tr57hP)58vNY8)=6(!@6{r!BH;N2Y%sBl=cd|M6IOE$fBp-q@K*kQuJHbOo@ky<4@MNgGYGuE^HB zK3>wtnRJzh7eVG#w%Odzy39wk+{|KKT{e|S6Puqdk~8hWGmV>s%&r*arg@B419(8b z6|=s1foT6bZxkb#t!5F|D3As9xOCW8GzM-Wi?OYLDox}*&Qr}3IyIT6>IHdyjBUP< zZp3{C76&s>JTiS_tWsuJL3YQ6rQ(Z5`lmjaUK2Y$8{G%f<*~NFp0={oJ1BopKbI}G zaTqh$G^#jaZ!3-l59+cPjm6F4E!#I$?rF27){A%Pk)nR3 zoQ*FZgKG1Op*>V%-;|j-b<}XNk2$G08rcnfQ{^?&DYlu!;rv+X5kc`j!@9nv`+i^E z+>h2}%5n$y23DIX*(*Qj>&>>%y;;WBEAupU^A{;War0EuG4%YsWQEANCep^OYMR_* zKuF?!V#%FGsHYHU1iTC2Dam+>zl9N+UI6dDQ>;=9R5M#Qo1*!T6wjcRn@9fM#r!$mIRsBxm6`8oqGbgwz68XdR4C%1_V(r%d+IRuO%b6ABssq(s|3O*V_DWxsk)`WM!Vt0s`wbd~q` z0=Ve|MH7&)4Ou(7vgaE3F!qHxUgBKXFAxLb2x1H3o~8LiOZXAQ@kyHi^7oDl7;7r% z#4huQPIE&BoH5dXk;Xn9o#W!9Z_lNPTx5t94cptCulOJpi8~akvL5xmF?R`jI9WIG zk#^gV1J5J)d6B9nXLvEsyQyldNu&>BZL+hy&Ah9s8RV?mC6C-rs&)4qi!$IcZUy<5 z`K~N95bpLlsAhr{q+?nr0XRx<+Gqhgu7|}~eU>NVzw)La!&jm2R+Z>j@Fs6k8Cax-i?gW1A#C24^2DIBQ*xRD;U7+=vgTysH}VjVj3(xYi;47lmYK zEmA*LSyu((sLHx&v_a@M&;~TDM(Vq2S+Hzdh2+adzf%!j9k5CJeQW|;E5a2LTGhG5 zD7TpBy^h2?9;_(L|6rbSS+JW=&hes_i_L=v--LMu{U&)PzE=^9d4~uHWz56n>;oXc z77&b>4`Z-$|FK!v*PAc|DD2jUj2*AlFXd(;(6(#~;f@M+(w zacjUXk+;bnz9EV^SItZ7MdK!1H;tQc-L0>;#0`PTG#el_PV8!$iQ9p;Z3NIh$Svxs zCG9oi4%Ds~w+As6GEG;6R|Xsy1D`A)4YFG;UXrwqn^Dp-Zr1mq@f@}|cSXw>IFCDK z(%0^{b7@ZpV*F01STI#=~^gJyxQoGcl8nd66Do0HlpG+JShs8f0{aIqmmKOm3 zkM2*raI{oqXKSVm=HFJ)s$rH=*=(JE%aobrHr6F>6x|}V$+q!yiV3%eu{ZSr(0YWT zd+lM2D(1oHtsW!qFl#QgJJ+lOE9PKiM!?k)of<)^sKARv+PMNHMA}I=K{<%Dvq5~X zgSoVRr|^4<7I*{?0xfbwHmrg7@!eOGT-@lj6!tP&R;;dE16uC2gr#tvZgL(HHNPAU zDQS`?e>U1QgYhb4^z$?m$RprB%l0sOiwZW2td8=vJd~omTQ2xlT%fy^bRi$n&`jD$ zcxd@^-7=|#3uziH)5P+%XV>MxeK}5yZi``@ejAeLA^+3}znpir8+DiSWSK#p?Xny<#NvCiOCw{aM!x?B_3?tnApMTcAJ;kW zY1RP6>#@XI1oK{U@SB$S1P`31 zZTODEriUm8V(f4{bvNdVC1X_Lgh=}diJD?)*AzpwPSLG|4`2+Kg8jZqiA~_GmZ*z< zW*Z!v%gpqV2)0ndWm_jCuEvtUtb{PjX5a{}`<(p~O<3;9UP7N$V^ ziOk+|f2%Iz&w{Q=qzlyLE>Wt~h`bn|Y!N_)*WQ}ps8+NjVD)lYQsUqjsa=r1zG@h*5 z+2Pz)zBT0R^Q}G!uCl-Z#ASi94!cy=iIKqD{ff_aa#hFbPJ*!)&pSF+AzgaXzB{yo zZ9JDQ53^0@(>oP*^Hc4U*WoF=W1lSj9wOg!Tkspefxn9g@4o>Z + * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ + +#ifndef __ARCH_BOARD_BOARD_H +#define __ARCH_BOARD_BOARD_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include +#ifndef __ASSEMBLY__ +# include +#endif +#include + +/************************************************************************************ + * Definitions + ************************************************************************************/ + +/* Clocking *************************************************************************/ + +/* On-board crystal frequency is 24MHz (HSE) */ + +#define STM32_BOARD_XTAL 24000000ul + +/* Use the HSE output as the system clock */ + +#define STM32_SYSCLK_SW RCC_CFGR_SW_HSE +#define STM32_SYSCLK_SWS RCC_CFGR_SWS_HSE +#define STM32_SYSCLK_FREQUENCY STM32_BOARD_XTAL + +/* AHB clock (HCLK) is SYSCLK (24MHz) */ + +#define STM32_RCC_CFGR_HPRE RCC_CFGR_HPRE_SYSCLK +#define STM32_HCLK_FREQUENCY STM32_SYSCLK_FREQUENCY +#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ + +/* APB2 clock (PCLK2) is HCLK (24MHz) */ + +#define STM32_RCC_CFGR_PPRE2 RCC_CFGR_PPRE2_HCLK +#define STM32_PCLK2_FREQUENCY STM32_HCLK_FREQUENCY +#define STM32_APB2_CLKIN (STM32_PCLK2_FREQUENCY) /* Timers 2-4 */ + +/* APB2 timer 1 will receive PCLK2. */ + +#define STM32_APB2_TIM1_CLKIN (STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM15_CLKIN (STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM16_CLKIN (STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM17_CLKIN (STM32_PCLK2_FREQUENCY) + +/* APB1 clock (PCLK1) is HCLK (24MHz) */ + +#define STM32_RCC_CFGR_PPRE1 RCC_CFGR_PPRE1_HCLK +#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY) + +/* All timers run off PCLK */ + + +#define STM32_APB1_TIM2_CLKIN (STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM3_CLKIN (STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM4_CLKIN (STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM5_CLKIN (STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM6_CLKIN (STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM7_CLKIN (STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM12_CLKIN (STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM13_CLKIN (STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM14_CLKIN (STM32_PCLK1_FREQUENCY) + +/* Timer Frequencies, if APBx is set to 1, frequency is same to APBx + * otherwise frequency is 2xAPBx. + * Note: TIM1, 15-17 are on APB2, others on APB1 + */ + +#define BOARD_TIM1_FREQUENCY STM32_APB2_TIM1_CLKIN +#define BOARD_TIM2_FREQUENCY STM32_APB1_TIM2_CLKIN +#define BOARD_TIM3_FREQUENCY STM32_APB1_TIM3_CLKIN +#define BOARD_TIM4_FREQUENCY STM32_APB1_TIM4_CLKIN +#define BOARD_TIM5_FREQUENCY STM32_APB1_TIM5_CLKIN +#define BOARD_TIM6_FREQUENCY STM32_APB1_TIM6_CLKIN +#define BOARD_TIM7_FREQUENCY STM32_APB1_TIM7_CLKIN +#define BOARD_TIM12_FREQUENCY STM32_APB1_TIM12_CLKIN +#define BOARD_TIM13_FREQUENCY STM32_APB1_TIM13_CLKIN +#define BOARD_TIM14_FREQUENCY STM32_APB1_TIM14_CLKIN +#define BOARD_TIM15_FREQUENCY STM32_APB2_TIM15_CLKIN +#define BOARD_TIM16_FREQUENCY STM32_APB2_TIM16_CLKIN +#define BOARD_TIM17_FREQUENCY STM32_APB2_TIM17_CLKIN + + +/* + * Some of the USART pins are not available; override the GPIO + * definitions with an invalid pin configuration. + */ +#undef GPIO_USART2_CTS +#define GPIO_USART2_CTS 0xffffffff +#undef GPIO_USART2_RTS +#define GPIO_USART2_RTS 0xffffffff +#undef GPIO_USART2_CK +#define GPIO_USART2_CK 0xffffffff +#undef GPIO_USART3_CK +#define GPIO_USART3_CK 0xffffffff +#undef GPIO_USART3_CTS +#define GPIO_USART3_CTS 0xffffffff +#undef GPIO_USART3_RTS +#define GPIO_USART3_RTS 0xffffffff + +#endif /* __ARCH_BOARD_BOARD_H */ diff --git a/boards/px4/io-v2/nuttx-config/nsh/defconfig b/boards/px4/io-v2/nuttx-config/nsh/defconfig new file mode 100644 index 0000000..79f11ed --- /dev/null +++ b/boards/px4/io-v2/nuttx-config/nsh/defconfig @@ -0,0 +1,61 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DEV_NULL is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/px4/io-v2/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32" +CONFIG_ARCH_CHIP_STM32=y +CONFIG_ARCH_CHIP_STM32F100C8=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_ARM_MPU_EARLY_RESET=y +CONFIG_BOARD_LOOPSPERMSEC=2000 +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEFAULT_SMALL=y +CONFIG_DISABLE_MOUNTPOINT=y +CONFIG_FDCLONE_DISABLE=y +CONFIG_FDCLONE_STDIO=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=316 +CONFIG_INIT_ENTRYPOINT="user_start" +CONFIG_INIT_STACKSIZE=1100 +CONFIG_MM_FILL_ALLOCATIONS=y +CONFIG_MM_SMALL=y +CONFIG_NAME_MAX=12 +CONFIG_PREALLOC_TIMERS=0 +CONFIG_RAM_SIZE=8192 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_DISABLE_BUFFERING=y +CONFIG_STM32_ADC1=y +CONFIG_STM32_DISABLE_IDLE_SLEEP_DURING_DEBUG=y +CONFIG_STM32_DMA1=y +CONFIG_STM32_JTAG_SW_ENABLE=y +CONFIG_STM32_USART1=y +CONFIG_STM32_USART2=y +CONFIG_STM32_USART3=y +CONFIG_STM32_USART_SINGLEWIRE=y +CONFIG_TASK_NAME_SIZE=0 +CONFIG_USART1_RXBUFSIZE=64 +CONFIG_USART1_RXDMA=y +CONFIG_USART1_SERIAL_CONSOLE=y +CONFIG_USART1_TXBUFSIZE=32 +CONFIG_USART2_RXBUFSIZE=64 +CONFIG_USART2_TXBUFSIZE=64 +CONFIG_USART3_RXBUFSIZE=64 +CONFIG_USART3_RXDMA=y +CONFIG_USART3_TXBUFSIZE=64 +CONFIG_USEC_PER_TICK=1000 diff --git a/boards/px4/io-v2/nuttx-config/scripts/script.ld b/boards/px4/io-v2/nuttx-config/scripts/script.ld new file mode 100644 index 0000000..c842153 --- /dev/null +++ b/boards/px4/io-v2/nuttx-config/scripts/script.ld @@ -0,0 +1,131 @@ +/**************************************************************************** + * configs/px4io-v2/scripts/ld.script + * + * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The STM32F100C8 has 64Kb of FLASH beginning at address 0x0800:0000 and + * 8Kb of SRAM beginning at address 0x2000:0000. When booting from FLASH, + * FLASH memory is aliased to address 0x0000:0000 where the code expects to + * begin execution by jumping to the entry point in the 0x0800:0000 address + * range. + */ + +MEMORY +{ + flash (rx) : ORIGIN = 0x08001000, LENGTH = 60K + sram (rwx) : ORIGIN = 0x20000000, LENGTH = 8K +} + +OUTPUT_ARCH(arm) +ENTRY(__start) /* treat __start as the anchor for dead code stripping */ +EXTERN(_vectors) /* force the vectors to be included in the output */ + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > flash + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > flash + + .ARM.extab : { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + /* The STM32F100CB has 8Kb of SRAM beginning at the following address */ + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + . = ALIGN(4); + } > sram AT > flash + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/px4/fmu-v6x/cmake/upload.cmake b/boards/px4/io-v2/src/CMakeLists.txt similarity index 75% rename from boards/px4/fmu-v6x/cmake/upload.cmake rename to boards/px4/io-v2/src/CMakeLists.txt index 7319b46..5cef2f6 100644 --- a/boards/px4/fmu-v6x/cmake/upload.cmake +++ b/boards/px4/io-v2/src/CMakeLists.txt @@ -1,6 +1,6 @@ ############################################################################ # -# Copyright (c) 2023 PX4 Development Team. All rights reserved. +# Copyright (c) 2015 PX4 Development Team. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -31,19 +31,12 @@ # ############################################################################ - -set(PX4_FW_NAME ${PX4_BINARY_DIR}/${PX4_BOARD_VENDOR}_${PX4_BOARD_MODEL}_${PX4_BOARD_LABEL}.px4) - -add_custom_target(upload_skynode_usb - COMMAND ${PX4_SOURCE_DIR}/Tools/auterion/upload_skynode.sh --file=${PX4_FW_NAME} - DEPENDS ${PX4_FW_NAME} - COMMENT "Uploading PX4" - USES_TERMINAL +add_library(drivers_board + init.c + timer_config.cpp ) -add_custom_target(upload_skynode_wifi - COMMAND ${PX4_SOURCE_DIR}/Tools/auterion/upload_skynode.sh --file=${PX4_FW_NAME} --wifi - DEPENDS ${PX4_FW_NAME} - COMMENT "Uploading PX4" - USES_TERMINAL +target_link_libraries(drivers_board + PRIVATE + nuttx_arch ) diff --git a/boards/px4/io-v2/src/board_config.h b/boards/px4/io-v2/src/board_config.h new file mode 100644 index 0000000..e934397 --- /dev/null +++ b/boards/px4/io-v2/src/board_config.h @@ -0,0 +1,165 @@ +/**************************************************************************** + * + * Copyright (c) 2013, 2014 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file board_config.h + * + * PX4IOV2 internal definitions + */ + +#pragma once + +/****************************************************************************** + * Included Files + ******************************************************************************/ + +#include +#include +#include + +/****************************************************************************** + * Definitions + ******************************************************************************/ +/* Configuration **************************************************************/ + +/****************************************************************************** + * Serial + ******************************************************************************/ +#define PX4FMU_SERIAL_BASE STM32_USART2_BASE +#define PX4FMU_SERIAL_VECTOR STM32_IRQ_USART2 +#define PX4FMU_SERIAL_TX_GPIO GPIO_USART2_TX +#define PX4FMU_SERIAL_RX_GPIO GPIO_USART2_RX +#define PX4FMU_SERIAL_TX_DMA DMACHAN_USART2_TX +#define PX4FMU_SERIAL_RX_DMA DMACHAN_USART2_RX +#define PX4FMU_SERIAL_CLOCK STM32_PCLK1_FREQUENCY +#define PX4FMU_SERIAL_BITRATE 1500000 + +/****************************************************************************** + * GPIOS + ******************************************************************************/ + +/* LEDS **********************************************************************/ + +#define GPIO_LED_BLUE (GPIO_OUTPUT|GPIO_CNF_OUTOD|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN14) // IO-LED_BLUE or IMU_TEMPERATURE_CONTROL on Pixhawk 2.1 +#define GPIO_LED_AMBER (GPIO_OUTPUT|GPIO_CNF_OUTOD|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN15) // IO-LED_AMBER +#define GPIO_LED_SAFETY (GPIO_OUTPUT|GPIO_CNF_OUTOD|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN13) // IO-LED_SAFETY +#define GPIO_LED_GREEN (GPIO_OUTPUT|GPIO_CNF_OUTOD|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN11) // IO-LED_POWER_BREATHING + +#define GPIO_PC14 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTC|GPIO_PIN14) +#define GPIO_PC15 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTC|GPIO_PIN15) + +/* PixHawk 1: + * PC14 Floating + * PC15 Floating + * + * PixHawk 2: + * PC14 3.3v + * PC15 GND + */ +#define GPIO_SENSE_PC14_DN (GPIO_INPUT|GPIO_CNF_INPULLDWN|GPIO_MODE_INPUT|GPIO_PORTC|GPIO_PIN14) +#define GPIO_SENSE_PC15_UP (GPIO_INPUT|GPIO_CNF_INPULLUP|GPIO_MODE_INPUT|GPIO_PORTC|GPIO_PIN15) +# define SENSE_PH1 0b10 /* Floating pulled as set */ +# define SENSE_PH2 0b01 /* Driven as tied */ + +#define SENSE_PIXHAWK2() (((stm32_gpioread(GPIO_SENSE_PC15_UP) << 1 | stm32_gpioread(GPIO_SENSE_PC14_DN)) == SENSE_PH2) ? 1 : 0) + +#define LED_BLUE(on_true) (SENSE_PIXHAWK2() ? (void)0 : stm32_gpiowrite(GPIO_LED_BLUE, !(on_true))) +#define LED_AMBER(on_true) stm32_gpiowrite(GPIO_LED_AMBER, !(on_true)) +#define LED_SAFETY(on_true) stm32_gpiowrite(GPIO_LED_SAFETY, !(on_true)) +#define LED_GREEN(on_true) stm32_gpiowrite(GPIO_LED_GREEN, (on_true)) + + +/* HEATER */ +#define GPIO_HEATER_OUTPUT /* PB14 */ (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN14) +#define HEATER_OUTPUT_EN(on_true) (SENSE_PIXHAWK2() ? stm32_gpiowrite(GPIO_HEATER_OUTPUT, !(on_true)) : (void)0) + + +#define GPIO_USART1_RX_SPEKTRUM (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN10) + +/* Safety switch button *******************************************************/ + +#define GPIO_BTN_SAFETY (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN5) + +/* Power switch controls ******************************************************/ + +#define GPIO_SPEKTRUM_PWR_EN (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN13) +#define SPEKTRUM_POWER(_on_true) px4_arch_gpiowrite(GPIO_SPEKTRUM_PWR_EN, (_on_true)) + +#define SPEKTRUM_OUT(_one_true) px4_arch_gpiowrite(GPIO_USART1_RX_SPEKTRUM, (_one_true)) +#define SPEKTRUM_RX_AS_UART() px4_arch_configgpio(GPIO_USART1_RX) +#define SPEKTRUM_RX_AS_GPIO_OUTPUT() px4_arch_configgpio(GPIO_USART1_RX_SPEKTRUM) + +#define GPIO_SERVO_FAULT_DETECT (GPIO_INPUT|GPIO_CNF_INPULLUP|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN15) + +/* Analog inputs **************************************************************/ + +#define GPIO_ADC_VSERVO (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN4) + +/* the same rssi signal goes to both an adc and a timer input */ +#define GPIO_ADC_RSSI (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN5) +#define GPIO_TIM_RSSI (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN12) + +/* PWM pins **************************************************************/ + +#define GPIO_PPM (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN8) + +#define GPIO_PWM1 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN0) +#define GPIO_PWM2 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN1) +#define GPIO_PWM3 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN8) +#define GPIO_PWM4 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN9) +#define GPIO_PWM5 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN6) +#define GPIO_PWM6 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) +#define GPIO_PWM7 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN0) +#define GPIO_PWM8 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN1) + +#define DIRECT_PWM_OUTPUT_CHANNELS 8 +#define BOARD_HAS_NO_CAPTURE + +/* SBUS pins *************************************************************/ + +/* XXX these should be UART pins */ +#define GPIO_SBUS_INPUT (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN11) +#define GPIO_SBUS_OUTPUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define GPIO_SBUS_OENABLE (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN4) + +/* + * High-resolution timer + */ +#define HRT_TIMER 1 /* use timer1 for the HRT */ +#define HRT_TIMER_CHANNEL 2 /* use capture/compare channel 2 */ +#define HRT_PPM_CHANNEL 1 /* use capture/compare channel 1 PA8 */ +#define GPIO_PPM_IN (GPIO_ALT|GPIO_CNF_INPULLUP|GPIO_PORTA|GPIO_PIN8) + +#define BOARD_NUM_IO_TIMERS 3 + +#include diff --git a/boards/px4/io-v2/src/init.c b/boards/px4/io-v2/src/init.c new file mode 100644 index 0000000..404a362 --- /dev/null +++ b/boards/px4/io-v2/src/init.c @@ -0,0 +1,163 @@ +/**************************************************************************** + * + * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file init.c + * + * PX4FMU-specific early startup code. This file implements the + * stm32_boardinitialize() function that is called during cpu startup. + * + * Code here is run before the rcS script is invoked; it should start required + * subsystems and perform board-specific initialization. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include "board_config.h" + +#include + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Protected Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/************************************************************************************ + * Name: stm32_boardinitialize + * + * Description: + * All STM32 architectures must provide the following entry point. This entry point + * is called early in the intitialization -- after all memory has been configured + * and mapped but before any devices have been initialized. + * + ************************************************************************************/ + +__EXPORT void stm32_boardinitialize(void) +{ + /* configure GPIOs */ + + /* Set up for sensing HW */ + stm32_configgpio(GPIO_SENSE_PC14_DN); + stm32_configgpio(GPIO_SENSE_PC15_UP); + + /* some boards such as Pixhawk 2.1 made + the unfortunate choice to combine the blue led channel with + the IMU heater. We need a software hack to fix the hardware hack + by allowing to disable the LED / heater. + */ + if (SENSE_PIXHAWK2()) { + stm32_configgpio(GPIO_HEATER_OUTPUT); + + } else { + stm32_configgpio(GPIO_LED_BLUE); + } + + stm32_configgpio(GPIO_PC14); + stm32_configgpio(GPIO_PC15); + + + /* LEDS - default to off */ + stm32_configgpio(GPIO_LED_AMBER); + stm32_configgpio(GPIO_LED_SAFETY); + stm32_configgpio(GPIO_LED_GREEN); + + stm32_configgpio(GPIO_BTN_SAFETY); + + /* spektrum power enable is active high - enable it by default */ + stm32_configgpio(GPIO_SPEKTRUM_PWR_EN); + + stm32_configgpio(GPIO_SERVO_FAULT_DETECT); + + /* RSSI inputs */ + stm32_configgpio(GPIO_TIM_RSSI); /* xxx alternate function */ + stm32_configgpio(GPIO_ADC_RSSI); + + /* servo rail voltage */ + stm32_configgpio(GPIO_ADC_VSERVO); + + stm32_configgpio(GPIO_SBUS_INPUT); /* xxx alternate function */ + stm32_configgpio(GPIO_SBUS_OUTPUT); + + /* sbus output enable is active low - disable it by default */ + stm32_gpiowrite(GPIO_SBUS_OENABLE, true); + stm32_configgpio(GPIO_SBUS_OENABLE); + + stm32_configgpio(GPIO_PPM); /* xxx alternate function */ + + stm32_gpiowrite(GPIO_PWM1, true); + stm32_configgpio(GPIO_PWM1); + + stm32_gpiowrite(GPIO_PWM2, true); + stm32_configgpio(GPIO_PWM2); + + stm32_gpiowrite(GPIO_PWM3, true); + stm32_configgpio(GPIO_PWM3); + + stm32_gpiowrite(GPIO_PWM4, true); + stm32_configgpio(GPIO_PWM4); + + stm32_gpiowrite(GPIO_PWM5, true); + stm32_configgpio(GPIO_PWM5); + + stm32_gpiowrite(GPIO_PWM6, true); + stm32_configgpio(GPIO_PWM6); + + stm32_gpiowrite(GPIO_PWM7, true); + stm32_configgpio(GPIO_PWM7); + + stm32_gpiowrite(GPIO_PWM8, true); + stm32_configgpio(GPIO_PWM8); + + /* disable heater */ + HEATER_OUTPUT_EN(false); +} diff --git a/boards/px4/fmu-v6u/src/mtd.cpp b/boards/px4/io-v2/src/timer_config.cpp similarity index 58% rename from boards/px4/fmu-v6u/src/mtd.cpp rename to boards/px4/io-v2/src/timer_config.cpp index 644b965..bb7dfa8 100644 --- a/boards/px4/fmu-v6u/src/mtd.cpp +++ b/boards/px4/io-v2/src/timer_config.cpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (C) 2020 PX4 Development Team. All rights reserved. + * Copyright (C) 2012 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,52 +31,24 @@ * ****************************************************************************/ -#include -#include -// KiB BS nB -static const px4_mft_device_t spi5 = { // FM25V02A on FMUM 32K 512 X 64 - .bus_type = px4_mft_device_t::SPI, - .devid = SPIDEV_FLASH(0) +#include + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer2), + initIOTimer(Timer::Timer4), + initIOTimer(Timer::Timer3), }; -static const px4_mtd_entry_t fmum_fram = { - .device = &spi5, - .npart = 2, - .partd = { - { - .type = MTD_PARAMETERS, - .path = "/fs/mtd_params", - .nblocks = 32 - }, - { - .type = MTD_WAYPOINTS, - .path = "/fs/mtd_waypoints", - .nblocks = 32 - - } - }, +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer2, Timer::Channel1}, {GPIO::PortA, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer2, Timer::Channel2}, {GPIO::PortA, GPIO::Pin1}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {GPIO::PortB, GPIO::Pin8}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel4}, {GPIO::PortB, GPIO::Pin9}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel1}, {GPIO::PortA, GPIO::Pin6}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel2}, {GPIO::PortA, GPIO::Pin7}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel3}, {GPIO::PortB, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel4}, {GPIO::PortB, GPIO::Pin1}), }; -static const px4_mtd_manifest_t board_mtd_config = { - .nconfigs = 1, - .entries = { - &fmum_fram - } -}; - -static const px4_mft_entry_s mtd_mft = { - .type = MTD, - .pmft = (void *) &board_mtd_config, -}; - -static const px4_mft_s mft = { - .nmft = 1, - .mfts = { - &mtd_mft - } -}; - -const px4_mft_s *board_get_manifest(void) -{ - return &mft; -} +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/build_afts.sh b/build_afts.sh index 4c85a91..e2aa61a 100755 --- a/build_afts.sh +++ b/build_afts.sh @@ -2,8 +2,5 @@ rm -rf build/ git submodule update --recursive -#make px4_fmu-v6x_default -#make px4_fmu-v6c_default -#make px4_fmu-v6c_bootloader #make -j$(nproc) px4_fts-can -make px4_fts-can \ No newline at end of file +make px4_fts-auto \ No newline at end of file diff --git a/build_bl.sh b/build_bl.sh index 097e55c..c5b008b 100755 --- a/build_bl.sh +++ b/build_bl.sh @@ -3,4 +3,5 @@ rm -rf build/ git submodule update --recursive -make -j${nproc} px4_fmu-v6c_bootloader \ No newline at end of file +#make -j${nproc} px4_fmu-v6c_bootloader +make -j${nproc} px4_fts-can_bootloader \ No newline at end of file diff --git a/build_mfts.sh b/build_mfts.sh index 078f5ec..9f89423 100755 --- a/build_mfts.sh +++ b/build_mfts.sh @@ -1,8 +1,7 @@ #!/bin/bash -xe # BUILD MAIN-FTS FIRMWARE - +source venv/bin/activate rm -rf build/ git submodule update --recursive -#make -j$(nproc) px4_fts-can -#make -j$(nproc) px4_fts-proto -make px4_fts-proto_default \ No newline at end of file +make px4_fts-can +#make px4_fts-proto_default \ No newline at end of file diff --git a/flash_afts.sh b/flash_afts.sh new file mode 100755 index 0000000..92398e4 --- /dev/null +++ b/flash_afts.sh @@ -0,0 +1,6 @@ +#!/bin/bash -xe + +# build firmware +./build_afts.sh +# flash firmware +st-flash write build/px4_fts-auto_default/px4_fts-auto_default.bin 0x08020000 diff --git a/flash_bl.sh b/flash_bl.sh index f5db419..afeee71 100755 --- a/flash_bl.sh +++ b/flash_bl.sh @@ -1,4 +1,7 @@ #!/bin/bash -xe +# build bootloader +./build_bl.sh + # flash bootloader st-flash write build/px4_fts-can_bootloader/px4_fts-can_bootloader.bin 0x08000000 \ No newline at end of file diff --git a/flash_fw.sh b/flash_fw.sh deleted file mode 100755 index 4dbb0fd..0000000 --- a/flash_fw.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -xe - -# flash firmware -./build_mfts.sh -#st-flash write build/px4_fts-can_default/px4_fts-can_default.bin 0x08020000 -st-flash write build/px4_fts-proto_default/px4_fts-proto_default.bin 0x08020000 \ No newline at end of file diff --git a/flash_mfts.sh b/flash_mfts.sh new file mode 100755 index 0000000..762a287 --- /dev/null +++ b/flash_mfts.sh @@ -0,0 +1,7 @@ +#!/bin/bash -xe + +# build firmware +./build_mfts.sh +# flash firmware +st-flash write build/px4_fts-can_default/px4_fts-can_default.bin 0x08020000 +#st-flash write build/px4_fts-proto_default/px4_fts-proto_default.bin 0x08020000 \ No newline at end of file diff --git a/init.sh b/init.sh index 9d8d036..fb25313 100755 --- a/init.sh +++ b/init.sh @@ -1,3 +1,11 @@ #!/bin/bash -xe -sudo apt install stlink-tools \ No newline at end of file +sudo apt install stlink-tools + +sudo add-apt-repository ppa:deadsnakes/ppa +sudo apt update +sudo apt install python3.11 +sudo apt install python3.11-venv +python3.11 -m venv venv +python3 -m pip install --requirement ./Tools/setup/requirements.txt +pip install empy==3.3.4 \ No newline at end of file diff --git a/src/drivers/fts/fts.cpp b/src/drivers/fts/fts.cpp index 788e532..1eda06a 100644 --- a/src/drivers/fts/fts.cpp +++ b/src/drivers/fts/fts.cpp @@ -8,20 +8,7 @@ #include #include -#define IO_HEATER_DEVICE_PATH "/dev/px4io" -#define _IO_HEATER_BASE (0x2e00) - -#define PX4IO_HEATER_CONTROL _PX4_IOC(_IO_HEATER_BASE, 0) - -/* ... to IOX_SET_VALUE + 8 */ - -/* enum passed to IO_HEATER_CONTROL ioctl()*/ -enum IO_HEATER_MODE { - HEATER_MODE_OFF = 0, - HEATER_MODE_ON = 1, - HEATER_MODE_DISABLED = -1 -}; // Use direct calls to turn GPIO pin on/off #if !defined(GPIO_FTS_CAN_OUTPUT) || !defined(GPIO_FTS_CHUTE_OUTPUT)