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