From 154623500efb615f9442ba8922ad0f438ff524b1 Mon Sep 17 00:00:00 2001 From: Niklas Hauser <121870655+niklaut@users.noreply.github.com> Date: Wed, 16 Apr 2025 04:31:37 +0200 Subject: [PATCH] boards: Add Auterion FMUv6s target --- boards/auterion/fmu-v6s/bootloader.px4board | 3 + boards/auterion/fmu-v6s/cmake/upload.cmake | 49 ++ boards/auterion/fmu-v6s/default.px4board | 94 ++++ .../extras/auterion_fmu-v6s_bootloader.bin | Bin 0 -> 32944 bytes boards/auterion/fmu-v6s/firmware.prototype | 13 + .../auterion/fmu-v6s/init/rc.board_defaults | 28 + boards/auterion/fmu-v6s/init/rc.board_mavlink | 23 + boards/auterion/fmu-v6s/init/rc.board_sensors | 30 ++ boards/auterion/fmu-v6s/multicopter.px4board | 12 + boards/auterion/fmu-v6s/nuttx-config/Kconfig | 17 + .../fmu-v6s/nuttx-config/bootloader/defconfig | 79 +++ .../fmu-v6s/nuttx-config/include/board.h | 494 ++++++++++++++++++ .../nuttx-config/include/board_dma_map.h | 126 +++++ .../fmu-v6s/nuttx-config/nsh/defconfig | 301 +++++++++++ .../nuttx-config/scripts/bootloader_script.ld | 215 ++++++++ .../fmu-v6s/nuttx-config/scripts/script.ld | 229 ++++++++ .../fmu-v6s/performance-test.px4board | 29 + boards/auterion/fmu-v6s/rover.px4board | 16 + boards/auterion/fmu-v6s/src/CMakeLists.txt | 72 +++ boards/auterion/fmu-v6s/src/board_config.h | 209 ++++++++ boards/auterion/fmu-v6s/src/bootloader_main.c | 59 +++ boards/auterion/fmu-v6s/src/can.c | 136 +++++ boards/auterion/fmu-v6s/src/hw_config.h | 126 +++++ boards/auterion/fmu-v6s/src/i2c.cpp | 39 ++ boards/auterion/fmu-v6s/src/init.c | 244 +++++++++ boards/auterion/fmu-v6s/src/led.c | 235 +++++++++ boards/auterion/fmu-v6s/src/mtd.cpp | 123 +++++ boards/auterion/fmu-v6s/src/spi.cpp | 48 ++ boards/auterion/fmu-v6s/src/timer_config.cpp | 66 +++ boards/auterion/fmu-v6s/zenoh.px4board | 4 + .../px4_work_queue/WorkQueueManager.hpp | 2 +- 31 files changed, 3120 insertions(+), 1 deletion(-) create mode 100644 boards/auterion/fmu-v6s/bootloader.px4board create mode 100644 boards/auterion/fmu-v6s/cmake/upload.cmake create mode 100644 boards/auterion/fmu-v6s/default.px4board create mode 100755 boards/auterion/fmu-v6s/extras/auterion_fmu-v6s_bootloader.bin create mode 100644 boards/auterion/fmu-v6s/firmware.prototype create mode 100644 boards/auterion/fmu-v6s/init/rc.board_defaults create mode 100644 boards/auterion/fmu-v6s/init/rc.board_mavlink create mode 100644 boards/auterion/fmu-v6s/init/rc.board_sensors create mode 100644 boards/auterion/fmu-v6s/multicopter.px4board create mode 100644 boards/auterion/fmu-v6s/nuttx-config/Kconfig create mode 100644 boards/auterion/fmu-v6s/nuttx-config/bootloader/defconfig create mode 100644 boards/auterion/fmu-v6s/nuttx-config/include/board.h create mode 100644 boards/auterion/fmu-v6s/nuttx-config/include/board_dma_map.h create mode 100644 boards/auterion/fmu-v6s/nuttx-config/nsh/defconfig create mode 100644 boards/auterion/fmu-v6s/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/auterion/fmu-v6s/nuttx-config/scripts/script.ld create mode 100644 boards/auterion/fmu-v6s/performance-test.px4board create mode 100644 boards/auterion/fmu-v6s/rover.px4board create mode 100644 boards/auterion/fmu-v6s/src/CMakeLists.txt create mode 100644 boards/auterion/fmu-v6s/src/board_config.h create mode 100644 boards/auterion/fmu-v6s/src/bootloader_main.c create mode 100644 boards/auterion/fmu-v6s/src/can.c create mode 100644 boards/auterion/fmu-v6s/src/hw_config.h create mode 100644 boards/auterion/fmu-v6s/src/i2c.cpp create mode 100644 boards/auterion/fmu-v6s/src/init.c create mode 100644 boards/auterion/fmu-v6s/src/led.c create mode 100644 boards/auterion/fmu-v6s/src/mtd.cpp create mode 100644 boards/auterion/fmu-v6s/src/spi.cpp create mode 100644 boards/auterion/fmu-v6s/src/timer_config.cpp create mode 100644 boards/auterion/fmu-v6s/zenoh.px4board diff --git a/boards/auterion/fmu-v6s/bootloader.px4board b/boards/auterion/fmu-v6s/bootloader.px4board new file mode 100644 index 0000000000..19b6e662be --- /dev/null +++ b/boards/auterion/fmu-v6s/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/auterion/fmu-v6s/cmake/upload.cmake b/boards/auterion/fmu-v6s/cmake/upload.cmake new file mode 100644 index 0000000000..7319b46df3 --- /dev/null +++ b/boards/auterion/fmu-v6s/cmake/upload.cmake @@ -0,0 +1,49 @@ +############################################################################ +# +# Copyright (c) 2023 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + + +set(PX4_FW_NAME ${PX4_BINARY_DIR}/${PX4_BOARD_VENDOR}_${PX4_BOARD_MODEL}_${PX4_BOARD_LABEL}.px4) + +add_custom_target(upload_skynode_usb + COMMAND ${PX4_SOURCE_DIR}/Tools/auterion/upload_skynode.sh --file=${PX4_FW_NAME} + DEPENDS ${PX4_FW_NAME} + COMMENT "Uploading PX4" + USES_TERMINAL +) + +add_custom_target(upload_skynode_wifi + COMMAND ${PX4_SOURCE_DIR}/Tools/auterion/upload_skynode.sh --file=${PX4_FW_NAME} --wifi + DEPENDS ${PX4_FW_NAME} + COMMENT "Uploading PX4" + USES_TERMINAL +) diff --git a/boards/auterion/fmu-v6s/default.px4board b/boards/auterion/fmu-v6s/default.px4board new file mode 100644 index 0000000000..bb1bd7fdc0 --- /dev/null +++ b/boards/auterion/fmu-v6s/default.px4board @@ -0,0 +1,94 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ETHERNET=y +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS6" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS2" +CONFIG_BOARD_PARAM_FILE="/fs/microsd/params" +CONFIG_DRIVERS_ADC_BOARD_ADC=y +CONFIG_DRIVERS_BAROMETER_BMP388=y +CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y +CONFIG_COMMON_DISTANCE_SENSOR=y +CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_GNSS_SEPTENTRIO=y +CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_IMU_BOSCH_BMI088=y +CONFIG_BMI088_ACCELEROMETER_INT2=y +CONFIG_COMMON_INS=y +CONFIG_COMMON_LIGHT=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_DATAMAN_PERSISTENT_STORAGE=n +CONFIG_DRIVERS_MAGNETOMETER_BOSCH_BMM350=y +CONFIG_DRIVERS_PWM_OUT=y +CONFIG_DRIVERS_RC_INPUT=y +CONFIG_DRIVERS_ROBOCLAW=y +CONFIG_DRIVERS_UAVCAN=y +CONFIG_BOARD_UAVCAN_INTERFACES=1 +CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE=2 +CONFIG_MODULES_AIRSPEED_SELECTOR=y +CONFIG_MODULES_BATTERY_STATUS=y +CONFIG_MODULES_CAMERA_FEEDBACK=y +CONFIG_MODULES_COMMANDER=y +CONFIG_MODULES_CONTROL_ALLOCATOR=y +CONFIG_MODULES_DATAMAN=y +CONFIG_MODULES_EKF2=y +CONFIG_MODULES_ESC_BATTERY=y +CONFIG_MODULES_EVENTS=y +CONFIG_MODULES_FLIGHT_MODE_MANAGER=y +CONFIG_MODULES_FW_ATT_CONTROL=y +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_FW_POS_CONTROL=y +CONFIG_FIGURE_OF_EIGHT=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_LOGGER_STACK_SIZE=4100 +CONFIG_MODULES_MAG_BIAS_ESTIMATOR=y +CONFIG_MODULES_MANUAL_CONTROL=y +CONFIG_MODULES_MAVLINK=y +CONFIG_MAVLINK_DIALECT="development" +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_MODE_NAVIGATOR_VTOL_TAKEOFF=y +CONFIG_MODULES_RC_UPDATE=y +CONFIG_MODULES_ROVER_ACKERMANN=y +CONFIG_MODULES_ROVER_DIFFERENTIAL=y +CONFIG_MODULES_ROVER_MECANUM=y +CONFIG_MODULES_SENSORS=y +CONFIG_MODULES_SIMULATION_SIMULATOR_SIH=y +CONFIG_MODULES_TIME_PERSISTOR=y +CONFIG_MODULES_UXRCE_DDS_CLIENT=y +CONFIG_MODULES_VTOL_ATT_CONTROL=y +CONFIG_SYSTEMCMDS_ACTUATOR_TEST=y +CONFIG_SYSTEMCMDS_BSONDUMP=y +CONFIG_SYSTEMCMDS_DMESG=y +CONFIG_SYSTEMCMDS_GPIO=y +CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y +CONFIG_SYSTEMCMDS_I2C_LAUNCHER=y +CONFIG_SYSTEMCMDS_I2CDETECT=y +CONFIG_SYSTEMCMDS_LED_CONTROL=y +CONFIG_SYSTEMCMDS_MFT=y +CONFIG_SYSTEMCMDS_MFT_CFG=y +CONFIG_SYSTEMCMDS_MTD=y +CONFIG_SYSTEMCMDS_NETMAN=y +CONFIG_SYSTEMCMDS_NSHTERM=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y +CONFIG_SYSTEMCMDS_SD_STRESS=y +CONFIG_SYSTEMCMDS_SERIAL_TEST=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/auterion/fmu-v6s/extras/auterion_fmu-v6s_bootloader.bin b/boards/auterion/fmu-v6s/extras/auterion_fmu-v6s_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..ab4a99d348b866fbab23f634dc01159b2422e2ea GIT binary patch literal 32944 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 LIzhf^W9+{H*1C7J literal 0 HcmV?d00001 diff --git a/boards/auterion/fmu-v6s/firmware.prototype b/boards/auterion/fmu-v6s/firmware.prototype new file mode 100644 index 0000000000..b8a08b127c --- /dev/null +++ b/boards/auterion/fmu-v6s/firmware.prototype @@ -0,0 +1,13 @@ +{ + "board_id": 60, + "magic": "AutFWv1", + "description": "Firmware for the AutFMUv6S board", + "image": "", + "build_time": 0, + "summary": "AutFMUv6S", + "version": "0.1", + "image_size": 0, + "image_maxsize": 1966080, + "git_identity": "", + "board_revision": 0 +} diff --git a/boards/auterion/fmu-v6s/init/rc.board_defaults b/boards/auterion/fmu-v6s/init/rc.board_defaults new file mode 100644 index 0000000000..b68b2b1b98 --- /dev/null +++ b/boards/auterion/fmu-v6s/init/rc.board_defaults @@ -0,0 +1,28 @@ +#!/bin/sh +# +# board specific defaults +#------------------------------------------------------------------------------ + +# Set the backend of the dataman to SRAM +param set-default SYS_DM_BACKEND 1 +# Set TELEM1 as default mavlink connection +param set-default MAV_0_CONFIG 0 +# Disable logger writing to FRAM, only stream over MAVLINK +set LOGGER_ARGS "-m mavlink" + +# 200kOhm/10kOhm voltage divider on V_BAT +param set-default BAT1_V_DIV 21 + +# Skynode: use the "custom participant", IP=10.41.10.1 config for uxrce_dds_client +param set-default UXRCE_DDS_PTCFG 2 +param set-default UXRCE_DDS_AG_IP 170461697 +param set-default UXRCE_DDS_CFG 1000 + +# Update default IP config if needed +netman update_default -i eth0 + +# Start a second NSH connected to the debug port +nshterm /dev/ttyS3 & + +# Start the time_persistor to cyclically store the RTC in FRAM +time_persistor start diff --git a/boards/auterion/fmu-v6s/init/rc.board_mavlink b/boards/auterion/fmu-v6s/init/rc.board_mavlink new file mode 100644 index 0000000000..e5b1cc2029 --- /dev/null +++ b/boards/auterion/fmu-v6s/init/rc.board_mavlink @@ -0,0 +1,23 @@ +#!/bin/sh +# +# Auterion FMUv6s specific board MAVLink startup script. +#------------------------------------------------------------------------------ + +# If skynode base board is detected start Mavlink on Telem2 +if param compare MAV_S_FORWARD 1 +then + set S_FORWARD "-f" +else + set S_FORWARD "" +fi + +# TELEM1 is mapped to USART1 with flow control +mavlink start -d /dev/ttyS0 -b 3000000 -r 290000 -m onboard_low_bandwidth -x -z $S_FORWARD + +# External mavlink on EXTRAS connector +mavlink start -d /dev/ttyS2 -b 57600 -r 5000 -x + +# Ensure nothing else starts on TEL1 +set PRT_TEL1_ 1 + +unset S_FORWARD diff --git a/boards/auterion/fmu-v6s/init/rc.board_sensors b/boards/auterion/fmu-v6s/init/rc.board_sensors new file mode 100644 index 0000000000..9b2648f8e9 --- /dev/null +++ b/boards/auterion/fmu-v6s/init/rc.board_sensors @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Forward is where the MIPI and ESC connectors are +# +# Auterion FMUv6S specific board sensors init +#------------------------------------------------------------------------------ + +# For system_power and battery_status +board_adc start + +# IMU3 on SPI3, ROTATION_NONE=0 +bmi088 -A -R 0 -s start +bmi088 -G -R 0 -s start + +if ver hwtypecmp V6S013 V6S015 +then + # Revision(s) with BMM150 + # MAG on I2C4, ROTATION_ROLL_180=8 + bmm150 -I -R 8 start +else + # Revision(s) with BMM350 + # MAG on I2C4, ROTATION_ROLL_180=8 + bmm350 -I -R 8 start +fi + +# External compass on GPS1/I2C1 (the 3rd external bus): standard Holybro Pixhawk 4 or CUAV V5 GPS/compass puck (with lights, safety button, and buzzer) +ist8310 -X -b 1 -R 10 start + +# BARO on I2C4 +bmp388 -I -b 4 -a 0x77 start diff --git a/boards/auterion/fmu-v6s/multicopter.px4board b/boards/auterion/fmu-v6s/multicopter.px4board new file mode 100644 index 0000000000..296a35c21f --- /dev/null +++ b/boards/auterion/fmu-v6s/multicopter.px4board @@ -0,0 +1,12 @@ +CONFIG_COMMON_DIFFERENTIAL_PRESSURE=n +CONFIG_MODE_NAVIGATOR_VTOL_TAKEOFF=n +CONFIG_MODULES_AIRSPEED_SELECTOR=n +CONFIG_MODULES_FW_ATT_CONTROL=n +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=n +CONFIG_MODULES_FW_POS_CONTROL=n +CONFIG_MODULES_FW_RATE_CONTROL=n +CONFIG_MODULES_VTOL_ATT_CONTROL=n +CONFIG_COMMON_RC=y +CONFIG_EKF2_AUX_GLOBAL_POSITION=y +# CONFIG_EKF2_SIDESLIP is not set +# CONFIG_SENSORS_VEHICLE_AIRSPEED is not set diff --git a/boards/auterion/fmu-v6s/nuttx-config/Kconfig b/boards/auterion/fmu-v6s/nuttx-config/Kconfig new file mode 100644 index 0000000000..bb33d3cfda --- /dev/null +++ b/boards/auterion/fmu-v6s/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/auterion/fmu-v6s/nuttx-config/bootloader/defconfig b/boards/auterion/fmu-v6s/nuttx-config/bootloader/defconfig new file mode 100644 index 0000000000..e053ce7647 --- /dev/null +++ b/boards/auterion/fmu-v6s/nuttx-config/bootloader/defconfig @@ -0,0 +1,79 @@ +# +# 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_DISABLE_PTHREAD is not set +# CONFIG_SPI_EXCHANGE is not set +# CONFIG_STM32H7_SYSCFG is not set +# CONFIG_STM32H7_USE_LEGACY_PINMAP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/auterion/fmu-v6s/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="auterion" +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_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_MUTEX_ROBUST=y +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_PROGMEM=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_USART1=y +CONFIG_SYSTEMTICK_HOOK=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_TTY_SIGINT=y +CONFIG_TTY_SIGINT_CHAR=0x03 +CONFIG_TTY_SIGTSTP=y +CONFIG_USEC_PER_TICK=1000 diff --git a/boards/auterion/fmu-v6s/nuttx-config/include/board.h b/boards/auterion/fmu-v6s/nuttx-config/include/board.h new file mode 100644 index 0000000000..0bb284be5c --- /dev/null +++ b/boards/auterion/fmu-v6s/nuttx-config/include/board.h @@ -0,0 +1,494 @@ +/************************************************************************************ + * nuttx-configs/auterion_fmu-v6s/include/board.h + * + * Copyright (C) 2016-2024 Gregory Nutt. All rights reserved. + * Authors: David Sidrane + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ +#ifndef __NUTTX_CONFIG_PX4_FMU_V6S_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_PX4_FMU_V6S_INCLUDE_BOARD_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include "board_dma_map.h" + +#include + +#ifndef __ASSEMBLY__ +# include +#endif + +#include "stm32_rcc.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/* Clocking *************************************************************************/ +/* The auterion_fmu-v6s board provides the following clock sources: + * + * XTAL4: 24 MHz crystal for HSE + * + * So we have these clock source available within the STM32 + * + * HSI: 16 MHz RC factory-trimmed + * HSE: 24 MHz crystal for HSE + */ + +#define STM32_BOARD_XTAL 24000000ul + +#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 = 24,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 2 - 4 MHz input, enable DIVP, DIVQ, DIVR + * + * PLL1_VCO = (24,000,000 / 12) * 450 = 900 MHz + * + * PLL1P = PLL1_VCO/2 = 900 MHz / 2 = 450 MHz + * PLL1Q = PLL1_VCO/9 = 900 MHz / 9 = 100 MHz **used for ETH REF CLK via MCO1/2** + * PLL1R = PLL1_VCO/8 = 900 MHz / 8 = 112.5 MHz + */ + +#define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL1RGE_2_4_MHZ | \ + RCC_PLLCFGR_DIVP1EN | \ + RCC_PLLCFGR_DIVQ1EN | \ + RCC_PLLCFGR_DIVR1EN) +#define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(12) +#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(450) +#define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) +#define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(9) +#define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) + +#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 12) * 450) +#define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) +#define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 9) +#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(6) +#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 / 6) * 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(6) +#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 / 6) * 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 = 450MHz + * CPUCLK = SYSCLK / 1 = 450 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 = 225 + */ + +#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 (112.5 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 (112.5 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 (112.5 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 (112.5 MHz) */ + +#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ +#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* Timer clock frequencies */ + +/* Timers driven from APB1 will be twice PCLK1 */ + +#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) + +/* Timers driven from APB2 will be twice PCLK2 */ + +#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) + +/* Kernel Clock Configuration + * + * Note: look at Table 54 in ST Manual + */ + +/* I2C123 clock source */ + +#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI + +/* I2C4 clock source */ + +#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI + +/* SPI123 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 + +/* SPI45 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 + +/* SPI6 clock source */ + +#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 + +/* USB 1 and 2 clock source */ + +#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 + +/* ADC 1 2 3 clock source */ + +#define STM32_RCC_D3CCIPR_ADCSRC RCC_D3CCIPR_ADCSEL_PLL2 + +/* 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 + + +/* LED definitions ******************************************************************/ +/* The Auterion FMUV6S 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 ************************************************/ + +/* ADC1 */ + +#define GPIO_ADC1_INP16 GPIO_ADC1_INP16_0 /* PA0 */ +#define GPIO_ADC123_INP10 GPIO_ADC123_INP10_0 /* PC0 */ +#define GPIO_ADC12_INP15 GPIO_ADC12_INP15_0 /* PA3 */ +#define GPIO_ADC12_INP13 GPIO_ADC12_INP13_0 /* PC3 */ +#define GPIO_ADC12_INP5 GPIO_ADC12_INP5_0 /* PB1 */ +#define GPIO_ADC12_INP18 GPIO_ADC12_INP18_0 /* PA4 */ + +/* Trace */ + +#define GPIO_TRACESWO GPIO_TRACESWO_0 + +/* U[S]ARTs */ + + +#define GPIO_USART1_RX GPIO_USART1_RX_2 /* PA10 */ +#define GPIO_USART1_TX (GPIO_USART1_TX_2 | GPIO_SPEED_25MHz) /* PA9 */ +#define GPIO_USART1_RTS GPIO_USART1_RTS_0 /* PA12 */ +#define GPIO_USART1_CTS GPIO_USART1_CTS_NSS_0 /* PA11 */ + +#define GPIO_USART2_RX GPIO_USART2_RX_2 /* PD6 */ +#define GPIO_USART2_TX (GPIO_USART2_TX_2 | GPIO_SPEED_25MHz) /* PD5 */ +#define GPIO_USART2_RTS 0 /* PD4 */ +#define GPIO_USART2_CTS 0 /* PD3 */ + +#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ +#define GPIO_USART3_TX (GPIO_USART3_TX_3 | GPIO_SPEED_2MHz) /* PD8 */ + +#define GPIO_UART4_RX GPIO_UART4_RX_5 /* PD0 */ +#define GPIO_UART4_TX (GPIO_UART4_TX_5 | GPIO_SPEED_2MHz) /* PD1 */ + +#define GPIO_UART5_RX (GPIO_UART5_RX_3 | GPIO_SPEED_2MHz) /* PD2 */ +#define GPIO_UART5_TX 0 /* We did not route out the TX pin of UART5 */ + +#define GPIO_UART7_RX 0 /* We did not route out the RX pin of UART7 */ +#define GPIO_UART7_TX (GPIO_UART7_TX_3 | GPIO_SPEED_2MHz) /* PE8 */ + +#define GPIO_UART8_RX GPIO_UART8_RX_1 /* PE0 */ +#define GPIO_UART8_TX (GPIO_UART8_TX_1 | GPIO_SPEED_2MHz) /* PE1 */ + + +/* CAN + * + * CAN1 is routed to transceiver. + */ +#define GPIO_CAN1_RX (GPIO_CAN1_RX_2 | GPIO_SPEED_50MHz) /* PB8 */ +#define GPIO_CAN1_TX (GPIO_CAN1_TX_2 | GPIO_SPEED_50MHz) /* PB9 */ + +/* SPI + * SPI1 is sensors1 + * SPI2 is sensors2 + * SPI3 is sensors3 + * SPI4 is FRAM + * + */ + +#define GPIO_SPI1_MISO (GPIO_SPI1_MISO_1 | GPIO_SPEED_50MHz) /* PA6 */ +#define GPIO_SPI1_MOSI (GPIO_SPI1_MOSI_3 | GPIO_SPEED_50MHz) /* PD7 */ +#define GPIO_SPI1_SCK (GPIO_SPI1_SCK_1 | GPIO_SPEED_50MHz) /* PA5 */ + +#define GPIO_SPI2_MISO (GPIO_SPI2_MISO_2 | GPIO_SPEED_50MHz) /* PC2 */ +#define GPIO_SPI2_MOSI (GPIO_SPI2_MOSI_1 | GPIO_SPEED_50MHz) /* PB15 */ +#define GPIO_SPI2_SCK (GPIO_SPI2_SCK_3 | GPIO_SPEED_50MHz) /* PB10 */ + + +#define GPIO_SPI3_MISO (GPIO_SPI3_MISO_2 | GPIO_SPEED_50MHz) /* PC11 */ +#define GPIO_SPI3_MOSI (GPIO_SPI3_MOSI_3 | GPIO_SPEED_50MHz) /* PB2 */ +#define GPIO_SPI3_SCK (GPIO_SPI3_SCK_2 | GPIO_SPEED_50MHz) /* PC10 */ + + +#define GPIO_SPI4_MISO (GPIO_SPI4_MISO_2 | GPIO_SPEED_50MHz) /* PE5 */ +#define GPIO_SPI4_MOSI (GPIO_SPI4_MOSI_2 | GPIO_SPEED_50MHz) /* PE6 */ +#define GPIO_SPI4_SCK (GPIO_SPI4_SCK_2 | GPIO_SPEED_50MHz) /* 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_1 | GPIO_SPEED_2MHz) /* PB6 */ +#define GPIO_I2C1_SDA (GPIO_I2C1_SDA_1 | GPIO_SPEED_2MHz) /* PB7 */ +#define GPIO_I2C1_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_2MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN6) +#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_2MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN7) + +#define GPIO_I2C4_SCL (GPIO_I2C4_SCL_1 | GPIO_SPEED_2MHz) /* PD12 */ +#define GPIO_I2C4_SDA (GPIO_I2C4_SDA_1 | GPIO_SPEED_2MHz) /* PD13 */ +#define GPIO_I2C4_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_2MHz | GPIO_OUTPUT_SET | GPIO_PORTD | GPIO_PIN12) +#define GPIO_I2C4_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_2MHz | GPIO_OUTPUT_SET | GPIO_PORTD | GPIO_PIN13) + + +/* The STM32H7 connects MAC-to-MAC to iMX8MP + * + * STM32H7 BOARD + * GPIO SIGNAL PIN NAME + * -------- ------------ ------------- + * PA7 ETH_CRS_DV CRS_DV + * PC1 ETH_MDC MDC + * PA2 ETH_MDIO MDIO + * PA1 ETH_REF_CL X1 + * PC4 ETH_RXD0 RX_D0 + * PC5 ETH_RXD1 RX_D1 + * PB11 ETH_TX_EN TX_EN + * PB12 ETH_TXD0 TX_D0 + * PB13 ETH_TXD1 TX_D1 + * + * The PHY address is 1, since COL/PHYAD0 features a pull up. + */ + +#define GPIO_ETH_MDC GPIO_ETH_MDC_0 /* PC1 */ +#define GPIO_ETH_MDIO GPIO_ETH_MDIO_0 /* PA2 */ +#define GPIO_ETH_RMII_CRS_DV GPIO_ETH_RMII_CRS_DV_0 /* PA7 */ +#define GPIO_ETH_RMII_REF_CLK GPIO_ETH_RMII_REF_CLK_0 /* PA1 */ + +#define GPIO_ETH_RMII_RXD0 GPIO_ETH_RMII_RXD0_0 /* PC4 */ +#define GPIO_ETH_RMII_RXD1 GPIO_ETH_RMII_RXD1_0 /* PC5 */ + +#define GPIO_ETH_RMII_TX_EN (GPIO_ETH_RMII_TX_EN_1 | GPIO_SPEED_100MHz) /* PB11 */ +#define GPIO_ETH_RMII_TXD0 (GPIO_ETH_RMII_TXD0_1 | GPIO_SPEED_100MHz) /* PB12 */ +#define GPIO_ETH_RMII_TXD1 (GPIO_ETH_RMII_TXD1_1 | GPIO_SPEED_100MHz) /* PB13 */ + + +/* 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_PORTC|GPIO_PIN6) /* PC6 AUX5 */ +# define PROBE_6 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN5) /* PB5 AUX6 */ +# define PROBE_7 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN0) /* PB0 AUX7 */ +# define PROBE_8 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN9) /* PC9 AUX8 */ +# define PROBE_9 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN7) /* PC7 CAP1 */ + +# define PROBE_INIT(mask) \ + do { \ + if ((mask)& PROBE_N(1)) { stm32_configgpio(PROBE_1); } \ + if ((mask)& PROBE_N(2)) { stm32_configgpio(PROBE_2); } \ + if ((mask)& PROBE_N(3)) { stm32_configgpio(PROBE_3); } \ + if ((mask)& PROBE_N(4)) { stm32_configgpio(PROBE_4); } \ + if ((mask)& PROBE_N(5)) { stm32_configgpio(PROBE_5); } \ + if ((mask)& PROBE_N(6)) { stm32_configgpio(PROBE_6); } \ + if ((mask)& PROBE_N(7)) { stm32_configgpio(PROBE_7); } \ + if ((mask)& PROBE_N(8)) { stm32_configgpio(PROBE_8); } \ + if ((mask)& PROBE_N(9)) { stm32_configgpio(PROBE_9); } \ + } while(0) + +# define PROBE(n,s) do {stm32_gpiowrite(PROBE_##n,(s));}while(0) +# define PROBE_MARK(n) PROBE(n,false);PROBE(n,true) +#else +# define PROBE_INIT(mask) +# define PROBE(n,s) +# define PROBE_MARK(n) +#endif + +#endif /*__NUTTX_CONFIG_PX4_FMU_V6S_INCLUDE_BOARD_H */ diff --git a/boards/auterion/fmu-v6s/nuttx-config/include/board_dma_map.h b/boards/auterion/fmu-v6s/nuttx-config/include/board_dma_map.h new file mode 100644 index 0000000000..79fdfbf910 --- /dev/null +++ b/boards/auterion/fmu-v6s/nuttx-config/include/board_dma_map.h @@ -0,0 +1,126 @@ +/**************************************************************************** + * + * 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 + +/* +FDCAN2 => no DMA, but dedicated message RAM +ETH => has its own DMA engine +I2C => has its own DMA engine + +The rest are general DMA engines: + +MDMA (D1): not supported by NuttX + +DMA1 (D2): 8 streams, mapped to DMAMUX1 requests 0-7 + +DMA2 (D2): 8 streams, mapped to DMAMUX1 requests 8-15 + +BDMA (D3): 8 streams, mapped to DMAMUX2 requests 0-7 + +I2C1_RX => DMAMUX1:33 (EXT) +I2C1_TX => DMAMUX1:34 (EXT) +I2C4_RX => DMAMUX2:29 (BARO + MAG + EEPROM) +I2C4_TX => DMAMUX2:30 (BARO + MAG + EEPROM) + +SPI3_RX => DMAMUX1:61 (IMU3 BMI088) +SPI3_TX => DMAMUX1:62 (IMU3 BMI088) +SPI4_RX => DMAMUX1:83 (FRAM) +SPI4_TX => DMAMUX1:84 (FRAM) + +UART4_RX => DMAMUX1:63 (NSH DEBUG) +UART4_TX => DMAMUX1:64 (NSH DEBUG) +UART7_RX => DMAMUX1:79 (SBUS INPUT) +UART7_RX => DMAMUX1:79 (ESC RX) +UART8_RX => DMAMUX1:81 (GPS) +UART8_TX => DMAMUX1:82 (GPS) +USART3_RX => DMAMUX1:45 (EXTRAS) +USART3_TX => DMAMUX1:46 (EXTRAS) + +USART1_RX => DMAMUX1:41 (MAVLINK) +USART1_TX => DMAMUX1:42 (MAVLINK) +USART2_RX => DMAMUX1:43 (NSH IMX) +USART2_TX => DMAMUX1:44 (NSH IMX) + +(TIM1_CH1 => DMAMUX1:11) +(TIM1_CH2 => DMAMUX1:12) +(TIM1_CH3 => DMAMUX1:13) +(TIM1_CH4 => DMAMUX1:14) +TIM1_UP => DMAMUX1:15 (PWM) + +(TIM3_CH1 => DMAMUX1:23) +(TIM3_CH2 => DMAMUX1:24) +(TIM3_CH3 => DMAMUX1:25) +(TIM3_CH4 => DMAMUX1:26) +TIM3_UP => DMAMUX1:27 (PWM) + +TIM8_CH2 => DMAMUX1:48 (PPM INPUT) +(TIM8_UP => DMAMUX1:51) + +*/ + + + +// DMAMUX1 Using at most 8 Channels on DMA1 -------- Assigned +// V + +#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* 1 TELEM1 (MAVLINK) */ +#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* 2 TELEM1 (MAVLINK) */ + +#define DMAMAP_UART8_RX DMAMAP_DMA12_UART8RX_0 /* 3 GPS1 */ +#define DMAMAP_UART8_TX DMAMAP_DMA12_UART8TX_0 /* 4 GPS1 */ + +#define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_0 /* 5 NSH IMX TX */ +#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* 6 NSH DBG TX */ + +// Assigned in timer_config.cpp + +// Timer 1 /* 7 TIM1UP */ +// Timer 3 /* 8 TIM3UP */ + + + +// DMAMUX2 Using at most 8 Channels on DMA2 -------- Assigned +// V + +#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_1 /* 1 BMI088 */ +#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_1 /* 2 BMI088 */ + +#define DMAMAP_SPI4_RX DMAMAP_DMA12_SPI4RX_1 /* 3 FRAM */ +#define DMAMAP_SPI4_TX DMAMAP_DMA12_SPI4TX_1 /* 4 FRAM */ + +#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* 5 TELEM2 */ +#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* 6 TELEM2 */ + +#define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_1 /* 7 SBUS IN */ +#define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_1 /* 8 ESC IN */ diff --git a/boards/auterion/fmu-v6s/nuttx-config/nsh/defconfig b/boards/auterion/fmu-v6s/nuttx-config/nsh/defconfig new file mode 100644 index 0000000000..6db3e943f9 --- /dev/null +++ b/boards/auterion/fmu-v6s/nuttx-config/nsh/defconfig @@ -0,0 +1,301 @@ +# +# 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_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_ARP is not set +# CONFIG_NSH_DISABLE_CAT is not set +# CONFIG_NSH_DISABLE_CD is not set +# CONFIG_NSH_DISABLE_CP is not set +# CONFIG_NSH_DISABLE_DATE is not set +# CONFIG_NSH_DISABLE_DF is not set +# CONFIG_NSH_DISABLE_ECHO is not set +# CONFIG_NSH_DISABLE_ENV is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_EXPORT is not set +# CONFIG_NSH_DISABLE_FREE is not set +# CONFIG_NSH_DISABLE_GET is not set +# CONFIG_NSH_DISABLE_HELP is not set +# CONFIG_NSH_DISABLE_IFCONFIG is not set +# CONFIG_NSH_DISABLE_IFUPDOWN is not set +# CONFIG_NSH_DISABLE_ITEF is not set +# CONFIG_NSH_DISABLE_KILL is not set +# CONFIG_NSH_DISABLE_LOOPS is not set +# CONFIG_NSH_DISABLE_LS is not set +# CONFIG_NSH_DISABLE_MKDIR is not set +# CONFIG_NSH_DISABLE_MKFATFS is not set +# CONFIG_NSH_DISABLE_MOUNT is not set +# CONFIG_NSH_DISABLE_MV is not set +# CONFIG_NSH_DISABLE_NSLOOKUP is not set +# CONFIG_NSH_DISABLE_PS is not set +# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set +# CONFIG_NSH_DISABLE_PWD is not set +# CONFIG_NSH_DISABLE_RM is not set +# CONFIG_NSH_DISABLE_RMDIR is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_SET is not set +# CONFIG_NSH_DISABLE_SLEEP is not set +# CONFIG_NSH_DISABLE_SOURCE is not set +# CONFIG_NSH_DISABLE_TELNETD is not set +# CONFIG_NSH_DISABLE_TEST is not set +# CONFIG_NSH_DISABLE_TIME is not set +# CONFIG_NSH_DISABLE_UMOUNT is not set +# CONFIG_NSH_DISABLE_UNSET is not set +# CONFIG_NSH_DISABLE_USLEEP is not set +# CONFIG_STM32H7_USE_LEGACY_PINMAP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/auterion/fmu-v6s/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="auterion" +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_POSIX_SPAWN_PROXY_STACKSIZE=4096 +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_DEBUG_FULLOPT=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_MEMFAULT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=y +CONFIG_DEFAULT_SMALL=y +CONFIG_DEV_FIFO_SIZE=0 +CONFIG_DEV_PIPE_MAXSIZE=1024 +CONFIG_DEV_PIPE_SIZE=70 +CONFIG_ETH0_PHY_LAN8742A=y +CONFIG_EXPERIMENTAL=y +CONFIG_FAT_DMAMEMORY=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FAT_LFN_ALIAS_HASH=y +CONFIG_FDCLONE_STDIO=y +CONFIG_FSUTILS_IPCFG=y +CONFIG_FS_BINFS=y +CONFIG_FS_CROMFS=y +CONFIG_FS_FAT=y +CONFIG_FS_FATTIME=y +CONFIG_FS_LITTLEFS=y +CONFIG_FS_LITTLEFS_BLOCK_CYCLE=-1 +CONFIG_FS_LITTLEFS_BLOCK_SIZE_FACTOR=4 +CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE=64 +CONFIG_FS_LITTLEFS_PROGRAM_SIZE_FACTOR=1 +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=4000 +CONFIG_IOB_NBUFFERS=24 +CONFIG_IOB_THROTTLE=0 +CONFIG_IPCFG_BINARY=y +CONFIG_IPCFG_CHARDEV=y +CONFIG_IPCFG_PATH="/fs/mtd_net" +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_MAX_EXITFUNS=1 +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MM_REGIONS=4 +CONFIG_MTD=y +CONFIG_MTD_BYTE_WRITE=y +CONFIG_MTD_PARTITION=y +CONFIG_MTD_PROGMEM=y +CONFIG_MTD_RAMTRON=y +CONFIG_NAME_MAX=40 +CONFIG_NET=y +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDB_DNSCLIENT_ENTRIES=8 +CONFIG_NETDB_DNSSERVER_NOADDR=y +CONFIG_NETDEV_PHY_IOCTL=y +CONFIG_NETINIT_DNS=y +CONFIG_NETINIT_DNSIPADDR=0xA290AFE +CONFIG_NETINIT_DRIPADDR=0xA290AFE +CONFIG_NETINIT_IPADDR=0xA290A02 +CONFIG_NETINIT_MONITOR=n +CONFIG_NETINIT_THREAD=y +CONFIG_NETINIT_THREAD_PRIORITY=49 +CONFIG_NET_ARP_IPIN=y +CONFIG_NET_ARP_SEND=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ETH_PKTSIZE=1518 +CONFIG_NET_ICMP=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_NACTIVESOCKETS=16 +CONFIG_NET_SOLINGER=y +CONFIG_NET_UDP=y +CONFIG_NET_UDP_CHECKSUMS=y +CONFIG_NET_UDP_WRITE_BUFFERS=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_ARGCAT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_CMDPARMS=y +CONFIG_NSH_CROMFSETC=y +CONFIG_NSH_LINELEN=128 +CONFIG_NSH_MAXARGUMENTS=15 +CONFIG_NSH_NESTDEPTH=8 +CONFIG_NSH_QUOTE=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSSECTSIZE=128 +CONFIG_NSH_STRERROR=y +CONFIG_NSH_VARS=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_SEM_PREALLOCHOLDERS=32 +CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_SIG_DEFAULT=y +CONFIG_SIG_SIGALRM_ACTION=y +CONFIG_SIG_SIGUSR1_ACTION=y +CONFIG_SIG_SIGUSR2_ACTION=y +CONFIG_SIG_SIGWORK=4 +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_BUFFER_SIZE=256 +CONFIG_STM32H7_ADC1=y +CONFIG_STM32H7_ADC3=y +CONFIG_STM32H7_BBSRAM=y +CONFIG_STM32H7_BBSRAM_FILES=5 +CONFIG_STM32H7_BDMA=y +CONFIG_STM32H7_BKPSRAM=y +CONFIG_STM32H7_DMA1=y +CONFIG_STM32H7_DMA2=y +CONFIG_STM32H7_DMACAPABLE=y +CONFIG_STM32H7_ETHMAC=y +CONFIG_STM32H7_FLASH_OVERRIDE_I=y +CONFIG_STM32H7_FLOWCONTROL_BROKEN=y +CONFIG_STM32H7_I2C1=y +CONFIG_STM32H7_I2C4=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_PHY_POLLING=y +CONFIG_STM32H7_NO_PHY=y +CONFIG_STM32H7_AUTONEG=n +CONFIG_STM32H7_ETHFD=y +CONFIG_STM32H7_ETH100MBPS=y +CONFIG_STM32H7_RMII_EXTCLK=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_RTC=y +CONFIG_STM32H7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y +CONFIG_STM32H7_RTC_MAGIC_REG=1 +CONFIG_STM32H7_SAVE_CRASHDUMP=y +CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_SPI3=y +CONFIG_STM32H7_SPI3_DMA=y +CONFIG_STM32H7_SPI3_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI4=y +CONFIG_STM32H7_SPI4_DMA=y +CONFIG_STM32H7_SPI4_DMA_BUFFER=4096 +CONFIG_STM32H7_TIM12=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM3=y +CONFIG_STM32H7_UART4=y +CONFIG_STM32H7_UART5=y +CONFIG_STM32H7_UART7=y +CONFIG_STM32H7_UART8=y +CONFIG_STM32H7_USART1=y +CONFIG_STM32H7_USART2=y +CONFIG_STM32H7_USART3=y +CONFIG_STM32H7_USART_BREAKS=y +CONFIG_STM32H7_USART_INVERT=y +CONFIG_STM32H7_USART_SINGLEWIRE=y +CONFIG_STM32H7_USART_SWAP=y +CONFIG_SYSTEM_DHCPC_RENEW=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_PING=y +CONFIG_SYSTEM_SYSTEM=y +CONFIG_TASK_NAME_SIZE=24 + +CONFIG_USART1_BAUD=3000000 +CONFIG_USART1_IFLOWCONTROL=y +CONFIG_USART1_OFLOWCONTROL=y +CONFIG_USART1_RXBUFSIZE=1500 +CONFIG_USART1_TXBUFSIZE=10000 +CONFIG_USART1_RXDMA=y +CONFIG_USART1_TXDMA=y + +CONFIG_USART2_BAUD=57600 +CONFIG_USART2_RXBUFSIZE=500 +CONFIG_USART2_TXBUFSIZE=1500 +CONFIG_USART2_TXDMA=y +CONFIG_USART2_SERIAL_CONSOLE=y + +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=600 +CONFIG_USART3_TXBUFSIZE=3000 +CONFIG_USART3_RXDMA=y +CONFIG_USART3_TXDMA=y + +CONFIG_UART4_BAUD=57600 +CONFIG_UART4_RXBUFSIZE=500 +CONFIG_UART4_TXBUFSIZE=1500 +CONFIG_UART4_TXDMA=y + +CONFIG_UART5_BAUD=100000 +CONFIG_UART5_RXBUFSIZE=600 +CONFIG_UART5_RXDMA=y + +CONFIG_UART7_BAUD=115200 +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_RXDMA=y + +CONFIG_UART8_BAUD=57600 +CONFIG_UART8_RXBUFSIZE=600 +CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_UART8_RXDMA=y +CONFIG_UART8_TXDMA=y + +CONFIG_USEC_PER_TICK=1000 +CONFIG_WATCHDOG=y diff --git a/boards/auterion/fmu-v6s/nuttx-config/scripts/bootloader_script.ld b/boards/auterion/fmu-v6s/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 0000000000..706140b466 --- /dev/null +++ b/boards/auterion/fmu-v6s/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 Auterion FMUV6S uses an STM32H743VI 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 STM32H743VI, 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 Auterion FMUV6S 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 STM32H743VI 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/auterion/fmu-v6s/nuttx-config/scripts/script.ld b/boards/auterion/fmu-v6s/nuttx-config/scripts/script.ld new file mode 100644 index 0000000000..89c8913ddf --- /dev/null +++ b/boards/auterion/fmu-v6s/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 Auterion FMUV6S uses an STM32H743VI 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 STM32H743VI, 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 Auterion FMUV6S 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 STM32H743VI 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/auterion/fmu-v6s/performance-test.px4board b/boards/auterion/fmu-v6s/performance-test.px4board new file mode 100644 index 0000000000..9184c6fb4a --- /dev/null +++ b/boards/auterion/fmu-v6s/performance-test.px4board @@ -0,0 +1,29 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ETHERNET=y +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS5" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS1" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS2" +CONFIG_BOARD_ROMFSROOT="performance-test" +CONFIG_DRIVERS_ADC_BOARD_ADC=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_MFT_CFG=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y +CONFIG_SYSTEMCMDS_SD_STRESS=y +CONFIG_SYSTEMCMDS_SERIAL_TEST=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/auterion/fmu-v6s/rover.px4board b/boards/auterion/fmu-v6s/rover.px4board new file mode 100644 index 0000000000..f754c54e36 --- /dev/null +++ b/boards/auterion/fmu-v6s/rover.px4board @@ -0,0 +1,16 @@ +CONFIG_MODULES_AIRSPEED_SELECTOR=n +CONFIG_MODULES_FLIGHT_MODE_MANAGER=n +CONFIG_MODULES_FW_ATT_CONTROL=n +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=n +CONFIG_MODULES_FW_POS_CONTROL=n +CONFIG_MODULES_FW_RATE_CONTROL=n +CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=n +CONFIG_MODULES_MC_ATT_CONTROL=n +CONFIG_MODULES_MC_AUTOTUNE_ATTITUDE_CONTROL=n +CONFIG_MODULES_MC_HOVER_THRUST_ESTIMATOR=n +CONFIG_MODULES_MC_POS_CONTROL=n +CONFIG_MODULES_MC_RATE_CONTROL=n +CONFIG_MODULES_VTOL_ATT_CONTROL=n +CONFIG_EKF2_AUX_GLOBAL_POSITION=y +# CONFIG_EKF2_WIND is not set +CONFIG_MODULES_DIFFERENTIAL_DRIVE=y diff --git a/boards/auterion/fmu-v6s/src/CMakeLists.txt b/boards/auterion/fmu-v6s/src/CMakeLists.txt new file mode 100644 index 0000000000..6ecdcc457d --- /dev/null +++ b/boards/auterion/fmu-v6s/src/CMakeLists.txt @@ -0,0 +1,72 @@ +############################################################################ +# +# 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 + 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 + spi.cpp + timer_config.cpp + ) + add_dependencies(drivers_board arch_board_hw_info) + + target_link_libraries(drivers_board + PRIVATE + arch_io_pins + arch_spi + arch_board_hw_info + drivers__led # drv_led_start + nuttx_arch # sdio + nuttx_drivers # sdio + px4_layer + ) +endif() diff --git a/boards/auterion/fmu-v6s/src/board_config.h b/boards/auterion/fmu-v6s/src/board_config.h new file mode 100644 index 0000000000..63d7ab0441 --- /dev/null +++ b/boards/auterion/fmu-v6s/src/board_config.h @@ -0,0 +1,209 @@ +/**************************************************************************** + * + * Copyright (c) 2016-2022 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file board_config.h + * + * Auterion FMU-v6s internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include + + +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +/* Configuration ************************************************************************************/ + +/* FIXME: remove with BOARD_HAS_SIMPLE_HW_VERSIONING */ +#define BOARD_HAS_HW_SPLIT_VERSIONING +#define BOARD_HAS_ONLY_EEPROM_VERSIONING + +#define HW_INFO_INIT_PREFIX "V6S" + + +/* Auterion FMU GPIOs ***********************************************************************************/ +/* LEDs are driven with push pull */ +#define GPIO_nLED_RED /* PB14 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN14) +#define GPIO_nLED_BLUE /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) +#define GPIO_nLED_GREEN /* PE3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN3) + +#define BOARD_HAS_CONTROL_STATUS_LEDS 1 +#define BOARD_OVERLOAD_LED LED_RED +#define BOARD_ARMED_STATE_LED LED_BLUE + + +/* SPI */ +#define BOARD_NUM_SPI_CFG_HW_VERSIONS 1 + + +/* I2C busses + * Devices on the onboard buses. + * + * Note that these are unshifted addresses. + */ +#define BOARD_MTD_NUM_EEPROM 1 /* MTD: imu_eeprom */ +#define PX4_I2C_BUS_MTD 4 + + +/* CAN */ +#define UAVCAN_NUM_IFACES_RUNTIME 1 + + +/* + * 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 + */ +#define ADC1_CH(n) (n) +#define SYSTEM_ADC_BASE STM32_ADC1_BASE + +/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ +/* PC3_C connected to PC3 internally, which connects to GPIO_ADC12_INP13 */ + +#define PX4_ADC_GPIO \ + /* PB1 */ GPIO_ADC12_INP5, \ + /* PC0 */ GPIO_ADC123_INP10, \ + /* PC3 */ GPIO_ADC12_INP13, \ + /* PA3 */ GPIO_ADC12_INP15, \ + /* PA0 */ GPIO_ADC1_INP16, \ + /* PA4 */ GPIO_ADC12_INP18 + +/* Define Channel numbers must match above GPIO pin IN(n) + * Note: These channel names are special, see board_common.h */ +#define ADC_BATTERY_CURRENT_CHANNEL /* PB1 = 0 */ ADC1_CH(5) +#define ADC_SCALED_V5_EXTERNAL_CHANNEL /* PC0 = 1 */ ADC1_CH(10) +#define ADC_BATTERY_VOLTAGE_CHANNEL /* PC3 = 2 */ ADC1_CH(13) +#define ADC_SCALED_V5_CHANNEL /* PA3 = 3 */ ADC1_CH(15) +#define ADC_EXTRAS_CHANNEL /* PA0 = 4 */ ADC1_CH(16) +#define ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL /* PA4 = 5 */ ADC1_CH(18) + +#define ADC_CHANNELS \ + ((1 << ADC_EXTRAS_CHANNEL) | \ + (1 << ADC_SCALED_V5_EXTERNAL_CHANNEL) | \ + (1 << ADC_SCALED_V5_CHANNEL) | \ + (1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL) | \ + (1 << ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL)) + +// Definitions for drivers/adc/board_adc +#define BOARD_ADC_USB_CONNECTED 0 +// a hack to also measure the external 5V rail +#define ADC_SCALED_VDD_3V3_SENSORS2_CHANNEL ADC_SCALED_V5_EXTERNAL_CHANNEL + + +/* PWM Timers */ +#define BOARD_NUM_IO_TIMERS 2 +#define DIRECT_PWM_OUTPUT_CHANNELS 8 + +/* High-resolution timer */ +#define HRT_TIMER 8 /* use timer8 for the HRT */ +#define HRT_TIMER_CHANNEL 3 /* use capture/compare channel 3 */ + +#define HRT_PPM_CHANNEL /* T8C2 */ 2 /* use capture/compare channel 1 */ +#define GPIO_PPM_IN /* PC7 */ GPIO_TIM8_CH2IN_1 + +/* RC Serial port (input only) */ +#define RC_SERIAL_PORT "/dev/ttyS4" + +/* 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 + +/* PD4 is ARMED + * The GPIO will be set as input while not armed with internal pull DOWN. + * While armed it shall be configured at a GPIO OUT set HIGH + */ +#define GPIO_ARMED_INIT (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTD|GPIO_PIN4) +#define GPIO_ARMED (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN4) +#define BOARD_INDICATE_EXTERNAL_LOCKOUT_STATE(enabled) px4_arch_configgpio((enabled) ? GPIO_ARMED : GPIO_ARMED_INIT) +#define BOARD_GET_EXTERNAL_LOCKOUT_STATE() px4_arch_gpioread(GPIO_ARMED) + +/* All pins to initialize on boot */ +#define PX4_GPIO_INIT_LIST { \ + GPIO_ARMED_INIT, \ + PX4_ADC_GPIO, \ + GPIO_CAN1_TX, \ + GPIO_CAN1_RX, \ + } + +/* Enable the buffer for the dmesg command */ +#define BOARD_ENABLE_CONSOLE_BUFFER + +__BEGIN_DECLS + +/**************************************************************************************************** + * Public Types + ****************************************************************************************************/ + +/**************************************************************************************************** + * Public data + ****************************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************************************** + * Public Functions + ****************************************************************************************************/ + +/**************************************************************************************************** + * Name: stm32_spiinitialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the Auterion FMU board. + * + ****************************************************************************************************/ + +extern void stm32_spiinitialize(void); + +extern void board_peripheral_reset(int ms); + +#include + +#endif /* __ASSEMBLY__ */ + +__END_DECLS diff --git a/boards/auterion/fmu-v6s/src/bootloader_main.c b/boards/auterion/fmu-v6s/src/bootloader_main.c new file mode 100644 index 0000000000..ccb9a8326b --- /dev/null +++ b/boards/auterion/fmu-v6s/src/bootloader_main.c @@ -0,0 +1,59 @@ +/**************************************************************************** + * + * 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 + +void board_late_initialize(void) +{ +} + +extern void sys_tick_handler(void); +void board_timerhook(void) +{ + sys_tick_handler(); +} diff --git a/boards/auterion/fmu-v6s/src/can.c b/boards/auterion/fmu-v6s/src/can.c new file mode 100644 index 0000000000..d013a75797 --- /dev/null +++ b/boards/auterion/fmu-v6s/src/can.c @@ -0,0 +1,136 @@ +/**************************************************************************** + * + * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file px4fmu_can.c + * + * Board-specific CAN functions. + */ + +#if !defined(CONFIG_CAN) + +#include + +#include "board_config.h" + + +__EXPORT +uint16_t board_get_can_interfaces(void) +{ + return 0b01; +} + +#else + +#include +#include + +#include +#include + +#include "chip.h" +#include "arm_internal.h" + +#include "chip.h" +#include "stm32_can.h" +#include "board_config.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ +/* Configuration ********************************************************************/ + +#if defined(CONFIG_STM32_CAN1) && defined(CONFIG_STM32_CAN2) +# warning "Both CAN1 and CAN2 are enabled. Assuming only CAN1." +# undef CONFIG_STM32_CAN2 +#endif + +#ifdef CONFIG_STM32_CAN1 +# define CAN_PORT 1 +#else +# define CAN_PORT 2 +#endif + +/************************************************************************************ + * Private Functions + ************************************************************************************/ + +/************************************************************************************ + * Public Functions + ************************************************************************************/ +int can_devinit(void); + +/************************************************************************************ + * Name: can_devinit + * + * Description: + * All STM32 architectures must provide the following interface to work with + * examples/can. + * + ************************************************************************************/ + +int can_devinit(void) +{ + static bool initialized = false; + struct can_dev_s *can; + int ret; + + /* Check if we have already initialized */ + + if (!initialized) { + /* Call stm32_caninitialize() to get an instance of the CAN interface */ + + can = stm32_caninitialize(CAN_PORT); + + if (can == NULL) { + canerr("ERROR: Failed to get CAN interface\n"); + return -ENODEV; + } + + /* Register the CAN driver at "/dev/can0" */ + + ret = can_register("/dev/can0", can); + + if (ret < 0) { + canerr("ERROR: can_register failed: %d\n", ret); + return ret; + } + + /* Now we are initialized */ + + initialized = true; + } + + return OK; +} +#endif /* CONFIG_CAN */ diff --git a/boards/auterion/fmu-v6s/src/hw_config.h b/boards/auterion/fmu-v6s/src/hw_config.h new file mode 100644 index 0000000000..5979d95fb6 --- /dev/null +++ b/boards/auterion/fmu-v6s/src/hw_config.h @@ -0,0 +1,126 @@ +/* + * 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 SERIAL0_DEV 0x01 + +#define APP_LOAD_ADDRESS 0x08020000 +#define BOOTLOADER_DELAY 5000 +#define INTERFACE_USB 0 +#define INTERFACE_USART 1 +#define INTERFACE_USART_CONFIG "/dev/ttyS0,1500000" +#define BOOT_DELAY_ADDRESS 0x000001a0 +#define BOARD_TYPE 60 +#define _FLASH_KBYTES (*(uint32_t *)0x1FF1E880) +#define BOARD_FLASH_SECTORS (15) +#define BOARD_FLASH_SIZE (_FLASH_KBYTES * 1024) + +#define OSC_FREQ 24 + +#define BOARD_PIN_LED_ACTIVITY GPIO_nLED_BLUE // BLUE +#define BOARD_PIN_LED_BOOTLOADER GPIO_nLED_GREEN // GREEN +#define BOARD_LED_ON 1 +#define BOARD_LED_OFF 0 + +#define SERIAL_BREAK_DETECT_DISABLED 1 + +// Connected to SAI3_RXC on i.MX8MP side, has a pulldown by default +#define BOARD_FORCE_BL_PIN (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTD|GPIO_PIN3) +#define BOARD_FORCE_BL_STATE 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 SERIAL0_DEV +#endif + +#ifndef BOOT_DEVICES_FILTER_ONUSB +# define BOOT_DEVICES_FILTER_ONUSB SERIAL0_DEV +#endif + +#endif /* HW_CONFIG_H_ */ diff --git a/boards/auterion/fmu-v6s/src/i2c.cpp b/boards/auterion/fmu-v6s/src/i2c.cpp new file mode 100644 index 0000000000..072c36792b --- /dev/null +++ b/boards/auterion/fmu-v6s/src/i2c.cpp @@ -0,0 +1,39 @@ +/**************************************************************************** + * + * 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), + initI2CBusInternal(4), +}; diff --git a/boards/auterion/fmu-v6s/src/init.c b/boards/auterion/fmu-v6s/src/init.c new file mode 100644 index 0000000000..39cfe5c914 --- /dev/null +++ b/boards/auterion/fmu-v6s/src/init.c @@ -0,0 +1,244 @@ +/**************************************************************************** + * + * 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 + * + * Auterion FMU-specific early startup code. This file implements the + * board_app_initialize() function that is called early by nsh during startup. + * + * Code here is run before the rcS script is invoked; it should start required + * subsystems and perform board-specific initialization. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "board_config.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "arm_internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +__END_DECLS + + +/************************************************************************************ + * Name: board_peripheral_reset + * + * Description: + * + ************************************************************************************/ +__EXPORT void board_peripheral_reset(int ms) +{ + usleep(ms * 1000); + syslog(LOG_DEBUG, "reset done, %d ms\n", ms); +} + +/************************************************************************************ + * 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 Ethernet Reference Clock */ + /* PLLQ1 is 100MHz, we need 50MHz on MCO1 => /2 */ + /* stm32_mco1config(RCC_CFGR_MCO1_PLL1Q, RCC_CFGR_MCO1PRE(2)); */ + + /* configure pins */ + + const uint32_t gpio[] = PX4_GPIO_INIT_LIST; + px4_gpio_init(gpio, arraySize(gpio)); +} + +/**************************************************************************** + * 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) + /* Need hrt running before using the ADC */ + + px4_platform_init(); + + // Use the default HW_VER_REV(0x0,0x0) for Ramtron + + stm32_spiinitialize(); + + /* Configure the HW based on the manifest */ + + px4_platform_configure(); + + if (OK == board_determine_hw_info()) { + syslog(LOG_INFO, "[boot] Rev 0x%1x : Ver 0x%1x %s\n", board_get_hw_revision(), board_get_hw_version(), + board_get_hw_type_name()); + + } else { + syslog(LOG_ERR, "[boot] Failed to read HW revision and version\n"); + } + + /* Configure the Actual SPI interfaces (after we determined the HW version) */ + + stm32_spiinitialize(); + + board_spi_reset(10, 0xffff); + + /* Configure the DMA allocator */ + + if (board_dma_alloc_init() < 0) { + syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); + } + +# if defined(SERIAL_HAVE_RXDMA) + // set up the serial DMA polling at 1ms intervals for received bytes that have not triggered a DMA event. + static struct hrt_call serial_dma_call; + hrt_call_every(&serial_dma_call, 1000, 1000, (hrt_callout)stm32_serial_dma_poll, NULL); +# endif + + /* initial LED state */ + drv_led_start(); + led_off(LED_RED); + led_on(LED_GREEN); // Indicate Power. + led_off(LED_BLUE); + + if (board_hardfault_init(2, true) != 0) { + led_on(LED_RED); + } + + if (nx_mount("/dev/mtdblock0", "/fs/microsd", "littlefs", 0, "autoformat") != 0) { + led_on(LED_RED); + } + +#endif /* !defined(BOOTLOADER) */ + + return OK; +} diff --git a/boards/auterion/fmu-v6s/src/led.c b/boards/auterion/fmu-v6s/src/led.c new file mode 100644 index 0000000000..37aa51d7fa --- /dev/null +++ b/boards/auterion/fmu-v6s/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 + * + * PX4FMU LED backend. + */ + +#include + +#include + +#include "chip.h" +#include "stm32_gpio.h" +#include "board_config.h" + +#include +#include + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +extern void led_toggle(int led); +__END_DECLS + +#ifdef CONFIG_ARCH_LEDS +static bool nuttx_owns_leds = true; +// B R S G +// 0 1 2 3 +static const uint8_t xlatpx4[] = {1, 2, 4, 0}; +# define xlat(p) xlatpx4[(p)] +static uint32_t g_ledmap[] = { + GPIO_nLED_GREEN, // Indexed by BOARD_LED_GREEN + GPIO_nLED_BLUE, // Indexed by BOARD_LED_BLUE + GPIO_nLED_RED, // Indexed by BOARD_LED_RED + GPIO_nSAFETY_SWITCH_LED_OUT, // Indexed by LED_SAFETY by xlatpx4 +}; + +#else + +# define xlat(p) (p) +static uint32_t g_ledmap[] = { + GPIO_nLED_BLUE, // Indexed by LED_BLUE + GPIO_nLED_RED, // Indexed by LED_RED, LED_AMBER + 0, // Indexed by LED_SAFETY (defaulted to an input) + GPIO_nLED_GREEN, // Indexed by LED_GREEN +}; + +#endif + +__EXPORT void led_init(void) +{ + for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) { + if (g_ledmap[l] != 0) { + stm32_configgpio(g_ledmap[l]); + } + } +} + +static void phy_set_led(int led, bool state) +{ + /* Drive High to switch on */ + + if (g_ledmap[led] != 0) { + stm32_gpiowrite(g_ledmap[led], state); + } +} + +static bool phy_get_led(int led) +{ + /* If High 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/auterion/fmu-v6s/src/mtd.cpp b/boards/auterion/fmu-v6s/src/mtd.cpp new file mode 100644 index 0000000000..97a2f3f88d --- /dev/null +++ b/boards/auterion/fmu-v6s/src/mtd.cpp @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * Copyright (C) 2020 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include + +#include +#include + +static const px4_mft_device_t spi4 = { // FM25V02A on FMUM native: 128K X 8, emulated as (1024 Blocks of 32) + .bus_type = px4_mft_device_t::SPI, + .devid = SPIDEV_FLASH(0) +}; +static const px4_mft_device_t i2c4 = { // 24LC64T 8K 32 X 256 + .bus_type = px4_mft_device_t::I2C, + .devid = PX4_MK_I2C_DEVID(4, 0x50) +}; + + +static const px4_mtd_entry_t fmum_fram = { + .device = &spi4, + .npart = 1, + .partd = { + { + .type = MTD_PARAMETERS, + .path = "/mnt/microsd", + .nblocks = (131072 / (1 << CONFIG_RAMTRON_EMULATE_SECTOR_SHIFT)) + } + }, +}; + +static const px4_mtd_entry_t fmum_eeprom = { + .device = &i2c4, + .npart = 5, + .partd = { + { + .type = MTD_CALDATA, + .path = "/fs/mtd_caldata", + .nblocks = 224 + }, + { + .type = MTD_MFT_VER, + .path = "/fs/mtd_mft_ver", + .nblocks = 8 + }, + { + .type = MTD_MFT_REV, + .path = "/fs/mtd_mft_rev", + .nblocks = 8 + }, + { + .type = MTD_ID, + .path = "/fs/mtd_id", + .nblocks = 8 // 256 = 32 * 8 + }, + { + .type = MTD_NET, + .path = "/fs/mtd_net", + .nblocks = 8 // 256 = 32 * 8 + } + }, +}; + +static const px4_mtd_manifest_t board_mtd_config = { + .nconfigs = 2, + .entries = { + &fmum_fram, + &fmum_eeprom + } +}; + +static const px4_mft_entry_s mtd_mft = { + .type = MTD, + .pmft = (void *) &board_mtd_config, +}; + +static const px4_mft_entry_s mft_mft = { + .type = MFT, + .pmft = (void *) system_query_manifest, +}; + +static const px4_mft_s mft = { + .nmft = 2, + .mfts = { + &mtd_mft, + &mft_mft, + } +}; + +const px4_mft_s *board_get_manifest(void) +{ + return &mft; +} diff --git a/boards/auterion/fmu-v6s/src/spi.cpp b/boards/auterion/fmu-v6s/src/spi.cpp new file mode 100644 index 0000000000..4d6118c184 --- /dev/null +++ b/boards/auterion/fmu-v6s/src/spi.cpp @@ -0,0 +1,48 @@ +/**************************************************************************** + * + * Copyright (C) 2020, 2022 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +#include + +constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { + initSPIBus(SPI::Bus::SPI3, { + initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortC, GPIO::Pin12}, SPI::DRDY{GPIO::PortD, GPIO::Pin14}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortE, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin10}), + }), + initSPIBus(SPI::Bus::SPI4, { + initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortE, GPIO::Pin4}) + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/auterion/fmu-v6s/src/timer_config.cpp b/boards/auterion/fmu-v6s/src/timer_config.cpp new file mode 100644 index 0000000000..66311d38e2 --- /dev/null +++ b/boards/auterion/fmu-v6s/src/timer_config.cpp @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * 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 + * TIM1_CH2 T FMU_CH2 + * TIM1_CH3 T FMU_CH3 + * TIM1_CH4 T FMU_CH4 + * + * TIM3_CH1 T FMU_CH5 + * TIM3_CH2 T FMU_CH6 + * TIM3_CH3 T FMU_CH7 + * TIM3_CH4 T FMU_CH8 + */ + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer1, DMA{DMA::Index1}), + initIOTimer(Timer::Timer3, DMA{DMA::Index1}), +}; + +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::Channel1}, {GPIO::PortC, GPIO::Pin6}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel2}, {GPIO::PortB, GPIO::Pin5}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel3}, {GPIO::PortB, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel4}, {GPIO::PortC, GPIO::Pin9}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/auterion/fmu-v6s/zenoh.px4board b/boards/auterion/fmu-v6s/zenoh.px4board new file mode 100644 index 0000000000..cb14fde935 --- /dev/null +++ b/boards/auterion/fmu-v6s/zenoh.px4board @@ -0,0 +1,4 @@ +# CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE is not set +CONFIG_DRIVERS_UAVCAN=n +CONFIG_MODULES_UXRCE_DDS_CLIENT=n +CONFIG_MODULES_ZENOH=y diff --git a/platforms/common/include/px4_platform_common/px4_work_queue/WorkQueueManager.hpp b/platforms/common/include/px4_platform_common/px4_work_queue/WorkQueueManager.hpp index 68ac3f1ffe..b22910604f 100644 --- a/platforms/common/include/px4_platform_common/px4_work_queue/WorkQueueManager.hpp +++ b/platforms/common/include/px4_platform_common/px4_work_queue/WorkQueueManager.hpp @@ -89,7 +89,7 @@ static constexpr wq_config_t ttyS9{"wq:ttyS9", 1728, -30}; static constexpr wq_config_t ttyACM0{"wq:ttyACM0", 1728, -31}; static constexpr wq_config_t ttyUnknown{"wq:ttyUnknown", 1728, -32}; -static constexpr wq_config_t lp_default{"wq:lp_default", 2350, -50}; +static constexpr wq_config_t lp_default{"wq:lp_default", 3500, -50}; static constexpr wq_config_t test1{"wq:test1", 2000, 0}; static constexpr wq_config_t test2{"wq:test2", 2000, 0};