From 73c51abfe3b808006089c697cb462bc5954e29f7 Mon Sep 17 00:00:00 2001 From: CUAV Chen Date: Tue, 30 Jun 2026 10:04:51 +0800 Subject: [PATCH] feat(boards): cuav/x25-mega board support (#26664) --------- Signed-off-by: Ramon Roche Co-authored-by: Hamish Willee --- .vscode/cmake-variants.yaml | 5 + Makefile | 1 + boards/cuav/x25-mega/CMakeLists.txt | 34 ++ boards/cuav/x25-mega/bootloader.px4board | 3 + boards/cuav/x25-mega/cmake/upload.cmake | 49 ++ boards/cuav/x25-mega/default.px4board | 91 +++ .../extras/cuav_x25-mega_bootloader.bin | Bin 0 -> 47164 bytes boards/cuav/x25-mega/firmware.prototype | 13 + boards/cuav/x25-mega/init/rc.board_defaults | 39 ++ boards/cuav/x25-mega/init/rc.board_sensors | 63 ++ boards/cuav/x25-mega/nuttx-config/Kconfig | 17 + .../nuttx-config/bootloader/defconfig | 95 +++ .../x25-mega/nuttx-config/include/board.h | 565 ++++++++++++++++++ .../nuttx-config/include/board_dma_map.h | 72 +++ .../cuav/x25-mega/nuttx-config/nsh/defconfig | 333 +++++++++++ .../nuttx-config/scripts/bootloader_script.ld | 215 +++++++ .../x25-mega/nuttx-config/scripts/script.ld | 229 +++++++ .../cuav/x25-mega/pwm_voltage/CMakeLists.txt | 44 ++ .../cuav/x25-mega/pwm_voltage/parameters.yaml | 13 + .../cuav/x25-mega/pwm_voltage/pwm_voltage.cpp | 56 ++ boards/cuav/x25-mega/src/CMakeLists.txt | 75 +++ boards/cuav/x25-mega/src/board_config.h | 503 ++++++++++++++++ boards/cuav/x25-mega/src/bootloader_main.c | 62 ++ boards/cuav/x25-mega/src/can.c | 123 ++++ boards/cuav/x25-mega/src/hw_config.h | 128 ++++ boards/cuav/x25-mega/src/i2c.cpp | 41 ++ boards/cuav/x25-mega/src/init.c | 277 +++++++++ boards/cuav/x25-mega/src/led.c | 236 ++++++++ boards/cuav/x25-mega/src/mtd.cpp | 102 ++++ boards/cuav/x25-mega/src/sdio.c | 177 ++++++ boards/cuav/x25-mega/src/spi.cpp | 58 ++ boards/cuav/x25-mega/src/timer_config.cpp | 90 +++ boards/cuav/x25-mega/src/usb.c | 105 ++++ .../cuav_x25-mega/x25-mega.png | Bin 0 -> 96455 bytes .../cuav_x25-mega/x25-mega_pinouts_01.png | Bin 0 -> 32136 bytes .../cuav_x25-mega/x25-mega_pinouts_02.png | Bin 0 -> 73876 bytes .../cuav_x25-mega/x25-mega_size.png | Bin 0 -> 46507 bytes docs/en/SUMMARY.md | 1 + docs/en/advanced_config/ethernet_setup.md | 1 + docs/en/assembly/quick_start_cuav_x25_evo.md | 2 + .../autopilot_manufacturer_supported.md | 1 + docs/en/flight_controller/cuav_x25-mega.md | 199 ++++++ 42 files changed, 4118 insertions(+) create mode 100644 boards/cuav/x25-mega/CMakeLists.txt create mode 100644 boards/cuav/x25-mega/bootloader.px4board create mode 100644 boards/cuav/x25-mega/cmake/upload.cmake create mode 100644 boards/cuav/x25-mega/default.px4board create mode 100755 boards/cuav/x25-mega/extras/cuav_x25-mega_bootloader.bin create mode 100644 boards/cuav/x25-mega/firmware.prototype create mode 100644 boards/cuav/x25-mega/init/rc.board_defaults create mode 100644 boards/cuav/x25-mega/init/rc.board_sensors create mode 100644 boards/cuav/x25-mega/nuttx-config/Kconfig create mode 100644 boards/cuav/x25-mega/nuttx-config/bootloader/defconfig create mode 100644 boards/cuav/x25-mega/nuttx-config/include/board.h create mode 100644 boards/cuav/x25-mega/nuttx-config/include/board_dma_map.h create mode 100644 boards/cuav/x25-mega/nuttx-config/nsh/defconfig create mode 100644 boards/cuav/x25-mega/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/cuav/x25-mega/nuttx-config/scripts/script.ld create mode 100644 boards/cuav/x25-mega/pwm_voltage/CMakeLists.txt create mode 100644 boards/cuav/x25-mega/pwm_voltage/parameters.yaml create mode 100644 boards/cuav/x25-mega/pwm_voltage/pwm_voltage.cpp create mode 100644 boards/cuav/x25-mega/src/CMakeLists.txt create mode 100644 boards/cuav/x25-mega/src/board_config.h create mode 100644 boards/cuav/x25-mega/src/bootloader_main.c create mode 100644 boards/cuav/x25-mega/src/can.c create mode 100644 boards/cuav/x25-mega/src/hw_config.h create mode 100644 boards/cuav/x25-mega/src/i2c.cpp create mode 100644 boards/cuav/x25-mega/src/init.c create mode 100644 boards/cuav/x25-mega/src/led.c create mode 100644 boards/cuav/x25-mega/src/mtd.cpp create mode 100644 boards/cuav/x25-mega/src/sdio.c create mode 100644 boards/cuav/x25-mega/src/spi.cpp create mode 100644 boards/cuav/x25-mega/src/timer_config.cpp create mode 100644 boards/cuav/x25-mega/src/usb.c create mode 100644 docs/assets/flight_controller/cuav_x25-mega/x25-mega.png create mode 100644 docs/assets/flight_controller/cuav_x25-mega/x25-mega_pinouts_01.png create mode 100644 docs/assets/flight_controller/cuav_x25-mega/x25-mega_pinouts_02.png create mode 100644 docs/assets/flight_controller/cuav_x25-mega/x25-mega_size.png create mode 100644 docs/en/flight_controller/cuav_x25-mega.md diff --git a/.vscode/cmake-variants.yaml b/.vscode/cmake-variants.yaml index 377c19da98f..d4930359683 100644 --- a/.vscode/cmake-variants.yaml +++ b/.vscode/cmake-variants.yaml @@ -346,6 +346,11 @@ CONFIG: buildType: MinSizeRel settings: CONFIG: cuav_x25-super_default + cuav_x25-mega_default: + short: cuav_x25-mega + buildType: MinSizeRel + settings: + CONFIG: cuav_x25-mega_default cubepilot_cubeorange_test: short: cubepilot_cubeorange buildType: MinSizeRel diff --git a/Makefile b/Makefile index 563b8d2f0ed..fd7cb7e82d3 100644 --- a/Makefile +++ b/Makefile @@ -371,6 +371,7 @@ bootloaders_update: \ cuav_fmu-v6x_bootloader \ cuav_x25-evo_bootloader \ cuav_x25-super_bootloader \ + cuav_x25-mega_bootloader \ cubepilot_cubeorange_bootloader \ cubepilot_cubeorangeplus_bootloader \ hkust_nxt-dual_bootloader \ diff --git a/boards/cuav/x25-mega/CMakeLists.txt b/boards/cuav/x25-mega/CMakeLists.txt new file mode 100644 index 00000000000..e0d6a245165 --- /dev/null +++ b/boards/cuav/x25-mega/CMakeLists.txt @@ -0,0 +1,34 @@ +############################################################################ +# +# Copyright (c) 2026 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. +# +############################################################################ + +add_subdirectory(pwm_voltage) diff --git a/boards/cuav/x25-mega/bootloader.px4board b/boards/cuav/x25-mega/bootloader.px4board new file mode 100644 index 00000000000..19b6e662be6 --- /dev/null +++ b/boards/cuav/x25-mega/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/cuav/x25-mega/cmake/upload.cmake b/boards/cuav/x25-mega/cmake/upload.cmake new file mode 100644 index 00000000000..b1ed6e79731 --- /dev/null +++ b/boards/cuav/x25-mega/cmake/upload.cmake @@ -0,0 +1,49 @@ +############################################################################ +# +# Copyright (c) 2026 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. +# +############################################################################ + + +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_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 +) diff --git a/boards/cuav/x25-mega/default.px4board b/boards/cuav/x25-mega/default.px4board new file mode 100644 index 00000000000..f629f438ab5 --- /dev/null +++ b/boards/cuav/x25-mega/default.px4board @@ -0,0 +1,91 @@ +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/ttyS1" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS6" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS4" +CONFIG_BOARD_SERIAL_EXT2="/dev/ttyS3" +CONFIG_DRIVERS_ADC_ADS1115=y +CONFIG_DRIVERS_ADC_BOARD_ADC=y +CONFIG_DRIVERS_BAROMETER_BMP581=y +CONFIG_DRIVERS_BAROMETER_INVENSENSE_ICP201XX=y +CONFIG_DRIVERS_CAMERA_CAPTURE=y +CONFIG_DRIVERS_CAMERA_TRIGGER=y +CONFIG_DRIVERS_CDCACM_AUTOSTART=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_ANALOG_DEVICES_ADIS16607=y +CONFIG_DRIVERS_IMU_INVENSENSE_IIM42652=y +CONFIG_DRIVERS_IMU_INVENSENSE_IIM42653=y +CONFIG_COMMON_LIGHT=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_DRIVERS_OSD_MSP_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_RC_INPUT=y +CONFIG_DRIVERS_SAFETY_BUTTON=y +CONFIG_DRIVERS_TONE_ALARM=y +CONFIG_DRIVERS_UAVCAN=y +CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE=2 +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_RATE_CONTROL=y +CONFIG_MODULES_GIMBAL=y +CONFIG_MODULES_GYRO_CALIBRATION=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_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_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_ARCH_CHIP_STM32H7=y diff --git a/boards/cuav/x25-mega/extras/cuav_x25-mega_bootloader.bin b/boards/cuav/x25-mega/extras/cuav_x25-mega_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..850b5ccb92fd80ae7ed46ccc763f494eb19ff951 GIT binary patch literal 47164 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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_CUAV_X25_MEGA_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_CUAV_X25_MEGA_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 CUAV X25-MEGA 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_ADCSRC RCC_D3CCIPR_ADCSEL_PLL2 + +/* UART clock selection */ +/* reset to default to overwrite any changes done by any bootloader */ + +#define STM32_RCC_D2CCIP2R_USART234578_SEL RCC_D2CCIP2R_USART234578SEL_RCC +#define STM32_RCC_D2CCIP2R_USART16_SEL RCC_D2CCIP2R_USART16SEL_RCC + +/* 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 */ +#undef GPIO_UART5_CTS +#define GPIO_UART5_CTS ((GPIO_ALT|GPIO_AF8|GPIO_PORTC|GPIO_PIN9) | GPIO_PULLDOWN) + +#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_50MHz)) + +#define GPIO_SPI1_MISO ADJ_SLEW_RATE(GPIO_SPI1_MISO_3) /* PG9 */ +#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_2 /* PB5 */ +#define GPIO_SPI1_SCK GPIO_SPI1_SCK_1 /* PA5 */ + +#define GPIO_SPI2_MISO ADJ_SLEW_RATE(GPIO_SPI2_MISO_3) /* PI2 */ +#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_4 /* PI3 */ +#define GPIO_SPI2_SCK GPIO_SPI2_SCK_6 /* PI1 */ + +#define GPIO_SPI4_MISO ADJ_SLEW_RATE(GPIO_SPI4_MISO_1) /* PE13 */ +#define GPIO_SPI4_MOSI GPIO_SPI4_MOSI_1 /* PE14 */ +#define GPIO_SPI4_SCK GPIO_SPI4_SCK_1 /* PE12 */ + +#define GPIO_SPI5_MISO ADJ_SLEW_RATE(GPIO_SPI5_MISO_2) /* PH7 */ +#define GPIO_SPI5_MOSI GPIO_SPI5_MOSI_1 /* PF11 */ +#define GPIO_SPI5_SCK GPIO_SPI5_SCK_1 /* PF7 */ + +#define GPIO_SPI6_MISO ADJ_SLEW_RATE(GPIO_SPI6_MISO_2) /* PA6 */ +#define GPIO_SPI6_MOSI GPIO_SPI6_MOSI_1 /* PG14 */ +#define GPIO_SPI6_SCK 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_CUAV_X25_MEGA_INCLUDE_BOARD_H */ diff --git a/boards/cuav/x25-mega/nuttx-config/include/board_dma_map.h b/boards/cuav/x25-mega/nuttx-config/include/board_dma_map.h new file mode 100644 index 00000000000..8688d2666c8 --- /dev/null +++ b/boards/cuav/x25-mega/nuttx-config/include/board_dma_map.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * Copyright (c) 2026 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 ADIS16607 */ +#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* 2 DMA1:38 ADIS16607 */ + +#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* 3 DMA1:39 IIM42652 */ +#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* 4 DMA1:40 IIM42652 */ + +#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* DMA1:43 GPS1 */ +#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* DMA1:44 GPS1 */ + +// 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_SPI4_RX DMAMAP_DMA12_SPI4RX_1 /* 1 DMA2:61 RM3100 and BMP581 */ +#define DMAMAP_SPI4_TX DMAMAP_DMA12_SPI4TX_1 /* 2 DMA2:62 RM3100 and BMP581 */ + +#define DMAMAP_SPI5_RX DMAMAP_DMA12_SPI5RX_1 /* 1 DMA2:61 IIM42653 */ +#define DMAMAP_SPI5_TX DMAMAP_DMA12_SPI5TX_1 /* 2 DMA2:62 IIM42653 */ + +#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 */ + +// 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/cuav/x25-mega/nuttx-config/nsh/defconfig b/boards/cuav/x25-mega/nuttx-config/nsh/defconfig new file mode 100644 index 00000000000..875cc455fc0 --- /dev/null +++ b/boards/cuav/x25-mega/nuttx-config/nsh/defconfig @@ -0,0 +1,333 @@ +# +# 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/cuav/x25-mega/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743XI=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=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x004c +CONFIG_CDCACM_PRODUCTSTR="PX4 CUAV X25-MEGA" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x3163 +CONFIG_CDCACM_VENDORSTR="CUAV" +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=3194 +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_EMULATE_PAGE_SHIFT=6 +CONFIG_RAMTRON_EMULATE_SECTOR_SHIFT=6 +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_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=1024 +CONFIG_STM32H7_SPI4=y +CONFIG_STM32H7_SPI4_DMA=y +CONFIG_STM32H7_SPI4_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI5=y +CONFIG_STM32H7_SPI5_DMA=y +CONFIG_STM32H7_SPI5_DMA_BUFFER=1024 +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_TIM8=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_SYSTEM_SYSTEM=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=10000 +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_RXDMA=y +CONFIG_USART1_TXBUFSIZE=1500 +CONFIG_USART1_TXDMA=y +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 diff --git a/boards/cuav/x25-mega/nuttx-config/scripts/bootloader_script.ld b/boards/cuav/x25-mega/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 00000000000..cbef5dc6502 --- /dev/null +++ b/boards/cuav/x25-mega/nuttx-config/scripts/bootloader_script.ld @@ -0,0 +1,215 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2026 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/cuav/x25-mega/nuttx-config/scripts/script.ld b/boards/cuav/x25-mega/nuttx-config/scripts/script.ld new file mode 100644 index 00000000000..50fb8f85535 --- /dev/null +++ b/boards/cuav/x25-mega/nuttx-config/scripts/script.ld @@ -0,0 +1,229 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2026 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/cuav/x25-mega/pwm_voltage/CMakeLists.txt b/boards/cuav/x25-mega/pwm_voltage/CMakeLists.txt new file mode 100644 index 00000000000..c1f804f46cb --- /dev/null +++ b/boards/cuav/x25-mega/pwm_voltage/CMakeLists.txt @@ -0,0 +1,44 @@ +############################################################################ +# +# Copyright (c) 2026 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. +# +############################################################################ + +px4_add_module( + MODULE modules__pwm_voltage_apply + MAIN pwm_voltage_apply + + SRCS + pwm_voltage.cpp + MODULE_CONFIG + parameters.yaml + DEPENDS + px4_work_queue + ) diff --git a/boards/cuav/x25-mega/pwm_voltage/parameters.yaml b/boards/cuav/x25-mega/pwm_voltage/parameters.yaml new file mode 100644 index 00000000000..82a36ce833e --- /dev/null +++ b/boards/cuav/x25-mega/pwm_voltage/parameters.yaml @@ -0,0 +1,13 @@ +module_name: pwm_voltage +parameters: +- group: PWM Outputs + definitions: + PWM_VOLT_SEL: + description: + short: Control PWM output voltage + type: enum + values: + 0: 3.3V + 1: 5.0V + default: 0 + reboot_required: true diff --git a/boards/cuav/x25-mega/pwm_voltage/pwm_voltage.cpp b/boards/cuav/x25-mega/pwm_voltage/pwm_voltage.cpp new file mode 100644 index 00000000000..5507de1965c --- /dev/null +++ b/boards/cuav/x25-mega/pwm_voltage/pwm_voltage.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * Copyright (c) 2026 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 +#include + +#include "board_config.h" + +extern "C" int pwm_voltage_apply_main(int argc, char *argv[]) +{ + int32_t pwm_volt_sel = 0; + + param_get(param_find("PWM_VOLT_SEL"), &pwm_volt_sel); + + if (pwm_volt_sel != 0) { + PWM_5V_VOLT_SEL(true); + + } else { + PWM_5V_VOLT_SEL(false); + } + + return 0; +} diff --git a/boards/cuav/x25-mega/src/CMakeLists.txt b/boards/cuav/x25-mega/src/CMakeLists.txt new file mode 100644 index 00000000000..90734af2cba --- /dev/null +++ b/boards/cuav/x25-mega/src/CMakeLists.txt @@ -0,0 +1,75 @@ +############################################################################ +# +# Copyright (c) 2026 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 + 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/cuav/x25-mega/src/board_config.h b/boards/cuav/x25-mega/src/board_config.h new file mode 100644 index 00000000000..3fc87b1bc2b --- /dev/null +++ b/boards/cuav/x25-mega/src/board_config.h @@ -0,0 +1,503 @@ +/**************************************************************************** + * + * Copyright (c) 2016-2026 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 + * + * CUAV X25-MEGA internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include + + +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +#undef TRACE_PINS + +/* Configuration ************************************************************************************/ + +#define BOARD_HAS_LTC44XX_VALIDS 2 // N Bricks +#define BOARD_HAS_USB_VALID 1 // LTC Has USB valid +#define BOARD_HAS_NBAT_V 2 // 2 Digital Voltage +#define BOARD_HAS_NBAT_I 2 // 2 Digital Current + +/* PX4FMU GPIOs ***********************************************************************************/ + +/* LEDs are driven with push open drain to support Anode to 5V or 3.3V or used as TRACE0-2 */ + +# 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 + +/* CAN Silence Silent mode control */ + +#define GPIO_CAN1_SILENT_S0 /* PE2 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN2) +#define GPIO_CAN2_SILENT_S1 /* PI8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN8) + +/* SPI */ + +#define SPI6_nRESET_EXTERNAL1 /* PF10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN10) + +/* I2C busses */ + +/* Devices on the onboard buses. + * + * Note that these are unshifted addresses. + */ +#define BOARD_MTD_NUM_EEPROM 1 /* MTD: imu_eeprom*/ + +#define GPIO_I2C4_DRDY1_ICP20100 /* 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, \ + /* PB1 */ GPIO_ADC12_INP5, \ + /* PC0 */ GPIO_ADC123_INP10, \ + /* PC3 */ GPIO_ADC12_INP13, \ + /* PF12 */ GPIO_ADC1_INP6, \ + /* PH3 */ GPIO_ADC3_INP14, \ + /* PH4 */ GPIO_ADC3_INP15 + +// TODO: PF3 ADC3 6V6 +/* 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_V5_CHANNEL /* PB1 */ ADC1_CH(5) +#define ADC_RSSI_IN_CHANNEL /* PC0 */ ADC1_CH(10) +#define ADC_ADC3_3V3_CHANNEL /* PC3 */ ADC3_CH(13) +#define ADC_SERVO_VDD_SENSORS_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_V5_CHANNEL) | \ + (1 << ADC_RSSI_IN_CHANNEL) | \ + (1 << ADC_ADC3_3V3_CHANNEL) | \ + (1 << ADC_SERVO_VDD_SENSORS_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) + +#define BOARD_ADC_BRICK_VALID 1 + +/* HW Version and Revision drive signals Default to 1 to detect */ +// #define BOARD_HAS_HW_SPLIT_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 + +/* HEATER */ +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 2 +#define GPIO_HEATER1_OUTPUT /* PB10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) +#define GPIO_HEATER2_OUTPUT /* PE6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN6) +#define HEATER2_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER2_OUTPUT, (on_true)) + +/* PE7 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 /* PE7 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN7) +#define GPIO_nARMED /* PE7 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN7) +#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 16 + +/* PWM Power */ +#define GPIO_PWM_VOLT_SEL /* PG8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN8) +#define PWM_5V_VOLT_SEL(on_true) px4_arch_gpiowrite(GPIO_PWM_VOLT_SEL, (on_true)) + +/* Power supply control and monitoring GPIOs */ + +#define GPIO_nPOWER_IN_A /* PJ1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|GPIO_PIN1) +#define GPIO_nPOWER_IN_B /* PJ2 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|GPIO_PIN2) +#define GPIO_nPOWER_IN_C /* PJ3 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|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_3V3_SD_CARD_EN /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) +#define GPIO_VDD_5V_PERIPH_nOC /* PE15 */ (GPIO_INPUT |GPIO_PULLUP|GPIO_PORTE|GPIO_PIN15) +#define GPIO_VDD_5V_HIPOWER_nOC /* PF13 */ (GPIO_INPUT |GPIO_PULLUP|GPIO_PORTF|GPIO_PIN13) +#define GPIO_VDD_5V_PERIPH_EN /* PG4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN4) +#define GPIO_VDD_5V_HIPOWER_EN /* PG10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN10) +#define GPIO_VDD_PWM_POWER_EN /* PH2 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN2) +#define GPIO_VDD_3V3_SENSORS1_EN /* PI11 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN11) +#define GPIO_VDD_3V3_SENSORS3_EN /* PI4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN4) +#define GPIO_VDD_5V_RC_EN /* PJ5 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTJ|GPIO_PIN5) + + +/* Spare GPIO */ + +#define GPIO_PA10 /* PA10 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN10) +#define GPIO_PA15 /* PA15 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN15) +#define BATT_VOLTAGE_SENS /* PB0 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN0) +#define SPI3_MOSI /* PB2 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN2) +#define BATT_CURRENT_SENS /* PC0 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN0) +#define SPI3_SCK /* PC10 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN10) +#define SPI3_MISO /* PC11 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN11) +#define GPIO_ADC_6V6 /* PF3 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTF|GPIO_PIN3) +#define GPIO_PG2 /* PG2 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN2) +#define GPIO_PI9 /* PI9 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTI|GPIO_PIN9) +#define GPIO_PI12 /* PI12 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTI|GPIO_PIN12) +#define GPIO_PI13 /* PI13 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTI|GPIO_PIN13) +#define GPIO_PI14 /* PI14 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTI|GPIO_PIN14) +#define GPIO_PI15 /* PI15 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTI|GPIO_PIN15) +#define GPIO_PJ7 /* PJ7 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|GPIO_PIN7) +#define GPIO_PJ8 /* PJ8 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|GPIO_PIN8) +#define GPIO_PJ10 /* PJ10 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|GPIO_PIN10) +#define GPIO_PJ13 /* PJ13 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|GPIO_PIN13) +#define GPIO_PJ14 /* PJ14 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|GPIO_PIN14) +#define GPIO_PJ15 /* PJ15 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTJ|GPIO_PIN15) +#define GPIO_PK0 /* PK0 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTK|GPIO_PIN0) +#define GPIO_PK1 /* PK1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTK|GPIO_PIN1) +#define GPIO_PK2 /* PK2 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTK|GPIO_PIN2) +#define GPIO_PK3 /* PK3 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTK|GPIO_PIN3) +#define GPIO_PK4 /* PK4 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTK|GPIO_PIN4) +#define GPIO_PK5 /* PK5 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTK|GPIO_PIN5) +#define GPIO_PK6 /* PK6 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTK|GPIO_PIN6) +#define GPIO_PK7 /* PK7 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTK|GPIO_PIN7) + +/* ETHERNET GPIO */ + +#define GPIO_ETH_POWER_EN /* PG15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|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_EN, (on_true)) +#define VDD_5V_HIPOWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_5V_HIPOWER_EN, (on_true)) +#define VDD_PWM_POWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_PWM_POWER_EN, (on_true)) +#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)) +#define VDD_3V3_SENSORS1_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SENSORS1_EN, (on_true)) +#define VDD_3V3_SENSORS3_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SENSORS3_EN, (on_true)) +#define VDD_5V_RC_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_5V_RC_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 3 /* use timer3 for the HRT */ +#define HRT_TIMER_CHANNEL 2 /* use capture/compare channel 2 */ + +#define HRT_PPM_CHANNEL /* T3C1 */ 1 /* use capture/compare channel 1 */ +#define GPIO_PPM_IN /* PC6 T3C1 */ GPIO_TIM3_CH1IN_3 + +/* RC Serial port (unused) */ + +#define RC_SERIAL_PORT "/dev/ttyS5" +#define RC_SERIAL_SINGLEWIRE + +/* 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 */ + +/* + * X25-MEGA 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_PORTC|GPIO_PIN6) +#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)) + +// /* RSSI_IN */ +#define GPIO_RSSI_IN /* PC0 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN0) + +#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 + +#define PX4_GPIO_INIT_LIST { \ + PX4_ADC_GPIO, \ + GPIO_HW_VER_REV_DRIVE, \ + GPIO_CAN1_TX, \ + GPIO_CAN1_RX, \ + GPIO_CAN2_TX, \ + GPIO_CAN2_RX, \ + GPIO_CAN1_SILENT_S0, \ + GPIO_CAN2_SILENT_S1, \ + GPIO_HEATER1_OUTPUT, \ + GPIO_HEATER2_OUTPUT, \ + GPIO_nPOWER_IN_A, \ + GPIO_nPOWER_IN_B, \ + GPIO_nPOWER_IN_C, \ + GPIO_VDD_5V_PERIPH_EN, \ + GPIO_VDD_5V_PERIPH_nOC, \ + GPIO_VDD_5V_HIPOWER_EN, \ + GPIO_VDD_5V_HIPOWER_nOC, \ + GPIO_VDD_PWM_POWER_EN, \ + GPIO_VDD_3V3_SD_CARD_EN, \ + GPIO_VDD_3V3_SENSORS3_EN, \ + GPIO_VDD_3V3_SENSORS1_EN, \ + GPIO_VDD_5V_RC_EN, \ + GPIO_ETH_POWER_EN, \ + GPIO_TONE_ALARM_IDLE, \ + GPIO_nSAFETY_SWITCH_LED_OUT, \ + GPIO_SAFETY_SWITCH_IN, \ + GPIO_nARMED_INIT, \ + GPIO_PWM_VOLT_SEL, \ + GPIO_PA10, \ + GPIO_PA15, \ + BATT_VOLTAGE_SENS, \ + SPI3_MOSI, \ + BATT_CURRENT_SENS, \ + SPI3_SCK, \ + SPI3_MISO, \ + GPIO_ADC_6V6, \ + GPIO_PG2, \ + GPIO_PI9, \ + GPIO_PI12, \ + GPIO_PI13, \ + GPIO_PI14, \ + GPIO_PI15, \ + GPIO_PJ7, \ + GPIO_PJ8, \ + GPIO_PJ10, \ + GPIO_PJ13, \ + GPIO_PJ14, \ + GPIO_PJ15, \ + GPIO_PK0, \ + GPIO_PK1, \ + GPIO_PK2, \ + GPIO_PK3, \ + GPIO_PK4, \ + GPIO_PK5, \ + GPIO_PK6, \ + GPIO_PK7, \ + } + +#define BOARD_ENABLE_CONSOLE_BUFFER + +#define PX4_I2C_BUS_MTD 4 + + +#define BOARD_NUM_IO_TIMERS 5 +#define BOARD_SPI_BUS_MAX_BUS_ITEMS 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/cuav/x25-mega/src/bootloader_main.c b/boards/cuav/x25-mega/src/bootloader_main.c new file mode 100644 index 00000000000..d61cbe306c5 --- /dev/null +++ b/boards/cuav/x25-mega/src/bootloader_main.c @@ -0,0 +1,62 @@ +/**************************************************************************** + * + * Copyright (c) 2019-2026 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); + +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/cuav/x25-mega/src/can.c b/boards/cuav/x25-mega/src/can.c new file mode 100644 index 00000000000..f8095ee9552 --- /dev/null +++ b/boards/cuav/x25-mega/src/can.c @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * Copyright (C) 2026 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 x25-mega_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" + +/************************************************************************************ + * 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/cuav/x25-mega/src/hw_config.h b/boards/cuav/x25-mega/src/hw_config.h new file mode 100644 index 00000000000..85050f9da94 --- /dev/null +++ b/boards/cuav/x25-mega/src/hw_config.h @@ -0,0 +1,128 @@ +/* + * 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 7004 +#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/cuav/x25-mega/src/i2c.cpp b/boards/cuav/x25-mega/src/i2c.cpp new file mode 100644 index 00000000000..1d363cfe27c --- /dev/null +++ b/boards/cuav/x25-mega/src/i2c.cpp @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * Copyright (C) 2026 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/cuav/x25-mega/src/init.c b/boards/cuav/x25-mega/src/init.c new file mode 100644 index 00000000000..96a6386fd6c --- /dev/null +++ b/boards/cuav/x25-mega/src/init.c @@ -0,0 +1,277 @@ +/**************************************************************************** + * + * Copyright (c) 2012-2026 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); + VDD_3V3_SENSORS1_EN(false); + VDD_3V3_SENSORS3_EN(false); + + board_control_spi_sensors_power(false, 0xffff); + + /* 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 */ + board_control_spi_sensors_power(true, 0xffff); + VDD_5V_PERIPH_EN(true); + VDD_3V3_SENSORS1_EN(true); + VDD_3V3_SENSORS3_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(100); + } +} + +/************************************************************************************ + * 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_PWM_POWER_EN(true); + VDD_3V3_SENSORS1_EN(true); + VDD_3V3_SENSORS3_EN(true); + VDD_5V_RC_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(); + + /* 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/cuav/x25-mega/src/led.c b/boards/cuav/x25-mega/src/led.c new file mode 100644 index 00000000000..4e468eeae39 --- /dev/null +++ b/boards/cuav/x25-mega/src/led.c @@ -0,0 +1,236 @@ +/**************************************************************************** + * + * Copyright (c) 2026 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 fmu_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 + GPIO_nSAFETY_SWITCH_LED_OUT, // 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/cuav/x25-mega/src/mtd.cpp b/boards/cuav/x25-mega/src/mtd.cpp new file mode 100644 index 00000000000..cf072058c9a --- /dev/null +++ b/boards/cuav/x25-mega/src/mtd.cpp @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * Copyright (C) 2026 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 +#include +// KiB BS nB +static const px4_mft_device_t spi5 = { // FM25V05A on FMUM native: 64K X 8, emulated as (1024 Blocks of 64) + .bus_type = px4_mft_device_t::SPI, + .devid = SPIDEV_FLASH(0) +}; +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 = 1, + .partd = { + { + .type = MTD_PARAMETERS, + .path = "/fs/mtd_params", + .nblocks = (65536 / (1 << CONFIG_RAMTRON_EMULATE_SECTOR_SHIFT)) + } + }, +}; + +static const px4_mtd_entry_t imu_eeprom = { + .device = &i2c4, + .npart = 2, + .partd = { + { + .type = MTD_CALDATA, + .path = "/fs/mtd_caldata", + .nblocks = 248 + }, + { + .type = MTD_NET, + .path = "/fs/mtd_net", + .nblocks = 8 // 256 = 32 * 8 + } + }, +}; + +static const px4_mtd_manifest_t board_mtd_config = { + .nconfigs = 2, + .entries = { + &fmum_fram, + &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/cuav/x25-mega/src/sdio.c b/boards/cuav/x25-mega/src/sdio.c new file mode 100644 index 00000000000..3c295fdf958 --- /dev/null +++ b/boards/cuav/x25-mega/src/sdio.c @@ -0,0 +1,177 @@ +/**************************************************************************** + * + * Copyright (C) 2014, 2026 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/cuav/x25-mega/src/spi.cpp b/boards/cuav/x25-mega/src/spi.cpp new file mode 100644 index 00000000000..8eb76b7abd8 --- /dev/null +++ b/boards/cuav/x25-mega/src/spi.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** + * + * Copyright (C) 2020, 2026 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_ADIS16607, SPI::CS{GPIO::PortJ, GPIO::Pin11}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), + }, {GPIO::PortF, GPIO::Pin4}), + initSPIBus(SPI::Bus::SPI2, { + initSPIDevice(DRV_IMU_DEVTYPE_IIM42652, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortG, GPIO::Pin3}), + }, {GPIO::PortI, GPIO::Pin4}), + initSPIBus(SPI::Bus::SPI4, { + initSPIDevice(DRV_MAG_DEVTYPE_RM3100, SPI::CS{GPIO::PortH, GPIO::Pin15}, SPI::DRDY{GPIO::PortG, GPIO::Pin1}), + initSPIDevice(DRV_BARO_DEVTYPE_BMP581, SPI::CS{GPIO::PortJ, GPIO::Pin6}, SPI::DRDY{GPIO::PortJ, GPIO::Pin0}), + }, {GPIO::PortJ, GPIO::Pin4}), + initSPIBus(SPI::Bus::SPI5, { + initSPIDevice(DRV_IMU_DEVTYPE_IIM42653, SPI::CS{GPIO::PortJ, GPIO::Pin12}, SPI::DRDY{GPIO::PortG, GPIO::Pin6}), + initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}), + }, {GPIO::PortI, GPIO::Pin11}), + initSPIBusExternal(SPI::Bus::SPI6, { + initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/cuav/x25-mega/src/timer_config.cpp b/boards/cuav/x25-mega/src/timer_config.cpp new file mode 100644 index 00000000000..aa9e2c073ef --- /dev/null +++ b/boards/cuav/x25-mega/src/timer_config.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * Copyright (C) 2026 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 PI0 + * TIM5_CH3 T FMU_CH2 PH12 + * TIM5_CH2 T FMU_CH3 PH11 + * TIM5_CH1 T FMU_CH4 PH10 + * TIM4_CH2 T FMU_CH5 PD13 + * TIM4_CH3 T FMU_CH6 PD14 + * TIM4_CH1 T FMU_CH7 PD12 + * TIM4_CH4 T FMU_CH8 PD15 + * + * + * TIM1_CH2 T FMU_CAP1 < Capture PE11 + * TIM1_CH1 T FMU_CAP2 < Capture PE9 + * TIM1_CH3 T FMU_CAP3 < Capture PJ9 + * TIM8_CH2 T FMU_CAP4 < Capture PI6 + * TIM8_CH3 T FMU_CAP5 < Capture PI7 + * TIM8_CH1 T FMU_CAP6 < Capture PI5 + * TIM12_CH1 T FMU_CAP7 < Capture PH6 + * TIM12_CH2 T FMU_CAP8 < Capture PH9 + * + * + * 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::Timer1), + initIOTimer(Timer::Timer8), + initIOTimer(Timer::Timer12), +}; + +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::Timer4, Timer::Channel1}, {GPIO::PortD, GPIO::Pin12}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel4}, {GPIO::PortD, GPIO::Pin15}), + initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel2}, {GPIO::PortE, GPIO::Pin11}), + initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel1}, {GPIO::PortE, GPIO::Pin9}), + initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel3}, {GPIO::PortJ, GPIO::Pin9}), + initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel2}, {GPIO::PortI, GPIO::Pin6}), + initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel3}, {GPIO::PortI, GPIO::Pin7}), + initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel1}, {GPIO::PortI, GPIO::Pin5}), + initIOTimerChannelCapture(io_timers, {Timer::Timer12, Timer::Channel1}, {GPIO::PortH, GPIO::Pin6}), + initIOTimerChannelCapture(io_timers, {Timer::Timer12, Timer::Channel2}, {GPIO::PortH, GPIO::Pin9}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/cuav/x25-mega/src/usb.c b/boards/cuav/x25-mega/src/usb.c new file mode 100644 index 00000000000..0a6e88c6b98 --- /dev/null +++ b/boards/cuav/x25-mega/src/usb.c @@ -0,0 +1,105 @@ +/**************************************************************************** + * + * Copyright (C) 2026 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/docs/assets/flight_controller/cuav_x25-mega/x25-mega.png b/docs/assets/flight_controller/cuav_x25-mega/x25-mega.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b39764dfa063a4be37c475ad0cfc5e2f47a455 GIT binary patch literal 96455 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

    5c`=IR>wL?1is9(?b3rSg@|Py# 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 B(|P~^ literal 0 HcmV?d00001 diff --git a/docs/assets/flight_controller/cuav_x25-mega/x25-mega_pinouts_02.png b/docs/assets/flight_controller/cuav_x25-mega/x25-mega_pinouts_02.png new file mode 100644 index 0000000000000000000000000000000000000000..119fb5eeb192750207b7dd4b3351ea9c5b7c727b GIT binary patch literal 73876 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 U!Y{;R=>N^qRMiC|mF=Sb4?I)TP5=M^ literal 0 HcmV?d00001 diff --git a/docs/assets/flight_controller/cuav_x25-mega/x25-mega_size.png b/docs/assets/flight_controller/cuav_x25-mega/x25-mega_size.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4b822e2f08ef0a29c32c823297a61bc1f5af5c GIT binary patch literal 46507 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 + +::: warning +PX4 does not manufacture this (or any) autopilot. +Contact the [manufacturer](https://store.cuav.net/) for hardware support or compliance issues. +::: + +The _X25-MEGA_ is an advanced autopilot manufactured by CUAV®. + +The autopilot is recommended for commercial system integration but is also suitable for academic research and any other applications. + +![X25-MEGA AutoPilot - hero image](../../assets/flight_controller/cuav_x25-mega/x25-mega.png) + +The X25-MEGA brings you ultimate performance, stability, and reliability in every aspect. + +::: info +These flight controllers are [manufacturer supported](../flight_controller/autopilot_manufacturer_supported.md). +::: + +### Features + +- Arm® Cortex-M7® processor (STM32H743XI) with Floating-Point Unit (FPU), operating at 480MHz, and featuring 2MB Flash memory. + Enables developers to enhance productivity and efficiency, allowing for more complex algorithms and models. +- Automotive-grade RM3100 compass. + Designed for better stability and anti-interference capability. +- Triple-redundant IMUs and dual-redundant barometers located on separate buses. + If the PX4 autopilot detects a sensor failure, the system seamlessly switches to another sensor to maintain flight control reliability. +- Independent LDO power control supplies power to each sensor group. + A vibration isolation system filters high-frequency vibrations and reduces noise to ensure accurate readings, enabling better overall flight performance for the vehicle. +- Integrated Microchip Ethernet PHY for high-speed communication with onboard devices like mission computers via Ethernet. +- Dual temperature compensation systems, located on the IMU board and FMU board respectively. + Temperature is controlled by onboard heating resistors to achieve the optimal operating temperature for the IMUs. +- PWM servo output voltage switchable between 3.3V or 5V. +- Modular design for DIY carrier boards. + +### Processors & Sensors + +- Main Processor: STM32H743XI + - 32-bit Arm® Cortex®-M7, 480MHz, 2MB Flash, 1MB RAM +- Onboard Sensors: + - Accel/Gyro: ADIS16607 + - Accel/Gyro: IIM42652 + - Accel/Gyro: IIM42653 + - Magnetometer: RM3100 + - Barometer: BMP581 + - Barometer: ICP-20100 + +### Electrical Data + +- Rated Voltage: + - Input Voltage: 10~18V + - USB Power Input: 4.75~5.25V + - Servo Rail Input: 0~9.9V +- Rated Current: + - Total Output Max Current: 10A + - `TELEM1` and `TELEM2` Output Current limiter: 4A + - `CAN1` and `CAN2` Output Current limiter: 2.4A + - Other Ports Output Current limiter: 1.5A + +### Interfaces + +- 16x PWM Servo Outputs +- 1x Dedicated R/C Input (`RC IN`) for Spektrum / DSM and S.Bus +- 1x Analog/PWM RSSI Input +- 2x TELEM Ports (with full flow control) +- 1x UART4 Port +- 2x GPS Ports + - 1x Full GPS plus Safety Switch Port (GPS1) + - 1x Basic GPS Port (with I2C, GPS2) +- 1x USB Port (TYPE-C) +- 1x Ethernet Port + - Transformerless application + - 100Mbps +- 3x I2C Bus Ports +- 1x SPI Bus + - 1x Chip Select Line + - 1x Data Ready Line + - 1x SPI Reset Line +- 5x CAN Ports for CAN Peripherals + - 3x CAN1 Bus Multiplexed Ports + - 2x CAN2 Bus Multiplexed Ports +- 2x Power Input Ports + - DroneCAN/UAVCAN Power Input +- 2x AD Ports + - Analog Input (3.3V) + - Analog Input (6.6V - not supported) +- 1x Dedicated Debug Port + - FMU Debug + +### Mechanical Data + +- Dimensions: + + ![CUAV X25-MEGA](../../assets/flight_controller/cuav_x25-mega/x25-mega_size.png) + +## Purchase Channels {#store} + +Order from [CUAV](https://store.cuav.net/). + +## Assembly/Setup + +The [X25 MEGA Wiring Quick Start](../assembly/quick_start_cuav_x25_evo.md) provides instructions on how to assemble required/important peripherals including GPS, Power Module etc. + +## Pinouts + +![CUAV X25-MEGA Pinout_01](../../assets/flight_controller/cuav_x25-mega/x25-mega_pinouts_01.png) +![CUAV X25-MEGA Pinout_02](../../assets/flight_controller/cuav_x25-mega/x25-mega_pinouts_02.png) + +## PWM Outputs {#pwm_outputs} + +This flight controller supports up to 16 FMU PWM outputs (MAIN). + +Outputs: + +- Outputs 1-8 support [DShot](../peripherals/dshot.md). +- Outputs 9-16 do not support DShot. +- Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). +- Output 8 supports Bidirectional DShot output only (no eRPM capture). + +The 16 outputs are in 5 groups: + +- Outputs 1-4 in group1 (Timer5) +- Outputs 5-8 in group2 (Timer4) +- Outputs 9-11 in group3 (Timer1) +- Outputs 12-14 in group4 (Timer8) +- Outputs 15-16 in group5 (Timer12) + +All outputs within the same group must use the same output protocol and rate. + +## Serial Port Mapping + +| UART | Device | Port | +| ------ | ---------- | ------------- | +| USART1 | /dev/ttyS0 | GPS1 | +| USART2 | /dev/ttyS1 | GPS2 | +| USART3 | /dev/ttyS2 | Debug Console | +| UART4 | /dev/ttyS3 | UART4 | +| UART5 | /dev/ttyS4 | TELEM2 | +| USART6 | /dev/ttyS5 | RC IN | +| UART7 | /dev/ttyS6 | TELEM1 | + +## RC Input + +The RC input pin is directly connected to the FMU UART6 TX. + +## Voltage Ratings + +The _X25-MEGA_ achieves triple redundancy on power supplies if three power sources are provided. +The three power rails are `POWER C1`, `POWER C2`, and `USB`. + +- **POWER C1** and **POWER C2** are DroneCAN/UAVCAN battery interfaces. + +**Normal Operation Maximum Ratings** + +Under these conditions, all power sources will be used to power the system in the following order: + +1. **POWER C1** and **POWER C2** Inputs (10V to 18V) +2. USB Input (4.75V to 5.25V) + +**Voltage monitoring** + +Digital DroneCAN/UAVCAN battery monitoring is enabled by default. + +## Building Firmware + +::: tip +Most users will not need to build this firmware (from PX4 v1.18). +It is pre-built and automatically installed by _QGroundControl_ when appropriate hardware is connected. +::: + +To [build PX4](../dev_setup/building_px4.md) for this target, execute: + +```sh +make cuav_x25-mega_default +``` + +## Debug Port {#debug_port} + +The [PX4 System Console](../debug/system_console.md) and [SWD Interface](../debug/swd_debug.md) operate on the **FMU Debug** port. + +| Pin | Signal | Volt | +| ------- | -------------- | ----- | +| 1 (red) | 5V+ | +5V | +| 2 (blk) | DEBUG TX (OUT) | +3.3V | +| 3 (blk) | DEBUG RX (IN) | +3.3V | +| 4 (blk) | FMU_SWDIO | +3.3V | +| 5 (blk) | FMU_SWCLK | +3.3V | +| 6 (blk) | GND | GND | + +## Supported Platforms / Airframes + +Any multicopter / airplane / rover or boat that can be controlled with normal RC servos or Futaba S-Bus servos. +The complete set of supported configurations can be seen in the [Airframes Reference](../airframes/airframe_reference.md). + +## Further info + +- [CUAV Docs](https://doc.cuav.net/)