summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/nrf/boards/s140_7.3.0.ld4
-rw-r--r--ports/nrf/boards/seeed_xiao_nrf52/XIAO_bootloader.ld4
-rw-r--r--ports/nrf/boards/seeed_xiao_nrf52/board.c68
-rw-r--r--ports/nrf/boards/seeed_xiao_nrf52/board.json24
-rw-r--r--ports/nrf/boards/seeed_xiao_nrf52/deploy.md31
-rw-r--r--ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.h82
-rw-r--r--ports/nrf/boards/seeed_xiao_nrf52/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/seeed_xiao_nrf52/pins.csv48
-rwxr-xr-xports/nrf/drivers/bluetooth/download_ble_stack.sh22
9 files changed, 299 insertions, 0 deletions
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 000000000..47b7665c9
--- /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 000000000..0ff02f218
--- /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 000000000..25c9e1721
--- /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 000000000..619a7c23b
--- /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 000000000..a66731c30
--- /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 000000000..1a2d14f1d
--- /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 000000000..c2fc21918
--- /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 000000000..6cb050c57
--- /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 2c3201858..6498278f4 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