From 564945a2a0b47fc7e0f198ef4b0797080550f1d1 Mon Sep 17 00:00:00 2001 From: robert-hh Date: Tue, 6 Dec 2022 08:00:56 +0100 Subject: [PATCH] nrf/boards/seeed_xiao_nrf52: Add defn for Seeed XIAO NRF52840 Sense. It keeps compatibility with the XIAO bootloader by: - using Soft Device 7.3.0 - reserving 48k memory for the bootloader. So on double reset a drive pops for uploading an uf2 image or a nrfutil zip pkg file. Instructions to create it from a hex file are included. The bootloader can as well be activated with the touch 1200 option of nrfutil. The script download_ble_stack.sh has been adapted to get the version 7.3.0 soft device files. It may have to be executed once before building. The file system is set to 256k and the pin definitions are adapted. Besides that, it has the common functionality and omissions. The on-board sensors and additional flash can be supported by Python scripts. --- ports/nrf/boards/s140_7.3.0.ld | 4 + .../seeed_xiao_nrf52/XIAO_bootloader.ld | 4 + ports/nrf/boards/seeed_xiao_nrf52/board.c | 68 +++++++++++++++ ports/nrf/boards/seeed_xiao_nrf52/board.json | 24 ++++++ ports/nrf/boards/seeed_xiao_nrf52/deploy.md | 31 +++++++ .../boards/seeed_xiao_nrf52/mpconfigboard.h | 82 +++++++++++++++++++ .../boards/seeed_xiao_nrf52/mpconfigboard.mk | 16 ++++ ports/nrf/boards/seeed_xiao_nrf52/pins.csv | 48 +++++++++++ .../drivers/bluetooth/download_ble_stack.sh | 22 +++++ 9 files changed, 299 insertions(+) create mode 100644 ports/nrf/boards/s140_7.3.0.ld create mode 100644 ports/nrf/boards/seeed_xiao_nrf52/XIAO_bootloader.ld create mode 100644 ports/nrf/boards/seeed_xiao_nrf52/board.c create mode 100644 ports/nrf/boards/seeed_xiao_nrf52/board.json create mode 100644 ports/nrf/boards/seeed_xiao_nrf52/deploy.md create mode 100644 ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.h create mode 100644 ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.mk create mode 100644 ports/nrf/boards/seeed_xiao_nrf52/pins.csv diff --git a/ports/nrf/boards/s140_7.3.0.ld b/ports/nrf/boards/s140_7.3.0.ld new file mode 100644 index 0000000000..47b7665c95 --- /dev/null +++ b/ports/nrf/boards/s140_7.3.0.ld @@ -0,0 +1,4 @@ +/* GNU linker script for s140 SoftDevice version 7.3.0 */ + +_sd_size = 0x00027000; +_sd_ram = 0x0000e000; diff --git a/ports/nrf/boards/seeed_xiao_nrf52/XIAO_bootloader.ld b/ports/nrf/boards/seeed_xiao_nrf52/XIAO_bootloader.ld new file mode 100644 index 0000000000..0ff02f2182 --- /dev/null +++ b/ports/nrf/boards/seeed_xiao_nrf52/XIAO_bootloader.ld @@ -0,0 +1,4 @@ +/* GNU linker script for Adafruit nrf52840 Bootloader */ + +_bootloader_head_size = 0x1000; /* MBR */ +_bootloader_tail_size = 0xC000; /* Bootloader start address 0x000F4000 */ diff --git a/ports/nrf/boards/seeed_xiao_nrf52/board.c b/ports/nrf/boards/seeed_xiao_nrf52/board.c new file mode 100644 index 0000000000..25c9e17215 --- /dev/null +++ b/ports/nrf/boards/seeed_xiao_nrf52/board.c @@ -0,0 +1,68 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Arduino SA + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "nrf.h" +#include "nrf_gpio.h" +#include "nrf_rtc.h" + +#define PIN_ENABLE_SENSORS_3V3 (40) +#define DFU_MAGIC_SERIAL_ONLY_RESET 0x4e +#define DFU_MAGIC_UF2_RESET 0x57 +#define DFU_MAGIC_OTA_RESET 0xA8 + +void XIAO_board_early_init(void) { + // Errata XIAOBLE - I2C pullup is on SWO line, need to disable TRACE + // was being enabled by nrfx_clock_anomaly_132 + CoreDebug->DEMCR = 0; + NRF_CLOCK->TRACECONFIG = 0; + + // Bootloader enables interrupt on COMPARE[0], which we don't handle + // Disable it here to avoid getting stuck when OVERFLOW irq is triggered + nrf_rtc_event_disable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK); + nrf_rtc_int_disable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK); + + // Always enable IMU power and I2C Pull-up on startup + nrf_gpio_cfg(PIN_ENABLE_SENSORS_3V3, + NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT, + NRF_GPIO_PIN_NOPULL, + GPIO_PIN_CNF_DRIVE_S0H1, + NRF_GPIO_PIN_NOSENSE); + + nrf_gpio_pin_set(PIN_ENABLE_SENSORS_3V3); +} + +void XIAO_board_deinit(void) { + nrf_gpio_cfg_output(PIN_ENABLE_SENSORS_3V3); + + nrf_gpio_pin_clear(PIN_ENABLE_SENSORS_3V3); +} + +void XIAO_board_enter_bootloader(void) { + __disable_irq(); + NRF_POWER->GPREGRET = DFU_MAGIC_UF2_RESET; + NVIC_SystemReset(); +} diff --git a/ports/nrf/boards/seeed_xiao_nrf52/board.json b/ports/nrf/boards/seeed_xiao_nrf52/board.json new file mode 100644 index 0000000000..619a7c23b9 --- /dev/null +++ b/ports/nrf/boards/seeed_xiao_nrf52/board.json @@ -0,0 +1,24 @@ +{ + "deploy": [ + "deploy.md" + ], + "docs": "", + "features": [ + "Bluetooth 5.0", + "IMU LSM6DS3TR", + "Microphone MSM261D3526H1CPM", + "USB-C", + "Breadboard Friendly", + "Battery Management", + "RGB LED", + "QSPI Flash" + ], + "images": [ + "XIAO_nrf52840_front.jpg" + ], + "mcu": "nrf52", + "product": "SEEED XIAO nRF52840 Sense", + "thumbnail": "", + "url": "https://www.seeedstudio.com", + "vendor": "Seeed Studio" +} diff --git a/ports/nrf/boards/seeed_xiao_nrf52/deploy.md b/ports/nrf/boards/seeed_xiao_nrf52/deploy.md new file mode 100644 index 0000000000..a66731c309 --- /dev/null +++ b/ports/nrf/boards/seeed_xiao_nrf52/deploy.md @@ -0,0 +1,31 @@ +The steps below let you create and install the firmware file. For +a .uf2 type file taken from the MicroPython downloads source only +step 4 is needed. For the .hex version of the firmware file, steps +1, 3 and 4 are required. + +1. Download and install u2fconv.py. It is available e.g. in the tools + directory of MicroPython. + +2. Create a firmware for the SEEED nrf52840 if needed, with the command + + `make BOARD=SEEED_XIAO_NRF52 -j5` + + in the directory build-SEEED_XIAO_NRF52-s140. The firmware file will have the + name firmware.uf2. + +3. Create the .uf2 file if needed in the build directory with the command: + + `uf2conv.py -c -f 0xADA52840 -o firmware.uf2 firmware.hex` + + It must report the start address as 0x27000. If you omit the -o option, + the output file will have the name flash.uf2. + +4. Enable the upload mode by pushing reset twice or calling + machine.bootloader() and copy the file firmware.uf2 to the board drive, + which will pop up on your PC. + +In case the XIAO bootloader is lost or overwritten, it can be found +at https://github.com/Seeed-Studio/Adafruit_nRF52_Arduino.git in different +formats. Using a JLINK adapter or interface, it can be uploaded as hex version. +The bootloader is as well available through the Arduino IDE. + diff --git a/ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.h b/ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.h new file mode 100644 index 0000000000..1a2d14f1d4 --- /dev/null +++ b/ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.h @@ -0,0 +1,82 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Glenn Ruben Bakke + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#define MICROPY_HW_BOARD_NAME "XIAO nRF52840 Sense" +#define MICROPY_HW_MCU_NAME "NRF52840" +#define MICROPY_PY_SYS_PLATFORM "nrf52" + +#define MICROPY_BOARD_EARLY_INIT XIAO_board_early_init +#define MICROPY_BOARD_DEINIT XIAO_board_deinit +#define MICROPY_BOARD_ENTER_BOOTLOADER(nargs, args) XIAO_board_enter_bootloader() + +#define MICROPY_HW_USB_CDC (1) +#define MICROPY_PY_MACHINE_UART (1) +#define MICROPY_PY_MACHINE_HW_PWM (1) +#define MICROPY_PY_MACHINE_HW_SPI (1) +#define MICROPY_PY_MACHINE_RTCOUNTER (1) +#define MICROPY_PY_MACHINE_I2C (1) +#define MICROPY_PY_MACHINE_ADC (1) +#define MICROPY_PY_MACHINE_TEMP (1) +#define MICROPY_HW_HAS_FLASH (1) + +#define MICROPY_HW_ENABLE_RNG (1) + +#define MICROPY_HW_HAS_LED (1) +#define MICROPY_HW_LED_COUNT (4) +#define MICROPY_HW_LED_PULLUP (1) + +#define MICROPY_HW_LED1 (17) // LED1 +#define MICROPY_HW_LED2 (26) // LED2 +#define MICROPY_HW_LED3 (30) // LED3 +#define MICROPY_HW_LED4 (6) // LED4 + +// UART config +#define MICROPY_HW_UART1_TX (32 + 11) +#define MICROPY_HW_UART1_RX (32 + 12) + +// SPI0 config +#define MICROPY_HW_SPI0_NAME "SPI0" + +#define MICROPY_HW_SPI0_SCK (32 + 13) +#define MICROPY_HW_SPI0_MISO (32 + 14) +#define MICROPY_HW_SPI0_MOSI (32 + 15) + +#define MICROPY_HW_PWM0_NAME "PWM0" +#define MICROPY_HW_PWM1_NAME "PWM1" +#define MICROPY_HW_PWM2_NAME "PWM2" + +#define HELP_TEXT_BOARD_LED "1,2,3,4" + +// Enabling these VID/PID values require to include mpconfigboard.h into usb_descriptors.c. +// But there is an open discussion on whether specific VID/PID values are wanted. +// 1200BPS touch is not supported at the moment in the USB driver, but at least the flag is set. +#define MICROPY_HW_USB_VID (0x2886) +#define MICROPY_HW_USB_PID (0x0045) +#define MICROPY_HW_USB_CDC_1200BPS_TOUCH (1) + +void XIAO_board_early_init(void); +void XIAO_board_deinit(void); +void XIAO_board_enter_bootloader(void); diff --git a/ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.mk b/ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.mk new file mode 100644 index 0000000000..c2fc219187 --- /dev/null +++ b/ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.mk @@ -0,0 +1,16 @@ +MCU_SERIES = m4 +MCU_VARIANT = nrf52 +MCU_SUB_VARIANT = nrf52840 +SOFTDEV_VERSION = 7.3.0 +SD=s140 +LD_FILES += boards/seeed_xiao_nrf52/XIAO_bootloader.ld boards/nrf52840_1M_256k.ld + +NRF_DEFINES += -DNRF52840_XXAA + +MICROPY_VFS_LFS2 = 1 +FS_SIZE = 256k + +# DEBUG ?= 1 + +uf2: hex + python3 $(TOP)/tools/uf2conv.py -c -o $(BUILD)/firmware.uf2 -f 0xADA52840 $(BUILD)/firmware.hex diff --git a/ports/nrf/boards/seeed_xiao_nrf52/pins.csv b/ports/nrf/boards/seeed_xiao_nrf52/pins.csv new file mode 100644 index 0000000000..6cb050c578 --- /dev/null +++ b/ports/nrf/boards/seeed_xiao_nrf52/pins.csv @@ -0,0 +1,48 @@ +P0,P0 +P1,P1 +D0_A0,P2 +D1_A1,P3 +D4_A4,P4 +D5_A5,P5 +P6,P6 +IMU_SDA,P7 +P8,P8 +NFC1,P9 +NFC2,P10 +IMU_INT1,P11 +P12,P12 +P13,P13 +READ_BAT,P14 +P15,P15 +PDM_DATA,P16 +P17,P17 +P18,P18 +P19,P19 +QSPI_D0,P20 +QSPI_SCK,P21 +QSPI_D2,P22 +QSPI_D3,P23 +QSPI_D1,P24 +QSPI_CS,P25 +P26,P26 +IMU_SCL,P27 +D2_A2,P28 +D3_A3,P29 +P30,P30 +ADC0_BAT,P31 +PDM_CLK,P32 +P33,P33 +P34,P34 +P35,P35 +P36,P36 +P37,P37 +P38,P38 +P39,P39 +IMU_PWR,P40 +P41,P41 +P42,P42 +UART1_TX,P43 +UART1_RX,P44 +SPI0_SCK,P45 +SPI0_MISO,P46 +SPI0_MOSI,P47 diff --git a/ports/nrf/drivers/bluetooth/download_ble_stack.sh b/ports/nrf/drivers/bluetooth/download_ble_stack.sh index 2c32018583..6498278f49 100755 --- a/ports/nrf/drivers/bluetooth/download_ble_stack.sh +++ b/ports/nrf/drivers/bluetooth/download_ble_stack.sh @@ -57,6 +57,25 @@ function download_s140_nrf52_6_1_1 cd - } +function download_s140_nrf52_7_3_0 +{ + echo "" + echo "####################################" + echo "### Downloading s140_nrf52_7.3.0 ###" + echo "####################################" + echo "" + + mkdir -p $1/s140_nrf52_7.3.0 + cd $1/s140_nrf52_7.3.0 + wget --post-data="fileName=DeviceDownload&ids=59452FDD13BA46EEAD0810A57359F294" https://www.nordicsemi.com/api/sitecore/Products/MedialibraryZipDownload2 + mv MedialibraryZipDownload2 temp.zip + unzip -u temp.zip + unzip -u s140_nrf52_7.3.0.zip + rm s140_nrf52_7.3.0.zip + rm temp.zip + cd - +} + SCRIPT_DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ $# -eq 0 ]; then @@ -64,6 +83,7 @@ if [ $# -eq 0 ]; then download_s110_nrf51_8_0_0 ${SCRIPT_DIR} download_s132_nrf52_6_1_1 ${SCRIPT_DIR} download_s140_nrf52_6_1_1 ${SCRIPT_DIR} + download_s140_nrf52_7_3_0 ${SCRIPT_DIR} else case $1 in "s110_nrf51" ) @@ -72,6 +92,8 @@ else download_s132_nrf52_6_1_1 ${SCRIPT_DIR} ;; "s140_nrf52_6_1_1" ) download_s140_nrf52_6_1_1 ${SCRIPT_DIR} ;; + "s140_nrf52_7_3_0" ) + download_s140_nrf52_7_3_0 ${SCRIPT_DIR} ;; esac fi