From 2ce390a780e2426c38ffb208827dce12831cd645 Mon Sep 17 00:00:00 2001 From: Hubert <1701213518@sz.pku.edu.cn> Date: Sat, 16 Nov 2024 04:30:09 +0800 Subject: [PATCH] boards: new micoair h743-aio board Co-authored-by: Minderring <1701213518@sz.edu.pku.cn> --- .ci/Jenkinsfile-compile | 1 + .vscode/cmake-variants.yaml | 10 + Makefile | 1 + boards/micoair/h743-aio/bootloader.px4board | 3 + boards/micoair/h743-aio/default.px4board | 85 ++++ .../extras/micoair_h743-aio_bootloader.bin | Bin 0 -> 41024 bytes boards/micoair/h743-aio/firmware.prototype | 13 + .../micoair/h743-aio/init/rc.board_defaults | 24 + boards/micoair/h743-aio/init/rc.board_extras | 7 + boards/micoair/h743-aio/init/rc.board_sensors | 16 + .../nuttx-config/bootloader/defconfig | 85 ++++ .../h743-aio/nuttx-config/include/board.h | 415 ++++++++++++++++++ .../nuttx-config/include/board_dma_map.h | 36 ++ .../h743-aio/nuttx-config/nsh/defconfig | 244 ++++++++++ .../nuttx-config/scripts/bootloader_script.ld | 213 +++++++++ .../h743-aio/nuttx-config/scripts/script.ld | 228 ++++++++++ boards/micoair/h743-aio/src/CMakeLists.txt | 68 +++ boards/micoair/h743-aio/src/board_config.h | 199 +++++++++ boards/micoair/h743-aio/src/bootloader_main.c | 75 ++++ boards/micoair/h743-aio/src/hw_config.h | 135 ++++++ boards/micoair/h743-aio/src/i2c.cpp | 39 ++ boards/micoair/h743-aio/src/init.c | 203 +++++++++ boards/micoair/h743-aio/src/led.c | 114 +++++ boards/micoair/h743-aio/src/sdio.c | 177 ++++++++ boards/micoair/h743-aio/src/spi.cpp | 47 ++ boards/micoair/h743-aio/src/timer_config.cpp | 55 +++ boards/micoair/h743-aio/src/usb.c | 78 ++++ 27 files changed, 2571 insertions(+) create mode 100644 boards/micoair/h743-aio/bootloader.px4board create mode 100644 boards/micoair/h743-aio/default.px4board create mode 100755 boards/micoair/h743-aio/extras/micoair_h743-aio_bootloader.bin create mode 100644 boards/micoair/h743-aio/firmware.prototype create mode 100644 boards/micoair/h743-aio/init/rc.board_defaults create mode 100644 boards/micoair/h743-aio/init/rc.board_extras create mode 100644 boards/micoair/h743-aio/init/rc.board_sensors create mode 100644 boards/micoair/h743-aio/nuttx-config/bootloader/defconfig create mode 100644 boards/micoair/h743-aio/nuttx-config/include/board.h create mode 100644 boards/micoair/h743-aio/nuttx-config/include/board_dma_map.h create mode 100644 boards/micoair/h743-aio/nuttx-config/nsh/defconfig create mode 100644 boards/micoair/h743-aio/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/micoair/h743-aio/nuttx-config/scripts/script.ld create mode 100644 boards/micoair/h743-aio/src/CMakeLists.txt create mode 100644 boards/micoair/h743-aio/src/board_config.h create mode 100644 boards/micoair/h743-aio/src/bootloader_main.c create mode 100644 boards/micoair/h743-aio/src/hw_config.h create mode 100644 boards/micoair/h743-aio/src/i2c.cpp create mode 100644 boards/micoair/h743-aio/src/init.c create mode 100644 boards/micoair/h743-aio/src/led.c create mode 100644 boards/micoair/h743-aio/src/sdio.c create mode 100644 boards/micoair/h743-aio/src/spi.cpp create mode 100644 boards/micoair/h743-aio/src/timer_config.cpp create mode 100644 boards/micoair/h743-aio/src/usb.c diff --git a/.ci/Jenkinsfile-compile b/.ci/Jenkinsfile-compile index 2c03621155..9a096301cd 100644 --- a/.ci/Jenkinsfile-compile +++ b/.ci/Jenkinsfile-compile @@ -81,6 +81,7 @@ pipeline { "matek_h743-slim_default", "matek_h743_default", "micoair_h743_default", + "micoair_h743-aio_default", "modalai_fc-v1_default", "modalai_fc-v2_default", "mro_ctrl-zero-classic_default", diff --git a/.vscode/cmake-variants.yaml b/.vscode/cmake-variants.yaml index bf42ea74f4..9a0dc7a14b 100644 --- a/.vscode/cmake-variants.yaml +++ b/.vscode/cmake-variants.yaml @@ -306,6 +306,16 @@ CONFIG: buildType: MinSizeRel settings: CONFIG: micoair_h743_default + micoair_h743-aio_bootloader: + short: micoair_h743-aio_bootloader + buildType: MinSizeRel + settings: + CONFIG: micoair_h743-aio_bootloader + micoair_h743-aio_default: + short: micoair_h743-aio + buildType: MinSizeRel + settings: + CONFIG: micoair_h743-aio_default modalai_fc-v1_default: short: modalai_fc-v1 buildType: MinSizeRel diff --git a/Makefile b/Makefile index fa055bf13d..77867de871 100644 --- a/Makefile +++ b/Makefile @@ -343,6 +343,7 @@ bootloaders_update: \ matek_h743-mini_bootloader \ matek_h743-slim_bootloader \ micoair_h743_bootloader \ + micoair_h743-aio_bootloader \ modalai_fc-v2_bootloader \ mro_ctrl-zero-classic_bootloader \ mro_ctrl-zero-h7_bootloader \ diff --git a/boards/micoair/h743-aio/bootloader.px4board b/boards/micoair/h743-aio/bootloader.px4board new file mode 100644 index 0000000000..19b6e662be --- /dev/null +++ b/boards/micoair/h743-aio/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/micoair/h743-aio/default.px4board b/boards/micoair/h743-aio/default.px4board new file mode 100644 index 0000000000..e84ef5b818 --- /dev/null +++ b/boards/micoair/h743-aio/default.px4board @@ -0,0 +1,85 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_SERIAL_URT6="/dev/ttyS5" +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS2" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS1" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS3" +CONFIG_BOARD_SERIAL_TEL4="/dev/ttyS6" +CONFIG_BOARD_SERIAL_RC="/dev/ttyS4" +CONFIG_DRIVERS_ADC_BOARD_ADC=y +CONFIG_DRIVERS_BAROMETER_DPS310=y +CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_IMU_BOSCH_BMI088=y +CONFIG_DRIVERS_IMU_BOSCH_BMI270=y +CONFIG_COMMON_INS=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_DRIVERS_PPS_CAPTURE=y +CONFIG_DRIVERS_PWM_OUT=y +CONFIG_COMMON_RC=y +CONFIG_DRIVERS_RC_INPUT=y +CONFIG_DRIVERS_TAP_ESC=y +CONFIG_DRIVERS_TONE_ALARM=y +CONFIG_DRIVERS_UAVCAN=y +CONFIG_BOARD_UAVCAN_INTERFACES=1 +CONFIG_COMMON_TELEMETRY=y +CONFIG_MODULES_ATTITUDE_ESTIMATOR_Q=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_FW_ATT_CONTROL=y +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_FW_POS_CONTROL=y +CONFIG_MODULES_FW_RATE_CONTROL=y +CONFIG_MODULES_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_LOCAL_POSITION_ESTIMATOR=y +CONFIG_MODULES_LOGGER=y +CONFIG_MODULES_MAG_BIAS_ESTIMATOR=y +CONFIG_MODULES_MANUAL_CONTROL=y +CONFIG_MODULES_MAVLINK=y +CONFIG_MODULES_MC_ATT_CONTROL=y +CONFIG_MODULES_MC_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_MC_HOVER_THRUST_ESTIMATOR=y +CONFIG_MODULES_MC_POS_CONTROL=y +CONFIG_MODULES_MC_RATE_CONTROL=y +CONFIG_MODULES_NAVIGATOR=y +CONFIG_MODULES_PAYLOAD_DELIVERER=y +CONFIG_MODULES_RC_UPDATE=y +CONFIG_MODULES_ROVER_POS_CONTROL=y +CONFIG_MODULES_SENSORS=y +CONFIG_MODULES_TEMPERATURE_COMPENSATION=y +CONFIG_MODULES_UXRCE_DDS_CLIENT=y +CONFIG_MODULES_VTOL_ATT_CONTROL=y +CONFIG_SYSTEMCMDS_ACTUATOR_TEST=y +CONFIG_SYSTEMCMDS_DMESG=y +CONFIG_SYSTEMCMDS_DUMPFILE=y +CONFIG_SYSTEMCMDS_FAILURE=y +CONFIG_SYSTEMCMDS_GPIO=y +CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y +CONFIG_SYSTEMCMDS_I2CDETECT=y +CONFIG_SYSTEMCMDS_NSHTERM=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y +CONFIG_SYSTEMCMDS_SD_STRESS=y +CONFIG_SYSTEMCMDS_SERIAL_PASSTHRU=y +CONFIG_SYSTEMCMDS_SERIAL_TEST=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_TUNE_CONTROL=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_USB_CONNECTED=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/micoair/h743-aio/extras/micoair_h743-aio_bootloader.bin b/boards/micoair/h743-aio/extras/micoair_h743-aio_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..362848ab8018ed036f62c28c1c6323ba077d69fe GIT binary patch literal 41024 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 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ +#ifndef __NUTTX_CONFIG_MICOAIR743AIO_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_MICOAIR743AIO_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 MicoAir743 board provides the following clock sources: + * + * X1: 8 MHz crystal for HSE + * + * So we have these clock source available within the STM32 + * + * HSI: 64 MHz RC factory-trimmed + * HSE: 8 MHz crystal for HSE + */ + +#define STM32_BOARD_XTAL 8000000ul + +#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 = 8,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 = (8,000,000 / 1) * 120 = 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(120) +#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) * 120) +#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(2) +#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 / 2) * 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(2) +#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 / 2) * 48) +#define STM32_PLL3P_FREQUENCY (STM32_VCO3_FREQUENCY / 2) +#define STM32_PLL3Q_FREQUENCY (STM32_VCO3_FREQUENCY / 4) +#define STM32_PLL3R_FREQUENCY (STM32_VCO3_FREQUENCY / 2) + +/* SYSCLK = PLL1P = 480MHz + * CPUCLK = SYSCLK / 1 = 480 MHz + */ + +#define STM32_RCC_D1CFGR_D1CPRE (RCC_D1CFGR_D1CPRE_SYSCLK) +#define STM32_SYSCLK_FREQUENCY (STM32_PLL1P_FREQUENCY) +#define STM32_CPUCLK_FREQUENCY (STM32_SYSCLK_FREQUENCY / 1) + +/* Configure Clock Assignments */ + +/* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) + * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 + */ + +#define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ +#define STM32_ACLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* ACLK in D1, HCLK3 in D1 */ +#define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ +#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ + +/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ +#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ +#define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ +#define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ + +#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ +#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* Timer clock frequencies */ + +/* Timers driven from APB1 will be twice PCLK1 */ + +#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) + +/* Timers driven from APB2 will be twice PCLK2 */ + +#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) + +/* Kernel Clock Configuration + * + * Note: look at Table 54 in ST Manual + */ + +/* I2C123 clock source */ + +#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI + +/* I2C4 clock source */ + +#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI + +/* SPI123 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 + +/* SPI45 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 + +/* SPI6 clock source */ + +#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 + +/* USB 1 and 2 clock source */ + +#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 + +/* ADC 1 2 3 clock source */ + +#define STM32_RCC_D3CCIPR_ADCSEL RCC_D3CCIPR_ADCSEL_PLL2 + +/* FDCAN 1 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 480kHz, freq = PLL1Q/(2*div) div = PLL1Q/(2*freq) */ + +#define STM32_SDMMC_INIT_CLKDIV (300 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) + +/* 20 MHz Max for now - more reliable on some boards than 25 MHz + * 20 MHz = PLL1Q/(2*div), div = PLL1Q/(2*freq), div = 6 = 240 / 40 + */ + +#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) +# define STM32_SDMMC_MMCXFR_CLKDIV (6 << 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 (6 << 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 board has two, LED_GREEN a Green LED and LED_BLUE a Blue 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_2 /* PA10 */ +#define GPIO_USART1_TX GPIO_USART1_TX_2 /* PA9 */ + +#define GPIO_USART2_RX GPIO_USART2_RX_1 /* PA3 */ +#define GPIO_USART2_TX GPIO_USART2_TX_1 /* PA2 */ + +#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_2 /* PA1 */ +#define GPIO_UART4_TX GPIO_UART4_TX_2 /* PA0 */ + +#define GPIO_USART6_RX GPIO_USART6_RX_1 /* PC7 */ +#define GPIO_USART6_TX GPIO_USART6_TX_1 /* PC6 */ + +#define GPIO_UART7_RX GPIO_UART7_RX_3 /* PE7 */ +#define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ + + +#define GPIO_UART8_RX GPIO_UART8_RX_1 /* PE0 */ +#define GPIO_UART8_TX GPIO_UART8_TX_1 /* PE1 */ + + +/* SPI + * + + */ + +#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) + + +#define GPIO_SPI2_MISO GPIO_SPI2_MISO_2 /* PC2 */ +#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_3 /* PC3 */ +#define GPIO_SPI2_SCK ADJ_SLEW_RATE(GPIO_SPI2_SCK_5) /* PD3 */ + + + +/* I2C + * + + * + */ + +#define GPIO_I2C1_SCL GPIO_I2C1_SCL_1 /* PB6 */ +#define GPIO_I2C1_SDA GPIO_I2C1_SDA_1 /* PB7 */ + +#define GPIO_I2C1_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN6) +#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN7) + +#define GPIO_I2C2_SCL GPIO_I2C2_SCL_1 /* PB10 */ +#define GPIO_I2C2_SDA GPIO_I2C2_SDA_1 /* PB11 */ + +#define GPIO_I2C2_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN10) +#define GPIO_I2C2_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN11) + +# define PROBE_INIT(mask) +# define PROBE(n,s) +# define PROBE_MARK(n) + +#endif /*__NUTTX_CONFIG_MICOAIR743AIO_INCLUDE_BOARD_H */ diff --git a/boards/micoair/h743-aio/nuttx-config/include/board_dma_map.h b/boards/micoair/h743-aio/nuttx-config/include/board_dma_map.h new file mode 100644 index 0000000000..ba3f15eb97 --- /dev/null +++ b/boards/micoair/h743-aio/nuttx-config/include/board_dma_map.h @@ -0,0 +1,36 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once +#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* DMA1:39 */ +#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* DMA1:40 */ diff --git a/boards/micoair/h743-aio/nuttx-config/nsh/defconfig b/boards/micoair/h743-aio/nuttx-config/nsh/defconfig new file mode 100644 index 0000000000..494e2dcf14 --- /dev/null +++ b/boards/micoair/h743-aio/nuttx-config/nsh/defconfig @@ -0,0 +1,244 @@ +# +# 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_ENVIRON is not set +# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set +# CONFIG_DISABLE_PTHREAD is not set +# CONFIG_MMCSD_HAVE_CARDDETECT is not set +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_MMCSD_SPI is not set +# CONFIG_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_CAT is not set +# CONFIG_NSH_DISABLE_CD is not set +# CONFIG_NSH_DISABLE_CP is not set +# CONFIG_NSH_DISABLE_DATE is not set +# CONFIG_NSH_DISABLE_DF is not set +# CONFIG_NSH_DISABLE_ECHO is not set +# CONFIG_NSH_DISABLE_ENV is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_EXIT is not set +# CONFIG_NSH_DISABLE_EXPORT is not set +# CONFIG_NSH_DISABLE_FREE is not set +# CONFIG_NSH_DISABLE_GET is not set +# CONFIG_NSH_DISABLE_HELP is not set +# CONFIG_NSH_DISABLE_ITEF is not set +# CONFIG_NSH_DISABLE_KILL is not set +# CONFIG_NSH_DISABLE_LOOPS is not set +# CONFIG_NSH_DISABLE_LS is not set +# CONFIG_NSH_DISABLE_MKDIR is not set +# CONFIG_NSH_DISABLE_MKFATFS is not set +# CONFIG_NSH_DISABLE_MOUNT is not set +# CONFIG_NSH_DISABLE_MV is not set +# CONFIG_NSH_DISABLE_PRINTF is not set +# CONFIG_NSH_DISABLE_PS is not set +# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set +# CONFIG_NSH_DISABLE_PWD is not set +# CONFIG_NSH_DISABLE_RM is not set +# CONFIG_NSH_DISABLE_RMDIR is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_SET is not set +# CONFIG_NSH_DISABLE_SLEEP is not set +# CONFIG_NSH_DISABLE_SOURCE is not set +# CONFIG_NSH_DISABLE_TEST is not set +# CONFIG_NSH_DISABLE_TIME is not set +# CONFIG_NSH_DISABLE_UMOUNT is not set +# CONFIG_NSH_DISABLE_UNSET is not set +# CONFIG_NSH_DISABLE_USLEEP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/micoair/h743-aio/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743VI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DTCM=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_CRASHDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_CDCACM=y +CONFIG_CDCACM_PRODUCTID=0x0036 +CONFIG_CDCACM_PRODUCTSTR="MicoAir743AIO" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x1B8C +CONFIG_CDCACM_VENDORSTR="MicoAir" +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_MEMFAULT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEFAULT_SMALL=y +CONFIG_DEV_FIFO_SIZE=0 +CONFIG_DEV_PIPE_MAXSIZE=1024 +CONFIG_DEV_PIPE_SIZE=70 +CONFIG_EXPERIMENTAL=y +CONFIG_FAT_DMAMEMORY=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FAT_LFN_ALIAS_HASH=y +CONFIG_FDCLONE_STDIO=y +CONFIG_FS_BINFS=y +CONFIG_FS_CROMFS=y +CONFIG_FS_FAT=y +CONFIG_FS_FATTIME=y +CONFIG_FS_PROCFS=y +CONFIG_FS_PROCFS_INCLUDE_PROGMEM=y +CONFIG_FS_PROCFS_MAX_TASKS=64 +CONFIG_FS_PROCFS_REGISTER=y +CONFIG_FS_ROMFS=y +CONFIG_GRAN=y +CONFIG_GRAN_INTR=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_I2C=y +CONFIG_I2C_RESET=y +CONFIG_IDLETHREAD_STACKSIZE=750 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=3194 +CONFIG_IOB_NBUFFERS=24 +CONFIG_IOB_NCHAINS=24 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_MAX_EXITFUNS=1 +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y +CONFIG_MM_IOB=y +CONFIG_MM_REGIONS=4 +CONFIG_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_RAM_SIZE=245760 +CONFIG_RAM_START=0x20010000 +CONFIG_RAW_BINARY=y +CONFIG_RTC_DATETIME=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKPRIORITY=249 +CONFIG_SCHED_HPWORKSTACKSIZE=1280 +CONFIG_SCHED_INSTRUMENTATION=y +CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y +CONFIG_SCHED_INSTRUMENTATION_SWITCH=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_LPWORKPRIORITY=50 +CONFIG_SCHED_LPWORKSTACKSIZE=1632 +CONFIG_SCHED_WAITPID=y +CONFIG_SDMMC1_SDIO_PULLUP=y +CONFIG_SEM_PREALLOCHOLDERS=32 +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_I2C1=y +CONFIG_STM32H7_I2C2=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_RTC=y +CONFIG_STM32H7_RTC_HSECLOCK=y +CONFIG_STM32H7_RTC_MAGIC_REG=1 +CONFIG_STM32H7_SAVE_CRASHDUMP=y +CONFIG_STM32H7_SDMMC1=y +CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_SPI2=y +CONFIG_STM32H7_SPI2_DMA=y +CONFIG_STM32H7_SPI2_DMA_BUFFER=4096 +CONFIG_STM32H7_SPI_DMATHRESHOLD=8 +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM3=y +CONFIG_STM32H7_TIM4=y +CONFIG_STM32H7_TIM8=y +CONFIG_STM32H7_UART4=y +CONFIG_STM32H7_UART7=y +CONFIG_STM32H7_UART8=y +CONFIG_STM32H7_USART1=y +CONFIG_STM32H7_USART2=y +CONFIG_STM32H7_USART3=y +CONFIG_STM32H7_USART6=y +CONFIG_STM32H7_USART_BREAKS=y +CONFIG_STM32H7_USART_INVERT=y +CONFIG_STM32H7_USART_SINGLEWIRE=y +CONFIG_STM32H7_USART_SWAP=y +CONFIG_SYSTEM_CDCACM=y +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_UART4_BAUD=57600 +CONFIG_UART4_RXBUFSIZE=600 +CONFIG_UART4_TXBUFSIZE=1500 +CONFIG_UART7_BAUD=57600 +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_TXBUFSIZE=1500 +CONFIG_UART8_BAUD=57600 +CONFIG_UART8_RXBUFSIZE=600 +CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_USART1_BAUD=57600 +CONFIG_USART1_RXBUFSIZE=600 +CONFIG_USART1_TXBUFSIZE=1500 +CONFIG_USART2_BAUD=57600 +CONFIG_USART2_RXBUFSIZE=600 +CONFIG_USART2_TXBUFSIZE=1500 +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=600 +CONFIG_USART3_TXBUFSIZE=1500 +CONFIG_USART6_BAUD=57600 +CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 +CONFIG_WATCHDOG=y diff --git a/boards/micoair/h743-aio/nuttx-config/scripts/bootloader_script.ld b/boards/micoair/h743-aio/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 0000000000..511ef26242 --- /dev/null +++ b/boards/micoair/h743-aio/nuttx-config/scripts/bootloader_script.ld @@ -0,0 +1,213 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The Durandal-v1 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 Durandal has a Swtich on board, the BOOT0 pin is at ground so by default, + * the STM32 will boot to address 0x0800:0000 in FLASH unless the swiutch is + * drepresed, then the boot will be from 0x1FF0:0000 + * + * The STM32H743ZI 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 (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + flash (rx) : ORIGIN = 0x08000000, LENGTH = 2048K + 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/micoair/h743-aio/nuttx-config/scripts/script.ld b/boards/micoair/h743-aio/nuttx-config/scripts/script.ld new file mode 100644 index 0000000000..1dc1a0ef97 --- /dev/null +++ b/boards/micoair/h743-aio/nuttx-config/scripts/script.ld @@ -0,0 +1,228 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2020 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 board uses an STM32H743II and 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 + * + * There's a switch on board, the BOOT0 pin is at ground so by default, + * the STM32 will boot to address 0x0800:0000 in FLASH unless the switch is + * drepresed, then the boot will be from 0x1FF0:0000 + * + * The STM32H743ZI 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 + + 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) + +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/micoair/h743-aio/src/CMakeLists.txt b/boards/micoair/h743-aio/src/CMakeLists.txt new file mode 100644 index 0000000000..c47215375d --- /dev/null +++ b/boards/micoair/h743-aio/src/CMakeLists.txt @@ -0,0 +1,68 @@ +############################################################################ +# +# Copyright (c) 2021 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ +if("${PX4_BOARD_LABEL}" STREQUAL "bootloader") + add_library(drivers_board + bootloader_main.c + usb.c + ) + target_link_libraries(drivers_board + PRIVATE + nuttx_arch + nuttx_drivers + bootloader + ) + target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) + +else() + add_library(drivers_board + i2c.cpp + init.c + led.c + sdio.c + spi.cpp + timer_config.cpp + usb.c + ) + add_dependencies(drivers_board arch_board_hw_info) + + target_link_libraries(drivers_board + PRIVATE + arch_io_pins + arch_spi + arch_board_hw_info + drivers__led + nuttx_arch + nuttx_drivers + px4_layer + ) +endif() diff --git a/boards/micoair/h743-aio/src/board_config.h b/boards/micoair/h743-aio/src/board_config.h new file mode 100644 index 0000000000..9db51a7db7 --- /dev/null +++ b/boards/micoair/h743-aio/src/board_config.h @@ -0,0 +1,199 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file board_config.h + * + * Board internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include + +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +// #define FLASH_BASED_PARAMS + + +/* LEDs are driven with push open drain to support Anode to 5V or 3.3V */ + +# define GPIO_nLED_RED /* PE5 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN5) +# define GPIO_nLED_GREEN /* PE6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN6) +# define GPIO_nLED_BLUE /* PE4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN4) + +# define BOARD_HAS_CONTROL_STATUS_LEDS 1 +# define BOARD_OVERLOAD_LED LED_RED +# define BOARD_ARMED_STATE_LED LED_BLUE + + +/* + * 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 SYSTEM_ADC_BASE STM32_ADC1_BASE +#define ADC1_CH(n) (n) + +/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ +#define PX4_ADC_GPIO \ + /* PC0 */ GPIO_ADC123_INP10, \ + /* PC1 */ GPIO_ADC123_INP11 + + +/* Define Channel numbers must match above GPIO pin IN(n)*/ +#define ADC_BATTERY_VOLTAGE_CHANNEL /* PC0 */ ADC1_CH(10) +#define ADC_BATTERY_CURRENT_CHANNEL /* PC1 */ ADC1_CH(11) + + +#define ADC_CHANNELS \ + ((1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL)) + + +/* Define Battery 1 Voltage Divider and A per V + */ + +// #define BOARD_BATTERY1_V_DIV (11.0f) /* measured with the provided PM board */ +// #define BOARD_BATTERY1_A_PER_V (40.0f) +// #define BOARD_BATTERY2_V_DIV (11.0f) /* measured with the provided PM board */ + + +/* PWM + */ +#define DIRECT_PWM_OUTPUT_CHANNELS 9 +#define DIRECT_INPUT_TIMER_CHANNELS 9 + +#define BOARD_HAS_PWM DIRECT_PWM_OUTPUT_CHANNELS + + +#define GPIO_TONE_ALARM_IDLE /* PD15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN15) +#define GPIO_TONE_ALARM_GPIO /* PD15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN15) + +/* USB OTG FS + * + * PA8 OTG_FS_VBUS VBUS sensing + */ + +#define GPIO_OTGFS_VBUS /* PA8 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN8) + + +/* High-resolution timer */ +#define HRT_TIMER 2 /* use timer8 for the HRT */ +#define HRT_TIMER_CHANNEL 1 /* use capture/compare channel 3 */ + + +/* RC Serial port */ +#define RC_SERIAL_PORT "/dev/ttyS4" +#define BOARD_SUPPORTS_RC_SERIAL_PORT_OUTPUT + +/* SD Card */ +#define SDIO_SLOTNO 0 /* Only one slot */ +#define SDIO_MINOR 0 + +/* This board provides a DMA pool and APIs */ +#define BOARD_DMA_ALLOC_POOL_SIZE 5120 + +/* This board provides the board_on_reset interface */ +#define BOARD_HAS_ON_RESET 1 + +#define PX4_GPIO_INIT_LIST { \ + PX4_ADC_GPIO, \ + GPIO_TONE_ALARM_IDLE, \ + } + +#define BOARD_ENABLE_CONSOLE_BUFFER + +#define FLASH_BASED_PARAMS + +#define BOARD_NUM_IO_TIMERS 4 + + +__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 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/micoair/h743-aio/src/bootloader_main.c b/boards/micoair/h743-aio/src/bootloader_main.c new file mode 100644 index 0000000000..5670308a29 --- /dev/null +++ b/boards/micoair/h743-aio/src/bootloader_main.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file bootloader_main.c + * + * FMU-specific early startup code for bootloader +*/ + +#include "board_config.h" +#include "bl.h" + +#include +#include +#include +#include +#include +#include "arm_internal.h" +#include + +extern int sercon_main(int c, char **argv); + +__EXPORT void board_on_reset(int status) {} + +__EXPORT void stm32_boardinitialize(void) +{ + /* configure USB interfaces */ + stm32_usbinitialize(); +} + +__EXPORT int board_app_initialize(uintptr_t arg) +{ + return 0; +} + +void board_late_initialize(void) +{ + sercon_main(0, NULL); +} + +extern void sys_tick_handler(void); +void board_timerhook(void) +{ + sys_tick_handler(); +} diff --git a/boards/micoair/h743-aio/src/hw_config.h b/boards/micoair/h743-aio/src/hw_config.h new file mode 100644 index 0000000000..b02994a1ea --- /dev/null +++ b/boards/micoair/h743-aio/src/hw_config.h @@ -0,0 +1,135 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +/**************************************************************************** + * 10-8--2016: + * To simplify the ripple effect on the tools, we will be using + * /dev/serial/by-id/PX4 to locate PX4 devices. Therefore + * moving forward all Bootloaders must contain the prefix "PX4 BL " + * in the USBDEVICESTRING + * This Change will be made in an upcoming BL release + ****************************************************************************/ +/* + * Define usage to configure a bootloader + * + * + * Constant example Usage + * APP_LOAD_ADDRESS 0x08004000 - The address in Linker Script, where the app fw is org-ed + * BOOTLOADER_DELAY 5000 - Ms to wait while under USB pwr or bootloader request + * BOARD_FMUV2 + * INTERFACE_USB 1 - (Optional) Scan and use the USB interface for bootloading + * INTERFACE_USART 1 - (Optional) Scan and use the Serial interface for bootloading + * USBDEVICESTRING "PX4 BL FMU v2.x" - USB id string + * USBPRODUCTID 0x0011 - PID Should match defconfig + * BOOT_DELAY_ADDRESS 0x000001a0 - (Optional) From the linker script from Linker Script to get a custom + * delay provided by an APP FW + * BOARD_TYPE 9 - Must match .prototype boad_id + * _FLASH_KBYTES (*(uint16_t *)0x1fff7a22) - Run time flash size detection + * BOARD_FLASH_SECTORS ((_FLASH_KBYTES == 0x400) ? 11 : 23) - Run time determine the physical last sector + * BOARD_FLASH_SECTORS 11 - Hard coded zero based last sector + * BOARD_FLASH_SIZE (_FLASH_KBYTES*1024)- Total Flash size of device, determined at run time. + * (1024 * 1024) - Hard coded Total Flash of device - The bootloader and app reserved will be deducted + * programmatically + * + * BOARD_FIRST_FLASH_SECTOR_TO_ERASE 2 - Optional sectors index in the flash_sectors table (F4 only), to begin erasing. + * This is to allow sectors to be reserved for app fw usage. That will NOT be erased + * during a FW upgrade. + * The default is 0, and selects the first sector to be erased, as the 0th entry in the + * flash_sectors table. Which is the second physical sector of FLASH in the device. + * The first physical sector of FLASH is used by the bootloader, and is not defined + * in the table. + * + * APP_RESERVATION_SIZE (BOARD_FIRST_FLASH_SECTOR_TO_ERASE * 16 * 1024) - Number of bytes reserved by the APP FW. This number plus + * BOOTLOADER_RESERVATION_SIZE will be deducted from + * BOARD_FLASH_SIZE to determine the size of the App FW + * and hence the address space of FLASH to erase and program. + * USBMFGSTRING "PX4 AP" - Optional USB MFG string (default is '3D Robotics' if not defined.) + * SERIAL_BREAK_DETECT_DISABLED - Optional prevent break selection on Serial port from entering or staying in BL + * + * * Other defines are somewhat self explanatory. + */ + +/* Boot device selection list*/ +#define USB0_DEV 0x01 +#define SERIAL0_DEV 0x02 +#define SERIAL1_DEV 0x04 + +#define APP_LOAD_ADDRESS 0x08020000 +#define BOOTLOADER_DELAY 5000 +#define INTERFACE_USB 1 +#define INTERFACE_USB_CONFIG "/dev/ttyACM0" +#define BOARD_VBUS MK_GPIO_INPUT(GPIO_OTGFS_VBUS) + +//#define USE_VBUS_PULL_DOWN +#define INTERFACE_USART 1 +#define INTERFACE_USART_CONFIG "/dev/ttyS0,115200" +#define BOOT_DELAY_ADDRESS 0x000001a0 +#define BOARD_TYPE 1176 +#define BOARD_FLASH_SECTORS (14) +#define BOARD_FLASH_SIZE (16 * 128 * 1024) +#define APP_RESERVATION_SIZE (1 * 128 * 1024) + +#define OSC_FREQ 8 + +#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 + +#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 diff --git a/boards/micoair/h743-aio/src/i2c.cpp b/boards/micoair/h743-aio/src/i2c.cpp new file mode 100644 index 0000000000..1444ea1172 --- /dev/null +++ b/boards/micoair/h743-aio/src/i2c.cpp @@ -0,0 +1,39 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { + initI2CBusExternal(1), + initI2CBusInternal(2), +}; diff --git a/boards/micoair/h743-aio/src/init.c b/boards/micoair/h743-aio/src/init.c new file mode 100644 index 0000000000..43f86f902d --- /dev/null +++ b/boards/micoair/h743-aio/src/init.c @@ -0,0 +1,203 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file init.c + * + * FMU-specific early startup code. This file implements the + * board_app_initialize() function that is called early by nsh during startup. + * + * Code here is run before the rcS script is invoked; it should start required + * subsystems and perform board-specific initialisation. + */ + +#include "board_config.h" + +#include + +#include +#include +#include +#include +#include +#include "arm_internal.h" + +#include +#include +#include +#include +#include +#include +#include + +# if defined(FLASH_BASED_PARAMS) +# include +#endif + +__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) +{ + UNUSED(ms); +} + +/************************************************************************************ + * Name: board_on_reset + * + * Description: + * Optionally provided function called on entry to board_system_reset + * It should perform any house keeping prior to the rest. + * + * status - 1 if resetting to boot loader + * 0 if just resetting + * + ************************************************************************************/ +__EXPORT void board_on_reset(int status) +{ + for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { + px4_arch_configgpio(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) +{ + /* Reset PWM first thing */ + board_on_reset(-1); + + /* configure LEDs */ + board_autoled_initialize(); + + /* configure pins */ + const uint32_t gpio[] = PX4_GPIO_INIT_LIST; + px4_gpio_init(gpio, arraySize(gpio)); + + /* configure SPI interfaces */ + stm32_spiinitialize(); + + /* configure USB interfaces */ + stm32_usbinitialize(); + +} + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; + * + * 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) +{ + /* Need hrt running before using the ADC */ + px4_platform_init(); + + /* configure the DMA allocator */ + if (board_dma_alloc_init() < 0) { + syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); + } + + /* initial LED state */ + drv_led_start(); + led_off(LED_RED); + led_off(LED_BLUE); + + if (board_hardfault_init(2, true) != 0) { + led_on(LED_BLUE); + } + +#ifdef CONFIG_MMCSD + int ret = stm32_sdio_initialize(); + + if (ret != OK) { + led_on(LED_BLUE); + return ret; + } + +#endif + +// TODO:internal flash store parameters +#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_RED); + } + +#endif + + /* Configure the HW based on the manifest */ + px4_platform_configure(); + + return OK; +} diff --git a/boards/micoair/h743-aio/src/led.c b/boards/micoair/h743-aio/src/led.c new file mode 100644 index 0000000000..d7794392db --- /dev/null +++ b/boards/micoair/h743-aio/src/led.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file led.c + * + * LED backend. + */ + +#include + +#include + +#include "chip.h" +#include "stm32_gpio.h" +#include "board_config.h" + +#include +#include + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +extern void led_toggle(int led); +__END_DECLS + +# define xlat(p) (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 +}; + +__EXPORT void led_init(void) +{ + /* Configure LED GPIOs for output */ + 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))); +} diff --git a/boards/micoair/h743-aio/src/sdio.c b/boards/micoair/h743-aio/src/sdio.c new file mode 100644 index 0000000000..869d757756 --- /dev/null +++ b/boards/micoair/h743-aio/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/micoair/h743-aio/src/spi.cpp b/boards/micoair/h743-aio/src/spi.cpp new file mode 100644 index 0000000000..230b54bde7 --- /dev/null +++ b/boards/micoair/h743-aio/src/spi.cpp @@ -0,0 +1,47 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +#include + + +constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { + initSPIBus(SPI::Bus::SPI2, { + initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortD, GPIO::Pin5}, SPI::DRDY{GPIO::PortD, GPIO::Pin7}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortD, GPIO::Pin4}, SPI::DRDY{GPIO::PortB, GPIO::Pin14}), + initSPIDevice(DRV_IMU_DEVTYPE_BMI270, SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortE, GPIO::Pin2}), + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/micoair/h743-aio/src/timer_config.cpp b/boards/micoair/h743-aio/src/timer_config.cpp new file mode 100644 index 0000000000..b2bca6331f --- /dev/null +++ b/boards/micoair/h743-aio/src/timer_config.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer1, DMA{DMA::Index1}), + initIOTimer(Timer::Timer3, DMA{DMA::Index1}), + initIOTimer(Timer::Timer4, DMA{DMA::Index1}), +}; + +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel4}, {GPIO::PortE, GPIO::Pin14}), + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel3}, {GPIO::PortE, GPIO::Pin13}), + 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::Timer3, Timer::Channel4}, {GPIO::PortB, GPIO::Pin1}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel3}, {GPIO::PortB, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel1}, {GPIO::PortD, GPIO::Pin12}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel2}, {GPIO::PortD, GPIO::Pin13}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {GPIO::PortD, GPIO::Pin14}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/micoair/h743-aio/src/usb.c b/boards/micoair/h743-aio/src/usb.c new file mode 100644 index 0000000000..9591784866 --- /dev/null +++ b/boards/micoair/h743-aio/src/usb.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file usb.c + * + * Board-specific USB functions. + */ + +#include "board_config.h" +#include +#include +#include +#include + +/************************************************************************************ + * Name: stm32_usbinitialize + * + * Description: + * Called to setup USB-related GPIO pins for the 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); +}