From cb7a63e97a2e1685055f3f15d4d25ebaedfe3293 Mon Sep 17 00:00:00 2001 From: lvguofei <1969354053@qq.com> Date: Tue, 19 May 2026 17:12:18 +0800 Subject: [PATCH 1/5] board(amovlab): add Flycore FMU support --- boards/amovlab/flycore/bootloader.px4board | 3 + boards/amovlab/flycore/default.px4board | 84 +++ .../extras/amovlab_flycore_bootloader.bin | Bin 0 -> 43164 bytes boards/amovlab/flycore/firmware.prototype | 13 + boards/amovlab/flycore/init/rc.board_defaults | 15 + boards/amovlab/flycore/init/rc.board_sensors | 15 + boards/amovlab/flycore/nuttx-config/Kconfig | 17 + .../flycore/nuttx-config/bootloader/defconfig | 91 +++ .../flycore/nuttx-config/include/board.h | 526 ++++++++++++++++++ .../nuttx-config/include/board_dma_map.h | 71 +++ .../flycore/nuttx-config/nsh/defconfig | 269 +++++++++ .../nuttx-config/scripts/bootloader_script.ld | 215 +++++++ .../flycore/nuttx-config/scripts/script.ld | 229 ++++++++ boards/amovlab/flycore/src/CMakeLists.txt | 75 +++ boards/amovlab/flycore/src/board_config.h | 241 ++++++++ boards/amovlab/flycore/src/bootloader_main.c | 75 +++ boards/amovlab/flycore/src/can.c | 128 +++++ boards/amovlab/flycore/src/hw_config.h | 128 +++++ boards/amovlab/flycore/src/i2c.cpp | 40 ++ boards/amovlab/flycore/src/init.c | 255 +++++++++ boards/amovlab/flycore/src/led.c | 235 ++++++++ boards/amovlab/flycore/src/manifest.c | 132 +++++ boards/amovlab/flycore/src/mtd.cpp | 76 +++ boards/amovlab/flycore/src/sdio.c | 177 ++++++ boards/amovlab/flycore/src/spi.cpp | 54 ++ boards/amovlab/flycore/src/timer_config.cpp | 72 +++ boards/amovlab/flycore/src/usb.c | 106 ++++ 27 files changed, 3342 insertions(+) create mode 100644 boards/amovlab/flycore/bootloader.px4board create mode 100644 boards/amovlab/flycore/default.px4board create mode 100755 boards/amovlab/flycore/extras/amovlab_flycore_bootloader.bin create mode 100644 boards/amovlab/flycore/firmware.prototype create mode 100644 boards/amovlab/flycore/init/rc.board_defaults create mode 100644 boards/amovlab/flycore/init/rc.board_sensors create mode 100644 boards/amovlab/flycore/nuttx-config/Kconfig create mode 100644 boards/amovlab/flycore/nuttx-config/bootloader/defconfig create mode 100644 boards/amovlab/flycore/nuttx-config/include/board.h create mode 100644 boards/amovlab/flycore/nuttx-config/include/board_dma_map.h create mode 100644 boards/amovlab/flycore/nuttx-config/nsh/defconfig create mode 100644 boards/amovlab/flycore/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/amovlab/flycore/nuttx-config/scripts/script.ld create mode 100644 boards/amovlab/flycore/src/CMakeLists.txt create mode 100644 boards/amovlab/flycore/src/board_config.h create mode 100644 boards/amovlab/flycore/src/bootloader_main.c create mode 100644 boards/amovlab/flycore/src/can.c create mode 100644 boards/amovlab/flycore/src/hw_config.h create mode 100644 boards/amovlab/flycore/src/i2c.cpp create mode 100644 boards/amovlab/flycore/src/init.c create mode 100644 boards/amovlab/flycore/src/led.c create mode 100644 boards/amovlab/flycore/src/manifest.c create mode 100644 boards/amovlab/flycore/src/mtd.cpp create mode 100644 boards/amovlab/flycore/src/sdio.c create mode 100644 boards/amovlab/flycore/src/spi.cpp create mode 100644 boards/amovlab/flycore/src/timer_config.cpp create mode 100644 boards/amovlab/flycore/src/usb.c diff --git a/boards/amovlab/flycore/bootloader.px4board b/boards/amovlab/flycore/bootloader.px4board new file mode 100644 index 000000000000..19b6e662be69 --- /dev/null +++ b/boards/amovlab/flycore/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/amovlab/flycore/default.px4board b/boards/amovlab/flycore/default.px4board new file mode 100644 index 000000000000..18f56f892a95 --- /dev/null +++ b/boards/amovlab/flycore/default.px4board @@ -0,0 +1,84 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS2" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS1" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS3" +CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS5" +CONFIG_BOARD_SERIAL_RC="/dev/ttyS4" +CONFIG_COMMON_INS=y +CONFIG_DRIVERS_ADC_BOARD_ADC=y +CONFIG_DRIVERS_BAROMETER_MS5611=y +CONFIG_COMMON_DISTANCE_SENSOR=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_COMMON_TELEMETRY=y +CONFIG_DRIVERS_CDCACM_AUTOSTART=y +CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_HEATER=y +CONFIG_DRIVERS_IMU_BOSCH_BMI088=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM42688P=y +CONFIG_DRIVERS_LIGHTS_RGBLED=y +CONFIG_DRIVERS_LIGHTS_RGBLED_AW2023=y +CONFIG_DRIVERS_PWM_OUT=y +CONFIG_DRIVERS_RC_INPUT=y +CONFIG_DRIVERS_TONE_ALARM=y +CONFIG_DRIVERS_TMP102A=y +CONFIG_DRIVERS_UAVCAN=y +CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE=6 +CONFIG_MODULES_AIRSPEED_SELECTOR=y +CONFIG_MODULES_BATTERY_STATUS=y +CONFIG_MODULES_COMMANDER=y +CONFIG_MODULES_CONTROL_ALLOCATOR=y +CONFIG_MODULES_DATAMAN=y +CONFIG_MODULES_EKF2=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_LATERAL_LONGITUDINAL_CONTROL=y +CONFIG_MODULES_FW_MODE_MANAGER=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_ROVER_POS_CONTROL=y +CONFIG_MODULES_SENSORS=y +CONFIG_MODULES_TEMPERATURE_COMPENSATION=y +CONFIG_MODULES_UXRCE_DDS_CLIENT=y +CONFIG_NUM_MISSION_ITMES_SUPPORTED=1000 +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_NSHTERM=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y +CONFIG_SYSTEMCMDS_SERIAL_TEST=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_TUNE_CONTROL=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/amovlab/flycore/extras/amovlab_flycore_bootloader.bin b/boards/amovlab/flycore/extras/amovlab_flycore_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..cf42b52d3633cdd625348aae6289f08c3b95c1d5 GIT binary patch literal 43164 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 ZMJdrHHV3EIo>%Uf>7G%q+;lVce*re@wJ87q literal 0 HcmV?d00001 diff --git a/boards/amovlab/flycore/firmware.prototype b/boards/amovlab/flycore/firmware.prototype new file mode 100644 index 000000000000..16a42533637e --- /dev/null +++ b/boards/amovlab/flycore/firmware.prototype @@ -0,0 +1,13 @@ +{ + "board_id": 106, + "magic": "AMOVLABv1", + "description": "Firmware for the AMOVLAB Flycore board", + "image": "", + "build_time": 0, + "summary": "AMOVLAB Flycore", + "version": "0.1", + "image_size": 0, + "image_maxsize": 1966080, + "git_identity": "", + "board_revision": 0 +} diff --git a/boards/amovlab/flycore/init/rc.board_defaults b/boards/amovlab/flycore/init/rc.board_defaults new file mode 100644 index 000000000000..7767ea583c2e --- /dev/null +++ b/boards/amovlab/flycore/init/rc.board_defaults @@ -0,0 +1,15 @@ +#!/bin/sh +# +# board specific defaults +#------------------------------------------------------------------------------ + +if ver hwtypecmp FLYCORE0000 +then + param set-default SYS_AUTOSTART 4014 +fi + +param set-default BAT1_V_DIV 10.89 +param set-default BAT1_A_PER_V 36.367515152 + +# Multicopter Position Control control and Land Detector +param set-default MPC_LAND_CRWL 0.5 diff --git a/boards/amovlab/flycore/init/rc.board_sensors b/boards/amovlab/flycore/init/rc.board_sensors new file mode 100644 index 000000000000..3c4e74c969e9 --- /dev/null +++ b/boards/amovlab/flycore/init/rc.board_sensors @@ -0,0 +1,15 @@ +#!/bin/sh +# +# AMOVLAB FLYCORE specific board sensors init +#------------------------------------------------------------------------------ +board_adc start + +# Internal SPI1 bus BMI088 accel/gyro +bmi088 -A -R 2 -s start +bmi088 -G -R 2 -s start + +# Internal SPI2 bus ICM42688p +icm42688p -R 4 -s start + +# Internal barometer on SPI1 +ms5611 -s start diff --git a/boards/amovlab/flycore/nuttx-config/Kconfig b/boards/amovlab/flycore/nuttx-config/Kconfig new file mode 100644 index 000000000000..bb33d3cfda4d --- /dev/null +++ b/boards/amovlab/flycore/nuttx-config/Kconfig @@ -0,0 +1,17 @@ +# +# For a description of the syntax of this configuration file, +# see misc/tools/kconfig-language.txt. +# +config BOARD_HAS_PROBES + bool "Board provides GPIO or other Hardware for signaling to timing analyze." + default y + ---help--- + This board provides GPIO FMU-CH1-5, CAP1-6 as PROBE_1-11 to provide timing signals from selected drivers. + +config BOARD_USE_PROBES + bool "Enable the use the board provided FMU-CH1-5, CAP1-6 as PROBE_1-11" + default n + depends on BOARD_HAS_PROBES + + ---help--- + Select to use GPIO FMU-CH1-5, CAP1-6 to provide timing signals from selected drivers. diff --git a/boards/amovlab/flycore/nuttx-config/bootloader/defconfig b/boards/amovlab/flycore/nuttx-config/bootloader/defconfig new file mode 100644 index 000000000000..13925874167a --- /dev/null +++ b/boards/amovlab/flycore/nuttx-config/bootloader/defconfig @@ -0,0 +1,91 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DEV_CONSOLE is not set +# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set +# CONFIG_SPI_EXCHANGE is not set +# CONFIG_STM32H7_SYSCFG is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/amovlab/flycore/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743VI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARDCTL=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_INITTHREAD_PRIORITY=254 +CONFIG_BOARD_LATE_INITIALIZE=y +CONFIG_BOARD_LOOPSPERMSEC=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x0038 +CONFIG_CDCACM_PRODUCTSTR="PX4 BL AMOV FLYCORE" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x3185 +CONFIG_CDCACM_VENDORSTR="The Autopilot" +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=y +CONFIG_DEFAULT_SMALL=y +CONFIG_EXPERIMENTAL=y +CONFIG_FDCLONE_DISABLE=y +CONFIG_FDCLONE_STDIO=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=750 +CONFIG_INIT_ENTRYPOINT="bootloader_main" +CONFIG_INIT_STACKSIZE=3194 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_RAM_SIZE=245760 +CONFIG_RAM_START=0x20010000 +CONFIG_RAW_BINARY=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_SIG_DEFAULT=y +CONFIG_SIG_SIGALRM_ACTION=y +CONFIG_SIG_SIGUSR1_ACTION=y +CONFIG_SIG_SIGUSR2_ACTION=y +CONFIG_SPI=y +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_BUFFER_SIZE=32 +CONFIG_STM32H7_BKPSRAM=y +CONFIG_STM32H7_DMA1=y +CONFIG_STM32H7_DMA2=y +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_UART7=y +CONFIG_SYSTEMTICK_HOOK=y +CONFIG_SYSTEM_CDCACM=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_TTY_SIGINT=y +CONFIG_TTY_SIGINT_CHAR=0x03 +CONFIG_TTY_SIGTSTP=y +CONFIG_UART7_RXBUFSIZE=512 +CONFIG_UART7_TXBUFSIZE=512 +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000s diff --git a/boards/amovlab/flycore/nuttx-config/include/board.h b/boards/amovlab/flycore/nuttx-config/include/board.h new file mode 100644 index 000000000000..57b8e79fa590 --- /dev/null +++ b/boards/amovlab/flycore/nuttx-config/include/board.h @@ -0,0 +1,526 @@ +/************************************************************************************ + * nuttx-configs/px4_fmu-v6c/include/board.h + * + * Copyright (C) 2016-2019 Gregory Nutt. All rights reserved. + * Authors: David Sidrane + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ +#ifndef __NUTTX_CONFIG_AMOVLABFLYCORE_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_AMOVLABFLYCORE_INCLUDE_BOARD_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include "board_dma_map.h" + +#include + +#ifndef __ASSEMBLY__ +# include +#endif + +#include "stm32_rcc.h" +#include "stm32_sdmmc.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/* Clocking *************************************************************************/ +/* The px4_fmu-v6C 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 + +/* 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 + +/* ADC 1 2 3 clock source */ + +#define STM32_RCC_D3CCIPR_ADCSRC RCC_D3CCIPR_ADCSEL_PLL2 + +/* FDCAN 1 2 clock source */ + +#define STM32_RCC_D2CCIP1R_FDCANSEL RCC_D2CCIP1R_FDCANSEL_HSE /* FDCAN 1 2 clock source */ + +#define STM32_FDCANCLK STM32_HSE_FREQUENCY + +/* FLASH wait states + * + * ------------ ---------- ----------- + * Vcore MAX ACLK WAIT STATES + * ------------ ---------- ----------- + * 1.15-1.26 V 70 MHz 0 + * (VOS1 level) 140 MHz 1 + * 210 MHz 2 + * 1.05-1.15 V 55 MHz 0 + * (VOS2 level) 110 MHz 1 + * 165 MHz 2 + * 220 MHz 3 + * 0.95-1.05 V 45 MHz 0 + * (VOS3 level) 90 MHz 1 + * 135 MHz 2 + * 180 MHz 3 + * 225 MHz 4 + * ------------ ---------- ----------- + */ + +#define BOARD_FLASH_WAITSTATES 2 + +/* SDMMC definitions ********************************************************/ + +/* Init 400kHz, freq = PLL1Q/(2*div) div = PLL1Q/(2*freq) */ + +#define STM32_SDMMC_INIT_CLKDIV (300 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) + +/* 25 MHz Max for now, 25 mHZ = PLL1Q/(2*div), div = PLL1Q/(2*freq) + * div = 4.8 = 240 / 50, So round up to 5 for default speed 24 MB/s + */ + +#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) +# define STM32_SDMMC_MMCXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#else +# define STM32_SDMMC_MMCXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#endif +#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) +# define STM32_SDMMC_SDXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#else +# define STM32_SDMMC_SDXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#endif + +#define STM32_SDMMC_CLKCR_EDGE STM32_SDMMC_CLKCR_NEGEDGE + +/* LED definitions ******************************************************************/ +/* The PX4 FMUV6C board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and + * LED_RED a Red LED, that can be controlled by software. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +/* LED definitions ******************************************************************/ +/* The px4_fmu-v6c board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and + * LED_RED a Red LED, that can be controlled by software. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +#define BOARD_LED1 0 +#define BOARD_LED2 1 +#define BOARD_LED3 2 +#define BOARD_NLEDS 3 + +#define BOARD_LED_RED BOARD_LED1 +#define BOARD_LED_GREEN BOARD_LED2 +#define BOARD_LED_BLUE BOARD_LED3 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) + +/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in + * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related + * events as follows: + * + * + * SYMBOL Meaning LED state + * Red Green Blue + * ---------------------- -------------------------- ------ ------ ----*/ + +#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ +#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ +#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ +#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ +#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ +#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ +#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ +#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ +#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ + +/* Thus if the Green LED is statically on, NuttX has successfully booted and + * is, apparently, running normally. If the Red LED is flashing at + * approximately 2Hz, then a fatal error has been detected and the system + * has halted. + */ + +/* Alternate function pin selections ************************************************/ +/* + +Uart Port Device + +USART2 TELEM1 /dev/ttyS0 +USART3 TELEM2 /dev/ttyS1 +UART4 GPS1 /dev/ttyS2 +UART5 TELEM3 /dev/ttyS3 +USART6 RC /dev/ttyS4 +UART7 GPS2 /dev/ttyS5 +UART8 DEBUG /dev/ttyS6 + +*/ +#define GPIO_USART2_RX GPIO_USART2_RX_2 /* PD6 */ +#define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ +#define GPIO_USART2_RTS GPIO_USART2_RTS_2 /* PD4 */ +#define GPIO_USART2_CTS GPIO_USART2_CTS_NSS_2 /* PD3 */ + +#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ +#define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ +#define GPIO_USART3_RTS GPIO_USART3_RTS_2 /* PD12 */ +#define GPIO_USART3_CTS GPIO_USART3_CTS_NSS_2 /* PD11 */ + +#define GPIO_UART4_RX GPIO_UART4_RX_4 /* PC11 */ +#define GPIO_UART4_TX GPIO_UART4_TX_4 /* PC10 */ + +#define GPIO_UART5_RX GPIO_UART5_RX_3 /* PD2 */ +#define GPIO_UART5_TX GPIO_UART5_TX_3 /* PC12 */ + +#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_3 /* PE7 */ +#define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ + +#define GPIO_UART8_RX GPIO_UART8_RX_1 /* PE0 */ +#define GPIO_UART8_TX GPIO_UART8_TX_1 /* PE1 */ + + +/* CAN + * + * CAN1 is routed to external. + * CAN2 is routed to external. + */ +#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 sensors + * SPI2 is off board sensors + * SPI4 is fram and sensors + */ + +#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) + +#define GPIO_SPI1_MISO GPIO_SPI1_MISO_1 /* PA6 */ +#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_2 /* PB5 */ +#define GPIO_SPI1_SCK ADJ_SLEW_RATE(GPIO_SPI1_SCK_1) /* PA5 */ + +#define GPIO_SPI2_MISO GPIO_SPI2_MISO_2 /* PC2 */ +#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_3 /* PC3 */ +#define GPIO_SPI2_SCK ADJ_SLEW_RATE(GPIO_SPI2_SCK_3) /* PB10 */ + +#define GPIO_SPI4_MISO GPIO_SPI4_MISO_2 /* PE5 */ +#define GPIO_SPI4_MOSI GPIO_SPI4_MOSI_2 /* PE6 */ +#define GPIO_SPI4_SCK ADJ_SLEW_RATE(GPIO_SPI4_SCK_2) /* PE2 */ + + +/* 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_I2C4_SCL GPIO_I2C4_SCL_4 /* PB6 */ +#define GPIO_I2C4_SDA GPIO_I2C4_SDA_4 /* PB7 */ + +#define GPIO_I2C4_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN6) +#define GPIO_I2C4_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN7) + +/* SDMMC2 + * + * VDD 3.3 + * GND + * SDMMC2_CK PC1 + * SDMMC2_CMD PD7 + * SDMMC2_D0 PB14 + * SDMMC2_D1 PB15 + * SDMMC2_D2 PB3 + * SDMMC2_D3 PB4 + */ + +#define GPIO_SDMMC2_CK GPIO_SDMMC2_CK_2 /* PC1 */ +#define GPIO_SDMMC2_CMD GPIO_SDMMC2_CMD_1 /* PD7 */ +//#define GPIO_SDMMC2_D0 GPIO_SDMMC2_D0_1 /* PB14 */ +//#define GPIO_SDMMC2_D1 GPIO_SDMMC2_D1_1 /* PB15 */ +#define GPIO_SDMMC2_D2 GPIO_SDMMC2_D2_2 /* PB3 */ +//#define GPIO_SDMMC2_D3 GPIO_SDMMC2_D3_0 /* PB4 */ + +/* USB + * + * OTG_FS_DM PA11 + * OTG_FS_DP PA12 + * VBUS PA9 + */ + +/* Board provides GPIO or other Hardware for signaling to timing analyzer */ + +#if defined(CONFIG_BOARD_USE_PROBES) +# include "stm32_gpio.h" +# define PROBE_N(n) (1<<((n)-1)) +# define PROBE_1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN9) /* PE9 AUX1 */ +# define PROBE_2 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN11) /* PE11 AUX2 */ +# define PROBE_3 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN13) /* PE13 AUX3 */ +# define PROBE_4 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN14) /* PE14 AUX4 */ +# define PROBE_5 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) /* PA7 AUX5 */ +# define PROBE_6 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN0) /* PB0 AUX6 */ +# define PROBE_7 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN9) /* PC9 AUX7 */ +# define PROBE_8 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN13) /* PD13 AUX8 */ +# define PROBE_9 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14) /* PD14 AUX9 */ +# define PROBE_10 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN15) /* PD15 AUX10 */ + +# 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); } \ + if ((mask)& PROBE_N(10)) { stm32_configgpio(PROBE_10); } \ + } 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_AMOVLABFLYCORE_INCLUDE_BOARD_H */ diff --git a/boards/amovlab/flycore/nuttx-config/include/board_dma_map.h b/boards/amovlab/flycore/nuttx-config/include/board_dma_map.h new file mode 100644 index 000000000000..dc2ec6f5e2a4 --- /dev/null +++ b/boards/amovlab/flycore/nuttx-config/include/board_dma_map.h @@ -0,0 +1,71 @@ +/**************************************************************************** + * + * Copyright (c) 2020 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +// DMAMUX1 Using at most 8 Channels on DMA1 -------- Assigned +// V + +#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* 1 DMA1:37 BMI088, BMM150, MS5611 */ +#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* 2 DMA1:38 BMI088, BMM150, MS5611 */ + +//#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* 3 DMA1:39 Base */ +//#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* 4 DMA1:40 Base */ + +#define DMAMAP_SPI4_RX DMAMAP_DMA12_SPI4RX_0 /* 5 DMA1:83 FRAM, ICM-42688-P */ +#define DMAMAP_SPI4_TX DMAMAP_DMA12_SPI4TX_0 /* 6 DMA1:84 FRAM, ICM-42688-P */ + +#define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_0 /* 7 DMA1:43 Telem1 */ +#define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_0 /* 8 DMA1:44 Telem1 */ + +//#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_0 /* 9 DMA1:45 Telem2 */ +//#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_0 /* 10 DMA1:46 Telem2 */ + +//#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* 11 DMA1:63 GPS1 */ +//#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* 12 DMA1:64 GPS1 */ + + +// DMAMUX2 Using at most 8 Channels on DMA2 -------- Assigned +// V + +//#define DMAMAP_USART5_RX DMAMAP_DMA12_UART5RX_1 /* 13 DMA2:65 Base */ +//#define DMAMAP_USART5_TX DMAMAP_DMA12_UART5TX_1 /* 14 DMA2:66 Base */ + +#define DMAMAP_USART6_RX DMAMAP_DMA12_USART6RX_1 /* 15 DMA2:71 RC */ +#define DMAMAP_USART6_TX DMAMAP_DMA12_USART6TX_1 /* 16 DMA2:72 RC */ + +// #define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_1 /* 17 DMA2:79 GPS2 */ +// #define DMAMAP_UART7_TX DMAMAP_DMA12_UART7TX_1 /* 18 DMA2:80 GPS2 */ + +// #define DMAMAP_UART8_RX DMAMAP_DMA12_UART8RX_1 /* 19 DMA2:81 DEBUG */ +// #define DMAMAP_UART8_TX DMAMAP_DMA12_UART8TX_1 /* 20 DMA2:82 DEBUG */ diff --git a/boards/amovlab/flycore/nuttx-config/nsh/defconfig b/boards/amovlab/flycore/nuttx-config/nsh/defconfig new file mode 100644 index 000000000000..5593fa3a4aaa --- /dev/null +++ b/boards/amovlab/flycore/nuttx-config/nsh/defconfig @@ -0,0 +1,269 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DISABLE_ENVIRON is not set +# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set +# CONFIG_DISABLE_PTHREAD is not set +# CONFIG_MMCSD_HAVE_CARDDETECT is not set +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_MMCSD_SPI is not set +# CONFIG_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_CAT is not set +# CONFIG_NSH_DISABLE_CD is not set +# CONFIG_NSH_DISABLE_CP is not set +# CONFIG_NSH_DISABLE_DATE is not set +# CONFIG_NSH_DISABLE_DF is not set +# CONFIG_NSH_DISABLE_ECHO is not set +# CONFIG_NSH_DISABLE_ENV is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_EXIT is not set +# CONFIG_NSH_DISABLE_EXPORT is not set +# CONFIG_NSH_DISABLE_FREE is not set +# CONFIG_NSH_DISABLE_GET is not set +# CONFIG_NSH_DISABLE_HELP is not set +# CONFIG_NSH_DISABLE_ITEF is not set +# CONFIG_NSH_DISABLE_KILL is not set +# CONFIG_NSH_DISABLE_LOOPS is not set +# CONFIG_NSH_DISABLE_LS is not set +# CONFIG_NSH_DISABLE_MKDIR is not set +# CONFIG_NSH_DISABLE_MKFATFS is not set +# CONFIG_NSH_DISABLE_MOUNT is not set +# CONFIG_NSH_DISABLE_MV is not set +# CONFIG_NSH_DISABLE_PS is not set +# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set +# CONFIG_NSH_DISABLE_PWD is not set +# CONFIG_NSH_DISABLE_RM is not set +# CONFIG_NSH_DISABLE_RMDIR is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_SET is not set +# CONFIG_NSH_DISABLE_SLEEP is not set +# CONFIG_NSH_DISABLE_SOURCE is not set +# CONFIG_NSH_DISABLE_TEST is not set +# CONFIG_NSH_DISABLE_TIME is not set +# CONFIG_NSH_DISABLE_UMOUNT is not set +# CONFIG_NSH_DISABLE_UNSET is not set +# CONFIG_NSH_DISABLE_USLEEP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/amovlab/flycore/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743VI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DTCM=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_ARM_MPU_EARLY_RESET=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_CRASHDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=95751 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x0038 +CONFIG_CDCACM_PRODUCTSTR="AMOVLAB FLYCORE" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x3185 +CONFIG_CDCACM_VENDORSTR="The Autopilot" +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_MEMFAULT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=y +CONFIG_DEFAULT_SMALL=y +CONFIG_DEV_FIFO_SIZE=0 +CONFIG_DEV_PIPE_MAXSIZE=1024 +CONFIG_DEV_PIPE_SIZE=70 +CONFIG_EXPERIMENTAL=y +CONFIG_FAT_DMAMEMORY=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FAT_LFN_ALIAS_HASH=y +CONFIG_FDCLONE_STDIO=y +CONFIG_FS_BINFS=y +CONFIG_FS_CROMFS=y +CONFIG_FS_FAT=y +CONFIG_FS_FATTIME=y +CONFIG_FS_PROCFS=y +CONFIG_FS_PROCFS_INCLUDE_PROGMEM=y +CONFIG_FS_PROCFS_MAX_TASKS=64 +CONFIG_FS_PROCFS_REGISTER=y +CONFIG_FS_ROMFS=y +CONFIG_GRAN=y +CONFIG_GRAN_INTR=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_I2C=y +CONFIG_I2C_RESET=y +CONFIG_IDLETHREAD_STACKSIZE=750 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=3194 +CONFIG_IOB_NBUFFERS=24 +CONFIG_IOB_NCHAINS=24 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_MAX_EXITFUNS=1 +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y +CONFIG_MM_IOB=y +CONFIG_MM_REGIONS=4 +CONFIG_MTD=y +CONFIG_MTD_BYTE_WRITE=y +CONFIG_MTD_PARTITION=y +CONFIG_MTD_PROGMEM=y +CONFIG_MTD_RAMTRON=y +CONFIG_NAME_MAX=40 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_ARGCAT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_CMDPARMS=y +CONFIG_NSH_CROMFSETC=y +CONFIG_NSH_LINELEN=128 +CONFIG_NSH_MAXARGUMENTS=15 +CONFIG_NSH_NESTDEPTH=8 +CONFIG_NSH_QUOTE=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSSECTSIZE=128 +CONFIG_NSH_STRERROR=y +CONFIG_NSH_VARS=y +CONFIG_OTG_ID_GPIO_DISABLE=y +CONFIG_PIPES=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PRIORITY_INHERITANCE=y +CONFIG_PTHREAD_MUTEX_ROBUST=y +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_RAMTRON_EMULATE_PAGE_SHIFT=5 +CONFIG_RAMTRON_EMULATE_SECTOR_SHIFT=5 +CONFIG_RAMTRON_SETSPEED=y +CONFIG_RAM_SIZE=245760 +CONFIG_RAM_START=0x20010000 +CONFIG_RAW_BINARY=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_TABCOMPLETION=y +CONFIG_RTC_DATETIME=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKPRIORITY=249 +CONFIG_SCHED_HPWORKSTACKSIZE=1280 +CONFIG_SCHED_INSTRUMENTATION=y +CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y +CONFIG_SCHED_INSTRUMENTATION_SWITCH=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_LPWORKPRIORITY=50 +CONFIG_SCHED_LPWORKSTACKSIZE=1632 +CONFIG_SCHED_WAITPID=y +CONFIG_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_FLOWCONTROL_BROKEN=y +CONFIG_STM32H7_I2C1=y +CONFIG_STM32H7_I2C4=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_RTC=y +CONFIG_STM32H7_RTC_HSECLOCK=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_SPI4=y +CONFIG_STM32H7_SPI4_DMA=y +CONFIG_STM32H7_SPI4_DMA_BUFFER=4096 +CONFIG_STM32H7_SPI_DMA=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM2=y +CONFIG_STM32H7_TIM3=y +CONFIG_STM32H7_TIM4=y +CONFIG_STM32H7_TIM6=y +CONFIG_STM32H7_TIM8=y +CONFIG_STM32H7_UART4=y +CONFIG_STM32H7_UART5=y +CONFIG_STM32H7_UART7=y +CONFIG_STM32H7_UART8=y +CONFIG_STM32H7_USART2=y +CONFIG_STM32H7_USART3=y +CONFIG_STM32H7_USART6=y +CONFIG_STM32H7_USART_BREAKS=y +CONFIG_STM32H7_USART_INVERT=y +CONFIG_STM32H7_USART_SINGLEWIRE=y +CONFIG_STM32H7_USART_SWAP=y +CONFIG_SYSTEM_CDCACM=y +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_UART4_BAUD=57600 +CONFIG_UART4_RXBUFSIZE=600 +CONFIG_UART4_TXBUFSIZE=1500 +CONFIG_UART5_BAUD=57600 +CONFIG_UART5_RXBUFSIZE=600 +CONFIG_UART5_TXBUFSIZE=1500 +CONFIG_UART7_BAUD=57600 +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_TXBUFSIZE=1500 +CONFIG_UART8_BAUD=57600 +CONFIG_UART8_RXBUFSIZE=180 +CONFIG_UART8_SERIAL_CONSOLE=y +CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_USART2_BAUD=57600 +CONFIG_USART2_IFLOWCONTROL=y +CONFIG_USART2_OFLOWCONTROL=y +CONFIG_USART2_RXBUFSIZE=600 +CONFIG_USART2_RXDMA=y +CONFIG_USART2_TXBUFSIZE=3000 +CONFIG_USART2_TXDMA=y +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=180 +CONFIG_USART3_IFLOWCONTROL=y +CONFIG_USART3_OFLOWCONTROL=y +CONFIG_USART3_TXBUFSIZE=3000 +CONFIG_USART6_BAUD=57600 +CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 +CONFIG_WATCHDOG=y +CONFIG_WQUEUE_NOTIFIER=y diff --git a/boards/amovlab/flycore/nuttx-config/scripts/bootloader_script.ld b/boards/amovlab/flycore/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 000000000000..c10e790824c0 --- /dev/null +++ b/boards/amovlab/flycore/nuttx-config/scripts/bootloader_script.ld @@ -0,0 +1,215 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The PX4 FMUV6C 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 FMUV6C 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/amovlab/flycore/nuttx-config/scripts/script.ld b/boards/amovlab/flycore/nuttx-config/scripts/script.ld new file mode 100644 index 000000000000..fcc97ec862fd --- /dev/null +++ b/boards/amovlab/flycore/nuttx-config/scripts/script.ld @@ -0,0 +1,229 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The PX4 FMUV6C 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 FMUV6C 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/amovlab/flycore/src/CMakeLists.txt b/boards/amovlab/flycore/src/CMakeLists.txt new file mode 100644 index 000000000000..d7b08bb9c3b1 --- /dev/null +++ b/boards/amovlab/flycore/src/CMakeLists.txt @@ -0,0 +1,75 @@ +############################################################################ +# +# Copyright (c) 2016 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ +if("${PX4_BOARD_LABEL}" STREQUAL "bootloader") + add_compile_definitions(BOOTLOADER) + add_library(drivers_board + bootloader_main.c + init.c + usb.c + timer_config.cpp + ) + target_link_libraries(drivers_board + PRIVATE + nuttx_arch # sdio + nuttx_drivers # sdio + px4_layer #gpio + arch_io_pins # iotimer + bootloader + ) + target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) + +else() + add_library(drivers_board + can.c + i2c.cpp + init.c + led.c + mtd.cpp + manifest.c + sdio.c + spi.cpp + timer_config.cpp + usb.c + ) + add_dependencies(drivers_board arch_board_hw_info) + + target_link_libraries(drivers_board + PRIVATE + arch_spi + arch_board_hw_info + drivers__led # drv_led_start + nuttx_arch # sdio + nuttx_drivers # sdio + px4_layer + ) +endif() diff --git a/boards/amovlab/flycore/src/board_config.h b/boards/amovlab/flycore/src/board_config.h new file mode 100644 index 000000000000..728c972d95db --- /dev/null +++ b/boards/amovlab/flycore/src/board_config.h @@ -0,0 +1,241 @@ +/**************************************************************************** + * + * Copyright (c) 2025 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 + * + * Amovlab Flycore internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +/* PX4FMU GPIOs ***********************************************************************************/ + + +/* LEDs are driven with push pull Anodes to 3.3V */ + +#define GPIO_nLED_BLUE /* PE12 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN12) +#define GPIO_nLED_RED /* PC4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN4) + + +/* + * 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 GPIO_ADC_RSSI GPIO_ADC1_INP16 /* PA0 */ + +#define PX4_ADC_GPIO \ + /* PA0 */ GPIO_ADC_RSSI, \ + /* PA4 */ GPIO_ADC12_INP18, \ + /* PB1 */ GPIO_ADC12_INP5, \ + /* PA3 */ GPIO_ADC12_INP15, \ + /* PA1 */ GPIO_ADC1_INP17, \ + /* PA2 */ GPIO_ADC12_INP14 + +/* Define Channel numbers must match above GPIO pins */ +#define ADC_RC_RSSI_CHANNEL 16 /* PA0 */ +#define ADC_BATTERY_CURRENT_CHANNEL 18 /* PA4 */ +#define ADC_BATTERY_VOLTAGE_CHANNEL 5 /* PB1 */ +#define ADC_SCALED_V5_CHANNEL 15 /* PA3 */ +#define ADC_HW_REV_SENSE_CHANNEL 17 /* PA1 */ +#define ADC_HW_VER_SENSE_CHANNEL 14 /* PA2 */ + +#define ADC_CHANNELS \ + ((1 << ADC_RC_RSSI_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL) | \ + (1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_SCALED_V5_CHANNEL) | \ + (1 << ADC_HW_REV_SENSE_CHANNEL) | \ + (1 << ADC_HW_VER_SENSE_CHANNEL)) + +/* HW has to large of R termination on ADC todo:change when HW value is chosen */ +#define BOARD_ADC_OPEN_CIRCUIT_V (5.6f) + +/* HW Version and Revision drive signals Default to 1 to detect */ +#define BOARD_HAS_HW_VERSIONING + +#define GPIO_HW_REV_DRIVE /* PB11 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN11) +#define GPIO_HW_REV_SENSE /* PA1 */ GPIO_ADC1_INP17 +#define GPIO_HW_VER_DRIVE /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN13) +#define GPIO_HW_VER_SENSE /* PA2 */ GPIO_ADC12_INP14 +#define HW_INFO_INIT_PREFIX "FLYCORE" + + +/* HEATER + * PWM in future + */ +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) + +/* PWM */ +#define DIRECT_PWM_OUTPUT_CHANNELS 10 +#define BOARD_NUM_IO_TIMERS 5 + +// /* Power supply control and monitoring GPIOs */ +#define GPIO_VDD_5V_RC_EN /* PC5 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN5) + +/* Tone alarm output */ + +#define TONE_ALARM_TIMER 2 /* Timer 2 */ +#define TONE_ALARM_CHANNEL 1 /* PA15 GPIO_TIM2_CH1OUT_2 */ + +#define GPIO_BUZZER_1 /* PA15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN15) + +#define GPIO_TONE_ALARM_IDLE GPIO_BUZZER_1 +#define GPIO_TONE_ALARM GPIO_TIM2_CH1OUT_2 + +/* USB OTG FS + * + * PA9 OTG_FS_VBUS VBUS sensing + */ +#define GPIO_OTGFS_VBUS /* PA9 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN9) + +/* High-resolution timer */ +#define HRT_TIMER 8 /* use timer8 for the HRT */ +#define HRT_TIMER_CHANNEL 2 /* use capture/compare channel 2 */ + +/* RC Serial port */ +#define HRT_PPM_CHANNEL /* T8C3 */ 3 /* use capture/compare channel 1 */ +#define GPIO_PPM_IN /* PC8 T8C3 */ GPIO_TIM8_CH3IN_1 + +#define RC_SERIAL_PORT "/dev/ttyS4" + +#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_LIB_BOARDCTL=y, OR + * CONFIG_BOARD_INITIALIZE=y && CONFIG_BOARD_INITTHREAD=y + */ + +#if defined(CONFIG_BOARD_INITIALIZE) && !defined(CONFIG_LIB_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 BOARD_ADC_USB_CONNECTED + +/* 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 SDMMC_PIN_OFF(def) (((def) & (GPIO_PORT_MASK | GPIO_PIN_MASK)) | (GPIO_INPUT|GPIO_FLOAT|GPIO_SPEED_2MHz)) + +#define PX4_GPIO_INIT_LIST { \ + PX4_ADC_GPIO, \ + GPIO_CAN1_TX, \ + GPIO_CAN1_RX, \ + GPIO_CAN2_TX, \ + GPIO_CAN2_RX, \ + GPIO_HEATER1_OUTPUT, \ + GPIO_TONE_ALARM_IDLE, \ + GPIO_VDD_5V_RC_EN, \ + GPIO_OTGFS_VBUS, \ + } + +#define BOARD_ENABLE_CONSOLE_BUFFER + +__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/amovlab/flycore/src/bootloader_main.c b/boards/amovlab/flycore/src/bootloader_main.c new file mode 100644 index 000000000000..d852f5a79005 --- /dev/null +++ b/boards/amovlab/flycore/src/bootloader_main.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * + * Copyright (c) 2019-2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file bootloader_main.c + * + * FMU-specific early startup code for bootloader +*/ + +#include "board_config.h" +#include "bl.h" + +#include +#include +#include +#include +#include +#include "arm_internal.h" +#include + +extern int sercon_main(int c, char **argv); + +__EXPORT void board_on_reset(int status) {} + +__EXPORT void stm32_boardinitialize(void) +{ + /* configure USB interfaces */ + stm32_configgpio(GPIO_OTGFS_VBUS); +} + +__EXPORT int board_app_initialize(uintptr_t arg) +{ + return 0; +} + +void board_late_initialize(void) +{ + sercon_main(0, NULL); +} + +extern void sys_tick_handler(void); +void board_timerhook(void) +{ + sys_tick_handler(); +} diff --git a/boards/amovlab/flycore/src/can.c b/boards/amovlab/flycore/src/can.c new file mode 100644 index 000000000000..3834074f3701 --- /dev/null +++ b/boards/amovlab/flycore/src/can.c @@ -0,0 +1,128 @@ +/**************************************************************************** + * + * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file px4fmu_can.c + * + * Board-specific CAN functions. + */ + +#ifdef CONFIG_CAN + +#include +#include + +#include +#include + +#include "chip.h" +#include "arm_arch.h" + +#include "chip.h" +#include "stm32_can.h" +#include "board_config.h" + +#ifdef CONFIG_CAN + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ +/* Configuration ********************************************************************/ + +#if defined(CONFIG_STM32_CAN1) && defined(CONFIG_STM32_CAN2) +# warning "Both CAN1 and CAN2 are enabled. Assuming only CAN1." +# undef CONFIG_STM32_CAN2 +#endif + +#ifdef CONFIG_STM32_CAN1 +# define CAN_PORT 1 +#else +# define CAN_PORT 2 +#endif + +/************************************************************************************ + * Private Functions + ************************************************************************************/ + +/************************************************************************************ + * Public Functions + ************************************************************************************/ +int can_devinit(void); + +/************************************************************************************ + * Name: can_devinit + * + * Description: + * All STM32 architectures must provide the following interface to work with + * examples/can. + * + ************************************************************************************/ + +int can_devinit(void) +{ + static bool initialized = false; + struct can_dev_s *can; + int ret; + + /* Check if we have already initialized */ + + if (!initialized) { + /* Call stm32_caninitialize() to get an instance of the CAN interface */ + + can = stm32_caninitialize(CAN_PORT); + + if (can == NULL) { + canerr("ERROR: Failed to get CAN interface\n"); + return -ENODEV; + } + + /* Register the CAN driver at "/dev/can0" */ + + ret = can_register("/dev/can0", can); + + if (ret < 0) { + canerr("ERROR: can_register failed: %d\n", ret); + return ret; + } + + /* Now we are initialized */ + + initialized = true; + } + + return OK; +} + +#endif + +#endif /* CONFIG_CAN */ diff --git a/boards/amovlab/flycore/src/hw_config.h b/boards/amovlab/flycore/src/hw_config.h new file mode 100644 index 000000000000..11a89d7e5cca --- /dev/null +++ b/boards/amovlab/flycore/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,115200" +#define BOOT_DELAY_ADDRESS 0x000001a0 +#define BOARD_TYPE 106 +#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_RED +#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/amovlab/flycore/src/i2c.cpp b/boards/amovlab/flycore/src/i2c.cpp new file mode 100644 index 000000000000..577047997d67 --- /dev/null +++ b/boards/amovlab/flycore/src/i2c.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** + * + * Copyright (C) 2020 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + + +constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { + initI2CBusExternal(1), + initI2CBusExternal(4), +}; diff --git a/boards/amovlab/flycore/src/init.c b/boards/amovlab/flycore/src/init.c new file mode 100644 index 000000000000..6fad174caaa9 --- /dev/null +++ b/boards/amovlab/flycore/src/init.c @@ -0,0 +1,255 @@ +/**************************************************************************** + * + * Copyright (c) 2012-2022 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file init.c + * + * PX4FMU-specific early startup code. This file implements the + * board_app_initialize() function that is called early by nsh during startup. + * + * Code here is run before the rcS script is invoked; it should start required + * subsystems and perform board-specific initialization. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "board_config.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "arm_internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +__END_DECLS + + +/************************************************************************************ + * Name: board_peripheral_reset + * + * Description: + * + ************************************************************************************/ +__EXPORT void board_peripheral_reset(int ms) +{ + /* set the peripheral rails off */ + + 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); + +} + +/************************************************************************************ + * Name: board_on_reset + * + * Description: + * Optionally provided function called on entry to board_system_reset + * It should perform any house keeping prior to the rest. + * + * status - 1 if resetting to boot loader + * 0 if just resetting + * + ************************************************************************************/ +__EXPORT void board_on_reset(int status) +{ + for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { + px4_arch_configgpio(io_timer_channel_get_gpio_output(i)); + } + + if (status >= 0) { + up_mdelay(6); + } +} + +/************************************************************************************ + * Name: stm32_boardinitialize + * + * Description: + * All STM32 architectures must provide the following entry point. This entry point + * is called early in the initialization -- after all memory has been configured + * and mapped but before any devices have been initialized. + * + ************************************************************************************/ + +__EXPORT void +stm32_boardinitialize(void) +{ + board_on_reset(-1); /* Reset PWM first thing */ + + /* configure LEDs */ + + board_autoled_initialize(); + + /* configure pins */ + + const uint32_t gpio[] = PX4_GPIO_INIT_LIST; + px4_gpio_init(gpio, arraySize(gpio)); + + /* configure USB interfaces */ + + stm32_usbinitialize(); +} + +/**************************************************************************** + * 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 */ + + /* Need hrt running before using the ADC */ + + px4_platform_init(); + + + if (OK == board_determine_hw_info()) { + syslog(LOG_INFO, "[boot] Rev 0x%1x : Ver 0x%1x %s\n", board_get_hw_revision(), board_get_hw_version(), + board_get_hw_type_name()); + + } else { + syslog(LOG_ERR, "[boot] Failed to read HW revision and version\n"); + } + + 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_off(LED_BLUE); + + if (board_hardfault_init(2, true) != 0) { + led_on(LED_RED); + } + +# ifdef CONFIG_MMCSD + int ret = stm32_sdio_initialize(); + + if (ret != OK) { + led_on(LED_RED); + } + +# endif /* CONFIG_MMCSD */ + + /* Configure the HW based on the manifest */ + + px4_platform_configure(); +#endif + return OK; +} diff --git a/boards/amovlab/flycore/src/led.c b/boards/amovlab/flycore/src/led.c new file mode 100644 index 000000000000..c2930b870094 --- /dev/null +++ b/boards/amovlab/flycore/src/led.c @@ -0,0 +1,235 @@ +/**************************************************************************** + * + * Copyright (c) 2013 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file led.c + * + * 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 + 0, // Indexed by LED_RED, LED_AMBER + 0, // Indexed by LED_SAFETY (defaulted to an input) + 0, // 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/amovlab/flycore/src/manifest.c b/boards/amovlab/flycore/src/manifest.c new file mode 100644 index 000000000000..d8dcfc96a4e6 --- /dev/null +++ b/boards/amovlab/flycore/src/manifest.c @@ -0,0 +1,132 @@ +/**************************************************************************** + * + * Copyright (c) 2018, 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file manifest.c + * + * This module supplies the interface to the manifest of hardware that is + * optional and dependent on the HW REV and HW VER IDs + * + * The manifest allows the system to know whether a hardware option + * say for example the PX4IO is an no-pop option vs it is broken. + * + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include + +#include "systemlib/px4_macros.h" + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +typedef struct { + uint32_t hw_ver_rev; /* the version and revision */ + const px4_hw_mft_item_t *mft; /* The first entry */ + uint32_t entries; /* the lenght of the list */ +} px4_hw_mft_list_entry_t; + +typedef px4_hw_mft_list_entry_t *px4_hw_mft_list_entry; +#define px4_hw_mft_list_uninitialized (px4_hw_mft_list_entry) -1 + +static const px4_hw_mft_item_t device_unsupported = {0, 0, 0}; + +// List of components on a specific board configuration +// The index of those components is given by the enum (px4_hw_mft_item_id_t) +// declared in board_common.h +static const px4_hw_mft_item_t hw_mft_list_durandal[] = { + { + .present = 1, + .mandatory = 1, + .connection = px4_hw_con_onboard, + }, +}; + +static px4_hw_mft_list_entry_t mft_lists[] = { + // ver_rev + {0x0000, hw_mft_list_durandal, arraySize(hw_mft_list_durandal)}, +}; + +/************************************************************************************ + * Name: board_query_manifest + * + * Description: + * Optional returns manifest item. + * + * Input Parameters: + * manifest_id - the ID for the manifest item to retrieve + * + * Returned Value: + * 0 - item is not in manifest => assume legacy operations + * pointer to a manifest item + * + ************************************************************************************/ + +__EXPORT px4_hw_mft_item board_query_manifest(px4_hw_mft_item_id_t id) +{ + static px4_hw_mft_list_entry boards_manifest = px4_hw_mft_list_uninitialized; + + if (boards_manifest == px4_hw_mft_list_uninitialized) { + uint32_t ver_rev = board_get_hw_version() << 16; + ver_rev |= board_get_hw_revision(); + + for (unsigned i = 0; i < arraySize(mft_lists); i++) { + if (mft_lists[i].hw_ver_rev == ver_rev) { + boards_manifest = &mft_lists[i]; + break; + } + } + + if (boards_manifest == px4_hw_mft_list_uninitialized) { + syslog(LOG_ERR, "[boot] Board %08" PRIx32 " is not supported!\n", ver_rev); + } + } + + px4_hw_mft_item rv = &device_unsupported; + + if (boards_manifest != px4_hw_mft_list_uninitialized && + id < boards_manifest->entries) { + rv = &boards_manifest->mft[id]; + } + + return rv; +} diff --git a/boards/amovlab/flycore/src/mtd.cpp b/boards/amovlab/flycore/src/mtd.cpp new file mode 100644 index 000000000000..be7e6a3e75a7 --- /dev/null +++ b/boards/amovlab/flycore/src/mtd.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** + * + * Copyright (C) 2020 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +// KiB BS nB +static const px4_mft_device_t spi4 = { // FM25V02A on FMUM native: 32K X 8, emulated as (1024 Blocks of 32) + .bus_type = px4_mft_device_t::SPI, + .devid = SPIDEV_FLASH(0) +}; + +static const px4_mtd_entry_t fmum_fram = { + .device = &spi4, + .npart = 1, + .partd = { + { + .type = MTD_PARAMETERS, + .path = "/fs/mtd_params", + .nblocks = (32768 / (1 << CONFIG_RAMTRON_EMULATE_SECTOR_SHIFT)) + } + }, +}; + +static const px4_mtd_manifest_t board_mtd_config = { + .nconfigs = 1, + .entries = { + &fmum_fram + } +}; + +static const px4_mft_entry_s mtd_mft = { + .type = MTD, + .pmft = (void *) &board_mtd_config, +}; + +static const px4_mft_s mft = { + .nmft = 1, + .mfts = { + &mtd_mft + } +}; + +const px4_mft_s *board_get_manifest(void) +{ + return &mft; +} diff --git a/boards/amovlab/flycore/src/sdio.c b/boards/amovlab/flycore/src/sdio.c new file mode 100644 index 000000000000..869d757756a0 --- /dev/null +++ b/boards/amovlab/flycore/src/sdio.c @@ -0,0 +1,177 @@ +/**************************************************************************** + * + * Copyright (C) 2014, 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "chip.h" +#include "board_config.h" +#include "stm32_gpio.h" +#include "stm32_sdmmc.h" + +#ifdef CONFIG_MMCSD + + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Card detections requires card support and a card detection GPIO */ + +#define HAVE_NCD 1 +#if !defined(GPIO_SDMMC1_NCD) +# undef HAVE_NCD +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static FAR struct sdio_dev_s *sdio_dev; +#ifdef HAVE_NCD +static bool g_sd_inserted = 0xff; /* Impossible value */ +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_ncd_interrupt + * + * Description: + * Card detect interrupt handler. + * + ****************************************************************************/ + +#ifdef HAVE_NCD +static int stm32_ncd_interrupt(int irq, FAR void *context) +{ + bool present; + + present = !stm32_gpioread(GPIO_SDMMC1_NCD); + + if (sdio_dev && present != g_sd_inserted) { + sdio_mediachange(sdio_dev, present); + g_sd_inserted = present; + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +int stm32_sdio_initialize(void) +{ + int ret; + +#ifdef HAVE_NCD + /* Card detect */ + + bool cd_status; + + /* Configure the card detect GPIO */ + + stm32_configgpio(GPIO_SDMMC1_NCD); + + /* Register an interrupt handler for the card detect pin */ + + stm32_gpiosetevent(GPIO_SDMMC1_NCD, true, true, true, stm32_ncd_interrupt); +#endif + + /* Mount the SDIO-based MMC/SD block driver */ + /* First, get an instance of the SDIO interface */ + + finfo("Initializing SDIO slot %d\n", SDIO_SLOTNO); + + sdio_dev = sdio_initialize(SDIO_SLOTNO); + + if (!sdio_dev) { + syslog(LOG_ERR, "[boot] Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); + return -ENODEV; + } + + /* Now bind the SDIO interface to the MMC/SD driver */ + + finfo("Bind SDIO to the MMC/SD driver, minor=%d\n", SDIO_MINOR); + + ret = mmcsd_slotinitialize(SDIO_MINOR, sdio_dev); + + if (ret != OK) { + syslog(LOG_ERR, "[boot] Failed to bind SDIO to the MMC/SD driver: %d\n", ret); + return ret; + } + + finfo("Successfully bound SDIO to the MMC/SD driver\n"); + +#ifdef HAVE_NCD + /* Use SD card detect pin to check if a card is g_sd_inserted */ + + cd_status = !stm32_gpioread(GPIO_SDMMC1_NCD); + finfo("Card detect : %d\n", cd_status); + + sdio_mediachange(sdio_dev, cd_status); +#else + /* Assume that the SD card is inserted. What choice do we have? */ + + sdio_mediachange(sdio_dev, true); +#endif + + return OK; +} + +#endif /* CONFIG_MMCSD */ diff --git a/boards/amovlab/flycore/src/spi.cpp b/boards/amovlab/flycore/src/spi.cpp new file mode 100644 index 000000000000..8d7e99e95fee --- /dev/null +++ b/boards/amovlab/flycore/src/spi.cpp @@ -0,0 +1,54 @@ +/**************************************************************************** + * + * Copyright (C) 2020, 2022 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +#include +#include +#include + +constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { + initSPIBus(SPI::Bus::SPI1, { + initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortE, GPIO::Pin3}, SPI::DRDY{GPIO::PortB, GPIO::Pin2}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortE, GPIO::Pin4}, SPI::DRDY{GPIO::PortA, GPIO::Pin8}), + initSPIDevice(DRV_BARO_DEVTYPE_MS5611, SPI::CS{GPIO::PortD, GPIO::Pin10}), + }), + initSPIBus(SPI::Bus::SPI2, { + initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortE, GPIO::Pin15}, SPI::DRDY{GPIO::PortC, GPIO::Pin0}), + }), + initSPIBus(SPI::Bus::SPI4, { + initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortE, GPIO::Pin10}), + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/amovlab/flycore/src/timer_config.cpp b/boards/amovlab/flycore/src/timer_config.cpp new file mode 100644 index 000000000000..261f758dadca --- /dev/null +++ b/boards/amovlab/flycore/src/timer_config.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +/* Timer allocation + * + * TIM1_CH1 T FMU_CH1 PE9 + * TIM1_CH2 T FMU_CH2 PE11 + * TIM1_CH3 T FMU_CH3 PE13 + * TIM1_CH4 T FMU_CH4 PE14 + * TIM3_CH2 T FMU_CH5 PA7 + * TIM3_CH3 T FMU_CH6 PB0 + * TIM3_CH4 T FMU_CH7 PC9 + * TIM4_CH2 T FMU_CH8 PD13 + * TIM4_CH3 T FMU_CH9 PD14 + * TIM4_CH4 T FMU_CH10 PD15 + */ + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer1, DMA{DMA::Index1}), + initIOTimer(Timer::Timer3, DMA{DMA::Index2}), + initIOTimer(Timer::Timer4), + initIOTimer(Timer::Timer5), +}; + +/*Map by timer and channel size*/ +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel1}, {GPIO::PortE, GPIO::Pin9}), + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel2}, {GPIO::PortE, GPIO::Pin11}), + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel3}, {GPIO::PortE, GPIO::Pin13}), + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel4}, {GPIO::PortE, GPIO::Pin14}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel2}, {GPIO::PortA, GPIO::Pin7}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel3}, {GPIO::PortB, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel4}, {GPIO::PortC, GPIO::Pin9}), + 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::Channel4}, {GPIO::PortD, GPIO::Pin15}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/amovlab/flycore/src/usb.c b/boards/amovlab/flycore/src/usb.c new file mode 100644 index 000000000000..e06a6a53a523 --- /dev/null +++ b/boards/amovlab/flycore/src/usb.c @@ -0,0 +1,106 @@ +/**************************************************************************** + * + * Copyright (C) 2016 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file amovlab_flycore_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); +} From 12e83f07bc220412c20a8356c2307c239995aea8 Mon Sep 17 00:00:00 2001 From: lvguofei <1969354053@qq.com> Date: Wed, 20 May 2026 12:17:21 +0800 Subject: [PATCH 2/5] board(amovlab): polish Flycore board port and docs --- boards/amovlab/flycore/default.px4board | 1 - .../extras/amovlab_flycore_bootloader.bin | Bin 43164 -> 43164 bytes boards/amovlab/flycore/init/rc.board_defaults | 3 + boards/amovlab/flycore/init/rc.board_sensors | 6 ++ boards/amovlab/flycore/src/manifest.c | 11 ++- docs/en/SUMMARY.md | 1 + docs/en/flight_controller/amovlab_flycore.md | 85 ++++++++++++++++++ .../autopilot_manufacturer_supported.md | 1 + docs/zh/SUMMARY.md | 1 + docs/zh/flight_controller/amovlab_flycore.md | 85 ++++++++++++++++++ .../autopilot_manufacturer_supported.md | 1 + 11 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 docs/en/flight_controller/amovlab_flycore.md create mode 100644 docs/zh/flight_controller/amovlab_flycore.md diff --git a/boards/amovlab/flycore/default.px4board b/boards/amovlab/flycore/default.px4board index 18f56f892a95..8ceacdc8f56c 100644 --- a/boards/amovlab/flycore/default.px4board +++ b/boards/amovlab/flycore/default.px4board @@ -23,7 +23,6 @@ CONFIG_DRIVERS_LIGHTS_RGBLED_AW2023=y CONFIG_DRIVERS_PWM_OUT=y CONFIG_DRIVERS_RC_INPUT=y CONFIG_DRIVERS_TONE_ALARM=y -CONFIG_DRIVERS_TMP102A=y CONFIG_DRIVERS_UAVCAN=y CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE=6 CONFIG_MODULES_AIRSPEED_SELECTOR=y diff --git a/boards/amovlab/flycore/extras/amovlab_flycore_bootloader.bin b/boards/amovlab/flycore/extras/amovlab_flycore_bootloader.bin index cf42b52d3633cdd625348aae6289f08c3b95c1d5..2a3ed23f50fbd966f41a05519a849f8abcdab829 100755 GIT binary patch delta 29 lcmbPpk!j9FrVWhC_$>4c(vy?S6U~fMEzJ`*^DpaV0sy0-3N!!! delta 29 lcmbPpk!j9FrVWhC_{{VS(k+t{O_S4%EiBSD^DpaV0sy0J3OWD) diff --git a/boards/amovlab/flycore/init/rc.board_defaults b/boards/amovlab/flycore/init/rc.board_defaults index 7767ea583c2e..1c90aec65e3b 100644 --- a/boards/amovlab/flycore/init/rc.board_defaults +++ b/boards/amovlab/flycore/init/rc.board_defaults @@ -1,6 +1,9 @@ #!/bin/sh # # board specific defaults +# +# No onboard magnetometer; yaw uses GPS when available unless the user adds +# an external compass module (see amovlab_flycore.md). #------------------------------------------------------------------------------ if ver hwtypecmp FLYCORE0000 diff --git a/boards/amovlab/flycore/init/rc.board_sensors b/boards/amovlab/flycore/init/rc.board_sensors index 3c4e74c969e9..765f62d2f2d0 100644 --- a/boards/amovlab/flycore/init/rc.board_sensors +++ b/boards/amovlab/flycore/init/rc.board_sensors @@ -1,6 +1,12 @@ #!/bin/sh # # AMOVLAB FLYCORE specific board sensors init +# +# Onboard: BMI088 + ICM42688P + MS5611 (no magnetometer). +# External I2C1 / I2C4 can host an optional GPS/compass module if the user +# installs one; default firmware does not start magnetometer drivers here. +# COMMON_MAGNETOMETER is enabled in the build so optional modules can be +# started manually from NSH if needed. #------------------------------------------------------------------------------ board_adc start diff --git a/boards/amovlab/flycore/src/manifest.c b/boards/amovlab/flycore/src/manifest.c index d8dcfc96a4e6..4b7713a7e239 100644 --- a/boards/amovlab/flycore/src/manifest.c +++ b/boards/amovlab/flycore/src/manifest.c @@ -73,7 +73,12 @@ static const px4_hw_mft_item_t device_unsupported = {0, 0, 0}; // List of components on a specific board configuration // The index of those components is given by the enum (px4_hw_mft_item_id_t) // declared in board_common.h -static const px4_hw_mft_item_t hw_mft_list_durandal[] = { +static const px4_hw_mft_item_t hw_mft_list_flycore_v00[] = { + { + .present = 0, + .mandatory = 0, + .connection = px4_hw_con_unknown, + }, { .present = 1, .mandatory = 1, @@ -82,8 +87,8 @@ static const px4_hw_mft_item_t hw_mft_list_durandal[] = { }; static px4_hw_mft_list_entry_t mft_lists[] = { - // ver_rev - {0x0000, hw_mft_list_durandal, arraySize(hw_mft_list_durandal)}, + // ver_rev FLYCORE HW ver=0 rev=0 + {0x0000, hw_mft_list_flycore_v00, arraySize(hw_mft_list_flycore_v00)}, }; /************************************************************************************ diff --git a/docs/en/SUMMARY.md b/docs/en/SUMMARY.md index 3e4b81b77050..14d3dfa13607 100644 --- a/docs/en/SUMMARY.md +++ b/docs/en/SUMMARY.md @@ -161,6 +161,7 @@ - [Accton Godwit GA1](flight_controller/accton-godwit_ga1.md) - [AirMind MindPX](flight_controller/mindpx.md) - [AirMind MindRacer](flight_controller/mindracer.md) + - [Amovlab Flycore](flight_controller/amovlab_flycore.md) - [ARK Electronics ARKV6X](flight_controller/ark_v6x.md) - [ARK FPV Flight Controller](flight_controller/ark_fpv.md) - [ARK Pi6X Flow Flight Controller](flight_controller/ark_pi6x.md) diff --git a/docs/en/flight_controller/amovlab_flycore.md b/docs/en/flight_controller/amovlab_flycore.md new file mode 100644 index 000000000000..66bc64de1114 --- /dev/null +++ b/docs/en/flight_controller/amovlab_flycore.md @@ -0,0 +1,85 @@ +# Amovlab Flycore + +::: warning +PX4 does not manufacture this (or any) autopilot. +Contact the [manufacturer](https://amovlab.com/) for hardware support or compliance issues. +::: + +::: info +This flight controller is intended for inclusion in the [manufacturer supported](../flight_controller/autopilot_manufacturer_supported.md) board list. +::: + +## Sensor and bus configuration + +The default Flycore PX4 port matches the hardware as shipped: + +- **Onboard sensors:** BMI088 + ICM42688P + MS5611 (**no magnetometer**). +- **External I2C1 / I2C4:** connectors for an **optional** GPS/compass puck or other I2C peripherals if the user installs them. +- **Default firmware:** `rc.board_sensors` starts only onboard IMUs and barometer; it does **not** `start` magnetometers or other external sensors that are not fitted by default. + +`CONFIG_COMMON_MAGNETOMETER` is enabled in the default build so users who add a compatible external compass module can start the appropriate driver from the [system console](../debug/system_console.md) (for example after checking the bus with `i2cdetect`). + +Without an external magnetometer, yaw in flight relies on GPS course when available and other estimator settings as configured in QGroundControl. Plan missions accordingly for GPS-denied operation. + +## Overview + +- **MCU:** STM32H743 (Cortex-M7) +- **Onboard IMU:** Bosch BMI088 (SPI1), InvenSense ICM42688P (SPI2) +- **Onboard barometer:** MS5611 (SPI1) +- **PWM:** 10 FMU outputs (no PX4IO coprocessor) +- **CAN:** dual external CAN (FDCAN1 / FDCAN2) +- **USB:** product string `AMOVLAB FLYCORE` + +## Serial port mapping + +| Port | Device | `default.px4board` | +| ------ | ------------- | ------------------ | +| TELEM1 | `/dev/ttyS0` | CONFIG_BOARD_SERIAL_TEL1 | +| TELEM2 | `/dev/ttyS1` | CONFIG_BOARD_SERIAL_TEL2 | +| GPS1 | `/dev/ttyS2` | CONFIG_BOARD_SERIAL_GPS1 | +| TELEM3 | `/dev/ttyS3` | CONFIG_BOARD_SERIAL_TEL3 | +| RC | `/dev/ttyS4` | CONFIG_BOARD_SERIAL_RC | +| GPS2 | `/dev/ttyS5` | CONFIG_BOARD_SERIAL_GPS2 | + +## Building firmware + +```sh +make amovlab_flycore_default +``` + +Bootloader: + +```sh +make amovlab_flycore_bootloader +``` + +Upload (USB): + +```sh +make amovlab_flycore_default upload +``` + +## Bootloader / board ID + +- **board_id:** 106 (`boards/amovlab/flycore/firmware.prototype`) +- Bootloader USB product string: `PX4 BL AMOV FLYCORE` + +## Default airframe + +For hardware type `FLYCORE0000`, `rc.board_defaults` sets `SYS_AUTOSTART` to **4014** (generic multicopter airframe class). +Adjust the airframe in QGroundControl to match your vehicle. + +## Optional external magnetometer + +If you install a GPS/compass module on I2C1 or I2C4, probe the bus (`i2cdetect -b 1` / `i2cdetect -b 4`) and start the matching driver manually, for example: + +```sh +ist8310 -X -b 1 -R 10 start +``` + +Refer to the module datasheet and mounting orientation for the correct `-R` rotation argument. + +## Maintenance + +- **Vendor:** Amovlab +- **PX4 board target:** `amovlab_flycore_default` diff --git a/docs/en/flight_controller/autopilot_manufacturer_supported.md b/docs/en/flight_controller/autopilot_manufacturer_supported.md index f3fcfe819dc6..d43167906f8d 100644 --- a/docs/en/flight_controller/autopilot_manufacturer_supported.md +++ b/docs/en/flight_controller/autopilot_manufacturer_supported.md @@ -15,6 +15,7 @@ The boards in this category are: - [Accton Godwit GA1](../flight_controller/accton-godwit_ga1.md) - [AirMind MindPX](../flight_controller/mindpx.md) - [AirMind MindRacer](../flight_controller/mindracer.md) +- [Amovlab Flycore](../flight_controller/amovlab_flycore.md) - [ARK Electronics ARKV6X](../flight_controller/ark_v6x.md) (and [ARK Electronics Pixhawk Autopilot Bus Carrier](../flight_controller/ark_pab.md)) - [ARK FPV Flight Controller](../flight_controller/ark_fpv.md) - [ARK Pi6X Flow Flight Controller](../flight_controller/ark_pi6x.md) diff --git a/docs/zh/SUMMARY.md b/docs/zh/SUMMARY.md index 9b7e14bde6ef..07927c282a4c 100644 --- a/docs/zh/SUMMARY.md +++ b/docs/zh/SUMMARY.md @@ -164,6 +164,7 @@ - [Accton Godwit GA1](flight_controller/accton-godwit_ga1.md) - [AirMind MindPX](flight_controller/mindpx.md) - [AirMind MindRacer](flight_controller/mindracer.md) + - [Amovlab Flycore](flight_controller/amovlab_flycore.md) - [ARK Electronics ARKV6X](flight_controller/ark_v6x.md) - [ARK FPV Flight Controller](flight_controller/ark_fpv.md) - [ARK Pi6X Flow Flight Controller](flight_controller/ark_pi6x.md) diff --git a/docs/zh/flight_controller/amovlab_flycore.md b/docs/zh/flight_controller/amovlab_flycore.md new file mode 100644 index 000000000000..ccf777fb37f2 --- /dev/null +++ b/docs/zh/flight_controller/amovlab_flycore.md @@ -0,0 +1,85 @@ +# Amovlab Flycore + +::: warning +PX4 不生产该(或任何)自驾仪。 +硬件支持与合规问题请联系 [厂商](https://amovlab.com/)。 +::: + +::: info +本飞控计划纳入 [厂商支持](../flight_controller/autopilot_manufacturer_supported.md) 板卡列表。 +::: + +## 传感器与总线说明 + +默认 Flycore PX4 移植与出厂硬件一致: + +- **板载传感器:** BMI088 + ICM42688P + MS5611(**无磁力计**)。 +- **外置 I2C1 / I2C4:** 可连接用户自购的 **可选** GPS/罗盘一体模块或其他 I2C 外设。 +- **默认固件:** `rc.board_sensors` 仅启动板载 IMU 与气压计;**不会** 对默认未安装的磁力计或其他外置传感器执行 `start`。 + +默认构建中启用 `CONFIG_COMMON_MAGNETOMETER`,以便用户在加装兼容的外置罗盘后,可在 [系统控制台](../debug/system_console.md) 中手动启动对应驱动(建议先用 `i2cdetect` 确认总线与地址)。 + +无外置磁力计时,飞行偏航主要依赖 GPS 航向(在可用时)及 QGroundControl 中的估计器配置;无 GPS 环境请合理规划任务。 + +## 概述 + +- **MCU:** STM32H743(Cortex-M7) +- **板载 IMU:** Bosch BMI088(SPI1)、InvenSense ICM42688P(SPI2) +- **板载气压计:** MS5611(SPI1) +- **PWM:** 10 路 FMU 输出(无 PX4IO 协处理器) +- **CAN:** 双路外置 CAN(FDCAN1 / FDCAN2) +- **USB:** 产品字符串 `AMOVLAB FLYCORE` + +## 串口映射 + +| 接口 | 设备节点 | +| ------ | -------------- | +| TELEM1 | `/dev/ttyS0` | +| TELEM2 | `/dev/ttyS1` | +| GPS1 | `/dev/ttyS2` | +| TELEM3 | `/dev/ttyS3` | +| RC | `/dev/ttyS4` | +| GPS2 | `/dev/ttyS5` | + +## 编译固件 + +```sh +make amovlab_flycore_default +``` + +Bootloader: + +```sh +make amovlab_flycore_bootloader +``` + +烧录(USB): + +```sh +make amovlab_flycore_default upload +``` + +## Bootloader / 板 ID + +- **board_id:** 106(`boards/amovlab/flycore/firmware.prototype`) +- Bootloader USB 产品名:`PX4 BL AMOV FLYCORE` + +## 默认机架 + +硬件类型 `FLYCORE0000` 时,`rc.board_defaults` 将 `SYS_AUTOSTART` 设为 **4014**(通用多旋翼机架类)。 +请在 QGroundControl 中按实际机型调整机架。 + +## 可选外置磁力计 + +若在 I2C1 或 I2C4 上安装 GPS/罗盘模块,请先探测总线(`i2cdetect -b 1` / `i2cdetect -b 4`),再手动启动驱动,例如: + +```sh +ist8310 -X -b 1 -R 10 start +``` + +`-R` 旋转参数须根据模块安装方向与手册设置。 + +## 维护 + +- **厂商:** Amovlab +- **PX4 目标:** `amovlab_flycore_default` diff --git a/docs/zh/flight_controller/autopilot_manufacturer_supported.md b/docs/zh/flight_controller/autopilot_manufacturer_supported.md index cf0e3aa8e84e..056d57c44446 100644 --- a/docs/zh/flight_controller/autopilot_manufacturer_supported.md +++ b/docs/zh/flight_controller/autopilot_manufacturer_supported.md @@ -15,6 +15,7 @@ The boards in this category are: - [Accton Godwit GA1](../flight_controller/accton-godwit_ga1.md) - [AirMind MindPX](../flight_controller/mindpx.md) - [AirMind MindRacer](../flight_controller/mindracer.md) +- [Amovlab Flycore](../flight_controller/amovlab_flycore.md) - [ARK Electronics ARKV6X](../flight_controller/ark_v6x.md) (and [ARK Electronics Pixhawk Autopilot Bus Carrier](../flight_controller/ark_pab.md)) - [ARK FPV Flight Controller](../flight_controller/ark_fpv.md) - [ARK Pi6X Flow Flight Controller](../flight_controller/ark_pi6x.md) From f7275a0d058e57a8d9215f0113ca8d618e5b18fa Mon Sep 17 00:00:00 2001 From: amovlgf <127614218+amovlgf@users.noreply.github.com> Date: Wed, 20 May 2026 16:40:18 +0800 Subject: [PATCH 3/5] Update boards/amovlab/flycore/src/hw_config.h Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- boards/amovlab/flycore/src/hw_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/amovlab/flycore/src/hw_config.h b/boards/amovlab/flycore/src/hw_config.h index 11a89d7e5cca..b940ff21b920 100644 --- a/boards/amovlab/flycore/src/hw_config.h +++ b/boards/amovlab/flycore/src/hw_config.h @@ -118,7 +118,7 @@ #endif #ifndef BOOT_DEVICES_SELECTION -# define BOOT_DEVICES_SELECTION USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +# define BOOT_DEVICES_SELECTION (USB0_DEV|SERIAL0_DEV|SERIAL1_DEV) #endif #ifndef BOOT_DEVICES_FILTER_ONUSB From 59cfc97f7136d6005c14a15d1a832c4bde59591e Mon Sep 17 00:00:00 2001 From: amovlgf <127614218+amovlgf@users.noreply.github.com> Date: Wed, 20 May 2026 16:40:28 +0800 Subject: [PATCH 4/5] Update boards/amovlab/flycore/src/hw_config.h Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- boards/amovlab/flycore/src/hw_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/amovlab/flycore/src/hw_config.h b/boards/amovlab/flycore/src/hw_config.h index b940ff21b920..6427902cfe61 100644 --- a/boards/amovlab/flycore/src/hw_config.h +++ b/boards/amovlab/flycore/src/hw_config.h @@ -122,7 +122,7 @@ #endif #ifndef BOOT_DEVICES_FILTER_ONUSB -# define BOOT_DEVICES_FILTER_ONUSB USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +# define BOOT_DEVICES_FILTER_ONUSB (USB0_DEV|SERIAL0_DEV|SERIAL1_DEV) #endif #endif /* HW_CONFIG_H_ */ From 81606933d90ec7c93fe13b39a68db8f401df3cb9 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Thu, 21 May 2026 11:55:59 +1000 Subject: [PATCH 5/5] docs(docs): Subedit/prettier --- docs/en/flight_controller/amovlab_flycore.md | 66 ++++++++++++-------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/docs/en/flight_controller/amovlab_flycore.md b/docs/en/flight_controller/amovlab_flycore.md index 66bc64de1114..f4b129f4ed74 100644 --- a/docs/en/flight_controller/amovlab_flycore.md +++ b/docs/en/flight_controller/amovlab_flycore.md @@ -1,15 +1,36 @@ # Amovlab Flycore + + ::: warning PX4 does not manufacture this (or any) autopilot. Contact the [manufacturer](https://amovlab.com/) for hardware support or compliance issues. ::: + + ::: info This flight controller is intended for inclusion in the [manufacturer supported](../flight_controller/autopilot_manufacturer_supported.md) board list. ::: -## Sensor and bus configuration +## Overview + +- **MCU:** STM32H743 (Cortex-M7) +- **Onboard IMU:** Bosch BMI088 (SPI1), InvenSense ICM42688P (SPI2) +- **Onboard barometer:** MS5611 (SPI1) +- **PWM:** 10 FMU outputs (no PX4IO coprocessor) +- **CAN:** dual external CAN (FDCAN1 / FDCAN2) +- **USB:** product string `AMOVLAB FLYCORE` + +## Where to Buy {#store} + +TBD + +## Sensor and Bus Configuration The default Flycore PX4 port matches the hardware as shipped: @@ -21,55 +42,48 @@ The default Flycore PX4 port matches the hardware as shipped: Without an external magnetometer, yaw in flight relies on GPS course when available and other estimator settings as configured in QGroundControl. Plan missions accordingly for GPS-denied operation. -## Overview - -- **MCU:** STM32H743 (Cortex-M7) -- **Onboard IMU:** Bosch BMI088 (SPI1), InvenSense ICM42688P (SPI2) -- **Onboard barometer:** MS5611 (SPI1) -- **PWM:** 10 FMU outputs (no PX4IO coprocessor) -- **CAN:** dual external CAN (FDCAN1 / FDCAN2) -- **USB:** product string `AMOVLAB FLYCORE` - ## Serial port mapping -| Port | Device | `default.px4board` | -| ------ | ------------- | ------------------ | -| TELEM1 | `/dev/ttyS0` | CONFIG_BOARD_SERIAL_TEL1 | -| TELEM2 | `/dev/ttyS1` | CONFIG_BOARD_SERIAL_TEL2 | -| GPS1 | `/dev/ttyS2` | CONFIG_BOARD_SERIAL_GPS1 | -| TELEM3 | `/dev/ttyS3` | CONFIG_BOARD_SERIAL_TEL3 | -| RC | `/dev/ttyS4` | CONFIG_BOARD_SERIAL_RC | -| GPS2 | `/dev/ttyS5` | CONFIG_BOARD_SERIAL_GPS2 | +| Port | Device | `default.px4board` | +| ------ | ------------ | ------------------------ | +| TELEM1 | `/dev/ttyS0` | CONFIG_BOARD_SERIAL_TEL1 | +| TELEM2 | `/dev/ttyS1` | CONFIG_BOARD_SERIAL_TEL2 | +| GPS1 | `/dev/ttyS2` | CONFIG_BOARD_SERIAL_GPS1 | +| TELEM3 | `/dev/ttyS3` | CONFIG_BOARD_SERIAL_TEL3 | +| RC | `/dev/ttyS4` | CONFIG_BOARD_SERIAL_RC | +| GPS2 | `/dev/ttyS5` | CONFIG_BOARD_SERIAL_GPS2 | -## Building firmware +## Building Firmware + +To [build PX4](../dev_setup/building_px4.md) for this target: ```sh make amovlab_flycore_default ``` -Bootloader: +Build an upload via USB: ```sh -make amovlab_flycore_bootloader +make amovlab_flycore_default upload ``` -Upload (USB): +Build the Bootloader: ```sh -make amovlab_flycore_default upload +make amovlab_flycore_bootloader ``` -## Bootloader / board ID +## Bootloader / Board ID - **board_id:** 106 (`boards/amovlab/flycore/firmware.prototype`) - Bootloader USB product string: `PX4 BL AMOV FLYCORE` -## Default airframe +## Default Airframe For hardware type `FLYCORE0000`, `rc.board_defaults` sets `SYS_AUTOSTART` to **4014** (generic multicopter airframe class). Adjust the airframe in QGroundControl to match your vehicle. -## Optional external magnetometer +## Optional External Magnetometer If you install a GPS/compass module on I2C1 or I2C4, probe the bus (`i2cdetect -b 1` / `i2cdetect -b 4`) and start the matching driver manually, for example: