Skip to content

Commit

Permalink
nrf/boards/seeed_xiao_nrf52: Add defn for Seeed XIAO NRF52840 Sense.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
robert-hh authored and dpgeorge committed Dec 15, 2022
1 parent 6d460d3 commit 564945a
Show file tree
Hide file tree
Showing 9 changed files with 299 additions and 0 deletions.
4 changes: 4 additions & 0 deletions 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;
4 changes: 4 additions & 0 deletions 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 */
68 changes: 68 additions & 0 deletions 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();
}
24 changes: 24 additions & 0 deletions 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"
}
31 changes: 31 additions & 0 deletions 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.

82 changes: 82 additions & 0 deletions 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);
16 changes: 16 additions & 0 deletions 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
48 changes: 48 additions & 0 deletions 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
22 changes: 22 additions & 0 deletions ports/nrf/drivers/bluetooth/download_ble_stack.sh
Expand Up @@ -57,13 +57,33 @@ 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
echo "No Bluetooth LE stack defined, downloading all."
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" )
Expand All @@ -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

Expand Down

0 comments on commit 564945a

Please sign in to comment.