From 2333fb2853f6e7b7c4d053fe102a42a8cbb1c398 Mon Sep 17 00:00:00 2001 From: accton-iot Date: Wed, 13 Aug 2025 23:28:37 +0800 Subject: [PATCH] boards: new accton-godwit_ga1 --- boards/accton-godwit/ga1/bootloader.px4board | 3 + boards/accton-godwit/ga1/default.px4board | 105 ++++ .../extras/accton-godwit_ga1_bootloader.bin | Bin 0 -> 46892 bytes .../ga1/extras/px4_io-v2_default.bin | Bin 0 -> 39796 bytes boards/accton-godwit/ga1/firmware.prototype | 13 + .../accton-godwit/ga1/init/rc.board_defaults | 21 + .../accton-godwit/ga1/init/rc.board_sensors | 92 +++ boards/accton-godwit/ga1/nuttx-config/Kconfig | 17 + .../ga1/nuttx-config/bootloader/defconfig | 95 +++ .../ga1/nuttx-config/include/board.h | 566 ++++++++++++++++++ .../ga1/nuttx-config/include/board_dma_map.h | 87 +++ .../ga1/nuttx-config/nsh/defconfig | 332 ++++++++++ .../nuttx-config/scripts/bootloader_script.ld | 215 +++++++ .../ga1/nuttx-config/scripts/script.ld | 229 +++++++ .../ga1/performance-test.px4board | 31 + boards/accton-godwit/ga1/src/CMakeLists.txt | 76 +++ boards/accton-godwit/ga1/src/board_config.h | 519 ++++++++++++++++ .../accton-godwit/ga1/src/bootloader_main.c | 62 ++ boards/accton-godwit/ga1/src/can.c | 142 +++++ boards/accton-godwit/ga1/src/hw_config.h | 128 ++++ boards/accton-godwit/ga1/src/i2c.cpp | 41 ++ boards/accton-godwit/ga1/src/init.cpp | 299 +++++++++ boards/accton-godwit/ga1/src/led.c | 235 ++++++++ boards/accton-godwit/ga1/src/mtd.cpp | 136 +++++ boards/accton-godwit/ga1/src/sdio.c | 177 ++++++ boards/accton-godwit/ga1/src/spi.cpp | 63 ++ boards/accton-godwit/ga1/src/timer_config.cpp | 80 +++ boards/accton-godwit/ga1/src/usb.c | 105 ++++ 28 files changed, 3869 insertions(+) create mode 100644 boards/accton-godwit/ga1/bootloader.px4board create mode 100644 boards/accton-godwit/ga1/default.px4board create mode 100755 boards/accton-godwit/ga1/extras/accton-godwit_ga1_bootloader.bin create mode 100755 boards/accton-godwit/ga1/extras/px4_io-v2_default.bin create mode 100644 boards/accton-godwit/ga1/firmware.prototype create mode 100644 boards/accton-godwit/ga1/init/rc.board_defaults create mode 100644 boards/accton-godwit/ga1/init/rc.board_sensors create mode 100644 boards/accton-godwit/ga1/nuttx-config/Kconfig create mode 100644 boards/accton-godwit/ga1/nuttx-config/bootloader/defconfig create mode 100644 boards/accton-godwit/ga1/nuttx-config/include/board.h create mode 100644 boards/accton-godwit/ga1/nuttx-config/include/board_dma_map.h create mode 100644 boards/accton-godwit/ga1/nuttx-config/nsh/defconfig create mode 100644 boards/accton-godwit/ga1/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/accton-godwit/ga1/nuttx-config/scripts/script.ld create mode 100644 boards/accton-godwit/ga1/performance-test.px4board create mode 100644 boards/accton-godwit/ga1/src/CMakeLists.txt create mode 100644 boards/accton-godwit/ga1/src/board_config.h create mode 100644 boards/accton-godwit/ga1/src/bootloader_main.c create mode 100644 boards/accton-godwit/ga1/src/can.c create mode 100644 boards/accton-godwit/ga1/src/hw_config.h create mode 100644 boards/accton-godwit/ga1/src/i2c.cpp create mode 100644 boards/accton-godwit/ga1/src/init.cpp create mode 100644 boards/accton-godwit/ga1/src/led.c create mode 100644 boards/accton-godwit/ga1/src/mtd.cpp create mode 100644 boards/accton-godwit/ga1/src/sdio.c create mode 100644 boards/accton-godwit/ga1/src/spi.cpp create mode 100644 boards/accton-godwit/ga1/src/timer_config.cpp create mode 100644 boards/accton-godwit/ga1/src/usb.c diff --git a/boards/accton-godwit/ga1/bootloader.px4board b/boards/accton-godwit/ga1/bootloader.px4board new file mode 100644 index 0000000000..19b6e662be --- /dev/null +++ b/boards/accton-godwit/ga1/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/accton-godwit/ga1/default.px4board b/boards/accton-godwit/ga1/default.px4board new file mode 100644 index 0000000000..c154100bbe --- /dev/null +++ b/boards/accton-godwit/ga1/default.px4board @@ -0,0 +1,105 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ETHERNET=y +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS7" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS6" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS4" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS1" +CONFIG_BOARD_SERIAL_EXT2="/dev/ttyS3" +CONFIG_DRIVERS_ADC_ADS1115=y +CONFIG_DRIVERS_ADC_BOARD_ADC=y +CONFIG_DRIVERS_BAROMETER_BMP388=y +CONFIG_DRIVERS_BAROMETER_INVENSENSE_ICP201XX=y +CONFIG_DRIVERS_BAROMETER_MS5611=y +CONFIG_DRIVERS_CAMERA_CAPTURE=y +CONFIG_DRIVERS_CAMERA_TRIGGER=y +CONFIG_DRIVERS_CDCACM_AUTOSTART=y +CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y +CONFIG_COMMON_DISTANCE_SENSOR=y +CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_GNSS_SEPTENTRIO=y +CONFIG_DRIVERS_GPIO_MCP23009=y +CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_HEATER=y +CONFIG_DRIVERS_IMU_BOSCH_BMI088=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM42688P=y +CONFIG_COMMON_LIGHT=y +CONFIG_DRIVERS_MAGNETOMETER_BOSCH_BMM150=y +CONFIG_DRIVERS_MAGNETOMETER_ISENTEK_IST8308=y +CONFIG_DRIVERS_MAGNETOMETER_ISENTEK_IST8310=y +CONFIG_DRIVERS_MAGNETOMETER_MEMSIC_MMC5983MA=y +CONFIG_DRIVERS_MAGNETOMETER_RM3100=y +CONFIG_DRIVERS_OSD_MSP_OSD=y +CONFIG_DRIVERS_POWER_MONITOR_INA226=y +CONFIG_DRIVERS_POWER_MONITOR_INA228=y +CONFIG_DRIVERS_POWER_MONITOR_INA238=y +CONFIG_DRIVERS_POWER_MONITOR_PM_SELECTOR_AUTERION=y +CONFIG_DRIVERS_PWM_OUT=y +CONFIG_DRIVERS_PX4IO=y +CONFIG_DRIVERS_RC_INPUT=y +CONFIG_DRIVERS_SAFETY_BUTTON=y +CONFIG_DRIVERS_TONE_ALARM=y +CONFIG_DRIVERS_UAVCAN=y +CONFIG_BOARD_UAVCAN_TIMER_OVERRIDE=2 +CONFIG_MODULES_AIRSPEED_SELECTOR=y +CONFIG_MODULES_BATTERY_STATUS=y +CONFIG_MODULES_CAMERA_FEEDBACK=y +CONFIG_MODULES_COMMANDER=y +CONFIG_MODULES_CONTROL_ALLOCATOR=y +CONFIG_MODULES_DATAMAN=y +CONFIG_MODULES_EKF2=y +CONFIG_MODULES_ESC_BATTERY=y +CONFIG_MODULES_EVENTS=y +CONFIG_MODULES_FLIGHT_MODE_MANAGER=y +CONFIG_MODULES_FW_ATT_CONTROL=y +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_FW_LATERAL_LONGITUDINAL_CONTROL=y +CONFIG_MODULES_FW_MODE_MANAGER=y +CONFIG_MODULES_FW_RATE_CONTROL=y +CONFIG_MODULES_GIMBAL=y +CONFIG_MODULES_GYRO_CALIBRATION=y +CONFIG_MODULES_HARDFAULT_STREAM=y +CONFIG_MODULES_LAND_DETECTOR=y +CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=y +CONFIG_MODULES_LOAD_MON=y +CONFIG_MODULES_LOGGER=y +CONFIG_MODULES_MAG_BIAS_ESTIMATOR=y +CONFIG_MODULES_MANUAL_CONTROL=y +CONFIG_MODULES_MAVLINK=y +CONFIG_MAVLINK_DIALECT="development" +CONFIG_MODULES_MC_ATT_CONTROL=y +CONFIG_MODULES_MC_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_MC_HOVER_THRUST_ESTIMATOR=y +CONFIG_MODULES_MC_POS_CONTROL=y +CONFIG_MODULES_MC_RATE_CONTROL=y +CONFIG_MODULES_NAVIGATOR=y +CONFIG_MODE_NAVIGATOR_VTOL_TAKEOFF=y +CONFIG_NUM_MISSION_ITMES_SUPPORTED=1000 +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_BSONDUMP=y +CONFIG_SYSTEMCMDS_DMESG=y +CONFIG_SYSTEMCMDS_GPIO=y +CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y +CONFIG_SYSTEMCMDS_I2C_LAUNCHER=y +CONFIG_SYSTEMCMDS_I2CDETECT=y +CONFIG_SYSTEMCMDS_LED_CONTROL=y +CONFIG_SYSTEMCMDS_MFT=y +CONFIG_SYSTEMCMDS_MTD=y +CONFIG_SYSTEMCMDS_NETMAN=y +CONFIG_SYSTEMCMDS_NSHTERM=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_TUNE_CONTROL=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/accton-godwit/ga1/extras/accton-godwit_ga1_bootloader.bin b/boards/accton-godwit/ga1/extras/accton-godwit_ga1_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..29ac390d99eb5c8642780fe95295497172bc3cd0 GIT binary patch literal 46892 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 Sa&%PCUmZ+cg&DVzzW)XmI8xjI literal 0 HcmV?d00001 diff --git a/boards/accton-godwit/ga1/extras/px4_io-v2_default.bin b/boards/accton-godwit/ga1/extras/px4_io-v2_default.bin new file mode 100755 index 0000000000000000000000000000000000000000..d84dbefd893e591cc98c8b00008019a1b66af57c GIT binary patch literal 39796 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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_ACCTON_GODWIT_GA1_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_ACCTON_GODWIT_GA1_INCLUDE_BOARD_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include "board_dma_map.h" + +#include + +#ifndef __ASSEMBLY__ +# include +#endif + +#include "stm32_rcc.h" +#include "stm32_sdmmc.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/* Clocking *************************************************************************/ +/* The px4_fmu-v6X board provides the following clock sources: + * + * X1: 16 MHz crystal for HSE + * + * So we have these clock source available within the STM32 + * + * HSI: 16 MHz RC factory-trimmed + * HSE: 16 MHz crystal for HSE + */ + +#define STM32_BOARD_XTAL 16000000ul + +#define STM32_HSI_FREQUENCY 16000000ul +#define STM32_LSI_FREQUENCY 32000 +#define STM32_HSE_FREQUENCY STM32_BOARD_XTAL +#define STM32_LSE_FREQUENCY 32768 + +/* Main PLL Configuration. + * + * PLL source is HSE = 16,000,000 + * + * PLL_VCOx = (STM32_HSE_FREQUENCY / PLLM) * PLLN + * Subject to: + * + * 1 <= PLLM <= 63 + * 4 <= PLLN <= 512 + * 150 MHz <= PLL_VCOL <= 420MHz + * 192 MHz <= PLL_VCOH <= 836MHz + * + * SYSCLK = PLL_VCO / PLLP + * CPUCLK = SYSCLK / D1CPRE + * Subject to + * + * PLLP1 = {2, 4, 6, 8, ..., 128} + * PLLP2,3 = {2, 3, 4, ..., 128} + * CPUCLK <= 480 MHz + */ + +#define STM32_BOARD_USEHSE + +#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE + +/* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR + * + * PLL1_VCO = (16,000,000 / 1) * 60 = 960 MHz + * + * PLL1P = PLL1_VCO/2 = 960 MHz / 2 = 480 MHz + * PLL1Q = PLL1_VCO/4 = 960 MHz / 4 = 240 MHz + * PLL1R = PLL1_VCO/8 = 960 MHz / 8 = 120 MHz + */ + +#define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL1RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP1EN | \ + RCC_PLLCFGR_DIVQ1EN | \ + RCC_PLLCFGR_DIVR1EN) +#define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(1) +#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(60) +#define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) +#define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(4) +#define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) + +#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 60) +#define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) +#define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 4) +#define STM32_PLL1R_FREQUENCY (STM32_VCO1_FREQUENCY / 8) + +/* PLL2 */ + +#define STM32_PLLCFG_PLL2CFG (RCC_PLLCFGR_PLL2VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL2RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP2EN | \ + RCC_PLLCFGR_DIVQ2EN | \ + RCC_PLLCFGR_DIVR2EN) +#define STM32_PLLCFG_PLL2M RCC_PLLCKSELR_DIVM2(4) +#define STM32_PLLCFG_PLL2N RCC_PLL2DIVR_N2(48) +#define STM32_PLLCFG_PLL2P RCC_PLL2DIVR_P2(2) +#define STM32_PLLCFG_PLL2Q RCC_PLL2DIVR_Q2(2) +#define STM32_PLLCFG_PLL2R RCC_PLL2DIVR_R2(2) + +#define STM32_VCO2_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) +#define STM32_PLL2P_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2Q_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2R_FREQUENCY (STM32_VCO2_FREQUENCY / 2) + +/* PLL3 */ + +#define STM32_PLLCFG_PLL3CFG (RCC_PLLCFGR_PLL3VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL3RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVQ3EN) +#define STM32_PLLCFG_PLL3M RCC_PLLCKSELR_DIVM3(4) +#define STM32_PLLCFG_PLL3N RCC_PLL3DIVR_N3(48) +#define STM32_PLLCFG_PLL3P RCC_PLL3DIVR_P3(2) +#define STM32_PLLCFG_PLL3Q RCC_PLL3DIVR_Q3(4) +#define STM32_PLLCFG_PLL3R RCC_PLL3DIVR_R3(2) + +#define STM32_VCO3_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) +#define STM32_PLL3P_FREQUENCY (STM32_VCO3_FREQUENCY / 2) +#define STM32_PLL3Q_FREQUENCY (STM32_VCO3_FREQUENCY / 4) +#define STM32_PLL3R_FREQUENCY (STM32_VCO3_FREQUENCY / 2) + +/* SYSCLK = PLL1P = 480MHz + * CPUCLK = SYSCLK / 1 = 480 MHz + */ + +#define STM32_RCC_D1CFGR_D1CPRE (RCC_D1CFGR_D1CPRE_SYSCLK) +#define STM32_SYSCLK_FREQUENCY (STM32_PLL1P_FREQUENCY) +#define STM32_CPUCLK_FREQUENCY (STM32_SYSCLK_FREQUENCY / 1) + +/* Configure Clock Assignments */ + +/* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) + * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 + */ + +#define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ +#define STM32_ACLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* ACLK in D1, HCLK3 in D1 */ +#define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ +#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ + +/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ +#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ +#define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ +#define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ + +#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ +#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* Timer clock frequencies */ + +/* Timers driven from APB1 will be twice PCLK1 */ + +#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) + +/* Timers driven from APB2 will be twice PCLK2 */ + +#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) + +/* Kernel Clock Configuration + * + * Note: look at Table 54 in ST Manual + */ + +/* I2C123 clock source */ + +#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI + +/* I2C4 clock source */ + +#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI + +/* SPI123 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 + +/* SPI45 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 + +/* SPI6 clock source */ + +#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 + +/* USB 1 and 2 clock source */ + +#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 + +/* ADC 1 2 3 clock source */ + +#define STM32_RCC_D3CCIPR_ADCSRC RCC_D3CCIPR_ADCSEL_PLL2 + +/* UART clock selection */ +/* reset to default to overwrite any changes done by any bootloader */ + +#define STM32_RCC_D2CCIP2R_USART234578_SEL RCC_D2CCIP2R_USART234578SEL_RCC +#define STM32_RCC_D2CCIP2R_USART16_SEL RCC_D2CCIP2R_USART16SEL_RCC + +/* FDCAN 1 2 clock source */ + +#define STM32_RCC_D2CCIP1R_FDCANSEL RCC_D2CCIP1R_FDCANSEL_HSE /* FDCAN 1 2 clock source */ + +#define STM32_FDCANCLK STM32_HSE_FREQUENCY + +/* FLASH wait states + * + * ------------ ---------- ----------- + * Vcore MAX ACLK WAIT STATES + * ------------ ---------- ----------- + * 1.15-1.26 V 70 MHz 0 + * (VOS1 level) 140 MHz 1 + * 210 MHz 2 + * 1.05-1.15 V 55 MHz 0 + * (VOS2 level) 110 MHz 1 + * 165 MHz 2 + * 220 MHz 3 + * 0.95-1.05 V 45 MHz 0 + * (VOS3 level) 90 MHz 1 + * 135 MHz 2 + * 180 MHz 3 + * 225 MHz 4 + * ------------ ---------- ----------- + */ + +#define BOARD_FLASH_WAITSTATES 2 + +/* SDMMC definitions ********************************************************/ + +/* Init 400kHz, freq = PLL1Q/(2*div) div = PLL1Q/(2*freq) */ + +#define STM32_SDMMC_INIT_CLKDIV (300 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) + +/* 25 MHz Max for now, 25 mHZ = PLL1Q/(2*div), div = PLL1Q/(2*freq) + * div = 4.8 = 240 / 50, So round up to 5 for default speed 24 MB/s + */ + +#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) +# define STM32_SDMMC_MMCXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#else +# define STM32_SDMMC_MMCXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#endif +#if defined(CONFIG_STM32H7_SDMMC_XDMA) || defined(CONFIG_STM32H7_SDMMC_IDMA) +# define STM32_SDMMC_SDXFR_CLKDIV (5 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#else +# define STM32_SDMMC_SDXFR_CLKDIV (100 << STM32_SDMMC_CLKCR_CLKDIV_SHIFT) +#endif + +#define STM32_SDMMC_CLKCR_EDGE STM32_SDMMC_CLKCR_NEGEDGE + +/* LED definitions ******************************************************************/ +/* The Accton Godwit GA1 board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and + * LED_RED a Red LED, that can be controlled by software. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +/* LED definitions ******************************************************************/ +/* The px4_fmu-v6x board has three, LED_GREEN a Green LED, LED_BLUE a Blue LED and + * LED_RED a Red LED, that can be controlled by software. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +#define BOARD_LED1 0 +#define BOARD_LED2 1 +#define BOARD_LED3 2 +#define BOARD_NLEDS 3 + +#define BOARD_LED_RED BOARD_LED1 +#define BOARD_LED_GREEN BOARD_LED2 +#define BOARD_LED_BLUE BOARD_LED3 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) + +/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in + * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related + * events as follows: + * + * + * SYMBOL Meaning LED state + * Red Green Blue + * ---------------------- -------------------------- ------ ------ ----*/ + +#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ +#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ +#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ +#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ +#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ +#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ +#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ +#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ +#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ + +/* Thus if the Green LED is statically on, NuttX has successfully booted and + * is, apparently, running normally. If the Red LED is flashing at + * approximately 2Hz, then a fatal error has been detected and the system + * has halted. + */ + +/* Alternate function pin selections ************************************************/ + +#define GPIO_USART1_RX GPIO_USART1_RX_3 /* PB7 */ +#define GPIO_USART1_TX GPIO_USART1_TX_3 /* PB6 */ + +#define GPIO_USART2_RX GPIO_USART2_RX_1 /* PA3 */ +#define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ +#define GPIO_USART2_RTS GPIO_USART2_RTS_2 /* PD4 */ +#define GPIO_USART2_CTS GPIO_USART2_CTS_NSS_2 /* PD3 */ + +#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ +#define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ + +#define GPIO_UART4_RX GPIO_UART4_RX_6 /* PH14 */ +#define GPIO_UART4_TX GPIO_UART4_TX_6 /* PH13 */ + +#define GPIO_UART5_RX GPIO_UART5_RX_3 /* PD2 */ +#define GPIO_UART5_TX GPIO_UART5_TX_3 /* PC12 */ +// GPIO_UART5_RTS no remap /* PC8 */ +#undef GPIO_UART5_CTS +#define GPIO_UART5_CTS ((GPIO_ALT|GPIO_AF8|GPIO_PORTC|GPIO_PIN9) | GPIO_PULLDOWN) /* PC9 */ + + +#define GPIO_USART6_RX GPIO_USART6_RX_1 /* PC7 */ +#define GPIO_USART6_TX GPIO_USART6_TX_1 /* PC6 */ + +#define GPIO_UART7_RX GPIO_UART7_RX_4 /* PF6 */ +#define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ +#define GPIO_UART7_RTS GPIO_UART7_RTS_2 /* PF8 */ +#define GPIO_UART7_CTS (GPIO_UART7_CTS_1 | GPIO_PULLDOWN) /* PE10 */ + +#define GPIO_UART8_RX GPIO_UART8_RX_1 /* PE0 */ +#define GPIO_UART8_TX GPIO_UART8_TX_1 /* PE1 */ + + +/* CAN + * + * CAN1 is routed to transceiver. + * CAN2 is routed to transceiver. + */ +#define GPIO_CAN1_RX GPIO_CAN1_RX_3 /* PD0 */ +#define GPIO_CAN1_TX GPIO_CAN1_TX_3 /* PD1 */ +#define GPIO_CAN2_RX GPIO_CAN2_RX_1 /* PB12 */ +#define GPIO_CAN2_TX GPIO_CAN2_TX_1 /* PB13 */ + +/* SPI + * SPI1 is sensors1 + * SPI2 is sensors2 + * SPI3 is sensors3 + * SPI4 is Not Used + * SPI5 is FRAM + * SPI6 is EXTERNAL1 + * + */ + +#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) + +#define GPIO_SPI1_MISO GPIO_SPI1_MISO_3 /* PG9 */ +#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_2 /* PB5 */ +#define GPIO_SPI1_SCK ADJ_SLEW_RATE(GPIO_SPI1_SCK_1) /* PA5 */ + +#define GPIO_SPI2_MISO GPIO_SPI2_MISO_3 /* PI2 */ +#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_4 /* PI3 */ +#define GPIO_SPI2_SCK ADJ_SLEW_RATE(GPIO_SPI2_SCK_6) /* PI1 */ + +#define GPIO_SPI3_MISO GPIO_SPI3_MISO_2 /* PC11 */ +#define GPIO_SPI3_MOSI GPIO_SPI3_MOSI_3 /* PB2 */ +#define GPIO_SPI3_SCK ADJ_SLEW_RATE(GPIO_SPI3_SCK_2) /* PC10 */ + +#define GPIO_SPI5_MISO GPIO_SPI5_MISO_2 /* PH7 */ +#define GPIO_SPI5_MOSI GPIO_SPI5_MOSI_1 /* PF11 */ +#define GPIO_SPI5_SCK ADJ_SLEW_RATE(GPIO_SPI5_SCK_1) /* PF7 */ + +#define GPIO_SPI6_MISO GPIO_SPI6_MISO_2 /* PA6 */ +#define GPIO_SPI6_MOSI GPIO_SPI6_MOSI_1 /* PG14 */ +#define GPIO_SPI6_SCK ADJ_SLEW_RATE(GPIO_SPI6_SCK_3) /* PB3 */ + +/* I2C + * + * The optional _GPIO configurations allow the I2C driver to manually + * reset the bus to clear stuck slaves. They match the pin configuration, + * but are normally-high GPIOs. + * + */ + +#define GPIO_I2C1_SCL GPIO_I2C1_SCL_2 /* PB8 */ +#define GPIO_I2C1_SDA GPIO_I2C1_SDA_2 /* PB9 */ + +#define GPIO_I2C1_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN8) +#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN9) + +#define GPIO_I2C2_SCL GPIO_I2C2_SCL_2 /* PF1 */ +#define GPIO_I2C2_SDA GPIO_I2C2_SDA_2 /* PF0 */ + +#define GPIO_I2C2_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN1) +#define GPIO_I2C2_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN0) + +#define GPIO_I2C3_SCL GPIO_I2C3_SCL_1 /* PA8 */ +#define GPIO_I2C3_SDA GPIO_I2C3_SDA_2 /* PH8 */ + +#define GPIO_I2C3_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTA | GPIO_PIN8) +#define GPIO_I2C3_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTH | GPIO_PIN8) + +#define GPIO_I2C4_SCL GPIO_I2C4_SCL_2 /* PF14 */ +#define GPIO_I2C4_SDA GPIO_I2C4_SDA_2 /* PF15 */ + +#define GPIO_I2C4_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN14) +#define GPIO_I2C4_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTF | GPIO_PIN15) + +/* SDMMC2 + * + * VDD 3.3 + * GND + * SDMMC2_CK PD6 + * SDMMC2_CMD PD7 + * SDMMC2_D0 PB14 + * SDMMC2_D1 PB15 + * SDMMC2_D2 PG11 + * SDMMC2_D3 PB4 + */ + +#define GPIO_SDMMC2_CK GPIO_SDMMC2_CK_1 /* PD6 */ +#define GPIO_SDMMC2_CMD GPIO_SDMMC2_CMD_1 /* PD7 */ +// GPIO_SDMMC2_D0 No Remap /* PB14 */ +// GPIO_SDMMC2_D1 No Remap /* PB15 */ +#define GPIO_SDMMC2_D2 GPIO_SDMMC2_D2_1 /* PG11 */ +// GPIO_SDMMC2_D3 No Remap /* PB4 */ + +/* The STM32 H7 connects to a TI DP83848TSQ/NOPB + * using RMII + * + * STM32 H7 BOARD DP83848TSQ/NOPB + * GPIO SIGNAL PIN NAME + * -------- ------------ ------------- + * PA7 ETH_CRS_DV CRS_DV + * PC1 ETH_MDC MDC + * PA2 ETH_MDIO MDIO + * PA1 ETH_REF_CL X1 + * PC4 ETH_RXD0 RX_D0 + * PC5 ETH_RXD1 RX_D1 + * PB11 ETH_TX_EN TX_EN + * PG13 ETH_TXD0 TX_D0 + * PG12 ETH_TXD1 TX_D1 + * + * The PHY address is 1, since COL/PHYAD0 features a pull up. + */ + +#define GPIO_ETH_RMII_TX_EN GPIO_ETH_RMII_TX_EN_1 /* PB11 */ +#define GPIO_ETH_RMII_TXD0 GPIO_ETH_RMII_TXD0_2 /* PG13 */ +#define GPIO_ETH_RMII_TXD1 GPIO_ETH_RMII_TXD1_2 /* PG12 */ + + +/* USB + * + * OTG_FS_DM PA11 + * OTG_FS_DP PA12 + * VBUS PA9 + */ + + +/* Board provides GPIO or other Hardware for signaling to timing analyzer */ + +#if defined(CONFIG_BOARD_USE_PROBES) +# include "stm32_gpio.h" +# define PROBE_N(n) (1<<((n)-1)) +# define PROBE_1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN0) /* PI0 AUX1 */ +# define PROBE_2 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN12) /* PH12 AUX2 */ +# define PROBE_3 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN11) /* PH11 AUX3 */ +# define PROBE_4 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN10) /* PH10 AUX4 */ +# define PROBE_5 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN13) /* PD13 AUX5 */ +# define PROBE_6 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14) /* PD14 AUX6 */ +# define PROBE_7 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN6) /* PH6 AUX7 */ +# define PROBE_8 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN9) /* PH9 AUX8 */ +# define PROBE_9 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN11) /* PE11 CAP1 */ + +# define PROBE_INIT(mask) \ + do { \ + if ((mask)& PROBE_N(1)) { stm32_configgpio(PROBE_1); } \ + if ((mask)& PROBE_N(2)) { stm32_configgpio(PROBE_2); } \ + if ((mask)& PROBE_N(3)) { stm32_configgpio(PROBE_3); } \ + if ((mask)& PROBE_N(4)) { stm32_configgpio(PROBE_4); } \ + if ((mask)& PROBE_N(5)) { stm32_configgpio(PROBE_5); } \ + if ((mask)& PROBE_N(6)) { stm32_configgpio(PROBE_6); } \ + if ((mask)& PROBE_N(7)) { stm32_configgpio(PROBE_7); } \ + if ((mask)& PROBE_N(8)) { stm32_configgpio(PROBE_8); } \ + if ((mask)& PROBE_N(9)) { stm32_configgpio(PROBE_9); } \ + } while(0) + +# define PROBE(n,s) do {stm32_gpiowrite(PROBE_##n,(s));}while(0) +# define PROBE_MARK(n) PROBE(n,false);PROBE(n,true) +#else +# define PROBE_INIT(mask) +# define PROBE(n,s) +# define PROBE_MARK(n) +#endif + +#endif /*__NUTTX_CONFIG_ACCTON_GODWIT_GA1_INCLUDE_BOARD_H */ diff --git a/boards/accton-godwit/ga1/nuttx-config/include/board_dma_map.h b/boards/accton-godwit/ga1/nuttx-config/include/board_dma_map.h new file mode 100644 index 0000000000..1f45efc569 --- /dev/null +++ b/boards/accton-godwit/ga1/nuttx-config/include/board_dma_map.h @@ -0,0 +1,87 @@ +/**************************************************************************** + * + * Copyright (c) 2020 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +// DMAMUX1 Using at most 8 Channels on DMA1 -------- Assigned +// V + +#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* 1 DMA1:37 ICM-20649 */ +#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* 2 DMA1:38 ICM-20649 */ + +#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* 3 DMA1:39 ICM-42688-P */ +#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* 4 DMA1:40 ICM-42688-P */ + +//#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* DMA1:41 GPS1 */ +//#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* DMA1:42 GPS1 */ + +//#define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_0 /* DMA1:43 Telem3 */ +//#define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_0 /* DMA1:44 Telem3 */ + +//#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_0 /* DMA1:45 DEBUG */ +//#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_0 /* DMA1:46 DEBUG */ + +//#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* DMA1:63 EXT2 */ +//#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* DMA1:64 EXT2 */ + +#define DMAMAP_USART6_RX DMAMAP_DMA12_USART6RX_0 /* 5 DMA1:71 PX4IO */ +#define DMAMAP_USART6_TX DMAMAP_DMA12_USART6TX_0 /* 6 DMA1:72 PX4IO */ + +// Assigned in timer_config.cpp + +// Timer 4 /* 7 DMA1:32 TIM4UP */ +// Timer 5 /* 8 DMA1:50 TIM5UP */ + +// DMAMUX2 Using at most 8 Channels on DMA2 -------- Assigned +// V + +#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_1 /* 1 DMA2:61 BMI088 */ +#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_1 /* 2 DMA2:62 BMI088 */ + +#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* 3 DMA2:45 DEBUG */ +#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* 4 DMA2:46 DEBUG */ + +#define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_1 /* 5 DMA2:65 TELEM2 */ +#define DMAMAP_UART5_TX DMAMAP_DMA12_UART5TX_1 /* 6 DMA2:66 TELEM2 */ + +#define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_1 /* 7 DMA1:79 TELEM1 */ +#define DMAMAP_UART7_TX DMAMAP_DMA12_UART7TX_1 /* 8 DMA1:80 TELEM1 */ + +//#define DMAMAP_UART8_RX DMAMAP_DMA12_UART8RX_1 /* DMA1:81 GPS2 */ +//#define DMAMAP_UART8_TX DMAMAP_DMA12_UART8TX_1 /* DMA1:82 GPS2 */ + +// DMAMUX2 Using at most 8 Channels on BDMA -------- Assigned +// V + +#define DMAMAP_SPI6_RX DMAMAP_BDMA_SPI6_RX /* 1 BDMA:11 SPI J11 */ +#define DMAMAP_SPI6_TX DMAMAP_BDMA_SPI6_TX /* 2 BDMA:12 SPI J11 */ diff --git a/boards/accton-godwit/ga1/nuttx-config/nsh/defconfig b/boards/accton-godwit/ga1/nuttx-config/nsh/defconfig new file mode 100644 index 0000000000..26165c4e42 --- /dev/null +++ b/boards/accton-godwit/ga1/nuttx-config/nsh/defconfig @@ -0,0 +1,332 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DISABLE_ENVIRON is not set +# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set +# CONFIG_DISABLE_PTHREAD is not set +# CONFIG_MMCSD_HAVE_CARDDETECT is not set +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_MMCSD_SPI is not set +# CONFIG_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_ARP is not set +# CONFIG_NSH_DISABLE_CAT is not set +# CONFIG_NSH_DISABLE_CD is not set +# CONFIG_NSH_DISABLE_CP is not set +# CONFIG_NSH_DISABLE_DATE is not set +# CONFIG_NSH_DISABLE_DF is not set +# CONFIG_NSH_DISABLE_ECHO is not set +# CONFIG_NSH_DISABLE_ENV is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_EXPORT is not set +# CONFIG_NSH_DISABLE_FREE is not set +# CONFIG_NSH_DISABLE_GET is not set +# CONFIG_NSH_DISABLE_HELP is not set +# CONFIG_NSH_DISABLE_IFCONFIG is not set +# CONFIG_NSH_DISABLE_IFUPDOWN is not set +# CONFIG_NSH_DISABLE_ITEF is not set +# CONFIG_NSH_DISABLE_KILL is not set +# CONFIG_NSH_DISABLE_LOOPS is not set +# CONFIG_NSH_DISABLE_LS is not set +# CONFIG_NSH_DISABLE_MKDIR is not set +# CONFIG_NSH_DISABLE_MKFATFS is not set +# CONFIG_NSH_DISABLE_MOUNT is not set +# CONFIG_NSH_DISABLE_MV is not set +# CONFIG_NSH_DISABLE_NSLOOKUP is not set +# CONFIG_NSH_DISABLE_PS is not set +# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set +# CONFIG_NSH_DISABLE_PWD is not set +# CONFIG_NSH_DISABLE_RM is not set +# CONFIG_NSH_DISABLE_RMDIR is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_SET is not set +# CONFIG_NSH_DISABLE_SLEEP is not set +# CONFIG_NSH_DISABLE_SOURCE is not set +# CONFIG_NSH_DISABLE_TELNETD is not set +# CONFIG_NSH_DISABLE_TEST is not set +# CONFIG_NSH_DISABLE_TIME is not set +# CONFIG_NSH_DISABLE_UMOUNT is not set +# CONFIG_NSH_DISABLE_UNSET is not set +# CONFIG_NSH_DISABLE_USLEEP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/accton-godwit/ga1/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H753II=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DTCM=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_ARM_MPU_EARLY_RESET=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_CRASHDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=95751 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x1BD0 +CONFIG_CDCACM_PRODUCTSTR="PX4 Accton Godwit GA1" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x083A +CONFIG_CDCACM_VENDORSTR="Accton" +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_MEMFAULT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=y +CONFIG_DEFAULT_SMALL=y +CONFIG_DEV_FIFO_SIZE=0 +CONFIG_DEV_GPIO=y +CONFIG_DEV_PIPE_MAXSIZE=1024 +CONFIG_DEV_PIPE_SIZE=70 +CONFIG_DEV_URANDOM=y +CONFIG_ETH0_PHY_LAN8742A=y +CONFIG_EXPERIMENTAL=y +CONFIG_FAT_DMAMEMORY=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FAT_LFN_ALIAS_HASH=y +CONFIG_FDCLONE_STDIO=y +CONFIG_FSUTILS_IPCFG=y +CONFIG_FS_BINFS=y +CONFIG_FS_CROMFS=y +CONFIG_FS_FAT=y +CONFIG_FS_FATTIME=y +CONFIG_FS_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_THROTTLE=0 +CONFIG_IPCFG_BINARY=y +CONFIG_IPCFG_CHARDEV=y +CONFIG_IPCFG_PATH="/fs/mtd_net" +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_MAX_EXITFUNS=1 +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y +CONFIG_MM_REGIONS=4 +CONFIG_MTD=y +CONFIG_MTD_BYTE_WRITE=y +CONFIG_MTD_PARTITION=y +CONFIG_MTD_PROGMEM=y +CONFIG_MTD_RAMTRON=y +CONFIG_NAME_MAX=40 +CONFIG_NET=y +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDB_DNSCLIENT_ENTRIES=8 +CONFIG_NETDB_DNSSERVER_NOADDR=y +CONFIG_NETDEV_PHY_IOCTL=y +CONFIG_NETINIT_DHCPC=y +CONFIG_NETINIT_DNS=y +CONFIG_NETINIT_DNSIPADDR=0xA290AFE +CONFIG_NETINIT_DRIPADDR=0xA290AFE +CONFIG_NETINIT_MONITOR=y +CONFIG_NETINIT_THREAD=y +CONFIG_NETINIT_THREAD_PRIORITY=49 +CONFIG_NETUTILS_TELNETD=y +CONFIG_NET_ARP_IPIN=y +CONFIG_NET_ARP_SEND=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ETH_PKTSIZE=1518 +CONFIG_NET_ICMP=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_NACTIVESOCKETS=16 +CONFIG_NET_SOLINGER=y +CONFIG_NET_TCP=y +CONFIG_NET_TCPBACKLOG=y +CONFIG_NET_TCP_DELAYED_ACK=y +CONFIG_NET_TCP_WRITE_BUFFERS=y +CONFIG_NET_UDP=y +CONFIG_NET_UDP_CHECKSUMS=y +CONFIG_NET_UDP_WRITE_BUFFERS=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_ARGCAT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_CMDPARMS=y +CONFIG_NSH_CROMFSETC=y +CONFIG_NSH_LINELEN=128 +CONFIG_NSH_MAXARGUMENTS=15 +CONFIG_NSH_NESTDEPTH=8 +CONFIG_NSH_QUOTE=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSSECTSIZE=128 +CONFIG_NSH_STRERROR=y +CONFIG_NSH_TELNET=y +CONFIG_NSH_TELNET_LOGIN=y +CONFIG_NSH_VARS=y +CONFIG_OTG_ID_GPIO_DISABLE=y +CONFIG_PIPES=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PRIORITY_INHERITANCE=y +CONFIG_PTHREAD_MUTEX_ROBUST=y +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_RAMTRON_EMULATE_PAGE_SHIFT=5 +CONFIG_RAMTRON_EMULATE_SECTOR_SHIFT=5 +CONFIG_RAMTRON_SETSPEED=y +CONFIG_RAM_SIZE=245760 +CONFIG_RAM_START=0x20010000 +CONFIG_RAW_BINARY=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_TABCOMPLETION=y +CONFIG_RTC_DATETIME=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKPRIORITY=249 +CONFIG_SCHED_HPWORKSTACKSIZE=1280 +CONFIG_SCHED_INSTRUMENTATION=y +CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y +CONFIG_SCHED_INSTRUMENTATION_SWITCH=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_LPWORKPRIORITY=50 +CONFIG_SCHED_LPWORKSTACKSIZE=1632 +CONFIG_SDMMC2_SDIO_PULLUP=y +CONFIG_SEM_PREALLOCHOLDERS=32 +CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_SIG_DEFAULT=y +CONFIG_SIG_SIGALRM_ACTION=y +CONFIG_SIG_SIGUSR1_ACTION=y +CONFIG_SIG_SIGUSR2_ACTION=y +CONFIG_SIG_SIGWORK=4 +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_BUFFER_SIZE=256 +CONFIG_STM32H7_ADC1=y +CONFIG_STM32H7_ADC3=y +CONFIG_STM32H7_BBSRAM=y +CONFIG_STM32H7_BBSRAM_FILES=5 +CONFIG_STM32H7_BDMA=y +CONFIG_STM32H7_BKPSRAM=y +CONFIG_STM32H7_DMA1=y +CONFIG_STM32H7_DMA2=y +CONFIG_STM32H7_DMACAPABLE=y +CONFIG_STM32H7_ETHMAC=y +CONFIG_STM32H7_FLASH_OVERRIDE_I=y +CONFIG_STM32H7_FLOWCONTROL_BROKEN=y +CONFIG_STM32H7_I2C1=y +CONFIG_STM32H7_I2C2=y +CONFIG_STM32H7_I2C3=y +CONFIG_STM32H7_I2C4=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PHYSR=31 +CONFIG_STM32H7_PHYSR_100MBPS=0x8 +CONFIG_STM32H7_PHYSR_FULLDUPLEX=0x10 +CONFIG_STM32H7_PHYSR_MODE=0x10 +CONFIG_STM32H7_PHYSR_SPEED=0x8 +CONFIG_STM32H7_PHY_POLLING=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_RTC=y +CONFIG_STM32H7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y +CONFIG_STM32H7_RTC_MAGIC_REG=1 +CONFIG_STM32H7_SAVE_CRASHDUMP=y +CONFIG_STM32H7_SDMMC2=y +CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_SPI1=y +CONFIG_STM32H7_SPI1_DMA=y +CONFIG_STM32H7_SPI1_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI2=y +CONFIG_STM32H7_SPI2_DMA=y +CONFIG_STM32H7_SPI2_DMA_BUFFER=4096 +CONFIG_STM32H7_SPI3=y +CONFIG_STM32H7_SPI3_DMA=y +CONFIG_STM32H7_SPI3_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI5=y +CONFIG_STM32H7_SPI6=y +CONFIG_STM32H7_SPI6_DMA=y +CONFIG_STM32H7_SPI6_DMA_BUFFER=1024 +CONFIG_STM32H7_TIM12=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM4=y +CONFIG_STM32H7_TIM5=y +CONFIG_STM32H7_UART4=y +CONFIG_STM32H7_UART5=y +CONFIG_STM32H7_UART7=y +CONFIG_STM32H7_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_DHCPC_RENEW=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_PING=y +CONFIG_SYSTEM_SYSTEM=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_UART4_BAUD=57600 +CONFIG_UART4_RXBUFSIZE=600 +CONFIG_UART4_TXBUFSIZE=1500 +CONFIG_UART5_IFLOWCONTROL=y +CONFIG_UART5_OFLOWCONTROL=y +CONFIG_UART5_RXDMA=y +CONFIG_UART5_TXBUFSIZE=10000 +CONFIG_UART5_TXDMA=y +CONFIG_UART7_BAUD=57600 +CONFIG_UART7_IFLOWCONTROL=y +CONFIG_UART7_OFLOWCONTROL=y +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_RXDMA=y +CONFIG_UART7_TXBUFSIZE=3000 +CONFIG_UART7_TXDMA=y +CONFIG_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_IFLOWCONTROL=y +CONFIG_USART2_OFLOWCONTROL=y +CONFIG_USART2_RXBUFSIZE=600 +CONFIG_USART2_TXBUFSIZE=3000 +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=180 +CONFIG_USART3_RXDMA=y +CONFIG_USART3_SERIAL_CONSOLE=y +CONFIG_USART3_TXBUFSIZE=1500 +CONFIG_USART3_TXDMA=y +CONFIG_USART6_BAUD=57600 +CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 +CONFIG_WATCHDOG=y diff --git a/boards/accton-godwit/ga1/nuttx-config/scripts/bootloader_script.ld b/boards/accton-godwit/ga1/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 0000000000..2e6eba3607 --- /dev/null +++ b/boards/accton-godwit/ga1/nuttx-config/scripts/bootloader_script.ld @@ -0,0 +1,215 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The PX4 FMUV6X uses an STM32H753II has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743II, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * The PX4 FMUV6X has a test point on board, the BOOT0 pin is at ground so by + * default, the STM32 will boot to address 0x0800:0000 in FLASH unless the test + * point is pulled to 3.3V.then the boot will be from 0x1FF0:0000 + * + * The STM32H743II also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + * + * The bootloader uses the first sector of the flash, which is 128K in length. + */ + +MEMORY +{ + itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + flash (rx) : ORIGIN = 0x08000000, LENGTH = 128K + dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K + sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K + sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K + sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K + sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K + sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K + bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) +EXTERN(_bootdelay_signature) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + . = ALIGN(32); + /* + This signature provides the bootloader with a way to delay booting + */ + _bootdelay_signature = ABSOLUTE(.); + FILL(0xffecc2925d7d05c5) + . += 8; + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + + } > flash + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > flash + + + .ARM.extab : { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + } > sram AT > flash + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/accton-godwit/ga1/nuttx-config/scripts/script.ld b/boards/accton-godwit/ga1/nuttx-config/scripts/script.ld new file mode 100644 index 0000000000..b6b341d4e8 --- /dev/null +++ b/boards/accton-godwit/ga1/nuttx-config/scripts/script.ld @@ -0,0 +1,229 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The PX4 FMUV6X uses an STM32H753II has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743II, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * The PX4 FMUV6X has a test point on board, the BOOT0 pin is at ground so by + * default, the STM32 will boot to address 0x0800:0000 in FLASH unless the test + * point is pulled to 3.3V.then the boot will be from 0x1FF0:0000 + * + * The STM32H743II also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + */ + +MEMORY +{ + ITCM_RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1920K + + DTCM1_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + DTCM2_RAM (rwx) : ORIGIN = 0x20010000, LENGTH = 64K + AXI_SRAM (rwx) : ORIGIN = 0x24000000, LENGTH = 512K /* D1 domain AXI bus */ + SRAM1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K /* D2 domain AHB bus */ + SRAM2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K /* D2 domain AHB bus */ + SRAM3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K /* D2 domain AHB bus */ + SRAM4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K /* D3 domain */ + BKPRAM (rwx) : ORIGIN = 0x38800000, LENGTH = 4K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) +EXTERN(_bootdelay_signature) +EXTERN(board_get_manifest) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + . = ALIGN(32); + /* + This signature provides the bootloader with a way to delay booting + */ + _bootdelay_signature = ABSOLUTE(.); + FILL(0xffecc2925d7d05c5) + . += 8; + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + + } > FLASH + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > FLASH + + + .ARM.extab : { + *(.ARM.extab*) + } > FLASH + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > FLASH + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + + /* Pad out last section as the STM32H7 Flash write size is 256 bits. 32 bytes */ + . = ALIGN(16); + FILL(0xffff) + . += 16; + } > AXI_SRAM AT > FLASH = 0xffff + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > AXI_SRAM + + /* Emit the the D3 power domain section for locating BDMA data */ + + .sram4_reserve (NOLOAD) : + { + *(.sram4) + . = ALIGN(4); + _sram4_heap_start = ABSOLUTE(.); + } > SRAM4 + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/accton-godwit/ga1/performance-test.px4board b/boards/accton-godwit/ga1/performance-test.px4board new file mode 100644 index 0000000000..5e69dd7ae3 --- /dev/null +++ b/boards/accton-godwit/ga1/performance-test.px4board @@ -0,0 +1,31 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ETHERNET=y +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS7" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS6" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS4" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS1" +CONFIG_BOARD_SERIAL_EXT2="/dev/ttyS3" +CONFIG_BOARD_ROMFSROOT="performance-test" +CONFIG_DRIVERS_ADC_BOARD_ADC=y +CONFIG_SYSTEMCMDS_DMESG=y +CONFIG_SYSTEMCMDS_GPIO=y +CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y +CONFIG_SYSTEMCMDS_I2CDETECT=y +CONFIG_SYSTEMCMDS_LED_CONTROL=y +CONFIG_SYSTEMCMDS_MFT=y +CONFIG_SYSTEMCMDS_MTD=y +CONFIG_SYSTEMCMDS_MFT_CFG=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y +CONFIG_SYSTEMCMDS_SD_STRESS=y +CONFIG_SYSTEMCMDS_SERIAL_TEST=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/accton-godwit/ga1/src/CMakeLists.txt b/boards/accton-godwit/ga1/src/CMakeLists.txt new file mode 100644 index 0000000000..39ec808e1e --- /dev/null +++ b/boards/accton-godwit/ga1/src/CMakeLists.txt @@ -0,0 +1,76 @@ +############################################################################ +# +# Copyright (c) 2016 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ +if("${PX4_BOARD_LABEL}" STREQUAL "bootloader") + add_compile_definitions(BOOTLOADER) + add_library(drivers_board + bootloader_main.c + init.cpp + usb.c + timer_config.cpp + ) + target_link_libraries(drivers_board + PRIVATE + nuttx_arch # sdio + nuttx_drivers # sdio + px4_layer #gpio + arch_io_pins # iotimer + bootloader + ) + target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) + +else() + add_library(drivers_board + can.c + i2c.cpp + init.cpp + led.c + mtd.cpp + 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 # drv_led_start + nuttx_arch # sdio + nuttx_drivers # sdio + px4_layer + platform_gpio_mcp23009 + ) +endif() diff --git a/boards/accton-godwit/ga1/src/board_config.h b/boards/accton-godwit/ga1/src/board_config.h new file mode 100644 index 0000000000..cffa2cc54d --- /dev/null +++ b/boards/accton-godwit/ga1/src/board_config.h @@ -0,0 +1,519 @@ +/**************************************************************************** + * + * Copyright (c) 2016-2022 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file board_config.h + * + * PX4FMU-v6x internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include + + +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +#undef TRACE_PINS + +/* PX4IO connection configuration */ + +#define BOARD_USES_PX4IO_VERSION 2 +#define PX4IO_SERIAL_DEVICE "/dev/ttyS5" +#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX +#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX +#define PX4IO_SERIAL_BASE STM32_USART6_BASE +#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 +#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX +#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX +#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR +#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN +#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY +#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ + +/* Configuration ************************************************************************************/ + +#define BOARD_HAS_LTC44XX_VALIDS 2 // N Bricks +#define BOARD_HAS_USB_VALID 1 // LTC Has USB valid +#define BOARD_HAS_NBAT_V 2d // 2 Digital Voltage +#define BOARD_HAS_NBAT_I 2d // 2 Digital Current + +/* PX4FMU GPIOs ***********************************************************************************/ + +/* Trace Clock and D0-D3 are available on the trace connector + * + * TRACECLK PE2 - Dedicated - Trace Connector Pin 1 + * TRACED0 PE3 - nLED_RED - Trace Connector Pin 3 + * TRACED1 PE4 - nLED_GREEN - Trace Connector Pin 5 + * TRACED2 PE5 - nLED_BLUE - Trace Connector Pin 7 + * TRACED3 PE6 - nARMED - Trace Connector Pin 8 + + */ + +/* LEDs are driven with push open drain to support Anode to 5V or 3.3V or used as TRACE0-2 */ + +#if !defined(TRACE_PINS) +# define GPIO_nLED_RED /* PE3 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN3) +# define GPIO_nLED_GREEN /* PE4 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN4) +# define GPIO_nLED_BLUE /* PE5 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN5) + +# define BOARD_HAS_CONTROL_STATUS_LEDS 1 +# define BOARD_OVERLOAD_LED LED_RED +# define BOARD_ARMED_STATE_LED LED_BLUE + +#else + +# define GPIO_TRACECLK1 (GPIO_TRACECLK |GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN2) +# define GPIO_TRACED0 (GPIO_TRACED0_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN3) +# define GPIO_TRACED1 (GPIO_TRACED1_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN4) +# define GPIO_TRACED2 (GPIO_TRACED2_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN5) +# define GPIO_TRACED3 (GPIO_TRACED3_2|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL) //(GPIO_ALT|GPIO_AF0|GPIO_PORTE|GPIO_PIN6) +//#define GPIO_TRACESWO //(GPIO_ALT|GPIO_AF0|GPIO_PORTB|GPIO_PIN3) + +# undef BOARD_HAS_CONTROL_STATUS_LEDS +# undef BOARD_OVERLOAD_LED +# undef BOARD_ARMED_STATE_LED + +# define GPIO_nLED_RED GPIO_TRACED0 +# define GPIO_nLED_GREEN GPIO_TRACED1 +# define GPIO_nLED_BLUE GPIO_TRACED2 +# define GPIO_nARMED GPIO_TRACED3 +# define GPIO_nARMED_INIT GPIO_TRACED3 +#endif + + +/* SPI */ + +#define SPI6_nRESET_EXTERNAL1 /* PF10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN10) +#define GPIO_SYNC /* PE9 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_100MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN9) + +/* I2C busses */ + +/* Devices on the onboard buses. + * + * Note that these are unshifted addresses. + */ +#define BOARD_MTD_NUM_EEPROM 2 /* MTD: base_eeprom, imu_eeprom*/ + +#define PX4_I2C_OBDEV_SE050 0x48 + +#define GPIO_I2C2_DRDY1_BMP388 /* PG5 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTG|GPIO_PIN5) + +/* + * ADC channels + * + * These are the channel numbers of the ADCs of the microcontroller that + * can be used by the Px4 Firmware in the adc driver + */ + +/* ADC defines to be used in sensors.cpp to read from a particular channel */ + +#define ADC1_CH(n) (n) + +/* N.B. there is no offset mapping needed for ADC3 because */ +#define ADC3_CH(n) (n) + +/* We are only use ADC3 for REV/VER. + * ADC3_6V6 and ADC3_3V3 are mapped back to ADC1 + * To do this We are relying on PC2_C, PC3_C being connected to PC2, PC3 + * respectively by the SYSCFG_PMCR default of setting for PC3SO PC2SO PA1SO + * PA0SO of 0. + * + * 0 Analog switch closed (pads are connected through the analog switch) + * + * So ADC3_INP0 is GPIO_ADC123_INP12 + * ADC3_INP1 is GPIO_ADC12_INP13 + */ + +/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ + +#define PX4_ADC_GPIO \ + /* PA0 */ GPIO_ADC1_INP16, \ + /* PA4 */ GPIO_ADC12_INP18, \ + /* PB0 */ GPIO_ADC12_INP9, \ + /* PB1 */ GPIO_ADC12_INP5, \ + /* PC2 */ GPIO_ADC123_INP12, \ + /* PC3 */ GPIO_ADC12_INP13, \ + /* PF12 */ GPIO_ADC1_INP6, \ + /* PH3 */ GPIO_ADC3_INP14, \ + /* PH4 */ GPIO_ADC3_INP15 + +/* Define Channel numbers must match above GPIO pin IN(n)*/ +#define ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL /* PA0 */ ADC1_CH(16) +#define ADC_SCALED_VDD_3V3_SENSORS2_CHANNEL /* PA4 */ ADC1_CH(18) +#define ADC_SCALED_VDD_3V3_SENSORS3_CHANNEL /* PB0 */ ADC1_CH(9) +#define ADC_SCALED_V5_CHANNEL /* PB1 */ ADC1_CH(5) +#define ADC_ADC3_6V6_CHANNEL /* PC2 */ ADC3_CH(12) +#define ADC_ADC3_3V3_CHANNEL /* PC3 */ ADC3_CH(13) +#define ADC_SCALED_VDD_3V3_SENSORS4_CHANNEL /* PF12 */ ADC1_CH(6) +#define ADC_HW_VER_SENSE_CHANNEL /* PH3 */ ADC3_CH(14) +#define ADC_HW_REV_SENSE_CHANNEL /* PH4 */ ADC3_CH(15) + +#define ADC_CHANNELS \ + ((1 << ADC_SCALED_VDD_3V3_SENSORS1_CHANNEL) | \ + (1 << ADC_SCALED_VDD_3V3_SENSORS2_CHANNEL) | \ + (1 << ADC_SCALED_VDD_3V3_SENSORS3_CHANNEL) | \ + (1 << ADC_SCALED_V5_CHANNEL) | \ + (1 << ADC_ADC3_6V6_CHANNEL) | \ + (1 << ADC_ADC3_3V3_CHANNEL)) | \ + (1 << ADC_SCALED_VDD_3V3_SENSORS4_CHANNEL) + +/* HW has to large of R termination on ADC todo:change when HW value is chosen */ + +#define HW_REV_VER_ADC_BASE STM32_ADC3_BASE + +#define SYSTEM_ADC_BASE STM32_ADC1_BASE + +/* HW has to large of R termination on ADC todo:change when HW value is chosen */ +#define BOARD_ADC_OPEN_CIRCUIT_V (5.6f) + +/* HW Version and Revision drive signals Default to 1 to detect */ +#define BOARD_HAS_HW_SPLIT_VERSIONING + +#define GPIO_HW_VER_REV_DRIVE /* PG0 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN0) +#define GPIO_HW_REV_SENSE /* PH4 */ GPIO_ADC3_INP15 +#define GPIO_HW_VER_SENSE /* PH3 */ GPIO_ADC3_INP14 +#define HW_INFO_INIT_PREFIX "GA1" + + +#define UAVCAN_NUM_IFACES_RUNTIME 1 + +/* HEATER + * PWM in future + */ +#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) + +/* PE6 is nARMED + * The GPIO will be set as input while not armed HW will have external HW Pull UP. + * While armed it shall be configured at a GPIO OUT set LOW + */ +#if !defined(TRACE_PINS) +#define GPIO_nARMED_INIT /* PE6 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN6) +#define GPIO_nARMED /* PE6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN6) +#define BOARD_INDICATE_EXTERNAL_LOCKOUT_STATE(enabled) px4_arch_configgpio((enabled) ? GPIO_nARMED : GPIO_nARMED_INIT) +#define BOARD_GET_EXTERNAL_LOCKOUT_STATE() px4_arch_gpioread(GPIO_nARMED) +#endif + + +/* PWM + */ +#define DIRECT_PWM_OUTPUT_CHANNELS 9 + + +/* Power supply control and monitoring GPIOs */ + +#define GPIO_nPOWER_IN_A /* PG1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN1) +#define GPIO_nPOWER_IN_B /* PG2 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN2) +#define GPIO_nPOWER_IN_C /* PG3 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN3) + +#define GPIO_nVDD_BRICK1_VALID GPIO_nPOWER_IN_A /* Brick 1 Is Chosen */ +#define GPIO_nVDD_BRICK2_VALID GPIO_nPOWER_IN_B /* Brick 2 Is Chosen */ +#define BOARD_NUMBER_BRICKS 2 +#define BOARD_NUMBER_DIGITAL_BRICKS 2 +#define GPIO_nVDD_USB_VALID GPIO_nPOWER_IN_C /* USB Is Chosen */ + +#define GPIO_VDD_5V_PERIPH_nEN /* PG4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN4) +#define GPIO_VDD_5V_PERIPH_nOC /* PE15 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTE|GPIO_PIN15) +#define GPIO_VDD_5V_HIPOWER_nEN /* PG10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTG|GPIO_PIN10) +#define GPIO_VDD_5V_HIPOWER_nOC /* PF13 */ (GPIO_INPUT |GPIO_FLOAT|GPIO_PORTF|GPIO_PIN13) +#define GPIO_VDD_3V3_SENSORS4_EN /* PG8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN8) +#define GPIO_VDD_3V3_SPEKTRUM_POWER_EN /* PH2 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN2) +#define GPIO_VDD_3V3_SD_CARD_EN /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) + +/* MCP23009 GPIO expander */ +#define BOARD_GPIO_VDD_5V_COMP_VALID "/dev/gpio4" +#define BOARD_GPIO_VDD_5V_CAN1_GPS1_VALID "/dev/gpio5" + + +/* Spare GPIO */ + +#define GPIO_PG6 /* PG6 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTG|GPIO_PIN6) +#define GPIO_PD15 /* PD15 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN15) + +/* ETHERNET GPIO */ + +#define GPIO_ETH_POWER_EN /* PG15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTG|GPIO_PIN15) + +/* NFC GPIO */ + +#define GPIO_NFC_GPIO /* PC0 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTC|GPIO_PIN0) + + +/* Define True logic Power Control in arch agnostic form */ + +#define VDD_5V_PERIPH_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_5V_PERIPH_nEN, !(on_true)) +#define VDD_5V_HIPOWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_5V_HIPOWER_nEN, !(on_true)) +#define VDD_3V3_SENSORS4_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SENSORS4_EN, (on_true)) +#define VDD_3V3_SPEKTRUM_POWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SPEKTRUM_POWER_EN, (on_true)) +#define READ_VDD_3V3_SPEKTRUM_POWER_EN() px4_arch_gpioread(GPIO_VDD_3V3_SPEKTRUM_POWER_EN) +#define VDD_3V3_SD_CARD_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SD_CARD_EN, (on_true)) +#define VDD_3V3_ETH_POWER_EN(on_true) px4_arch_gpiowrite(GPIO_ETH_POWER_EN, (on_true)) + + +/* Tone alarm output */ + +#define TONE_ALARM_TIMER 14 /* Timer 14 */ +#define TONE_ALARM_CHANNEL 1 /* PF9 GPIO_TIM14_CH1OUT_2 */ + +#define GPIO_BUZZER_1 /* PF9 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN9) + +#define GPIO_TONE_ALARM_IDLE GPIO_BUZZER_1 +#define GPIO_TONE_ALARM GPIO_TIM14_CH1OUT_2 + +/* USB OTG FS + * + * PA9 OTG_FS_VBUS VBUS sensing + */ +#define GPIO_OTGFS_VBUS /* PA9 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN9) + +/* High-resolution timer */ +#define HRT_TIMER 8 /* use timer8 for the HRT */ +#define HRT_TIMER_CHANNEL 3 /* use capture/compare channel 3 */ + +#define HRT_PPM_CHANNEL /* T8C1 */ 1 /* use capture/compare channel 1 */ +#define GPIO_PPM_IN /* PI5 T8C1 */ GPIO_TIM8_CH1IN_2 + +/* RC Serial port */ +#define RC_SERIAL_PORT "/dev/ttyS5" +/* Some RC protocols are bi-directional, therefore we need a half-duplex UART */ +#define RC_SERIAL_SINGLEWIRE +/* The STM32 UART by default wires half-duplex mode to the TX pin, but our + * signal in routed to the RX pin, so we need to swap the pins */ +#define RC_SERIAL_SWAP_RXTX + +/* Input Capture Channels. */ +#define INPUT_CAP1_TIMER 1 +#define INPUT_CAP1_CHANNEL /* T1C2 */ 2 +#define GPIO_INPUT_CAP1 /* PE11 */ GPIO_TIM1_CH2IN + +/* PWM input driver. Use FMU AUX5 pins attached to timer4 channel 2 */ +#define PWMIN_TIMER 4 +#define PWMIN_TIMER_CHANNEL /* T4C2 */ 2 +#define GPIO_PWM_IN /* PD13 */ GPIO_TIM4_CH2IN_2 + +/* Safety Switch is HW version dependent on having an PX4IO + * So we init to a benign state with the _INIT definition + * and provide the the non _INIT one for the driver to make a run time + * decision to use it. + */ +#define GPIO_nSAFETY_SWITCH_LED_OUT_INIT /* PD10 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTD|GPIO_PIN10) +#define GPIO_nSAFETY_SWITCH_LED_OUT /* PD10 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN10) + +/* Enable the FMU to control it if there is no px4io fixme:This should be BOARD_SAFETY_LED(__ontrue) */ +#define GPIO_LED_SAFETY GPIO_nSAFETY_SWITCH_LED_OUT + +#define GPIO_SAFETY_SWITCH_IN /* PF5 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTF|GPIO_PIN5) +/* Enable the FMU to use the switch it if there is no px4io fixme:This should be BOARD_SAFTY_BUTTON() */ +#define GPIO_BTN_SAFETY GPIO_SAFETY_SWITCH_IN /* Enable the FMU to control it if there is no px4io */ + +/* Power switch controls ******************************************************/ + +#define SPEKTRUM_POWER(_on_true) VDD_3V3_SPEKTRUM_POWER_EN(_on_true) + +/* + * FMUv6X has a separate RC_IN + * + * GPIO PPM_IN on PI5 T8CH1 + * SPEKTRUM_RX (it's TX or RX in Bind) on UART6 PC7 + * Inversion is possible in the UART and can drive GPIO PPM_IN as an output + */ + +#define GPIO_PPM_IN_AS_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTI|GPIO_PIN5) +#define SPEKTRUM_RX_AS_GPIO_OUTPUT() px4_arch_configgpio(GPIO_PPM_IN_AS_OUT) +#define SPEKTRUM_RX_AS_UART() /* Can be left as uart */ +#define SPEKTRUM_OUT(_one_true) px4_arch_gpiowrite(GPIO_PPM_IN_AS_OUT, (_one_true)) + +#define SDIO_SLOTNO 0 /* Only one slot */ +#define SDIO_MINOR 0 + +/* SD card bringup does not work if performed on the IDLE thread because it + * will cause waiting. Use either: + * + * CONFIG_BOARDCTL=y, OR + * CONFIG_BOARD_INITIALIZE=y && CONFIG_BOARD_INITTHREAD=y + */ + +#if defined(CONFIG_BOARD_INITIALIZE) && !defined(CONFIG_BOARDCTL) && \ + !defined(CONFIG_BOARD_INITTHREAD) +# warning SDIO initialization cannot be perfomed on the IDLE thread +#endif + +/* By Providing BOARD_ADC_USB_CONNECTED (using the px4_arch abstraction) + * this board support the ADC system_power interface, and therefore + * provides the true logic GPIO BOARD_ADC_xxxx macros. + */ +#define BOARD_ADC_USB_CONNECTED (px4_arch_gpioread(GPIO_OTGFS_VBUS)) +#define BOARD_ADC_USB_VALID (!px4_arch_gpioread(GPIO_nVDD_USB_VALID)) + +/* FMUv6X never powers off the Servo rail */ + +#define BOARD_ADC_SERVO_VALID (1) + +#if !defined(BOARD_HAS_LTC44XX_VALIDS) || BOARD_HAS_LTC44XX_VALIDS == 0 +# define BOARD_ADC_BRICK1_VALID (1) +# define BOARD_ADC_BRICK2_VALID (0) +#elif BOARD_HAS_LTC44XX_VALIDS == 1 +# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) +# define BOARD_ADC_BRICK2_VALID (0) +#elif BOARD_HAS_LTC44XX_VALIDS == 2 +# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) +# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) +#elif BOARD_HAS_LTC44XX_VALIDS == 3 +# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) +# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) +# define BOARD_ADC_BRICK3_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK3_VALID)) +#elif BOARD_HAS_LTC44XX_VALIDS == 4 +# define BOARD_ADC_BRICK1_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK1_VALID)) +# define BOARD_ADC_BRICK2_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK2_VALID)) +# define BOARD_ADC_BRICK3_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK3_VALID)) +# define BOARD_ADC_BRICK4_VALID (!px4_arch_gpioread(GPIO_nVDD_BRICK4_VALID)) +#else +# error Unsupported BOARD_HAS_LTC44XX_VALIDS value +#endif + +#define BOARD_ADC_PERIPH_5V_OC (!px4_arch_gpioread(GPIO_VDD_5V_PERIPH_nOC)) +#define BOARD_ADC_HIPOWER_5V_OC (!px4_arch_gpioread(GPIO_VDD_5V_HIPOWER_nOC)) + + +/* This board provides a DMA pool and APIs */ +#define BOARD_DMA_ALLOC_POOL_SIZE 5120 + +/* This board provides the board_on_reset interface */ + +#define BOARD_HAS_ON_RESET 1 + +#if defined(TRACE_PINS) +#define GPIO_TRACE \ + GPIO_TRACECLK1, \ + GPIO_TRACED0, \ + GPIO_TRACED1, \ + GPIO_TRACED2, \ + GPIO_TRACED3 +#else +#define GPIO_TRACE (GPIO_OUTPUT|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN2) +#endif + +#define PX4_GPIO_INIT_LIST { \ + GPIO_TRACE, \ + PX4_ADC_GPIO, \ + GPIO_HW_VER_REV_DRIVE, \ + GPIO_CAN1_TX, \ + GPIO_CAN1_RX, \ + GPIO_CAN2_TX, \ + GPIO_CAN2_RX, \ + GPIO_HEATER_OUTPUT, \ + GPIO_nPOWER_IN_A, \ + GPIO_nPOWER_IN_B, \ + GPIO_nPOWER_IN_C, \ + GPIO_VDD_5V_PERIPH_nEN, \ + GPIO_VDD_5V_PERIPH_nOC, \ + GPIO_VDD_5V_HIPOWER_nEN, \ + GPIO_VDD_5V_HIPOWER_nOC, \ + GPIO_VDD_3V3_SENSORS4_EN, \ + GPIO_VDD_3V3_SPEKTRUM_POWER_EN, \ + GPIO_VDD_3V3_SD_CARD_EN, \ + GPIO_PD15, \ + GPIO_SYNC, \ + SPI6_nRESET_EXTERNAL1, \ + GPIO_ETH_POWER_EN, \ + GPIO_NFC_GPIO, \ + GPIO_TONE_ALARM_IDLE, \ + GPIO_nSAFETY_SWITCH_LED_OUT_INIT, \ + GPIO_SAFETY_SWITCH_IN, \ + GPIO_PG6, \ + GPIO_nARMED_INIT \ + } + +#define BOARD_ENABLE_CONSOLE_BUFFER + +#define PX4_I2C_BUS_MTD 4,5 + + +#define BOARD_NUM_IO_TIMERS 5 + +__BEGIN_DECLS + +/**************************************************************************************************** + * Public Types + ****************************************************************************************************/ + +/**************************************************************************************************** + * Public data + ****************************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************************************** + * Public Functions + ****************************************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +int stm32_sdio_initialize(void); + +/**************************************************************************************************** + * Name: stm32_spiinitialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the PX4FMU board. + * + ****************************************************************************************************/ + +extern void stm32_spiinitialize(void); + +extern void stm32_usbinitialize(void); + +extern void board_peripheral_reset(int ms); + +#include + +#endif /* __ASSEMBLY__ */ + +__END_DECLS diff --git a/boards/accton-godwit/ga1/src/bootloader_main.c b/boards/accton-godwit/ga1/src/bootloader_main.c new file mode 100644 index 0000000000..77df9e78bc --- /dev/null +++ b/boards/accton-godwit/ga1/src/bootloader_main.c @@ -0,0 +1,62 @@ +/**************************************************************************** + * + * Copyright (c) 2019-2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file bootloader_main.c + * + * FMU-specific early startup code for bootloader +*/ + +#include "board_config.h" +#include "bl.h" + +#include +#include +#include +#include +#include +#include "arm_internal.h" +#include + +extern int sercon_main(int c, char **argv); + +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/accton-godwit/ga1/src/can.c b/boards/accton-godwit/ga1/src/can.c new file mode 100644 index 0000000000..cdebe7a3ad --- /dev/null +++ b/boards/accton-godwit/ga1/src/can.c @@ -0,0 +1,142 @@ +/**************************************************************************** + * + * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file can.c + * + * Board-specific CAN functions. + */ + +#if !defined(CONFIG_CAN) + +#include + +#include "board_config.h" + + +__EXPORT +uint16_t board_get_can_interfaces(void) +{ + uint16_t enabled_interfaces = 0x3; + + if (!PX4_MFT_HW_SUPPORTED(PX4_MFT_CAN2)) { + enabled_interfaces &= ~(1 << 1); + } + + return enabled_interfaces; +} + +#else + +#include +#include + +#include +#include + +#include "chip.h" +#include "arm_internal.h" + +#include "chip.h" +#include "stm32_can.h" +#include "board_config.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ +/* Configuration ********************************************************************/ + +#if defined(CONFIG_STM32_CAN1) && defined(CONFIG_STM32_CAN2) +# warning "Both CAN1 and CAN2 are enabled. Assuming only CAN1." +# undef CONFIG_STM32_CAN2 +#endif + +#ifdef CONFIG_STM32_CAN1 +# define CAN_PORT 1 +#else +# define CAN_PORT 2 +#endif + +/************************************************************************************ + * Private Functions + ************************************************************************************/ + +/************************************************************************************ + * Public Functions + ************************************************************************************/ +int can_devinit(void); + +/************************************************************************************ + * Name: can_devinit + * + * Description: + * All STM32 architectures must provide the following interface to work with + * examples/can. + * + ************************************************************************************/ + +int can_devinit(void) +{ + static bool initialized = false; + struct can_dev_s *can; + int ret; + + /* Check if we have already initialized */ + + if (!initialized) { + /* Call stm32_caninitialize() to get an instance of the CAN interface */ + + can = stm32_caninitialize(CAN_PORT); + + if (can == NULL) { + canerr("ERROR: Failed to get CAN interface\n"); + return -ENODEV; + } + + /* Register the CAN driver at "/dev/can0" */ + + ret = can_register("/dev/can0", can); + + if (ret < 0) { + canerr("ERROR: can_register failed: %d\n", ret); + return ret; + } + + /* Now we are initialized */ + + initialized = true; + } + + return OK; +} +#endif /* CONFIG_CAN */ diff --git a/boards/accton-godwit/ga1/src/hw_config.h b/boards/accton-godwit/ga1/src/hw_config.h new file mode 100644 index 0000000000..a2bdf7398c --- /dev/null +++ b/boards/accton-godwit/ga1/src/hw_config.h @@ -0,0 +1,128 @@ +/* + * hw_config.h + * + * Created on: May 17, 2015 + * Author: david_s5 + */ + +#ifndef HW_CONFIG_H_ +#define HW_CONFIG_H_ + +/**************************************************************************** + * 10-8--2016: + * To simplify the ripple effect on the tools, we will be using + * /dev/serial/by-id/PX4 to locate PX4 devices. Therefore + * moving forward all Bootloaders must contain the prefix "PX4 BL " + * in the USBDEVICESTRING + * This Change will be made in an upcoming BL release + ****************************************************************************/ +/* + * Define usage to configure a bootloader + * + * + * Constant example Usage + * APP_LOAD_ADDRESS 0x08004000 - The address in Linker Script, where the app fw is org-ed + * BOOTLOADER_DELAY 5000 - Ms to wait while under USB pwr or bootloader request + * BOARD_FMUV2 + * INTERFACE_USB 1 - (Optional) Scan and use the USB interface for bootloading + * INTERFACE_USART 1 - (Optional) Scan and use the Serial interface for bootloading + * USBDEVICESTRING "PX4 BL FMU v2.x" - USB id string + * USBPRODUCTID 0x0011 - PID Should match defconfig + * BOOT_DELAY_ADDRESS 0x000001a0 - (Optional) From the linker script from Linker Script to get a custom + * delay provided by an APP FW + * BOARD_TYPE 9 - Must match .prototype boad_id + * _FLASH_KBYTES (*(uint16_t *)0x1fff7a22) - Run time flash size detection + * BOARD_FLASH_SECTORS ((_FLASH_KBYTES == 0x400) ? 11 : 23) - Run time determine the physical last sector + * BOARD_FLASH_SECTORS 11 - Hard coded zero based last sector + * BOARD_FLASH_SIZE (_FLASH_KBYTES*1024)- Total Flash size of device, determined at run time. + * (1024 * 1024) - Hard coded Total Flash of device - The bootloader and app reserved will be deducted + * programmatically + * + * BOARD_FIRST_FLASH_SECTOR_TO_ERASE 2 - Optional sectors index in the flash_sectors table (F4 only), to begin erasing. + * This is to allow sectors to be reserved for app fw usage. That will NOT be erased + * during a FW upgrade. + * The default is 0, and selects the first sector to be erased, as the 0th entry in the + * flash_sectors table. Which is the second physical sector of FLASH in the device. + * The first physical sector of FLASH is used by the bootloader, and is not defined + * in the table. + * + * APP_RESERVATION_SIZE (BOARD_FIRST_FLASH_SECTOR_TO_ERASE * 16 * 1024) - Number of bytes reserved by the APP FW. This number plus + * BOOTLOADER_RESERVATION_SIZE will be deducted from + * BOARD_FLASH_SIZE to determine the size of the App FW + * and hence the address space of FLASH to erase and program. + * USBMFGSTRING "PX4 AP" - Optional USB MFG string (default is '3D Robotics' if not defined.) + * SERIAL_BREAK_DETECT_DISABLED - Optional prevent break selection on Serial port from entering or staying in BL + * + * * Other defines are somewhat self explanatory. + */ + +/* Boot device selection list*/ +#define USB0_DEV 0x01 +#define SERIAL0_DEV 0x02 +#define SERIAL1_DEV 0x04 + +#define APP_LOAD_ADDRESS 0x08020000 +#define BOOTLOADER_DELAY 5000 +#define INTERFACE_USB 1 +#define INTERFACE_USB_CONFIG "/dev/ttyACM0" +#define BOARD_VBUS MK_GPIO_INPUT(GPIO_OTGFS_VBUS) + +//#define USE_VBUS_PULL_DOWN +#define INTERFACE_USART 1 +#define INTERFACE_USART_CONFIG "/dev/ttyS0,1500000" +#define BOOT_DELAY_ADDRESS 0x000001a0 +#define BOARD_TYPE 7120 +#define _FLASH_KBYTES (*(uint32_t *)0x1FF1E880) +#define BOARD_FLASH_SECTORS (15) +#define BOARD_FLASH_SIZE (_FLASH_KBYTES * 1024) + +#define OSC_FREQ 16 + +#define BOARD_PIN_LED_ACTIVITY GPIO_nLED_BLUE // BLUE +#define BOARD_PIN_LED_BOOTLOADER GPIO_nLED_GREEN // GREEN +#define BOARD_LED_ON 0 +#define BOARD_LED_OFF 1 + +#define SERIAL_BREAK_DETECT_DISABLED 1 + +/* + * Uncommenting this allows to force the bootloader through + * a PWM output pin. As this can accidentally initialize + * an ESC prematurely, it is not recommended. This feature + * has not been used and hence defaults now to off. + * + * # define BOARD_FORCE_BL_PIN_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN14) + * # define BOARD_FORCE_BL_PIN_IN (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN11) + * + * # define BOARD_POWER_PIN_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN4) + * # define BOARD_POWER_ON 1 + * # define BOARD_POWER_OFF 0 + * # undef BOARD_POWER_PIN_RELEASE // Leave pin enabling Power - un comment to release (disable power) + * +*/ + +#if !defined(ARCH_SN_MAX_LENGTH) +# define ARCH_SN_MAX_LENGTH 12 +#endif + +#if !defined(APP_RESERVATION_SIZE) +# define APP_RESERVATION_SIZE 0 +#endif + +#if !defined(BOARD_FIRST_FLASH_SECTOR_TO_ERASE) +# define BOARD_FIRST_FLASH_SECTOR_TO_ERASE 1 +#endif + +#if !defined(USB_DATA_ALIGN) +# define USB_DATA_ALIGN +#endif + +#ifndef BOOT_DEVICES_SELECTION +# define BOOT_DEVICES_SELECTION USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +#endif + +#ifndef BOOT_DEVICES_FILTER_ONUSB +# define BOOT_DEVICES_FILTER_ONUSB USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +#endif + +#endif /* HW_CONFIG_H_ */ diff --git a/boards/accton-godwit/ga1/src/i2c.cpp b/boards/accton-godwit/ga1/src/i2c.cpp new file mode 100644 index 0000000000..8a557078e0 --- /dev/null +++ b/boards/accton-godwit/ga1/src/i2c.cpp @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * Copyright (C) 2020 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { + initI2CBusExternal(1), + initI2CBusExternal(2), + initI2CBusExternal(3), + initI2CBusInternal(4), +}; diff --git a/boards/accton-godwit/ga1/src/init.cpp b/boards/accton-godwit/ga1/src/init.cpp new file mode 100644 index 0000000000..6aef4114a8 --- /dev/null +++ b/boards/accton-godwit/ga1/src/init.cpp @@ -0,0 +1,299 @@ +/**************************************************************************** + * + * Copyright (c) 2012-2022 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file init.cpp + * + * PX4FMU-specific early startup code. This file implements the + * board_app_initialize() function that is called early by nsh during startup. + * + * Code here is run before the rcS script is invoked; it should start required + * subsystems and perform board-specific initialization. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "board_config.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "arm_internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +__END_DECLS + + +/************************************************************************************ + * Name: board_peripheral_reset + * + * Description: + * + ************************************************************************************/ +__EXPORT void board_peripheral_reset(int ms) +{ + /* set the peripheral rails off */ + + VDD_5V_PERIPH_EN(false); + board_control_spi_sensors_power(false, 0xffff); + VDD_3V3_SENSORS4_EN(false); + + bool last = READ_VDD_3V3_SPEKTRUM_POWER_EN(); + /* Keep Spektum on to discharge rail*/ + VDD_3V3_SPEKTRUM_POWER_EN(false); + + /* wait for the peripheral rail to reach GND */ + usleep(ms * 1000); + syslog(LOG_DEBUG, "reset done, %d ms\n", ms); + + /* re-enable power */ + + /* switch the peripheral rail back on */ + VDD_3V3_SPEKTRUM_POWER_EN(last); + board_control_spi_sensors_power(true, 0xffff); + VDD_3V3_SENSORS4_EN(true); + VDD_5V_PERIPH_EN(true); + +} + +/************************************************************************************ + * Name: board_on_reset + * + * Description: + * Optionally provided function called on entry to board_system_reset + * It should perform any house keeping prior to the rest. + * + * status - 1 if resetting to boot loader + * 0 if just resetting + * + ************************************************************************************/ +__EXPORT void board_on_reset(int status) +{ + for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { + px4_arch_configgpio(io_timer_channel_get_gpio_output(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. + * + ************************************************************************************/ + +extern "C" __EXPORT void +stm32_boardinitialize(void) +{ + board_on_reset(-1); /* Reset PWM first thing */ + + /* configure LEDs */ + + board_autoled_initialize(); + + /* configure pins */ + + const uint32_t gpio[] = PX4_GPIO_INIT_LIST; + px4_gpio_init(gpio, arraySize(gpio)); + + /* configure USB interfaces */ + + stm32_usbinitialize(); + + VDD_3V3_ETH_POWER_EN(true); + +} + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; the meaning of the argument is a contract + * between the board-specific initalization logic and the the + * matching application logic. The value cold be such things as a + * mode enumeration value, a set of DIP switch switch settings, a + * pointer to configuration data read from a file or serial FLASH, + * or whatever you would like to do with it. Every implementation + * should accept zero/NULL as a default configuration. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ + +__EXPORT int board_app_initialize(uintptr_t arg) +{ +#if !defined(BOOTLOADER) + + /* Power on Interfaces */ + VDD_3V3_SD_CARD_EN(true); + VDD_5V_PERIPH_EN(true); + VDD_5V_HIPOWER_EN(true); + VDD_3V3_SENSORS4_EN(true); + VDD_3V3_SPEKTRUM_POWER_EN(true); + + /* Need hrt running before using the ADC */ + + px4_platform_init(); + + // Use the default HW_VER_REV(0x0,0x0) for Ramtron + + stm32_spiinitialize(); + + /* Configure the HW based on the manifest */ + + px4_platform_configure(); + /* + if (OK == board_determine_hw_info()) { + syslog(LOG_INFO, "[boot] Rev 0x%1x : Ver 0x%1x %s\n", board_get_hw_revision(), board_get_hw_version(), + board_get_hw_type_name()); + + } else { + syslog(LOG_ERR, "[boot] Failed to read HW revision and version\n"); + } + */ + /* Configure the Actual SPI interfaces (after we determined the HW version) */ + + stm32_spiinitialize(); + + board_spi_reset(10, 0xffff); + + /* Configure the DMA allocator */ + + if (board_dma_alloc_init() < 0) { + syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); + } + +# if defined(SERIAL_HAVE_RXDMA) + // set up the serial DMA polling at 1ms intervals for received bytes that have not triggered a DMA event. + static struct hrt_call serial_dma_call; + hrt_call_every(&serial_dma_call, 1000, 1000, (hrt_callout)stm32_serial_dma_poll, NULL); +# endif + + /* initial LED state */ + drv_led_start(); + led_off(LED_RED); + led_on(LED_GREEN); // Indicate Power. + led_off(LED_BLUE); + + if (board_hardfault_init(2, true) != 0) { + led_on(LED_RED); + } + + // Ensure Power is off for > 10 mS + usleep(15 * 1000); + VDD_3V3_SD_CARD_EN(true); + usleep(500 * 1000); + +# ifdef CONFIG_MMCSD + int ret = stm32_sdio_initialize(); + + if (ret != OK) { + led_on(LED_RED); + return ret; + } + +# endif /* CONFIG_MMCSD */ + + ret = mcp23009_register_gpios(3, 0x25); + + if (ret != OK) { + led_on(LED_RED); + return ret; + } + +#endif /* !defined(BOOTLOADER) */ + + return OK; +} diff --git a/boards/accton-godwit/ga1/src/led.c b/boards/accton-godwit/ga1/src/led.c new file mode 100644 index 0000000000..1e33dd1299 --- /dev/null +++ b/boards/accton-godwit/ga1/src/led.c @@ -0,0 +1,235 @@ +/**************************************************************************** + * + * Copyright (c) 2013 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file led.c + * + * PX4FMU LED backend. + */ + +#include + +#include + +#include "chip.h" +#include "stm32_gpio.h" +#include "board_config.h" + +#include +#include + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +extern void led_toggle(int led); +__END_DECLS + +#ifdef CONFIG_ARCH_LEDS +static bool nuttx_owns_leds = true; +// B R S G +// 0 1 2 3 +static const uint8_t xlatpx4[] = {1, 2, 4, 0}; +# define xlat(p) xlatpx4[(p)] +static uint32_t g_ledmap[] = { + GPIO_nLED_GREEN, // Indexed by BOARD_LED_GREEN + GPIO_nLED_BLUE, // Indexed by BOARD_LED_BLUE + GPIO_nLED_RED, // Indexed by BOARD_LED_RED + GPIO_nSAFETY_SWITCH_LED_OUT, // Indexed by LED_SAFETY by xlatpx4 +}; + +#else + +# define xlat(p) (p) +static uint32_t g_ledmap[] = { + GPIO_nLED_BLUE, // Indexed by LED_BLUE + GPIO_nLED_RED, // Indexed by LED_RED, LED_AMBER + 0, // Indexed by LED_SAFETY (defaulted to an input) + GPIO_nLED_GREEN, // Indexed by LED_GREEN +}; + +#endif + +__EXPORT void led_init(void) +{ + for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) { + if (g_ledmap[l] != 0) { + stm32_configgpio(g_ledmap[l]); + } + } +} + +static void phy_set_led(int led, bool state) +{ + /* Drive Low to switch on */ + + if (g_ledmap[led] != 0) { + stm32_gpiowrite(g_ledmap[led], !state); + } +} + +static bool phy_get_led(int led) +{ + /* If Low it is on */ + if (g_ledmap[led] != 0) { + return !stm32_gpioread(g_ledmap[led]); + } + + return false; +} + +__EXPORT void led_on(int led) +{ + phy_set_led(xlat(led), true); +} + +__EXPORT void led_off(int led) +{ + phy_set_led(xlat(led), false); +} + +__EXPORT void led_toggle(int led) +{ + phy_set_led(xlat(led), !phy_get_led(xlat(led))); +} + +#ifdef CONFIG_ARCH_LEDS +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_autoled_initialize + ****************************************************************************/ + +void board_autoled_initialize(void) +{ + led_init(); +} + +/**************************************************************************** + * Name: board_autoled_on + ****************************************************************************/ + +void board_autoled_on(int led) +{ + if (!nuttx_owns_leds) { + return; + } + + switch (led) { + default: + break; + + case LED_HEAPALLOCATE: + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_IRQSENABLED: + phy_set_led(BOARD_LED_BLUE, false); + phy_set_led(BOARD_LED_GREEN, true); + break; + + case LED_STACKCREATED: + phy_set_led(BOARD_LED_GREEN, true); + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_INIRQ: + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_SIGNAL: + phy_set_led(BOARD_LED_GREEN, true); + break; + + case LED_ASSERTION: + phy_set_led(BOARD_LED_RED, true); + phy_set_led(BOARD_LED_BLUE, true); + break; + + case LED_PANIC: + phy_set_led(BOARD_LED_RED, true); + break; + + case LED_IDLE : /* IDLE */ + phy_set_led(BOARD_LED_RED, true); + break; + } +} + +/**************************************************************************** + * Name: board_autoled_off + ****************************************************************************/ + +void board_autoled_off(int led) +{ + if (!nuttx_owns_leds) { + return; + } + + switch (led) { + default: + break; + + case LED_SIGNAL: + phy_set_led(BOARD_LED_GREEN, false); + break; + + case LED_INIRQ: + phy_set_led(BOARD_LED_BLUE, false); + break; + + case LED_ASSERTION: + phy_set_led(BOARD_LED_RED, false); + phy_set_led(BOARD_LED_BLUE, false); + break; + + case LED_PANIC: + phy_set_led(BOARD_LED_RED, false); + break; + + case LED_IDLE : /* IDLE */ + phy_set_led(BOARD_LED_RED, false); + break; + } +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/accton-godwit/ga1/src/mtd.cpp b/boards/accton-godwit/ga1/src/mtd.cpp new file mode 100644 index 0000000000..8e57555eac --- /dev/null +++ b/boards/accton-godwit/ga1/src/mtd.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** + * + * Copyright (C) 2020 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include + +#include +#include +// KiB BS nB +static const px4_mft_device_t spi5 = { // FM25V02A on FMUM native: 32K X 8, emulated as (1024 Blocks of 32) + .bus_type = px4_mft_device_t::SPI, + .devid = SPIDEV_FLASH(0) +}; +static const px4_mft_device_t i2c3 = { // 24LC64T on Base 8K 32 X 256 + .bus_type = px4_mft_device_t::I2C, + .devid = PX4_MK_I2C_DEVID(3, 0x51) +}; +static const px4_mft_device_t i2c4 = { // 24LC64T on IMU 8K 32 X 256 + .bus_type = px4_mft_device_t::I2C, + .devid = PX4_MK_I2C_DEVID(4, 0x50) +}; + + +static const px4_mtd_entry_t fmum_fram = { + .device = &spi5, + .npart = 1, + .partd = { + { + .type = MTD_PARAMETERS, + .path = "/fs/mtd_params", + .nblocks = (32768 / (1 << CONFIG_RAMTRON_EMULATE_SECTOR_SHIFT)) + } + }, +}; + +static const px4_mtd_entry_t base_eeprom = { + .device = &i2c3, + .npart = 2, + .partd = { + { + .type = MTD_MFT_VER, + .path = "/fs/mtd_mft_ver", + .nblocks = 248 + }, + { + .type = MTD_NET, + .path = "/fs/mtd_net", + .nblocks = 8 // 256 = 32 * 8 + + } + }, +}; + +static const px4_mtd_entry_t imu_eeprom = { + .device = &i2c4, + .npart = 3, + .partd = { + { + .type = MTD_CALDATA, + .path = "/fs/mtd_caldata", + .nblocks = 240 + }, + { + .type = MTD_MFT_REV, + .path = "/fs/mtd_mft_rev", + .nblocks = 8 + }, + { + .type = MTD_ID, + .path = "/fs/mtd_id", + .nblocks = 8 // 256 = 32 * 8 + } + }, +}; + +static const px4_mtd_manifest_t board_mtd_config = { + .nconfigs = 3, + .entries = { + &fmum_fram, + &base_eeprom, + &imu_eeprom + } +}; + +static const px4_mft_entry_s mtd_mft = { + .type = MTD, + .pmft = (void *) &board_mtd_config, +}; + +static const px4_mft_entry_s mft_mft = { + .type = MFT, + .pmft = (void *) system_query_manifest, +}; + +static const px4_mft_s mft = { + .nmft = 2, + .mfts = { + &mtd_mft, + &mft_mft, + } +}; + +const px4_mft_s *board_get_manifest(void) +{ + return &mft; +} diff --git a/boards/accton-godwit/ga1/src/sdio.c b/boards/accton-godwit/ga1/src/sdio.c new file mode 100644 index 0000000000..869d757756 --- /dev/null +++ b/boards/accton-godwit/ga1/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/accton-godwit/ga1/src/spi.cpp b/boards/accton-godwit/ga1/src/spi.cpp new file mode 100644 index 0000000000..7be7fb2ada --- /dev/null +++ b/boards/accton-godwit/ga1/src/spi.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** + * + * Copyright (C) 2020, 2022 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +#include + +constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { + initSPIBus(SPI::Bus::SPI1, { + initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortI, GPIO::Pin9}, SPI::DRDY{GPIO::PortF, GPIO::Pin2}), + }, {GPIO::PortI, GPIO::Pin11}), + initSPIBus(SPI::Bus::SPI2, { + initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortH, GPIO::Pin5}, SPI::DRDY{GPIO::PortA, GPIO::Pin10}), + }, {GPIO::PortF, GPIO::Pin4}), + initSPIBus(SPI::Bus::SPI3, { + initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin8}, SPI::DRDY{GPIO::PortI, GPIO::Pin7}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortI, GPIO::Pin4}), + }, {GPIO::PortE, GPIO::Pin7}), + // initSPIBus(SPI::Bus::SPI4, { + // // no devices + // TODO: if enabled, remove GPIO_VDD_3V3_SENSORS4_EN from board_config.h + // }, {GPIO::PortG, GPIO::Pin8}), + initSPIBus(SPI::Bus::SPI5, { + initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortG, GPIO::Pin7}) + }), + initSPIBusExternal(SPI::Bus::SPI6, { + initSPIConfigExternal(SPI::CS{GPIO::PortI, GPIO::Pin10}, SPI::DRDY{GPIO::PortD, GPIO::Pin11}), + initSPIConfigExternal(SPI::CS{GPIO::PortA, GPIO::Pin15}, SPI::DRDY{GPIO::PortD, GPIO::Pin12}), + }), + +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/accton-godwit/ga1/src/timer_config.cpp b/boards/accton-godwit/ga1/src/timer_config.cpp new file mode 100644 index 0000000000..928f4916f0 --- /dev/null +++ b/boards/accton-godwit/ga1/src/timer_config.cpp @@ -0,0 +1,80 @@ +/**************************************************************************** + * + * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +/* Timer allocation + * + * TIM5_CH4 T FMU_CH1 + * TIM5_CH3 T FMU_CH2 + * TIM5_CH2 T FMU_CH3 + * TIM5_CH1 T FMU_CH4 + * + * TIM4_CH2 T FMU_CH5 + * TIM4_CH3 T FMU_CH6 + * + * TIM12_CH1 T FMU_CH7 + * TIM12_CH2 T FMU_CH8 + * + * TIM1_CH2 T FMU_CAP1 < Capture + * TIM1_CH3 T SPI2_DRDY2_ISM330_INT2 < Capture or GPIO INT + * TIM1_CH1 T SPIX_SYNC > Pulse or GPIO strobe + * + * TIM2_CH3 T HEATER > PWM OUT or GPIO + * + * TIM14_CH1 T BUZZER_1 - Driven by other driver + * TIM8_CH1_IN T FMU_PPM_INPUT - Sampled byt HRT by other driver + */ + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer5, DMA{DMA::Index1}), + initIOTimer(Timer::Timer4, DMA{DMA::Index1}), + initIOTimer(Timer::Timer12), + initIOTimer(Timer::Timer1), + initIOTimer(Timer::Timer2), +}; + +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel4}, {GPIO::PortI, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {GPIO::PortH, GPIO::Pin12}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel2}, {GPIO::PortH, GPIO::Pin11}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {GPIO::PortH, GPIO::Pin10}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel2}, {GPIO::PortD, GPIO::Pin13}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {GPIO::PortD, GPIO::Pin14}), + initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel1}, {GPIO::PortH, GPIO::Pin6}), + initIOTimerChannel(io_timers, {Timer::Timer12, Timer::Channel2}, {GPIO::PortH, GPIO::Pin9}), + initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel2}, {GPIO::PortE, GPIO::Pin11}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/accton-godwit/ga1/src/usb.c b/boards/accton-godwit/ga1/src/usb.c new file mode 100644 index 0000000000..70eebc6fe0 --- /dev/null +++ b/boards/accton-godwit/ga1/src/usb.c @@ -0,0 +1,105 @@ +/**************************************************************************** + * + * Copyright (C) 2016 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file usb.c + * + * Board-specific USB functions. + */ + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include "board_config.h" + +/************************************************************************************ + * Definitions + ************************************************************************************/ + +/************************************************************************************ + * Private Functions + ************************************************************************************/ + +/************************************************************************************ + * Public Functions + ************************************************************************************/ + +/************************************************************************************ + * Name: stm32_usbinitialize + * + * Description: + * Called to setup USB-related GPIO pins for the PX4FMU board. + * + ************************************************************************************/ + +__EXPORT void stm32_usbinitialize(void) +{ + /* The OTG FS has an internal soft pull-up */ + + /* Configure the OTG FS VBUS sensing GPIO, Power On, and Overcurrent GPIOs */ + +#ifdef CONFIG_STM32H7_OTGFS + stm32_configgpio(GPIO_OTGFS_VBUS); +#endif +} + +/************************************************************************************ + * Name: stm32_usbsuspend + * + * Description: + * Board logic must provide the stm32_usbsuspend logic if the USBDEV driver is + * used. This function is called whenever the USB enters or leaves suspend mode. + * This is an opportunity for the board logic to shutdown clocks, power, etc. + * while the USB is suspended. + * + ************************************************************************************/ + +__EXPORT void stm32_usbsuspend(FAR struct usbdev_s *dev, bool resume) +{ + uinfo("resume: %d\n", resume); +}