From f7bc13dab0d7f5c32a104e7206036d435c4293d3 Mon Sep 17 00:00:00 2001 From: Peize-Liu Date: Tue, 2 Apr 2024 21:49:10 +0800 Subject: [PATCH] boards: new hkust nxt-fc board support (#22961) --- boards/hkust/nxt-dual/bootloader.px4board | 3 + boards/hkust/nxt-dual/default.px4board | 89 +++ .../extras/hkust_nxt-dual_bootloader.bin | Bin 0 -> 43256 bytes boards/hkust/nxt-dual/firmware.prototype | 13 + boards/hkust/nxt-dual/init/rc.board_defaults | 24 + boards/hkust/nxt-dual/init/rc.board_extras | 13 + boards/hkust/nxt-dual/init/rc.board_sensors | 16 + boards/hkust/nxt-dual/nuttx-config/Kconfig | 17 + .../nuttx-config/bootloader/defconfig | 92 ++++ .../nxt-dual/nuttx-config/include/board.h | 487 +++++++++++++++++ .../nuttx-config/include/board_dma_map.h | 62 +++ .../hkust/nxt-dual/nuttx-config/nsh/defconfig | 288 ++++++++++ .../nuttx-config/nsh/old_defconfig.txt | 271 ++++++++++ .../nuttx-config/scripts/bootloader_script.ld | 213 ++++++++ .../nxt-dual/nuttx-config/scripts/script.ld | 228 ++++++++ boards/hkust/nxt-dual/src/CMakeLists.txt | 69 +++ boards/hkust/nxt-dual/src/board_config.h | 230 ++++++++ boards/hkust/nxt-dual/src/bootloader_main.c | 75 +++ boards/hkust/nxt-dual/src/flash_w25q128.c | 505 ++++++++++++++++++ boards/hkust/nxt-dual/src/hw_config.h | 135 +++++ boards/hkust/nxt-dual/src/i2c.cpp | 39 ++ boards/hkust/nxt-dual/src/init.c | 205 +++++++ boards/hkust/nxt-dual/src/led.c | 113 ++++ boards/hkust/nxt-dual/src/manifest.c | 131 +++++ boards/hkust/nxt-dual/src/mtd.cpp | 77 +++ boards/hkust/nxt-dual/src/sdio.c | 177 ++++++ boards/hkust/nxt-dual/src/spi.cpp | 56 ++ boards/hkust/nxt-dual/src/timer_config.cpp | 56 ++ boards/hkust/nxt-dual/src/usb.c | 78 +++ boards/hkust/nxt-v1/bootloader.px4board | 3 + boards/hkust/nxt-v1/default.px4board | 105 ++++ .../nxt-v1/extras/hkust_nxt-v1_bootloader.bin | Bin 0 -> 43248 bytes boards/hkust/nxt-v1/firmware.prototype | 13 + boards/hkust/nxt-v1/init/rc.board_defaults | 6 + boards/hkust/nxt-v1/init/rc.board_extras | 13 + boards/hkust/nxt-v1/init/rc.board_sensors | 16 + boards/hkust/nxt-v1/nuttx-config/Kconfig | 17 + .../nxt-v1/nuttx-config/bootloader/defconfig | 92 ++++ .../hkust/nxt-v1/nuttx-config/include/board.h | 484 +++++++++++++++++ .../nuttx-config/include/board_dma_map.h | 62 +++ .../hkust/nxt-v1/nuttx-config/nsh/defconfig | 272 ++++++++++ .../nuttx-config/scripts/bootloader_script.ld | 213 ++++++++ .../nxt-v1/nuttx-config/scripts/script.ld | 228 ++++++++ boards/hkust/nxt-v1/src/CMakeLists.txt | 68 +++ boards/hkust/nxt-v1/src/board_config.h | 227 ++++++++ boards/hkust/nxt-v1/src/bootloader_main.c | 75 +++ boards/hkust/nxt-v1/src/hw_config.h | 135 +++++ boards/hkust/nxt-v1/src/i2c.cpp | 39 ++ boards/hkust/nxt-v1/src/init.c | 205 +++++++ boards/hkust/nxt-v1/src/led.c | 113 ++++ boards/hkust/nxt-v1/src/mtd.cpp | 81 +++ boards/hkust/nxt-v1/src/sdio.c | 177 ++++++ boards/hkust/nxt-v1/src/spi.cpp | 52 ++ boards/hkust/nxt-v1/src/timer_config.cpp | 55 ++ boards/hkust/nxt-v1/src/usb.c | 78 +++ 55 files changed, 6591 insertions(+) create mode 100644 boards/hkust/nxt-dual/bootloader.px4board create mode 100644 boards/hkust/nxt-dual/default.px4board create mode 100755 boards/hkust/nxt-dual/extras/hkust_nxt-dual_bootloader.bin create mode 100644 boards/hkust/nxt-dual/firmware.prototype create mode 100644 boards/hkust/nxt-dual/init/rc.board_defaults create mode 100644 boards/hkust/nxt-dual/init/rc.board_extras create mode 100644 boards/hkust/nxt-dual/init/rc.board_sensors create mode 100644 boards/hkust/nxt-dual/nuttx-config/Kconfig create mode 100644 boards/hkust/nxt-dual/nuttx-config/bootloader/defconfig create mode 100644 boards/hkust/nxt-dual/nuttx-config/include/board.h create mode 100644 boards/hkust/nxt-dual/nuttx-config/include/board_dma_map.h create mode 100644 boards/hkust/nxt-dual/nuttx-config/nsh/defconfig create mode 100644 boards/hkust/nxt-dual/nuttx-config/nsh/old_defconfig.txt create mode 100644 boards/hkust/nxt-dual/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/hkust/nxt-dual/nuttx-config/scripts/script.ld create mode 100644 boards/hkust/nxt-dual/src/CMakeLists.txt create mode 100644 boards/hkust/nxt-dual/src/board_config.h create mode 100644 boards/hkust/nxt-dual/src/bootloader_main.c create mode 100644 boards/hkust/nxt-dual/src/flash_w25q128.c create mode 100644 boards/hkust/nxt-dual/src/hw_config.h create mode 100644 boards/hkust/nxt-dual/src/i2c.cpp create mode 100644 boards/hkust/nxt-dual/src/init.c create mode 100644 boards/hkust/nxt-dual/src/led.c create mode 100644 boards/hkust/nxt-dual/src/manifest.c create mode 100644 boards/hkust/nxt-dual/src/mtd.cpp create mode 100644 boards/hkust/nxt-dual/src/sdio.c create mode 100644 boards/hkust/nxt-dual/src/spi.cpp create mode 100644 boards/hkust/nxt-dual/src/timer_config.cpp create mode 100644 boards/hkust/nxt-dual/src/usb.c create mode 100644 boards/hkust/nxt-v1/bootloader.px4board create mode 100644 boards/hkust/nxt-v1/default.px4board create mode 100755 boards/hkust/nxt-v1/extras/hkust_nxt-v1_bootloader.bin create mode 100644 boards/hkust/nxt-v1/firmware.prototype create mode 100644 boards/hkust/nxt-v1/init/rc.board_defaults create mode 100644 boards/hkust/nxt-v1/init/rc.board_extras create mode 100644 boards/hkust/nxt-v1/init/rc.board_sensors create mode 100644 boards/hkust/nxt-v1/nuttx-config/Kconfig create mode 100644 boards/hkust/nxt-v1/nuttx-config/bootloader/defconfig create mode 100644 boards/hkust/nxt-v1/nuttx-config/include/board.h create mode 100644 boards/hkust/nxt-v1/nuttx-config/include/board_dma_map.h create mode 100644 boards/hkust/nxt-v1/nuttx-config/nsh/defconfig create mode 100644 boards/hkust/nxt-v1/nuttx-config/scripts/bootloader_script.ld create mode 100644 boards/hkust/nxt-v1/nuttx-config/scripts/script.ld create mode 100644 boards/hkust/nxt-v1/src/CMakeLists.txt create mode 100644 boards/hkust/nxt-v1/src/board_config.h create mode 100644 boards/hkust/nxt-v1/src/bootloader_main.c create mode 100644 boards/hkust/nxt-v1/src/hw_config.h create mode 100644 boards/hkust/nxt-v1/src/i2c.cpp create mode 100644 boards/hkust/nxt-v1/src/init.c create mode 100644 boards/hkust/nxt-v1/src/led.c create mode 100644 boards/hkust/nxt-v1/src/mtd.cpp create mode 100644 boards/hkust/nxt-v1/src/sdio.c create mode 100644 boards/hkust/nxt-v1/src/spi.cpp create mode 100644 boards/hkust/nxt-v1/src/timer_config.cpp create mode 100644 boards/hkust/nxt-v1/src/usb.c diff --git a/boards/hkust/nxt-dual/bootloader.px4board b/boards/hkust/nxt-dual/bootloader.px4board new file mode 100644 index 0000000000..19b6e662be --- /dev/null +++ b/boards/hkust/nxt-dual/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/hkust/nxt-dual/default.px4board b/boards/hkust/nxt-dual/default.px4board new file mode 100644 index 0000000000..8844879555 --- /dev/null +++ b/boards/hkust/nxt-dual/default.px4board @@ -0,0 +1,89 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS2" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS1" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS6" +CONFIG_BOARD_SERIAL_TEL4="/dev/ttyS7" +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_BOSCH_BMI088=y +CONFIG_DRIVERS_IRLOCK=y +CONFIG_COMMON_LIGHT=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_COMMON_OPTICAL_FLOW=y +CONFIG_DRIVERS_PWM_OUT=y +CONFIG_DRIVERS_RC_INPUT=y +CONFIG_COMMON_TELEMETRY=y +CONFIG_DRIVERS_TONE_ALARM=y +CONFIG_MODULES_ATTITUDE_ESTIMATOR_Q=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=y +CONFIG_MODULES_FW_RATE_CONTROL=y +CONFIG_MODULES_GIMBAL=y +CONFIG_MODULES_GYRO_CALIBRATION=y +CONFIG_MODULES_GYRO_FFT=y +CONFIG_MODULES_LAND_DETECTOR=y +CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=y +CONFIG_MODULES_LOAD_MON=y +CONFIG_MODULES_LOCAL_POSITION_ESTIMATOR=y +CONFIG_MODULES_LOGGER=y +CONFIG_MODULES_MAG_BIAS_ESTIMATOR=y +CONFIG_MODULES_MANUAL_CONTROL=y +CONFIG_MODULES_MAVLINK=y +CONFIG_MODULES_MC_ATT_CONTROL=y +CONFIG_MODULES_MC_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_MC_HOVER_THRUST_ESTIMATOR=y +CONFIG_MODULES_MC_POS_CONTROL=y +CONFIG_MODULES_MC_RATE_CONTROL=y +CONFIG_MODULES_NAVIGATOR=y +CONFIG_MODULES_RC_UPDATE=y +CONFIG_MODULES_ROVER_POS_CONTROL=y +CONFIG_MODULES_SENSORS=y +CONFIG_MODULES_TEMPERATURE_COMPENSATION=y +CONFIG_MODULES_UXRCE_DDS_CLIENT=y +CONFIG_MODULES_VTOL_ATT_CONTROL=y +CONFIG_SYSTEMCMDS_ACTUATOR_TEST=y +CONFIG_SYSTEMCMDS_BL_UPDATE=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_MTD=y +CONFIG_SYSTEMCMDS_NSHTERM=y +CONFIG_SYSTEMCMDS_PARAM=y +CONFIG_SYSTEMCMDS_PERF=y +CONFIG_SYSTEMCMDS_REBOOT=y +CONFIG_SYSTEMCMDS_SD_BENCH=y +CONFIG_SYSTEMCMDS_SD_STRESS=y +CONFIG_SYSTEMCMDS_SYSTEM_TIME=y +CONFIG_SYSTEMCMDS_TOP=y +CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y +CONFIG_SYSTEMCMDS_TUNE_CONTROL=y +CONFIG_SYSTEMCMDS_UORB=y +CONFIG_SYSTEMCMDS_USB_CONNECTED=y +CONFIG_SYSTEMCMDS_VER=y +CONFIG_SYSTEMCMDS_WORK_QUEUE=y +CONFIG_EXAMPLES_FAKE_GPS=y diff --git a/boards/hkust/nxt-dual/extras/hkust_nxt-dual_bootloader.bin b/boards/hkust/nxt-dual/extras/hkust_nxt-dual_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..a9eb4be10db07aea7184f463b7b8c6721d721085 GIT binary patch literal 43256 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

$59~tZNN+@ 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 literal 0 HcmV?d00001 diff --git a/boards/hkust/nxt-dual/firmware.prototype b/boards/hkust/nxt-dual/firmware.prototype new file mode 100644 index 0000000000..e236ff1bcf --- /dev/null +++ b/boards/hkust/nxt-dual/firmware.prototype @@ -0,0 +1,13 @@ +{ + "board_id": 1013, + "magic": "PX4FWv1", + "description": "Firmware for the MatekH743-slim board", + "image": "", + "build_time": 0, + "summary": "MatekH743-mini", + "version": "0.1", + "image_size": 0, + "image_maxsize": 1835008, + "git_identity": "", + "board_revision": 0 +} diff --git a/boards/hkust/nxt-dual/init/rc.board_defaults b/boards/hkust/nxt-dual/init/rc.board_defaults new file mode 100644 index 0000000000..a4afdd873e --- /dev/null +++ b/boards/hkust/nxt-dual/init/rc.board_defaults @@ -0,0 +1,24 @@ +#!/bin/sh +# +# board specific defaults +#------------------------------------------------------------------------------ +param set-default BAT1_A_PER_V 17 +param set-default BAT1_N_CELLS 4 +param set-default BAT1_V_CHARGED 4.2 +param set-default BAT1_V_DIV 10.1 +param set-default BAT1_V_EMPTY 3.2 + +param set-default SYS_HAS_MAG 0 +param set-default PWM_MAIN_TIM0 -4 +param set-default RC_INPUT_PROTO -1 + +param set-default IMU_GYRO_RATEMAX 2000 +param set-default SYS_AUTOSTART 4001 +param set-default MC_PITCHRATE_K 0.4 +param set-default MC_ROLLRATE_K 0.35 +param set-default MC_YAWRATE_K 1.2 +param set-default MC_YAWRATE_MAX 360 +param set-default MAV_TYPE 2 +param set-default CA_AIRFRAME 0 +param set-default CA_ROTOR_COUNT 4 +param set-default CBRK_SUPPLY_CHK 894281 diff --git a/boards/hkust/nxt-dual/init/rc.board_extras b/boards/hkust/nxt-dual/init/rc.board_extras new file mode 100644 index 0000000000..780b13dc96 --- /dev/null +++ b/boards/hkust/nxt-dual/init/rc.board_extras @@ -0,0 +1,13 @@ +#!/bin/sh +# +# board specific extras init +#------------------------------------------------------------------------------ + +# NxtV1 does not have OSD +# 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/hkust/nxt-dual/init/rc.board_sensors b/boards/hkust/nxt-dual/init/rc.board_sensors new file mode 100644 index 0000000000..3091824e8b --- /dev/null +++ b/boards/hkust/nxt-dual/init/rc.board_sensors @@ -0,0 +1,16 @@ +#!/bin/sh +# +# board specific sensors init +#------------------------------------------------------------------------------ + +board_adc start + +# # Internal SPI bus BMI088 accel/gyro +bmi088 -s -b 1 -A -R 2 start +bmi088 -s -b 1 -G -R 2 start + +bmi088 -s -b 4 -A -R 2 start +bmi088 -s -b 4 -G -R 2 start + +# internal baro +spl06 -X -a 0x77 start diff --git a/boards/hkust/nxt-dual/nuttx-config/Kconfig b/boards/hkust/nxt-dual/nuttx-config/Kconfig new file mode 100644 index 0000000000..bb33d3cfda --- /dev/null +++ b/boards/hkust/nxt-dual/nuttx-config/Kconfig @@ -0,0 +1,17 @@ +# +# For a description of the syntax of this configuration file, +# see misc/tools/kconfig-language.txt. +# +config BOARD_HAS_PROBES + bool "Board provides GPIO or other Hardware for signaling to timing analyze." + default y + ---help--- + This board provides GPIO FMU-CH1-5, CAP1-6 as PROBE_1-11 to provide timing signals from selected drivers. + +config BOARD_USE_PROBES + bool "Enable the use the board provided FMU-CH1-5, CAP1-6 as PROBE_1-11" + default n + depends on BOARD_HAS_PROBES + + ---help--- + Select to use GPIO FMU-CH1-5, CAP1-6 to provide timing signals from selected drivers. diff --git a/boards/hkust/nxt-dual/nuttx-config/bootloader/defconfig b/boards/hkust/nxt-dual/nuttx-config/bootloader/defconfig new file mode 100644 index 0000000000..42a2a2bcf1 --- /dev/null +++ b/boards/hkust/nxt-dual/nuttx-config/bootloader/defconfig @@ -0,0 +1,92 @@ +# +# 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/hkust/nxt-dual/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743VI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARDCTL=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_INITTHREAD_PRIORITY=254 +CONFIG_BOARD_LATE_INITIALIZE=y +CONFIG_BOARD_LOOPSPERMSEC=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_C99_BOOL8=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x004b +CONFIG_CDCACM_PRODUCTSTR="HKUST UAV NxtPX4" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +#TODO:ally for VENDOR ID in the future +CONFIG_CDCACM_VENDORID=0x3162 +CONFIG_CDCACM_VENDORSTR="Matek" +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=y +CONFIG_DEFAULT_SMALL=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_INIT_ENTRYPOINT="bootloader_main" +CONFIG_INIT_STACKSIZE=3194 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_STRERROR=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_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_USART6=y #debug port, can be modified to UART8 +CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_TXBUFSIZE=300 +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_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 diff --git a/boards/hkust/nxt-dual/nuttx-config/include/board.h b/boards/hkust/nxt-dual/nuttx-config/include/board.h new file mode 100644 index 0000000000..436b172b1f --- /dev/null +++ b/boards/hkust/nxt-dual/nuttx-config/include/board.h @@ -0,0 +1,487 @@ +/************************************************************************************ + * nuttx-configs/px4_fmu-v6u/include/board.h + * + * Copyright (C) 2016-2019 Gregory Nutt. All rights reserved. + * Authors: David Sidrane + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ +#ifndef __NUTTX_CONFIG_MATEKH743SLIM_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_MATEKH743SLIM_INCLUDE_BOARD_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include "board_dma_map.h" + +#include + +#ifndef __ASSEMBLY__ +# include +#endif + +#include "stm32_rcc.h" +#include "stm32_sdmmc.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/* Clocking *************************************************************************/ +/* The MatekH743-Slim board provides the following clock sources: + * + * X1: 16 MHz crystal for HSE + * + * So we have these clock source available within the STM32 + * + * HSI: 16 MHz RC factory-trimmed + * HSE: 16 MHz crystal for HSE + */ + +#define STM32_BOARD_XTAL 16000000ul + +#define STM32_HSI_FREQUENCY 16000000ul +#define STM32_LSI_FREQUENCY 32000 +#define STM32_HSE_FREQUENCY STM32_BOARD_XTAL +#define STM32_LSE_FREQUENCY 32768 + +/* Main PLL Configuration. + * + * PLL source is HSE = 16,000,000 + * + * PLL_VCOx = (STM32_HSE_FREQUENCY / PLLM) * PLLN + * Subject to: + * + * 1 <= PLLM <= 63 + * 4 <= PLLN <= 512 + * 150 MHz <= PLL_VCOL <= 420MHz + * 192 MHz <= PLL_VCOH <= 836MHz + * + * SYSCLK = PLL_VCO / PLLP + * CPUCLK = SYSCLK / D1CPRE + * Subject to + * + * PLLP1 = {2, 4, 6, 8, ..., 128} + * PLLP2,3 = {2, 3, 4, ..., 128} + * CPUCLK <= 480 MHz + */ + +#define STM32_BOARD_USEHSE + +#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE + +/* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR + * + * PLL1_VCO = (16,000,000 / 1) * 60 = 960 MHz + * + * PLL1P = PLL1_VCO/2 = 960 MHz / 2 = 480 MHz + * PLL1Q = PLL1_VCO/4 = 960 MHz / 4 = 240 MHz + * PLL1R = PLL1_VCO/8 = 960 MHz / 8 = 120 MHz + */ + +#define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL1RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP1EN | \ + RCC_PLLCFGR_DIVQ1EN | \ + RCC_PLLCFGR_DIVR1EN) +#define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(1) +#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(60) +#define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) +#define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(4) +#define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) + +#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 60) +#define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) +#define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 4) +#define STM32_PLL1R_FREQUENCY (STM32_VCO1_FREQUENCY / 8) + +/* PLL2 */ + +#define STM32_PLLCFG_PLL2CFG (RCC_PLLCFGR_PLL2VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL2RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP2EN | \ + RCC_PLLCFGR_DIVQ2EN | \ + RCC_PLLCFGR_DIVR2EN) +#define STM32_PLLCFG_PLL2M RCC_PLLCKSELR_DIVM2(4) +#define STM32_PLLCFG_PLL2N RCC_PLL2DIVR_N2(48) +#define STM32_PLLCFG_PLL2P RCC_PLL2DIVR_P2(2) +#define STM32_PLLCFG_PLL2Q RCC_PLL2DIVR_Q2(2) +#define STM32_PLLCFG_PLL2R RCC_PLL2DIVR_R2(2) + +#define STM32_VCO2_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) +#define STM32_PLL2P_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2Q_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2R_FREQUENCY (STM32_VCO2_FREQUENCY / 2) + +/* PLL3 */ + +#define STM32_PLLCFG_PLL3CFG (RCC_PLLCFGR_PLL3VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL3RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVQ3EN) +#define STM32_PLLCFG_PLL3M RCC_PLLCKSELR_DIVM3(4) +#define STM32_PLLCFG_PLL3N RCC_PLL3DIVR_N3(48) +#define STM32_PLLCFG_PLL3P RCC_PLL3DIVR_P3(2) +#define STM32_PLLCFG_PLL3Q RCC_PLL3DIVR_Q3(4) +#define STM32_PLLCFG_PLL3R RCC_PLL3DIVR_R3(2) + +#define STM32_VCO3_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) +#define STM32_PLL3P_FREQUENCY (STM32_VCO3_FREQUENCY / 2) +#define STM32_PLL3Q_FREQUENCY (STM32_VCO3_FREQUENCY / 4) +#define STM32_PLL3R_FREQUENCY (STM32_VCO3_FREQUENCY / 2) + +/* SYSCLK = PLL1P = 480MHz + * CPUCLK = SYSCLK / 1 = 480 MHz + */ + +#define STM32_RCC_D1CFGR_D1CPRE (RCC_D1CFGR_D1CPRE_SYSCLK) +#define STM32_SYSCLK_FREQUENCY (STM32_PLL1P_FREQUENCY) +#define STM32_CPUCLK_FREQUENCY (STM32_SYSCLK_FREQUENCY / 1) + +/* Configure Clock Assignments */ + +/* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) + * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 + */ + +#define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ +#define STM32_ACLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* ACLK in D1, HCLK3 in D1 */ +#define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ +#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ + +/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ +#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ +#define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ +#define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ + +#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ +#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* Timer clock frequencies */ + +/* Timers driven from APB1 will be twice PCLK1 */ + +#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) + +/* Timers driven from APB2 will be twice PCLK2 */ + +#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) + +/* Kernel Clock Configuration + * + * Note: look at Table 54 in ST Manual + */ + +/* I2C123 clock source */ + +#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI + +/* I2C4 clock source */ + +#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI + +/* SPI123 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 + +/* SPI45 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 + +/* SPI6 clock source */ + +#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 + +/* USB 1 and 2 clock source */ + +#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 + +/* ADC 1 2 3 clock source */ + +#define STM32_RCC_D3CCIPR_ADCSEL RCC_D3CCIPR_ADCSEL_PLL2 + +/* FDCAN 1 clock source */ + +// #define STM32_RCC_D2CCIP1R_FDCANSEL RCC_D2CCIP1R_FDCANSEL_HSE /* FDCAN 1 2 clock source */ + +#define STM32_FDCANCLK STM32_HSE_FREQUENCY + +/* FLASH wait states + * + * ------------ ---------- ----------- + * Vcore MAX ACLK WAIT STATES + * ------------ ---------- ----------- + * 1.15-1.26 V 70 MHz 0 + * (VOS1 level) 140 MHz 1 + * 210 MHz 2 + * 1.05-1.15 V 55 MHz 0 + * (VOS2 level) 110 MHz 1 + * 165 MHz 2 + * 220 MHz 3 + * 0.95-1.05 V 45 MHz 0 + * (VOS3 level) 90 MHz 1 + * 135 MHz 2 + * 180 MHz 3 + * 225 MHz 4 + * ------------ ---------- ----------- + */ + +#define BOARD_FLASH_WAITSTATES 2 + +/* SDMMC definitions ********************************************************/ + +/* Init 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 board has two, LED_GREEN a Green LED and LED_BLUE a Blue LED, + * that can be controlled by software. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +#define BOARD_LED1 0 +#define BOARD_LED2 1 +#define BOARD_LED3 2 +#define BOARD_NLEDS 3 + +#define BOARD_LED_RED BOARD_LED1 +#define BOARD_LED_GREEN BOARD_LED2 +#define BOARD_LED_BLUE BOARD_LED3 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) + +/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in + * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related + * events as follows: + * + * + * SYMBOL Meaning LED state + * Red Green Blue + * ---------------------- -------------------------- ------ ------ ----*/ + +#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ +#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ +#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ +#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ +#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ +#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ +#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ +#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ +#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ + +/* Thus if the Green LED is statically on, NuttX has successfully booted and + * is, apparently, running normally. If the Red LED is flashing at + * approximately 2Hz, then a fatal error has been detected and the system + * has halted. + */ + +/* Alternate function pin selections ************************************************/ + +#define GPIO_USART1_RX GPIO_USART1_RX_2 /* PBA10 */ +#define GPIO_USART1_TX GPIO_USART1_TX_2 /* PA9 */ +#define GPIO_USART1_CK GPIO_USART1_CK /* PB8 NC */ + +#define GPIO_USART2_RX GPIO_USART2_RX_2 /* PD6 */ +#define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ +#define GPIO_USART2_CK GPIO_USART2_CK_2 /* PD7 NC */ + +#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ +#define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ +#define GPIO_USART3_CK GPIO_USART3_CK_3 /* PD10 NC */ + +#define GPIO_UART4_RX GPIO_UART4_RX_3 /* PB8 */ +#define GPIO_UART4_TX GPIO_UART4_TX_3 /* PB9 */ + +#define GPIO_UART5_RX GPIO_UART5_RX_1 /* PB12 */ +#define GPIO_UART5_TX GPIO_UART5_TX_1 /* PB13 */ + +#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 NC */ + +#define GPIO_UART8_RX GPIO_UART8_RX_1 /* PE0 */ +#define GPIO_UART8_TX GPIO_UART8_TX_1 /* PE1 */ + +/* SPI + * + + */ + +#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) + +#define GPIO_SPI1_MISO GPIO_SPI1_MISO_1 /* PA6 */ +#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_1 /* PA7 */ +#define GPIO_SPI1_SCK ADJ_SLEW_RATE(GPIO_SPI1_SCK_1) /* PA5 */ + +#define GPIO_SPI2_MISO GPIO_SPI2_MISO_1 /* PB14 */ +#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_3 /* PC3 */ +#define GPIO_SPI2_SCK ADJ_SLEW_RATE(GPIO_SPI2_SCK_5) /* PD3 */ + +#define GPIO_SPI3_MISO GPIO_SPI3_MISO_1 /* PB4 */ +#define GPIO_SPI3_MOSI GPIO_SPI3_MOSI_3 /* PB2 */ +#define GPIO_SPI3_SCK ADJ_SLEW_RATE(GPIO_SPI3_SCK_1) /* PB3 */ + +#define GPIO_SPI4_MISO GPIO_SPI4_MISO_2 /* PE5 */ +#define GPIO_SPI4_MOSI GPIO_SPI4_MOSI_2 /* PE6 */ +#define GPIO_SPI4_SCK ADJ_SLEW_RATE(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) + +#define GPIO_I2C4_SCL GPIO_I2C4_SCL_1 /* PD12 */ +#define GPIO_I2C4_SDA GPIO_I2C4_SDA_1 /* PD13 */ + +#define GPIO_I2C4_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTD | GPIO_PIN12) +#define GPIO_I2C4_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTD | GPIO_PIN13) + + +/* SDMMC1 + * + * SDMMC1_D0 PC8 + * SDMMC1_D1 PC9 + * SDMMC1_D2 PC10 + * SDMMC1_D3 PC11 + * SDMMC1_CK PC12 + * SDMMC1_CMD PD2 + */ + +// #define GPIO_SDMMC1_D0 GPIO_SDMMC1_D0 /* PC8 */ +// #define GPIO_SDMMC1_D1 GPIO_SDMMC1_D1 /* PC9 */ +// #define GPIO_SDMMC1_D2 GPIO_SDMMC1_D2 /* PC10 */ +// #define GPIO_SDMMC1_D3 GPIO_SDMMC1_D3 /* PC11 */ +// #define GPIO_SDMMC1_CK GPIO_SDMMC1_CK /* PC12 */ +// #define GPIO_SDMMC1_CMD GPIO_SDMMC1_CMD /* PD2 */ + + +/* USB + * + * OTG_FS_DM PA11 + * OTG_FS_DP PA12 + * VBUS PA9 + */ + + +/* Board provides GPIO or other Hardware for signaling to timing analyzer */ + +// #if defined(CONFIG_BOARD_USE_PROBES) +// # include "stm32_gpio.h" +// # define PROBE_N(n) (1<<((n)-1)) +// # define PROBE_1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN0) /* PI0 AUX1 */ +// # define PROBE_2 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN12) /* PH12 AUX2 */ +// # define PROBE_3 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN11) /* PH11 AUX3 */ +// # define PROBE_4 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN10) /* PH10 AUX4 */ +// # define PROBE_5 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN13) /* PD13 AUX5 */ +// # define PROBE_6 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14) /* PD14 AUX6 */ +// # define PROBE_7 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN6) /* PH6 AUX7 */ +// # define PROBE_8 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN9) /* PH9 AUX8 */ +// # define PROBE_9 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN11) /* PE11 CAP1 */ + +// # define PROBE_INIT(mask) \ +// do { \ +// if ((mask)& PROBE_N(1)) { stm32_configgpio(PROBE_1); } \ +// if ((mask)& PROBE_N(2)) { stm32_configgpio(PROBE_2); } \ +// if ((mask)& PROBE_N(3)) { stm32_configgpio(PROBE_3); } \ +// if ((mask)& PROBE_N(4)) { stm32_configgpio(PROBE_4); } \ +// if ((mask)& PROBE_N(5)) { stm32_configgpio(PROBE_5); } \ +// if ((mask)& PROBE_N(6)) { stm32_configgpio(PROBE_6); } \ +// if ((mask)& PROBE_N(7)) { stm32_configgpio(PROBE_7); } \ +// if ((mask)& PROBE_N(8)) { stm32_configgpio(PROBE_8); } \ +// if ((mask)& PROBE_N(9)) { stm32_configgpio(PROBE_9); } \ +// } while(0) + +// # define PROBE(n,s) do {stm32_gpiowrite(PROBE_##n,(s));}while(0) +// # define PROBE_MARK(n) PROBE(n,false);PROBE(n,true) +// #else +// # define PROBE_INIT(mask) +// # define PROBE(n,s) +// # define PROBE_MARK(n) +// #endif + +#endif /*__NUTTX_CONFIG_MATEKH743SLIM_INCLUDE_BOARD_H */ diff --git a/boards/hkust/nxt-dual/nuttx-config/include/board_dma_map.h b/boards/hkust/nxt-dual/nuttx-config/include/board_dma_map.h new file mode 100644 index 0000000000..a27735b354 --- /dev/null +++ b/boards/hkust/nxt-dual/nuttx-config/include/board_dma_map.h @@ -0,0 +1,62 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once +// #define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* DMA1:37 */ +// #define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* DMA1:38 */ + +#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* DMA1:39 */ +#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* DMA1:40 */ + +// DMAMUX2 +// #define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_0 /* DMA1:61 */ +// #define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_0 /* DMA1:62 */ + +// #define DMAMAP_SPI6_RX DMAMAP_BDMA_SPI6_RX /* BDMA:11 */ +// #define DMAMAP_SPI6_TX DMAMAP_BDMA_SPI6_TX /* BDMA:12 */ + +//TODO: UART DMA test +// #define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_1 /*DMA2:41*/ +// #define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_1 /*DMA2:42*/ + +// #define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_1 /* DMA2:43 */ +// #define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_1 /* DMA2:44 */ + +// #define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* DMA2:45 */ +// #define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* DMA2:46 */ + +#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_1 /* DMA1:63 */ +#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_1 /* DMA1:64 */ + +// #define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_0 /* DMA1:65 */ +// #define DMAMAP_UART5_TX DMAMAP_DMA12_UART5RX_0 /* DMA1:66 */ diff --git a/boards/hkust/nxt-dual/nuttx-config/nsh/defconfig b/boards/hkust/nxt-dual/nuttx-config/nsh/defconfig new file mode 100644 index 0000000000..8dc5c7cf57 --- /dev/null +++ b/boards/hkust/nxt-dual/nuttx-config/nsh/defconfig @@ -0,0 +1,288 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DISABLE_ENVIRON is not set +# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set +# CONFIG_DISABLE_PTHREAD is not set +# CONFIG_MMCSD_HAVE_CARDDETECT is not set +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_MMCSD_SPI is not set +# CONFIG_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_CAT is not set +# CONFIG_NSH_DISABLE_CD is not set +# CONFIG_NSH_DISABLE_CP is not set +# CONFIG_NSH_DISABLE_DATE is not set +# CONFIG_NSH_DISABLE_DF is not set +# CONFIG_NSH_DISABLE_ECHO is not set +# CONFIG_NSH_DISABLE_ENV is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_EXIT is not set +# CONFIG_NSH_DISABLE_EXPORT is not set +# CONFIG_NSH_DISABLE_FREE is not set +# CONFIG_NSH_DISABLE_GET is not set +# CONFIG_NSH_DISABLE_HELP is not set +# CONFIG_NSH_DISABLE_ITEF is not set +# CONFIG_NSH_DISABLE_KILL is not set +# CONFIG_NSH_DISABLE_LOOPS is not set +# CONFIG_NSH_DISABLE_LS is not set +# CONFIG_NSH_DISABLE_MKDIR is not set +# CONFIG_NSH_DISABLE_MKFATFS is not set +# CONFIG_NSH_DISABLE_MOUNT is not set +# CONFIG_NSH_DISABLE_MV is not set +# CONFIG_NSH_DISABLE_PRINTF is not set +# CONFIG_NSH_DISABLE_PS is not set +# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set +# CONFIG_NSH_DISABLE_PWD is not set +# CONFIG_NSH_DISABLE_RM is not set +# CONFIG_NSH_DISABLE_RMDIR is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_SET is not set +# CONFIG_NSH_DISABLE_SLEEP is not set +# CONFIG_NSH_DISABLE_SOURCE is not set +# CONFIG_NSH_DISABLE_TEST is not set +# CONFIG_NSH_DISABLE_TIME is not set +# CONFIG_NSH_DISABLE_UMOUNT is not set +# CONFIG_NSH_DISABLE_UNSET is not set +# CONFIG_NSH_DISABLE_USLEEP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/hkust/nxt-dual/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743VI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DTCM=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_ARM_MPU_EARLY_RESET=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_CRASHDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_C99_BOOL8=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x0036 +CONFIG_CDCACM_PRODUCTSTR="HKUST UAV NxtPX4" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x1B8C +CONFIG_CDCACM_VENDORSTR="Matek" +CONFIG_CLOCK_MONOTONIC=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_MEMFAULT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=n +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_IOB_NBUFFERS=24 +CONFIG_IOB_NCHAINS=24 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=3194 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_MAX_EXITFUNS=1 +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y +CONFIG_MM_IOB=y +CONFIG_MM_REGIONS=4 +# Avaible in Dual Version TODO: MTD IO error +CONFIG_MTD=y +CONFIG_MTD_BYTE_WRITE=y +CONFIG_MTD_PARTITION=y +CONFIG_MTD_PROGMEM=y +CONFIG_MTD_RAMTRON=y +CONFIG_MTD_W25=y +CONFIG_MTD_W25QXXXJV=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_LINELEN=128 +CONFIG_NSH_MAXARGUMENTS=15 +CONFIG_NSH_NESTDEPTH=8 +CONFIG_NSH_QUOTE=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSSECTSIZE=128 +CONFIG_NSH_STRERROR=y +CONFIG_NSH_VARS=y +CONFIG_OTG_ID_GPIO_DISABLE=y +CONFIG_PIPES=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PRIORITY_INHERITANCE=y +CONFIG_PTHREAD_MUTEX_ROBUST=y +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_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_INSTRUMENTATION_SWITCH=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_LPWORKPRIORITY=50 +CONFIG_SCHED_LPWORKSTACKSIZE=1632 +CONFIG_SCHED_WAITPID=y +CONFIG_SDCLONE_DISABLE=y +CONFIG_SDMMC1_SDIO_PULLUP=y +CONFIG_SEM_PREALLOCHOLDERS=32 +CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_SIG_DEFAULT=y +CONFIG_SIG_SIGALRM_ACTION=y +CONFIG_SIG_SIGUSR1_ACTION=y +CONFIG_SIG_SIGUSR2_ACTION=y +CONFIG_SIG_SIGWORK=4 +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_BUFFER_SIZE=256 +CONFIG_STM32H7_ADC1=y +CONFIG_STM32H7_ADC2=y +CONFIG_STM32H7_ADC3=y #should always enable otherwsie got ADC timeout error this is for tempreature compenstae +CONFIG_STM32H7_BBSRAM=y +CONFIG_STM32H7_BBSRAM_FILES=5 +CONFIG_STM32H7_BDMA=y +CONFIG_STM32H7_BKPSRAM=y +CONFIG_STM32H7_DMA1=y +CONFIG_STM32H7_DMA2=y +CONFIG_STM32H7_DMACAPABLE=y +CONFIG_STM32H7_FLASH_OVERRIDE_I=y +CONFIG_STM32H7_FLOWCONTROL_BROKEN=y +CONFIG_STM32H7_I2C1=y +CONFIG_STM32H7_I2C4=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_RTC=y +CONFIG_STM32H7_RTC_HSECLOCK=y +CONFIG_STM32H7_RTC_MAGIC_REG=1 +CONFIG_STM32H7_SAVE_CRASHDUMP=y +CONFIG_STM32H7_SDMMC1=y +CONFIG_STM32H7_SDMMC1_DMA=y +CONFIG_STM32H7_SDMMC1_DMA_BUFFER=1024 +CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_SPI1=y +# CONFIG_STM32H7_SPI1_DMA=y +# CONFIG_STM32H7_SPI1_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI2=y +CONFIG_STM32H7_SPI2_DMA=y +CONFIG_STM32H7_SPI2_DMA_BUFFER=4096 +CONFIG_STM32H7_SPI3=y +# CONFIG_STM32H7_SPI3_DMA=y +# CONFIG_STM32H7_SPI3_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI4=y +# CONFIG_STM32H7_SPI4_DMA=y +# CONFIG_STM32H7_SPI4_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI_DMA=y +CONFIG_STM32H7_SPI_DMATHRESHOLD=8 +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM2=y +CONFIG_STM32H7_TIM3=y +CONFIG_STM32H7_TIM4=y +# CONFIG_STM32H7_TIM5=y +# CONFIG_STM32H7_TIM6=y +# CONFIG_STM32H7_TIM7=y +CONFIG_STM32H7_TIM8=y +CONFIG_STM32H7_USART1=y #ttyS0 +CONFIG_STM32H7_USART2=y #ttyS1 +CONFIG_STM32H7_USART3=y #ttyS2 +CONFIG_STM32H7_UART4=y #ttyS3 +CONFIG_STM32H7_UART5=y #ttyS4 +CONFIG_STM32H7_USART6=y #ttyS5 NC +CONFIG_STM32H7_UART7=y #ttyS6 +CONFIG_STM32H7_UART8=y #ttyS7 +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_USART1_BAUD=57600 +CONFIG_USART1_RXBUFSIZE=600 +CONFIG_USART1_TXBUFSIZE=1500 +CONFIG_USART2_BAUD=57600 +CONFIG_USART2_RXBUFSIZE=600 +CONFIG_USART2_TXBUFSIZE=3000 +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=180 +CONFIG_USART3_TXBUFSIZE=1500 +CONFIG_UART4_BAUD=921600 +CONFIG_UART4_RXBUFSIZE=3000 +CONFIG_UART4_TXBUFSIZE=3000 +CONFIG_UART4_RXDMA=y +CONFIG_UART4_TXDMA=y +CONFIG_UART5_BAUD=57600 +CONFIG_UART5_RXBUFSIZE=600 +CONFIG_UART5_TXBUFSIZE=1500 +CONFIG_USART6_BAUD=57600 +CONFIG_USART6_RXBUFSIZE=180 +CONFIG_USART6_SERIAL_CONSOLE=y +CONFIG_UART7_BAUD=57600 +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_TXBUFSIZE=3000 +CONFIG_UART8_BAUD=57600 +CONFIG_UART8_RXBUFSIZE=600 +CONFIG_UART8_TXBUFSIZE=3000 +CONFIG_USBDEV=y +CONFIG_USBDEV_BUSPOWERED=y +CONFIG_USBDEV_MAXPOWER=500 +CONFIG_USEC_PER_TICK=1000 +CONFIG_USERMAIN_STACKSIZE=2944 +CONFIG_WATCHDOG=y +CONFIG_WQUEUE_NOTIFIER=y diff --git a/boards/hkust/nxt-dual/nuttx-config/nsh/old_defconfig.txt b/boards/hkust/nxt-dual/nuttx-config/nsh/old_defconfig.txt new file mode 100644 index 0000000000..cbe89638ad --- /dev/null +++ b/boards/hkust/nxt-dual/nuttx-config/nsh/old_defconfig.txt @@ -0,0 +1,271 @@ +# +# 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_MMCSD_SPI 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_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/hkust/nxt/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_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=95751 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_C99_BOOL8=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x0036 +CONFIG_CDCACM_PRODUCTSTR="NxtPX4" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x1B8C +CONFIG_CDCACM_VENDORSTR="Gumstix" +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_IOB_NBUFFERS=24 +CONFIG_IOB_NCHAINS=24 +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_MMCSD_SDIOWAIT_WRCOMPLETE=y +CONFIG_MM_IOB=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_LINELEN=128 +CONFIG_NSH_MAXARGUMENTS=15 +CONFIG_NSH_NESTDEPTH=8 +CONFIG_NSH_QUOTE=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSSECTSIZE=128 +CONFIG_NSH_STRERROR=y +CONFIG_NSH_VARS=y +CONFIG_OTG_ID_GPIO_DISABLE=y +CONFIG_PIPES=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PRIORITY_INHERITANCE=y +CONFIG_PTHREAD_MUTEX_ROBUST=y +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_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_SDMMC2_SDIO_PULLUP=y +CONFIG_SEM_PREALLOCHOLDERS=32 +CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_SIG_DEFAULT=y +CONFIG_SIG_SIGALRM_ACTION=y +CONFIG_SIG_SIGUSR1_ACTION=y +CONFIG_SIG_SIGUSR2_ACTION=y +CONFIG_SIG_SIGWORK=4 +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_BUFFER_SIZE=256 +CONFIG_STM32H7_ADC1=y +CONFIG_STM32H7_ADC3=y +CONFIG_STM32H7_BBSRAM=y +CONFIG_STM32H7_BBSRAM_FILES=5 +CONFIG_STM32H7_BDMA=y +CONFIG_STM32H7_BKPSRAM=y +CONFIG_STM32H7_DMA1=y +CONFIG_STM32H7_DMA2=y +CONFIG_STM32H7_DMACAPABLE=y +CONFIG_STM32H7_FLASH_OVERRIDE_I=y +CONFIG_STM32H7_FLOWCONTROL_BROKEN=y +CONFIG_STM32H7_I2C1=y +CONFIG_STM32H7_I2C2=y +# CONFIG_STM32H7_I2C3=y +# CONFIG_STM32H7_I2C4=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_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_SDMMC1_DMA=y +CONFIG_STM32H7_SDMMC1_DMA_BUFFER=1024 +# CONFIG_STM32H7_SDMMC2=y +CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_SPI1=y +CONFIG_STM32H7_SPI1_DMA=y +CONFIG_STM32H7_SPI1_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI2=y +CONFIG_STM32H7_SPI2_DMA=y +CONFIG_STM32H7_SPI2_DMA_BUFFER=4096 +CONFIG_STM32H7_SPI3=y +CONFIG_STM32H7_SPI3_DMA=y +CONFIG_STM32H7_SPI3_DMA_BUFFER=1024 +# CONFIG_STM32H7_SPI5=y +# CONFIG_STM32H7_SPI6=y +# CONFIG_STM32H7_SPI6_DMA=y +# CONFIG_STM32H7_SPI6_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI_DMA=y +# CONFIG_STM32H7_TIM12=y +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM3=y +CONFIG_STM32H7_TIM4=y +CONFIG_STM32H7_TIM5=y + + +CONFIG_STM32H7_USART1=y #ttyS0 +CONFIG_STM32H7_USART2=y #ttyS1 +CONFIG_STM32H7_USART3=y #ttyS2 +CONFIG_STM32H7_UART4=y #ttyS3 +CONFIG_STM32H7_UART5=y #ttyS4 +CONFIG_STM32H7_UART7=y #ttyS5 + +# 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_UART5_IFLOWCONTROL=y +# CONFIG_UART5_OFLOWCONTROL=y + +# CONFIG_UART8_BAUD=57600 +# CONFIG_UART8_RXBUFSIZE=600 +# CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_USART1_BAUD=57600 +CONFIG_USART1_RXBUFSIZE=600 +CONFIG_USART1_TXBUFSIZE=1500 + +CONFIG_USART2_BAUD=57600 +# CONFIG_USART2_IFLOWCONTROL=y +# CONFIG_USART2_OFLOWCONTROL=y +CONFIG_USART2_RXBUFSIZE=600 +CONFIG_USART2_TXBUFSIZE=3000 + +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=180 +CONFIG_USART3_SERIAL_CONSOLE=y +CONFIG_USART3_TXBUFSIZE=1500 + +CONFIG_UART4_BAUD=921600 +CONFIG_UART4_RXBUFSIZE=3000 +CONFIG_UART4_TXBUFSIZE=1200 +# CONFIG_UART4_RXDMA=y +# CONFIG_UART4_TXDMA=y + +CONFIG_UART5_BAUD=57600 +CONFIG_UART5_RXBUFSIZE=600 +CONFIG_UART5_TXBUFSIZE=1500 + + +# CONFIG_USART6_BAUD=57600 +# CONFIG_USART6_RXBUFSIZE=600 +# CONFIG_USART6_TXBUFSIZE=1500 + +CONFIG_UART7_BAUD=57600 +# CONFIG_UART7_IFLOWCONTROL=y +# CONFIG_UART7_OFLOWCONTROL=y +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_TXBUFSIZE=3000 + + +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 +CONFIG_WQUEUE_NOTIFIER=y diff --git a/boards/hkust/nxt-dual/nuttx-config/scripts/bootloader_script.ld b/boards/hkust/nxt-dual/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 0000000000..511ef26242 --- /dev/null +++ b/boards/hkust/nxt-dual/nuttx-config/scripts/bootloader_script.ld @@ -0,0 +1,213 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The Durandal-v1 uses an STM32H743II has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743II, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * The Durandal has a Swtich on board, the BOOT0 pin is at ground so by default, + * the STM32 will boot to address 0x0800:0000 in FLASH unless the swiutch is + * drepresed, then the boot will be from 0x1FF0:0000 + * + * The STM32H743ZI also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + */ + +MEMORY +{ + itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + flash (rx) : ORIGIN = 0x08000000, LENGTH = 2048K + dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K + sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K + sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K + sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K + sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K + sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K + bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) +EXTERN(_bootdelay_signature) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + . = ALIGN(32); + /* + This signature provides the bootloader with a way to delay booting + */ + _bootdelay_signature = ABSOLUTE(.); + FILL(0xffecc2925d7d05c5) + . += 8; + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + + } > flash + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > flash + + + .ARM.extab : { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + } > sram AT > flash + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/hkust/nxt-dual/nuttx-config/scripts/script.ld b/boards/hkust/nxt-dual/nuttx-config/scripts/script.ld new file mode 100644 index 0000000000..1dc1a0ef97 --- /dev/null +++ b/boards/hkust/nxt-dual/nuttx-config/scripts/script.ld @@ -0,0 +1,228 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2020 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The board uses an STM32H743II and has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743II, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * There's a switch on board, the BOOT0 pin is at ground so by default, + * the STM32 will boot to address 0x0800:0000 in FLASH unless the switch is + * drepresed, then the boot will be from 0x1FF0:0000 + * + * The STM32H743ZI also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + */ + +MEMORY +{ + ITCM_RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1792K + + DTCM1_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + DTCM2_RAM (rwx) : ORIGIN = 0x20010000, LENGTH = 64K + AXI_SRAM (rwx) : ORIGIN = 0x24000000, LENGTH = 512K /* D1 domain AXI bus */ + SRAM1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K /* D2 domain AHB bus */ + SRAM2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K /* D2 domain AHB bus */ + SRAM3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K /* D2 domain AHB bus */ + SRAM4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K /* D3 domain */ + BKPRAM (rwx) : ORIGIN = 0x38800000, LENGTH = 4K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) +EXTERN(_bootdelay_signature) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + . = ALIGN(32); + /* + This signature provides the bootloader with a way to delay booting + */ + _bootdelay_signature = ABSOLUTE(.); + FILL(0xffecc2925d7d05c5) + . += 8; + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + + } > FLASH + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > FLASH + + + .ARM.extab : { + *(.ARM.extab*) + } > FLASH + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > FLASH + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + + /* Pad out last section as the STM32H7 Flash write size is 256 bits. 32 bytes */ + . = ALIGN(16); + FILL(0xffff) + . += 16; + } > AXI_SRAM AT > FLASH = 0xffff + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > AXI_SRAM + + /* Emit the the D3 power domain section for locating BDMA data */ + + .sram4_reserve (NOLOAD) : + { + *(.sram4) + . = ALIGN(4); + _sram4_heap_start = ABSOLUTE(.); + } > SRAM4 + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/hkust/nxt-dual/src/CMakeLists.txt b/boards/hkust/nxt-dual/src/CMakeLists.txt new file mode 100644 index 0000000000..798c524347 --- /dev/null +++ b/boards/hkust/nxt-dual/src/CMakeLists.txt @@ -0,0 +1,69 @@ +############################################################################ +# +# Copyright (c) 2021 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ +if("${PX4_BOARD_LABEL}" STREQUAL "bootloader") + add_library(drivers_board + bootloader_main.c + usb.c + ) + target_link_libraries(drivers_board + PRIVATE + nuttx_arch + nuttx_drivers + bootloader + ) + target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) + +else() + add_library(drivers_board + i2c.cpp + init.c + led.c + sdio.c + spi.cpp + timer_config.cpp + usb.c + mtd.cpp + ) + # add_dependencies(drivers_board arch_board_hw_info) + + target_link_libraries(drivers_board + PRIVATE + arch_io_pins + arch_spi + arch_board_hw_info + drivers__led + nuttx_arch + nuttx_drivers + px4_layer + ) +endif() diff --git a/boards/hkust/nxt-dual/src/board_config.h b/boards/hkust/nxt-dual/src/board_config.h new file mode 100644 index 0000000000..2b8aba1296 --- /dev/null +++ b/boards/hkust/nxt-dual/src/board_config.h @@ -0,0 +1,230 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file board_config.h + * + * Board internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include + +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +#define FLASH_BASED_PARAMS + + +/* LEDs are driven with push open drain to support Anode to 5V or 3.3V */ + +# define GPIO_nLED_RED /* PD15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN15) +# define GPIO_nLED_GREEN /* PD11 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN11) +# define GPIO_nLED_BLUE /* PB15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN15) + +# define BOARD_HAS_CONTROL_STATUS_LEDS 1 +# define BOARD_OVERLOAD_LED LED_RED +# define BOARD_ARMED_STATE_LED LED_BLUE + +/* I2C busses */ +/* Devices on the onboard buses. + * + * Note that these are unshifted addresses. + */ +// #define PX4_I2C_OBDEV_SE050 0x48 + +#define GPIO_SPL_ADDR_SET /* PB5 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN5) + +/* + * ADC channels + * + * These are the channel numbers of the ADCs of the microcontroller that + * can be used by the Px4 Firmware in the adc driver + */ + +/* ADC defines to be used in sensors.cpp to read from a particular channel */ + +#define SYSTEM_ADC_BASE STM32_ADC1_BASE + +#define ADC12_CH(n) (n) + +#define PX4_ADC_GPIO \ + /* PC4 */ GPIO_ADC12_INP4, \ + /* PC5 */ GPIO_ADC12_INP8 + +/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ +/* Define Channel numbers must match above GPIO pin IN(n)*/ +#define ADC_BATTERY_VOLTAGE_CHANNEL ADC12_CH(4) +#define ADC_BATTERY_CURRENT_CHANNEL ADC12_CH(5) + +#define ADC_CHANNELS \ + ((1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL)) + +#define BOARD_ADC_OPEN_CIRCUIT_V (1.6f) + + + +/* Define Battery 1 Voltage Divider and A per V + */ + +// #define BOARD_BATTERY1_V_DIV (11.0f) /* measured with the provided PM board */ +// #define BOARD_BATTERY1_A_PER_V (40.0f) +// #define BOARD_BATTERY2_V_DIV (11.0f) /* measured with the provided PM board */ + +/* PWM + */ +#define DIRECT_PWM_OUTPUT_CHANNELS 8 + +#define BOARD_HAS_PWM DIRECT_PWM_OUTPUT_CHANNELS + + +/* Spare GPIO */ +#define GPIO_PA4 /* PA4 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN4) +#define GPIO_PC0 /* PC0 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN0) +#define GPIO_PC1 /* PC1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN1) +/* Tone alarm output */ + +#define TONE_ALARM_TIMER 4 /* Timer 4 */ +#define TONE_ALARM_CHANNEL 3 /* PD14 GPIO_TIM4_CH3 NC */ +/*NC can be modified with Spare GPIO then connected with hardware */ +#define GPIO_BUZZER_1 /* PA4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN4) + +#define GPIO_TONE_ALARM_IDLE GPIO_BUZZER_1 +#define GPIO_TONE_ALARM GPIO_BUZZER_1 + +/* USB OTG FS + * + * PD0 OTG_FS_VBUS VBUS sensing + */ +#define GPIO_OTGFS_VBUS /* PD0 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTD|GPIO_PIN0) +#define BOARD_ADC_USB_CONNECTED (px4_arch_gpioread(GPIO_OTGFS_VBUS)) + +/* High-resolution timer */ +#define HRT_TIMER 8 /* use timer1 for the HRT */ +#define HRT_TIMER_CHANNEL 1 /* use capture/compare channel 1 */ + +/* RC Serial port */ +#define RC_SERIAL_PORT "/dev/ttyS4" +#define BOARD_SUPPORTS_RC_SERIAL_PORT_OUTPUT + +// #define GPIO_SBUS_INV (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14) +// #define RC_INVERT_INPUT(_invert_true) px4_arch_gpiowrite(GPIO_SBUS_INV, _invert_true); + +/* 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 + */ +#define SDIO_SLOTNO 0 /* Only one slot */ +#define SDIO_MINOR 0 +#if defined(CONFIG_BOARD_INITIALIZE) && !defined(CONFIG_LIB_BOARDCTL) && \ + !defined(CONFIG_BOARD_INITTHREAD) +# warning SDIO initialization cannot be perfomed on the IDLE thread +#endif + +/* 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_SPL_ADDR_SET, \ + GPIO_PC0, \ + GPIO_PC1, \ + } + +#define BOARD_ENABLE_CONSOLE_BUFFER + +#define BOARD_NUM_IO_TIMERS 5 + + +__BEGIN_DECLS + +/**************************************************************************************************** + * Public Types + ****************************************************************************************************/ + +/**************************************************************************************************** + * Public data + ****************************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************************************** + * Public Functions + ****************************************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +int stm32_sdio_initialize(void); + +/**************************************************************************************************** + * Name: stm32_spiinitialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the board. + * + ****************************************************************************************************/ + +extern void stm32_spiinitialize(void); + +extern void stm32_usbinitialize(void); + +extern void board_peripheral_reset(int ms); + +#include + +#endif /* __ASSEMBLY__ */ + +__END_DECLS diff --git a/boards/hkust/nxt-dual/src/bootloader_main.c b/boards/hkust/nxt-dual/src/bootloader_main.c new file mode 100644 index 0000000000..5670308a29 --- /dev/null +++ b/boards/hkust/nxt-dual/src/bootloader_main.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file bootloader_main.c + * + * FMU-specific early startup code for bootloader +*/ + +#include "board_config.h" +#include "bl.h" + +#include +#include +#include +#include +#include +#include "arm_internal.h" +#include + +extern int sercon_main(int c, char **argv); + +__EXPORT void board_on_reset(int status) {} + +__EXPORT void stm32_boardinitialize(void) +{ + /* configure USB interfaces */ + stm32_usbinitialize(); +} + +__EXPORT int board_app_initialize(uintptr_t arg) +{ + return 0; +} + +void board_late_initialize(void) +{ + sercon_main(0, NULL); +} + +extern void sys_tick_handler(void); +void board_timerhook(void) +{ + sys_tick_handler(); +} diff --git a/boards/hkust/nxt-dual/src/flash_w25q128.c b/boards/hkust/nxt-dual/src/flash_w25q128.c new file mode 100644 index 0000000000..3a3e2cee1f --- /dev/null +++ b/boards/hkust/nxt-dual/src/flash_w25q128.c @@ -0,0 +1,505 @@ +/**************************************************************************** + * + * 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. + * + ****************************************************************************/ + +/** + * @file flash_w25q128.c + * + * Board-specific external flash W25Q128 functions. + */ + + +#include "board_config.h" +#include "qspi.h" +#include "arm_internal.h" +#include +#include + + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ +/* Configuration ********************************************************************/ + +#define N25Q128_SECTOR_SIZE (4*1024) +#define N25Q128_SECTOR_SHIFT (12) +#define N25Q128_SECTOR_COUNT (4096) +#define N25Q128_PAGE_SIZE (256) +#define N25Q128_PAGE_SHIFT (8) + +#define W25Q_DUMMY_CYCLES_FAST_READ_QUAD 6 +#define W25Q_INSTR_FAST_READ_QUAD 0xEB +#define W25Q_ADDRESS_SIZE 3 // 3 bytes -> 24 bits + +#define N25QXXX_READ_STATUS 0x05 /* Read status register: * + * 0x05 | SR */ +#define N25QXXX_PAGE_PROGRAM 0x02 /* Page Program: * + * 0x02 | ADDR(MS) | ADDR(MID) | * + * ADDR(LS) | data */ +#define N25QXXX_WRITE_ENABLE 0x06 /* Write enable: * + * 0x06 */ +#define N25QXXX_WRITE_DISABLE 0x04 /* Write disable command code: * + * 0x04 */ +#define N25QXXX_SUBSECTOR_ERASE 0x20 /* Sub-sector Erase (4 kB) * + * 0x20 | ADDR(MS) | ADDR(MID) | * + * ADDR(LS) */ + + +/* N25QXXX Registers ****************************************************************/ +/* Status register bit definitions */ + +#define STATUS_BUSY_MASK (1 << 0) /* Bit 0: Device ready/busy status */ +# define STATUS_READY (0 << 0) /* 0 = Not Busy */ +# define STATUS_BUSY (1 << 0) /* 1 = Busy */ +#define STATUS_WEL_MASK (1 << 1) /* Bit 1: Write enable latch status */ +# define STATUS_WEL_DISABLED (0 << 1) /* 0 = Not Write Enabled */ +# define STATUS_WEL_ENABLED (1 << 1) /* 1 = Write Enabled */ +#define STATUS_BP_SHIFT (2) /* Bits 2-4: Block protect bits */ +#define STATUS_BP_MASK (7 << STATUS_BP_SHIFT) +# define STATUS_BP_NONE (0 << STATUS_BP_SHIFT) +# define STATUS_BP_ALL (7 << STATUS_BP_SHIFT) +#define STATUS_TB_MASK (1 << 5) /* Bit 5: Top / Bottom Protect */ +# define STATUS_TB_TOP (0 << 5) /* 0 = BP2-BP0 protect Top down */ +# define STATUS_TB_BOTTOM (1 << 5) /* 1 = BP2-BP0 protect Bottom up */ +#define STATUS_BP3_MASK (1 << 5) /* Bit 6: BP3 */ +#define STATUS_SRP0_MASK (1 << 7) /* Bit 7: Status register protect 0 */ +# define STATUS_SRP0_UNLOCKED (0 << 7) /* 0 = WP# no effect / PS Lock Down */ +# define STATUS_SRP0_LOCKED (1 << 7) /* 1 = WP# protect / OTP Lock Down */ + +/************************************************************************************ + * Private Types + ************************************************************************************/ + +/* This type represents the state of the MTD device. The struct mtd_dev_s must + * appear at the beginning of the definition so that you can freely cast between + * pointers to struct mtd_dev_s and struct n25qxxx_dev_s. + */ + +struct n25qxxx_dev_s { + //struct mtd_dev_s mtd; /* MTD interface */ + FAR struct qspi_dev_s *qspi; /* Saved QuadSPI interface instance */ + uint16_t nsectors; /* Number of erase sectors */ + uint8_t sectorshift; /* Log2 of sector size */ + uint8_t pageshift; /* Log2 of page size */ + FAR uint8_t *cmdbuf; /* Allocated command buffer */ + FAR uint8_t *readbuf; /* Allocated status read buffer */ +}; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +struct qspi_dev_s *ptr_qspi_dev; +struct qspi_meminfo_s qspi_meminfo = { + .flags = QSPIMEM_QUADIO, + .addrlen = W25Q_ADDRESS_SIZE, + .dummies = W25Q_DUMMY_CYCLES_FAST_READ_QUAD, + .cmd = W25Q_INSTR_FAST_READ_QUAD +}; + +struct n25qxxx_dev_s n25qxxx_dev; +uint8_t cmdbuf[4] = {0u}; +uint8_t readbuf[1] = {0u}; + +/************************************************************************************ + * Private Functions + ************************************************************************************/ +__ramfunc__ int n25qxxx_command(FAR struct qspi_dev_s *qspi, uint8_t cmd); +__ramfunc__ uint8_t n25qxxx_read_status(FAR struct n25qxxx_dev_s *priv); +__ramfunc__ int n25qxxx_command_read(FAR struct qspi_dev_s *qspi, uint8_t cmd, + FAR void *buffer, size_t buflen); +__ramfunc__ void n25qxxx_write_enable(FAR struct n25qxxx_dev_s *priv); +__ramfunc__ void n25qxxx_write_disable(FAR struct n25qxxx_dev_s *priv); + +__ramfunc__ int n25qxxx_write_page(struct n25qxxx_dev_s *priv, FAR const uint8_t *buffer, + off_t address, size_t buflen); + +__ramfunc__ int n25qxxx_write_one_page(struct n25qxxx_dev_s *priv, struct qspi_meminfo_s *meminfo); + +__ramfunc__ int n25qxxx_erase_sector(struct n25qxxx_dev_s *priv, off_t sector); + +__ramfunc__ bool n25qxxx_isprotected(FAR struct n25qxxx_dev_s *priv, uint8_t status, + off_t address); + +__ramfunc__ int n25qxxx_command_address(FAR struct qspi_dev_s *qspi, uint8_t cmd, + off_t addr, uint8_t addrlen); + +/************************************************************************************ + * Public Functions + ************************************************************************************/ + +void flash_w25q128_init(void) +{ + int qspi_interface_number = 0; + ptr_qspi_dev = stm32h7_qspi_initialize(qspi_interface_number); + n25qxxx_dev.qspi = ptr_qspi_dev; + n25qxxx_dev.cmdbuf = cmdbuf; + n25qxxx_dev.readbuf = readbuf; + n25qxxx_dev.sectorshift = N25Q128_SECTOR_SHIFT; + n25qxxx_dev.pageshift = N25Q128_PAGE_SHIFT; + n25qxxx_dev.nsectors = N25Q128_SECTOR_COUNT; +} + +__ramfunc__ ssize_t up_progmem_ext_getpage(size_t addr) +{ + ssize_t page_address = (addr - STM32_FMC_BANK4) / N25Q128_SECTOR_COUNT; + + return page_address; +} + +__ramfunc__ ssize_t up_progmem_ext_eraseblock(size_t block) +{ + ssize_t size = N25Q128_SECTOR_COUNT; + + irqstate_t irqstate = px4_enter_critical_section(); + stm32h7_qspi_exit_memorymapped(ptr_qspi_dev); + + n25qxxx_erase_sector(&n25qxxx_dev, block); + + stm32h7_qspi_enter_memorymapped(ptr_qspi_dev, &qspi_meminfo, 0); + px4_leave_critical_section(irqstate); + return size; +} + +__ramfunc__ ssize_t up_progmem_ext_write(size_t addr, FAR const void *buf, size_t count) +{ + ssize_t ret_val = 0; + + irqstate_t irqstate = px4_enter_critical_section(); + stm32h7_qspi_exit_memorymapped(ptr_qspi_dev); + + addr &= 0xFFFFFF; + n25qxxx_write_page(&n25qxxx_dev, buf, (off_t)addr, count); + + stm32h7_qspi_enter_memorymapped(ptr_qspi_dev, &qspi_meminfo, 0); + px4_leave_critical_section(irqstate); + + return ret_val; +} + +/************************************************************************************ + * Name: n25qxxx_command + ************************************************************************************/ + +__ramfunc__ int n25qxxx_command(FAR struct qspi_dev_s *qspi, uint8_t cmd) +{ + struct qspi_cmdinfo_s cmdinfo; + + finfo("CMD: %02" PRIx8 "\n", cmd); + + cmdinfo.flags = 0; + cmdinfo.addrlen = 0; + cmdinfo.cmd = cmd; + cmdinfo.buflen = 0; + cmdinfo.addr = 0; + cmdinfo.buffer = NULL; + + int rv; + rv = qspi_command(qspi, &cmdinfo); + return rv; +} + +/************************************************************************************ + * Name: n25qxxx_read_status + ************************************************************************************/ + +__ramfunc__ uint8_t n25qxxx_read_status(FAR struct n25qxxx_dev_s *priv) +{ + DEBUGVERIFY(n25qxxx_command_read(priv->qspi, N25QXXX_READ_STATUS, + (FAR void *)&priv->readbuf[0], 1)); + return priv->readbuf[0]; +} + +/************************************************************************************ + * Name: n25qxxx_command_read + ************************************************************************************/ + +__ramfunc__ int n25qxxx_command_read(FAR struct qspi_dev_s *qspi, uint8_t cmd, + FAR void *buffer, size_t buflen) +{ + struct qspi_cmdinfo_s cmdinfo; + + finfo("CMD: %02" PRIx8 " buflen: %zu\n", cmd, buflen); + + cmdinfo.flags = QSPICMD_READDATA; + cmdinfo.addrlen = 0; + cmdinfo.cmd = cmd; + cmdinfo.buflen = buflen; + cmdinfo.addr = 0; + cmdinfo.buffer = buffer; + + int rv; + rv = qspi_command(qspi, &cmdinfo); + return rv; +} + + +/************************************************************************************ + * Name: n25qxxx_write_enable + ************************************************************************************/ + +__ramfunc__ void n25qxxx_write_enable(FAR struct n25qxxx_dev_s *priv) +{ + uint8_t status; + + do { + n25qxxx_command(priv->qspi, N25QXXX_WRITE_ENABLE); + status = n25qxxx_read_status(priv); + } while ((status & STATUS_WEL_MASK) != STATUS_WEL_ENABLED); +} + +/************************************************************************************ + * Name: n25qxxx_write_disable + ************************************************************************************/ + +__ramfunc__ void n25qxxx_write_disable(FAR struct n25qxxx_dev_s *priv) +{ + uint8_t status; + + do { + n25qxxx_command(priv->qspi, N25QXXX_WRITE_DISABLE); + status = n25qxxx_read_status(priv); + } while ((status & STATUS_WEL_MASK) != STATUS_WEL_DISABLED); +} + +/************************************************************************************ + * Name: n25qxxx_write_page + ************************************************************************************/ + +__ramfunc__ int n25qxxx_write_page(struct n25qxxx_dev_s *priv, FAR const uint8_t *buffer, + off_t address, size_t buflen) +{ + struct qspi_meminfo_s meminfo; + unsigned int pagesize; + unsigned int npages; + unsigned int firstpagesize = 0; + int ret = OK; + unsigned int i; + + finfo("address: %08jx buflen: %zu\n", (intmax_t)address, buflen); + + pagesize = (1 << priv->pageshift); + + /* Set up non-varying parts of transfer description */ + + meminfo.flags = QSPIMEM_WRITE; + meminfo.cmd = N25QXXX_PAGE_PROGRAM; + meminfo.addrlen = 3; + meminfo.dummies = 0; + meminfo.buffer = (void *)buffer; + + if (0 != (address % pagesize)) { + firstpagesize = pagesize - (address % pagesize); + } + + if (buflen <= firstpagesize) { + meminfo.addr = address; + meminfo.buflen = buflen; + ret = n25qxxx_write_one_page(priv, &meminfo); + + } else { + + if (firstpagesize > 0) { + meminfo.addr = address; + meminfo.buflen = firstpagesize; + ret = n25qxxx_write_one_page(priv, &meminfo); + + buffer += firstpagesize; + address += firstpagesize; + buflen -= firstpagesize; + } + + npages = (buflen >> priv->pageshift); + + meminfo.buflen = pagesize; + + /* Then write each page */ + + for (i = 0; (i < npages) && (ret == OK); i++) { + /* Set up varying parts of the transfer description */ + + meminfo.addr = address; + meminfo.buffer = (void *)buffer; + + ret = n25qxxx_write_one_page(priv, &meminfo); + + /* Update for the next time through the loop */ + + buffer += pagesize; + address += pagesize; + buflen -= pagesize; + } + + if ((ret == OK) && (buflen > 0)) { + meminfo.addr = address; + meminfo.buffer = (void *)buffer; + meminfo.buflen = buflen; + + ret = n25qxxx_write_one_page(priv, &meminfo); + } + } + + return ret; +} + +__ramfunc__ int n25qxxx_write_one_page(struct n25qxxx_dev_s *priv, struct qspi_meminfo_s *meminfo) +{ + int ret; + + n25qxxx_write_enable(priv); + ret = qspi_memory(priv->qspi, meminfo); + n25qxxx_write_disable(priv); + + if (ret < 0) { + ferr("ERROR: QSPI_MEMORY failed writing address=%06" PRIx32 "\n", + meminfo->addr); + } + + return ret; +} + +/************************************************************************************ + * Name: n25qxxx_erase_sector + ************************************************************************************/ + +__ramfunc__ int n25qxxx_erase_sector(struct n25qxxx_dev_s *priv, off_t sector) +{ + off_t address; + uint8_t status; + + finfo("sector: %08jx\n", (intmax_t) sector); + + /* Check that the flash is ready and unprotected */ + + status = n25qxxx_read_status(priv); + + if ((status & STATUS_BUSY_MASK) != STATUS_READY) { + ferr("ERROR: Flash busy: %02" PRIx8, status); + return -EBUSY; + } + + /* Get the address associated with the sector */ + + address = (off_t)sector << priv->sectorshift; + + if ((status & (STATUS_BP3_MASK | STATUS_BP_MASK)) != 0 && + n25qxxx_isprotected(priv, status, address)) { + ferr("ERROR: Flash protected: %02" PRIx8, status); + return -EACCES; + } + + /* Send the sector erase command */ + + n25qxxx_write_enable(priv); + n25qxxx_command_address(priv->qspi, N25QXXX_SUBSECTOR_ERASE, address, 3); + + /* Wait for erasure to finish */ + + while ((n25qxxx_read_status(priv) & STATUS_BUSY_MASK) != 0); + + return OK; +} + +/************************************************************************************ + * Name: n25qxxx_isprotected + ************************************************************************************/ + +__ramfunc__ bool n25qxxx_isprotected(FAR struct n25qxxx_dev_s *priv, uint8_t status, + off_t address) +{ + off_t protstart; + off_t protend; + off_t protsize; + unsigned int bp; + + /* The BP field is spread across non-contiguous bits */ + + bp = (status & STATUS_BP_MASK) >> STATUS_BP_SHIFT; + + if (status & STATUS_BP3_MASK) { + bp |= 8; + } + + /* the BP field is essentially the power-of-two of the number of 64k sectors, + * saturated to the device size. + */ + + if (0 == bp) { + return false; + } + + protsize = 0x00010000; + protsize <<= (protsize << (bp - 1)); + protend = (1 << priv->sectorshift) * priv->nsectors; + + if (protsize > protend) { + protsize = protend; + } + + /* The final protection range then depends on if the protection region is + * configured top-down or bottom up (assuming CMP=0). + */ + + if ((status & STATUS_TB_MASK) != 0) { + protstart = 0x00000000; + protend = protstart + protsize; + + } else { + protstart = protend - protsize; + /* protend already computed above */ + } + + return (address >= protstart && address < protend); +} + +/************************************************************************************ + * Name: n25qxxx_command_address + ************************************************************************************/ + +__ramfunc__ int n25qxxx_command_address(FAR struct qspi_dev_s *qspi, uint8_t cmd, + off_t addr, uint8_t addrlen) +{ + struct qspi_cmdinfo_s cmdinfo; + + finfo("CMD: %02" PRIx8 " Address: %04jx addrlen=%" PRIx8 "\n", cmd, (intmax_t) addr, addrlen); + + cmdinfo.flags = QSPICMD_ADDRESS; + cmdinfo.addrlen = addrlen; + cmdinfo.cmd = cmd; + cmdinfo.buflen = 0; + cmdinfo.addr = addr; + cmdinfo.buffer = NULL; + + int rv; + rv = qspi_command(qspi, &cmdinfo); + return rv; +} diff --git a/boards/hkust/nxt-dual/src/hw_config.h b/boards/hkust/nxt-dual/src/hw_config.h new file mode 100644 index 0000000000..7c2676f4ff --- /dev/null +++ b/boards/hkust/nxt-dual/src/hw_config.h @@ -0,0 +1,135 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +/**************************************************************************** + * 10-8--2016: + * To simplify the ripple effect on the tools, we will be using + * /dev/serial/by-id/PX4 to locate PX4 devices. Therefore + * moving forward all Bootloaders must contain the prefix "PX4 BL " + * in the USBDEVICESTRING + * This Change will be made in an upcoming BL release + ****************************************************************************/ +/* + * Define usage to configure a bootloader + * + * + * Constant example Usage + * APP_LOAD_ADDRESS 0x08004000 - The address in Linker Script, where the app fw is org-ed + * BOOTLOADER_DELAY 5000 - Ms to wait while under USB pwr or bootloader request + * BOARD_FMUV2 + * INTERFACE_USB 1 - (Optional) Scan and use the USB interface for bootloading + * INTERFACE_USART 1 - (Optional) Scan and use the Serial interface for bootloading + * USBDEVICESTRING "PX4 BL FMU v2.x" - USB id string + * USBPRODUCTID 0x0011 - PID Should match defconfig + * BOOT_DELAY_ADDRESS 0x000001a0 - (Optional) From the linker script from Linker Script to get a custom + * delay provided by an APP FW + * BOARD_TYPE 9 - Must match .prototype boad_id + * _FLASH_KBYTES (*(uint16_t *)0x1fff7a22) - Run time flash size detection + * BOARD_FLASH_SECTORS ((_FLASH_KBYTES == 0x400) ? 11 : 23) - Run time determine the physical last sector + * BOARD_FLASH_SECTORS 11 - Hard coded zero based last sector + * BOARD_FLASH_SIZE (_FLASH_KBYTES*1024)- Total Flash size of device, determined at run time. + * (1024 * 1024) - Hard coded Total Flash of device - The bootloader and app reserved will be deducted + * programmatically + * + * BOARD_FIRST_FLASH_SECTOR_TO_ERASE 2 - Optional sectors index in the flash_sectors table (F4 only), to begin erasing. + * This is to allow sectors to be reserved for app fw usage. That will NOT be erased + * during a FW upgrade. + * The default is 0, and selects the first sector to be erased, as the 0th entry in the + * flash_sectors table. Which is the second physical sector of FLASH in the device. + * The first physical sector of FLASH is used by the bootloader, and is not defined + * in the table. + * + * APP_RESERVATION_SIZE (BOARD_FIRST_FLASH_SECTOR_TO_ERASE * 16 * 1024) - Number of bytes reserved by the APP FW. This number plus + * BOOTLOADER_RESERVATION_SIZE will be deducted from + * BOARD_FLASH_SIZE to determine the size of the App FW + * and hence the address space of FLASH to erase and program. + * USBMFGSTRING "PX4 AP" - Optional USB MFG string (default is '3D Robotics' if not defined.) + * SERIAL_BREAK_DETECT_DISABLED - Optional prevent break selection on Serial port from entering or staying in BL + * + * * Other defines are somewhat self explanatory. + */ + +/* Boot device selection list*/ +#define USB0_DEV 0x01 +#define SERIAL0_DEV 0x02 +#define SERIAL1_DEV 0x04 + +#define APP_LOAD_ADDRESS 0x08020000 +#define BOOTLOADER_DELAY 5000 +#define INTERFACE_USB 1 +#define INTERFACE_USB_CONFIG "/dev/ttyACM0" +#define BOARD_VBUS MK_GPIO_INPUT(GPIO_OTGFS_VBUS) + +//#define USE_VBUS_PULL_DOWN +#define INTERFACE_USART 6 +#define INTERFACE_USART_CONFIG "/dev/ttyS5,57600" +#define BOOT_DELAY_ADDRESS 0x000001a0 +#define BOARD_TYPE 1013 +#define _FLASH_KBYTES (*(uint32_t *)0x1FF1E880) +#define BOARD_FLASH_SECTORS (15) +#define BOARD_FLASH_SIZE (_FLASH_KBYTES * 1024) + +#define OSC_FREQ 16 + +#define BOARD_PIN_LED_ACTIVITY GPIO_nLED_BLUE // BLUE +#define BOARD_PIN_LED_BOOTLOADER GPIO_nLED_RED // RED +#define BOARD_LED_ON 1 +#define BOARD_LED_OFF 0 + +#define SERIAL_BREAK_DETECT_DISABLED 1 + +#if !defined(ARCH_SN_MAX_LENGTH) +# define ARCH_SN_MAX_LENGTH 12 +#endif + +#if !defined(APP_RESERVATION_SIZE) +# define APP_RESERVATION_SIZE 0 +#endif + +#if !defined(BOARD_FIRST_FLASH_SECTOR_TO_ERASE) +# define BOARD_FIRST_FLASH_SECTOR_TO_ERASE 1 +#endif + +#if !defined(USB_DATA_ALIGN) +# define USB_DATA_ALIGN +#endif + +#ifndef BOOT_DEVICES_SELECTION +# define BOOT_DEVICES_SELECTION USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +#endif + +#ifndef BOOT_DEVICES_FILTER_ONUSB +# define BOOT_DEVICES_FILTER_ONUSB USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +#endif diff --git a/boards/hkust/nxt-dual/src/i2c.cpp b/boards/hkust/nxt-dual/src/i2c.cpp new file mode 100644 index 0000000000..72ba2d6c0b --- /dev/null +++ b/boards/hkust/nxt-dual/src/i2c.cpp @@ -0,0 +1,39 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { + initI2CBusExternal(1), + initI2CBusExternal(4), +}; diff --git a/boards/hkust/nxt-dual/src/init.c b/boards/hkust/nxt-dual/src/init.c new file mode 100644 index 0000000000..657c0080c0 --- /dev/null +++ b/boards/hkust/nxt-dual/src/init.c @@ -0,0 +1,205 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file init.c + * + * FMU-specific early startup code. This file implements the + * board_app_initialize() function that is called early by nsh during startup. + * + * Code here is run before the rcS script is invoked; it should start required + * subsystems and perform board-specific initialisation. + */ + +#include "board_config.h" + +#include + +#include +#include +#include +#include +#include +#include "arm_internal.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +# if defined(FLASH_BASED_PARAMS) +# include +#endif + +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +__END_DECLS + +/************************************************************************************ + * Name: board_peripheral_reset + * + * Description: + * + ************************************************************************************/ +__EXPORT void board_peripheral_reset(int ms) +{ + UNUSED(ms); +} + +/************************************************************************************ + * Name: board_on_reset + * + * Description: + * Optionally provided function called on entry to board_system_reset + * It should perform any house keeping prior to the rest. + * + * status - 1 if resetting to boot loader + * 0 if just resetting + * + ************************************************************************************/ +__EXPORT void board_on_reset(int status) +{ + for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { + px4_arch_configgpio(PX4_MAKE_GPIO_INPUT(io_timer_channel_get_as_pwm_input(i))); + } + + if (status >= 0) { + up_mdelay(6); + } +} + +/************************************************************************************ + * Name: stm32_boardinitialize + * + * Description: + * All STM32 architectures must provide the following entry point. This entry point + * is called early in the initialization -- after all memory has been configured + * and mapped but before any devices have been initialized. + * + ************************************************************************************/ +__EXPORT void stm32_boardinitialize(void) +{ + /* Reset PWM first thing */ + board_on_reset(-1); + + /* configure LEDs */ + board_autoled_initialize(); + + /* configure pins */ + const uint32_t gpio[] = PX4_GPIO_INIT_LIST; + px4_gpio_init(gpio, arraySize(gpio)); + + /* configure SPI interfaces */ + stm32_spiinitialize(); + + /* configure USB interfaces */ + stm32_usbinitialize(); + +} + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ +__EXPORT int board_app_initialize(uintptr_t arg) +{ + /* Need hrt running before using the ADC */ + px4_platform_init(); + + /* configure the DMA allocator */ + if (board_dma_alloc_init() < 0) { + syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); + } + + /* initial LED state */ + drv_led_start(); + led_off(LED_RED); + led_off(LED_BLUE); + + if (board_hardfault_init(2, true) != 0) { + led_on(LED_BLUE); + } + +#ifdef CONFIG_MMCSD + int ret = stm32_sdio_initialize(); + + if (ret != OK) { + led_on(LED_BLUE); + return ret; + } + +#endif + +// TODO:internal flash store parameters +#if defined(FLASH_BASED_PARAMS) + static sector_descriptor_t params_sector_map[] = { + {15, 128 * 1024, 0x081E0000}, + {0, 0, 0}, + }; + + /* Initialize the flashfs layer to use heap allocated memory */ + int result = parameter_flashfs_init(params_sector_map, NULL, 0); + + if (result != OK) { + syslog(LOG_ERR, "[boot] FAILED to init params in FLASH %d\n", result); + led_on(LED_RED); + } + +#endif + + /* Configure the HW based on the manifest */ + px4_platform_configure(); + + return OK; +} diff --git a/boards/hkust/nxt-dual/src/led.c b/boards/hkust/nxt-dual/src/led.c new file mode 100644 index 0000000000..0420c1da2e --- /dev/null +++ b/boards/hkust/nxt-dual/src/led.c @@ -0,0 +1,113 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file led.c + * + * LED backend. + */ + +#include + +#include + +#include "chip.h" +#include "stm32_gpio.h" +#include "board_config.h" + +#include +#include + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +extern void led_toggle(int led); +__END_DECLS + +# define xlat(p) (p) +static uint32_t g_ledmap[] = { + GPIO_nLED_GREEN, // Indexed by BOARD_LED_GREEN + GPIO_nLED_BLUE, // Indexed by BOARD_LED_BLUE + GPIO_nLED_RED, // Indexed by BOARD_LED_RED +}; + +__EXPORT void led_init(void) +{ + /* Configure LED GPIOs for output */ + for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) { + if (g_ledmap[l] != 0) { + stm32_configgpio(g_ledmap[l]); + } + } +} + +static void phy_set_led(int led, bool state) +{ + /* Drive Low to switch on */ + if (g_ledmap[led] != 0) { + stm32_gpiowrite(g_ledmap[led], !state); + } +} + +static bool phy_get_led(int led) +{ + /* If Low it is on */ + if (g_ledmap[led] != 0) { + return !stm32_gpioread(g_ledmap[led]); + } + + return false; +} + +__EXPORT void led_on(int led) +{ + phy_set_led(xlat(led), true); +} + +__EXPORT void led_off(int led) +{ + phy_set_led(xlat(led), false); +} + +__EXPORT void led_toggle(int led) +{ + phy_set_led(xlat(led), !phy_get_led(xlat(led))); +} diff --git a/boards/hkust/nxt-dual/src/manifest.c b/boards/hkust/nxt-dual/src/manifest.c new file mode 100644 index 0000000000..e13f3d0860 --- /dev/null +++ b/boards/hkust/nxt-dual/src/manifest.c @@ -0,0 +1,131 @@ +/**************************************************************************** + * + * Copyright (c) 2018-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 manifest.c + * + * This module supplies the interface to the manifest of hardware that is + * optional and dependent on the HW REV and HW VER IDs + * + * The manifest allows the system to know whether a hardware option + * say for example the PX4IO is an no-pop option vs it is broken. + * + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include + +#include "systemlib/px4_macros.h" + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +typedef struct { + uint32_t hw_ver_rev; /* the version and revision */ + const px4_hw_mft_item_t *mft; /* The first entry */ + uint32_t entries; /* the lenght of the list */ +} px4_hw_mft_list_entry_t; + +typedef px4_hw_mft_list_entry_t *px4_hw_mft_list_entry; +#define px4_hw_mft_list_uninitialized (px4_hw_mft_list_entry) -1 + +static const px4_hw_mft_item_t device_unsupported = {0, 0, 0}; + +// List of components on a specific board configuration +// The index of those components is given by the enum (px4_hw_mft_item_id_t) +// declared in board_common.h +static const px4_hw_mft_item_t hw_mft_list_v0600[] = { + { + .present = 0, + .mandatory = 0, + .connection = px4_hw_con_unknown, + }, +}; + +static px4_hw_mft_list_entry_t mft_lists[] = { + {V6U00, hw_mft_list_v0600, arraySize(hw_mft_list_v0600)}, +}; + +/************************************************************************************ + * Name: board_query_manifest + * + * Description: + * Optional returns manifest item. + * + * Input Parameters: + * manifest_id - the ID for the manifest item to retrieve + * + * Returned Value: + * 0 - item is not in manifest => assume legacy operations + * pointer to a manifest item + * + ************************************************************************************/ + +__EXPORT px4_hw_mft_item board_query_manifest(px4_hw_mft_item_id_t id) +{ + static px4_hw_mft_list_entry boards_manifest = px4_hw_mft_list_uninitialized; + + if (boards_manifest == px4_hw_mft_list_uninitialized) { + uint32_t ver_rev = board_get_hw_version() << 16; + ver_rev |= board_get_hw_revision(); + + for (unsigned i = 0; i < arraySize(mft_lists); i++) { + if (mft_lists[i].hw_ver_rev == ver_rev) { + boards_manifest = &mft_lists[i]; + break; + } + } + + if (boards_manifest == px4_hw_mft_list_uninitialized) { + syslog(LOG_ERR, "[boot] Board %08" PRIx32 " is not supported!\n", ver_rev); + } + } + + px4_hw_mft_item rv = &device_unsupported; + + if (boards_manifest != px4_hw_mft_list_uninitialized && + id < boards_manifest->entries) { + rv = &boards_manifest->mft[id]; + } + + return rv; +} diff --git a/boards/hkust/nxt-dual/src/mtd.cpp b/boards/hkust/nxt-dual/src/mtd.cpp new file mode 100644 index 0000000000..e374a9be7e --- /dev/null +++ b/boards/hkust/nxt-dual/src/mtd.cpp @@ -0,0 +1,77 @@ +/**************************************************************************** + * + * 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. + * + ****************************************************************************/ +//TODO:Prepare for NxtDual + +#include +#include +// KiB BS nB +static const px4_mft_device_t spi5 = { // FM25V02A on FMUM native: 32K X 8, emulated as (1024 Blocks of 32) + .bus_type = px4_mft_device_t::SPI, + .devid = SPIDEV_FLASH(0) +}; + +static const px4_mtd_entry_t fmum_fram = { + .device = &spi5, + .npart = 1, + .partd = { + { + .type = MTD_PARAMETERS, + .path = "/fs/mtd_params", + .nblocks = 32 + } + }, +}; + +static const px4_mtd_manifest_t board_mtd_config = { + .nconfigs = 1, + .entries = { + &fmum_fram + } +}; + +static const px4_mft_entry_s mtd_mft = { + .type = MTD, + .pmft = (void *) &board_mtd_config, +}; + +static const px4_mft_s mft = { + .nmft = 1, + .mfts = { + &mtd_mft + } +}; + +const px4_mft_s *board_get_manifest(void) +{ + return &mft; +} diff --git a/boards/hkust/nxt-dual/src/sdio.c b/boards/hkust/nxt-dual/src/sdio.c new file mode 100644 index 0000000000..869d757756 --- /dev/null +++ b/boards/hkust/nxt-dual/src/sdio.c @@ -0,0 +1,177 @@ +/**************************************************************************** + * + * Copyright (C) 2014, 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "chip.h" +#include "board_config.h" +#include "stm32_gpio.h" +#include "stm32_sdmmc.h" + +#ifdef CONFIG_MMCSD + + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Card detections requires card support and a card detection GPIO */ + +#define HAVE_NCD 1 +#if !defined(GPIO_SDMMC1_NCD) +# undef HAVE_NCD +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static FAR struct sdio_dev_s *sdio_dev; +#ifdef HAVE_NCD +static bool g_sd_inserted = 0xff; /* Impossible value */ +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_ncd_interrupt + * + * Description: + * Card detect interrupt handler. + * + ****************************************************************************/ + +#ifdef HAVE_NCD +static int stm32_ncd_interrupt(int irq, FAR void *context) +{ + bool present; + + present = !stm32_gpioread(GPIO_SDMMC1_NCD); + + if (sdio_dev && present != g_sd_inserted) { + sdio_mediachange(sdio_dev, present); + g_sd_inserted = present; + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +int stm32_sdio_initialize(void) +{ + int ret; + +#ifdef HAVE_NCD + /* Card detect */ + + bool cd_status; + + /* Configure the card detect GPIO */ + + stm32_configgpio(GPIO_SDMMC1_NCD); + + /* Register an interrupt handler for the card detect pin */ + + stm32_gpiosetevent(GPIO_SDMMC1_NCD, true, true, true, stm32_ncd_interrupt); +#endif + + /* Mount the SDIO-based MMC/SD block driver */ + /* First, get an instance of the SDIO interface */ + + finfo("Initializing SDIO slot %d\n", SDIO_SLOTNO); + + sdio_dev = sdio_initialize(SDIO_SLOTNO); + + if (!sdio_dev) { + syslog(LOG_ERR, "[boot] Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); + return -ENODEV; + } + + /* Now bind the SDIO interface to the MMC/SD driver */ + + finfo("Bind SDIO to the MMC/SD driver, minor=%d\n", SDIO_MINOR); + + ret = mmcsd_slotinitialize(SDIO_MINOR, sdio_dev); + + if (ret != OK) { + syslog(LOG_ERR, "[boot] Failed to bind SDIO to the MMC/SD driver: %d\n", ret); + return ret; + } + + finfo("Successfully bound SDIO to the MMC/SD driver\n"); + +#ifdef HAVE_NCD + /* Use SD card detect pin to check if a card is g_sd_inserted */ + + cd_status = !stm32_gpioread(GPIO_SDMMC1_NCD); + finfo("Card detect : %d\n", cd_status); + + sdio_mediachange(sdio_dev, cd_status); +#else + /* Assume that the SD card is inserted. What choice do we have? */ + + sdio_mediachange(sdio_dev, true); +#endif + + return OK; +} + +#endif /* CONFIG_MMCSD */ diff --git a/boards/hkust/nxt-dual/src/spi.cpp b/boards/hkust/nxt-dual/src/spi.cpp new file mode 100644 index 0000000000..058c489826 --- /dev/null +++ b/boards/hkust/nxt-dual/src/spi.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +#include + + +constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { + initSPIBus(SPI::Bus::SPI1, { + initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortA, GPIO::Pin3}, SPI::DRDY{GPIO::PortA, GPIO::Pin1}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortA, GPIO::Pin2}, SPI::DRDY{GPIO::PortA, GPIO::Pin0}), + }), + initSPIBus(SPI::Bus::SPI2, { + initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortD, GPIO::Pin4}) + }), + initSPIBus(SPI::Bus::SPI3, { + // not in use, future development + }), + initSPIBus(SPI::Bus::SPI4, { + initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortC, GPIO::Pin2}, SPI::DRDY{GPIO::PortE, GPIO::Pin3}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortC, GPIO::Pin13}, SPI::DRDY{GPIO::PortE, GPIO::Pin4}), + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/hkust/nxt-dual/src/timer_config.cpp b/boards/hkust/nxt-dual/src/timer_config.cpp new file mode 100644 index 0000000000..27ad0f2476 --- /dev/null +++ b/boards/hkust/nxt-dual/src/timer_config.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer1, DMA{DMA::Index1}), + initIOTimer(Timer::Timer2, DMA{DMA::Index1}), + initIOTimer(Timer::Timer3, DMA{DMA::Index1}), + // initIOTimer(Timer::Timer2), + // initIOTimer(Timer::Timer3), +}; + +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel1}, {GPIO::PortE, GPIO::Pin9}), + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel2}, {GPIO::PortE, GPIO::Pin11}), + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel3}, {GPIO::PortE, GPIO::Pin13}), + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel4}, {GPIO::PortE, GPIO::Pin14}), + initIOTimerChannel(io_timers, {Timer::Timer2, Timer::Channel3}, {GPIO::PortB, GPIO::Pin10}), + initIOTimerChannel(io_timers, {Timer::Timer2, Timer::Channel4}, {GPIO::PortB, GPIO::Pin11}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel3}, {GPIO::PortB, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel4}, {GPIO::PortB, GPIO::Pin1}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/hkust/nxt-dual/src/usb.c b/boards/hkust/nxt-dual/src/usb.c new file mode 100644 index 0000000000..9591784866 --- /dev/null +++ b/boards/hkust/nxt-dual/src/usb.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file usb.c + * + * Board-specific USB functions. + */ + +#include "board_config.h" +#include +#include +#include +#include + +/************************************************************************************ + * Name: stm32_usbinitialize + * + * Description: + * Called to setup USB-related GPIO pins for the board. + * + ************************************************************************************/ + +__EXPORT void stm32_usbinitialize(void) +{ + /* The OTG FS has an internal soft pull-up */ + + /* Configure the OTG FS VBUS sensing GPIO, Power On, and Overcurrent GPIOs */ + +#ifdef CONFIG_STM32H7_OTGFS + stm32_configgpio(GPIO_OTGFS_VBUS); +#endif +} + +/************************************************************************************ + * Name: stm32_usbsuspend + * + * Description: + * Board logic must provide the stm32_usbsuspend logic if the USBDEV driver is + * used. This function is called whenever the USB enters or leaves suspend mode. + * This is an opportunity for the board logic to shutdown clocks, power, etc. + * while the USB is suspended. + * + ************************************************************************************/ +__EXPORT void stm32_usbsuspend(FAR struct usbdev_s *dev, bool resume) +{ + uinfo("resume: %d\n", resume); +} diff --git a/boards/hkust/nxt-v1/bootloader.px4board b/boards/hkust/nxt-v1/bootloader.px4board new file mode 100644 index 0000000000..19b6e662be --- /dev/null +++ b/boards/hkust/nxt-v1/bootloader.px4board @@ -0,0 +1,3 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_ROMFSROOT="" diff --git a/boards/hkust/nxt-v1/default.px4board b/boards/hkust/nxt-v1/default.px4board new file mode 100644 index 0000000000..bc04f1ce94 --- /dev/null +++ b/boards/hkust/nxt-v1/default.px4board @@ -0,0 +1,105 @@ +CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" +CONFIG_BOARD_ARCHITECTURE="cortex-m7" +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS0" +CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS1" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS2" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS3" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS5" +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_BOSCH_BMI088=y +CONFIG_DRIVERS_IMU_INVENSENSE_MPU6500=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM20602=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM42688P=y +CONFIG_DRIVERS_MAGNETOMETER_QMC5883L=y +CONFIG_DRIVERS_BAROMETER_BMP388=y +CONFIG_DRIVERS_IRLOCK=y +CONFIG_COMMON_LIGHT=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_COMMON_OPTICAL_FLOW=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_COMMON_TELEMETRY=y +CONFIG_DRIVERS_TONE_ALARM=y +#CONFIG_DRIVERS_UAVCAN=y +#CONFIG_BOARD_UAVCAN_INTERFACES=1 +#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_ATTITUDE_ESTIMATOR_Q=y +CONFIG_MODULES_ESC_BATTERY=y +CONFIG_MODULES_EVENTS=y +CONFIG_MODULES_FLIGHT_MODE_MANAGER=y +CONFIG_MODULES_FW_ATT_CONTROL=y +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_FW_POS_CONTROL=y +CONFIG_MODULES_FW_RATE_CONTROL=y +# CONFIG_MODULES_FW_POS_CONTROL_L1=y +CONFIG_MODULES_LOCAL_POSITION_ESTIMATOR=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_CONTROL_ALLOCATOR=y +CONFIG_MODULES_NAVIGATOR=y +CONFIG_MODULES_RC_UPDATE=y +CONFIG_MODULES_ROVER_POS_CONTROL=y +CONFIG_MODULES_UXRCE_DDS_CLIENT=y +CONFIG_MODULES_SENSORS=y +CONFIG_MODULES_SIH=y +CONFIG_MODULES_TEMPERATURE_COMPENSATION=y +CONFIG_MODULES_GIMBAL=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_MTD=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 +CONFIG_EXAMPLES_FAKE_GPS=y diff --git a/boards/hkust/nxt-v1/extras/hkust_nxt-v1_bootloader.bin b/boards/hkust/nxt-v1/extras/hkust_nxt-v1_bootloader.bin new file mode 100755 index 0000000000000000000000000000000000000000..1456ce1ab847b66f9330a5df2b0e1dfecfef3e6d GIT binary patch literal 43248 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 literal 0 HcmV?d00001 diff --git a/boards/hkust/nxt-v1/firmware.prototype b/boards/hkust/nxt-v1/firmware.prototype new file mode 100644 index 0000000000..d715678889 --- /dev/null +++ b/boards/hkust/nxt-v1/firmware.prototype @@ -0,0 +1,13 @@ +{ + "board_id": 1013, + "magic": "PX4FWv1", + "description": "Firmware for the MatekH743-slim board", + "image": "", + "build_time": 0, + "summary": "MatekH743-mini", + "version": "0.1", + "image_size": 0, + "image_maxsize": 1966080, + "git_identity": "", + "board_revision": 0 +} diff --git a/boards/hkust/nxt-v1/init/rc.board_defaults b/boards/hkust/nxt-v1/init/rc.board_defaults new file mode 100644 index 0000000000..d3504a657e --- /dev/null +++ b/boards/hkust/nxt-v1/init/rc.board_defaults @@ -0,0 +1,6 @@ +#!/bin/sh +# +# board specific defaults +#------------------------------------------------------------------------------ +param set-default SYS_HAS_MAG 0 +param set-default IMU_GYRO_RATEMAX 2000 diff --git a/boards/hkust/nxt-v1/init/rc.board_extras b/boards/hkust/nxt-v1/init/rc.board_extras new file mode 100644 index 0000000000..780b13dc96 --- /dev/null +++ b/boards/hkust/nxt-v1/init/rc.board_extras @@ -0,0 +1,13 @@ +#!/bin/sh +# +# board specific extras init +#------------------------------------------------------------------------------ + +# NxtV1 does not have OSD +# 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/hkust/nxt-v1/init/rc.board_sensors b/boards/hkust/nxt-v1/init/rc.board_sensors new file mode 100644 index 0000000000..5c51e76421 --- /dev/null +++ b/boards/hkust/nxt-v1/init/rc.board_sensors @@ -0,0 +1,16 @@ +#!/bin/sh +# +# board specific sensors init +#------------------------------------------------------------------------------ + +board_adc start + +# # Internal SPI bus ICM24688P +icm42688p -R 0 -s start + +# # Internal SPI bus BMI088 accel/gyro +bmi088 -A -R 0 -s start +bmi088 -G -R 0 -s start + +# internal baro +bmp388 -I -a 0x76 start diff --git a/boards/hkust/nxt-v1/nuttx-config/Kconfig b/boards/hkust/nxt-v1/nuttx-config/Kconfig new file mode 100644 index 0000000000..bb33d3cfda --- /dev/null +++ b/boards/hkust/nxt-v1/nuttx-config/Kconfig @@ -0,0 +1,17 @@ +# +# For a description of the syntax of this configuration file, +# see misc/tools/kconfig-language.txt. +# +config BOARD_HAS_PROBES + bool "Board provides GPIO or other Hardware for signaling to timing analyze." + default y + ---help--- + This board provides GPIO FMU-CH1-5, CAP1-6 as PROBE_1-11 to provide timing signals from selected drivers. + +config BOARD_USE_PROBES + bool "Enable the use the board provided FMU-CH1-5, CAP1-6 as PROBE_1-11" + default n + depends on BOARD_HAS_PROBES + + ---help--- + Select to use GPIO FMU-CH1-5, CAP1-6 to provide timing signals from selected drivers. diff --git a/boards/hkust/nxt-v1/nuttx-config/bootloader/defconfig b/boards/hkust/nxt-v1/nuttx-config/bootloader/defconfig new file mode 100644 index 0000000000..e051eadacd --- /dev/null +++ b/boards/hkust/nxt-v1/nuttx-config/bootloader/defconfig @@ -0,0 +1,92 @@ +# +# 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/hkust/nxt-v1/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743VI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARDCTL=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_INITTHREAD_PRIORITY=254 +CONFIG_BOARD_LATE_INITIALIZE=y +CONFIG_BOARD_LOOPSPERMSEC=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_C99_BOOL8=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x004b +CONFIG_CDCACM_PRODUCTSTR="HKUST UAV NxtPX4" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +#TODO:ally for VENDOR ID in the future +CONFIG_CDCACM_VENDORID=0x3162 +CONFIG_CDCACM_VENDORSTR="Matek" +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=y +CONFIG_DEFAULT_SMALL=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_INIT_ENTRYPOINT="bootloader_main" +CONFIG_INIT_STACKSIZE=3194 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_STRERROR=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_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 diff --git a/boards/hkust/nxt-v1/nuttx-config/include/board.h b/boards/hkust/nxt-v1/nuttx-config/include/board.h new file mode 100644 index 0000000000..003922a0ef --- /dev/null +++ b/boards/hkust/nxt-v1/nuttx-config/include/board.h @@ -0,0 +1,484 @@ +/************************************************************************************ + * nuttx-configs/px4_fmu-v6u/include/board.h + * + * Copyright (C) 2016-2019 Gregory Nutt. All rights reserved. + * Authors: David Sidrane + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ +#ifndef __NUTTX_CONFIG_MATEKH743SLIM_INCLUDE_BOARD_H +#define __NUTTX_CONFIG_MATEKH743SLIM_INCLUDE_BOARD_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include "board_dma_map.h" + +#include + +#ifndef __ASSEMBLY__ +# include +#endif + +#include "stm32_rcc.h" +#include "stm32_sdmmc.h" + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/* Clocking *************************************************************************/ +/* The MatekH743-Slim board provides the following clock sources: + * + * X1: 16 MHz crystal for HSE + * + * So we have these clock source available within the STM32 + * + * HSI: 16 MHz RC factory-trimmed + * HSE: 16 MHz crystal for HSE + */ + +#define STM32_BOARD_XTAL 16000000ul + +#define STM32_HSI_FREQUENCY 16000000ul +#define STM32_LSI_FREQUENCY 32000 +#define STM32_HSE_FREQUENCY STM32_BOARD_XTAL +#define STM32_LSE_FREQUENCY 32768 + +/* Main PLL Configuration. + * + * PLL source is HSE = 16,000,000 + * + * PLL_VCOx = (STM32_HSE_FREQUENCY / PLLM) * PLLN + * Subject to: + * + * 1 <= PLLM <= 63 + * 4 <= PLLN <= 512 + * 150 MHz <= PLL_VCOL <= 420MHz + * 192 MHz <= PLL_VCOH <= 836MHz + * + * SYSCLK = PLL_VCO / PLLP + * CPUCLK = SYSCLK / D1CPRE + * Subject to + * + * PLLP1 = {2, 4, 6, 8, ..., 128} + * PLLP2,3 = {2, 3, 4, ..., 128} + * CPUCLK <= 480 MHz + */ + +#define STM32_BOARD_USEHSE + +#define STM32_PLLCFG_PLLSRC RCC_PLLCKSELR_PLLSRC_HSE + +/* PLL1, wide 4 - 8 MHz input, enable DIVP, DIVQ, DIVR + * + * PLL1_VCO = (16,000,000 / 1) * 60 = 960 MHz + * + * PLL1P = PLL1_VCO/2 = 960 MHz / 2 = 480 MHz + * PLL1Q = PLL1_VCO/4 = 960 MHz / 4 = 240 MHz + * PLL1R = PLL1_VCO/8 = 960 MHz / 8 = 120 MHz + */ + +#define STM32_PLLCFG_PLL1CFG (RCC_PLLCFGR_PLL1VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL1RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP1EN | \ + RCC_PLLCFGR_DIVQ1EN | \ + RCC_PLLCFGR_DIVR1EN) +#define STM32_PLLCFG_PLL1M RCC_PLLCKSELR_DIVM1(1) +#define STM32_PLLCFG_PLL1N RCC_PLL1DIVR_N1(60) +#define STM32_PLLCFG_PLL1P RCC_PLL1DIVR_P1(2) +#define STM32_PLLCFG_PLL1Q RCC_PLL1DIVR_Q1(4) +#define STM32_PLLCFG_PLL1R RCC_PLL1DIVR_R1(8) + +#define STM32_VCO1_FREQUENCY ((STM32_HSE_FREQUENCY / 1) * 60) +#define STM32_PLL1P_FREQUENCY (STM32_VCO1_FREQUENCY / 2) +#define STM32_PLL1Q_FREQUENCY (STM32_VCO1_FREQUENCY / 4) +#define STM32_PLL1R_FREQUENCY (STM32_VCO1_FREQUENCY / 8) + +/* PLL2 */ + +#define STM32_PLLCFG_PLL2CFG (RCC_PLLCFGR_PLL2VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL2RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVP2EN | \ + RCC_PLLCFGR_DIVQ2EN | \ + RCC_PLLCFGR_DIVR2EN) +#define STM32_PLLCFG_PLL2M RCC_PLLCKSELR_DIVM2(4) +#define STM32_PLLCFG_PLL2N RCC_PLL2DIVR_N2(48) +#define STM32_PLLCFG_PLL2P RCC_PLL2DIVR_P2(2) +#define STM32_PLLCFG_PLL2Q RCC_PLL2DIVR_Q2(2) +#define STM32_PLLCFG_PLL2R RCC_PLL2DIVR_R2(2) + +#define STM32_VCO2_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) +#define STM32_PLL2P_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2Q_FREQUENCY (STM32_VCO2_FREQUENCY / 2) +#define STM32_PLL2R_FREQUENCY (STM32_VCO2_FREQUENCY / 2) + +/* PLL3 */ + +#define STM32_PLLCFG_PLL3CFG (RCC_PLLCFGR_PLL3VCOSEL_WIDE | \ + RCC_PLLCFGR_PLL3RGE_4_8_MHZ | \ + RCC_PLLCFGR_DIVQ3EN) +#define STM32_PLLCFG_PLL3M RCC_PLLCKSELR_DIVM3(4) +#define STM32_PLLCFG_PLL3N RCC_PLL3DIVR_N3(48) +#define STM32_PLLCFG_PLL3P RCC_PLL3DIVR_P3(2) +#define STM32_PLLCFG_PLL3Q RCC_PLL3DIVR_Q3(4) +#define STM32_PLLCFG_PLL3R RCC_PLL3DIVR_R3(2) + +#define STM32_VCO3_FREQUENCY ((STM32_HSE_FREQUENCY / 4) * 48) +#define STM32_PLL3P_FREQUENCY (STM32_VCO3_FREQUENCY / 2) +#define STM32_PLL3Q_FREQUENCY (STM32_VCO3_FREQUENCY / 4) +#define STM32_PLL3R_FREQUENCY (STM32_VCO3_FREQUENCY / 2) + +/* SYSCLK = PLL1P = 480MHz + * CPUCLK = SYSCLK / 1 = 480 MHz + */ + +#define STM32_RCC_D1CFGR_D1CPRE (RCC_D1CFGR_D1CPRE_SYSCLK) +#define STM32_SYSCLK_FREQUENCY (STM32_PLL1P_FREQUENCY) +#define STM32_CPUCLK_FREQUENCY (STM32_SYSCLK_FREQUENCY / 1) + +/* Configure Clock Assignments */ + +/* AHB clock (HCLK) is SYSCLK/2 (240 MHz max) + * HCLK1 = HCLK2 = HCLK3 = HCLK4 = 240 + */ + +#define STM32_RCC_D1CFGR_HPRE RCC_D1CFGR_HPRE_SYSCLKd2 /* HCLK = SYSCLK / 2 */ +#define STM32_ACLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* ACLK in D1, HCLK3 in D1 */ +#define STM32_HCLK_FREQUENCY (STM32_CPUCLK_FREQUENCY / 2) /* HCLK in D2, HCLK4 in D3 */ +#define STM32_BOARD_HCLK STM32_HCLK_FREQUENCY /* same as above, to satisfy compiler */ + +/* APB1 clock (PCLK1) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE1 RCC_D2CFGR_D2PPRE1_HCLKd2 /* PCLK1 = HCLK / 2 */ +#define STM32_PCLK1_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB2 clock (PCLK2) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D2CFGR_D2PPRE2 RCC_D2CFGR_D2PPRE2_HCLKd2 /* PCLK2 = HCLK / 2 */ +#define STM32_PCLK2_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB3 clock (PCLK3) is HCLK/2 (120 MHz) */ + +#define STM32_RCC_D1CFGR_D1PPRE RCC_D1CFGR_D1PPRE_HCLKd2 /* PCLK3 = HCLK / 2 */ +#define STM32_PCLK3_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* APB4 clock (PCLK4) is HCLK/4 (120 MHz) */ + +#define STM32_RCC_D3CFGR_D3PPRE RCC_D3CFGR_D3PPRE_HCLKd2 /* PCLK4 = HCLK / 2 */ +#define STM32_PCLK4_FREQUENCY (STM32_HCLK_FREQUENCY/2) + +/* Timer clock frequencies */ + +/* Timers driven from APB1 will be twice PCLK1 */ + +#define STM32_APB1_TIM2_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM3_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM4_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM5_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM6_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM7_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM12_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM13_CLKIN (2*STM32_PCLK1_FREQUENCY) +#define STM32_APB1_TIM14_CLKIN (2*STM32_PCLK1_FREQUENCY) + +/* Timers driven from APB2 will be twice PCLK2 */ + +#define STM32_APB2_TIM1_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM8_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM15_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM16_CLKIN (2*STM32_PCLK2_FREQUENCY) +#define STM32_APB2_TIM17_CLKIN (2*STM32_PCLK2_FREQUENCY) + +/* Kernel Clock Configuration + * + * Note: look at Table 54 in ST Manual + */ + +/* I2C123 clock source */ + +#define STM32_RCC_D2CCIP2R_I2C123SRC RCC_D2CCIP2R_I2C123SEL_HSI + +/* I2C4 clock source */ + +#define STM32_RCC_D3CCIPR_I2C4SRC RCC_D3CCIPR_I2C4SEL_HSI + +/* SPI123 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI123SRC RCC_D2CCIP1R_SPI123SEL_PLL2 + +/* SPI45 clock source */ + +#define STM32_RCC_D2CCIP1R_SPI45SRC RCC_D2CCIP1R_SPI45SEL_PLL2 + +/* SPI6 clock source */ + +#define STM32_RCC_D3CCIPR_SPI6SRC RCC_D3CCIPR_SPI6SEL_PLL2 + +/* USB 1 and 2 clock source */ + +#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_PLL3 + +/* ADC 1 2 3 clock source */ + +#define STM32_RCC_D3CCIPR_ADCSEL RCC_D3CCIPR_ADCSEL_PLL2 + +/* FDCAN 1 clock source */ + +// #define STM32_RCC_D2CCIP1R_FDCANSEL RCC_D2CCIP1R_FDCANSEL_HSE /* FDCAN 1 2 clock source */ + +#define STM32_FDCANCLK STM32_HSE_FREQUENCY + +/* FLASH wait states + * + * ------------ ---------- ----------- + * Vcore MAX ACLK WAIT STATES + * ------------ ---------- ----------- + * 1.15-1.26 V 70 MHz 0 + * (VOS1 level) 140 MHz 1 + * 210 MHz 2 + * 1.05-1.15 V 55 MHz 0 + * (VOS2 level) 110 MHz 1 + * 165 MHz 2 + * 220 MHz 3 + * 0.95-1.05 V 45 MHz 0 + * (VOS3 level) 90 MHz 1 + * 135 MHz 2 + * 180 MHz 3 + * 225 MHz 4 + * ------------ ---------- ----------- + */ + +#define BOARD_FLASH_WAITSTATES 2 + +/* SDMMC definitions ********************************************************/ + +/* Init 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 board has two, LED_GREEN a Green LED and LED_BLUE a Blue LED, + * that can be controlled by software. + * + * If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any way. + * The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +#define BOARD_LED1 0 +#define BOARD_LED2 1 +#define BOARD_LED3 2 +#define BOARD_NLEDS 3 + +#define BOARD_LED_RED BOARD_LED1 +#define BOARD_LED_GREEN BOARD_LED2 +#define BOARD_LED_BLUE BOARD_LED3 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) + +/* If CONFIG_ARCH_LEDS is defined, the usage by the board port is defined in + * include/board.h and src/stm32_leds.c. The LEDs are used to encode OS-related + * events as follows: + * + * + * SYMBOL Meaning LED state + * Red Green Blue + * ---------------------- -------------------------- ------ ------ ----*/ + +#define LED_STARTED 0 /* NuttX has been started OFF OFF OFF */ +#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF OFF ON */ +#define LED_IRQSENABLED 2 /* Interrupts enabled OFF ON OFF */ +#define LED_STACKCREATED 3 /* Idle stack created OFF ON ON */ +#define LED_INIRQ 4 /* In an interrupt N/C N/C GLOW */ +#define LED_SIGNAL 5 /* In a signal handler N/C GLOW N/C */ +#define LED_ASSERTION 6 /* An assertion failed GLOW N/C GLOW */ +#define LED_PANIC 7 /* The system has crashed Blink OFF N/C */ +#define LED_IDLE 8 /* MCU is is sleep mode ON OFF OFF */ + +/* Thus if the Green LED is statically on, NuttX has successfully booted and + * is, apparently, running normally. If the Red LED is flashing at + * approximately 2Hz, then a fatal error has been detected and the system + * has halted. + */ + +/* Alternate function pin selections ************************************************/ + +#define GPIO_USART1_RX GPIO_USART1_RX_2 /* PBA10 */ +#define GPIO_USART1_TX GPIO_USART1_TX_2 /* PA9 */ +#define GPIO_USART1_CK GPIO_USART1_CK /* PB6 */ + +#define GPIO_USART2_RX GPIO_USART2_RX_2 /* PD6 */ +#define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ +#define GPIO_USART2_CK GPIO_USART2_CK_2 /* PD7 */ + + +#define GPIO_USART3_RX GPIO_USART3_RX_3 /* PD9 */ +#define GPIO_USART3_TX GPIO_USART3_TX_3 /* PD8 */ +#define GPIO_USART3_CK GPIO_USART3_CK_3 /* PD10 */ + + +#define GPIO_UART4_RX GPIO_UART4_RX_5 /* PD0 */ +#define GPIO_UART4_TX GPIO_UART4_TX_5 /* PD1 */ + +#define GPIO_UART5_RX GPIO_UART5_RX_1 /* PB12 */ +#define GPIO_UART5_TX GPIO_UART5_TX_1 /* PB13 */ + +#define GPIO_UART7_RX GPIO_UART7_RX_3 /* PE7 */ +#define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ + + +/* SPI + * + + */ + +#define ADJ_SLEW_RATE(p) (((p) & ~GPIO_SPEED_MASK) | (GPIO_SPEED_2MHz)) + +#define GPIO_SPI1_MISO GPIO_SPI1_MISO_1 /* PA6 */ +#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_1 /* PA7 */ +#define GPIO_SPI1_SCK ADJ_SLEW_RATE(GPIO_SPI1_SCK_1) /* PA5 */ + +#define GPIO_SPI2_MISO GPIO_SPI2_MISO_2 /* PC2 */ +#define GPIO_SPI2_MOSI GPIO_SPI2_MOSI_2 /* PC1 */ +#define GPIO_SPI2_SCK ADJ_SLEW_RATE(GPIO_SPI2_SCK_5) /* PD3 */ + +#define GPIO_SPI3_MISO GPIO_SPI3_MISO_1 /* PB4 */ +#define GPIO_SPI3_MOSI GPIO_SPI3_MOSI_4 /* PB5 */ +#define GPIO_SPI3_SCK ADJ_SLEW_RATE(GPIO_SPI3_SCK_1) /* PC10 */ + +#define GPIO_SPI4_MISO GPIO_SPI4_MISO_2 /* PE5 */ +#define GPIO_SPI4_MOSI GPIO_SPI4_MOSI_2 /* PB6 */ +#define GPIO_SPI4_SCK ADJ_SLEW_RATE(GPIO_SPI4_SCK_1) /* PE12 */ + +/* I2C + * + + * + */ + +#define GPIO_I2C1_SCL GPIO_I2C1_SCL_2 /* PB8 */ +#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_PIN8) +#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN7) + +#define GPIO_I2C2_SCL GPIO_I2C2_SCL_1 /* PB10 */ +#define GPIO_I2C2_SDA GPIO_I2C2_SDA_1 /* PB11 */ + +#define GPIO_I2C2_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN10) +#define GPIO_I2C2_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN11) + + +/* SDMMC1 + * + * SDMMC1_D0 PC8 + * SDMMC1_D1 PC9 + * SDMMC1_D2 PC10 + * SDMMC1_D3 PC11 + * SDMMC1_CK PC12 + * SDMMC1_CMD PD2 + */ + +// #define GPIO_SDMMC1_D0 GPIO_SDMMC1_D0 /* PC8 */ +// #define GPIO_SDMMC1_D1 GPIO_SDMMC1_D1 /* PC9 */ +// #define GPIO_SDMMC1_D2 GPIO_SDMMC1_D2 /* PC10 */ +// #define GPIO_SDMMC1_D3 GPIO_SDMMC1_D3 /* PC11 */ +// #define GPIO_SDMMC1_CK GPIO_SDMMC1_CK /* PC12 */ +// #define GPIO_SDMMC1_CMD GPIO_SDMMC1_CMD /* PD2 */ + + +/* USB + * + * OTG_FS_DM PA11 + * OTG_FS_DP PA12 + * VBUS PA9 + */ + + +/* Board provides GPIO or other Hardware for signaling to timing analyzer */ + +#if defined(CONFIG_BOARD_USE_PROBES) +# include "stm32_gpio.h" +# define PROBE_N(n) (1<<((n)-1)) +# define PROBE_1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTI|GPIO_PIN0) /* PI0 AUX1 */ +# define PROBE_2 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN12) /* PH12 AUX2 */ +# define PROBE_3 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN11) /* PH11 AUX3 */ +# define PROBE_4 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN10) /* PH10 AUX4 */ +# define PROBE_5 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN13) /* PD13 AUX5 */ +# define PROBE_6 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14) /* PD14 AUX6 */ +# define PROBE_7 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN6) /* PH6 AUX7 */ +# define PROBE_8 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN9) /* PH9 AUX8 */ +# define PROBE_9 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN11) /* PE11 CAP1 */ + +# define PROBE_INIT(mask) \ + do { \ + if ((mask)& PROBE_N(1)) { stm32_configgpio(PROBE_1); } \ + if ((mask)& PROBE_N(2)) { stm32_configgpio(PROBE_2); } \ + if ((mask)& PROBE_N(3)) { stm32_configgpio(PROBE_3); } \ + if ((mask)& PROBE_N(4)) { stm32_configgpio(PROBE_4); } \ + if ((mask)& PROBE_N(5)) { stm32_configgpio(PROBE_5); } \ + if ((mask)& PROBE_N(6)) { stm32_configgpio(PROBE_6); } \ + if ((mask)& PROBE_N(7)) { stm32_configgpio(PROBE_7); } \ + if ((mask)& PROBE_N(8)) { stm32_configgpio(PROBE_8); } \ + if ((mask)& PROBE_N(9)) { stm32_configgpio(PROBE_9); } \ + } while(0) + +# define PROBE(n,s) do {stm32_gpiowrite(PROBE_##n,(s));}while(0) +# define PROBE_MARK(n) PROBE(n,false);PROBE(n,true) +#else +# define PROBE_INIT(mask) +# define PROBE(n,s) +# define PROBE_MARK(n) +#endif + +#endif /*__NUTTX_CONFIG_MATEKH743SLIM_INCLUDE_BOARD_H */ diff --git a/boards/hkust/nxt-v1/nuttx-config/include/board_dma_map.h b/boards/hkust/nxt-v1/nuttx-config/include/board_dma_map.h new file mode 100644 index 0000000000..ff89fb6ae9 --- /dev/null +++ b/boards/hkust/nxt-v1/nuttx-config/include/board_dma_map.h @@ -0,0 +1,62 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once +#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* DMA1:37 */ +#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* DMA1:38 */ + +#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* DMA1:39 */ +#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* DMA1:40 */ + +// DMAMUX2 +#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_0 /* DMA1:61 */ +#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_0 /* DMA1:62 */ + +#define DMAMAP_SPI6_RX DMAMAP_BDMA_SPI6_RX /* BDMA:11 */ +#define DMAMAP_SPI6_TX DMAMAP_BDMA_SPI6_TX /* BDMA:12 */ + +//TODO: UART DMA test +#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_1 /*DMA2:41*/ +#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_1 /*DMA2:42*/ + +#define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_1 /* DMA2:43 */ +#define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_1 /* DMA2:44 */ + +#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* DMA2:45 */ +#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* DMA2:46 */ + +#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* DMA1:63 */ +#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* DMA1:64 */ + +#define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_0 /* DMA1:65 */ +#define DMAMAP_UART5_TX DMAMAP_DMA12_UART5RX_0 /* DMA1:66 */ diff --git a/boards/hkust/nxt-v1/nuttx-config/nsh/defconfig b/boards/hkust/nxt-v1/nuttx-config/nsh/defconfig new file mode 100644 index 0000000000..202258c5c6 --- /dev/null +++ b/boards/hkust/nxt-v1/nuttx-config/nsh/defconfig @@ -0,0 +1,272 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DISABLE_ENVIRON is not set +# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set +# CONFIG_DISABLE_PTHREAD is not set +# CONFIG_MMCSD_HAVE_CARDDETECT is not set +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_MMCSD_SPI is not set +# CONFIG_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_CAT is not set +# CONFIG_NSH_DISABLE_CD is not set +# CONFIG_NSH_DISABLE_CP is not set +# CONFIG_NSH_DISABLE_DATE is not set +# CONFIG_NSH_DISABLE_DF is not set +# CONFIG_NSH_DISABLE_ECHO is not set +# CONFIG_NSH_DISABLE_ENV is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_EXIT is not set +# CONFIG_NSH_DISABLE_EXPORT is not set +# CONFIG_NSH_DISABLE_FREE is not set +# CONFIG_NSH_DISABLE_GET is not set +# CONFIG_NSH_DISABLE_HELP is not set +# CONFIG_NSH_DISABLE_ITEF is not set +# CONFIG_NSH_DISABLE_KILL is not set +# CONFIG_NSH_DISABLE_LOOPS is not set +# CONFIG_NSH_DISABLE_LS is not set +# CONFIG_NSH_DISABLE_MKDIR is not set +# CONFIG_NSH_DISABLE_MKFATFS is not set +# CONFIG_NSH_DISABLE_MOUNT is not set +# CONFIG_NSH_DISABLE_MV is not set +# CONFIG_NSH_DISABLE_PRINTF is not set +# CONFIG_NSH_DISABLE_PS is not set +# CONFIG_NSH_DISABLE_PSSTACKUSAGE is not set +# CONFIG_NSH_DISABLE_PWD is not set +# CONFIG_NSH_DISABLE_RM is not set +# CONFIG_NSH_DISABLE_RMDIR is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_SET is not set +# CONFIG_NSH_DISABLE_SLEEP is not set +# CONFIG_NSH_DISABLE_SOURCE is not set +# CONFIG_NSH_DISABLE_TEST is not set +# CONFIG_NSH_DISABLE_TIME is not set +# CONFIG_NSH_DISABLE_UMOUNT is not set +# CONFIG_NSH_DISABLE_UNSET is not set +# CONFIG_NSH_DISABLE_USLEEP is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD_CUSTOM=y +CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/hkust/nxt-v1/nuttx-config" +CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y +CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32H743VI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_INTERRUPTSTACK=768 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_BASEPRI_WAR=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DTCM=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_MEMCPY=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_ARM_MPU_EARLY_RESET=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_ASSERT_RESET_VALUE=0 +CONFIG_BOARD_CRASHDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=95150 +CONFIG_BOARD_RESET_ON_ASSERT=2 +CONFIG_BUILTIN=y +CONFIG_C99_BOOL8=y +CONFIG_CDCACM=y +CONFIG_CDCACM_IFLOWCONTROL=y +CONFIG_CDCACM_PRODUCTID=0x0036 +CONFIG_CDCACM_PRODUCTSTR="HKUST UAV NxtPX4" +CONFIG_CDCACM_RXBUFSIZE=600 +CONFIG_CDCACM_TXBUFSIZE=12000 +CONFIG_CDCACM_VENDORID=0x1B8C +CONFIG_CDCACM_VENDORSTR="Matek" +CONFIG_CLOCK_MONOTONIC=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_MEMFAULT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_TCBINFO=n +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_IOB_NBUFFERS=24 +CONFIG_IOB_NCHAINS=24 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=3194 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_LIBC_LONG_LONG=y +CONFIG_LIBC_MAX_EXITFUNS=1 +CONFIG_LIBC_STRERROR=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y +CONFIG_MM_IOB=y +CONFIG_MM_REGIONS=4 +# Avaible in Dual Version +# 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_LINELEN=128 +CONFIG_NSH_MAXARGUMENTS=15 +CONFIG_NSH_NESTDEPTH=8 +CONFIG_NSH_QUOTE=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ROMFSSECTSIZE=128 +CONFIG_NSH_STRERROR=y +CONFIG_NSH_VARS=y +CONFIG_OTG_ID_GPIO_DISABLE=y +CONFIG_PIPES=y +CONFIG_PREALLOC_TIMERS=50 +CONFIG_PRIORITY_INHERITANCE=y +CONFIG_PTHREAD_MUTEX_ROBUST=y +CONFIG_PTHREAD_STACK_MIN=512 +CONFIG_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_INSTRUMENTATION_SWITCH=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_LPWORKPRIORITY=50 +CONFIG_SCHED_LPWORKSTACKSIZE=1632 +CONFIG_SCHED_WAITPID=y +CONFIG_SDCLONE_DISABLE=y +CONFIG_SDMMC1_SDIO_PULLUP=y +CONFIG_SEM_PREALLOCHOLDERS=32 +CONFIG_SERIAL_IFLOWCONTROL_WATERMARKS=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_SIG_DEFAULT=y +CONFIG_SIG_SIGALRM_ACTION=y +CONFIG_SIG_SIGUSR1_ACTION=y +CONFIG_SIG_SIGUSR2_ACTION=y +CONFIG_SIG_SIGWORK=4 +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=30 +CONFIG_START_MONTH=11 +CONFIG_STDIO_BUFFER_SIZE=256 +CONFIG_STM32H7_ADC1=y +CONFIG_STM32H7_ADC2=y +CONFIG_STM32H7_ADC3=y #should always enable otherwsie got ADC timeout error this is for tempreature compenstae +CONFIG_STM32H7_BBSRAM=y +CONFIG_STM32H7_BBSRAM_FILES=5 +CONFIG_STM32H7_BDMA=y +CONFIG_STM32H7_BKPSRAM=y +CONFIG_STM32H7_DMA1=y +CONFIG_STM32H7_DMA2=y +CONFIG_STM32H7_DMACAPABLE=y +CONFIG_STM32H7_FLASH_OVERRIDE_I=y +CONFIG_STM32H7_FLOWCONTROL_BROKEN=y +CONFIG_STM32H7_I2C1=y +CONFIG_STM32H7_I2C2=y +CONFIG_STM32H7_I2C_DYNTIMEO=y +CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 +CONFIG_STM32H7_OTGFS=y +CONFIG_STM32H7_PROGMEM=y +CONFIG_STM32H7_RTC=y +CONFIG_STM32H7_RTC_HSECLOCK=y +CONFIG_STM32H7_RTC_MAGIC_REG=1 +CONFIG_STM32H7_SAVE_CRASHDUMP=y +CONFIG_STM32H7_SDMMC1=y +CONFIG_STM32H7_SDMMC1_DMA=y +CONFIG_STM32H7_SDMMC1_DMA_BUFFER=1024 +CONFIG_STM32H7_SERIALBRK_BSDCOMPAT=y +CONFIG_STM32H7_SERIAL_DISABLE_REORDERING=y +CONFIG_STM32H7_SPI1=y +CONFIG_STM32H7_SPI1_DMA=y +CONFIG_STM32H7_SPI1_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI2=y +CONFIG_STM32H7_SPI2_DMA=y +CONFIG_STM32H7_SPI2_DMA_BUFFER=4096 +CONFIG_STM32H7_SPI3=y +CONFIG_STM32H7_SPI3_DMA=y +CONFIG_STM32H7_SPI3_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI_DMA=y +CONFIG_STM32H7_SPI_DMATHRESHOLD=8 +CONFIG_STM32H7_TIM1=y +CONFIG_STM32H7_TIM3=y +CONFIG_STM32H7_TIM4=y +CONFIG_STM32H7_TIM5=y +CONFIG_STM32H7_TIM8=y +CONFIG_STM32H7_USART1=y #ttyS0 +CONFIG_STM32H7_USART2=y #ttyS1 +CONFIG_STM32H7_USART3=y #ttyS2 +CONFIG_STM32H7_UART4=y #ttyS3 +CONFIG_STM32H7_UART5=y #ttyS4 +CONFIG_STM32H7_UART7=y #ttyS5 +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_USART1_BAUD=57600 +CONFIG_USART1_RXBUFSIZE=600 +CONFIG_USART1_TXBUFSIZE=1500 +CONFIG_USART2_BAUD=57600 +CONFIG_USART2_RXBUFSIZE=600 +CONFIG_USART2_TXBUFSIZE=3000 +CONFIG_USART3_BAUD=57600 +CONFIG_USART3_RXBUFSIZE=180 +CONFIG_USART3_SERIAL_CONSOLE=y +CONFIG_USART3_TXBUFSIZE=1500 +CONFIG_UART4_BAUD=921600 +CONFIG_UART4_RXBUFSIZE=3000 +CONFIG_UART4_TXBUFSIZE=1200 +CONFIG_UART5_BAUD=57600 +CONFIG_UART5_RXBUFSIZE=600 +CONFIG_UART5_TXBUFSIZE=1500 +CONFIG_UART7_BAUD=57600 +CONFIG_UART7_RXBUFSIZE=600 +CONFIG_UART7_TXBUFSIZE=3000 +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 +CONFIG_WQUEUE_NOTIFIER=y diff --git a/boards/hkust/nxt-v1/nuttx-config/scripts/bootloader_script.ld b/boards/hkust/nxt-v1/nuttx-config/scripts/bootloader_script.ld new file mode 100644 index 0000000000..511ef26242 --- /dev/null +++ b/boards/hkust/nxt-v1/nuttx-config/scripts/bootloader_script.ld @@ -0,0 +1,213 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The Durandal-v1 uses an STM32H743II has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743II, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * The Durandal has a Swtich on board, the BOOT0 pin is at ground so by default, + * the STM32 will boot to address 0x0800:0000 in FLASH unless the swiutch is + * drepresed, then the boot will be from 0x1FF0:0000 + * + * The STM32H743ZI also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + */ + +MEMORY +{ + itcm (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + flash (rx) : ORIGIN = 0x08000000, LENGTH = 2048K + dtcm1 (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + dtcm2 (rwx) : ORIGIN = 0x20010000, LENGTH = 64K + sram (rwx) : ORIGIN = 0x24000000, LENGTH = 512K + sram1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K + sram2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K + sram3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K + sram4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K + bbram (rwx) : ORIGIN = 0x38800000, LENGTH = 4K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) +EXTERN(_bootdelay_signature) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + . = ALIGN(32); + /* + This signature provides the bootloader with a way to delay booting + */ + _bootdelay_signature = ABSOLUTE(.); + FILL(0xffecc2925d7d05c5) + . += 8; + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + + } > flash + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > flash + + + .ARM.extab : { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + } > sram AT > flash + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/hkust/nxt-v1/nuttx-config/scripts/script.ld b/boards/hkust/nxt-v1/nuttx-config/scripts/script.ld new file mode 100644 index 0000000000..85f4990724 --- /dev/null +++ b/boards/hkust/nxt-v1/nuttx-config/scripts/script.ld @@ -0,0 +1,228 @@ +/**************************************************************************** + * scripts/script.ld + * + * Copyright (C) 2020 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/* The board uses an STM32H743II and has 2048Kb of main FLASH memory. + * The flash memory is partitioned into a User Flash memory and a System + * Flash memory. Each of these memories has two banks: + * + * 1) User Flash memory: + * + * Bank 1: Start address 0x0800:0000 to 0x080F:FFFF with 8 sectors, 128Kb each + * Bank 2: Start address 0x0810:0000 to 0x081F:FFFF with 8 sectors, 128Kb each + * + * 2) System Flash memory: + * + * Bank 1: Start address 0x1FF0:0000 to 0x1FF1:FFFF with 1 x 128Kb sector + * Bank 1: Start address 0x1FF4:0000 to 0x1FF5:FFFF with 1 x 128Kb sector + * + * 3) User option bytes for user configuration, only in Bank 1. + * + * In the STM32H743II, two different boot spaces can be selected through + * the BOOT pin and the boot base address programmed in the BOOT_ADD0 and + * BOOT_ADD1 option bytes: + * + * 1) BOOT=0: Boot address defined by user option byte BOOT_ADD0[15:0]. + * ST programmed value: Flash memory at 0x0800:0000 + * 2) BOOT=1: Boot address defined by user option byte BOOT_ADD1[15:0]. + * ST programmed value: System bootloader at 0x1FF0:0000 + * + * There's a switch on board, the BOOT0 pin is at ground so by default, + * the STM32 will boot to address 0x0800:0000 in FLASH unless the switch is + * drepresed, then the boot will be from 0x1FF0:0000 + * + * The STM32H743ZI also has 1024Kb of data SRAM. + * SRAM is split up into several blocks and into three power domains: + * + * 1) TCM SRAMs are dedicated to the Cortex-M7 and are accessible with + * 0 wait states by the Cortex-M7 and by MDMA through AHBS slave bus + * + * 1.1) 128Kb of DTCM-RAM beginning at address 0x2000:0000 + * + * The DTCM-RAM is organized as 2 x 64Kb DTCM-RAMs on 2 x 32 bit + * DTCM ports. The DTCM-RAM could be used for critical real-time + * data, such as interrupt service routines or stack / heap memory. + * Both DTCM-RAMs can be used in parallel (for load/store operations) + * thanks to the Cortex-M7 dual issue capability. + * + * 1.2) 64Kb of ITCM-RAM beginning at address 0x0000:0000 + * + * This RAM is connected to ITCM 64-bit interface designed for + * execution of critical real-times routines by the CPU. + * + * 2) AXI SRAM (D1 domain) accessible by all system masters except BDMA + * through D1 domain AXI bus matrix + * + * 2.1) 512Kb of SRAM beginning at address 0x2400:0000 + * + * 3) AHB SRAM (D2 domain) accessible by all system masters except BDMA + * through D2 domain AHB bus matrix + * + * 3.1) 128Kb of SRAM1 beginning at address 0x3000:0000 + * 3.2) 128Kb of SRAM2 beginning at address 0x3002:0000 + * 3.3) 32Kb of SRAM3 beginning at address 0x3004:0000 + * + * SRAM1 - SRAM3 are one contiguous block: 288Kb at address 0x3000:0000 + * + * 4) AHB SRAM (D3 domain) accessible by most of system masters + * through D3 domain AHB bus matrix + * + * 4.1) 64Kb of SRAM4 beginning at address 0x3800:0000 + * 4.1) 4Kb of backup RAM beginning at address 0x3880:0000 + * + * When booting from FLASH, FLASH memory is aliased to address 0x0000:0000 + * where the code expects to begin execution by jumping to the entry point in + * the 0x0800:0000 address range. + */ + +MEMORY +{ + ITCM_RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 64K + FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 1920K + + DTCM1_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + DTCM2_RAM (rwx) : ORIGIN = 0x20010000, LENGTH = 64K + AXI_SRAM (rwx) : ORIGIN = 0x24000000, LENGTH = 512K /* D1 domain AXI bus */ + SRAM1 (rwx) : ORIGIN = 0x30000000, LENGTH = 128K /* D2 domain AHB bus */ + SRAM2 (rwx) : ORIGIN = 0x30020000, LENGTH = 128K /* D2 domain AHB bus */ + SRAM3 (rwx) : ORIGIN = 0x30040000, LENGTH = 32K /* D2 domain AHB bus */ + SRAM4 (rwx) : ORIGIN = 0x38000000, LENGTH = 64K /* D3 domain */ + BKPRAM (rwx) : ORIGIN = 0x38800000, LENGTH = 4K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +/* + * Ensure that abort() is present in the final object. The exception handling + * code pulled in by libgcc.a requires it (and that code cannot be easily avoided). + */ +EXTERN(abort) +EXTERN(_bootdelay_signature) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + . = ALIGN(32); + /* + This signature provides the bootloader with a way to delay booting + */ + _bootdelay_signature = ABSOLUTE(.); + FILL(0xffecc2925d7d05c5) + . += 8; + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + + } > FLASH + + /* + * Init functions (static constructors and the like) + */ + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > FLASH + + + .ARM.extab : { + *(.ARM.extab*) + } > FLASH + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : { + *(.ARM.exidx*) + } > FLASH + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + + /* Pad out last section as the STM32H7 Flash write size is 256 bits. 32 bytes */ + . = ALIGN(16); + FILL(0xffff) + . += 16; + } > AXI_SRAM AT > FLASH = 0xffff + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > AXI_SRAM + + /* Emit the the D3 power domain section for locating BDMA data */ + + .sram4_reserve (NOLOAD) : + { + *(.sram4) + . = ALIGN(4); + _sram4_heap_start = ABSOLUTE(.); + } > SRAM4 + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/hkust/nxt-v1/src/CMakeLists.txt b/boards/hkust/nxt-v1/src/CMakeLists.txt new file mode 100644 index 0000000000..45d0650aae --- /dev/null +++ b/boards/hkust/nxt-v1/src/CMakeLists.txt @@ -0,0 +1,68 @@ +############################################################################ +# +# Copyright (c) 2021 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ +if("${PX4_BOARD_LABEL}" STREQUAL "bootloader") + add_library(drivers_board + bootloader_main.c + usb.c + ) + target_link_libraries(drivers_board + PRIVATE + nuttx_arch + nuttx_drivers + bootloader + ) + target_include_directories(drivers_board PRIVATE ${PX4_SOURCE_DIR}/platforms/nuttx/src/bootloader/common) + +else() + add_library(drivers_board + i2c.cpp + init.c + led.c + sdio.c + spi.cpp + timer_config.cpp + usb.c + ) + # add_dependencies(drivers_board arch_board_hw_info) + + target_link_libraries(drivers_board + PRIVATE + arch_io_pins + arch_spi + arch_board_hw_info + drivers__led + nuttx_arch + nuttx_drivers + px4_layer + ) +endif() diff --git a/boards/hkust/nxt-v1/src/board_config.h b/boards/hkust/nxt-v1/src/board_config.h new file mode 100644 index 0000000000..34dff55da5 --- /dev/null +++ b/boards/hkust/nxt-v1/src/board_config.h @@ -0,0 +1,227 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file board_config.h + * + * Board internal definitions + */ + +#pragma once + +/**************************************************************************************************** + * Included Files + ****************************************************************************************************/ + +#include +#include +#include + +#include + +/**************************************************************************************************** + * Definitions + ****************************************************************************************************/ + +// #define FLASH_BASED_PARAMS + + +/* LEDs are driven with push open drain to support Anode to 5V or 3.3V */ + +# define GPIO_nLED_RED /* PC6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN6) +# define GPIO_nLED_GREEN /* PB14 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN14) +# define GPIO_nLED_BLUE /* PB15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN15) + +# define BOARD_HAS_CONTROL_STATUS_LEDS 1 +# define BOARD_OVERLOAD_LED LED_RED +# define BOARD_ARMED_STATE_LED LED_BLUE + +/* I2C busses */ +/* Devices on the onboard buses. + * + * Note that these are unshifted addresses. + */ +// #define PX4_I2C_OBDEV_SE050 0x48 + +#define GPIO_I2C1_DRDY1_BMP388 /* PB9 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTB|GPIO_PIN9) + +/* + * ADC channels + * + * These are the channel numbers of the ADCs of the microcontroller that + * can be used by the Px4 Firmware in the adc driver + */ + +/* ADC defines to be used in sensors.cpp to read from a particular channel */ + +#define SYSTEM_ADC_BASE STM32_ADC1_BASE + +#define ADC12_CH(n) (n) + +#define PX4_ADC_GPIO \ + /* PB0 */ GPIO_ADC12_INP5, \ + /* PB1 */ GPIO_ADC12_INP9 + +/* Define GPIO pins used as ADC N.B. Channel numbers must match below */ +/* Define Channel numbers must match above GPIO pin IN(n)*/ +#define ADC_BATTERY_VOLTAGE_CHANNEL ADC12_CH(9) +#define ADC_BATTERY_CURRENT_CHANNEL ADC12_CH(5) + +#define ADC_CHANNELS \ + ((1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ + (1 << ADC_BATTERY_CURRENT_CHANNEL)) + +#define BOARD_ADC_OPEN_CIRCUIT_V (5.6f) + + + +/* Define Battery 1 Voltage Divider and A per V + */ + +// #define BOARD_BATTERY1_V_DIV (11.0f) /* measured with the provided PM board */ +// #define BOARD_BATTERY1_A_PER_V (40.0f) +// #define BOARD_BATTERY2_V_DIV (11.0f) /* measured with the provided PM board */ + +/* PWM + */ +#define DIRECT_PWM_OUTPUT_CHANNELS 8 + +#define BOARD_HAS_PWM DIRECT_PWM_OUTPUT_CHANNELS + + +/* Spare GPIO */ +#define GPIO_PD4 /* PD4 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTD|GPIO_PIN4) +#define GPIO_PC13 /* PC13 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN13) +#define GPIO_PH1 /* PH1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTH|GPIO_PIN1) + +/* Tone alarm output */ + +#define TONE_ALARM_TIMER 1 /* Timer 3 */ +#define TONE_ALARM_CHANNEL 1 /* PC7 GPIO_TIM3_CH2 */ +/*NC can be modified with Spare GPIO then connected with hardware */ +#define GPIO_BUZZER_1 /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) + +#define GPIO_TONE_ALARM_IDLE GPIO_BUZZER_1 +#define GPIO_TONE_ALARM GPIO_BUZZER_1 + +/* USB OTG FS + * + * PE2 OTG_FS_VBUS VBUS sensing + */ + + +#define GPIO_OTGFS_VBUS /* PA15 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN15) +#define BOARD_ADC_USB_CONNECTED (px4_arch_gpioread(GPIO_OTGFS_VBUS)) + +/* High-resolution timer */ +#define HRT_TIMER 8 /* use timer1 for the HRT */ +#define HRT_TIMER_CHANNEL 1 /* use capture/compare channel 1 */ + +/* RC Serial port */ +#define RC_SERIAL_PORT "/dev/ttyS5" +#define BOARD_SUPPORTS_RC_SERIAL_PORT_OUTPUT + +/* 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 + */ +#define SDIO_SLOTNO 0 /* Only one slot */ +#define SDIO_MINOR 0 +#if defined(CONFIG_BOARD_INITIALIZE) && !defined(CONFIG_LIB_BOARDCTL) && \ + !defined(CONFIG_BOARD_INITTHREAD) +# warning SDIO initialization cannot be perfomed on the IDLE thread +#endif + +/* This board provides a DMA pool and APIs */ +#define BOARD_DMA_ALLOC_POOL_SIZE 5120 + +/* This board provides the board_on_reset interface */ +#define BOARD_HAS_ON_RESET 1 + +#define PX4_GPIO_INIT_LIST { \ + PX4_ADC_GPIO, \ + GPIO_TONE_ALARM_IDLE, \ + } + +#define BOARD_ENABLE_CONSOLE_BUFFER + +#define BOARD_NUM_IO_TIMERS 5 + + +__BEGIN_DECLS + +/**************************************************************************************************** + * Public Types + ****************************************************************************************************/ + +/**************************************************************************************************** + * Public data + ****************************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************************************** + * Public Functions + ****************************************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +int stm32_sdio_initialize(void); + +/**************************************************************************************************** + * Name: stm32_spiinitialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the board. + * + ****************************************************************************************************/ + +extern void stm32_spiinitialize(void); + +extern void stm32_usbinitialize(void); + +extern void board_peripheral_reset(int ms); + +#include + +#endif /* __ASSEMBLY__ */ + +__END_DECLS diff --git a/boards/hkust/nxt-v1/src/bootloader_main.c b/boards/hkust/nxt-v1/src/bootloader_main.c new file mode 100644 index 0000000000..5670308a29 --- /dev/null +++ b/boards/hkust/nxt-v1/src/bootloader_main.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file bootloader_main.c + * + * FMU-specific early startup code for bootloader +*/ + +#include "board_config.h" +#include "bl.h" + +#include +#include +#include +#include +#include +#include "arm_internal.h" +#include + +extern int sercon_main(int c, char **argv); + +__EXPORT void board_on_reset(int status) {} + +__EXPORT void stm32_boardinitialize(void) +{ + /* configure USB interfaces */ + stm32_usbinitialize(); +} + +__EXPORT int board_app_initialize(uintptr_t arg) +{ + return 0; +} + +void board_late_initialize(void) +{ + sercon_main(0, NULL); +} + +extern void sys_tick_handler(void); +void board_timerhook(void) +{ + sys_tick_handler(); +} diff --git a/boards/hkust/nxt-v1/src/hw_config.h b/boards/hkust/nxt-v1/src/hw_config.h new file mode 100644 index 0000000000..1e91b65145 --- /dev/null +++ b/boards/hkust/nxt-v1/src/hw_config.h @@ -0,0 +1,135 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +/**************************************************************************** + * 10-8--2016: + * To simplify the ripple effect on the tools, we will be using + * /dev/serial/by-id/PX4 to locate PX4 devices. Therefore + * moving forward all Bootloaders must contain the prefix "PX4 BL " + * in the USBDEVICESTRING + * This Change will be made in an upcoming BL release + ****************************************************************************/ +/* + * Define usage to configure a bootloader + * + * + * Constant example Usage + * APP_LOAD_ADDRESS 0x08004000 - The address in Linker Script, where the app fw is org-ed + * BOOTLOADER_DELAY 5000 - Ms to wait while under USB pwr or bootloader request + * BOARD_FMUV2 + * INTERFACE_USB 1 - (Optional) Scan and use the USB interface for bootloading + * INTERFACE_USART 1 - (Optional) Scan and use the Serial interface for bootloading + * USBDEVICESTRING "PX4 BL FMU v2.x" - USB id string + * USBPRODUCTID 0x0011 - PID Should match defconfig + * BOOT_DELAY_ADDRESS 0x000001a0 - (Optional) From the linker script from Linker Script to get a custom + * delay provided by an APP FW + * BOARD_TYPE 9 - Must match .prototype boad_id + * _FLASH_KBYTES (*(uint16_t *)0x1fff7a22) - Run time flash size detection + * BOARD_FLASH_SECTORS ((_FLASH_KBYTES == 0x400) ? 11 : 23) - Run time determine the physical last sector + * BOARD_FLASH_SECTORS 11 - Hard coded zero based last sector + * BOARD_FLASH_SIZE (_FLASH_KBYTES*1024)- Total Flash size of device, determined at run time. + * (1024 * 1024) - Hard coded Total Flash of device - The bootloader and app reserved will be deducted + * programmatically + * + * BOARD_FIRST_FLASH_SECTOR_TO_ERASE 2 - Optional sectors index in the flash_sectors table (F4 only), to begin erasing. + * This is to allow sectors to be reserved for app fw usage. That will NOT be erased + * during a FW upgrade. + * The default is 0, and selects the first sector to be erased, as the 0th entry in the + * flash_sectors table. Which is the second physical sector of FLASH in the device. + * The first physical sector of FLASH is used by the bootloader, and is not defined + * in the table. + * + * APP_RESERVATION_SIZE (BOARD_FIRST_FLASH_SECTOR_TO_ERASE * 16 * 1024) - Number of bytes reserved by the APP FW. This number plus + * BOOTLOADER_RESERVATION_SIZE will be deducted from + * BOARD_FLASH_SIZE to determine the size of the App FW + * and hence the address space of FLASH to erase and program. + * USBMFGSTRING "PX4 AP" - Optional USB MFG string (default is '3D Robotics' if not defined.) + * SERIAL_BREAK_DETECT_DISABLED - Optional prevent break selection on Serial port from entering or staying in BL + * + * * Other defines are somewhat self explanatory. + */ + +/* Boot device selection list*/ +#define USB0_DEV 0x01 +#define SERIAL0_DEV 0x02 +#define SERIAL1_DEV 0x04 + +#define APP_LOAD_ADDRESS 0x08020000 +#define BOOTLOADER_DELAY 5000 +#define INTERFACE_USB 1 +#define INTERFACE_USB_CONFIG "/dev/ttyACM0" +#define BOARD_VBUS MK_GPIO_INPUT(GPIO_OTGFS_VBUS) + +//#define USE_VBUS_PULL_DOWN +#define INTERFACE_USART 1 +#define INTERFACE_USART_CONFIG "/dev/ttyS0,57600" +#define BOOT_DELAY_ADDRESS 0x000001a0 +#define BOARD_TYPE 1013 +#define _FLASH_KBYTES (*(uint32_t *)0x1FF1E880) +#define BOARD_FLASH_SECTORS (15) +#define BOARD_FLASH_SIZE (_FLASH_KBYTES * 1024) + +#define OSC_FREQ 16 + +#define BOARD_PIN_LED_ACTIVITY GPIO_nLED_BLUE // BLUE +#define BOARD_PIN_LED_BOOTLOADER GPIO_nLED_RED // RED +#define BOARD_LED_ON 1 +#define BOARD_LED_OFF 0 + +#define SERIAL_BREAK_DETECT_DISABLED 1 + +#if !defined(ARCH_SN_MAX_LENGTH) +# define ARCH_SN_MAX_LENGTH 12 +#endif + +#if !defined(APP_RESERVATION_SIZE) +# define APP_RESERVATION_SIZE 0 +#endif + +#if !defined(BOARD_FIRST_FLASH_SECTOR_TO_ERASE) +# define BOARD_FIRST_FLASH_SECTOR_TO_ERASE 1 +#endif + +#if !defined(USB_DATA_ALIGN) +# define USB_DATA_ALIGN +#endif + +#ifndef BOOT_DEVICES_SELECTION +# define BOOT_DEVICES_SELECTION USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +#endif + +#ifndef BOOT_DEVICES_FILTER_ONUSB +# define BOOT_DEVICES_FILTER_ONUSB USB0_DEV|SERIAL0_DEV|SERIAL1_DEV +#endif diff --git a/boards/hkust/nxt-v1/src/i2c.cpp b/boards/hkust/nxt-v1/src/i2c.cpp new file mode 100644 index 0000000000..6700d8c8f2 --- /dev/null +++ b/boards/hkust/nxt-v1/src/i2c.cpp @@ -0,0 +1,39 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { + initI2CBusInternal(1), + initI2CBusExternal(2), +}; diff --git a/boards/hkust/nxt-v1/src/init.c b/boards/hkust/nxt-v1/src/init.c new file mode 100644 index 0000000000..657c0080c0 --- /dev/null +++ b/boards/hkust/nxt-v1/src/init.c @@ -0,0 +1,205 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file init.c + * + * FMU-specific early startup code. This file implements the + * board_app_initialize() function that is called early by nsh during startup. + * + * Code here is run before the rcS script is invoked; it should start required + * subsystems and perform board-specific initialisation. + */ + +#include "board_config.h" + +#include + +#include +#include +#include +#include +#include +#include "arm_internal.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +# if defined(FLASH_BASED_PARAMS) +# include +#endif + +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +__END_DECLS + +/************************************************************************************ + * Name: board_peripheral_reset + * + * Description: + * + ************************************************************************************/ +__EXPORT void board_peripheral_reset(int ms) +{ + UNUSED(ms); +} + +/************************************************************************************ + * Name: board_on_reset + * + * Description: + * Optionally provided function called on entry to board_system_reset + * It should perform any house keeping prior to the rest. + * + * status - 1 if resetting to boot loader + * 0 if just resetting + * + ************************************************************************************/ +__EXPORT void board_on_reset(int status) +{ + for (int i = 0; i < DIRECT_PWM_OUTPUT_CHANNELS; ++i) { + px4_arch_configgpio(PX4_MAKE_GPIO_INPUT(io_timer_channel_get_as_pwm_input(i))); + } + + if (status >= 0) { + up_mdelay(6); + } +} + +/************************************************************************************ + * Name: stm32_boardinitialize + * + * Description: + * All STM32 architectures must provide the following entry point. This entry point + * is called early in the initialization -- after all memory has been configured + * and mapped but before any devices have been initialized. + * + ************************************************************************************/ +__EXPORT void stm32_boardinitialize(void) +{ + /* Reset PWM first thing */ + board_on_reset(-1); + + /* configure LEDs */ + board_autoled_initialize(); + + /* configure pins */ + const uint32_t gpio[] = PX4_GPIO_INIT_LIST; + px4_gpio_init(gpio, arraySize(gpio)); + + /* configure SPI interfaces */ + stm32_spiinitialize(); + + /* configure USB interfaces */ + stm32_usbinitialize(); + +} + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ +__EXPORT int board_app_initialize(uintptr_t arg) +{ + /* Need hrt running before using the ADC */ + px4_platform_init(); + + /* configure the DMA allocator */ + if (board_dma_alloc_init() < 0) { + syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); + } + + /* initial LED state */ + drv_led_start(); + led_off(LED_RED); + led_off(LED_BLUE); + + if (board_hardfault_init(2, true) != 0) { + led_on(LED_BLUE); + } + +#ifdef CONFIG_MMCSD + int ret = stm32_sdio_initialize(); + + if (ret != OK) { + led_on(LED_BLUE); + return ret; + } + +#endif + +// TODO:internal flash store parameters +#if defined(FLASH_BASED_PARAMS) + static sector_descriptor_t params_sector_map[] = { + {15, 128 * 1024, 0x081E0000}, + {0, 0, 0}, + }; + + /* Initialize the flashfs layer to use heap allocated memory */ + int result = parameter_flashfs_init(params_sector_map, NULL, 0); + + if (result != OK) { + syslog(LOG_ERR, "[boot] FAILED to init params in FLASH %d\n", result); + led_on(LED_RED); + } + +#endif + + /* Configure the HW based on the manifest */ + px4_platform_configure(); + + return OK; +} diff --git a/boards/hkust/nxt-v1/src/led.c b/boards/hkust/nxt-v1/src/led.c new file mode 100644 index 0000000000..0420c1da2e --- /dev/null +++ b/boards/hkust/nxt-v1/src/led.c @@ -0,0 +1,113 @@ +/**************************************************************************** + * + * Copyright (c) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file led.c + * + * LED backend. + */ + +#include + +#include + +#include "chip.h" +#include "stm32_gpio.h" +#include "board_config.h" + +#include +#include + +/* + * Ideally we'd be able to get these from arm_internal.h, + * but since we want to be able to disable the NuttX use + * of leds for system indication at will and there is no + * separate switch, we need to build independent of the + * CONFIG_ARCH_LEDS configuration switch. + */ +__BEGIN_DECLS +extern void led_init(void); +extern void led_on(int led); +extern void led_off(int led); +extern void led_toggle(int led); +__END_DECLS + +# define xlat(p) (p) +static uint32_t g_ledmap[] = { + GPIO_nLED_GREEN, // Indexed by BOARD_LED_GREEN + GPIO_nLED_BLUE, // Indexed by BOARD_LED_BLUE + GPIO_nLED_RED, // Indexed by BOARD_LED_RED +}; + +__EXPORT void led_init(void) +{ + /* Configure LED GPIOs for output */ + for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) { + if (g_ledmap[l] != 0) { + stm32_configgpio(g_ledmap[l]); + } + } +} + +static void phy_set_led(int led, bool state) +{ + /* Drive Low to switch on */ + if (g_ledmap[led] != 0) { + stm32_gpiowrite(g_ledmap[led], !state); + } +} + +static bool phy_get_led(int led) +{ + /* If Low it is on */ + if (g_ledmap[led] != 0) { + return !stm32_gpioread(g_ledmap[led]); + } + + return false; +} + +__EXPORT void led_on(int led) +{ + phy_set_led(xlat(led), true); +} + +__EXPORT void led_off(int led) +{ + phy_set_led(xlat(led), false); +} + +__EXPORT void led_toggle(int led) +{ + phy_set_led(xlat(led), !phy_get_led(xlat(led))); +} diff --git a/boards/hkust/nxt-v1/src/mtd.cpp b/boards/hkust/nxt-v1/src/mtd.cpp new file mode 100644 index 0000000000..51c6dec3cc --- /dev/null +++ b/boards/hkust/nxt-v1/src/mtd.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** + * + * 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. + * + ****************************************************************************/ +//TODO:Prepare for NxtDual + +#include +#include +// KiB BS nB +static const px4_mft_device_t spi5 = { // FM25V02A on FMUM 32K 512 X 64 + .bus_type = px4_mft_device_t::SPI, + .devid = SPIDEV_FLASH(0) +}; + +static const px4_mtd_entry_t fmum_fram = { + .device = &spi5, + .npart = 2, + .partd = { + { + .type = MTD_PARAMETERS, + .path = "/fs/mtd_params", + .nblocks = 32 + }, + { + .type = MTD_WAYPOINTS, + .path = "/fs/mtd_waypoints", + .nblocks = 32 + + } + }, +}; + +static const px4_mtd_manifest_t board_mtd_config = { + .nconfigs = 1, + .entries = { + &fmum_fram + } +}; + +static const px4_mft_entry_s mtd_mft = { + .type = MTD, + .pmft = (void *) &board_mtd_config, +}; + +static const px4_mft_s mft = { + .nmft = 1, + .mfts = &mtd_mft +}; + +const px4_mft_s *board_get_manifest(void) +{ + return &mft; +} diff --git a/boards/hkust/nxt-v1/src/sdio.c b/boards/hkust/nxt-v1/src/sdio.c new file mode 100644 index 0000000000..869d757756 --- /dev/null +++ b/boards/hkust/nxt-v1/src/sdio.c @@ -0,0 +1,177 @@ +/**************************************************************************** + * + * Copyright (C) 2014, 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "chip.h" +#include "board_config.h" +#include "stm32_gpio.h" +#include "stm32_sdmmc.h" + +#ifdef CONFIG_MMCSD + + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Card detections requires card support and a card detection GPIO */ + +#define HAVE_NCD 1 +#if !defined(GPIO_SDMMC1_NCD) +# undef HAVE_NCD +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static FAR struct sdio_dev_s *sdio_dev; +#ifdef HAVE_NCD +static bool g_sd_inserted = 0xff; /* Impossible value */ +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_ncd_interrupt + * + * Description: + * Card detect interrupt handler. + * + ****************************************************************************/ + +#ifdef HAVE_NCD +static int stm32_ncd_interrupt(int irq, FAR void *context) +{ + bool present; + + present = !stm32_gpioread(GPIO_SDMMC1_NCD); + + if (sdio_dev && present != g_sd_inserted) { + sdio_mediachange(sdio_dev, present); + g_sd_inserted = present; + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +int stm32_sdio_initialize(void) +{ + int ret; + +#ifdef HAVE_NCD + /* Card detect */ + + bool cd_status; + + /* Configure the card detect GPIO */ + + stm32_configgpio(GPIO_SDMMC1_NCD); + + /* Register an interrupt handler for the card detect pin */ + + stm32_gpiosetevent(GPIO_SDMMC1_NCD, true, true, true, stm32_ncd_interrupt); +#endif + + /* Mount the SDIO-based MMC/SD block driver */ + /* First, get an instance of the SDIO interface */ + + finfo("Initializing SDIO slot %d\n", SDIO_SLOTNO); + + sdio_dev = sdio_initialize(SDIO_SLOTNO); + + if (!sdio_dev) { + syslog(LOG_ERR, "[boot] Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); + return -ENODEV; + } + + /* Now bind the SDIO interface to the MMC/SD driver */ + + finfo("Bind SDIO to the MMC/SD driver, minor=%d\n", SDIO_MINOR); + + ret = mmcsd_slotinitialize(SDIO_MINOR, sdio_dev); + + if (ret != OK) { + syslog(LOG_ERR, "[boot] Failed to bind SDIO to the MMC/SD driver: %d\n", ret); + return ret; + } + + finfo("Successfully bound SDIO to the MMC/SD driver\n"); + +#ifdef HAVE_NCD + /* Use SD card detect pin to check if a card is g_sd_inserted */ + + cd_status = !stm32_gpioread(GPIO_SDMMC1_NCD); + finfo("Card detect : %d\n", cd_status); + + sdio_mediachange(sdio_dev, cd_status); +#else + /* Assume that the SD card is inserted. What choice do we have? */ + + sdio_mediachange(sdio_dev, true); +#endif + + return OK; +} + +#endif /* CONFIG_MMCSD */ diff --git a/boards/hkust/nxt-v1/src/spi.cpp b/boards/hkust/nxt-v1/src/spi.cpp new file mode 100644 index 0000000000..54a338d94c --- /dev/null +++ b/boards/hkust/nxt-v1/src/spi.cpp @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include +#include + + +constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { + initSPIBus(SPI::Bus::SPI1, { + initSPIDevice(DRV_IMU_DEVTYPE_MPU6500, SPI::CS{GPIO::PortC, GPIO::Pin4}, SPI::DRDY{GPIO::PortC, GPIO::Pin5}), + }), + initSPIBus(SPI::Bus::SPI2, { + initSPIDevice(DRV_IMU_DEVTYPE_ICM42688P, SPI::CS{GPIO::PortC, GPIO::Pin3}, SPI::DRDY{GPIO::PortA, GPIO::Pin4}), + }), + initSPIBus(SPI::Bus::SPI3, { + initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortE, GPIO::Pin3}, SPI::DRDY{GPIO::PortE, GPIO::Pin0}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortE, GPIO::Pin4}, SPI::DRDY{GPIO::PortE, GPIO::Pin1}), + }), +}; + +static constexpr bool unused = validateSPIConfig(px4_spi_buses); diff --git a/boards/hkust/nxt-v1/src/timer_config.cpp b/boards/hkust/nxt-v1/src/timer_config.cpp new file mode 100644 index 0000000000..e3373ffeed --- /dev/null +++ b/boards/hkust/nxt-v1/src/timer_config.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer5, DMA{DMA::Index1}), + initIOTimer(Timer::Timer4, DMA{DMA::Index1}), + initIOTimer(Timer::Timer1), + initIOTimer(Timer::Timer3), +}; + +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {GPIO::PortA, GPIO::Pin0}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel2}, {GPIO::PortA, GPIO::Pin1}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {GPIO::PortA, GPIO::Pin2}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel4}, {GPIO::PortA, GPIO::Pin3}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {GPIO::PortD, GPIO::Pin14}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel4}, {GPIO::PortD, GPIO::Pin15}), + initIOTimerChannel(io_timers, {Timer::Timer3, Timer::Channel2}, {GPIO::PortC, GPIO::Pin7}), + initIOTimerChannel(io_timers, {Timer::Timer1, Timer::Channel1}, {GPIO::PortE, GPIO::Pin9}) +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/boards/hkust/nxt-v1/src/usb.c b/boards/hkust/nxt-v1/src/usb.c new file mode 100644 index 0000000000..9591784866 --- /dev/null +++ b/boards/hkust/nxt-v1/src/usb.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * + * Copyright (C) 2021 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file usb.c + * + * Board-specific USB functions. + */ + +#include "board_config.h" +#include +#include +#include +#include + +/************************************************************************************ + * Name: stm32_usbinitialize + * + * Description: + * Called to setup USB-related GPIO pins for the board. + * + ************************************************************************************/ + +__EXPORT void stm32_usbinitialize(void) +{ + /* The OTG FS has an internal soft pull-up */ + + /* Configure the OTG FS VBUS sensing GPIO, Power On, and Overcurrent GPIOs */ + +#ifdef CONFIG_STM32H7_OTGFS + stm32_configgpio(GPIO_OTGFS_VBUS); +#endif +} + +/************************************************************************************ + * Name: stm32_usbsuspend + * + * Description: + * Board logic must provide the stm32_usbsuspend logic if the USBDEV driver is + * used. This function is called whenever the USB enters or leaves suspend mode. + * This is an opportunity for the board logic to shutdown clocks, power, etc. + * while the USB is suspended. + * + ************************************************************************************/ +__EXPORT void stm32_usbsuspend(FAR struct usbdev_s *dev, bool resume) +{ + uinfo("resume: %d\n", resume); +}