From 425b268feb1d29893824acaa3630b9816219de78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Mon, 17 Jan 2022 15:45:09 +0100 Subject: [PATCH] boards: add holybro/kakuteh7 known issues: - flash-based params does not work on H7 (due to ECC), so params are on SD card. The last flash sector is still reserved however. - output channel 6 does not support DShot (the implementation does not handle channel gaps) - flashing of the 2. flash bank is much slower (around 3x), than the 1. bank for some unknown reason. - after the BL jumps to the app, there's several seconds passing until stm32_boardinitialize() is called. --- .github/workflows/compile_nuttx.yml | 1 + boards/holybro/kakuteh7/bootloader.px4board | 3 + boards/holybro/kakuteh7/default.px4board | 92 ++++ .../extras/holybro_kakuteh7_bootloader.bin | Bin 0 -> 41552 bytes boards/holybro/kakuteh7/firmware.prototype | 13 + .../holybro/kakuteh7/init/rc.board_defaults | 27 ++ boards/holybro/kakuteh7/init/rc.board_extras | 13 + boards/holybro/kakuteh7/init/rc.board_sensors | 13 + .../nuttx-config/bootloader/defconfig | 93 ++++ .../kakuteh7/nuttx-config/include/board.h | 419 ++++++++++++++++++ .../nuttx-config/include/board_dma_map.h | 40 ++ .../kakuteh7/nuttx-config/nsh/defconfig | 224 ++++++++++ .../nuttx-config/scripts/bootloader_script.ld | 213 +++++++++ .../kakuteh7/nuttx-config/scripts/script.ld | 222 ++++++++++ boards/holybro/kakuteh7/src/CMakeLists.txt | 66 +++ boards/holybro/kakuteh7/src/board_config.h | 211 +++++++++ boards/holybro/kakuteh7/src/bootloader_main.c | 75 ++++ boards/holybro/kakuteh7/src/hw_config.h | 124 ++++++ boards/holybro/kakuteh7/src/i2c.cpp | 38 ++ boards/holybro/kakuteh7/src/init.c | 268 +++++++++++ boards/holybro/kakuteh7/src/led.c | 223 ++++++++++ boards/holybro/kakuteh7/src/spi.cpp | 51 +++ boards/holybro/kakuteh7/src/timer_config.cpp | 55 +++ boards/holybro/kakuteh7/src/usb.c | 105 +++++ 24 files changed, 2589 insertions(+) create mode 100644 boards/holybro/kakuteh7/bootloader.px4board create mode 100644 boards/holybro/kakuteh7/default.px4board create mode 100755 boards/holybro/kakuteh7/extras/holybro_kakuteh7_bootloader.bin create mode 100644 boards/holybro/kakuteh7/firmware.prototype create mode 100644 boards/holybro/kakuteh7/init/rc.board_defaults create mode 100644 boards/holybro/kakuteh7/init/rc.board_extras create mode 100644 boards/holybro/kakuteh7/init/rc.board_sensors create mode 100644 boards/holybro/kakuteh7/nuttx-config/bootloader/defconfig create mode 100644 boards/holybro/kakuteh7/nuttx-config/include/board.h create mode 100644 boards/holybro/kakuteh7/nuttx-config/include/board_dma_map.h create mode 100644 boards/holybro/kakuteh7/nuttx-config/nsh/defconfig create mode 100644 boards/holybro/kakuteh7/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/holybro/kakuteh7/nuttx-config/scripts/script.ld create mode 100644 boards/holybro/kakuteh7/src/CMakeLists.txt create mode 100644 boards/holybro/kakuteh7/src/board_config.h create mode 100644 boards/holybro/kakuteh7/src/bootloader_main.c create mode 100644 boards/holybro/kakuteh7/src/hw_config.h create mode 100644 boards/holybro/kakuteh7/src/i2c.cpp create mode 100644 boards/holybro/kakuteh7/src/init.c create mode 100644 boards/holybro/kakuteh7/src/led.c create mode 100644 boards/holybro/kakuteh7/src/spi.cpp create mode 100644 boards/holybro/kakuteh7/src/timer_config.cpp create mode 100644 boards/holybro/kakuteh7/src/usb.c diff --git a/.github/workflows/compile_nuttx.yml b/.github/workflows/compile_nuttx.yml index 2d26d4bacb..f714865999 100644 --- a/.github/workflows/compile_nuttx.yml +++ b/.github/workflows/compile_nuttx.yml @@ -33,6 +33,7 @@ jobs: holybro_can-gps-v1, holybro_durandal-v1, holybro_kakutef7, + holybro_kakuteh7, holybro_pix32v5, matek_h743-slim, modalai_fc-v1, diff --git a/boards/holybro/kakuteh7/bootloader.px4board b/boards/holybro/kakuteh7/bootloader.px4board new file mode 100644 index 0000000000..19b6e662be --- /dev/null +++ b/boards/holybro/kakuteh7/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/holybro/kakuteh7/default.px4board b/boards/holybro/kakuteh7/default.px4board new file mode 100644 index 0000000000..ac4b629ff9 --- /dev/null +++ b/boards/holybro/kakuteh7/default.px4board @@ -0,0 +1,92 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS3" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS1" +CONFIG_BOARD_SERIAL_RC="/dev/ttyS4" +CONFIG_DRIVERS_ADC_BOARD_ADC=y +CONFIG_COMMON_BAROMETERS=y +CONFIG_DRIVERS_BATT_SMBUS=y +CONFIG_DRIVERS_CAMERA_CAPTURE=y +CONFIG_DRIVERS_CAMERA_TRIGGER=y +CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y +CONFIG_COMMON_DISTANCE_SENSOR=y +CONFIG_DRIVERS_DSHOT=y +CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM20689=y +CONFIG_DRIVERS_IMU_INVENSENSE_MPU6000=y +CONFIG_DRIVERS_OSD=y +CONFIG_COMMON_LIGHT=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_COMMON_OPTICAL_FLOW=y +CONFIG_DRIVERS_POWER_MONITOR_INA226=y +CONFIG_DRIVERS_PWM_OUT=y +CONFIG_DRIVERS_PWM_OUT_SIM=y +CONFIG_DRIVERS_RC_INPUT=y +CONFIG_DRIVERS_ROBOCLAW=y +CONFIG_DRIVERS_RPM=y +CONFIG_DRIVERS_SMART_BATTERY_BATMON=y +CONFIG_COMMON_TELEMETRY=y +CONFIG_DRIVERS_TONE_ALARM=y +CONFIG_MODULES_ATTITUDE_ESTIMATOR_Q=y +CONFIG_MODULES_AIRSPEED_SELECTOR=y +CONFIG_MODULES_BATTERY_STATUS=y +CONFIG_MODULES_CAMERA_FEEDBACK=y +CONFIG_MODULES_COMMANDER=y +CONFIG_MODULES_CONTROL_ALLOCATOR=y +CONFIG_MODULES_DATAMAN=y +CONFIG_MODULES_EKF2=y +CONFIG_MODULES_ESC_BATTERY=y +CONFIG_MODULES_EVENTS=y +CONFIG_MODULES_FLIGHT_MODE_MANAGER=y +CONFIG_MODULES_FW_ATT_CONTROL=y +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_FW_POS_CONTROL_L1=y +CONFIG_MODULES_GYRO_CALIBRATION=y +CONFIG_MODULES_GYRO_FFT=y +CONFIG_MODULES_LAND_DETECTOR=y +CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=y +CONFIG_MODULES_LOAD_MON=y +CONFIG_MODULES_LOGGER=y +CONFIG_MODULES_MAG_BIAS_ESTIMATOR=y +CONFIG_MODULES_MANUAL_CONTROL=y +CONFIG_MODULES_MAVLINK=y +CONFIG_MODULES_MC_ATT_CONTROL=y +CONFIG_MODULES_MC_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_MC_HOVER_THRUST_ESTIMATOR=y +CONFIG_MODULES_MC_POS_CONTROL=y +CONFIG_MODULES_MC_RATE_CONTROL=y +CONFIG_MODULES_NAVIGATOR=y +CONFIG_MODULES_RC_UPDATE=y +CONFIG_MODULES_ROVER_POS_CONTROL=y +CONFIG_MODULES_SENSORS=y +CONFIG_MODULES_SIH=y +CONFIG_MODULES_TEMPERATURE_COMPENSATION=y +CONFIG_MODULES_VMOUNT=y +CONFIG_MODULES_VTOL_ATT_CONTROL=y +CONFIG_SYSTEMCMDS_BL_UPDATE=y +CONFIG_SYSTEMCMDS_ACTUATOR_TEST=y +CONFIG_SYSTEMCMDS_DMESG=y +CONFIG_SYSTEMCMDS_DUMPFILE=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_MIXER=y +CONFIG_SYSTEMCMDS_MOTOR_TEST=y +CONFIG_SYSTEMCMDS_NSHTERM=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_PWM=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y +CONFIG_SYSTEMCMDS_SD_STRESS=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_TUNE_CONTROL=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_USB_CONNECTED=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y diff --git a/boards/holybro/kakuteh7/extras/holybro_kakuteh7_bootloader.bin b/boards/holybro/kakuteh7/extras/holybro_kakuteh7_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..0b84d3559853bf9d12a72c0a1ce99b8df0f5d7e1 GIT binary patch literal 41552 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 b29GI8PnOwY9Dd(+`n43gW|8!ZZpQu#u9P<} literal 0 HcmV?d00001 diff --git a/boards/holybro/kakuteh7/firmware.prototype b/boards/holybro/kakuteh7/firmware.prototype new file mode 100644 index 0000000000..8081ade635 --- /dev/null +++ b/boards/holybro/kakuteh7/firmware.prototype @@ -0,0 +1,13 @@ +{ + "board_id": 1048, + "magic": "PX4FWv1", + "description": "Firmware for the KakuteH7 board", + "image": "", + "build_time": 0, + "summary": "KAKUTEH7", + "version": "0.1", + "image_size": 0, + "image_maxsize": 1835008, + "git_identity": "", + "board_revision": 0 +} diff --git a/boards/holybro/kakuteh7/init/rc.board_defaults b/boards/holybro/kakuteh7/init/rc.board_defaults new file mode 100644 index 0000000000..9adff92894 --- /dev/null +++ b/boards/holybro/kakuteh7/init/rc.board_defaults @@ -0,0 +1,27 @@ +#!/bin/sh +# +# board specific defaults +#------------------------------------------------------------------------------ + +param set-default BAT1_V_DIV 11.2 +param set-default BAT1_A_PER_V 59.5 + +# system_power unavailable +param set-default CBRK_SUPPLY_CHK 894281 + +# Select the Generic 250 Racer by default +param set-default SYS_AUTOSTART 4050 + +# use the Q attitude estimator, it works w/o mag or GPS. +param set-default SYS_MC_EST_GROUP 3 +param set-default ATT_ACC_COMP 0 +param set-default ATT_W_ACC 0.4000 +param set-default ATT_W_GYRO_BIAS 0.0000 + +param set-default SYS_HAS_MAG 0 + +# the startup tune is not great on a binary output buzzer, so disable it +param set-default CBRK_BUZZER 782090 + +param set-default IMU_GYRO_RATEMAX 2000 + diff --git a/boards/holybro/kakuteh7/init/rc.board_extras b/boards/holybro/kakuteh7/init/rc.board_extras new file mode 100644 index 0000000000..256633f33c --- /dev/null +++ b/boards/holybro/kakuteh7/init/rc.board_extras @@ -0,0 +1,13 @@ +#!/bin/sh +# +# KakuteH7 specific board extras init +#------------------------------------------------------------------------------ + +if ! param compare OSD_ATXXXX_CFG 0 +then + atxxxx start -s +fi + +# DShot telemetry is always on UART7 +dshot telemetry /dev/ttyS5 + diff --git a/boards/holybro/kakuteh7/init/rc.board_sensors b/boards/holybro/kakuteh7/init/rc.board_sensors new file mode 100644 index 0000000000..2711927fe3 --- /dev/null +++ b/boards/holybro/kakuteh7/init/rc.board_sensors @@ -0,0 +1,13 @@ +#!/bin/sh +# +# Holybro KakuteH7 specific board sensors init +#------------------------------------------------------------------------------ +board_adc start + +# The default IMU is an ICM20689, but there might also be an MPU6000 +if ! mpu6000 -R 6 -s start +then + icm20689 -R 6 -s start +fi + +bmp280 -X start diff --git a/boards/holybro/kakuteh7/nuttx-config/bootloader/defconfig b/boards/holybro/kakuteh7/nuttx-config/bootloader/defconfig new file mode 100644 index 0000000000..97b6db2867 --- /dev/null +++ b/boards/holybro/kakuteh7/nuttx-config/bootloader/defconfig @@ -0,0 +1,93 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DEV_CONSOLE is not set +# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set +# CONFIG_SPI_EXCHANGE is not set +# CONFIG_STM32H7_SYSCFG is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/holybro/kakuteh7/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743VI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=512 +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_INITTHREAD_PRIORITY=254 +CONFIG_BOARD_LATE_INITIALIZE=y +CONFIG_BOARD_LOOPSPERMSEC=22114 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_C99_BOOL8=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x004b +CONFIG_CDCACM_PRODUCTSTR="PX4 BL Holybro KakuteH7" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x3162 +CONFIG_CDCACM_VENDORSTR="Holybro" +CONFIG_CLOCK_MONOTONIC=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEFAULT_SMALL=y +CONFIG_DISABLE_MQUEUE=y +CONFIG_DISABLE_PTHREAD=y +CONFIG_EXPERIMENTAL=y +CONFIG_FDCLONE_DISABLE=y +CONFIG_FDCLONE_STDIO=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=750 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_STRERROR=y +CONFIG_LIB_BOARDCTL=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_RAM_SIZE=245760 +CONFIG_RAM_START=0x20010000 +CONFIG_RAW_BINARY=y +CONFIG_SDCLONE_DISABLE=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_SIG_DEFAULT=y +CONFIG_SIG_SIGALRM_ACTION=y +CONFIG_SIG_SIGUSR1_ACTION=y +CONFIG_SIG_SIGUSR2_ACTION=y +CONFIG_SPI=y +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_BUFFER_SIZE=32 +CONFIG_STM32H7_BKPSRAM=y +CONFIG_STM32H7_DMA1=y +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_USART3=y +CONFIG_SYSTEMTICK_HOOK=y +CONFIG_SYSTEM_CDCACM=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_TTY_SIGINT=y +CONFIG_TTY_SIGINT_CHAR=0x03 +CONFIG_TTY_SIGTSTP=y +CONFIG_USART3_RXBUFSIZE=600 +CONFIG_USART3_TXBUFSIZE=300 +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 +CONFIG_USERMAIN_STACKSIZE=2944 +CONFIG_USER_ENTRYPOINT="bootloader_main" diff --git a/boards/holybro/kakuteh7/nuttx-config/include/board.h b/boards/holybro/kakuteh7/nuttx-config/include/board.h new file mode 100644 index 0000000000..83245ff925 --- /dev/null +++ b/boards/holybro/kakuteh7/nuttx-config/include/board.h @@ -0,0 +1,419 @@ +/************************************************************************************ + * + * Copyright (C) 2016-2019 Gregory Nutt. 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 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. + * + ************************************************************************************/ +#pragma once + +/************************************************************************************ + * 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 holybro KakuteH7 board provides the following clock sources: + * + * X1: 8 MHz crystal for HSE + * + * So we have these clock source available within the STM32 + * + * HSI: 16 MHz RC factory-trimmed + * HSE: 8 MHz crystal for HSE + */ + +#define STM32_BOARD_XTAL 8000000ul + +#define STM32_HSI_FREQUENCY 16000000ul +#define STM32_LSI_FREQUENCY 32000 +#define STM32_HSE_FREQUENCY STM32_BOARD_XTAL +#define STM32_LSE_FREQUENCY 32768 + +/* Main PLL Configuration. + * + * PLL source is HSE = 8,000,000 + * + * PLL_VCOx = (STM32_HSE_FREQUENCY / PLLM) * PLLN + * Subject to: + * + * 1 <= PLLM <= 63 + * 4 <= PLLN <= 512 + * 150 MHz <= PLL_VCOL <= 420MHz + * 192 MHz <= PLL_VCOH <= 836MHz + * + * SYSCLK = PLL_VCO / PLLP + * CPUCLK = SYSCLK / D1CPRE + * Subject to + * + * PLLP1 = {2, 4, 6, 8, ..., 128} + * PLLP2,3 = {2, 3, 4, ..., 128} + * CPUCLK <= 480 MHz + */ + +#define STM32_BOARD_USEHSE + +#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE + +/* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR + * + * PLL1_VCO = (8,000,000 / 1) * 120 = 960 MHz + * + * PLL1P = PLL1_VCO/2 = 960 MHz / 2 = 480 MHz + * PLL1Q = PLL1_VCO/4 = 960 MHz / 4 = 240 MHz + * PLL1R = PLL1_VCO/8 = 960 MHz / 8 = 120 MHz + */ + +#define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL1RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP1EN | \ + RCC_PLLCFGR_DIVQ1EN | \ + RCC_PLLCFGR_DIVR1EN) +#define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(1) +#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(120) +#define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) +#define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(4) +#define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) + +#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 120) +#define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) +#define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 4) +#define STM32_PLL1R_FREQUENCY (STM32_VCO1_FREQUENCY / 8) + +/* PLL2 */ + +#define STM32_PLLCFG_PLL2CFG (RCC_PLLCFGR_PLL2VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL2RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP2EN | \ + RCC_PLLCFGR_DIVQ2EN | \ + RCC_PLLCFGR_DIVR2EN) +#define STM32_PLLCFG_PLL2M RCC_PLLCKSELR_DIVM2(2) +#define STM32_PLLCFG_PLL2N RCC_PLL2DIVR_N2(48) +#define STM32_PLLCFG_PLL2P RCC_PLL2DIVR_P2(2) +#define STM32_PLLCFG_PLL2Q RCC_PLL2DIVR_Q2(2) +#define STM32_PLLCFG_PLL2R RCC_PLL2DIVR_R2(2) + +#define STM32_VCO2_FREQUENCY ((STM32_HSE_FREQUENCY / 2) * 48) +#define STM32_PLL2P_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2Q_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2R_FREQUENCY (STM32_VCO2_FREQUENCY / 2) + +/* PLL3 */ + +#define STM32_PLLCFG_PLL3CFG (RCC_PLLCFGR_PLL3VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL3RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVQ3EN) +#define STM32_PLLCFG_PLL3M RCC_PLLCKSELR_DIVM3(2) +#define STM32_PLLCFG_PLL3N RCC_PLL3DIVR_N3(48) +#define STM32_PLLCFG_PLL3P RCC_PLL3DIVR_P3(2) +#define STM32_PLLCFG_PLL3Q RCC_PLL3DIVR_Q3(4) +#define STM32_PLLCFG_PLL3R RCC_PLL3DIVR_R3(2) + +#define STM32_VCO3_FREQUENCY ((STM32_HSE_FREQUENCY / 2) * 48) +#define STM32_PLL3P_FREQUENCY (STM32_VCO3_FREQUENCY / 2) +#define STM32_PLL3Q_FREQUENCY (STM32_VCO3_FREQUENCY / 4) +#define STM32_PLL3R_FREQUENCY (STM32_VCO3_FREQUENCY / 2) + +/* SYSCLK = PLL1P = 480MHz + * CPUCLK = SYSCLK / 1 = 480 MHz + */ + +#define STM32_RCC_D1CFGR_D1CPRE (RCC_D1CFGR_D1CPRE_SYSCLK) +#define STM32_SYSCLK_FREQUENCY (STM32_PLL1P_FREQUENCY) +#define STM32_CPUCLK_FREQUENCY (STM32_SYSCLK_FREQUENCY / 1) + +/* Configure Clock Assignments */ + +/* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) + * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 + */ + +#define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ +#define STM32_ACLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* ACLK in D1, HCLK3 in D1 */ +#define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ +#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ + +/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ +#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ +#define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ +#define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ + +#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ +#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* Timer clock frequencies */ + +/* Timers driven from APB1 will be twice PCLK1 */ + +#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) + +/* Timers driven from APB2 will be twice PCLK2 */ + +#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) + +/* Kernel Clock Configuration + * + * Note: look at Table 54 in ST Manual + */ + +/* I2C123 clock source */ + +#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI + +/* I2C4 clock source */ + +#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI + +/* SPI123 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 + +/* SPI45 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 + +/* SPI6 clock source */ + +#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 + +/* USB 1 and 2 clock source */ + +#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 + +/* ADC 1 2 3 clock source */ + +#define STM32_RCC_D3CCIPR_ADCSEL RCC_D3CCIPR_ADCSEL_PLL2 + +/* FDCAN 1 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 holybro KakuteH7 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_NLEDS 1 + +#define BOARD_LED_RED BOARD_LED1 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) + +/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in + * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related + * events as follows: + * + * + * SYMBOL Meaning LED state + * Red Green Blue + * ---------------------- -------------------------- ------ ------ ----*/ + +#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ +#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ +#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ +#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ +#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ +#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ +#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ +#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ +#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ + +/* Thus if the Green LED is statically on, NuttX has successfully booted and + * is, apparently, running normally. If the Red LED is flashing at + * approximately 2Hz, then a fatal error has been detected and the system + * has halted. + */ + +/* Alternate function pin selections ************************************************/ + + +#define GPIO_USART1_RX GPIO_USART1_RX_2 /* PA10 */ +#define GPIO_USART1_TX GPIO_USART1_TX_2 /* PA9 */ + +#define GPIO_USART2_RX GPIO_USART2_RX_2 /* PD6 */ +#define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ + +#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ +#define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ + +#define GPIO_UART4_RX GPIO_UART4_RX_5 /* PD0 */ +#define GPIO_UART4_TX GPIO_UART4_TX_5 /* PD1 */ + +#define GPIO_USART6_RX GPIO_USART6_RX_1 /* PC7 */ +#define GPIO_USART6_TX GPIO_USART6_TX_1 /* PC6 */ + +#define GPIO_UART7_RX GPIO_UART7_RX_3 /* PE7 */ +#define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ + +/* SPI + * SPI1 SD Card + * SPI2 is OSD AT7456E + * SPI4 is IMU + */ + +#define GPIO_SPI1_MISO GPIO_SPI1_MISO_1 /* PA6 */ +#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_1 /* PA7 */ +#define GPIO_SPI1_SCK GPIO_SPI1_SCK_1 /* PA5 */ + +#define GPIO_SPI2_MISO GPIO_SPI2_MISO_1 /* PB14 */ +#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_1 /* PB15 */ +#define GPIO_SPI2_SCK GPIO_SPI2_SCK_4 /* PB13 */ + +#define GPIO_SPI4_MISO GPIO_SPI4_MISO_2 /* PE5 */ +#define GPIO_SPI4_MOSI GPIO_SPI4_MOSI_2 /* PE6 */ +#define GPIO_SPI4_SCK GPIO_SPI4_SCK_2 /* PE2 */ + +/* I2C + */ + +#define GPIO_I2C1_SCL GPIO_I2C1_SCL_1 /* PB6 */ +#define GPIO_I2C1_SDA GPIO_I2C1_SDA_1 /* PB7 */ + +#define GPIO_I2C1_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN6) +#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN7) + +/* SDMMC1 + * + * VDD 3.3 + * GND + * SDMMC1_CK PC12 + * SDMMC1_CMD PD2 + * SDMMC1_D0 PC8 + * SDMMC1_D1 PC9 + * SDMMC1_D2 PC10 + * SDMMC1_D3 PC11 + * GPIO_SDMMC1_NCD PG0 + */ + +/* USB + * + * OTG_FS_DM PA11 + * OTG_FS_DP PA12 + * VBUS PA9 + */ + + +/* Board provides GPIO or other Hardware for signaling to timing analyzer */ + +# define PROBE_INIT(mask) +# define PROBE(n,s) +# define PROBE_MARK(n) + diff --git a/boards/holybro/kakuteh7/nuttx-config/include/board_dma_map.h b/boards/holybro/kakuteh7/nuttx-config/include/board_dma_map.h new file mode 100644 index 0000000000..1954ce3e68 --- /dev/null +++ b/boards/holybro/kakuteh7/nuttx-config/include/board_dma_map.h @@ -0,0 +1,40 @@ +/**************************************************************************** + * + * 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 + +#define DMAMAP_SPI4_RX DMAMAP_DMA12_SPI4RX_1 /* DMA2 */ +#define DMAMAP_SPI4_TX DMAMAP_DMA12_SPI4TX_1 /* DMA2 */ + +#define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_1 /* DMA2 */ + diff --git a/boards/holybro/kakuteh7/nuttx-config/nsh/defconfig b/boards/holybro/kakuteh7/nuttx-config/nsh/defconfig new file mode 100644 index 0000000000..1b3ab69e68 --- /dev/null +++ b/boards/holybro/kakuteh7/nuttx-config/nsh/defconfig @@ -0,0 +1,224 @@ +# +# 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_MMCSD_HAVE_CARDDETECT is not set +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_DF is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_EXIT is not set +# CONFIG_NSH_DISABLE_GET is not set +# CONFIG_NSH_DISABLE_ITEF is not set +# CONFIG_NSH_DISABLE_LOOPS is not set +# CONFIG_NSH_DISABLE_MKFATFS is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_TIME is not set +# CONFIG_SPI_CALLBACK is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/holybro/kakuteh7/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743II=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=512 +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_CRASHDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_C99_BOOL8=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x004b +CONFIG_CDCACM_PRODUCTSTR="PX4 KakuteH7" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x3162 +CONFIG_CDCACM_VENDORSTR="Holybro" +CONFIG_CLOCK_MONOTONIC=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_MEMFAULT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEFAULT_SMALL=y +CONFIG_DEV_FIFO_SIZE=0 +CONFIG_DEV_PIPE_MAXSIZE=1024 +CONFIG_DEV_PIPE_SIZE=70 +CONFIG_EXPERIMENTAL=y +CONFIG_FAT_DMAMEMORY=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FAT_LFN_ALIAS_HASH=y +CONFIG_FDCLONE_STDIO=y +CONFIG_FS_BINFS=y +CONFIG_FS_CROMFS=y +CONFIG_FS_FAT=y +CONFIG_FS_FATTIME=y +CONFIG_FS_PROCFS=y +CONFIG_FS_PROCFS_INCLUDE_PROGMEM=y +CONFIG_FS_PROCFS_MAX_TASKS=64 +CONFIG_FS_PROCFS_REGISTER=y +CONFIG_FS_ROMFS=y +CONFIG_GRAN=y +CONFIG_GRAN_INTR=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_I2C=y +CONFIG_I2C_RESET=y +CONFIG_IDLETHREAD_STACKSIZE=750 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_MM_REGIONS=4 +CONFIG_MTD=y +CONFIG_MTD_BYTE_WRITE=y +CONFIG_MTD_PARTITION=y +CONFIG_MTD_PROGMEM=y +CONFIG_MTD_RAMTRON=y +CONFIG_NAME_MAX=40 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_ARGCAT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_CMDPARMS=y +CONFIG_NSH_CROMFSETC=y +CONFIG_NSH_DISABLE_IFCONFIG=y +CONFIG_NSH_DISABLE_IFUPDOWN=y +CONFIG_NSH_DISABLE_TELNETD=y +CONFIG_NSH_LINELEN=128 +CONFIG_NSH_MAXARGUMENTS=15 +CONFIG_NSH_MMCSDSPIPORTNO=1 +CONFIG_NSH_NESTDEPTH=8 +CONFIG_NSH_QUOTE=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSSECTSIZE=128 +CONFIG_NSH_STRERROR=y +CONFIG_NSH_VARS=y +CONFIG_OTG_ID_GPIO_DISABLE=y +CONFIG_PIPES=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PRIORITY_INHERITANCE=y +CONFIG_PTHREAD_MUTEX_ROBUST=y +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_RAMTRON_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_ATEXIT=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKPRIORITY=249 +CONFIG_SCHED_HPWORKSTACKSIZE=1280 +CONFIG_SCHED_INSTRUMENTATION=y +CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_LPWORKPRIORITY=50 +CONFIG_SCHED_LPWORKSTACKSIZE=1632 +CONFIG_SCHED_WAITPID=y +CONFIG_SDCLONE_DISABLE=y +CONFIG_SEM_NNESTPRIO=8 +CONFIG_SEM_PREALLOCHOLDERS=0 +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_FLOWCONTROL_BROKEN=y +CONFIG_STM32H7_I2C1=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_RTC=y +CONFIG_STM32H7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y +CONFIG_STM32H7_RTC_MAGIC_REG=1 +CONFIG_STM32H7_SAVE_CRASHDUMP=y +CONFIG_STM32H7_SDMMC1=y +CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_SPI1=y +CONFIG_STM32H7_SPI2=y +CONFIG_STM32H7_SPI4=y +CONFIG_STM32H7_SPI4_DMA=y +CONFIG_STM32H7_SPI4_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI_DMA=y +CONFIG_STM32H7_UART4=y +CONFIG_STM32H7_UART7=y +CONFIG_STM32H7_USART1=y +CONFIG_STM32H7_USART2=y +CONFIG_STM32H7_USART3=y +CONFIG_STM32H7_USART6=y +CONFIG_STM32H7_USART_BREAKS=y +CONFIG_STM32H7_USART_INVERT=y +CONFIG_STM32H7_USART_SINGLEWIRE=y +CONFIG_STM32H7_USART_SWAP=y +CONFIG_SYSTEM_CDCACM=y +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=24 +CONFIG_TTY_SIGINT=y +CONFIG_TTY_SIGTSTP=y +CONFIG_UART4_BAUD=57600 +CONFIG_UART4_RXBUFSIZE=600 +CONFIG_UART4_TXBUFSIZE=1500 +CONFIG_UART7_BAUD=57600 +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_TXBUFSIZE=1500 +CONFIG_USART1_BAUD=57600 +CONFIG_USART1_RXBUFSIZE=600 +CONFIG_USART1_TXBUFSIZE=1500 +CONFIG_USART2_BAUD=57600 +CONFIG_USART2_RXBUFSIZE=600 +CONFIG_USART2_RXDMA=y +CONFIG_USART2_TXBUFSIZE=2500 +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=600 +CONFIG_USART3_SERIAL_CONSOLE=y +CONFIG_USART3_TXBUFSIZE=1500 +CONFIG_USART6_BAUD=57600 +CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 +CONFIG_USERMAIN_STACKSIZE=2944 +CONFIG_USER_ENTRYPOINT="nsh_main" +CONFIG_WATCHDOG=y diff --git a/boards/holybro/kakuteh7/nuttx-config/scripts/bootloader_script.ld b/boards/holybro/kakuteh7/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 0000000000..6f9f9e1b5f --- /dev/null +++ b/boards/holybro/kakuteh7/nuttx-config/scripts/bootloader_script.ld @@ -0,0 +1,213 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The KakuteH7 uses an STM32H743VI has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743VI, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * The KakuteH7 has a Swtich on board, the BOOT0 pin is at ground so by default, + * the STM32 will boot to address 0x0800:0000 in FLASH unless the swiutch is + * drepresed, then the boot will be from 0x1FF0:0000 + * + * The STM32H743VI also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + */ + +MEMORY +{ + itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + flash (rx) : ORIGIN = 0x08000000, LENGTH = 2048K + dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K + sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K + sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K + sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K + sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K + sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K + bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) +EXTERN(_bootdelay_signature) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + . = ALIGN(32); + /* + This signature provides the bootloader with a way to delay booting + */ + _bootdelay_signature = ABSOLUTE(.); + FILL(0xffecc2925d7d05c5) + . += 8; + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + + } > flash + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > flash + + + .ARM.extab : { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + } > sram AT > flash + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/holybro/kakuteh7/nuttx-config/scripts/script.ld b/boards/holybro/kakuteh7/nuttx-config/scripts/script.ld new file mode 100644 index 0000000000..94851f10d5 --- /dev/null +++ b/boards/holybro/kakuteh7/nuttx-config/scripts/script.ld @@ -0,0 +1,222 @@ +/**************************************************************************** + * 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 KakuteH7 uses an STM32H743VI has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743VI, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * The KakuteH7 has a Swtich on board, the BOOT0 pin is at ground so by default, + * the STM32 will boot to address 0x0800:0000 in FLASH unless the swiutch is + * drepresed, then the boot will be from 0x1FF0:0000 + * + * The STM32H743VI also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + */ + +MEMORY +{ + itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + flash (rx) : ORIGIN = 0x08020000, LENGTH = 1792K /* params in last sector */ + 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 + + /* 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/holybro/kakuteh7/src/CMakeLists.txt b/boards/holybro/kakuteh7/src/CMakeLists.txt new file mode 100644 index 0000000000..26fc9de8fc --- /dev/null +++ b/boards/holybro/kakuteh7/src/CMakeLists.txt @@ -0,0 +1,66 @@ +############################################################################ +# +# 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_library(drivers_board + bootloader_main.c + usb.c + ) + target_link_libraries(drivers_board + PRIVATE + nuttx_arch # sdio + nuttx_drivers # sdio + bootloader + ) + target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) + +else() + add_library(drivers_board + i2c.cpp + init.c + led.c + spi.cpp + timer_config.cpp + usb.c + ) + add_dependencies(drivers_board arch_board_hw_info) + + target_link_libraries(drivers_board + PRIVATE + arch_spi + arch_board_hw_info + drivers__led # drv_led_start + nuttx_arch # sdio + nuttx_drivers # sdio + px4_layer + ) +endif() diff --git a/boards/holybro/kakuteh7/src/board_config.h b/boards/holybro/kakuteh7/src/board_config.h new file mode 100644 index 0000000000..78c2d67ea6 --- /dev/null +++ b/boards/holybro/kakuteh7/src/board_config.h @@ -0,0 +1,211 @@ +/**************************************************************************** + * + * Copyright (c) 2019 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 + * + * holybro KakuteH7 internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include + +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +/* Configuration ************************************************************************************/ + +# define BOARD_HAS_USB_VALID 1 +# define BOARD_HAS_NBAT_V 1 +# define BOARD_HAS_NBAT_I 1 + +/* Holybro KakuteH7 GPIOs ************************************************************************/ + +/* LEDs are driven with push open drain to support Anode to 5V or 3.3V */ + +#define GPIO_nLED_RED /* PC2 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN2) + +#define BOARD_HAS_CONTROL_STATUS_LEDS 1 +#define BOARD_OVERLOAD_LED LED_RED + +/* + * 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) + +/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ + +#define PX4_ADC_GPIO \ + /* PC0 */ GPIO_ADC123_INP10, \ + /* PC1 */ GPIO_ADC123_INP11, \ + /* PC5 */ GPIO_ADC12_INP8 + +/* Define Channel numbers must match above GPIO pin IN(n)*/ + +#define ADC_BATTERY_VOLTAGE_CHANNEL /* PC0 */ ADC1_CH(10) +#define ADC_BATTERY_CURRENT_CHANNEL /* PC1 */ ADC1_CH(11) +#define ADC_RSSI_IN_CHANNEL /* PC5 */ ADC1_CH(8) + +#define ADC_CHANNELS \ + ((1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL) | \ + (1 << ADC_RSSI_IN_CHANNEL)) + +#define BOARD_ADC_OPEN_CIRCUIT_V (5.6f) + + + +/* PWM + */ +#define DIRECT_PWM_OUTPUT_CHANNELS 8 + +#define BOARD_NUM_IO_TIMERS 4 + + +/* Tone alarm output */ + +#define GPIO_TONE_ALARM_IDLE /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) +#define GPIO_TONE_ALARM_GPIO /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN13) + +/* USB OTG FS + * + * PA9 OTG_FS_VBUS VBUS sensing + */ +#define GPIO_OTGFS_VBUS /* PA8 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN8) + +/* High-resolution timer */ +#define HRT_TIMER 4 /* use timer3 for the HRT */ +#define HRT_TIMER_CHANNEL 1 /* use capture/compare channel 1 */ + +/* RC Serial port */ + +/* PWM input driver. Use FMU AUX5 pins attached to timer4 channel 2 */ + +#define PWMIN_TIMER 5 +#define PWMIN_TIMER_CHANNEL /* T5C1 */ 1 +#define GPIO_PWM_IN /* PA0 */ GPIO_TIM5_CH1IN + +#define GPIO_RSSI_IN /* PC5 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTC|GPIO_PIN5) + +/* Power switch controls ******************************************************/ + +#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_LIB_BOARDCTL=y, OR + * CONFIG_BOARD_INITIALIZE=y && CONFIG_BOARD_INITTHREAD=y + */ + +#if defined(CONFIG_BOARD_INITIALIZE) && !defined(CONFIG_LIB_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)) + +/* Board never powers off the Servo rail */ + +#define BOARD_ADC_SERVO_VALID (1) + +#define BOARD_ADC_BRICK1_VALID (1) + + + +/* This board provides a DMA pool and APIs */ +#define BOARD_DMA_ALLOC_POOL_SIZE 5120 + +/* This board provides the board_on_reset interface */ + +#define BOARD_HAS_ON_RESET 1 + +#define PX4_GPIO_INIT_LIST { \ + PX4_ADC_GPIO, \ + GPIO_TONE_ALARM_IDLE, \ + GPIO_RSSI_IN, \ + } + +#define BOARD_ENABLE_CONSOLE_BUFFER + +// not working on h7 yet, due to ECC +//#define FLASH_BASED_PARAMS + +__BEGIN_DECLS + +/**************************************************************************************************** + * Public Types + ****************************************************************************************************/ + +/**************************************************************************************************** + * Public data + ****************************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************************************** + * Public Functions + ****************************************************************************************************/ + +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/holybro/kakuteh7/src/bootloader_main.c b/boards/holybro/kakuteh7/src/bootloader_main.c new file mode 100644 index 0000000000..915b7f3d29 --- /dev/null +++ b/boards/holybro/kakuteh7/src/bootloader_main.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * + * 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); + +__EXPORT void board_on_reset(int status) {} + +__EXPORT void stm32_boardinitialize(void) +{ + /* configure USB interfaces */ + stm32_usbinitialize(); +} + +__EXPORT int board_app_initialize(uintptr_t arg) +{ + return 0; +} + +void board_late_initialize(void) +{ + sercon_main(0, NULL); +} + +extern void sys_tick_handler(void); +void board_timerhook(void) +{ + sys_tick_handler(); +} diff --git a/boards/holybro/kakuteh7/src/hw_config.h b/boards/holybro/kakuteh7/src/hw_config.h new file mode 100644 index 0000000000..80f014f010 --- /dev/null +++ b/boards/holybro/kakuteh7/src/hw_config.h @@ -0,0 +1,124 @@ +/* + * 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 3000 +#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 BOOT_DELAY_ADDRESS 0x000001a0 +#define BOARD_TYPE 1048 +#define BOARD_FLASH_SECTORS (14) +#define BOARD_FLASH_SIZE ((16-2) * 128 * 1024) + +#define OSC_FREQ 8 + +#define BOARD_PIN_LED_ACTIVITY GPIO_nLED_RED +#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/holybro/kakuteh7/src/i2c.cpp b/boards/holybro/kakuteh7/src/i2c.cpp new file mode 100644 index 0000000000..e9f26f9a9e --- /dev/null +++ b/boards/holybro/kakuteh7/src/i2c.cpp @@ -0,0 +1,38 @@ +/**************************************************************************** + * + * 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), +}; diff --git a/boards/holybro/kakuteh7/src/init.c b/boards/holybro/kakuteh7/src/init.c new file mode 100644 index 0000000000..0d4667733f --- /dev/null +++ b/boards/holybro/kakuteh7/src/init.c @@ -0,0 +1,268 @@ +/**************************************************************************** + * + * Copyright (c) 2012-2019 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file init.c + * + * 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 initialisation. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "board_config.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "arm_internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +# if defined(FLASH_BASED_PARAMS) +# include +#endif + + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +__END_DECLS + + +/************************************************************************************ + * Name: board_peripheral_reset + * + * Description: + * + ************************************************************************************/ +__EXPORT void board_peripheral_reset(int ms) +{ +} + +/************************************************************************************ + * Name: board_on_reset + * + * Description: + * Optionally provided function called on entry to board_system_reset + * It should perform any house keeping prior to the rest. + * + * status - 1 if resetting to boot loader + * 0 if just resetting + * + ************************************************************************************/ +__EXPORT void board_on_reset(int status) +{ + for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { + px4_arch_configgpio(PX4_MAKE_GPIO_INPUT(io_timer_channel_get_as_pwm_input(i))); + } + + if (status >= 0) { + up_mdelay(6); + } +} + +/************************************************************************************ + * Name: stm32_boardinitialize + * + * Description: + * All STM32 architectures must provide the following entry point. This entry point + * is called early in the initialization -- after all memory has been configured + * and mapped but before any devices have been initialized. + * + ************************************************************************************/ + +__EXPORT void +stm32_boardinitialize(void) +{ + board_on_reset(-1); /* Reset PWM first thing */ + + /* configure LEDs */ + + board_autoled_initialize(); + + /* configure pins */ + + const uint32_t gpio[] = PX4_GPIO_INIT_LIST; + px4_gpio_init(gpio, arraySize(gpio)); + + board_control_spi_sensors_power_configgpio(); + + /* configure USB interfaces */ + + stm32_usbinitialize(); + +} + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; the meaning of the argument is a contract + * between the board-specific initalization logic and the the + * matching application logic. The value cold be such things as a + * mode enumeration value, a set of DIP switch switch settings, a + * pointer to configuration data read from a file or serial FLASH, + * or whatever you would like to do with it. Every implementation + * should accept zero/NULL as a default configuration. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ + + +__EXPORT int board_app_initialize(uintptr_t arg) +{ + /* Power on Interfaces */ + board_control_spi_sensors_power(true, 0xffff); + + /* Need hrt running before using the ADC */ + + px4_platform_init(); + + /* configure SPI interfaces */ + + stm32_spiinitialize(); + + /* 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); + + if (board_hardfault_init(2, true) != 0) { + led_on(LED_RED); + } + + /* Get the SPI port for the microSD slot */ + struct spi_dev_s *spi_dev = stm32_spibus_initialize(CONFIG_NSH_MMCSDSPIPORTNO); + + if (!spi_dev) { + syslog(LOG_ERR, "[boot] FAILED to initialize SPI port %d\n", CONFIG_NSH_MMCSDSPIPORTNO); + led_on(LED_BLUE); + } + + /* Now bind the SPI interface to the MMCSD driver */ + int result = mmcsd_spislotinitialize(CONFIG_NSH_MMCSDMINOR, CONFIG_NSH_MMCSDSLOTNO, spi_dev); + + if (result != OK) { + led_on(LED_BLUE); + syslog(LOG_ERR, "[boot] FAILED to bind SPI port 1 to the MMCSD driver\n"); + } + + up_udelay(20); + + +#if defined(FLASH_BASED_PARAMS) + static sector_descriptor_t params_sector_map[] = { + {15, 128 * 1024, 0x081E0000}, + {0, 0, 0}, + }; + + /* Initialize the flashfs layer to use heap allocated memory */ + result = parameter_flashfs_init(params_sector_map, NULL, 0); + + if (result != OK) { + syslog(LOG_ERR, "[boot] FAILED to init params in FLASH %d\n", result); + led_on(LED_AMBER); + } + +#endif + + /* Configure the HW based on the manifest */ + + px4_platform_configure(); + + return OK; +} diff --git a/boards/holybro/kakuteh7/src/led.c b/boards/holybro/kakuteh7/src/led.c new file mode 100644 index 0000000000..945c383eb7 --- /dev/null +++ b/boards/holybro/kakuteh7/src/led.c @@ -0,0 +1,223 @@ +/**************************************************************************** + * + * 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. + * + ****************************************************************************/ + +#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_RED, // Indexed by BOARD_LED_RED +}; + +#else + +# define xlat(p) (p) +static uint32_t g_ledmap[] = { + GPIO_nLED_RED, // Indexed by LED_RED, LED_AMBER +}; + +#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/holybro/kakuteh7/src/spi.cpp b/boards/holybro/kakuteh7/src/spi.cpp new file mode 100644 index 0000000000..d188e04700 --- /dev/null +++ b/boards/holybro/kakuteh7/src/spi.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * Copyright (C) 2020, 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +#include + +constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { + initSPIBus(SPI::Bus::SPI1, { + initSPIDevice(SPIDEV_MMCSD(0), SPI::CS{GPIO::PortA, GPIO::Pin4}) + }), + initSPIBus(SPI::Bus::SPI2, { + initSPIDevice(DRV_OSD_DEVTYPE_ATXXXX, SPI::CS{GPIO::PortB, GPIO::Pin12}), + }), + initSPIBus(SPI::Bus::SPI4, { + initSPIDevice(DRV_IMU_DEVTYPE_ICM20689, SPI::CS{GPIO::PortE, GPIO::Pin4}, SPI::DRDY{GPIO::PortE, GPIO::Pin1}), + initSPIDevice(DRV_IMU_DEVTYPE_MPU6000, SPI::CS{GPIO::PortE, GPIO::Pin4}, SPI::DRDY{GPIO::PortE, GPIO::Pin1}), + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/holybro/kakuteh7/src/timer_config.cpp b/boards/holybro/kakuteh7/src/timer_config.cpp new file mode 100644 index 0000000000..20eb0f15d8 --- /dev/null +++ b/boards/holybro/kakuteh7/src/timer_config.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * 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 + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer3, DMA{DMA::Index1}), + initIOTimer(Timer::Timer2, DMA{DMA::Index1}), + initIOTimer(Timer::Timer5, DMA{DMA::Index1}), + initIOTimer(Timer::Timer8, DMA{DMA::Index1}), +}; + +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel3}, {GPIO::PortB, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel4}, {GPIO::PortB, GPIO::Pin1}), + initIOTimerChannel(io_timers, {Timer::Timer2, Timer::Channel2}, {GPIO::PortB, GPIO::Pin3}), + initIOTimerChannel(io_timers, {Timer::Timer2, Timer::Channel3}, {GPIO::PortB, GPIO::Pin10}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {GPIO::PortA, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {GPIO::PortA, GPIO::Pin2}), + initIOTimerChannel(io_timers, {Timer::Timer8, Timer::Channel3}, {GPIO::PortC, GPIO::Pin8}), + initIOTimerChannel(io_timers, {Timer::Timer8, Timer::Channel4}, {GPIO::PortC, GPIO::Pin9}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/holybro/kakuteh7/src/usb.c b/boards/holybro/kakuteh7/src/usb.c new file mode 100644 index 0000000000..9d5915c0e6 --- /dev/null +++ b/boards/holybro/kakuteh7/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 px4fmu_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); +}