From 330340a5dd60424a3e6f55f244528d638243de55 Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Fri, 18 Oct 2024 18:15:13 -0600 Subject: [PATCH 1/8] boards: ARK FPV --- .ci/Jenkinsfile-compile | 2 + .vscode/cmake-variants.yaml | 10 + boards/ark/fpv/bootloader.px4board | 3 + boards/ark/fpv/default.px4board | 72 +++ boards/ark/fpv/firmware.prototype | 13 + boards/ark/fpv/init/rc.board_defaults | 26 + boards/ark/fpv/init/rc.board_sensors | 18 + boards/ark/fpv/nuttx-config/Kconfig | 17 + .../ark/fpv/nuttx-config/bootloader/defconfig | 95 ++++ boards/ark/fpv/nuttx-config/include/board.h | 504 ++++++++++++++++++ .../fpv/nuttx-config/include/board_dma_map.h | 81 +++ boards/ark/fpv/nuttx-config/nsh/defconfig | 264 +++++++++ .../nuttx-config/scripts/bootloader_script.ld | 215 ++++++++ boards/ark/fpv/nuttx-config/scripts/script.ld | 229 ++++++++ boards/ark/fpv/src/CMakeLists.txt | 77 +++ boards/ark/fpv/src/board_config.h | 384 +++++++++++++ boards/ark/fpv/src/bootloader_main.c | 85 +++ boards/ark/fpv/src/can.c | 142 +++++ boards/ark/fpv/src/hw_config.h | 129 +++++ boards/ark/fpv/src/i2c.cpp | 40 ++ boards/ark/fpv/src/init.c | 293 ++++++++++ boards/ark/fpv/src/led.c | 234 ++++++++ boards/ark/fpv/src/mtd.cpp | 55 ++ boards/ark/fpv/src/sdio.c | 177 ++++++ boards/ark/fpv/src/spi.cpp | 57 ++ boards/ark/fpv/src/spix_sync.c | 309 +++++++++++ boards/ark/fpv/src/spix_sync.h | 42 ++ boards/ark/fpv/src/timer_config.cpp | 88 +++ boards/ark/fpv/src/usb.c | 105 ++++ 29 files changed, 3766 insertions(+) create mode 100644 boards/ark/fpv/bootloader.px4board create mode 100644 boards/ark/fpv/default.px4board create mode 100644 boards/ark/fpv/firmware.prototype create mode 100644 boards/ark/fpv/init/rc.board_defaults create mode 100644 boards/ark/fpv/init/rc.board_sensors create mode 100644 boards/ark/fpv/nuttx-config/Kconfig create mode 100644 boards/ark/fpv/nuttx-config/bootloader/defconfig create mode 100644 boards/ark/fpv/nuttx-config/include/board.h create mode 100644 boards/ark/fpv/nuttx-config/include/board_dma_map.h create mode 100644 boards/ark/fpv/nuttx-config/nsh/defconfig create mode 100644 boards/ark/fpv/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/ark/fpv/nuttx-config/scripts/script.ld create mode 100644 boards/ark/fpv/src/CMakeLists.txt create mode 100644 boards/ark/fpv/src/board_config.h create mode 100644 boards/ark/fpv/src/bootloader_main.c create mode 100644 boards/ark/fpv/src/can.c create mode 100644 boards/ark/fpv/src/hw_config.h create mode 100644 boards/ark/fpv/src/i2c.cpp create mode 100644 boards/ark/fpv/src/init.c create mode 100644 boards/ark/fpv/src/led.c create mode 100644 boards/ark/fpv/src/mtd.cpp create mode 100644 boards/ark/fpv/src/sdio.c create mode 100644 boards/ark/fpv/src/spi.cpp create mode 100644 boards/ark/fpv/src/spix_sync.c create mode 100644 boards/ark/fpv/src/spix_sync.h create mode 100644 boards/ark/fpv/src/timer_config.cpp create mode 100644 boards/ark/fpv/src/usb.c diff --git a/.ci/Jenkinsfile-compile b/.ci/Jenkinsfile-compile index e8a97b48e617..cad2b8df3a7f 100644 --- a/.ci/Jenkinsfile-compile +++ b/.ci/Jenkinsfile-compile @@ -47,6 +47,8 @@ pipeline { "ark_cannode_default", "ark_fmu-v6x_bootloader", "ark_fmu-v6x_default", + "ark_fpv_bootloader", + "ark_fpv_default", "ark_pi6x_bootloader", "ark_pi6x_default", "atl_mantis-edu_default", diff --git a/.vscode/cmake-variants.yaml b/.vscode/cmake-variants.yaml index 02d4b3f36eac..96331bb145b2 100644 --- a/.vscode/cmake-variants.yaml +++ b/.vscode/cmake-variants.yaml @@ -186,6 +186,16 @@ CONFIG: buildType: MinSizeRel settings: CONFIG: ark_fmu-v6x_default + ark_fpv_bootloader: + short: ark_fpv_bootloader + buildType: MinSizeRel + settings: + CONFIG: ark_fpv_bootloader + ark_fpv_default: + short: ark_fpv_default + buildType: MinSizeRel + settings: + CONFIG: ark_fpv_default ark_pi6x_bootloader: short: ark_pi6x_bootloader buildType: MinSizeRel diff --git a/boards/ark/fpv/bootloader.px4board b/boards/ark/fpv/bootloader.px4board new file mode 100644 index 000000000000..19b6e662be69 --- /dev/null +++ b/boards/ark/fpv/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/ark/fpv/default.px4board b/boards/ark/fpv/default.px4board new file mode 100644 index 000000000000..df724712dbd6 --- /dev/null +++ b/boards/ark/fpv/default.px4board @@ -0,0 +1,72 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS5" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" +CONFIG_BOARD_SERIAL_TEL4="/dev/ttyS2" +CONFIG_BOARD_SERIAL_RC="/dev/ttyS4" +CONFIG_DRIVERS_ADC_BOARD_ADC=y +CONFIG_DRIVERS_BAROMETER_BMP388=y +CONFIG_DRIVERS_CDCACM_AUTOSTART=y +CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y +CONFIG_COMMON_DISTANCE_SENSOR=y +CONFIG_DRIVERS_DISTANCE_SENSOR_VL53L0X=y +CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_HEATER=y +CONFIG_DRIVERS_IMU_INVENSENSE_IIM42653=y +CONFIG_COMMON_LIGHT=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_DRIVERS_PWM_OUT=y +CONFIG_COMMON_RC=y +CONFIG_DRIVERS_UAVCAN=y +CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE=2 +CONFIG_MODULES_AIRSPEED_SELECTOR=y +CONFIG_MODULES_BATTERY_STATUS=y +CONFIG_MODULES_COMMANDER=y +CONFIG_MODULES_CONTROL_ALLOCATOR=y +CONFIG_MODULES_DATAMAN=y +CONFIG_MODULES_EKF2=y +CONFIG_MODULES_ESC_BATTERY=y +CONFIG_MODULES_EVENTS=y +CONFIG_MODULES_FLIGHT_MODE_MANAGER=y +CONFIG_MODULES_GYRO_CALIBRATION=y +CONFIG_MODULES_GYRO_FFT=y +CONFIG_MODULES_LAND_DETECTOR=y +CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=y +CONFIG_MODULES_LOAD_MON=y +CONFIG_MODULES_LOGGER=y +CONFIG_MODULES_MAG_BIAS_ESTIMATOR=y +CONFIG_MODULES_MANUAL_CONTROL=y +CONFIG_MODULES_MAVLINK=y +CONFIG_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_MODULES_RC_UPDATE=y +CONFIG_MODULES_SENSORS=y +CONFIG_MODULES_UXRCE_DDS_CLIENT=y +CONFIG_SYSTEMCMDS_ACTUATOR_TEST=y +CONFIG_SYSTEMCMDS_BSONDUMP=y +CONFIG_SYSTEMCMDS_DMESG=y +CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y +CONFIG_SYSTEMCMDS_I2CDETECT=y +CONFIG_SYSTEMCMDS_LED_CONTROL=y +CONFIG_SYSTEMCMDS_MFT=y +CONFIG_SYSTEMCMDS_MTD=y +CONFIG_SYSTEMCMDS_NSHTERM=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y +CONFIG_SYSTEMCMDS_SD_STRESS=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_TUNE_CONTROL=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/ark/fpv/firmware.prototype b/boards/ark/fpv/firmware.prototype new file mode 100644 index 000000000000..f75702a85e3a --- /dev/null +++ b/boards/ark/fpv/firmware.prototype @@ -0,0 +1,13 @@ +{ + "board_id": 59, + "magic": "ARKFPVFWv1", + "description": "Firmware for the ARKFPV board", + "image": "", + "build_time": 0, + "summary": "ARKFPV", + "version": "0.1", + "image_size": 0, + "image_maxsize": 1835008, + "git_identity": "", + "board_revision": 0 +} diff --git a/boards/ark/fpv/init/rc.board_defaults b/boards/ark/fpv/init/rc.board_defaults new file mode 100644 index 000000000000..da8444bbc0c7 --- /dev/null +++ b/boards/ark/fpv/init/rc.board_defaults @@ -0,0 +1,26 @@ +#!/bin/sh +# +# board specific defaults +#------------------------------------------------------------------------------ + +# transision from params file to flash-based params (2022-08) +if [ -f $PARAM_FILE ] +then + param load $PARAM_FILE + param save + # create a backup + mv $PARAM_FILE ${PARAM_FILE}.bak + reboot +fi + +# TODO: Tune the following parameters +param set-default SENS_EN_THERMAL 1 +param set-default SENS_IMU_TEMP 10.0 +#param set-default SENS_IMU_TEMP_FF 0.0 +#param set-default SENS_IMU_TEMP_I 0.025 +#param set-default SENS_IMU_TEMP_P 1.0 + +if ver hwtypecmp ARKFPV000 +then + param set-default SENS_TEMP_ID 3014666 +fi diff --git a/boards/ark/fpv/init/rc.board_sensors b/boards/ark/fpv/init/rc.board_sensors new file mode 100644 index 000000000000..896b9ffd7d05 --- /dev/null +++ b/boards/ark/fpv/init/rc.board_sensors @@ -0,0 +1,18 @@ +#!/bin/sh +# +# ARKFPV specific board sensors init +#------------------------------------------------------------------------------ + +board_adc start + +if ver hwtypecmp ARKFPV000 +then + # Internal SPI bus IIM42653 + iim42653 -R 14 -s -b 1 start +fi + +# Internal magnetometer on I2C +iis2mdc -R 0 -I -b 4 start + +# Internal Baro on I2C +bmp388 -I -b 2 start diff --git a/boards/ark/fpv/nuttx-config/Kconfig b/boards/ark/fpv/nuttx-config/Kconfig new file mode 100644 index 000000000000..bb33d3cfda4d --- /dev/null +++ b/boards/ark/fpv/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/ark/fpv/nuttx-config/bootloader/defconfig b/boards/ark/fpv/nuttx-config/bootloader/defconfig new file mode 100644 index 000000000000..70c6114fea8f --- /dev/null +++ b/boards/ark/fpv/nuttx-config/bootloader/defconfig @@ -0,0 +1,95 @@ +# +# 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_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/ark/fpv/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="ark" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743II=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARDCTL=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_INITTHREAD_PRIORITY=254 +CONFIG_BOARD_LATE_INITIALIZE=y +CONFIG_BOARD_LOOPSPERMSEC=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x003B +CONFIG_CDCACM_PRODUCTSTR="ARK BL FPV.x" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x3185 +CONFIG_CDCACM_VENDORSTR="ARK" +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_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_UART7=y +CONFIG_SYSTEMTICK_HOOK=y +CONFIG_SYSTEM_CDCACM=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_TTY_SIGINT=y +CONFIG_TTY_SIGINT_CHAR=0x03 +CONFIG_TTY_SIGTSTP=y +CONFIG_UART7_RXBUFSIZE=512 +CONFIG_UART7_RXDMA=y +CONFIG_UART7_TXBUFSIZE=512 +CONFIG_UART7_TXDMA=y +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 diff --git a/boards/ark/fpv/nuttx-config/include/board.h b/boards/ark/fpv/nuttx-config/include/board.h new file mode 100644 index 000000000000..c6c67e38b98f --- /dev/null +++ b/boards/ark/fpv/nuttx-config/include/board.h @@ -0,0 +1,504 @@ +/************************************************************************************ + * nuttx-configs/px4_fmu-v6x/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_V6X_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_PX4_FMU_V6X_INCLUDE_BOARD_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include "board_dma_map.h" + +#include + +#ifndef __ASSEMBLY__ +# include +#endif + +#include "stm32_rcc.h" +#include "stm32_sdmmc.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/* Clocking *************************************************************************/ +/* The px4_fmu-v6X board provides the following clock sources: + * + * X1: 16 MHz crystal for HSE + * + * So we have these clock source available within the STM32 + * + * HSI: 16 MHz RC factory-trimmed + * HSE: 16 MHz crystal for HSE + */ + +#define STM32_BOARD_XTAL 16000000ul + +#define STM32_HSI_FREQUENCY 16000000ul +#define STM32_LSI_FREQUENCY 32000 +#define STM32_HSE_FREQUENCY STM32_BOARD_XTAL +#define STM32_LSE_FREQUENCY 32768 + +/* Main PLL Configuration. + * + * PLL source is HSE = 16,000,000 + * + * PLL_VCOx = (STM32_HSE_FREQUENCY / PLLM) * PLLN + * Subject to: + * + * 1 <= PLLM <= 63 + * 4 <= PLLN <= 512 + * 150 MHz <= PLL_VCOL <= 420MHz + * 192 MHz <= PLL_VCOH <= 836MHz + * + * SYSCLK = PLL_VCO / PLLP + * CPUCLK = SYSCLK / D1CPRE + * Subject to + * + * PLLP1 = {2, 4, 6, 8, ..., 128} + * PLLP2,3 = {2, 3, 4, ..., 128} + * CPUCLK <= 480 MHz + */ + +#define STM32_BOARD_USEHSE + +#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE + +/* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR + * + * PLL1_VCO = (16,000,000 / 1) * 60 = 960 MHz + * + * PLL1P = PLL1_VCO/2 = 960 MHz / 2 = 480 MHz + * PLL1Q = PLL1_VCO/4 = 960 MHz / 4 = 240 MHz + * PLL1R = PLL1_VCO/8 = 960 MHz / 8 = 120 MHz + */ + +#define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL1RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP1EN | \ + RCC_PLLCFGR_DIVQ1EN | \ + RCC_PLLCFGR_DIVR1EN) +#define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(1) +#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(60) +#define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) +#define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(4) +#define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) + +#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 60) +#define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) +#define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 4) +#define STM32_PLL1R_FREQUENCY (STM32_VCO1_FREQUENCY / 8) + +/* PLL2 */ + +#define STM32_PLLCFG_PLL2CFG (RCC_PLLCFGR_PLL2VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL2RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP2EN | \ + RCC_PLLCFGR_DIVQ2EN | \ + RCC_PLLCFGR_DIVR2EN) +#define STM32_PLLCFG_PLL2M RCC_PLLCKSELR_DIVM2(4) +#define STM32_PLLCFG_PLL2N RCC_PLL2DIVR_N2(48) +#define STM32_PLLCFG_PLL2P RCC_PLL2DIVR_P2(2) +#define STM32_PLLCFG_PLL2Q RCC_PLL2DIVR_Q2(2) +#define STM32_PLLCFG_PLL2R RCC_PLL2DIVR_R2(2) + +#define STM32_VCO2_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) +#define STM32_PLL2P_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2Q_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2R_FREQUENCY (STM32_VCO2_FREQUENCY / 2) + +/* PLL3 */ + +#define STM32_PLLCFG_PLL3CFG (RCC_PLLCFGR_PLL3VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL3RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVQ3EN) +#define STM32_PLLCFG_PLL3M RCC_PLLCKSELR_DIVM3(4) +#define STM32_PLLCFG_PLL3N RCC_PLL3DIVR_N3(48) +#define STM32_PLLCFG_PLL3P RCC_PLL3DIVR_P3(2) +#define STM32_PLLCFG_PLL3Q RCC_PLL3DIVR_Q3(4) +#define STM32_PLLCFG_PLL3R RCC_PLL3DIVR_R3(2) + +#define STM32_VCO3_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) +#define STM32_PLL3P_FREQUENCY (STM32_VCO3_FREQUENCY / 2) +#define STM32_PLL3Q_FREQUENCY (STM32_VCO3_FREQUENCY / 4) +#define STM32_PLL3R_FREQUENCY (STM32_VCO3_FREQUENCY / 2) + +/* SYSCLK = PLL1P = 480MHz + * CPUCLK = SYSCLK / 1 = 480 MHz + */ + +#define STM32_RCC_D1CFGR_D1CPRE (RCC_D1CFGR_D1CPRE_SYSCLK) +#define STM32_SYSCLK_FREQUENCY (STM32_PLL1P_FREQUENCY) +#define STM32_CPUCLK_FREQUENCY (STM32_SYSCLK_FREQUENCY / 1) + +/* Configure Clock Assignments */ + +/* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) + * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 + */ + +#define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ +#define STM32_ACLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* ACLK in D1, HCLK3 in D1 */ +#define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ +#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ + +/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ +#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ +#define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ +#define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ + +#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ +#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* Timer clock frequencies */ + +/* Timers driven from APB1 will be twice PCLK1 */ + +#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) + +/* Timers driven from APB2 will be twice PCLK2 */ + +#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) + +/* Kernel Clock Configuration + * + * Note: look at Table 54 in ST Manual + */ + +/* I2C123 clock source */ + +#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI + +/* I2C4 clock source */ + +#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI + +/* SPI123 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 + +/* SPI45 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 + +/* SPI6 clock source */ + +#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 + +/* USB 1 and 2 clock source */ + +#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 + +/* ADC 1 2 3 clock source */ + +#define STM32_RCC_D3CCIPR_ADCSRC RCC_D3CCIPR_ADCSEL_PLL2 + +/* FDCAN 1 2 clock source */ + +#define STM32_RCC_D2CCIP1R_FDCANSEL RCC_D2CCIP1R_FDCANSEL_HSE /* FDCAN 1 2 clock source */ + +#define STM32_FDCANCLK STM32_HSE_FREQUENCY + +/* FLASH wait states + * + * ------------ ---------- ----------- + * Vcore MAX ACLK WAIT STATES + * ------------ ---------- ----------- + * 1.15-1.26 V 70 MHz 0 + * (VOS1 level) 140 MHz 1 + * 210 MHz 2 + * 1.05-1.15 V 55 MHz 0 + * (VOS2 level) 110 MHz 1 + * 165 MHz 2 + * 220 MHz 3 + * 0.95-1.05 V 45 MHz 0 + * (VOS3 level) 90 MHz 1 + * 135 MHz 2 + * 180 MHz 3 + * 225 MHz 4 + * ------------ ---------- ----------- + */ + +#define BOARD_FLASH_WAITSTATES 2 + +/* SDMMC definitions ********************************************************/ + +/* Init 400kHz, freq = PLL1Q/(2*div) div = PLL1Q/(2*freq) */ + +#define STM32_SDMMC_INIT_CLKDIV (300 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) + +/* 25 MHz Max for now, 25 mHZ = PLL1Q/(2*div), div = PLL1Q/(2*freq) + * div = 4.8 = 240 / 50, So round up to 5 for default speed 24 MB/s + */ + +#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) +# define STM32_SDMMC_MMCXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#else +# define STM32_SDMMC_MMCXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#endif +#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) +# define STM32_SDMMC_SDXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#else +# define STM32_SDMMC_SDXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#endif + +#define STM32_SDMMC_CLKCR_EDGE STM32_SDMMC_CLKCR_NEGEDGE + +/* LED definitions ******************************************************************/ +/* The ARKV6X board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and + * LED_RED a Red LED, that can be controlled by software. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +/* LED definitions ******************************************************************/ +/* The px4_fmu-v6x board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and + * LED_RED a Red LED, that can be controlled by software. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +#define BOARD_LED1 0 +#define BOARD_LED2 1 +#define BOARD_LED3 2 +#define BOARD_NLEDS 3 + +#define BOARD_LED_RED BOARD_LED1 +#define BOARD_LED_GREEN BOARD_LED2 +#define BOARD_LED_BLUE BOARD_LED3 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) + +/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in + * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related + * events as follows: + * + * + * SYMBOL Meaning LED state + * Red Green Blue + * ---------------------- -------------------------- ------ ------ ----*/ + +#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ +#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ +#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ +#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ +#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ +#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ +#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ +#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ +#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ + +/* Thus if the Green LED is statically on, NuttX has successfully booted and + * is, apparently, running normally. If the Red LED is flashing at + * approximately 2Hz, then a fatal error has been detected and the system + * has halted. + */ + +/* Alternate function pin selections ************************************************/ + +#define GPIO_USART1_RX GPIO_USART1_RX_3 /* PB7 */ +#define GPIO_USART1_TX GPIO_USART1_TX_3 /* PB6 */ + +#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ +#define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ + +#define GPIO_UART4_RX GPIO_UART4_RX_6 /* PH14 */ +#define GPIO_UART4_TX GPIO_UART4_TX_6 /* PH13 */ + +#define GPIO_UART5_RX GPIO_UART5_RX_3 /* PD2 */ +#define GPIO_UART5_TX GPIO_UART5_TX_3 /* PC12 */ +// GPIO_UART5_RTS No remap /* PC8 */ +#define GPIO_UART5_CTS (GPIO_ALT|GPIO_AF8|GPIO_PORTC|GPIO_PIN9|GPIO_PULLDOWN) /* PC9 */ + +#define GPIO_USART6_RX GPIO_USART6_RX_1 /* PC7 */ +#define GPIO_USART6_TX GPIO_USART6_TX_1 /* PC6 */ + +#define GPIO_UART7_RX GPIO_UART7_RX_4 /* PF6 */ +#define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ +#define GPIO_UART7_RTS GPIO_UART7_RTS_2 /* PF8 */ +#define GPIO_UART7_CTS (GPIO_UART7_CTS_1 | GPIO_PULLDOWN) /* PE10 */ + + +/* CAN + * + * CAN1 is routed to transceiver. + */ +#define GPIO_CAN1_RX GPIO_CAN1_RX_3 /* PD0 */ +#define GPIO_CAN1_TX GPIO_CAN1_TX_3 /* PD1 */ + +/* SPI + * SPI1 is sensors1 + * SPI2 is sensors2 + * SPI3 is sensors3 + * SPI4 is Not Used + * SPI5 is Not Used + * SPI6 is EXTERNAL1 + * + */ + +#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) + +#define GPIO_SPI1_MISO GPIO_SPI1_MISO_3 /* PG9 */ +#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_2 /* PB5 */ +#define GPIO_SPI1_SCK ADJ_SLEW_RATE(GPIO_SPI1_SCK_1) /* PA5 */ + +#define GPIO_SPI6_MISO GPIO_SPI6_MISO_2 /* PA6 */ +#define GPIO_SPI6_MOSI GPIO_SPI6_MOSI_1 /* PG14 */ +#define GPIO_SPI6_SCK ADJ_SLEW_RATE(GPIO_SPI6_SCK_3) /* PB3 */ + +/* I2C + * + * The optional _GPIO configurations allow the I2C driver to manually + * reset the bus to clear stuck slaves. They match the pin configuration, + * but are normally-high GPIOs. + * + */ + +#define GPIO_I2C1_SCL GPIO_I2C1_SCL_2 /* PB8 */ +#define GPIO_I2C1_SDA GPIO_I2C1_SDA_2 /* PB9 */ + +#define GPIO_I2C1_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN8) +#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN9) + +#define GPIO_I2C2_SCL GPIO_I2C2_SCL_2 /* PF1 */ +#define GPIO_I2C2_SDA GPIO_I2C2_SDA_2 /* PF0 */ + +#define GPIO_I2C2_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN1) +#define GPIO_I2C2_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN0) + +#define GPIO_I2C4_SCL GPIO_I2C4_SCL_2 /* PF14 */ +#define GPIO_I2C4_SDA GPIO_I2C4_SDA_2 /* PF15 */ + +#define GPIO_I2C4_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN14) +#define GPIO_I2C4_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN15) + +/* SDMMC2 + * + * VDD 3.3 + * GND + * SDMMC2_CK PD6 + * SDMMC2_CMD PD7 + * SDMMC2_D0 PB14 + * SDMMC2_D1 PB15 + * SDMMC2_D2 PG11 + * SDMMC2_D3 PB4 + */ + +#define GPIO_SDMMC2_CK GPIO_SDMMC2_CK_1 /* PD6 */ +#define GPIO_SDMMC2_CMD GPIO_SDMMC2_CMD_1 /* PD7 */ +// GPIO_SDMMC2_D0 No Remap /* PB14 */ +// GPIO_SDMMC2_D1 No Remap /* PB15 */ +#define GPIO_SDMMC2_D2 GPIO_SDMMC2_D2_1 /* PG11 */ +// GPIO_SDMMC2_D3 No Remap /* PB4 */ + +/* USB + * + * OTG_FS_DM PA11 + * OTG_FS_DP PA12 + * VBUS PA9 + */ + + +/* Board provides GPIO or other Hardware for signaling to timing analyzer */ + +#if defined(CONFIG_BOARD_USE_PROBES) +# include "stm32_gpio.h" +# define PROBE_N(n) (1<<((n)-1)) +# define PROBE_1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN0) /* PI0 AUX1 */ +# define PROBE_2 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN12) /* PH12 AUX2 */ +# define PROBE_3 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN11) /* PH11 AUX3 */ +# define PROBE_4 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN10) /* PH10 AUX4 */ +# define PROBE_5 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN13) /* PD13 AUX5 */ +# define PROBE_6 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14) /* PD14 AUX6 */ +# define PROBE_7 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN6) /* PH6 AUX7 */ +# define PROBE_8 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN9) /* PH9 AUX8 */ + +# define PROBE_INIT(mask) \ + do { \ + if ((mask)& PROBE_N(1)) { stm32_configgpio(PROBE_1); } \ + if ((mask)& PROBE_N(2)) { stm32_configgpio(PROBE_2); } \ + if ((mask)& PROBE_N(3)) { stm32_configgpio(PROBE_3); } \ + if ((mask)& PROBE_N(4)) { stm32_configgpio(PROBE_4); } \ + if ((mask)& PROBE_N(5)) { stm32_configgpio(PROBE_5); } \ + if ((mask)& PROBE_N(6)) { stm32_configgpio(PROBE_6); } \ + if ((mask)& PROBE_N(7)) { stm32_configgpio(PROBE_7); } \ + if ((mask)& PROBE_N(8)) { stm32_configgpio(PROBE_8); } \ + if ((mask)& PROBE_N(9)) { stm32_configgpio(PROBE_9); } \ + } while(0) + +# define PROBE(n,s) do {stm32_gpiowrite(PROBE_##n,(s));}while(0) +# define PROBE_MARK(n) PROBE(n,false);PROBE(n,true) +#else +# define PROBE_INIT(mask) +# define PROBE(n,s) +# define PROBE_MARK(n) +#endif + +#endif /*__NUTTX_CONFIG_PX4_FMU_V6X_INCLUDE_BOARD_H */ diff --git a/boards/ark/fpv/nuttx-config/include/board_dma_map.h b/boards/ark/fpv/nuttx-config/include/board_dma_map.h new file mode 100644 index 000000000000..62e278597243 --- /dev/null +++ b/boards/ark/fpv/nuttx-config/include/board_dma_map.h @@ -0,0 +1,81 @@ +/**************************************************************************** + * + * Copyright (c) 2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +// DMAMUX1 Using at most 8 Channels on DMA1 -------- Assigned +// V + +#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* 1 DMA1:37 ICM-20649 */ +#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* 2 DMA1:38 ICM-20649 */ + +#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* 3 DMA1:39 ICM-42688-P */ +#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* 4 DMA1:40 ICM-42688-P */ + +//#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* DMA1:41 GPS1 */ +//#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* DMA1:42 GPS1 */ + +//#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_0 /* DMA1:45 DEBUG */ +//#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_0 /* DMA1:46 DEBUG */ + +//#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* DMA1:63 EXT2 */ +//#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* DMA1:64 EXT2 */ + +#define DMAMAP_USART6_RX DMAMAP_DMA12_USART6RX_0 /* 5 DMA1:71 PX4IO */ +#define DMAMAP_USART6_TX DMAMAP_DMA12_USART6TX_0 /* 6 DMA1:72 PX4IO */ + +// Assigned in timer_config.cpp + +// Timer 4 /* 7 DMA1:32 TIM4UP */ +// Timer 5 /* 8 DMA1:50 TIM5UP */ + +// DMAMUX2 Using at most 8 Channels on DMA2 -------- Assigned +// V + +#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_1 /* 1 DMA2:61 BMI088 */ +#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_1 /* 2 DMA2:62 BMI088 */ + +#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* 3 DMA2:45 DEBUG */ +#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* 4 DMA2:46 DEBUG */ + +#define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_1 /* 5 DMA2:65 TELEM2 */ +#define DMAMAP_UART5_TX DMAMAP_DMA12_UART5TX_1 /* 6 DMA2:66 TELEM2 */ + +#define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_1 /* 7 DMA1:79 TELEM1 */ +#define DMAMAP_UART7_TX DMAMAP_DMA12_UART7TX_1 /* 8 DMA1:80 TELEM1 */ + +// DMAMUX2 Using at most 8 Channels on BDMA -------- Assigned +// V + +#define DMAMAP_SPI6_RX DMAMAP_BDMA_SPI6_RX /* 1 BDMA:11 SPI J11 */ +#define DMAMAP_SPI6_TX DMAMAP_BDMA_SPI6_TX /* 2 BDMA:12 SPI J11 */ diff --git a/boards/ark/fpv/nuttx-config/nsh/defconfig b/boards/ark/fpv/nuttx-config/nsh/defconfig new file mode 100644 index 000000000000..82633920ecd2 --- /dev/null +++ b/boards/ark/fpv/nuttx-config/nsh/defconfig @@ -0,0 +1,264 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DISABLE_ENVIRON is not set +# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set +# CONFIG_DISABLE_PTHREAD is not set +# CONFIG_MMCSD_HAVE_CARDDETECT is not set +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_MMCSD_SPI is not set +# CONFIG_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_CAT is not set +# CONFIG_NSH_DISABLE_CD is not set +# CONFIG_NSH_DISABLE_CP is not set +# CONFIG_NSH_DISABLE_DATE is not set +# CONFIG_NSH_DISABLE_DF is not set +# CONFIG_NSH_DISABLE_ECHO is not set +# CONFIG_NSH_DISABLE_ENV is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_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_PS is not set +# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set +# CONFIG_NSH_DISABLE_PWD is not set +# CONFIG_NSH_DISABLE_RM is not set +# CONFIG_NSH_DISABLE_RMDIR is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_SET is not set +# CONFIG_NSH_DISABLE_SLEEP is not set +# CONFIG_NSH_DISABLE_SOURCE is not set +# CONFIG_NSH_DISABLE_TELNETD is not set +# CONFIG_NSH_DISABLE_TEST is not set +# CONFIG_NSH_DISABLE_TIME is not set +# CONFIG_NSH_DISABLE_UMOUNT is not set +# CONFIG_NSH_DISABLE_UNSET is not set +# CONFIG_NSH_DISABLE_USLEEP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/ark/fpv/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="ark" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743II=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DTCM=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_ARM_MPU_EARLY_RESET=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_CRASHDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=95751 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x003B +CONFIG_CDCACM_PRODUCTSTR="ARK FPV.x" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x3185 +CONFIG_CDCACM_VENDORSTR="ARK" +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_MEMFAULT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=y +CONFIG_DEFAULT_SMALL=y +CONFIG_DEV_FIFO_SIZE=0 +CONFIG_DEV_PIPE_MAXSIZE=1024 +CONFIG_DEV_PIPE_SIZE=70 +CONFIG_EXPERIMENTAL=y +CONFIG_FAT_DMAMEMORY=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FAT_LFN_ALIAS_HASH=y +CONFIG_FDCLONE_STDIO=y +CONFIG_FS_BINFS=y +CONFIG_FS_CROMFS=y +CONFIG_FS_FAT=y +CONFIG_FS_FATTIME=y +CONFIG_FS_PROCFS=y +CONFIG_FS_PROCFS_INCLUDE_PROGMEM=y +CONFIG_FS_PROCFS_MAX_TASKS=64 +CONFIG_FS_PROCFS_REGISTER=y +CONFIG_FS_ROMFS=y +CONFIG_GRAN=y +CONFIG_GRAN_INTR=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_I2C=y +CONFIG_I2C_RESET=y +CONFIG_IDLETHREAD_STACKSIZE=750 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=3194 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_MAX_EXITFUNS=1 +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y +CONFIG_MM_REGIONS=4 +CONFIG_MTD=y +CONFIG_MTD_BYTE_WRITE=y +CONFIG_MTD_PARTITION=y +CONFIG_MTD_PROGMEM=y +CONFIG_MTD_RAMTRON=y +CONFIG_NAME_MAX=40 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_ARGCAT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_CMDPARMS=y +CONFIG_NSH_CROMFSETC=y +CONFIG_NSH_LINELEN=128 +CONFIG_NSH_MAXARGUMENTS=15 +CONFIG_NSH_NESTDEPTH=8 +CONFIG_NSH_QUOTE=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSSECTSIZE=128 +CONFIG_NSH_STRERROR=y +CONFIG_NSH_VARS=y +CONFIG_OTG_ID_GPIO_DISABLE=y +CONFIG_PIPES=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PRIORITY_INHERITANCE=y +CONFIG_PTHREAD_MUTEX_ROBUST=y +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_RAMTRON_EMULATE_PAGE_SHIFT=5 +CONFIG_RAMTRON_EMULATE_SECTOR_SHIFT=5 +CONFIG_RAMTRON_SETSPEED=y +CONFIG_RAM_SIZE=245760 +CONFIG_RAM_START=0x20010000 +CONFIG_RAW_BINARY=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_TABCOMPLETION=y +CONFIG_RTC_DATETIME=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKPRIORITY=249 +CONFIG_SCHED_HPWORKSTACKSIZE=3000 +CONFIG_SCHED_INSTRUMENTATION=y +CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y +CONFIG_SCHED_INSTRUMENTATION_SWITCH=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_LPWORKPRIORITY=50 +CONFIG_SCHED_LPWORKSTACKSIZE=1632 +CONFIG_SCHED_WAITPID=y +CONFIG_SDMMC2_SDIO_PULLUP=y +CONFIG_SEM_PREALLOCHOLDERS=32 +CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_SIG_DEFAULT=y +CONFIG_SIG_SIGALRM_ACTION=y +CONFIG_SIG_SIGUSR1_ACTION=y +CONFIG_SIG_SIGUSR2_ACTION=y +CONFIG_SIG_SIGWORK=4 +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_BUFFER_SIZE=256 +CONFIG_STM32H7_ADC1=y +CONFIG_STM32H7_ADC3=y +CONFIG_STM32H7_BBSRAM=y +CONFIG_STM32H7_BBSRAM_FILES=5 +CONFIG_STM32H7_BDMA=y +CONFIG_STM32H7_BKPSRAM=y +CONFIG_STM32H7_DMA1=y +CONFIG_STM32H7_DMA2=y +CONFIG_STM32H7_DMACAPABLE=y +CONFIG_STM32H7_FLASH_OVERRIDE_I=y +CONFIG_STM32H7_FLOWCONTROL_BROKEN=y +CONFIG_STM32H7_I2C1=y +CONFIG_STM32H7_I2C2=y +CONFIG_STM32H7_I2C4=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_RTC=y +CONFIG_STM32H7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y +CONFIG_STM32H7_RTC_MAGIC_REG=1 +CONFIG_STM32H7_SAVE_CRASHDUMP=y +CONFIG_STM32H7_SDMMC2=y +CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_SPI1=y +CONFIG_STM32H7_SPI1_DMA=y +CONFIG_STM32H7_SPI1_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI6=y +CONFIG_STM32H7_SPI6_DMA=y +CONFIG_STM32H7_SPI6_DMA_BUFFER=1024 +CONFIG_STM32H7_TIM12=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM4=y +CONFIG_STM32H7_TIM5=y +CONFIG_STM32H7_UART4=y +CONFIG_STM32H7_UART5=y +CONFIG_STM32H7_UART7=y +CONFIG_STM32H7_USART1=y +CONFIG_STM32H7_USART3=y +CONFIG_STM32H7_USART6=y +CONFIG_STM32H7_USART_BREAKS=y +CONFIG_STM32H7_USART_INVERT=y +CONFIG_STM32H7_USART_SINGLEWIRE=y +CONFIG_STM32H7_USART_SWAP=y +CONFIG_SYSTEM_CDCACM=y +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_UART4_BAUD=57600 +CONFIG_UART4_RXBUFSIZE=600 +CONFIG_UART4_TXBUFSIZE=1500 +CONFIG_UART5_IFLOWCONTROL=y +CONFIG_UART5_OFLOWCONTROL=y +CONFIG_UART5_RXDMA=y +CONFIG_UART5_TXBUFSIZE=10000 +CONFIG_UART5_TXDMA=y +CONFIG_UART7_BAUD=57600 +CONFIG_UART7_IFLOWCONTROL=y +CONFIG_UART7_OFLOWCONTROL=y +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_RXDMA=y +CONFIG_UART7_TXBUFSIZE=3000 +CONFIG_UART7_TXDMA=y +CONFIG_USART1_BAUD=57600 +CONFIG_USART1_RXBUFSIZE=600 +CONFIG_USART1_TXBUFSIZE=1500 +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=180 +CONFIG_USART3_RXDMA=y +CONFIG_USART3_SERIAL_CONSOLE=y +CONFIG_USART3_TXBUFSIZE=1500 +CONFIG_USART3_TXDMA=y +CONFIG_USART6_BAUD=57600 +CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 +CONFIG_WATCHDOG=y diff --git a/boards/ark/fpv/nuttx-config/scripts/bootloader_script.ld b/boards/ark/fpv/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 000000000000..b0515c91c7f8 --- /dev/null +++ b/boards/ark/fpv/nuttx-config/scripts/bootloader_script.ld @@ -0,0 +1,215 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2024 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 ARKV6X uses an STM32H743II has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743II, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * The ARKV6X has a test point on board, the BOOT0 pin is at ground so by + * default, the STM32 will boot to address 0x0800:0000 in FLASH unless the test + * point is pulled to 3.3V.then the boot will be from 0x1FF0:0000 + * + * The STM32H743II also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + * + * The bootloader uses the first sector of the flash, which is 128K in length. + */ + +MEMORY +{ + itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + flash (rx) : ORIGIN = 0x08000000, LENGTH = 128K + dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K + sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K + sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K + sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K + sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K + sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K + bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) +EXTERN(_bootdelay_signature) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + . = ALIGN(32); + /* + This signature provides the bootloader with a way to delay booting + */ + _bootdelay_signature = ABSOLUTE(.); + FILL(0xffecc2925d7d05c5) + . += 8; + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + + } > flash + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > flash + + + .ARM.extab : { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + } > sram AT > flash + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/ark/fpv/nuttx-config/scripts/script.ld b/boards/ark/fpv/nuttx-config/scripts/script.ld new file mode 100644 index 000000000000..8e6dca3e4941 --- /dev/null +++ b/boards/ark/fpv/nuttx-config/scripts/script.ld @@ -0,0 +1,229 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2024 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 ARKV6X uses an STM32H743II has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743II, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * The ARKV6X has a test point on board, the BOOT0 pin is at ground so by + * default, the STM32 will boot to address 0x0800:0000 in FLASH unless the test + * point is pulled to 3.3V.then the boot will be from 0x1FF0:0000 + * + * The STM32H743II also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + */ + +MEMORY +{ + ITCM_RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1792K /* params in last sector */ + + 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/ark/fpv/src/CMakeLists.txt b/boards/ark/fpv/src/CMakeLists.txt new file mode 100644 index 000000000000..78b8222f19d8 --- /dev/null +++ b/boards/ark/fpv/src/CMakeLists.txt @@ -0,0 +1,77 @@ +############################################################################ +# +# Copyright (c) 2016 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ +if("${PX4_BOARD_LABEL}" STREQUAL "bootloader") + add_compile_definitions(BOOTLOADER) + add_library(drivers_board + bootloader_main.c + init.c + usb.c + timer_config.cpp + ) + target_link_libraries(drivers_board + PRIVATE + nuttx_arch # sdio + nuttx_drivers # sdio + px4_layer #gpio + arch_io_pins # iotimer + bootloader + ) + target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) + +else() + add_library(drivers_board + can.c + i2c.cpp + init.c + led.c + mtd.cpp + sdio.c + spi.cpp + spix_sync.c + spix_sync.h + timer_config.cpp + usb.c + ) + add_dependencies(drivers_board arch_board_hw_info) + + target_link_libraries(drivers_board + PRIVATE + arch_io_pins + arch_spi + arch_board_hw_info + drivers__led # drv_led_start + nuttx_arch # sdio + nuttx_drivers # sdio + px4_layer + ) +endif() diff --git a/boards/ark/fpv/src/board_config.h b/boards/ark/fpv/src/board_config.h new file mode 100644 index 000000000000..f24f14ad7a06 --- /dev/null +++ b/boards/ark/fpv/src/board_config.h @@ -0,0 +1,384 @@ +/**************************************************************************** + * + * Copyright (c) 2016-2024 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 + * + * ARK FPV internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include + + +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +#undef TRACE_PINS + +/* Configuration ************************************************************************************/ + +# define BOARD_HAS_USB_VALID 1 +# define BOARD_HAS_NBAT_V 1 +# define BOARD_HAS_NBAT_I 1 + +/* PX4FMU GPIOs ***********************************************************************************/ + +/* Trace Clock and D0-D3 are available on the trace connector + * + * TRACECLK PE2 - Dedicated - Trace Connector Pin 1 + * TRACED0 PE3 - nLED_RED - Trace Connector Pin 3 + * TRACED1 PE4 - nLED_GREEN - Trace Connector Pin 5 + * TRACED2 PE5 - nLED_BLUE - Trace Connector Pin 7 + * TRACED3 PE6 - nARMED - Trace Connector Pin 8 + + */ + +/* LEDs are driven with push open drain to support Anode to 5V or 3.3V or used as TRACE0-2 */ + +#if !defined(TRACE_PINS) +# define GPIO_nLED_RED /* PE3 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN3) +# define GPIO_nLED_GREEN /* PE4 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN4) +# define GPIO_nLED_BLUE /* PE5 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN5) + +# define BOARD_HAS_CONTROL_STATUS_LEDS 1 +# define BOARD_OVERLOAD_LED LED_RED +# define BOARD_ARMED_STATE_LED LED_BLUE + +#else + +# define GPIO_TRACECLK1 (GPIO_TRACECLK |GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN2) +# define GPIO_TRACED0 (GPIO_TRACED0_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN3) +# define GPIO_TRACED1 (GPIO_TRACED1_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN4) +# define GPIO_TRACED2 (GPIO_TRACED2_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN5) +# define GPIO_TRACED3 (GPIO_TRACED3_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN6) +//#define GPIO_TRACESWO //(GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN3) + +# undef BOARD_HAS_CONTROL_STATUS_LEDS +# undef BOARD_OVERLOAD_LED +# undef BOARD_ARMED_STATE_LED + +# define GPIO_nLED_RED GPIO_TRACED0 +# define GPIO_nLED_GREEN GPIO_TRACED1 +# define GPIO_nLED_BLUE GPIO_TRACED2 +# define GPIO_nARMED GPIO_TRACED3 +# define GPIO_nARMED_INIT GPIO_TRACED3 +#endif + +/* I2C busses */ + +/* Devices on the onboard buses. + * + * Note that these are unshifted addresses. + */ +#define PX4_I2C_OBDEV_SE050 0x48 + +/* + * ADC channels + * + * These are the channel numbers of the ADCs of the microcontroller that + * can be used by the Px4 Firmware in the adc driver + */ + +/* ADC defines to be used in sensors.cpp to read from a particular channel */ + +#define ADC1_CH(n) (n) + +/* N.B. there is no offset mapping needed for ADC3 because */ +#define ADC3_CH(n) (n) + +/* We are only use ADC3 for REV/VER. + * ADC3_6V6 and ADC3_3V3 are mapped back to ADC1 + * To do this We are relying on PC2_C, PC3_C being connected to PC2, PC3 + * respectively by the SYSCFG_PMCR default of setting for PC3SO PC2SO PA1SO + * PA0SO of 0. + * + * 0 Analog switch closed (pads are connected through the analog switch) + * + * So ADC3_INP0 is GPIO_ADC123_INP12 + * ADC3_INP1 is GPIO_ADC12_INP13 + */ + +/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ + +#define PX4_ADC_GPIO \ + /* PA0 */ GPIO_ADC1_INP16, \ + /* PA4 */ GPIO_ADC12_INP18, \ + /* PB0 */ GPIO_ADC12_INP9, \ + /* PB1 */ GPIO_ADC12_INP5, \ + /* PC2 */ GPIO_ADC123_INP12, \ + /* PC3 */ GPIO_ADC12_INP13, \ + /* PF12 */ GPIO_ADC1_INP6, \ + /* PH3 */ GPIO_ADC3_INP14, \ + /* PH4 */ GPIO_ADC3_INP15 + +/* Define Channel numbers must match above GPIO pin IN(n)*/ +#define ADC_BATTERY_VOLTAGE_CHANNEL /* PB0 */ ADC1_CH(9) +#define ADC_BATTERY_CURRENT_CHANNEL /* PC2 */ ADC3_CH(0) +#define ADC_SCALED_12V_CHANNEL /* PA4 */ ADC1_CH(18) +#define ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL /* PA0 */ ADC1_CH(16) +#define ADC_SCALED_V5_CHANNEL /* PB1 */ ADC1_CH(5) +#define ADC_HW_VER_SENSE_CHANNEL /* PH3 */ ADC3_CH(14) +#define ADC_HW_REV_SENSE_CHANNEL /* PH4 */ ADC3_CH(15) + +#define ADC_CHANNELS \ + ((1 << ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL) | \ + (1 << ADC_SCALED_V5_CHANNEL)) | \ + (1 << ADC_SCALED_12V_CHANNEL) | \ + (1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL) + +/* HW has to large of R termination on ADC todo:change when HW value is chosen */ + +#define HW_REV_VER_ADC_BASE STM32_ADC3_BASE + +#define SYSTEM_ADC_BASE STM32_ADC1_BASE + +/* HW has to large of R termination on ADC todo:change when HW value is chosen */ +#define BOARD_ADC_OPEN_CIRCUIT_V (5.6f) + +/* HW Version and Revision drive signals Default to 1 to detect */ +#define BOARD_HAS_HW_SPLIT_VERSIONING + +#define GPIO_HW_VER_REV_DRIVE /* PG0 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN0) +#define GPIO_HW_REV_SENSE /* PH4 */ GPIO_ADC3_INP15 +#define GPIO_HW_VER_SENSE /* PH3 */ GPIO_ADC3_INP14 +#define HW_INFO_INIT_PREFIX "ARKFPV" + +#define BOARD_NUM_SPI_CFG_HW_VERSIONS 2 +// Base/FMUM +#define ARKFPV_0 HW_FMUM_ID(0x0) // ARKFPV, Sensor Set Rev 0 +#define ARKFPV_1 HW_FMUM_ID(0x1) // ARKFPV, Sensor Set Rev 1 + +#define UAVCAN_NUM_IFACES_RUNTIME 1 + +/* HEATER + * PWM in future + */ +#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) + +/* PE6 is nARMED + * The GPIO will be set as input while not armed HW will have external HW Pull UP. + * While armed it shall be configured at a GPIO OUT set LOW + */ +#if !defined(TRACE_PINS) +#define GPIO_nARMED_INIT /* PE6 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN6) +#define GPIO_nARMED /* PE6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN6) +#define BOARD_INDICATE_EXTERNAL_LOCKOUT_STATE(enabled) px4_arch_configgpio((enabled) ? GPIO_nARMED : GPIO_nARMED_INIT) +#define BOARD_GET_EXTERNAL_LOCKOUT_STATE() px4_arch_gpioread(GPIO_nARMED) +#endif + +/* PWM + */ +#define DIRECT_PWM_OUTPUT_CHANNELS 8 + +#define GPIO_FMU_CH1 /* PI0 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTI|GPIO_PIN0) +#define GPIO_FMU_CH2 /* PH12 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTH|GPIO_PIN12) +#define GPIO_FMU_CH3 /* PH11 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTH|GPIO_PIN11) +#define GPIO_FMU_CH4 /* PH10 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTH|GPIO_PIN10) +#define GPIO_FMU_CH5 /* PI5 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTI|GPIO_PIN5) +#define GPIO_FMU_CH6 /* PI6 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTI|GPIO_PIN6) +#define GPIO_FMU_CH7 /* PI7 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTI|GPIO_PIN7) +#define GPIO_FMU_CH8 /* PI2 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTI|GPIO_PIN2) +#define GPIO_FMU_CH9 /* PD12 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTD|GPIO_PIN12) + +#define GPIO_SPIX_SYNC /* PE9 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTE|GPIO_PIN9) + +/* Power supply control and monitoring GPIOs */ + +#define GPIO_VDD_5V_PGOOD /* PF13 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTF|GPIO_PIN13) +#define GPIO_VDD_12V_PGOOD /* PE15 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTE|GPIO_PIN15) +#define GPIO_5V_ON_BATTERY /* PG1 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTG|GPIO_PIN1) +#define GPIO_VDD_12V_EN /* PG4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN4) + +#define GPIO_VDD_3V3_SD_CARD_EN /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) + + +/* Define True logic Power Control in arch agnostic form */ + +#define VDD_3V3_SD_CARD_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SD_CARD_EN, (on_true)) +#define VDD_12V_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_12V_EN, (on_true)) + +/* USB OTG FS + * + * PA9 OTG_FS_VBUS VBUS sensing + */ +#define GPIO_OTGFS_VBUS /* PA9 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN9) + +#define FLASH_BASED_PARAMS + +/* High-resolution timer */ +#define HRT_TIMER 8 /* use timer8 for the HRT */ +#define HRT_TIMER_CHANNEL 3 /* use capture/compare channel 3 */ + +/* RC Serial port */ + +#define RC_SERIAL_PORT "/dev/ttyS4" + +/* PWM input driver. Use FMU AUX5 pins attached to timer4 channel 2 */ +#define PWMIN_TIMER 4 +#define PWMIN_TIMER_CHANNEL /* T4C2 */ 2 +#define GPIO_PWM_IN /* PD13 */ GPIO_TIM4_CH2IN_2 + +#define SDIO_SLOTNO 0 /* Only one slot */ +#define SDIO_MINOR 0 + +/* SD card bringup does not work if performed on the IDLE thread because it + * will cause waiting. Use either: + * + * CONFIG_BOARDCTL=y, OR + * CONFIG_BOARD_INITIALIZE=y && CONFIG_BOARD_INITTHREAD=y + */ + +#if defined(CONFIG_BOARD_INITIALIZE) && !defined(CONFIG_BOARDCTL) && \ + !defined(CONFIG_BOARD_INITTHREAD) +# warning SDIO initialization cannot be perfomed on the IDLE thread +#endif + +/* By Providing BOARD_ADC_USB_CONNECTED (using the px4_arch abstraction) + * this board support the ADC system_power interface, and therefore + * provides the true logic GPIO BOARD_ADC_xxxx macros. + */ +#define BOARD_ADC_USB_CONNECTED (px4_arch_gpioread(GPIO_OTGFS_VBUS)) + +/* ARKFPV never powers off the Servo rail */ + +#define BOARD_ADC_SERVO_VALID (1) + +#define BOARD_ADC_BRICK_VALID (px4_arch_gpioread(GPIO_VDD_5V_PGOOD)) +#define BOARD_ADC_12V_RAIL_VALID (px4_arch_gpioread(GPIO_VDD_12V_PGOOD)) + +/* This board provides a DMA pool and APIs */ +#define BOARD_DMA_ALLOC_POOL_SIZE 5120 + +/* This board provides the board_on_reset interface */ + +#define BOARD_HAS_ON_RESET 1 + +#if defined(TRACE_PINS) +#define GPIO_TRACE \ + GPIO_TRACECLK1, \ + GPIO_TRACED0, \ + GPIO_TRACED1, \ + GPIO_TRACED2, \ + GPIO_TRACED3 +#else +#define GPIO_TRACE (GPIO_OUTPUT|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN2) +#endif + +#define PX4_GPIO_INIT_LIST { \ + GPIO_TRACE, \ + PX4_ADC_GPIO, \ + GPIO_HW_VER_REV_DRIVE, \ + GPIO_CAN1_TX, \ + GPIO_CAN1_RX, \ + GPIO_HEATER_OUTPUT, \ + GPIO_VDD_5V_PGOOD, \ + GPIO_VDD_12V_PGOOD, \ + GPIO_VDD_12V_EN, \ + GPIO_5V_ON_BATTERY, \ + GPIO_VDD_3V3_SD_CARD_EN, \ + GPIO_nARMED_INIT, \ + GPIO_FMU_CH1, \ + GPIO_FMU_CH2, \ + GPIO_FMU_CH3, \ + GPIO_FMU_CH4, \ + GPIO_FMU_CH5, \ + GPIO_FMU_CH6, \ + GPIO_FMU_CH7, \ + GPIO_FMU_CH8, \ + GPIO_FMU_CH9, \ + GPIO_SPIX_SYNC \ + } + +#define BOARD_ENABLE_CONSOLE_BUFFER + +#define BOARD_NUM_IO_TIMERS 3 +#define BOARD_SPIX_SYNC_FREQ 32000 + +__BEGIN_DECLS + +/**************************************************************************************************** + * Public Types + ****************************************************************************************************/ + +/**************************************************************************************************** + * Public data + ****************************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************************************** + * Public Functions + ****************************************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +int stm32_sdio_initialize(void); + +/**************************************************************************************************** + * Name: stm32_spiinitialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the PX4FMU board. + * + ****************************************************************************************************/ + +extern void stm32_spiinitialize(void); + +extern void stm32_usbinitialize(void); + +extern void board_peripheral_reset(int ms); + +#include + +#endif /* __ASSEMBLY__ */ + +__END_DECLS diff --git a/boards/ark/fpv/src/bootloader_main.c b/boards/ark/fpv/src/bootloader_main.c new file mode 100644 index 000000000000..7a3ef5e01932 --- /dev/null +++ b/boards/ark/fpv/src/bootloader_main.c @@ -0,0 +1,85 @@ +/**************************************************************************** + * + * Copyright (c) 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 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 +#include + +extern int sercon_main(int c, char **argv); + +__EXPORT void board_on_reset(int status) {} + +__EXPORT void stm32_boardinitialize(void) +{ + /* configure pins */ + const uint32_t list[] = PX4_GPIO_INIT_LIST; + + for (size_t gpio = 0; gpio < arraySize(list); gpio++) { + if (list[gpio] != 0) { + px4_arch_configgpio(list[gpio]); + } + } + + /* configure USB interfaces */ + stm32_usbinitialize(); +} + +__EXPORT int board_app_initialize(uintptr_t arg) +{ + return 0; +} + +void board_late_initialize(void) +{ + sercon_main(0, NULL); +} + +extern void sys_tick_handler(void); +void board_timerhook(void) +{ + sys_tick_handler(); +} diff --git a/boards/ark/fpv/src/can.c b/boards/ark/fpv/src/can.c new file mode 100644 index 000000000000..cdebe7a3ad61 --- /dev/null +++ b/boards/ark/fpv/src/can.c @@ -0,0 +1,142 @@ +/**************************************************************************** + * + * 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 can.c + * + * Board-specific CAN functions. + */ + +#if !defined(CONFIG_CAN) + +#include + +#include "board_config.h" + + +__EXPORT +uint16_t board_get_can_interfaces(void) +{ + uint16_t enabled_interfaces = 0x3; + + if (!PX4_MFT_HW_SUPPORTED(PX4_MFT_CAN2)) { + enabled_interfaces &= ~(1 << 1); + } + + return enabled_interfaces; +} + +#else + +#include +#include + +#include +#include + +#include "chip.h" +#include "arm_internal.h" + +#include "chip.h" +#include "stm32_can.h" +#include "board_config.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ +/* Configuration ********************************************************************/ + +#if defined(CONFIG_STM32_CAN1) && defined(CONFIG_STM32_CAN2) +# warning "Both CAN1 and CAN2 are enabled. Assuming only CAN1." +# undef CONFIG_STM32_CAN2 +#endif + +#ifdef CONFIG_STM32_CAN1 +# define CAN_PORT 1 +#else +# define CAN_PORT 2 +#endif + +/************************************************************************************ + * Private Functions + ************************************************************************************/ + +/************************************************************************************ + * Public Functions + ************************************************************************************/ +int can_devinit(void); + +/************************************************************************************ + * Name: can_devinit + * + * Description: + * All STM32 architectures must provide the following interface to work with + * examples/can. + * + ************************************************************************************/ + +int can_devinit(void) +{ + static bool initialized = false; + struct can_dev_s *can; + int ret; + + /* Check if we have already initialized */ + + if (!initialized) { + /* Call stm32_caninitialize() to get an instance of the CAN interface */ + + can = stm32_caninitialize(CAN_PORT); + + if (can == NULL) { + canerr("ERROR: Failed to get CAN interface\n"); + return -ENODEV; + } + + /* Register the CAN driver at "/dev/can0" */ + + ret = can_register("/dev/can0", can); + + if (ret < 0) { + canerr("ERROR: can_register failed: %d\n", ret); + return ret; + } + + /* Now we are initialized */ + + initialized = true; + } + + return OK; +} +#endif /* CONFIG_CAN */ diff --git a/boards/ark/fpv/src/hw_config.h b/boards/ark/fpv/src/hw_config.h new file mode 100644 index 000000000000..8ee75507955a --- /dev/null +++ b/boards/ark/fpv/src/hw_config.h @@ -0,0 +1,129 @@ +/* + * hw_config.h + * + * Created on: May 17, 2015 + * Author: david_s5 + */ + +#ifndef HW_CONFIG_H_ +#define HW_CONFIG_H_ + +/**************************************************************************** + * 10-8--2016: + * To simplify the ripple effect on the tools, we will be using + * /dev/serial/by-id/PX4 to locate PX4 devices. Therefore + * moving forward all Bootloaders must contain the prefix "PX4 BL " + * in the USBDEVICESTRING + * This Change will be made in an upcoming BL release + ****************************************************************************/ +/* + * Define usage to configure a bootloader + * + * + * Constant example Usage + * APP_LOAD_ADDRESS 0x08004000 - The address in Linker Script, where the app fw is org-ed + * BOOTLOADER_DELAY 5000 - Ms to wait while under USB pwr or bootloader request + * BOARD_FMUV2 + * INTERFACE_USB 1 - (Optional) Scan and use the USB interface for bootloading + * INTERFACE_USART 1 - (Optional) Scan and use the Serial interface for bootloading + * USBDEVICESTRING "PX4 BL FMU v2.x" - USB id string + * USBPRODUCTID 0x0011 - PID Should match defconfig + * BOOT_DELAY_ADDRESS 0x000001a0 - (Optional) From the linker script from Linker Script to get a custom + * delay provided by an APP FW + * BOARD_TYPE 9 - Must match .prototype boad_id + * _FLASH_KBYTES (*(uint16_t *)0x1fff7a22) - Run time flash size detection + * BOARD_FLASH_SECTORS ((_FLASH_KBYTES == 0x400) ? 11 : 23) - Run time determine the physical last sector + * BOARD_FLASH_SECTORS 11 - Hard coded zero based last sector + * BOARD_FLASH_SIZE (_FLASH_KBYTES*1024)- Total Flash size of device, determined at run time. + * (1024 * 1024) - Hard coded Total Flash of device - The bootloader and app reserved will be deducted + * programmatically + * + * BOARD_FIRST_FLASH_SECTOR_TO_ERASE 2 - Optional sectors index in the flash_sectors table (F4 only), to begin erasing. + * This is to allow sectors to be reserved for app fw usage. That will NOT be erased + * during a FW upgrade. + * The default is 0, and selects the first sector to be erased, as the 0th entry in the + * flash_sectors table. Which is the second physical sector of FLASH in the device. + * The first physical sector of FLASH is used by the bootloader, and is not defined + * in the table. + * + * APP_RESERVATION_SIZE (BOARD_FIRST_FLASH_SECTOR_TO_ERASE * 16 * 1024) - Number of bytes reserved by the APP FW. This number plus + * BOOTLOADER_RESERVATION_SIZE will be deducted from + * BOARD_FLASH_SIZE to determine the size of the App FW + * and hence the address space of FLASH to erase and program. + * USBMFGSTRING "PX4 AP" - Optional USB MFG string (default is '3D Robotics' if not defined.) + * SERIAL_BREAK_DETECT_DISABLED - Optional prevent break selection on Serial port from entering or staying in BL + * + * * Other defines are somewhat self explanatory. + */ + +/* Boot device selection list*/ +#define USB0_DEV 0x01 +#define SERIAL0_DEV 0x02 +#define SERIAL1_DEV 0x04 + +#define APP_LOAD_ADDRESS 0x08020000 +#define BOOTLOADER_DELAY 5000 +#define INTERFACE_USB 1 +#define INTERFACE_USB_CONFIG "/dev/ttyACM0" +#define BOARD_VBUS MK_GPIO_INPUT(GPIO_OTGFS_VBUS) + +//#define USE_VBUS_PULL_DOWN +#define INTERFACE_USART 1 +#define INTERFACE_USART_CONFIG "/dev/ttyS5,921600" +#define BOOT_DELAY_ADDRESS 0x000001a0 +#define BOARD_TYPE 59 +#define _FLASH_KBYTES (*(uint32_t *)0x1FF1E880) +#define BOARD_FLASH_SECTORS (14) +#define BOARD_FLASH_SIZE (_FLASH_KBYTES * 1024) +#define APP_RESERVATION_SIZE (1 * 128 * 1024) + +#define OSC_FREQ 16 + +#define BOARD_PIN_LED_ACTIVITY GPIO_nLED_BLUE // BLUE +#define BOARD_PIN_LED_BOOTLOADER GPIO_nLED_GREEN // GREEN +#define BOARD_LED_ON 0 +#define BOARD_LED_OFF 1 + +#define SERIAL_BREAK_DETECT_DISABLED 1 + +/* + * Uncommenting this allows to force the bootloader through + * a PWM output pin. As this can accidentally initialize + * an ESC prematurely, it is not recommended. This feature + * has not been used and hence defaults now to off. + * + * # define BOARD_FORCE_BL_PIN_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN14) + * # define BOARD_FORCE_BL_PIN_IN (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN11) + * + * # define BOARD_POWER_PIN_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN4) + * # define BOARD_POWER_ON 1 + * # define BOARD_POWER_OFF 0 + * # undef BOARD_POWER_PIN_RELEASE // Leave pin enabling Power - un comment to release (disable power) + * +*/ + +#if !defined(ARCH_SN_MAX_LENGTH) +# define ARCH_SN_MAX_LENGTH 12 +#endif + +#if !defined(APP_RESERVATION_SIZE) +# define APP_RESERVATION_SIZE 0 +#endif + +#if !defined(BOARD_FIRST_FLASH_SECTOR_TO_ERASE) +# define BOARD_FIRST_FLASH_SECTOR_TO_ERASE 1 +#endif + +#if !defined(USB_DATA_ALIGN) +# define USB_DATA_ALIGN +#endif + +#ifndef BOOT_DEVICES_SELECTION +# define BOOT_DEVICES_SELECTION USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +#endif + +#ifndef BOOT_DEVICES_FILTER_ONUSB +# define BOOT_DEVICES_FILTER_ONUSB USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +#endif + +#endif /* HW_CONFIG_H_ */ diff --git a/boards/ark/fpv/src/i2c.cpp b/boards/ark/fpv/src/i2c.cpp new file mode 100644 index 000000000000..8add5e64f719 --- /dev/null +++ b/boards/ark/fpv/src/i2c.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** + * + * Copyright (C) 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 + +constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { + initI2CBusExternal(1), + initI2CBusInternal(2), + initI2CBusInternal(4), +}; diff --git a/boards/ark/fpv/src/init.c b/boards/ark/fpv/src/init.c new file mode 100644 index 000000000000..6e91e37b3522 --- /dev/null +++ b/boards/ark/fpv/src/init.c @@ -0,0 +1,293 @@ +/**************************************************************************** + * + * 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 + * + * ARKFMU-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 "spix_sync.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 + +# if defined(FLASH_BASED_PARAMS) +# include +#endif + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +__END_DECLS + + +/************************************************************************************ + * Name: board_peripheral_reset + * + * Description: + * + ************************************************************************************/ +__EXPORT void board_peripheral_reset(int ms) +{ + /* set the peripheral rails off */ + + VDD_12V_EN(false); + board_control_spi_sensors_power(false, 0xffff); + + /* wait for the peripheral rail to reach GND */ + usleep(ms * 1000); + syslog(LOG_DEBUG, "reset done, %d ms\n", ms); + + /* re-enable power */ + + /* switch the peripheral rail back on */ + board_control_spi_sensors_power(true, 0xffff); + VDD_12V_EN(true); +} + +/************************************************************************************ + * Name: board_on_reset + * + * Description: + * Optionally provided function called on entry to board_system_reset + * It should perform any house keeping prior to the rest. + * + * status - 1 if resetting to boot loader + * 0 if just resetting + * + ************************************************************************************/ +__EXPORT void board_on_reset(int status) +{ + for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { + px4_arch_configgpio(PX4_MAKE_GPIO_INPUT(io_timer_channel_get_as_pwm_input(i))); + } + + if (status >= 0) { + up_mdelay(6); + } +} + +/************************************************************************************ + * Name: stm32_boardinitialize + * + * Description: + * All STM32 architectures must provide the following entry point. This entry point + * is called early in the initialization -- after all memory has been configured + * and mapped but before any devices have been initialized. + * + ************************************************************************************/ + +__EXPORT void +stm32_boardinitialize(void) +{ + board_on_reset(-1); /* Reset PWM first thing */ + + /* configure LEDs */ + + board_autoled_initialize(); + + /* configure pins */ + + const uint32_t gpio[] = PX4_GPIO_INIT_LIST; + px4_gpio_init(gpio, arraySize(gpio)); + + /* configure USB interfaces */ + + stm32_usbinitialize(); + +} + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; the meaning of the argument is a contract + * between the board-specific initalization logic and the the + * matching application logic. The value cold be such things as a + * mode enumeration value, a set of DIP switch switch settings, a + * pointer to configuration data read from a file or serial FLASH, + * or whatever you would like to do with it. Every implementation + * should accept zero/NULL as a default configuration. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ + +__EXPORT int board_app_initialize(uintptr_t arg) +{ + /* Power on Interfaces */ + VDD_12V_EN(true); + + /* Need hrt running before using the ADC */ + + px4_platform_init(); + + // Use the default HW_VER_REV(0x0,0x0) for Ramtron + + stm32_spiinitialize(); + +#if defined(FLASH_BASED_PARAMS) + static sector_descriptor_t params_sector_map[] = { + {15, 128 * 1024, 0x081E0000}, + {0, 0, 0}, + }; + + /* Initialize the flashfs layer to use heap allocated memory */ + int result = parameter_flashfs_init(params_sector_map, NULL, 0); + + if (result != OK) { + syslog(LOG_ERR, "[boot] FAILED to init params in FLASH %d\n", result); + led_on(LED_AMBER); + } + +#endif // FLASH_BASED_PARAMS + + /* Configure the HW based on the manifest */ + + px4_platform_configure(); + + if (OK == board_determine_hw_info()) { + syslog(LOG_INFO, "[boot] Rev 0x%1x : Ver 0x%1x %s\n", board_get_hw_revision(), board_get_hw_version(), + board_get_hw_type_name()); + + } else { + syslog(LOG_ERR, "[boot] Failed to read HW revision and version\n"); + } + + /* Configure the Actual SPI interfaces (after we determined the HW version) */ + + stm32_spiinitialize(); + + board_spi_reset(10, 0xffff); + + /* Configure the DMA allocator */ + + if (board_dma_alloc_init() < 0) { + syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); + } + +#if defined(SERIAL_HAVE_RXDMA) + // set up the serial DMA polling at 1ms intervals for received bytes that have not triggered a DMA event. + static struct hrt_call serial_dma_call; + hrt_call_every(&serial_dma_call, 1000, 1000, (hrt_callout)stm32_serial_dma_poll, NULL); +#endif + + /* initial LED state */ + drv_led_start(); + led_off(LED_RED); + led_on(LED_GREEN); // Indicate Power. + led_off(LED_BLUE); + + if (board_hardfault_init(2, true) != 0) { + led_on(LED_RED); + } + + // Ensure Power is off for > 10 mS + usleep(15 * 1000); + VDD_3V3_SD_CARD_EN(true); + usleep(500 * 1000); + +#ifdef CONFIG_MMCSD + int ret = stm32_sdio_initialize(); + + if (ret != OK) { + led_on(LED_RED); + return ret; + } + +#endif /* CONFIG_MMCSD */ + + /* Configure the SPIX_SYNC output */ + spix_sync_servo_init(BOARD_SPIX_SYNC_FREQ); + spix_sync_servo_set(0, 150); + + return OK; +} diff --git a/boards/ark/fpv/src/led.c b/boards/ark/fpv/src/led.c new file mode 100644 index 000000000000..b629ade32c36 --- /dev/null +++ b/boards/ark/fpv/src/led.c @@ -0,0 +1,234 @@ +/**************************************************************************** + * + * 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 + * + * ARKFMU 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 +}; + +#else + +# define xlat(p) (p) +static uint32_t g_ledmap[] = { + GPIO_nLED_BLUE, // Indexed by LED_BLUE + GPIO_nLED_RED, // Indexed by LED_RED, LED_AMBER + 0, // Indexed by LED_SAFETY (defaulted to an input) + GPIO_nLED_GREEN, // Indexed by LED_GREEN +}; + +#endif + +__EXPORT void led_init(void) +{ + for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) { + if (g_ledmap[l] != 0) { + stm32_configgpio(g_ledmap[l]); + } + } +} + +static void phy_set_led(int led, bool state) +{ + /* Drive Low to switch on */ + + if (g_ledmap[led] != 0) { + stm32_gpiowrite(g_ledmap[led], !state); + } +} + +static bool phy_get_led(int led) +{ + /* If Low it is on */ + if (g_ledmap[led] != 0) { + return !stm32_gpioread(g_ledmap[led]); + } + + return false; +} + +__EXPORT void led_on(int led) +{ + phy_set_led(xlat(led), true); +} + +__EXPORT void led_off(int led) +{ + phy_set_led(xlat(led), false); +} + +__EXPORT void led_toggle(int led) +{ + phy_set_led(xlat(led), !phy_get_led(xlat(led))); +} + +#ifdef CONFIG_ARCH_LEDS +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_autoled_initialize + ****************************************************************************/ + +void board_autoled_initialize(void) +{ + led_init(); +} + +/**************************************************************************** + * Name: board_autoled_on + ****************************************************************************/ + +void board_autoled_on(int led) +{ + if (!nuttx_owns_leds) { + return; + } + + switch (led) { + default: + break; + + case LED_HEAPALLOCATE: + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_IRQSENABLED: + phy_set_led(BOARD_LED_BLUE, false); + phy_set_led(BOARD_LED_GREEN, true); + break; + + case LED_STACKCREATED: + phy_set_led(BOARD_LED_GREEN, true); + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_INIRQ: + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_SIGNAL: + phy_set_led(BOARD_LED_GREEN, true); + break; + + case LED_ASSERTION: + phy_set_led(BOARD_LED_RED, true); + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_PANIC: + phy_set_led(BOARD_LED_RED, true); + break; + + case LED_IDLE : /* IDLE */ + phy_set_led(BOARD_LED_RED, true); + break; + } +} + +/**************************************************************************** + * Name: board_autoled_off + ****************************************************************************/ + +void board_autoled_off(int led) +{ + if (!nuttx_owns_leds) { + return; + } + + switch (led) { + default: + break; + + case LED_SIGNAL: + phy_set_led(BOARD_LED_GREEN, false); + break; + + case LED_INIRQ: + phy_set_led(BOARD_LED_BLUE, false); + break; + + case LED_ASSERTION: + phy_set_led(BOARD_LED_RED, false); + phy_set_led(BOARD_LED_BLUE, false); + break; + + case LED_PANIC: + phy_set_led(BOARD_LED_RED, false); + break; + + case LED_IDLE : /* IDLE */ + phy_set_led(BOARD_LED_RED, false); + break; + } +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/ark/fpv/src/mtd.cpp b/boards/ark/fpv/src/mtd.cpp new file mode 100644 index 000000000000..bd74d551ee4c --- /dev/null +++ b/boards/ark/fpv/src/mtd.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * Copyright (C) 2024 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_entry_s mft_mft = { + .type = MFT, + .pmft = (void *) system_query_manifest, +}; + +static const px4_mft_s mft = { + .nmft = 1, + .mfts = { + &mft_mft, + } +}; + +const px4_mft_s *board_get_manifest(void) +{ + return &mft; +} diff --git a/boards/ark/fpv/src/sdio.c b/boards/ark/fpv/src/sdio.c new file mode 100644 index 000000000000..869d757756a0 --- /dev/null +++ b/boards/ark/fpv/src/sdio.c @@ -0,0 +1,177 @@ +/**************************************************************************** + * + * Copyright (C) 2014, 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "chip.h" +#include "board_config.h" +#include "stm32_gpio.h" +#include "stm32_sdmmc.h" + +#ifdef CONFIG_MMCSD + + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Card detections requires card support and a card detection GPIO */ + +#define HAVE_NCD 1 +#if !defined(GPIO_SDMMC1_NCD) +# undef HAVE_NCD +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static FAR struct sdio_dev_s *sdio_dev; +#ifdef HAVE_NCD +static bool g_sd_inserted = 0xff; /* Impossible value */ +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_ncd_interrupt + * + * Description: + * Card detect interrupt handler. + * + ****************************************************************************/ + +#ifdef HAVE_NCD +static int stm32_ncd_interrupt(int irq, FAR void *context) +{ + bool present; + + present = !stm32_gpioread(GPIO_SDMMC1_NCD); + + if (sdio_dev && present != g_sd_inserted) { + sdio_mediachange(sdio_dev, present); + g_sd_inserted = present; + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +int stm32_sdio_initialize(void) +{ + int ret; + +#ifdef HAVE_NCD + /* Card detect */ + + bool cd_status; + + /* Configure the card detect GPIO */ + + stm32_configgpio(GPIO_SDMMC1_NCD); + + /* Register an interrupt handler for the card detect pin */ + + stm32_gpiosetevent(GPIO_SDMMC1_NCD, true, true, true, stm32_ncd_interrupt); +#endif + + /* Mount the SDIO-based MMC/SD block driver */ + /* First, get an instance of the SDIO interface */ + + finfo("Initializing SDIO slot %d\n", SDIO_SLOTNO); + + sdio_dev = sdio_initialize(SDIO_SLOTNO); + + if (!sdio_dev) { + syslog(LOG_ERR, "[boot] Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); + return -ENODEV; + } + + /* Now bind the SDIO interface to the MMC/SD driver */ + + finfo("Bind SDIO to the MMC/SD driver, minor=%d\n", SDIO_MINOR); + + ret = mmcsd_slotinitialize(SDIO_MINOR, sdio_dev); + + if (ret != OK) { + syslog(LOG_ERR, "[boot] Failed to bind SDIO to the MMC/SD driver: %d\n", ret); + return ret; + } + + finfo("Successfully bound SDIO to the MMC/SD driver\n"); + +#ifdef HAVE_NCD + /* Use SD card detect pin to check if a card is g_sd_inserted */ + + cd_status = !stm32_gpioread(GPIO_SDMMC1_NCD); + finfo("Card detect : %d\n", cd_status); + + sdio_mediachange(sdio_dev, cd_status); +#else + /* Assume that the SD card is inserted. What choice do we have? */ + + sdio_mediachange(sdio_dev, true); +#endif + + return OK; +} + +#endif /* CONFIG_MMCSD */ diff --git a/boards/ark/fpv/src/spi.cpp b/boards/ark/fpv/src/spi.cpp new file mode 100644 index 000000000000..424eafedd627 --- /dev/null +++ b/boards/ark/fpv/src/spi.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** + * + * Copyright (C) 2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +#include + +constexpr px4_spi_bus_all_hw_t px4_spi_buses_all_hw[BOARD_NUM_SPI_CFG_HW_VERSIONS] = { + initSPIFmumID(ARKFPV_0, { + initSPIBus(SPI::Bus::SPI1, { + initSPIDevice(DRV_IMU_DEVTYPE_IIM42653, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), + }, {GPIO::PortI, GPIO::Pin11}), + initSPIBus(SPI::Bus::SPI6, { + initSPIDevice(DRV_DEVTYPE_UNUSED, SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}) + }), + }), + initSPIFmumID(ARKFPV_1, { // Placeholder + initSPIBus(SPI::Bus::SPI1, { + initSPIDevice(DRV_IMU_DEVTYPE_IIM42653, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), + }, {GPIO::PortI, GPIO::Pin11}), + initSPIBus(SPI::Bus::SPI6, { + initSPIDevice(DRV_DEVTYPE_UNUSED, SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}) + }), + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses_all_hw); diff --git a/boards/ark/fpv/src/spix_sync.c b/boards/ark/fpv/src/spix_sync.c new file mode 100644 index 000000000000..056e38e75f74 --- /dev/null +++ b/boards/ark/fpv/src/spix_sync.c @@ -0,0 +1,309 @@ +/**************************************************************************** + * + * 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 Airmind 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 spix_sync.c +* +* +*/ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include + +#include + +#include "spix_sync.h" + +#define REG(_tmr, _reg) (*(volatile uint32_t *)(spix_sync_timers[_tmr].base + _reg)) + +#define rCR1(_tmr) REG(_tmr, STM32_GTIM_CR1_OFFSET) +#define rCR2(_tmr) REG(_tmr, STM32_GTIM_CR2_OFFSET) +#define rSMCR(_tmr) REG(_tmr, STM32_GTIM_SMCR_OFFSET) +#define rDIER(_tmr) REG(_tmr, STM32_GTIM_DIER_OFFSET) +#define rSR(_tmr) REG(_tmr, STM32_GTIM_SR_OFFSET) +#define rEGR(_tmr) REG(_tmr, STM32_GTIM_EGR_OFFSET) +#define rCCMR1(_tmr) REG(_tmr, STM32_GTIM_CCMR1_OFFSET) +#define rCCMR2(_tmr) REG(_tmr, STM32_GTIM_CCMR2_OFFSET) +#define rCCER(_tmr) REG(_tmr, STM32_GTIM_CCER_OFFSET) +#define rCNT(_tmr) REG(_tmr, STM32_GTIM_CNT_OFFSET) +#define rPSC(_tmr) REG(_tmr, STM32_GTIM_PSC_OFFSET) +#define rARR(_tmr) REG(_tmr, STM32_GTIM_ARR_OFFSET) +#define rCCR1(_tmr) REG(_tmr, STM32_GTIM_CCR1_OFFSET) +#define rCCR2(_tmr) REG(_tmr, STM32_GTIM_CCR2_OFFSET) +#define rCCR3(_tmr) REG(_tmr, STM32_GTIM_CCR3_OFFSET) +#define rCCR4(_tmr) REG(_tmr, STM32_GTIM_CCR4_OFFSET) +#define rDCR(_tmr) REG(_tmr, STM32_GTIM_DCR_OFFSET) +#define rDMAR(_tmr) REG(_tmr, STM32_GTIM_DMAR_OFFSET) +#define rBDTR(_tmr) REG(_tmr, STM32_ATIM_BDTR_OFFSET) + +#define BOARD_SPIX_SYNC_PWM_FREQ 1024000 + +unsigned +spix_sync_timer_get_period(unsigned timer) +{ + return (rARR(timer)); +} + +static void spix_sync_timer_init_timer(unsigned timer, unsigned rate) +{ + if (spix_sync_timers[timer].base) { + + irqstate_t flags = px4_enter_critical_section(); + + /* enable the timer clock before we try to talk to it */ + + modifyreg32(spix_sync_timers[timer].clock_register, 0, spix_sync_timers[timer].clock_bit); + + /* disable and configure the timer */ + rCR1(timer) = 0; + rCR2(timer) = 0; + rSMCR(timer) = 0; + rDIER(timer) = 0; + rCCER(timer) = 0; + rCCMR1(timer) = 0; + rCCMR2(timer) = 0; + rCCR1(timer) = 0; + rCCR2(timer) = 0; + rCCR3(timer) = 0; + rCCR4(timer) = 0; + rCCER(timer) = 0; + rDCR(timer) = 0; + + if ((spix_sync_timers[timer].base == STM32_TIM1_BASE) || (spix_sync_timers[timer].base == STM32_TIM8_BASE)) { + + /* master output enable = on */ + + rBDTR(timer) = ATIM_BDTR_MOE; + } + + /* If the timer clock source provided as clock_freq is the STM32_APBx_TIMx_CLKIN + * then configure the timer to free-run at 1MHz. + * Otherwise, other frequencies are attainable by adjusting .clock_freq accordingly. + */ + + rPSC(timer) = (spix_sync_timers[timer].clock_freq / BOARD_SPIX_SYNC_PWM_FREQ) - 1; + + /* configure the timer to update at the desired rate */ + + rARR(timer) = (BOARD_SPIX_SYNC_PWM_FREQ / rate) - 1; + + /* generate an update event; reloads the counter and all registers */ + rEGR(timer) = GTIM_EGR_UG; + + px4_leave_critical_section(flags); + } + +} + +void spix_sync_channel_init(unsigned channel) +{ + /* Only initialize used channels */ + + if (spix_sync_channels[channel].timer_channel) { + + unsigned timer = spix_sync_channels[channel].timer_index; + + /* configure the GPIO first */ + px4_arch_configgpio(spix_sync_channels[channel].gpio_out); + + uint16_t polarity = spix_sync_channels[channel].masks; + + /* configure the channel */ + switch (spix_sync_channels[channel].timer_channel) { + case 1: + rCCMR1(timer) |= (GTIM_CCMR_MODE_PWM1 << GTIM_CCMR1_OC1M_SHIFT) | GTIM_CCMR1_OC1PE; + rCCER(timer) |= polarity | GTIM_CCER_CC1E; + break; + + case 2: + rCCMR1(timer) |= (GTIM_CCMR_MODE_PWM1 << GTIM_CCMR1_OC2M_SHIFT) | GTIM_CCMR1_OC2PE; + rCCER(timer) |= polarity | GTIM_CCER_CC2E; + break; + + case 3: + rCCMR2(timer) |= (GTIM_CCMR_MODE_PWM1 << GTIM_CCMR2_OC3M_SHIFT) | GTIM_CCMR2_OC3PE; + rCCER(timer) |= polarity | GTIM_CCER_CC3E; + break; + + case 4: + rCCMR2(timer) |= (GTIM_CCMR_MODE_PWM1 << GTIM_CCMR2_OC4M_SHIFT) | GTIM_CCMR2_OC4PE; + rCCER(timer) |= polarity | GTIM_CCER_CC4E; + break; + } + } +} + +int +spix_sync_servo_set(unsigned channel, uint8_t cvalue) +{ + if (channel >= arraySize(spix_sync_channels)) { + return -1; + } + + unsigned timer = spix_sync_channels[channel].timer_index; + + /* test timer for validity */ + if ((spix_sync_timers[timer].base == 0) || + (spix_sync_channels[channel].gpio_out == 0)) { + return -1; + } + + unsigned period = spix_sync_timer_get_period(timer); + + unsigned value = (unsigned)cvalue * period / 255; + + /* configure the channel */ + if (value > 0) { + value--; + } + + + switch (spix_sync_channels[channel].timer_channel) { + case 1: + rCCR1(timer) = value; + break; + + case 2: + rCCR2(timer) = value; + break; + + case 3: + rCCR3(timer) = value; + break; + + case 4: + rCCR4(timer) = value; + break; + + default: + return -1; + } + + return 0; +} + +unsigned spix_sync_servo_get(unsigned channel) +{ + if (channel >= 3) { + return 0; + } + + unsigned timer = spix_sync_channels[channel].timer_index; + uint16_t value = 0; + + /* test timer for validity */ + if ((spix_sync_timers[timer].base == 0) || + (spix_sync_channels[channel].timer_channel == 0)) { + return 0; + } + + /* configure the channel */ + switch (spix_sync_channels[channel].timer_channel) { + case 1: + value = rCCR1(timer); + break; + + case 2: + value = rCCR2(timer); + break; + + case 3: + value = rCCR3(timer); + break; + + case 4: + value = rCCR4(timer); + break; + } + + unsigned period = spix_sync_timer_get_period(timer); + return ((value + 1) * 255 / period); +} + +int spix_sync_servo_init(unsigned rate) +{ + /* do basic timer initialisation first */ + for (unsigned i = 0; i < arraySize(spix_sync_timers); i++) { + spix_sync_timer_init_timer(i, rate); + } + + /* now init channels */ + for (unsigned i = 0; i < arraySize(spix_sync_channels); i++) { + spix_sync_channel_init(i); + } + + spix_sync_servo_arm(true); + return OK; +} + +void +spix_sync_servo_deinit(void) +{ + /* disable the timers */ + spix_sync_servo_arm(false); +} +void +spix_sync_servo_arm(bool armed) +{ + /* iterate timers and arm/disarm appropriately */ + for (unsigned i = 0; i < arraySize(spix_sync_timers); i++) { + if (spix_sync_timers[i].base != 0) { + if (armed) { + /* force an update to preload all registers */ + rEGR(i) = GTIM_EGR_UG; + + /* arm requires the timer be enabled */ + rCR1(i) |= GTIM_CR1_CEN | GTIM_CR1_ARPE; + + } else { + rCR1(i) = 0; + } + } + } +} diff --git a/boards/ark/fpv/src/spix_sync.h b/boards/ark/fpv/src/spix_sync.h new file mode 100644 index 000000000000..2e37c8908613 --- /dev/null +++ b/boards/ark/fpv/src/spix_sync.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * 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. + * + ****************************************************************************/ + +__BEGIN_DECLS +void spix_sync_channel_init(unsigned channel); +int spix_sync_servo_set(unsigned channel, uint8_t value); +unsigned spix_sync_servo_get(unsigned channel); +int spix_sync_servo_init(unsigned rate); +void spix_sync_servo_deinit(void); +void spix_sync_servo_arm(bool armed); +unsigned spix_sync_timer_get_period(unsigned timer); +__END_DECLS diff --git a/boards/ark/fpv/src/timer_config.cpp b/boards/ark/fpv/src/timer_config.cpp new file mode 100644 index 000000000000..bee77b999337 --- /dev/null +++ b/boards/ark/fpv/src/timer_config.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** + * + * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +/* Timer allocation + * + * TIM5_CH4 T FMU_CH1 + * TIM5_CH3 T FMU_CH2 + * TIM5_CH2 T FMU_CH3 + * TIM5_CH1 T FMU_CH4 + * + * TIM4_CH2 T FMU_CH5 + * TIM4_CH3 T FMU_CH6 + * + * TIM12_CH1 T FMU_CH7 + * TIM12_CH2 T FMU_CH8 + * + * TIM1_CH3 T SPI2_DRDY2_ISM330_INT2 < Capture or GPIO INT + * TIM1_CH1 T SPIX_SYNC > Pulse or GPIO strobe + * + * TIM2_CH3 T HEATER > PWM OUT or GPIO + * + * TIM14_CH1 T BUZZER_1 - Driven by other driver + */ + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer5, DMA{DMA::Index1}), + initIOTimer(Timer::Timer4, DMA{DMA::Index1}), + initIOTimer(Timer::Timer12), + //initIOTimer(Timer::Timer1), + //initIOTimer(Timer::Timer2), +}; + +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel4}, {GPIO::PortI, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {GPIO::PortH, GPIO::Pin12}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel2}, {GPIO::PortH, GPIO::Pin11}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {GPIO::PortH, GPIO::Pin10}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel2}, {GPIO::PortD, GPIO::Pin13}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {GPIO::PortD, GPIO::Pin14}), + initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel1}, {GPIO::PortH, GPIO::Pin6}), + initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel2}, {GPIO::PortH, GPIO::Pin9}), + //initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel2}, {GPIO::PortE, GPIO::Pin11}), + //initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel1}, {GPIO::PortE, GPIO::Pin9}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); + + +constexpr io_timers_t spix_sync_timers[MAX_SPIX_SYNC_TIMERS] = { + initIOTimer(Timer::Timer1), +}; + +constexpr timer_io_channels_t spix_sync_channels[MAX_SPIX_SYNC_TIMERS] = { + initIOTimerChannel(spix_sync_timers, {Timer::Timer1, Timer::Channel1}, {GPIO::PortE, GPIO::Pin9}), +}; diff --git a/boards/ark/fpv/src/usb.c b/boards/ark/fpv/src/usb.c new file mode 100644 index 000000000000..1c64e94ba104 --- /dev/null +++ b/boards/ark/fpv/src/usb.c @@ -0,0 +1,105 @@ +/**************************************************************************** + * + * Copyright (C) 2016 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file usb.c + * + * Board-specific USB functions. + */ + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include + +#include +#include +#include +#include + +#include +#include + +#include "arm_internal.h" +#include +#include +#include +#include "board_config.h" + +/************************************************************************************ + * Definitions + ************************************************************************************/ + +/************************************************************************************ + * Private Functions + ************************************************************************************/ + +/************************************************************************************ + * Public Functions + ************************************************************************************/ + +/************************************************************************************ + * Name: stm32_usbinitialize + * + * Description: + * Called to setup USB-related GPIO pins for the ARKFMU board. + * + ************************************************************************************/ + +__EXPORT void stm32_usbinitialize(void) +{ + /* The OTG FS has an internal soft pull-up */ + + /* Configure the OTG FS VBUS sensing GPIO, Power On, and Overcurrent GPIOs */ + +#ifdef CONFIG_STM32H7_OTGFS + stm32_configgpio(GPIO_OTGFS_VBUS); +#endif +} + +/************************************************************************************ + * Name: stm32_usbsuspend + * + * Description: + * Board logic must provide the stm32_usbsuspend logic if the USBDEV driver is + * used. This function is called whenever the USB enters or leaves suspend mode. + * This is an opportunity for the board logic to shutdown clocks, power, etc. + * while the USB is suspended. + * + ************************************************************************************/ + +__EXPORT void stm32_usbsuspend(FAR struct usbdev_s *dev, bool resume) +{ + uinfo("resume: %d\n", resume); +} From ea2237be1f2ece3d981412d88fe31d3f49045ce4 Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Fri, 18 Oct 2024 18:36:39 -0600 Subject: [PATCH 2/8] All 9 PWM outputs with DMA. Change HRT to timer 3 channel 1 to avoid conflict with PWM timer 8 --- boards/ark/fpv/src/board_config.h | 6 +++--- boards/ark/fpv/src/timer_config.cpp | 28 +++++++++++++--------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/boards/ark/fpv/src/board_config.h b/boards/ark/fpv/src/board_config.h index f24f14ad7a06..04900069c2b3 100644 --- a/boards/ark/fpv/src/board_config.h +++ b/boards/ark/fpv/src/board_config.h @@ -211,7 +211,7 @@ /* PWM */ -#define DIRECT_PWM_OUTPUT_CHANNELS 8 +#define DIRECT_PWM_OUTPUT_CHANNELS 9 #define GPIO_FMU_CH1 /* PI0 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTI|GPIO_PIN0) #define GPIO_FMU_CH2 /* PH12 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTH|GPIO_PIN12) @@ -249,8 +249,8 @@ #define FLASH_BASED_PARAMS /* High-resolution timer */ -#define HRT_TIMER 8 /* use timer8 for the HRT */ -#define HRT_TIMER_CHANNEL 3 /* use capture/compare channel 3 */ +#define HRT_TIMER 3 /* use timer3 for the HRT */ +#define HRT_TIMER_CHANNEL 1 /* use capture/compare channel 1 */ /* RC Serial port */ diff --git a/boards/ark/fpv/src/timer_config.cpp b/boards/ark/fpv/src/timer_config.cpp index bee77b999337..623aad1f0601 100644 --- a/boards/ark/fpv/src/timer_config.cpp +++ b/boards/ark/fpv/src/timer_config.cpp @@ -40,26 +40,25 @@ * TIM5_CH2 T FMU_CH3 * TIM5_CH1 T FMU_CH4 * - * TIM4_CH2 T FMU_CH5 - * TIM4_CH3 T FMU_CH6 + * TIM8_CH1 T FMU_CH5 + * TIM8_CH2 T FMU_CH6 + * TIM8_CH3 T FMU_CH7 + * TIM8_CH4 T FMU_CH8 * - * TIM12_CH1 T FMU_CH7 - * TIM12_CH2 T FMU_CH8 + * TIM4_CH1 T FMU_CH9 * - * TIM1_CH3 T SPI2_DRDY2_ISM330_INT2 < Capture or GPIO INT * TIM1_CH1 T SPIX_SYNC > Pulse or GPIO strobe * * TIM2_CH3 T HEATER > PWM OUT or GPIO * - * TIM14_CH1 T BUZZER_1 - Driven by other driver + * TIM3_CH1 T HRT_TIMER + * */ constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { initIOTimer(Timer::Timer5, DMA{DMA::Index1}), + initIOTimer(Timer::Timer8, DMA{DMA::Index1}), initIOTimer(Timer::Timer4, DMA{DMA::Index1}), - initIOTimer(Timer::Timer12), - //initIOTimer(Timer::Timer1), - //initIOTimer(Timer::Timer2), }; constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { @@ -67,12 +66,11 @@ constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {GPIO::PortH, GPIO::Pin12}), initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel2}, {GPIO::PortH, GPIO::Pin11}), initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {GPIO::PortH, GPIO::Pin10}), - initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel2}, {GPIO::PortD, GPIO::Pin13}), - initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {GPIO::PortD, GPIO::Pin14}), - initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel1}, {GPIO::PortH, GPIO::Pin6}), - initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel2}, {GPIO::PortH, GPIO::Pin9}), - //initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel2}, {GPIO::PortE, GPIO::Pin11}), - //initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel1}, {GPIO::PortE, GPIO::Pin9}), + initIOTimerChannel(io_timers, {Timer::Timer8, Timer::Channel1}, {GPIO::PortI, GPIO::Pin5}), + initIOTimerChannel(io_timers, {Timer::Timer8, Timer::Channel2}, {GPIO::PortI, GPIO::Pin6}), + initIOTimerChannel(io_timers, {Timer::Timer8, Timer::Channel3}, {GPIO::PortI, GPIO::Pin7}), + initIOTimerChannel(io_timers, {Timer::Timer8, Timer::Channel4}, {GPIO::PortI, GPIO::Pin2}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel1}, {GPIO::PortD, GPIO::Pin12}), }; constexpr io_timers_channel_mapping_t io_timers_channel_mapping = From 460adde4c533b59c6f800c2ecf2fa2cb37c1daa0 Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Fri, 18 Oct 2024 18:43:58 -0600 Subject: [PATCH 3/8] Disable CAN2 --- boards/ark/fpv/src/can.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/boards/ark/fpv/src/can.c b/boards/ark/fpv/src/can.c index cdebe7a3ad61..a586a648142d 100644 --- a/boards/ark/fpv/src/can.c +++ b/boards/ark/fpv/src/can.c @@ -49,9 +49,7 @@ uint16_t board_get_can_interfaces(void) { uint16_t enabled_interfaces = 0x3; - if (!PX4_MFT_HW_SUPPORTED(PX4_MFT_CAN2)) { - enabled_interfaces &= ~(1 << 1); - } + enabled_interfaces &= ~(1 << 1); return enabled_interfaces; } From 969c15b8c43cb17d89ddbd3330f1f0ea7ff591bd Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Mon, 21 Oct 2024 11:17:13 -0600 Subject: [PATCH 4/8] make format --- boards/ark/fpv/src/board_config.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/boards/ark/fpv/src/board_config.h b/boards/ark/fpv/src/board_config.h index 04900069c2b3..fceb1264e0be 100644 --- a/boards/ark/fpv/src/board_config.h +++ b/boards/ark/fpv/src/board_config.h @@ -164,9 +164,9 @@ #define ADC_CHANNELS \ ((1 << ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL) | \ (1 << ADC_SCALED_V5_CHANNEL)) | \ - (1 << ADC_SCALED_12V_CHANNEL) | \ - (1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ - (1 << ADC_BATTERY_CURRENT_CHANNEL) + (1 << ADC_SCALED_12V_CHANNEL) | \ + (1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL) /* HW has to large of R termination on ADC todo:change when HW value is chosen */ From 37fd1ea778bacb64be429472ec3efd89b3a0bdaf Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Mon, 21 Oct 2024 17:17:20 -0600 Subject: [PATCH 5/8] Add payload power ADC measurement --- boards/ark/fpv/init/rc.board_defaults | 2 ++ boards/ark/fpv/src/board_config.h | 21 ++++++++++++------- msg/SystemPower.msg | 2 ++ .../px4_platform_common/board_common.h | 7 +++++++ src/drivers/adc/board_adc/ADC.cpp | 16 ++++++++++++++ 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/boards/ark/fpv/init/rc.board_defaults b/boards/ark/fpv/init/rc.board_defaults index da8444bbc0c7..9998d562d1e3 100644 --- a/boards/ark/fpv/init/rc.board_defaults +++ b/boards/ark/fpv/init/rc.board_defaults @@ -24,3 +24,5 @@ if ver hwtypecmp ARKFPV000 then param set-default SENS_TEMP_ID 3014666 fi + +param set-default BAT1_V_DIV 21.0 diff --git a/boards/ark/fpv/src/board_config.h b/boards/ark/fpv/src/board_config.h index fceb1264e0be..cb37323c4770 100644 --- a/boards/ark/fpv/src/board_config.h +++ b/boards/ark/fpv/src/board_config.h @@ -156,17 +156,22 @@ #define ADC_BATTERY_VOLTAGE_CHANNEL /* PB0 */ ADC1_CH(9) #define ADC_BATTERY_CURRENT_CHANNEL /* PC2 */ ADC3_CH(0) #define ADC_SCALED_12V_CHANNEL /* PA4 */ ADC1_CH(18) -#define ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL /* PA0 */ ADC1_CH(16) +#define ADC_SCALED_VDD_3V3_SENSORS_CHANNEL /* PA0 */ ADC1_CH(16) #define ADC_SCALED_V5_CHANNEL /* PB1 */ ADC1_CH(5) #define ADC_HW_VER_SENSE_CHANNEL /* PH3 */ ADC3_CH(14) #define ADC_HW_REV_SENSE_CHANNEL /* PH4 */ ADC3_CH(15) #define ADC_CHANNELS \ - ((1 << ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL) | \ - (1 << ADC_SCALED_V5_CHANNEL)) | \ - (1 << ADC_SCALED_12V_CHANNEL) | \ - (1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ - (1 << ADC_BATTERY_CURRENT_CHANNEL) + ((1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL) | \ + (1 << ADC_SCALED_VDD_3V3_SENSORS_CHANNEL) | \ + (1 << ADC_SCALED_V5_CHANNEL) | \ + (1 << ADC_SCALED_12V_CHANNEL)) + + +#define BOARD_BATTERY1_V_DIV (21.0f) // (20k + 1k) / 1k = 21 + +#define ADC_SCALED_PAYLOAD_SENSE ADC_SCALED_12V_CHANNEL /* HW has to large of R termination on ADC todo:change when HW value is chosen */ @@ -235,6 +240,8 @@ #define GPIO_VDD_3V3_SD_CARD_EN /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) +#define BOARD_NUMBER_BRICKS 1 + /* Define True logic Power Control in arch agnostic form */ #define VDD_3V3_SD_CARD_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SD_CARD_EN, (on_true)) @@ -287,7 +294,7 @@ #define BOARD_ADC_SERVO_VALID (1) #define BOARD_ADC_BRICK_VALID (px4_arch_gpioread(GPIO_VDD_5V_PGOOD)) -#define BOARD_ADC_12V_RAIL_VALID (px4_arch_gpioread(GPIO_VDD_12V_PGOOD)) +#define BOARD_GPIO_PAYOLOAD_V_VALID (px4_arch_gpioread(GPIO_VDD_12V_PGOOD)) /* This board provides a DMA pool and APIs */ #define BOARD_DMA_ALLOC_POOL_SIZE 5120 diff --git a/msg/SystemPower.msg b/msg/SystemPower.msg index 21b35ba1dc43..05754dab0ee1 100644 --- a/msg/SystemPower.msg +++ b/msg/SystemPower.msg @@ -1,5 +1,6 @@ uint64 timestamp # time since system start (microseconds) float32 voltage5v_v # peripheral 5V rail voltage +float32 voltage_payload_v # payload rail voltage float32[4] sensors3v3 # Sensors 3V3 rail voltage uint8 sensors3v3_valid # Sensors 3V3 rail voltage was read (bitfield). uint8 usb_connected # USB is connected when 1 @@ -10,6 +11,7 @@ uint8 periph_5v_oc # peripheral overcurrent when 1 uint8 hipower_5v_oc # high power peripheral overcurrent when 1 uint8 comp_5v_valid # 5V to companion valid uint8 can1_gps1_5v_valid # 5V for CAN1/GPS1 valid +uint8 payload_v_valid # payload rail voltage is valid uint8 BRICK1_VALID_SHIFTS=0 uint8 BRICK1_VALID_MASK=1 diff --git a/platforms/common/include/px4_platform_common/board_common.h b/platforms/common/include/px4_platform_common/board_common.h index 4dff12c1b24f..763b09994ce8 100644 --- a/platforms/common/include/px4_platform_common/board_common.h +++ b/platforms/common/include/px4_platform_common/board_common.h @@ -106,6 +106,13 @@ #define ADC_V5_SCALE (2.0f) // The scale factor defined by HW's resistive divider (Rt+Rb)/ Rb #endif +#if !defined(ADC_PAYLOAD_V_FULL_SCALE) +#define ADC_PAYLOAD_V_FULL_SCALE (25.3f) // Payload volt Rail full scale voltage +#endif +#if !defined(ADC_PAYLOAD_SCALE) +#define ADC_PAYLOAD_SCALE (7.667f) // The scale factor defined by HW's resistive divider (Rt+Rb)/ Rb +#endif + #if !defined(ADC_3V3_V_FULL_SCALE) #define ADC_3V3_V_FULL_SCALE (3.6f) // 3.3V volt Rail full scale voltage #endif diff --git a/src/drivers/adc/board_adc/ADC.cpp b/src/drivers/adc/board_adc/ADC.cpp index 906af6995945..7bf553f9b418 100644 --- a/src/drivers/adc/board_adc/ADC.cpp +++ b/src/drivers/adc/board_adc/ADC.cpp @@ -204,6 +204,9 @@ void ADC::update_system_power(hrt_abstime now) # if defined(ADC_SCALED_V5_SENSE) && defined(ADC_SCALED_V3V3_SENSORS_SENSE) cnt += ADC_SCALED_V3V3_SENSORS_COUNT; # endif +# if defined(ADC_SCALED_PAYLOAD_SENSE) + cnt++; +# endif for (unsigned i = 0; i < _channel_count; i++) { # if defined(ADC_SCALED_V5_SENSE) @@ -234,6 +237,16 @@ void ADC::update_system_power(hrt_abstime now) } # endif +# if defined(ADC_SCALED_PAYLOAD_SENSE) + + if (_samples[i].am_channel == ADC_SCALED_PAYLOAD_SENSE) { + system_power.voltage_payload_v = _samples[i].am_data * ((ADC_PAYLOAD_V_FULL_SCALE / 3.3f) * + (px4_arch_adc_reference_v() / + px4_arch_adc_dn_fullcount())); + cnt--; + } + +# endif if (cnt == 0) { break; @@ -285,6 +298,9 @@ void ADC::update_system_power(hrt_abstime now) #ifdef BOARD_GPIO_VDD_5V_CAN1_GPS1_VALID system_power.can1_gps1_5v_valid = read_gpio_value(_5v_can1_gps1_valid_fd); #endif +#ifdef BOARD_GPIO_PAYOLOAD_V_VALID + system_power.payload_v_valid = BOARD_GPIO_PAYOLOAD_V_VALID; +#endif system_power.timestamp = hrt_absolute_time(); _to_system_power.publish(system_power); From d04903cae523ea29082c73a7e812b62360fe74ff Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Tue, 22 Oct 2024 11:51:27 -0600 Subject: [PATCH 6/8] DMA --- boards/ark/fpv/default.px4board | 5 ++- boards/ark/fpv/init/rc.board_defaults | 3 ++ boards/ark/fpv/nuttx-config/include/board.h | 9 ++-- .../fpv/nuttx-config/include/board_dma_map.h | 41 ++++++++++--------- boards/ark/fpv/nuttx-config/nsh/defconfig | 26 +++++++++--- 5 files changed, 54 insertions(+), 30 deletions(-) diff --git a/boards/ark/fpv/default.px4board b/boards/ark/fpv/default.px4board index df724712dbd6..6155148d2a4b 100644 --- a/boards/ark/fpv/default.px4board +++ b/boards/ark/fpv/default.px4board @@ -1,10 +1,11 @@ CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" CONFIG_BOARD_ARCHITECTURE="cortex-m7" CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" -CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS5" -CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS1" CONFIG_BOARD_SERIAL_TEL4="/dev/ttyS2" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" CONFIG_BOARD_SERIAL_RC="/dev/ttyS4" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS5" CONFIG_DRIVERS_ADC_BOARD_ADC=y CONFIG_DRIVERS_BAROMETER_BMP388=y CONFIG_DRIVERS_CDCACM_AUTOSTART=y diff --git a/boards/ark/fpv/init/rc.board_defaults b/boards/ark/fpv/init/rc.board_defaults index 9998d562d1e3..50a497b742b8 100644 --- a/boards/ark/fpv/init/rc.board_defaults +++ b/boards/ark/fpv/init/rc.board_defaults @@ -26,3 +26,6 @@ then fi param set-default BAT1_V_DIV 21.0 + +param set-default RC_CRSF_PRT_CFG 300 +param set-default RC_SBUS_PRT_CFG 0 diff --git a/boards/ark/fpv/nuttx-config/include/board.h b/boards/ark/fpv/nuttx-config/include/board.h index c6c67e38b98f..62ce5a8f5ef1 100644 --- a/boards/ark/fpv/nuttx-config/include/board.h +++ b/boards/ark/fpv/nuttx-config/include/board.h @@ -363,8 +363,11 @@ /* Alternate function pin selections ************************************************/ -#define GPIO_USART1_RX GPIO_USART1_RX_3 /* PB7 */ -#define GPIO_USART1_TX GPIO_USART1_TX_3 /* PB6 */ +#define GPIO_USART1_RX GPIO_USART1_RX_3 /* PB7 */ +#define GPIO_USART1_TX GPIO_USART1_TX_3 /* PB6 */ + +#define GPIO_USART2_RX GPIO_USART2_RX_1 /* PA3 */ +#define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ #define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ #define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ @@ -375,7 +378,7 @@ #define GPIO_UART5_RX GPIO_UART5_RX_3 /* PD2 */ #define GPIO_UART5_TX GPIO_UART5_TX_3 /* PC12 */ // GPIO_UART5_RTS No remap /* PC8 */ -#define GPIO_UART5_CTS (GPIO_ALT|GPIO_AF8|GPIO_PORTC|GPIO_PIN9|GPIO_PULLDOWN) /* PC9 */ +//#define GPIO_UART5_CTS (GPIO_ALT|GPIO_AF8|GPIO_PORTC|GPIO_PIN9|GPIO_PULLDOWN) /* PC9 */ #define GPIO_USART6_RX GPIO_USART6_RX_1 /* PC7 */ #define GPIO_USART6_TX GPIO_USART6_TX_1 /* PC6 */ diff --git a/boards/ark/fpv/nuttx-config/include/board_dma_map.h b/boards/ark/fpv/nuttx-config/include/board_dma_map.h index 62e278597243..38d2df588817 100644 --- a/boards/ark/fpv/nuttx-config/include/board_dma_map.h +++ b/boards/ark/fpv/nuttx-config/include/board_dma_map.h @@ -36,23 +36,23 @@ // DMAMUX1 Using at most 8 Channels on DMA1 -------- Assigned // V -#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* 1 DMA1:37 ICM-20649 */ -#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* 2 DMA1:38 ICM-20649 */ +#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* 1 DMA1:37 IIM-42653 */ +#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* 2 DMA1:38 IIM-42653 */ -#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* 3 DMA1:39 ICM-42688-P */ -#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* 4 DMA1:40 ICM-42688-P */ +//#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* 3 DMA1:39 ICM-42688-P */ +//#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* 4 DMA1:40 ICM-42688-P */ -//#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* DMA1:41 GPS1 */ -//#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* DMA1:42 GPS1 */ +#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* DMA1:41 GPS1 */ +#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* DMA1:42 GPS1 */ -//#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_0 /* DMA1:45 DEBUG */ -//#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_0 /* DMA1:46 DEBUG */ +#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_0 /* DMA1:45 DEBUG */ +#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_0 /* DMA1:46 DEBUG */ -//#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* DMA1:63 EXT2 */ -//#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* DMA1:64 EXT2 */ +#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* DMA1:63 UART4 */ +#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* DMA1:64 UART4 */ -#define DMAMAP_USART6_RX DMAMAP_DMA12_USART6RX_0 /* 5 DMA1:71 PX4IO */ -#define DMAMAP_USART6_TX DMAMAP_DMA12_USART6TX_0 /* 6 DMA1:72 PX4IO */ +#define DMAMAP_USART6_RX DMAMAP_DMA12_USART6RX_0 /* 5 DMA1:71 RC */ +#define DMAMAP_USART6_TX DMAMAP_DMA12_USART6TX_0 /* 6 DMA1:72 RC */ // Assigned in timer_config.cpp @@ -62,17 +62,20 @@ // DMAMUX2 Using at most 8 Channels on DMA2 -------- Assigned // V -#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_1 /* 1 DMA2:61 BMI088 */ -#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_1 /* 2 DMA2:62 BMI088 */ +#define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_1 /* 3 DMA2:43 TELEM3 */ +#define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_1 /* 4 DMA2:44 TELEM3 */ -#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* 3 DMA2:45 DEBUG */ -#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* 4 DMA2:46 DEBUG */ +//#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* 3 DMA2:45 DEBUG */ +//#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* 4 DMA2:46 DEBUG */ + +//#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_1 /* 1 DMA2:61 BMI088 */ +//#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_1 /* 2 DMA2:62 BMI088 */ #define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_1 /* 5 DMA2:65 TELEM2 */ -#define DMAMAP_UART5_TX DMAMAP_DMA12_UART5TX_1 /* 6 DMA2:66 TELEM2 */ +#define DMAMAP_UART5_TX DMAMAP_DMA12_UART5TX_1 /* 6 DMA2:66 TELEM2 */ -#define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_1 /* 7 DMA1:79 TELEM1 */ -#define DMAMAP_UART7_TX DMAMAP_DMA12_UART7TX_1 /* 8 DMA1:80 TELEM1 */ +#define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_1 /* 7 DMA1:79 TELEM1 */ +#define DMAMAP_UART7_TX DMAMAP_DMA12_UART7TX_1 /* 8 DMA1:80 TELEM1 */ // DMAMUX2 Using at most 8 Channels on BDMA -------- Assigned // V diff --git a/boards/ark/fpv/nuttx-config/nsh/defconfig b/boards/ark/fpv/nuttx-config/nsh/defconfig index 82633920ecd2..c808011aa34b 100644 --- a/boards/ark/fpv/nuttx-config/nsh/defconfig +++ b/boards/ark/fpv/nuttx-config/nsh/defconfig @@ -213,14 +213,18 @@ CONFIG_STM32H7_SPI1_DMA_BUFFER=1024 CONFIG_STM32H7_SPI6=y CONFIG_STM32H7_SPI6_DMA=y CONFIG_STM32H7_SPI6_DMA_BUFFER=1024 -CONFIG_STM32H7_TIM12=y CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM2=y +CONFIG_STM32H7_TIM3=y CONFIG_STM32H7_TIM4=y CONFIG_STM32H7_TIM5=y +CONFIG_STM32H7_TIM8=y +CONFIG_STM32H7_TIM12=y CONFIG_STM32H7_UART4=y CONFIG_STM32H7_UART5=y CONFIG_STM32H7_UART7=y CONFIG_STM32H7_USART1=y +CONFIG_STM32H7_USART2=y CONFIG_STM32H7_USART3=y CONFIG_STM32H7_USART6=y CONFIG_STM32H7_USART_BREAKS=y @@ -231,12 +235,13 @@ CONFIG_SYSTEM_CDCACM=y CONFIG_SYSTEM_NSH=y CONFIG_TASK_NAME_SIZE=24 CONFIG_UART4_BAUD=57600 +CONFIG_UART4_RXDMA=y +CONFIG_UART4_TXDMA=y CONFIG_UART4_RXBUFSIZE=600 CONFIG_UART4_TXBUFSIZE=1500 -CONFIG_UART5_IFLOWCONTROL=y -CONFIG_UART5_OFLOWCONTROL=y CONFIG_UART5_RXDMA=y -CONFIG_UART5_TXBUFSIZE=10000 +CONFIG_UART5_RXBUFSIZE=600 +CONFIG_UART5_TXBUFSIZE=3000 CONFIG_UART5_TXDMA=y CONFIG_UART7_BAUD=57600 CONFIG_UART7_IFLOWCONTROL=y @@ -246,15 +251,24 @@ CONFIG_UART7_RXDMA=y CONFIG_UART7_TXBUFSIZE=3000 CONFIG_UART7_TXDMA=y CONFIG_USART1_BAUD=57600 +CONFIG_USART1_RXDMA=y +CONFIG_USART1_TXDMA=y CONFIG_USART1_RXBUFSIZE=600 CONFIG_USART1_TXBUFSIZE=1500 +CONFIG_USART2_BAUD=57600 +CONFIG_USART2_RXDMA=y +CONFIG_USART2_TXDMA=y +CONFIG_USART2_RXBUFSIZE=600 +CONFIG_USART2_TXBUFSIZE=1500 CONFIG_USART3_BAUD=57600 CONFIG_USART3_RXBUFSIZE=180 -CONFIG_USART3_RXDMA=y CONFIG_USART3_SERIAL_CONSOLE=y CONFIG_USART3_TXBUFSIZE=1500 -CONFIG_USART3_TXDMA=y CONFIG_USART6_BAUD=57600 +CONFIG_USART6_RXDMA=y +CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_TXDMA=y +CONFIG_USART6_TXBUFSIZE=1500 CONFIG_USART6_RXBUFSIZE=600 CONFIG_USART6_TXBUFSIZE=1500 CONFIG_USBDEV=y From 51262e1e9c585aa3d44093d8b34190321b6801c8 Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Tue, 22 Oct 2024 13:38:09 -0600 Subject: [PATCH 7/8] Lower clock to 320MHz --- boards/ark/fpv/init/rc.board_defaults | 2 ++ boards/ark/fpv/nuttx-config/include/board.h | 22 ++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/boards/ark/fpv/init/rc.board_defaults b/boards/ark/fpv/init/rc.board_defaults index 50a497b742b8..58f9f4bc3673 100644 --- a/boards/ark/fpv/init/rc.board_defaults +++ b/boards/ark/fpv/init/rc.board_defaults @@ -29,3 +29,5 @@ param set-default BAT1_V_DIV 21.0 param set-default RC_CRSF_PRT_CFG 300 param set-default RC_SBUS_PRT_CFG 0 + +param set-default IMU_GYRO_DNF_EN 3 diff --git a/boards/ark/fpv/nuttx-config/include/board.h b/boards/ark/fpv/nuttx-config/include/board.h index 62ce5a8f5ef1..bfa2887b6600 100644 --- a/boards/ark/fpv/nuttx-config/include/board.h +++ b/boards/ark/fpv/nuttx-config/include/board.h @@ -99,11 +99,11 @@ /* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR * - * PLL1_VCO = (16,000,000 / 1) * 60 = 960 MHz + * PLL1_VCO = (16,000,000 / 1) * 40 = 640 MHz * - * PLL1P = PLL1_VCO/2 = 960 MHz / 2 = 480 MHz - * PLL1Q = PLL1_VCO/4 = 960 MHz / 4 = 240 MHz - * PLL1R = PLL1_VCO/8 = 960 MHz / 8 = 120 MHz + * PLL1P = PLL1_VCO/2 = 640 MHz / 2 = 320 MHz + * PLL1Q = PLL1_VCO/4 = 640 MHz / 4 = 160 MHz + * PLL1R = PLL1_VCO/8 = 640 MHz / 8 = 80 MHz */ #define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ @@ -112,12 +112,12 @@ RCC_PLLCFGR_DIVQ1EN | \ RCC_PLLCFGR_DIVR1EN) #define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(1) -#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(60) +#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(40) #define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) #define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(4) #define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) -#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 60) +#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 40) #define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) #define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 4) #define STM32_PLL1R_FREQUENCY (STM32_VCO1_FREQUENCY / 8) @@ -167,7 +167,7 @@ /* Configure Clock Assignments */ /* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) - * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 + * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 160 */ #define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ @@ -175,22 +175,22 @@ #define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ #define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ -/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ +/* APB1 clock (PCLK1) is HCLK/2 (80 MHz) */ #define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ #define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) -/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ +/* APB2 clock (PCLK2) is HCLK/2 (80 MHz) */ #define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ #define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) -/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ +/* APB3 clock (PCLK3) is HCLK/2 (80 MHz) */ #define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ #define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) -/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ +/* APB4 clock (PCLK4) is HCLK/4 (80 MHz) */ #define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ #define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) From 55dffb7d836b553118b852ddc53ba3a17c2d1310 Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Tue, 22 Oct 2024 18:39:08 -0600 Subject: [PATCH 8/8] Fix serial devices --- boards/ark/fpv/default.px4board | 8 ++++---- boards/ark/fpv/extras/ark_fpv_bootloader.bin | Bin 0 -> 46260 bytes .../fpv/nuttx-config/include/board_dma_map.h | 8 ++++---- boards/ark/fpv/nuttx-config/nsh/defconfig | 9 ++++++--- 4 files changed, 14 insertions(+), 11 deletions(-) create mode 100755 boards/ark/fpv/extras/ark_fpv_bootloader.bin diff --git a/boards/ark/fpv/default.px4board b/boards/ark/fpv/default.px4board index 6155148d2a4b..af69fd3691c7 100644 --- a/boards/ark/fpv/default.px4board +++ b/boards/ark/fpv/default.px4board @@ -2,10 +2,10 @@ CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" CONFIG_BOARD_ARCHITECTURE="cortex-m7" CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS1" -CONFIG_BOARD_SERIAL_TEL4="/dev/ttyS2" -CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" -CONFIG_BOARD_SERIAL_RC="/dev/ttyS4" -CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS5" +CONFIG_BOARD_SERIAL_TEL4="/dev/ttyS3" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS4" +CONFIG_BOARD_SERIAL_RC="/dev/ttyS5" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS6" CONFIG_DRIVERS_ADC_BOARD_ADC=y CONFIG_DRIVERS_BAROMETER_BMP388=y CONFIG_DRIVERS_CDCACM_AUTOSTART=y diff --git a/boards/ark/fpv/extras/ark_fpv_bootloader.bin b/boards/ark/fpv/extras/ark_fpv_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..2fc089d40f9035bb1e8852bb72372de788dc347b GIT binary patch literal 46260 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

PsPNz9I266WK{?_=<%>eyafo|7sm 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 CB)6Xc literal 0 HcmV?d00001 diff --git a/boards/ark/fpv/nuttx-config/include/board_dma_map.h b/boards/ark/fpv/nuttx-config/include/board_dma_map.h index 38d2df588817..e077e864d37f 100644 --- a/boards/ark/fpv/nuttx-config/include/board_dma_map.h +++ b/boards/ark/fpv/nuttx-config/include/board_dma_map.h @@ -45,8 +45,8 @@ #define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* DMA1:41 GPS1 */ #define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* DMA1:42 GPS1 */ -#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_0 /* DMA1:45 DEBUG */ -#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_0 /* DMA1:46 DEBUG */ +//#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_0 /* DMA1:45 DEBUG */ +//#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_0 /* DMA1:46 DEBUG */ #define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* DMA1:63 UART4 */ #define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* DMA1:64 UART4 */ @@ -65,8 +65,8 @@ #define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_1 /* 3 DMA2:43 TELEM3 */ #define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_1 /* 4 DMA2:44 TELEM3 */ -//#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* 3 DMA2:45 DEBUG */ -//#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* 4 DMA2:46 DEBUG */ +#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* 3 DMA2:45 DEBUG */ +#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* 4 DMA2:46 DEBUG */ //#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_1 /* 1 DMA2:61 BMI088 */ //#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_1 /* 2 DMA2:62 BMI088 */ diff --git a/boards/ark/fpv/nuttx-config/nsh/defconfig b/boards/ark/fpv/nuttx-config/nsh/defconfig index c808011aa34b..a4b0fdd238a1 100644 --- a/boards/ark/fpv/nuttx-config/nsh/defconfig +++ b/boards/ark/fpv/nuttx-config/nsh/defconfig @@ -161,7 +161,7 @@ CONFIG_READLINE_TABCOMPLETION=y CONFIG_RTC_DATETIME=y CONFIG_SCHED_HPWORK=y CONFIG_SCHED_HPWORKPRIORITY=249 -CONFIG_SCHED_HPWORKSTACKSIZE=3000 +CONFIG_SCHED_HPWORKSTACKSIZE=1280 CONFIG_SCHED_INSTRUMENTATION=y CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y CONFIG_SCHED_INSTRUMENTATION_SWITCH=y @@ -239,9 +239,11 @@ CONFIG_UART4_RXDMA=y CONFIG_UART4_TXDMA=y CONFIG_UART4_RXBUFSIZE=600 CONFIG_UART4_TXBUFSIZE=1500 +CONFIG_UART5_IFLOWCONTROL=y +CONFIG_UART5_OFLOWCONTROL=y CONFIG_UART5_RXDMA=y CONFIG_UART5_RXBUFSIZE=600 -CONFIG_UART5_TXBUFSIZE=3000 +CONFIG_UART5_TXBUFSIZE=10000 CONFIG_UART5_TXDMA=y CONFIG_UART7_BAUD=57600 CONFIG_UART7_IFLOWCONTROL=y @@ -262,12 +264,13 @@ CONFIG_USART2_RXBUFSIZE=600 CONFIG_USART2_TXBUFSIZE=1500 CONFIG_USART3_BAUD=57600 CONFIG_USART3_RXBUFSIZE=180 +CONFIG_USART3_RXDMA=y CONFIG_USART3_SERIAL_CONSOLE=y CONFIG_USART3_TXBUFSIZE=1500 +CONFIG_USART3_TXDMA=y CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXDMA=y CONFIG_USART6_RXBUFSIZE=600 -CONFIG_USART6_TXDMA=y CONFIG_USART6_TXBUFSIZE=1500 CONFIG_USART6_RXBUFSIZE=600 CONFIG_USART6_TXBUFSIZE=1500