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 00000000000..19b6e662be6 --- /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 00000000000..88448795559 --- /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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 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 00000000000..e236ff1bcf5 --- /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 00000000000..a4afdd873ee --- /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 00000000000..780b13dc96b --- /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 00000000000..3091824e8b2 --- /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 00000000000..bb33d3cfda4 --- /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 00000000000..42a2a2bcf1f --- /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 00000000000..436b172b1ff --- /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 00000000000..a27735b3541 --- /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 00000000000..8dc5c7cf579 --- /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 00000000000..cbe89638ad1 --- /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 00000000000..511ef262424 --- /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 00000000000..1dc1a0ef97e --- /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 00000000000..798c5243474 --- /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 00000000000..2b8aba1296d --- /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 00000000000..5670308a29d --- /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 00000000000..3a3e2cee1fc --- /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 00000000000..7c2676f4ff4 --- /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 00000000000..72ba2d6c0b5 --- /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 00000000000..657c0080c01 --- /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 00000000000..0420c1da2e7 --- /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 00000000000..e13f3d08607 --- /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 00000000000..e374a9be7e6 --- /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 00000000000..869d757756a --- /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 00000000000..058c4898263 --- /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 00000000000..27ad0f24761 --- /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 00000000000..9591784866a --- /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 00000000000..19b6e662be6 --- /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 00000000000..bc04f1ce949 --- /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 zcmeFZd3;pW{Xcx}GBY=skeMvNWC3Pj$p#JyNC1~%CfqE8hQ(GETL+`|hA2cpjY^XV zK}FCO32lLBYr)oqDw)9aA=sEGXl>O#Gc0}s(Go!!NKo&Pz}!rh`Mu8!*jDZH{GR`w zKYsIiow?`UvwzO#e9mV(C*MFOsyHIN#{Qr1e_-(c9~>apevwP>ZvV;8RquV%r*e;% zc^&KfrZ2AkIdPT91|{~JzNCinvR;?aKJ_d8mTk>bFAkMgif5E8ACc|h<_kmRvDD^E z`YkpqEuYZt?h`h<`{Fh?^d)VsE*5w)QSgo}Bc`#=M!V_w80Xlsv87w>6OI#EH9+K9 zVIto-(B4=6%l5uCzf3Mmkt{O9rMQ+vpG#cVQ;6&uBJyRFSUu!W_>9iLVujZtrtJ(A zjYb;`nTR1xyz~kYc*M7TL%Q#DZfs7M%>8b&z2BXm?z*Fl+0N`HIi#=2%`}l*Ti>tT z3(FRjqRsy53X81c9I}A6wRrEYaL6`Jdp+LouF$$@->Q+vhCGem#v5Jpoc6M;xx4R~ zSC(EeuWWY(dxhku-)k#7eNVb%mtS3+?n;-oGealSB|ZN0F~(hF=;UlX9kLpA&2l1N zzs(-a#}A#HQ5r98!?OTSyUeojuKZ|>K@2q^+GUQVWm&n9HROc- z*`+xpbPTp7j()O4>zYFI_1o6k`^nmL7mIke9S~W}#^O=vuqbbq@m+SKzwtDGGV&+W z77+*Z*yifubm@8S)+;ObGrO5NO9P~cU8>yhJTc&ziI9bmY_pNMET_4FWth!EJ4q;E zml_awgnp#w@nk76lEr$&??70HuoOY?8l8-Z7%9XUjAmR}5`rEfO^UaTE49mde9gpH z+8;MYZ@8bxk1LT-LS$?dk_0nGF=sSJo9Py~H8^4r%&m+Hz^RYqzu; zd3faE^G-{rT|ygar{fXo$s*dfpM5jZLr8?lL%b8=Q-p4W3kcQ4kxSNtSR0#&#clqk zPv5Zi&l`d54So8}6kkU>$CPDANt?NT_ro!THc73O|h2i zueGc$rE~6Hr*#n%?@V(aZ=owN5_8WJSo>@6uD+A<~Jb< zyVM4U%ySKWsherdd#-%4)*{;+?<#+qPTQ#lmeBfVpnhGJ-aGxXmx6kJLSFo*T+rp< zuB>!uF+W_G?@x6RV`lfQc|vFA0&8JrQ9|@Pk@c?2fxGkgPQ!wQ(XV}hI=qcuP#t}{ z6!=vhd#YTHSoLj53${hSoek)ne3sV5`OEv=80WEoDvL#&6et08H0HMS1$0^G{2C{1 z9oW*&e@?mugaiaV!bHGA-%Yy5IceSFO7-3hi33Gjp2-CZEh`I}$UM->t@c6xSm)SM z!-6zdx$K^vw$kLnFx-2%jdmVPr)<)z?0_>AYwZ?Q8k=KNYSy###iM%Ro0o|)} zIOJ}J#U)!Pw%qe)Jz&eDZ8z-``T;sDWYXss=pSJId>j#ef{@~MTbS1?MP7`A7DbG$ zy1dUWlIiScX`n6oHmvI&y7HAkikEzw@8%!K7w<@S4Fs^ac;lQI5)E{pBHvq!ZP2}%R*t62b3vK#62hKf7Mqn5I(3KOs3F-fh==$jtfgZ?SRze;Hp^&de@4MzlG>sIYU(dr}6G0Dk)r1TQ21e2~Ff0ZteNFOi8t|8E`yRgr~5#E7R! z5E*Cesv_DmOR$*pGOv0vMVn5%h>3MfeDz8KDE=PY9(cL|F195w2uV zT0$m9Ldzp6r|s(F_Ipia2ao=qQj8*{C8RyBi3m6CiRDu{K}+u$xt6E<+dRug5n%!H z{2{B_s}d8$^iI%`r$9%(v$JNlMnb|$wWu^PMw0_8N!D(BTex=72={MW}y%L{am z{sCHcqlqbrgnT1+qQ5Foyj+i}ELlo!O@EfjPu~>9s&-lrrCBLXy*FKY*OQEV`&#Lq z|J@O_3>d8>H||qnN!b*STuWMGTnRDi+nBjcEh(Ew?iK$x0Y*L&4hF8*dkA$`d!K4n ziO(7n#g8xY`JDWf!izo+F}>fwJ)f|PeO|kZc|LyEXGkN@XNyEGP*meprzsA9pk#^a z=IS=1_@zYT#|A=yHL_OKADG}(zd*LfqdsN^v7}*d_&CC24kvguFR(k*FMNEF%t#UA zMb;DvbwpEAy!^GV#2g9rM(B)Bz1Ua$RNZD#B|a}s7bl3HDOoQO`L_f7_&Hr@SLW12 zK8?48uBSbV#o1yOR^X8^KVF4YB5y!S%IP~jH2&&6wT3t?_ZzZS4DDzzUk2~ zKMG$8Xq!sK_%h`EHIY*ke*D?4gx&LyO5{Cw>x$M`H$X8F)aPm7MKTelUJRAe(=#R8K4eSF1 z$((LxYKnBIotebU&9yC3EZdmghQ!t&(OLcfP>3zk@}=uT)JXH6-FmgnIRjOqUMdsm)q;DbdhksHweO-klA277)a^!~_LP#I4C+W>DiKN<=B zW26K;6-M_$6u&&SDc3^LXys?h^5|YrWTC;_)`97(IKXE{OwIs|Q8Xf}&M>0nh$lRI_q;gcrAg-X9oLjpwnNS^4vk zEU~(c4^AWpU21tgY9y05xqF~5x~k=X?;;DCkufh{TU}h}-6W~R8J>#AnOy!9Gq++b zvFvjdf)Wt9iI$Y}2WU-dc@o|@`BS=fLPAR|@n@!5?$O z{zz!cVM;qG%`EitqTxV?)a=2^qLR^fRno1 zm#_}#d>EWo?>OnnX2`X}4?I9=3K{;w!P~eU6R`^=qqGXL4EHLLs})BkBkFz3HttnU zzFT2-(cGX%qSeEUqwyw;i^$Uy4!Vvn0kOUz#(3shJB8i`$~8ZUF&H5YVhrwUV<5&C zD%X3=k8QE5{anz%SX%|a<&_BEZ4@U;!2m1oi+t5WWk;h}*rxY#Pc+2#nD1b9Vks*> z5V?-mY;J-d?frnntSapZFu7m(+b-yBtn3Bs3**T|D?%Z5WoDu&ipxYXwlXt}c_BaK zn;EoaI_o63K$V5wEsZQ}<%4%bY|uRVGr#Ag+0|C z?5#}k7#`bf7yQRss79f{lLKAFD(EV@0~wMW_%ZhCLC=p$SozF|vGoo-yGBUXF<-9a za8*eSuIP+@uZKKl@v9bA{=*2JwYLI4JPsRp8&*Cr676Z$Nx$C6%2$U-)?Odv-E|)W zHb(}tYhD8VI6kPx9+c;^NhJq}{Lev><@BvX4_c&+u0E+r&7a7wVJus1DUJqLu5<)F z<5vD~n|yEqLt9-sV#faRFE~X)FAk!_<{yH#I#=+27rq@McZWACn`wy~1Rrx6D@tt@ zu|L&=lBxeEV5w8(a(*7XGy(5xsng_s4|5V^={Srfo@oRY3I_+wR<;rSZ{U81 z`F(orpPxa`p2qy1-OByuOiMEKaPdC6AG5N5m}%l%Y*WQ1O>{q9D5|#8I#s(Vj4$~< z->TX^ub({hdBZ%kb#(ZIQq=5~oINVlefQED)=BDM0;Ae(ePU-ZZIR!tLd$eL(>5th z;?;hqP6WZT%IWk=hd?9rkQR(^R{)fA&p;ID?QfQM=DB}mtiODgb@ znV@=q4M*WNKvyVu(8H8Y30~I87&DN%Z6NmUmW)^{dBDdL?ZgP#r;S*IvSd)~dQcL! z_XxMNro%yG267Hlpv?_pr>ZWl!M<4NeNtKu?N~a^P3rAw(cG$_k=!NyB}!Yqj|VjM z3t-NHvHm_ zDCH}}`nv@j3#hr7m{|FSVPd?5T{E^f>%B)oW2go+R*IDkZ%wok`JuzaqVcjKvyCws z!1oppLE~*vn;4^7o;L)&%5JrZMSSiMF~%@Ca)}cGv-kxriCuA!HJCZ+ zHp;^pJnu@o?FP*8htYiv@~m+nK>0ShXHpvb!!y9u@pHLcXcOh1g?WnxYq4Szk#7sf zW~H!AVZero?jd2E)XF-`wfC=R#u$n04jPCGts+>5# z>VcfiOn!1pj+>b0ZDK*;>#p^!5V}(ZvT2qx`*xS{$VF0=<)r^puKmA{IDKd3lCVlF z@sOZPllO3zXqY)2cy(fMzdhu4VdiItd2uOCRk2gX-ah4FqiC2xa~v7`19I4qBkNiY zn~F@)-#%rXQPf9sw0xUm?6*1CDZ;#3N($xUI z7yZfA6__b8Q)HB%A!AC|yyCQ!L5OXZg$HQL*E>T*t z)orE{*uU%SCu1L-g_U-9cxxZkXu8d3l+De|_Pac^HlsLYJu7Pl?{lq__PP#8=UguY z76Sg#055(JWq&svKCgp7-n~KO*`!U{urG_FB;fJ zrU|7sul+M^aWi5|F}wX?wuu*Gx!R+=JB2f`%<^uO7`mf8`CUnVM`d1XYy~kpsg~RH z81pJCI|nC9m%;Chg09u(83~<_Osq`xST^jlbN-RgH{f&&+a^j^0+CC}pz#@!!;=IU zc*EVT`jQwQw*PPx|G&peXi6v^ycDK*01gUp_(BmpScebm+vpy89iPA#{`|l5g|6`R zmHfZU7ru6gv|q3Lztb4m-}J5$NL>ltvG`JGz{@0(6ZGS~;GK(vFp$XTemu*Yd|RHB7oDq(VFvWu z+NML#H-sS@rc{dMR}-q=P>A(8g|#ui;^g2618J?)u0ftv;qw7Cp7&!fKMNV41mp8z z&+0=MzZd#>1RmTa=QVyMV$PGkp zaUZy1!?PJr_YF4rO?O8hfu8662m>A54{^wBwoQJ~o!VbrezcFXj`dkI<+3i$+5T!! z;2dJPJTakMHYPNYyA*YIT$mdmVXkjlPh6s-Cy`sAsIBEaC2^eP6NPkh*<3gdXPJ?75&1_7)dmLqX9LvEb~zBYK=4}ri~UIrT4RwqR}-0y>RK2Pb^$Lr z18HIqHmI@=i%`nUr53kAzZ&}UsQpN;8KjV4Pf=PhGhl-6YY={PB0>8>(*&TZ}DnUjpH89BEV7UCu60RN*G z6ALOTsJ=-vy`hR1F>cip9!J$ad*Z1hRXHL7_Xv4o;A|Bq<`kW+xTk7y#yu4V>>I=~ z7~rTr)|e(>d1DBSrahgzrsc4Ix_b1G16SuW7MZo}|JogId9)%~RrG;KH=^cp|=imS2{qNns zvef`gwO#(&^3vt6jTIGu4x!MDg#OlUt2$xM7GDaU;JT{}Mcwyb*$z^?yU^W z;YRy7fBFK8l+sG~T%mYx@C14HVp_@xbDC&$jfDII7HCUPz$ThpW|594n~ZMra`3e7 zwX_X=+r0ZvnBQ4lfB)}MuKWIxQ0u_C)v^5QGTJW9Pg_2>`ipOM_`jM=<*iZBG0K)d ztd7}lD^?rDnDqGlbxAB)V#WQKkCB*uO7GpYn(6Oc_mZ+u&&Uj8hBrp%+7wuWH?F2W zF$|aHc-}>2njhvLBB6hNs}qvFN2;Q^zNbgqwHh8MkQ7;&Q33Uf0gmjmlEjJjv8=Ta@U5Y`th+^xHC5J^l93c+XGQ(C_Yt>RmaGrqy4xq`N4$ zBe%WNXJ<{ajVUG?XzO9^9WC+Dk?+MDl~y`pqyHX{)vPSE&h|KDBl86)@$yKF=eG23d&mTc_Xmzt zHLdQf?C7)UtBYxT*FFDlwaxQ5dRXR}7Fu8a_4;HtLr3wi`Z`b_)eHWllJXO~?3b!k zKF^iQdVo zNC2DATBD>FkMy}yHYrOH@6v5jmO-K(r*z+!h27w@kxv51rSFaIUw?x1c(iJV;v&PL z4)h{cHttlrDVkJDI)}5r9>m8AU_?E6#)34SH zH5>i9BtmuSDRQFj8(*R&<(^C6y9?1zVp55FSEsosj*NHi2E77Q&ErajLpdYet0SRh zgT^(H(2oaQYXnauw0LmOY6|Bi@bdZjk~j~v2TPW?vcx^BlblJC)|TR;=|9qA6~cRs zu0%)AyoyFwB;*{~vzi#G9~6Nf)F^nkFqW5<2gh-*7LzRQv}J<>Ftn_v zT=p87CszZqm#>|1AVs{FNiF|!*))Fii8s0A+e_N#%kKN8*$Nzvo_Yr(mopCPZ`My7 z=N36?-*sE$a?r$ik8ribD3o$RJV^8ek^v+m2xzMV9+fL83n9o>SZ~aGGq?WO$${K9M2+VL`7TQQ0 zt-oN1*6(~Q{;|K+*n2p$qn7TrU25iJBy_Yr68c5^yjr&QL-70dzvxC|yf;IcnDcf{sU`d|!LCUi6)jv2kCg`QNd>JZ%`+@HdY-+uR8`G0X&~+x#A8 z(x1eHu&OW3{#)2ECif(&zi1g*PbpodrOILUxC#tKa@%zAVt~7{eH|=XGc{As`(sig zF$S>?J3Osa`lfmvc*Ic*rKPDB-B}xl`6nrcBC3UcXM@&pWPMDpqiMd;MM`KN#IVI-~TSQXuMeqH2Z3 z&&bGe&|Vlk251%;*$<7R9(+|bt?37Jr`(3q>co@OPoPT^e=_cNm2rktgtakIX7~aZ zrd^qFO`fLw8EL0*rEpO@HD&M{4Z7^dlnZm%s~61hyaP5;SwRn+F%ZEedsVf@@&}pT zWt>bLB&Wdl{^mQz&nP-Lc(q@wO>t1my`$%-gPCTyU1)do6s_xBG{2UwRmq&{UWS>v zcbUeYeA`s%E7cwC(X{{?XOZ0wE}yowUB7n`U3VEA7sR(KjAf&p>2>q$r*a!J@gISS z5@XGD^*qt#jK zfG4o?k^E<_Y<}G?9IvQdrdFMRPSzBoah|q{+BeeI^gWeArdB)>|Jk|C`|O%e$M_4P zT7-&d>54~8wFYMyb8KmE=JuAB-n}~E^yo6iqL;SXI6&%efpOwjfr4jp#Oa`4X+@FH z&my!Wk6u`6Ev-*%P?_)P)1*AHKL44%&7+InXxV3(w5GX$;vdq>Yga9s@wdV(;#IsmNUG8SD!#W}J>~%N#xLI1)US^lNpa8>a@`9n z=dCn|i&n<8LDkr!^?Z`ZK`%KxVio&f^ZI3^2b_hDz=qgP$TJZhe7hZ%6zXrCtQk5< zahc+Jq1RCh&7FGANv?JVaAw8QaeV&CA6`#v?P6xhQVVtnhrG?PWMOt0SG$a1dmSkT z$&EUq296-TQ`N8>?mDS+UV(>0vpoi>_=6(cWto4QjFe;g%wyS0Zd}N@=|D zKU*9Q>B5%U#4^^jg3*@jTDa%RytUN()m@R|GS_kv3%w^}-V$w(bG=W;PS*wk-9ISo z1q5QI5@wR zvM5&)ZI#Zo0Ia5ZGg?1|slApHkExjxk!EA6&zxvj05DA@(D4>`u=&QNa5yeplZ4)}DQ-c-Q+35OSp}BIxB(hOWDE7p+ zeWT!$g1%DSR*F=xfbv!;;H$XdZpi@d!6bIUziY%Ywfu~7)J-NsGZ0@cXU3gdZ+SRw zP<^FPga^z^bk^|P!`v7NB@U~CHJs|o3lD38M~S6~rcEjmf<|F^P3A1KyntO^4IXQ# z>M_kUi@boVdgwI#cBxgHm{Lp9ApBWEE`omJ~%pxySBli?!C1;l+5lO%Gi!6wJU4S)-LGLOqtiinRX~+w%L0U&ARZ@ zinc`;-Z;`4OweU@>Mrx~%av^TnVCdbb|Vpfho|S-bIB|s{OVeG5zn^}l8{crD+oIj zeMctFr>Nlh%lXI1ZXNMWIB=cEvux+hY_T9MAHFbUYL<>3HB9FmgSA zB=kINX)h~3wZ?qB)ba#1Gi|z$oi@rxrXBZ_Y`^~_a3CM`*%E&L=z<>zd8XB*L)sZdlY2X&Ly9y|mV<}oe`BtvtQFskJ3QiQe{+gkGtt-d^L$3vX z_UJ2*$^qjBJx23eAIW*aPg`fFjq#Hk>iWy~$J)5{YT16;%1)wHqkb#qvf7CKLl?D- zm`9!rkZE=Oh5H$lnYo`6@9E=HEbFh=du#vN{UoQZf6e|_-N~r?7JsbfInmxHf=6s1 z|6X&}h(B=uTg(ld-zMvcasA%|>Ym45$Ui z?Ojh{YUChEo392qbANz0Uk<3ua$wE3sgw)v4KSLzD^vFW^ZaFXUB6}j66k8{`X}tK zyW!TWnfog?P~9|}du#ug{TA?RbS*e~5>irJMyGj8itR7(hGTHPV&gi?#@aw1YGC)b zo;PhMN1elO%6JdIxfC90b^TZ0WH9c&H(x(*-mnO%U%yG)>wPoUUf|8^_}e`|vg-QJ zy=mTJzz78=2g;nYZgN*}x|6lex@$S!XdzQ= za$G&lv!Sf1h2}ZyCVBePkCic|$8JlJvcwpr8V(&BxF8ulthBf?-jgkED>kX(Pd-%o zL6mxBRC1o3@JW6UlH1z@XVrI|ta6T%RM62M3aWKK`c%~~r^K}N>+56M`k&+JzM;hb zUSIrZGPTI}Q)lL6^`LO$F7Xp(#zO>p{IdFAD>wcAFraReZS|ih)`yDCILTPX$PrSi2-YSg$(jqimpNCi&OZh8 z^Yfu5v;!`J(ZHkX7h#%XB{;CHc(!WTldOf7o1@X5q$$_?ORbbY9u}f$4+`oaqkhLf zHW0(vbACDw(o9!qB;*c>4M$`S5?!A;oU#H(jq!T?% zE1=z!hL_7OEi^B}*P3-FAB1;&N&16MjQaTuX^aGqJSDE04GWj^?PR-w^32=>+gMO) zrtu~pX@VckP^M{e52wD{IUag~GRWUQbuxnq(+%SC4X){QC6)W(p~5cANdyEc!*@Cx zmB)<9fQTCJs_+u$a>!Jg1cxO%D{G{C*K80r}E9(-mvf*J`O>8}h z`j7A}ZT;@`a{xOb+S;I6bJAWydbOZ_bHY&Rp$CPKKbR(GD`}crLi<+er0L_a2WN-f z(Hsv7)bmms%+xmcH=IW+ESqxz{YeY^19bO#F&sEw_{_-Wxzdg4hN3s^ueMJUCxo9; z<{@oe_|=R^=-Ke>XEqnTq6qG;^JeFYYxr8%fAY-(!*L*zN!tBs%cWH*0-Lo+Q6EXz+S%Yit0^0YS?qNpSAQypqbHd zRC0J%=`TE{D6=TNco$DfwW_gCb}UJ8^?phDbv**zpQE|~%=h&(Vc=U43GGzq-ron_jn+{OUX1dH?#b7!-_*~GO3T>G24nnh z;%!FJB4vv!P%HAnS1%@4U(fll@r#zBQ053RQHV;=#AZ6z|M*-Q~LLo=;u7fg1(zx16t3ZMYXZN!5Bfit0AnPYOp0TgAJBT2f@P78=_q zN52T?Gq;tDgkBilvMs@` zxH1^g?iw+_yPkcRm=g!t)Xajr?@hap57wx_N7#xWTRc#GqJ_zCQ0}tbE7$RwoCc-D z_CU>=J_ad!m9ma=eqza-Vw-fjr9+vxvO}>ZWm?^e(d1SVOqxM1nJL(=+&oW{OG|7- z>?I{}(FH#-SC-P5Z;DX8RZRMv-F~0bZN6_oy6e7ji*(=ZH;WYKEG`cDl7{9=(71Ln zw}jwHN3~qJuDhJDo`F&_bE)QHC=?l7R+egv$^-=|*q@FlKQ7Cs?{WutUwR6R>Jr`1 z`(sY!gGxD|<921b_Fn0zNSF3r{&bzWzhm(c<gK6Oju!^m)jYuobx`mQE^( zr~X3u6QQADC5zK6*V)beSj7Ds>}EN_ra0=&oNK%@p@g2W9EDu)s~CaD(ZIv7vMRQr z&|Yf0#2HQPp9GSC5dUTznej5t1p(&_c#bLrHvn3VBQCaYbv=}J(~ua$$!_2#UGLop zl8=IjcEhUX)H#8Z?sT9sMGP}3fxl?2}lTWr^4&ZEVKC_+bH0W7M z=to7agq}cJtU&igPoK0eL|+c+$V7PXMg7753g3!|Fk}<&k<%%je zfmlRq zT@miW`P`e%N(GK3z^%KZK5PnXmx~WEK^?c}${w7_)Nx5g<^6ls8X(_)luk_JMDEI- zN8s@`$ieT|$dW5BJ+vpNC%aeb^YsOtE4RQeih4b3aL&YxGayvB5zc=pME8o(*hYrcw9$IHvR;K`bR(;K{eC`_`jKB%vfOa?ftmcCCz0i)Ox z^%G^G3DdUna`13V4V4y8nv~=*O7(Wt@g1(C@QCL; zpTZ89E;hlJxA}@&r#Z&O!B;YubYdQ@D};eSGIWbEoyu#VqkoL-q&`bO;AwtRv6;GB z%&zwo+dOK;t8Tjka^TB=HRbt=5WfQu{<~qJ^u8wL#D`0dU1ZfMMa?e3^NIAnD_KHn zg1)E-|H~y<*;v-G+?6iUIzCKaDs^b|Cyrla_4TeePp9+&w3;-(P-Ji|lBm^>aV&DB z!7n=!st1hQE>L^!`gR5OdL7+mexSd^>_bnxK-X+0+Fz142QtNtK230}YLcu|?YCPy zsday9#0$6-9HVuwj;I04O_lrsv$R)w-JWy&tkei!FsQ zZG>t?;V}t}5#cFAPZmWk(bW?O3!YRfR!_-L;4fG^(1y9Ru-ppp-Kj2iN(NUr08bxr ztH3ZU0?QFJ;055_yq(CK=?OvoOT|N>HwLYqmMf&3JC@wS zx~Vpt`a;n&w*UEEfd2W>$Qbklw9*<1WO+>R#e{~nh58G{%1}SdzH5G%k&r9$FF(u) z*}sEbkJx=KR5EI>KDN|CimqdCcd-@(~U<;EVPI;&kRPL+BCYUpJZuLIOXCz9M-x|*YT z=fFFxLwTTb$n$mOLAxeOkN!uwR9RVhZ#u=j+*L2wC;M;A$QMnb1nZ{=@5fQ6f2D}f zGO*l}c!GBt;iY@+w8g{97XiNL#&n&BO#AZFs>;bly(-F zpmf~nNa(o{oQ$yx@CRYc@J2S}p(jiPb379#Z-Q2GAABO_7Z4d|j)NP>QN_KG$a4_? z0P&9&#yn5*;kV3-dDda@?eH*B4AW02sf!-O$&5nq%O6De;3hne;_18QUGa8%mbg$6 z<{nj2rw@lFP^yc*6yt0WSXAg1ho~ld>rA%Yf%5#5l-TBulSzL?end$=e9DI zFI`NxWeZba*;pO*#^&Y!Tfuv7B33U-6U#>0;yD*5htLxh+M*iHKAe@bY@~K!QW*&; zZ`09_5>1tK?o1<$mGhmG7?h$mo6m4cfX|hE3T(e|PORg~3Xcak1M5=1yH4XYw5Ny- z(UrYc!fc)_#+X%dr$~YUk(B z983;-DpsELq*cppf9hp5!koWeB=?^Sa52i{y@HL0{in z*#ODOy@YZMX^whO6l>dScGmySN|P82F!@5kgq#a_1An^cVqhtFpN>jU6EF7N*EqQn zxbvrWb|>}Yr+!(`@y?51V3zEy@wdg_u7yT7&+Wx{7>mUP&1pSs({talUpelW-*;?h zaWK$ZpVU|5^ugmJR}|p-l}tU9uDT}ZuX_(Y1Ga2 z9S&M_xAz#Jsh; zL}rB&nHNq6N@PL!AN=cu6M;ilNZsM%hl7vnrlPI&x*Ytk(oOVd^}D4BIH6P0Z>u3LH%snt5RJqvw^eIqp+1Fr|~!^k(EIvlLP zY`jq)FQ4I-KugtGe@gtFbD6^LqYx6>cZ;;Y3&m9UnSmBeC-R~pjrhXnhlBU)>iQqq zA1|UeB|4KfsEN~M3$JF&nz*cXovHN_t0i*D;ET#cXoKQdCdckG$gIxpH$Z<24;q=k zR$z=zkrQ-9fELlEw(}Owa=@N&+8_(MKlXBJ!9Pp1NJdEYJByiH2mCXO$Yh$6_g%-B zoyD|%0W-I*9QH2VI?$5|;vaf7@$tPH)mTuA%GOyT)y(~U|=K@DsK2wa%Oyf!?v)jC*ivqVO7DpeBcyO^e?`4dlTgN%l0I+LLbZ|)$LTWs1!8J9v#VtMJ1xxff5)9LcaQ&PfK2%`V89(zhIXbP z5TH=t8@CnnP0U;~`0}fO#(43&(4de@@VAJ3cYH81#~Ov4MWVTA{vV6B<7mdyU(-C~yD+lMv2 zt@uWGK^dWoJsgbOs`Bs4q~&?gfSstJH89-*TJ;AaEJU~ifpkP7s8Meer)Q6Er?YL5 z_1tsxi4x=ni*)m6>`d5&;%PlQi|?Ed8T~ZY$=!5DQ`_g8?t>o_oh802pZ3VwrJi>3 z!ywU4HO1!KYI-Xer zluSw~b{79NIzx<~nfYFTw$GweM?1UYw-n6iOiHypf6ZcbDzT*W;#cs z{mr7PTL?x9(Q35c#q&eQ-?sm;SHsO{2VX26!8{bU6U*qL@kPL8;obR+|K_5d=V>p~ zf!7%Ow0<9R%Vn(Ydv!v;v4X`as?qGM=VEpdO9(U1YJv-Q`S?FQanvb$E-urbSJ)UFG^O@@~k=3dp)PWqbx_( zU&|ptN8apC$KI~;9k9DEzv>R9_q7xk?d?@*aUx}KXZI=49#Ti)W)RDJ&ONl7(!@2t z@!{*5gmy#A(w29|ZVS-yrvJxyvt+gQaB!)Pj!wk>u!cL`5|>lj8JAlOI}9f;oGjuu zRupH^`n5qmt_#{&#z#z_2WSi7Yc052I$HVzS@IZdJoNQ3NO8Wg6jJOoAB9s@fNjdC z`EhQ%pT#XuY@rMvfd`>b^ zyou4YoyGgU6fA!W91@EH4)L_O4F7iq()-=zz_J3;%@%aExB~MotJ(A(R(EUviv4}G z4&V@jI<&ni?1cyHSGve#zPngl8aQAdIDIvp&W9OPGe!|;ZF=DBVbM1~yX%!+fgGCu z0nW9liYPst;%Az2i^hrfe3_0_qzbYsi7aR{80dSUXb{@QCu8uxO{iGL9s~5&{5IVbFJsMV&DHVOVmYA zf|B;B7nO4OLO!MuH;ZG$%ytXBEwRGmGR4ov7UD((vzQA$_mP3PoWtS~+>@|bjQiA@ zzi+-8{FTtYXa1#Q^bD->OL`XsA&7qM$c@e%A_c>-Sf3g z%S`m*KlrsiJO;NM@Qh5ee7pNGSB}r@Vl?(J#p~szed~m$w_;uV9`xt zjKBNpma6B!(m!GRT7%U0qa{=)adu;<`RiisA9@p1%v@pi0Z__bf4*l@&zI|%g7l(a zLyJE~%y)9V?{ke`kteKQYqY=nD)-y^`L33)`6rl}ZhY4SRl*tNWmtV)ZeDarujS>- z3P#91Ba&@h8PK6MIdH?nFF#u>t`N!2Qo!}^3JF>hmeJE|+joiaI5j3H%!j=Ewz5&& zDxMFFzSej2yUO^r8YBH{6&)$x73;UCy|3tcuP^!cf}f}U{gLSJn>s>fOukZ;;2`eq zS&to==g9gaoS{JHyD6=AzyEUWa~#3lX7GR15GqxS3Tg=C4B4WPEdEn)AUL~DwN~+Y zVLz20S7@$AqzJqRMMLf2T7ZrCRG|*qSCDT#0c~|^eas@bT6r#+e-C`)zBDS9OlPgIDI*w#|keV zu!2h7j&?_#ra7su<*ose*LnKa*CgAg@bm{hxu{+^HQhLs@lUuRv$M^PJ5$}j{`;G9LUeK7k`BO z{9YGd^m4Dj9|=%AAMlyPGEqi78h$WjMV-!~zLj4`B}pqrns$9WR(+eJvJX183yN{o zJ(b(+DZX=+JCtI51|;>P7d2*LUY5Q|DKp=o#AHfW0!`6Vo2B zn8A?{Jw1(?%VwY{%6W^4KDWF@H8Dh95Iq}0PYQjiwMf%k)XnoCJ2i}9+@=+?8sP_sBTrOVz2DXxu z=sVw~f~|^y&R^eF0sboJ4+nh6_W|+?(CY*uF9nUJ!0 z(5A{yZ_1%ML3(oswGGj>^xkBgbYKd``;uUDQO(_LPdlY^HsO2&slaKog5CC{W4s(c zz(Y$D3Bk`wKCAHZAECkEG16u+;b}I-Hf|y_+K5Ac<52+&fhHRJfIBK2dG8j#=k4V!d>FHY6i70ADH5yHe`}Z zb1!r)#V7)Y+&mxz*kcp`}^wOn^5%QF0akKQHOS|ArDdkU0rD z@tM5*u)>=(+cd96LTn^&YQO)>0Ij(n5;T#I*7HsDJ{k_P)7$kpD?f=fJ_Be_ddbV# z&^Yn(T$};czZLyXc==tW6PEJ5_VJy36YMdR7UQ-ez7a6BG2kXLT48tIol%ogJ@0Zd z$C@;+k|}Q}nb1oe84+RAWzZvoaty1Hm$MYcYLkCd&(Am!$VZ=cjL?xkUOyUkC!738 zeQp}s(r>ks%hmPJFV~UF57eK*jW^50*X^nP4^ZOy=qOg!Pi(bEZB65Ghv+2um`*DC zlYO+G!bad01t?r`rWf8~6(gA2og}N{a&f(CC%22;&0rs7@;?cHhXR+*$(_(Pb8=S% zGH&iRyG>T3cb!p)t%$ajTTdq4AWrKhQ)l}h%ADoX{CZ;9BI%vh9imngjGW9Qt`Ob^ zMbr2imTYjc506*x#SOR`P#-xWnhME3^jnD3Cp(phkdd5!a z_wzF;jQ80;>cq^ws`*VMG--s61;<&>(;I@GjcB$V3D9*!*F!b-po54XLZGzaqZ9;u zr|Xxl56wPEtJ-nmy+*b%5;_ao+j02=HzYkR+w>MBLCOipeoYe_O}~J2A|GR;FNSr2|E#GkTGQVDTGNqeO^v8&x5g&_(kFK-{e1| z>}aMr=J#l|%g|H*NG$*Hk)`u*?f>PQ!08l<(=m)*KK$92u{C?!u-RhpaDUi4oVo=hOTg((PX0%DRH@O$$*04(C&^=o+Ca6pIZOsA$Hn5t3+Ow$vRp=q z>Uc*&U%~_ZE}Xsi0{E~V_|lDM4e$jTzy(IwhD6Fq6j(rIamNO}r+9Us`y^L)I?+k% zWaXcrMlQNTQtL{b)95lt^z0gA29LuSk>jZWChKd+s2X_P(mH4xv^~~Ixer>$>#g+r zcxSaYHj2&798NfAl&UeFM{ut~;Q>P_g-LbTdVrJD;p^^z4xg1L3~=L9x{`0J6mv1+ z-{7=8^zfpk|Ij*mLWym}nY-at(0*q@H~(DNDhhyiHAcOvwY>lH8LHd5Kmk6-Dkkj| z26X%z(2qy(ygvT-NB%W_nil8OcyZ@embNQ4K2{!!(ecsI#WaJI6Br24yb8Do(EvPn zIIjF4Y)A@hmnN|gJ>jTL#A}-;c&DJJP@w(YXz~|P97Jz9MDF0>jgDT9=sy+1mC?LSXKCofl|p` z!^n>eejae*b`%3<^(wpu>8)S}{&axyA?{(SZO2_YhbXV2hjm8qmU*1g7Qju#r8u^_ zQanN>E1P2{8!YAhU2EA=wgk5(;I7MO0k3)l+~X(it%Ah%eAg;ywswJ2^3nGdtEg9{ z-exGKQp)^id9it5vURgKwFPG%wYXn+=050N$fUi`X29P)-dFML)RsM~s0|8!?C$$E z#pDtOJFgYDnI~<57Ypv-*$S)U)9`nRl^X9qTf@qcxU;Q{X%E_5S-pJ~bT`3tcqr8m z?!kG~QgQn#s-K}6jx8vAuBM`uOgoCZg*fst{K)8S0d?wc@E=d!qjB;sxav@OgX9KJ zgxe!3`CwjL39xP%ZcUreMJ7RZ(=tsj+WBMWYPvk5T2V%|w~B#;*i^Z*`0R6*UnI9= zwCu)hIeV)zR%LjI*$5r-&SF}}&j&%TqpRQYi?h$AwIsJ}v5)uNQ^gc4zAK~U;6T29 z7lnz%^3*vgrN6sQ<%`eJ_)}yX^k$>X%uFg1b_7P{4EU+N!O$KLPfIej-B0%ilI!&0 z*1mNE5d11YOa2QcKf~9B zss|{HRh7|uxf-OOR;q)B=p9~f;QmHSS08G*(O*ylo>h)$X84#JrqVI|z}-;=k5L^? zRqKH&D{QgQv%wlf?~J09;o~snG39!i))Y-UP{o~IAz1Jp;(3g2(&G_59$kcLJu52u^;HLW(WaOp82vt6+2V(o5(2KrNrkRfei;IA2jP$s=6PBKPay{35>bqr#-we zTnK0>4eKhQf%T1ZJ-iZUB`#6_c#8d0s{Bc%2rmhXr?+Mws7f6_shgF556XYlkDHs~ z7ov`T;BL+IuHG6>j{L92z6LC+GVT94b7qDCMwmbo0da-_9Ry?)RQxE10S+j(T3TsZ z4Wf1k)A6Ii-QIOb-2BeMEmPaYurh0R8I)bo49jXOw{1r4eN}X$teq6K!LK>Y0Q3Ld zX9jcMb>Hhh*LCJO=R6L*-74P@N?D;$+VSPgDl_xi>AAclDEH)xPM7GI%}c<9es?Zk0)R z-fPk9c=EGrj)ZL`GIzwCCm7prPcI7TMV++DG7j%!ud8c|>8J!yLMsiAej-WD+bOPVS-YP zmUO972DhQ~FZ_Gy&r=<#X6&ojD9;$RA4w*0y{J?Y4=f9t};fKlgthJDnq&vkUkEE zp0l87`?v6Yf~zXm&_4p2k!=xb0{vb2tqZH@6i3b4OyKW=e zB($EOyak+hQtNx6^;h6Pm*@93R8Me%=E1zvV5e0CaSntqwv_NU^;U%a6In&r|10ja>akwcEhWy$^S$;Ka0Rjzgwn^lJPn`@yUx66`wby# zUU zGbDm@qmrm!Cxb=+_P5-_ft(7g8qBl|R1zc`QoyC7UdMTVYNbA_h`(igSRT2dcvm7WF1OPY1v$3}y%+K< zEL|z&2=g}nv8iu{(7Au^B}&jGjHngNELVV>N>Y!|OaDO558g4;kFEx^`>rRGn%=1T zeC`9Fs2b$eiSX67TN`TG*|%%C(SP?ygx6f~$tE_e5q(<;%I*O6^I@uvN{6~&rX1JM z&10JWXw`!%#2PBh!CNkMlf<)rojgaS+#LL))gk=gI=_h<`?|#IlA7jKwKlnDW;Su7 z&#$3z6H4=>hk7Wq2whw%(Ms}6Xgc8zmef>%X)642+Z1+7kWFOUyvEK4SfN7o*6Ko+|)p@i@l>Y!E6GPSLks~LqtIQ-N5 z2N`eL3ho|9Z<~3MFi&J!L$EnNahNdk-5Y>}j?L7P3mLU6!7R739+F57aSKw7chU^E zaEL+Qh7V}RaOXbq>Eex$!}(ix={{frn0KWrhH(>WaaSNli-~r9>hG66VrQw_ z?Pu(XOCMQ!W+@OG?2jxPvMkD|DK`tp9Go$FX)emNtpq;i%T2`FA>;+Z!INYR!mC7& zmB`<}!E?*D{eAa@Xm^CZNV8 z6rpAGdpr0jv}P`yp6zI=1Bag(Q#WtI%v5L1bQ>{8)`32zHsnAZbK@A$dk4s^*xS9g zIOS9+YVrQ=k(h~sz8viAKll8w3A~Xb+{k%V+1MYbjwFIo`fkk*npO3o^#AVJTikIf zQTPg)wu6gC*DUcSsgOe;Ko|w}l+O$njMcAuL#u9Rl?7d-y6hRdh_F;@MNQ?M+rZfs zWsdJ$9IJJ0XyI#6Zm!37Ue>>w7e>&{KTLQU)G`m5ZveHKa(%Mb3%%3(TL~e8>VB*A zh>rIvRJGDveW&x6&SIw#d^$bkxjDH-g1+uv&R8qWLC85Q|1j?Kqgx8mUWDL18~n0M z@{C{#UXkgy+kL+2Md<0UKk^^3NM<{?p#9<@Bjtcg^qb;GvOz#=LrvQO=!=t273-> z*e|6Xd9mq@jj{fX-EmD@fz@4()h)F1P-5pna}n*@LZdjQyKkrV4Unc@$G(PkFDiM@ zgcEsd`{}ngzVYOwrsI!VXTCwRlARD7U$wqb%bndVr8RORKlLa(H-hFE8Nis)j}%G; zZal^eP5^w4PbHmW)KXAJ`Z(->nCW%bmsn@|3E|ei!|I5%fNk63yND6+pqb01(MKy` zGkS#)QidU^*~eS$hYOrXs;nDVhu3h<74*$)4I#121rkeSF0{417aehDiN>J&w;WE; z9^kn;LO3m1GD^!VqCHf_{Kt({uHFQnD+^91}<^cqOC6Z+9tz)Ew&0p1Z^mK~zY?(pq$ z(C49eM3nN4yQ*d7hScG0uT8eko_7^5ea;Cf5aG^)$BV;+K~v%zH#6`!zO!TS2K8ho-Sn}N!53?cLPsmt%4 zvK%t=sHY7f&JOWeh_geplo{oJRiZf$@+Q}~Q8ee#+^HG!i{dtD2+gfb2IXNA>PuLf zO!d783}WTWo}Vh2=G!W!IrkLKqCklZ5HyhIti;%4z^^rm!*QPkxsGimbW%-TkRMw_X8`f zxtHC)+hF$~^;8hnugfC(xepOL@=8A1fTcU}{UJB6g^& zrIU}%!aoPepAQ^aBH1Znzy&fw7FwCK#R`esq%OB&ZJa*Q(P+i~oX-&Uw3>y?r9V2V zp(8+LVW!A4%ve>UhV;}<&V)4n4DO1Dw7*to;AtG}tFR1SEBNfdKHZ{evH4*~b@*4}N?h{lWKe zPtWB3?njcP|b8+a(!ah=6wZeG*4MvR`KGyGP17^{W|`geS{2x*3QKuJ;@6?6dn zz6sqXJe}<(ixd=})(oX76D{IkoeD+&HVfm83Uh`1 zNR!^KZs(0keVIMdsIhObe`dEIj=b-CPvm{y;cE9>nG0z$iAx41&7yB;R5H-8t+{W* zW)m(Gu54Va)Lv2qmoq`iz@;z^afyc_jHdc+xgTl?3UE1rBSKt zmulPl{Et_zUAo?`2>Y?rDN70It!WMH9L*ad=*EfGaRG zZ5VorMuTzE8FUyqgCcdBH!`N)ets!~$$__)w%ez9b=tRxU5!+ zY_Eb`$bci$ylU-vSVpN|@z1Agr9?bOXxpEul~NqW<>kxYSpMB|!-|R(9$<>>dV1J1 z^PU;@Z27ZG5L167wy0JzFwe6~Dr+U9W12Tg^MrR*M6Hx=u9b#5YNb@WWmv5=ti4uB zv)4){+hW8TZjM2$OyngCAu?>WQZ_=5z?Fl`e56(y$*v&1T!a_}-#o+|4WBW(T4^kN z^VyzC8+N$0(l}h>^|jIjgqVmB_vr2g_2{i3sSFMHd7SqTkl!Hmseo^23+%?WNX@HZ zTZ7gBJ6JtLMZMwzup|PrK5Auv$aB#%|xX!?ZVEQ_bBIaoi?$`_^IKMf?iC z@7n`^V)mgG;;Gr@BHg{rtM}jCse@cFz3KKn9ryulD@`N&QEMR^Iaq)l2Cu892LEsN zDpT%lBPrthh1Vp7`9NzFPAor%T)_rN-a$GZZT}MVp7=AR2)(=4)P4rCrcuBtJ&pB) zhu-(B*16WXsP$LSQ6kk0X-KpRxANL_2huSEeX&1jx&Omz~#aHN= z?n7UoyU-Wt?wqZGI6$C{V+ClqdLQah3tlI9%x$Zyn>&uiCY@p4G}J(B+j8-uP6fQ! z8L$SxI#dJhvArwiIy1qqn1FaDRH&U!%MZ^t?5s|KJ@?)Vnu`GxYv# zEURDJyVd)VdgPh!bXAbDi9lW{Rb~GMF}H;@X;?4fGZoHCjKX5jg}R6YQIiXuujEm} zAuIpU-NH?`4sA{|(;{dNL07Mb=Bm7|@3F6iv`APJt=pG$n?(TToeQZg2Kyuj=cXwr1LUNTw}>;{KE9iYN)z;iOxIi%Yd-eCi)@)Se0$d6`IcR|7;^Eyso`BK7B?bGL_v*;he zlV?Vvw(l0=ZHnr(jcj zwL{1kPCyoJf3TERGo^Z)#@X%r3FDSdz`Zs1IIBeH5EhEI5}NbUzXR8np6hKl!K(nx zZaVK8eJczQg>2_;g`oD=DZj@50440aR`UX+63ru>IT;dk3b;{&s&g_RX^b;u2|O{C zkXW5FT;m!xrN4RDWX{_uRpE@Oz?ErBFEfeBB43@8d5@b79V<+2NfnlWHX2?Is{qPR zE-0Q!K)+LV4&(|+JLxOvDC7`YMXWo@nKOK#JLvl`$X6e7o?l0}8+>MeSA#edw#A~` zQ{k_0Z7o)v`0g}Iqcl^66P^ljn2;>K!)m zkndkR^FSxh7q!lMaK)$}6$Y3QdCNuKa*2zV2aA6cRtX880m8k`F_j~5r8pZw&GkD2 zP33Hy!)Hgi(&-!?c$4$Q_#&1mwN=<`BAqio%r3!No>t)B;a-NO8=dU8aod3dv5n|t zvYAKy{mQNW-r)aP^YZArc$7NU#aI5y`33a+w~Nc1cfp!XKUW+0@BP7*T;kO-dkM9} z60Zt(p=b0c(9LTbUxp<%mNCZ_=T*mIFQVr5a4+?5)$PDZ%u4ku39Tn2wgtV-2I;7U zunf46d7U_&9n_}y{r%`$M4u~D`n5rldI@UeEov>DOZ6I!)`Os1fg%QKHeYxbV`h(E zy-h^#Ym}ne1L3yPxhGU6i+L^TZS^g*2a$W_3mF$R`~w1|QeScwHl!jEDhZ|OaG9{@ zIN|B`ZI(Q!HCzZTgQpv}wz&FQK*fE5+Rrny*)j zbDT-|LfilO1@7h9PX3*suiw9XTiB|w!C<&OtrUt$$6t-m8SWqsB+H+8ZV(k z5FeaQXQ)Si0#3G8z#b&yA(vtJ%+p81trqR(E2ALyI!8W1EW)~xs^@Z-+pO*HAnd&^ zLu$fETXHvcv!pHfu9yf(*fu$?B6FZyEx+3?MzthWLfalsLEq4x_rwbET}YQ~U&oEw zUK8{c$d+|Bcey+fnVdV)_`QdRt2DNwKX7h^@vKJ)mp7jBs51ZCrOy1?9br7~S)I&q z8q#OE(+*oYCoiyvI>Pymac5R0RW&%t@))E9@XsK%WCs1R5dFY@xE@><=ADVzk);KE zbFr^V7G#RBP%Ug|TnDOw4KH=Ou=6Y;YlzeP($%|nL8~jXaz|ArX4y4Ly%0^a>*|S+ z<)<$V6IzOuXD5PJ(%H7c_LC>GlG{r@RDa48Pa8M(if5PgVCx^m{sQDSrbA!7yPtDc zaV&N=8vAE>Gr;-oIxhEJ)JtsR{e1%(Ql#E{D+=>@Gm0PZp` zOm}iySenYVN8E-Hyj%JK`y$=y)w_$Db zz5(ehpqHKF-XR(956HqGzPe2$?g^)2IpbZ-IKeiyosfEV_UJG-YE{=fiV?7SuqF50 zROH}YSSM`U7ulHwxdKX01qw`$)_Sq`8_#KIA$K^FZPSI%rGx@lh()V)`_6U2-XKqw zE*IJ=%8m1OgJ1CR1+`HNPNHD`y_2O+1V=~aO}y~A)W6^x&(t(!K)uzR_Z`ZlQ4xnA zTGi;eN9d608rn4uhRhFSr~}HBxHf(-_ZrQ5V=#k6wn5u0?aVqt$gl!w;pheBf-`8L z??I6gRYSI(g1#2SQ?*e~tAdm)rPF8QZaUWGy>hKIplurv^RM8%`bwuD3?CVZO9h0J~rY zG?+ieibwQA!1oo#rUt8$a(kWasyw@#3X0CgF0Ccc`O!M7SEu->hOjjuD~OX-z2HZ! za?FR2O7tiT`innUkAELV9pxzCd+RWTt%5yBMOaE5XJN8Df&$Ve+eGF}GuunZ)(cAl@ThZ%&+*S~heSivw-ojfd?ri$^;LXYU# zkj>izNC&u{Sg+@_@FJher6)cMY2(QO-*j*(fvyHCFf9FsjIHl&j)%ly{8YtIepo8b z*ph&~P-gQUjuV@lb-*4R@Z5XF(&-09tdmDz|0(^R7EV9IcK5SJ+mL4yg$n4CWZGuf zQl6DOGhlrN_$&A}l_ONHER-sQzfU$=jLrnH(eLnDB7qu$vqTEV;gqs349Rzry-K^Y z%XgQ*-q{hhCK}<|E3O8%1do#fEsJP3358Wg+v=(cAdoYCgDoF3I)@pZ(#vnY8#V&K zFTBI~^C=)cP*364!j>yec6o>D9MkLP_u13|Z+^ZC^ms*Wmv3+{tl=?|AF)`kpnV6h z4mo{lV?BE8u^>O#?+Q^apJ44#LsBu|6ME(K)Qr~FccYgxQyxk3-61dh+LD{WWppa2 za)-XZ#Jis5ALiH6nKSPQ%$gS;tmzF7(VA2xjxq}yTB zN6*zszI{L_A^(u}56!Y&RIAu)1usQ3i%!iHW@rpty`~7nGgb#lg5|Rcxh=FG@`g3h zS*yhw3wt85uqQ%!*eu&qiN^f!dT$!uC=JGqKtiYmdf2mFKG-rh{0M&HAc@B_d?pxc z(d%W~9n?ov=y$Njwu)BWBj|x-A+fI?+94Tt=T__TeS%r;a#Ouiu}TZ;K%;aR+dXu) zO#8S|7?ZQ5U8``80CaLXNsxT~4wJ8(`eCxG^nZPqc0pRuc-vs(g_*{=*zmC~mNEK2 zNLLjCPo~TFwSUNDE^o0dM*IZpb_#Z$0Z>X=?PlbL8DA3TByeBfC5~)qu=YQDmzdG= zePaCNOCBBUpm;rNMZPF>7c+%yUeEOF+Nr0PY@?^f0((rTFUU%l!CqCmz=m?;x7&> zNAe|IXLPJmP`l|ghbV1X=5+N7kYS`;EBz!J#%&uXG<0YbTdeC_k0dg^rHFYibWseF zj2r;TNY)zseES5F6H}~G507$Nt_D-tTM2{WizWmB(|fK^Mj zF@gCZ(^t7-!+etR%XJa|gBemvF#~8&lJ+AB-$>O*lBN`NfJ^(A@Un}o4PZ!5%L|{*7EI!||4}uRwu>S3=-LR2qba3sMM`MKIlmQYKt8*?-It!!>`{6F% z(%=nGpS(Qm4;>(UFXC&}fbxnJ3@v08Lz))wr5}oG3HUzsC$uZVNKAX7C9~hL3z#XO zcl{4bn)e7y6^ZN>;1>G6S21*ZgaUWC<=Glw9aEV z3*G|#Z-rVo9WCxie4r@WHp-?EEm)cCwo=#^RGNA0&=U)ffm;^v75LSi8s#}>bccqu z!P?$-Tb#2^(wa}$a>YHxnMJv_ywiI+RI1K|8`E>eGFxF-?zI?c1$?P~`XA_j-?|O@ z(Hg}#^eCTiK<`VQJ;iq)e-nMYSoo6%qa*!2Pp%l%!7G+SvX|pW*_PY-auQEDF(2|w z6b^Z;kk#ja6jx|F?xB<~b{XWlS_WGq%rxox!at1@=sP~&`JQp`DFAxU9FKRuR*VLp zvEQId@$-m5Clh9WeL*qMRMZ0Wt;^z&TpyG944$NzNOSgC{eu3 zp^X#cWXvhf9q`p1Bvh&d_ysRv^;otgyp}}U6lH~lOkV~c>c95pBFIZBM4(ES{V-5d zdOn~ij+mlPK&$h`9UR8d8NV4aj9Bejsh{`tdyO#C$&FKFdE$jD8!ht}?of{m$ljZ2*z?bE%fUD11^UQ+hfYQy1B7G z<`T7_+{3?2;Zw2yRPG6Y=8FI>o(?p6z_$Twj}0ku+ck(M0W&H?&>)PlC(jmxT|Q}K z_&w10HDLF2U@SN;*xkImWgmyonIy%%eQ- zI$uD zGo<6Zg=-q2nN43dO?T0kuSndEA=TMA_-;;u{9O(*am*`7s+2gS`Cb=GBV4Y<`^Gvs zLU+kJD5pre&AGPJb~fyvBw?8k{jR_bNfpp^Ex8yO3G2gqGlYa{SX!56Ig5(3g<%Kp?*=p=rj$GhJM%#&Q`LCCl z=0046xpY+Ia*xs|0bUa?hodLfdN}MKl@WC|$CPp|XJm~vsja@#%yW8$lk8ihWyGJQ z=g7=!r)?(HxrY!U3LzfmFMBL_9)o8Ep2zY(;4~=#k}x!ntHcqIf;6L!D#4?b+(S`A zz@^&~@Kpskvmf$oNH^!DFcw|P1q^V!B@t~Z?yErh5fZXM^HP*%G%%F8ZCBWKxV2YET{EWNRJMe z+@#|ZB|zTjF6P}N>pS0#aW)QokW@*L4ZJ6;c+5Lc8ig5j+Vz^HM705X3}{^eAM}z% z&0)Ps<%-N#nl^?dAZh0kg|O?FqE8%Psg|n)koMyTyv;9&bW#9nSY$afToWpfwpgzA z%YEJ2?`$*pP%&+9-Y9rFGCKQKwo*cq=|hszS!5$$upH9qee1+EH7 z6aT{{pC5>0oTFelkMsnw|AXBRBksC9M%nVg4Y?=Ehy<*N4nkPPYZw!_#@=Q_xKqJ|yw#O!~zIpPo8JHUymV!!Q$^(O3T+Gy?M zz@??rA=*j!p=;f@lOP(!E^`b+_+g(rbuAj4XMxJb-uDK0>s@V1Sa2u$OE1-n`j+q3 z5xy}${IXjq(~<*ZF6RJ-zSO!EJZVj{3f2T6<3l>#{t)Hx`61Ridkx7e(yk@ov--rYhf85pp7t-7pU7ct<02+xtbNwtO))|%O5&5+NUlk z|IRWZ+gN5|8}mLTos*R9-~kv3ZO>vQL=~2q1RvXNKB4yySSvaTd3#C7W!`E37UE~W zg4_K1;>~E8g8YSYg&d6xtz zKY!Kg{0JHjX@2H?$?~eja*@++wM@G>u+*r1KOo&4;(wu66S(`s!i!v?IuO(OniZ=; zg1R$kc6bNXyk@mry}L$n?}VZ`iMyNj1thN~pvx_~$QQ9dOz&I8k*6mPV%S?dysDbF ziY-?aHH!R+MV5^&}oo%*H+^~US{{LNP_oL}Lk+@7|W3wbT_K=mfY1n#DMpx!j7 zH>F>3JzRGa9o|h2s=M`$P~Fv_?&N&S%fPxWiBB^T=bS|8_EUz>KZ|1S)FZRe1}36z7bA^uwAU=Zb?ATprwuP;{k)mIrp zYEG9YKnuuRdVGDcaQdB2MWmr(S5=b;uHIpX+%;wrT9G6xHY{8wv1=)8! zZ1i@ifzk6zdz(0`5ZWwV%==YWNc*!HxWJ9z?GkPICEho8F@)ca|B(MWVD4(kUJhtt zvX}D!Y}-VFKXDiCHIq}ldmc!=t^@X|dJ4Tsz3#w0VDdFATyv23R7Y-iT4z73V0QM zJ!BP$v&g*n9z@AI@s%40=Y8YQ>Ijwl=jSu9TaKLJ>f^I99h++`OPk__^=zduaP84+ z(d;2HNju<|2dtT{SJxc?KZ?_9(^UbM`j9x_mjzd$UJOkJ>s1bJ3S4?lb`{9an$}0s z=cPmoD^j9>eKPPk&V856O8#|AR@(E{WIK0yTk@lJOQILtu&+I{(}4_@?(sa7{sUHN z=%Fn7!IJ>W3-yLP9YK3=Wk+Vo_4s4w5Y7b388R`v3siEccz(XY5eap*ObsMr@!f2*TZ0K?51x`&+xLH)&e(5hqu4(83sBd&vw(dvM0Tid842=kp@>CFhcu2 z#+?ql?o{wUBEb_($yT4D{>z3H7rtlBZ_N^7(c@o2j9D!YgG=4iLn%Jk6IYgnk(P@z zr}c1#_|kyyo*soE4(>QQW5P+#Pdx$Ojvfgb_G|OFVIO(cqHj&Nuvre&GmV43az`{q zG}dzp&2C(e{+H?#(z$;H>+;*Uc<^s$74l_z?3ssF6%HG5D=efZ z5jO~Yatfm~g{Xk|Q&jTp-F$W=FfSO>wx&TBlNn|}a%fPYs%#MIVgq;+`SOk^;Bg`U zR9@(!3+NS~`Cv5(y!o4;Yp~zz!rmIY&?xbEMEA)v_*Z?+Pk99P-`0*Q6dyrZjocH( znzHS%dmD91af8J@Z&jaGO?e6U*c*XFKoq7t%39B&%*alfet$o~BHjg=Qd1GmOXuA5 z{qB8m?o+k+ZYS(hQz=@nO?xq7Y87N6;~`%Y;i3}l>gFciaMQ^`{^10n+hZx43VtV@ z|EqAW(ChmUrzA@GyyPvQ%e!FxjyT_ONy(;3setJ z1v|uP*X{GPhVzLgAxXhsZ?6dY<^>(HKZTu(+`~=>_73JlkU2r^(ewR5BWQ1m7fLVm zj>=iutvy61al?Z@I@LGWX!1!59&rBA3fY#d{-6bwkX6K3M&6Y;QxE;;ib_b;qGWkw zFRdRVc?Bip6^Q3V=Zpi83Wq$9yxd2Q)#5%-2Ol{04&rY(;kSMgk|7!2PBCF6SD2!U{JA%H8y{C#txu`F+UR(0w zY)L;6mbT2ZrDV8DxCwAIaQnm6!qvgm!PUa;4_5;>0j?5mvbirEO8LuP&7lf05_;Fv z!;UN&h~1I`bx3}H>ILCq<1X40K4Q~-|hhE3P~?&I`x`AQEjNM(Ej^Y z_$|Go#D|g7?bclPGTbHOZiKrDcL})5a9_n;f83?HM^!$I9B;P{aWBK27I%s6CfsRo zH^6-rcS_vpAi<^|8_H#rTR-Np;=j6Y|K2QFu34!ftpTO#4{|I0(W9KKDvJ^o*W2gC z!yYM>yw{_}yryJ+l_@o7@cTYGq-$19rLy^;-)Lfl?X4)Q0Htu9WR8Ht#DF@lhiywb zu`B4-16PDWIv{vy@D#mw2(N3NDeknUyG}mYfUQnpY1y z4Y0?c8{)p+0^GpiN$%}Wf>-0>J54wv5Bk0ePRBZpvgF}h8}kiTY9nyBaJH{14f>9t zSCKr_o?xdZ*~ZeYcqm`V1LzE^KjzsX3Kh!XLRqII^`Ej_cr}JGYo)YDC9t&eWludbHv6d@xQ~nF z%jPdEe|pi15fyCm{6!1&Gs~A(vEZf99)dACC*klw=W43k+}(JlFm%pD{-|{M*%fx@ zEm^W+(US7{3zj|pRC(oMR$#YVmsKu);z2vBT(&d^*W*twUQlgcP_bgc{L1Ca@cD_0 zmn<%SYQepX(mS01e5kO?hg~&14&!|Up2^kVxdm=i*gq1_6fZjbtPQ*U!tU|~%PN*E z9zR}R{J;a#9vH7LShQ?G`TUi7yj(2jBZ`HC=pR_{MCI}o3n<6>!lJ^Qg2Mas@T)9e zq@Ta6@|gw8ehwN=Oen8hv|zq|#S(o5QeCk?zd~H_Z&4RKQ(3WKygq&Y&(UW*T~V=M z`SOKNFIu!xzbyP&O6U&J!(T?foyC;6G`O_5bh!F{$%@# z5yuqd*7A%e7YQlh>UTvj6+M5UVQO-9F)RWu@s2h0y!9>?3D#uJ7N^@{ddf}4y=9|=?QPty@W|18>JLIlCD!aA+ z^J+n;oCSpg7pt0^57Y@ax+Y!Vr{&)_YOuMh^x5Yhnb^8~)wyW{o~E|WVz+v)Idn^v z^>aV|_A%hf;|hI?u?yk*`^uT7=Lx3y>2apHJTK(`&H|<}gzx)O#XwGQuK3N zA1-H_7CX~C{3O$q;Oc~45D!;{>&>T`X2Rl7T5m53xf8-}diZ@L!dahQRK@PYn6F}` zWe?7nseiEGA^k6^S4^Lk$Kue%6llK=zRz7{~Erh@Hw~DPuA$MW6a@N!f;2?%xuQY`*KH33jIP4rDNyhJvaK% z@LWLjy@EwFqO&&+9Us|v_Hu9)M+yIb{j#{-+P-;YmSQT-ZNG;sDWcwSZoyy$xHUuvj=c{E57{BK<{+0YlNSJvHu4L&kGO$ 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 00000000000..d715678889a --- /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 00000000000..d3504a657e8 --- /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 00000000000..780b13dc96b --- /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 00000000000..5c51e764217 --- /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 00000000000..bb33d3cfda4 --- /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 00000000000..e051eadacd4 --- /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 00000000000..003922a0ef4 --- /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 00000000000..ff89fb6ae9d --- /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 00000000000..202258c5c6c --- /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 00000000000..511ef262424 --- /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 00000000000..85f4990724d --- /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 00000000000..45d0650aaea --- /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 00000000000..34dff55da53 --- /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 00000000000..5670308a29d --- /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 00000000000..1e91b651457 --- /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 00000000000..6700d8c8f24 --- /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 00000000000..657c0080c01 --- /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 00000000000..0420c1da2e7 --- /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 00000000000..51c6dec3cc9 --- /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 00000000000..869d757756a --- /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 00000000000..54a338d94ce --- /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 00000000000..e3373ffeed9 --- /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 00000000000..9591784866a --- /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); +}