From 93b388992287dd74481a1a50ad67b7fe223a9345 Mon Sep 17 00:00:00 2001 From: Vincello <58676585+holydust@users.noreply.github.com> Date: Sun, 27 Apr 2025 10:49:03 +0800 Subject: [PATCH] adding files --- boards/corvon/743v1/bootloader.px4board | 3 + boards/corvon/743v1/default.px4board | 85 ++++ .../743v1/extras/corvon_743v1_bootloader.bin | Bin 0 -> 41044 bytes boards/corvon/743v1/firmware.prototype | 13 + boards/corvon/743v1/init/rc.board_defaults | 24 + boards/corvon/743v1/init/rc.board_extras | 7 + boards/corvon/743v1/init/rc.board_sensors | 18 + .../743v1/nuttx-config/bootloader/defconfig | 85 ++++ .../corvon/743v1/nuttx-config/include/board.h | 426 ++++++++++++++++++ .../nuttx-config/include/board_dma_map.h | 36 ++ .../corvon/743v1/nuttx-config/nsh/defconfig | 245 ++++++++++ .../nuttx-config/scripts/bootloader_script.ld | 213 +++++++++ .../743v1/nuttx-config/scripts/script.ld | 228 ++++++++++ boards/corvon/743v1/src/CMakeLists.txt | 68 +++ boards/corvon/743v1/src/board_config.h | 197 ++++++++ boards/corvon/743v1/src/bootloader_main.c | 75 +++ boards/corvon/743v1/src/hw_config.h | 135 ++++++ boards/corvon/743v1/src/i2c.cpp | 39 ++ boards/corvon/743v1/src/init.c | 208 +++++++++ boards/corvon/743v1/src/led.c | 114 +++++ boards/corvon/743v1/src/sdio.c | 177 ++++++++ boards/corvon/743v1/src/spi.cpp | 47 ++ boards/corvon/743v1/src/timer_config.cpp | 56 +++ boards/corvon/743v1/src/usb.c | 78 ++++ 24 files changed, 2577 insertions(+) create mode 100644 boards/corvon/743v1/bootloader.px4board create mode 100644 boards/corvon/743v1/default.px4board create mode 100644 boards/corvon/743v1/extras/corvon_743v1_bootloader.bin create mode 100644 boards/corvon/743v1/firmware.prototype create mode 100644 boards/corvon/743v1/init/rc.board_defaults create mode 100644 boards/corvon/743v1/init/rc.board_extras create mode 100644 boards/corvon/743v1/init/rc.board_sensors create mode 100644 boards/corvon/743v1/nuttx-config/bootloader/defconfig create mode 100644 boards/corvon/743v1/nuttx-config/include/board.h create mode 100644 boards/corvon/743v1/nuttx-config/include/board_dma_map.h create mode 100644 boards/corvon/743v1/nuttx-config/nsh/defconfig create mode 100644 boards/corvon/743v1/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/corvon/743v1/nuttx-config/scripts/script.ld create mode 100644 boards/corvon/743v1/src/CMakeLists.txt create mode 100644 boards/corvon/743v1/src/board_config.h create mode 100644 boards/corvon/743v1/src/bootloader_main.c create mode 100644 boards/corvon/743v1/src/hw_config.h create mode 100644 boards/corvon/743v1/src/i2c.cpp create mode 100644 boards/corvon/743v1/src/init.c create mode 100644 boards/corvon/743v1/src/led.c create mode 100644 boards/corvon/743v1/src/sdio.c create mode 100644 boards/corvon/743v1/src/spi.cpp create mode 100644 boards/corvon/743v1/src/timer_config.cpp create mode 100644 boards/corvon/743v1/src/usb.c diff --git a/boards/corvon/743v1/bootloader.px4board b/boards/corvon/743v1/bootloader.px4board new file mode 100644 index 000000000000..19b6e662be69 --- /dev/null +++ b/boards/corvon/743v1/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/corvon/743v1/default.px4board b/boards/corvon/743v1/default.px4board new file mode 100644 index 000000000000..149bcaff215c --- /dev/null +++ b/boards/corvon/743v1/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_CDCACM_AUTOSTART=y +CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y +CONFIG_DRIVERS_DIFFERENTIAL_PRESSURE_ASP5033=y +CONFIG_DRIVERS_DIFFERENTIAL_PRESSURE_AUAV=y +CONFIG_DRIVERS_DIFFERENTIAL_PRESSURE_ETS=y +CONFIG_DRIVERS_DIFFERENTIAL_PRESSURE_MS4515=y +CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_IMU_BOSCH_BMI088=y +CONFIG_DRIVERS_IMU_BOSCH_BMI270=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_COMMON_TELEMETRY=y +CONFIG_DRIVERS_UAVCAN=y +CONFIG_BOARD_UAVCAN_INTERFACES=1 +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_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_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/corvon/743v1/extras/corvon_743v1_bootloader.bin b/boards/corvon/743v1/extras/corvon_743v1_bootloader.bin new file mode 100644 index 0000000000000000000000000000000000000000..a9209278330a4ab0132e5db7161ac06841e6dce4 GIT binary patch literal 41044 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 nx`^K^pqU> + * + * 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_CORVON743V1_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_CORVON743V1_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 CORVON743V1 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 */ + + +/* CAN + * + * CAN1 is routed to transceiver. + */ + +#define GPIO_CAN1_RX GPIO_CAN1_RX_2 /* PB8 */ +#define GPIO_CAN1_TX GPIO_CAN1_TX_2 /* PB9 */ + +/* SPI + * + + */ + +#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) + +//#define GPIO_SPI1_MISO GPIO_SPI1_MISO_1 /* PA6 */ +//#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_1 /* PA7 */ +//#define GPIO_SPI1_SCK ADJ_SLEW_RATE(GPIO_SPI1_SCK_1) /* PA5 */ + +#define GPIO_SPI2_MISO GPIO_SPI2_MISO_2 /* PC2 */ +#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_3 /* PC3 */ +#define GPIO_SPI2_SCK ADJ_SLEW_RATE(GPIO_SPI2_SCK_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_CORVON743V1_INCLUDE_BOARD_H */ diff --git a/boards/corvon/743v1/nuttx-config/include/board_dma_map.h b/boards/corvon/743v1/nuttx-config/include/board_dma_map.h new file mode 100644 index 000000000000..ba3f15eb9701 --- /dev/null +++ b/boards/corvon/743v1/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/corvon/743v1/nuttx-config/nsh/defconfig b/boards/corvon/743v1/nuttx-config/nsh/defconfig new file mode 100644 index 000000000000..1a9a906e6c95 --- /dev/null +++ b/boards/corvon/743v1/nuttx-config/nsh/defconfig @@ -0,0 +1,245 @@ +# +# 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/corvon/743v1/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_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x0036 +CONFIG_CDCACM_PRODUCTSTR="CORVON743v1" +CONFIG_CDCACM_RXBUFSIZE=6000 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x1B8C +CONFIG_CDCACM_VENDORSTR="CORVON" +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/corvon/743v1/nuttx-config/scripts/bootloader_script.ld b/boards/corvon/743v1/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 000000000000..fb877cc443f0 --- /dev/null +++ b/boards/corvon/743v1/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 Switch 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/corvon/743v1/nuttx-config/scripts/script.ld b/boards/corvon/743v1/nuttx-config/scripts/script.ld new file mode 100644 index 000000000000..1dc1a0ef97eb --- /dev/null +++ b/boards/corvon/743v1/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/corvon/743v1/src/CMakeLists.txt b/boards/corvon/743v1/src/CMakeLists.txt new file mode 100644 index 000000000000..c47215375d08 --- /dev/null +++ b/boards/corvon/743v1/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/corvon/743v1/src/board_config.h b/boards/corvon/743v1/src/board_config.h new file mode 100644 index 000000000000..48ff3ff203ee --- /dev/null +++ b/boards/corvon/743v1/src/board_config.h @@ -0,0 +1,197 @@ +/**************************************************************************** + * + * 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 10 +#define DIRECT_INPUT_TIMER_CHANNELS 10 + +#define BOARD_HAS_PWM DIRECT_PWM_OUTPUT_CHANNELS + + +/* 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_CAN1_TX, \ + GPIO_CAN1_RX, \ + } + +#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/corvon/743v1/src/bootloader_main.c b/boards/corvon/743v1/src/bootloader_main.c new file mode 100644 index 000000000000..5670308a29d8 --- /dev/null +++ b/boards/corvon/743v1/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/corvon/743v1/src/hw_config.h b/boards/corvon/743v1/src/hw_config.h new file mode 100644 index 000000000000..6e63d9b9a73f --- /dev/null +++ b/boards/corvon/743v1/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 1188 +#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/corvon/743v1/src/i2c.cpp b/boards/corvon/743v1/src/i2c.cpp new file mode 100644 index 000000000000..1444ea117204 --- /dev/null +++ b/boards/corvon/743v1/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/corvon/743v1/src/init.c b/boards/corvon/743v1/src/init.c new file mode 100644 index 000000000000..c0e1f9776c35 --- /dev/null +++ b/boards/corvon/743v1/src/init.c @@ -0,0 +1,208 @@ +/**************************************************************************** + * + * 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))); + } + + /* + * On resets invoked from system (not boot) ensure we establish a low + * output state on PWM pins to disarm the ESC and prevent the reset from potentially + * spinning up the motors. + */ + if (status >= 0) { + up_mdelay(100); + } +} + +/************************************************************************************ + * Name: stm32_boardinitialize + * + * Description: + * All STM32 architectures must provide the following entry point. This entry point + * is called early in the initialization -- after all memory has been configured + * and mapped but before any devices have been initialized. + * + ************************************************************************************/ +__EXPORT void stm32_boardinitialize(void) +{ + /* 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/corvon/743v1/src/led.c b/boards/corvon/743v1/src/led.c new file mode 100644 index 000000000000..d7794392dbb3 --- /dev/null +++ b/boards/corvon/743v1/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/corvon/743v1/src/sdio.c b/boards/corvon/743v1/src/sdio.c new file mode 100644 index 000000000000..869d757756a0 --- /dev/null +++ b/boards/corvon/743v1/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/corvon/743v1/src/spi.cpp b/boards/corvon/743v1/src/spi.cpp new file mode 100644 index 000000000000..2e0916973eab --- /dev/null +++ b/boards/corvon/743v1/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}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortD, GPIO::Pin4}), + initSPIDevice(DRV_IMU_DEVTYPE_BMI270, SPI::CS{GPIO::PortA, GPIO::Pin15}), + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/corvon/743v1/src/timer_config.cpp b/boards/corvon/743v1/src/timer_config.cpp new file mode 100644 index 000000000000..515a56928cad --- /dev/null +++ b/boards/corvon/743v1/src/timer_config.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * 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}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel4}, {GPIO::PortD, GPIO::Pin15}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/corvon/743v1/src/usb.c b/boards/corvon/743v1/src/usb.c new file mode 100644 index 000000000000..9591784866a6 --- /dev/null +++ b/boards/corvon/743v1/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); +}