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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 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); +}