Compare commits
82 Commits
Author | SHA1 | Date |
---|---|---|
ml server | dd7f0d2772 | |
ml server | d6c45a3ded | |
ml server | b5b5dde8a3 | |
ml server | 0b385d7efa | |
ml server | e4b64b0814 | |
Daniel Thompson | 1d128f1311 | |
Daniel Thompson | 477d2e07db | |
Daniel Thompson | 91fad65a8a | |
Daniel Thompson | efa4942659 | |
Daniel Thompson | 89ba9a874f | |
Daniel Thompson | 85a9b76d84 | |
SteveAmor | 9148e76c41 | |
Daniel Thompson | 71f37dd5b2 | |
Daniel Thompson | 21bcf675a4 | |
Daniel Thompson | d8d7d76b17 | |
Daniel Thompson | 7786926950 | |
Daniel Thompson | 6e5c33824e | |
Daniel Thompson | b89f9d43b9 | |
Daniel Thompson | 1e7d8c327d | |
Daniel Thompson | 0125b3e49b | |
Daniel Thompson | 660aa3247c | |
Daniel Thompson | a56548132e | |
Daniel Thompson | 9734651778 | |
Daniel Thompson | 0d74a6efca | |
Daniel Thompson | 20f5764f64 | |
Daniel Thompson | fb03ef1dda | |
Daniel Thompson | cfe6b69534 | |
Daniel Thompson | be3f01a002 | |
Daniel Thompson | 27207cba4d | |
fanoush | b6857b85f0 | |
Daniel Thompson | 4d0e439229 | |
Daniel Thompson | 9806b15d5c | |
Daniel Thompson | 04ee6a92a7 | |
Daniel Thompson | 561d8ff427 | |
Daniel Thompson | 3e490f882f | |
Daniel Thompson | bb7841bec8 | |
fanoush | 18e7f3eeb3 | |
Daniel Thompson | 1d2dfa955d | |
fanoush | 282fd12bba | |
Limor "Ladyada" Fried | 6c2867bc00 | |
Michael Welling | 9c6c0d3031 | |
Ha Thach | db63651473 | |
Benny Meisels | 32bfb2adae | |
hathach | 3114f92afb | |
Ha Thach | 467bd2bf1c | |
hathach | a83f5d8e11 | |
Ha Thach | 9ff2378a25 | |
Samveen | 5d04a6c26a | |
hathach | 2fe17d9996 | |
hathach | 54ca93d499 | |
hathach | 0e6936de76 | |
Ha Thach | 454b281201 | |
Ha Thach | 5b2b688d03 | |
Ha Thach | e25b63a43a | |
Ryan A. Pavlik | 6df0bfdc4c | |
Lady Ada | 3adfba32c8 | |
Ha Thach | a78d555f79 | |
hathach | 16e7af43a3 | |
hathach | 1597434ed7 | |
hathach | e3449cd771 | |
Ha Thach | c4cf262b95 | |
Zach Whitehead | cf6aca19b0 | |
hathach | d0389fe8f4 | |
hathach | 7cd90551c9 | |
hathach | 254ed6253e | |
hathach | 8a979d33bc | |
hathach | c6d02901b3 | |
hathach | 126115a2cb | |
hathach | 3d99a55940 | |
hathach | f8fdf47823 | |
ladyada | 85a1556864 | |
mdxs | 9c474844be | |
hathach | 5f5371b9b3 | |
hathach | 1d7ca6a1dc | |
hathach | 7691f08ff0 | |
hathach | 5b6488ca70 | |
hathach | 9556f2ace8 | |
hathach | ef4d0e7564 | |
hathach | fc00e2b202 | |
Kreg Hanning | 8906b2a8bd | |
hathach | c3fc0dba91 | |
hathach | b1029c6ae5 |
|
@ -0,0 +1,44 @@
|
|||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v1
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v1.1.0
|
||||
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: Install Toolchains
|
||||
run: |
|
||||
pip3 install adafruit-nrfutil uritemplate requests
|
||||
wget https://www.nordicsemi.com/api/sitecore/Products/DownloadPlatform --post-data=fileid=8F19D314130548209E75EFFADD9348DB -O cli-tools.tar
|
||||
tar -xv -f cli-tools.tar
|
||||
echo "::add-path::$GITHUB_WORKSPACE/mergehex"
|
||||
npm install --global xpm
|
||||
xpm install --global @xpack-dev-tools/arm-none-eabi-gcc@latest
|
||||
echo "::add-path::`echo $HOME/opt/xPacks/@xpack-dev-tools/arm-none-eabi-gcc/*/.content/bin`"
|
||||
|
||||
- name: Build
|
||||
run: python3 tools/build_all.py
|
||||
|
||||
- name: Upload Release Asset
|
||||
if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')
|
||||
working-directory: tools
|
||||
env:
|
||||
UPLOAD_URL: ${{ github.event.release.upload_url }}
|
||||
ADABOT_GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: "[ -z \"$ADABOT_GITHUB_ACCESS_TOKEN\" ] || python3 -u upload_release_files.py"
|
||||
|
|
@ -56,3 +56,4 @@ _build-*/
|
|||
bin/
|
||||
*.emSession
|
||||
*.jlink
|
||||
.*.swp
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[submodule "tinyusb"]
|
||||
[submodule "lib/tinyusb"]
|
||||
path = lib/tinyusb
|
||||
url = https://github.com/hathach/tinyusb.git
|
||||
url = https://mirrors.spacecruft.org/hathach/tinyusb
|
||||
[submodule "lib/nrfx"]
|
||||
path = lib/nrfx
|
||||
url = https://github.com/NordicSemiconductor/nrfx.git
|
||||
url = https://mirrors.spacecruft.org/NordicSemiconductor/nrfx
|
||||
|
|
73
Makefile
73
Makefile
|
@ -21,7 +21,7 @@ SD_FILENAME = $(SD_NAME)_nrf52_$(SD_VERSION)
|
|||
SD_API_PATH = $(SD_PATH)/$(SD_FILENAME)_API
|
||||
SD_HEX = $(SD_PATH)/$(SD_FILENAME)_softdevice.hex
|
||||
|
||||
LD_FILE = $(SRC_PATH)/linker/$(SD_NAME)_v$(word 1, $(subst ., ,$(SD_VERSION))).ld
|
||||
LD_FILE = $(SRC_PATH)/linker/$(MCU_SUB_VARIANT)_$(SD_NAME)_v$(word 1, $(subst ., ,$(SD_VERSION))).ld
|
||||
|
||||
MERGED_FNAME = $(OUTPUT_FILENAME)_$(SD_NAME)_$(SD_VERSION)
|
||||
|
||||
|
@ -76,23 +76,33 @@ remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-ou
|
|||
#*********************************
|
||||
BOARD_LIST = $(sort $(subst .h,,$(subst src/boards/,,$(wildcard src/boards/*))))
|
||||
|
||||
NRF52832_BOARDLIST = feather_nrf52832
|
||||
IS_52832 = $(filter $(BOARD),$(NRF52832_BOARDLIST))
|
||||
|
||||
ifeq ($(filter $(BOARD),$(BOARD_LIST)),)
|
||||
$(info You must provide a BOARD parameter with 'BOARD='. Supported boards are:)
|
||||
$(info $(BOARD_LIST))
|
||||
$(error Invalid BOARD specified)
|
||||
endif
|
||||
|
||||
# Build directory
|
||||
BUILD = _build-$(BOARD)
|
||||
|
||||
ifneq ($(IS_52832),)
|
||||
SD_NAME = s132
|
||||
DFU_DEV_REV = 0xADAF
|
||||
# Board specific
|
||||
-include src/boards/$(BOARD)/board.mk
|
||||
|
||||
# MCU_SUB_VARIANT can be nrf52 (nrf52832), nrf52833, nrf52840
|
||||
ifeq ($(MCU_SUB_VARIANT),nrf52)
|
||||
SD_NAME = s132
|
||||
DFU_DEV_REV = 0xADAF
|
||||
MCU_FLAGS = -DNRF52 -DNRF52832_XXAA -DS132
|
||||
else ifeq ($(MCU_SUB_VARIANT),nrf52833)
|
||||
SD_NAME = s140
|
||||
DFU_DEV_REV = 52840
|
||||
MCU_FLAGS = -DNRF52833_XXAA -DS140
|
||||
else ifeq ($(MCU_SUB_VARIANT),nrf52840)
|
||||
SD_NAME = s140
|
||||
DFU_DEV_REV = 52840
|
||||
MCU_FLAGS = -DNRF52840_XXAA -DS140
|
||||
else
|
||||
SD_NAME = s140
|
||||
DFU_DEV_REV = 52840
|
||||
$(error Sub Variant $(MCU_SUB_VARIANT) is unknown)
|
||||
endif
|
||||
|
||||
#******************************************************************************
|
||||
|
@ -108,7 +118,8 @@ C_SOURCE_FILES += $(SRC_PATH)/dfu_init.c
|
|||
|
||||
# nrfx
|
||||
C_SOURCE_FILES += $(NRFX_PATH)/drivers/src/nrfx_power.c
|
||||
C_SOURCE_FILES += $(NRFX_PATH)/hal/nrf_nvmc.c
|
||||
C_SOURCE_FILES += $(NRFX_PATH)/drivers/src/nrfx_nvmc.c
|
||||
C_SOURCE_FILES += $(NRFX_PATH)/mdk/system_$(MCU_SUB_VARIANT).c
|
||||
|
||||
# SDK 11 files
|
||||
C_SOURCE_FILES += $(SDK11_PATH)/libraries/bootloader_dfu/bootloader.c
|
||||
|
@ -134,10 +145,8 @@ C_SOURCE_FILES += $(SDK_PATH)/libraries/hci/hci_slip.c
|
|||
C_SOURCE_FILES += $(SDK_PATH)/libraries/hci/hci_transport.c
|
||||
C_SOURCE_FILES += $(SDK_PATH)/libraries/util/nrf_assert.c
|
||||
|
||||
ifneq ($(IS_52832),)
|
||||
|
||||
C_SOURCE_FILES += $(NRFX_PATH)/mdk/system_nrf52.c
|
||||
|
||||
# UART or USB Serial
|
||||
ifeq ($(MCU_SUB_VARIANT),nrf52)
|
||||
C_SOURCE_FILES += $(SDK_PATH)/libraries/uart/app_uart.c
|
||||
C_SOURCE_FILES += $(SDK_PATH)/drivers_nrf/uart/nrf_drv_uart.c
|
||||
C_SOURCE_FILES += $(SDK_PATH)/drivers_nrf/common/nrf_drv_common.c
|
||||
|
@ -147,25 +156,19 @@ IPATH += $(SDK_PATH)/drivers_nrf/common
|
|||
IPATH += $(SDK_PATH)/drivers_nrf/uart
|
||||
|
||||
else
|
||||
|
||||
# src
|
||||
C_SOURCE_FILES += $(SRC_PATH)/usb/usb_desc.c
|
||||
C_SOURCE_FILES += $(SRC_PATH)/usb/usb.c
|
||||
C_SOURCE_FILES += $(SRC_PATH)/usb/msc_uf2.c
|
||||
C_SOURCE_FILES += $(SRC_PATH)/usb/uf2/ghostfat.c
|
||||
|
||||
# nrfx
|
||||
C_SOURCE_FILES += $(NRFX_PATH)/mdk/system_nrf52840.c
|
||||
|
||||
# Tinyusb stack
|
||||
# TinyUSB stack
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/portable/nordic/nrf5x/dcd_nrf5x.c
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/portable/nordic/nrf5x/hal_nrf5x.c
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/common/tusb_fifo.c
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/device/usbd.c
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/device/usbd_control.c
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/class/cdc/cdc_device.c
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/class/msc/msc_device.c
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/class/custom/custom_device.c
|
||||
C_SOURCE_FILES += $(TUSB_PATH)/tusb.c
|
||||
|
||||
endif
|
||||
|
@ -174,11 +177,7 @@ endif
|
|||
#******************************************************************************
|
||||
# Assembly Files
|
||||
#******************************************************************************
|
||||
ifneq ($(IS_52832),)
|
||||
ASM_SOURCE_FILES = $(NRFX_PATH)/mdk/gcc_startup_nrf52.S
|
||||
else
|
||||
ASM_SOURCE_FILES = $(NRFX_PATH)/mdk/gcc_startup_nrf52840.S
|
||||
endif
|
||||
ASM_SOURCE_FILES = $(NRFX_PATH)/mdk/gcc_startup_$(MCU_SUB_VARIANT).S
|
||||
|
||||
#******************************************************************************
|
||||
# INCLUDE PATH
|
||||
|
@ -198,6 +197,7 @@ IPATH += $(NRFX_PATH)
|
|||
IPATH += $(NRFX_PATH)/mdk
|
||||
IPATH += $(NRFX_PATH)/hal
|
||||
IPATH += $(NRFX_PATH)/drivers/include
|
||||
IPATH += $(NRFX_PATH)/drivers/src
|
||||
|
||||
IPATH += $(SDK11_PATH)/libraries/bootloader_dfu/hci_transport
|
||||
IPATH += $(SDK11_PATH)/libraries/bootloader_dfu
|
||||
|
@ -244,7 +244,8 @@ CFLAGS += -DBLE_STACK_SUPPORT_REQD
|
|||
CFLAGS += -DSWI_DISABLE0
|
||||
CFLAGS += -DSOFTDEVICE_PRESENT
|
||||
CFLAGS += -DFLOAT_ABI_HARD
|
||||
CFLAGS += -DDFU_APP_DATA_RESERVED=7*4096
|
||||
CFLAGS += -DDFU_APP_DATA_RESERVED=0
|
||||
CFLAGS += $(MCU_FLAGS)
|
||||
|
||||
CFLAGS += -DUF2_VERSION='"$(GIT_VERSION) $(GIT_SUBMODULE_VERSIONS) $(SD_NAME) $(SD_VERSION)"'
|
||||
CFLAGS += -DBLEDIS_FW_VERSION='"$(GIT_VERSION) $(SD_NAME) $(SD_VERSION)"'
|
||||
|
@ -252,15 +253,6 @@ CFLAGS += -DBLEDIS_FW_VERSION='"$(GIT_VERSION) $(SD_NAME) $(SD_VERSION)"'
|
|||
_VER = $(subst ., ,$(word 1, $(subst -, ,$(GIT_VERSION))))
|
||||
CFLAGS += -DMK_BOOTLOADER_VERSION='($(word 1,$(_VER)) << 16) + ($(word 2,$(_VER)) << 8) + $(word 3,$(_VER))'
|
||||
|
||||
ifneq ($(IS_52832),)
|
||||
CFLAGS += -DNRF52
|
||||
CFLAGS += -DNRF52832_XXAA
|
||||
CFLAGS += -DS132
|
||||
else
|
||||
CFLAGS += -DNRF52840_XXAA
|
||||
CFLAGS += -DS140
|
||||
endif
|
||||
|
||||
|
||||
#******************************************************************************
|
||||
# Linker Flags
|
||||
|
@ -289,14 +281,7 @@ ASMFLAGS += -DBLE_STACK_SUPPORT_REQD
|
|||
ASMFLAGS += -DSWI_DISABLE0
|
||||
ASMFLAGS += -DSOFTDEVICE_PRESENT
|
||||
ASMFLAGS += -DFLOAT_ABI_HARD
|
||||
|
||||
ifneq ($(IS_52832),)
|
||||
ASMFLAGS += -DNRF52
|
||||
ASMFLAGS += -DS132
|
||||
else
|
||||
ASMFLAGS += -DNRF52840_XXAA
|
||||
ASMFLAGS += -DS140
|
||||
endif
|
||||
ASMFLAGS += $(MCU_FLAGS)
|
||||
|
||||
C_SOURCE_FILE_NAMES = $(notdir $(C_SOURCE_FILES))
|
||||
C_PATHS = $(call remduplicates, $(dir $(C_SOURCE_FILES) ) )
|
||||
|
|
|
@ -0,0 +1,218 @@
|
|||
# WASP bootloader
|
||||
|
||||
The WASP bootloader is a fork of the Adafruit nRF52 Bootloader modified to robustly
|
||||
support form factor devices without a reset button and, in some cases, also no serial
|
||||
port. If supports OTA application updates and to support development using form-factor
|
||||
devices the WASP bootloader co-operates with the application payload to implement a,
|
||||
watchdog enforced, a long press reset using regular (not-reset) buttons.
|
||||
|
||||
The additional boards supported by the WASP bootloader are:
|
||||
|
||||
* [Pine64 PineTime](https://www.pine64.org/pinetime/)
|
||||
* [Desay DS-D6](https://github.com/fanoush/ds-d6)
|
||||
* [96Boards Nitrogen](https://www.96boards.org/product/nitrogen/)
|
||||
|
||||
Note: *The Nitrogen is not a form-factor board. It is a test target used to test for regressions before spending time pushing the bootloader to the form-factor devices.*
|
||||
|
||||
# Adafruit nRF52 Bootloader
|
||||
|
||||
[![Build Status](https://github.com/adafruit/Adafruit_nRF52_Bootloader/workflows/Build/badge.svg)](https://github.com/adafruit/Adafruit_nRF52_Bootloader/actions)
|
||||
|
||||
This is a CDC/DFU/UF2 bootloader for nRF52 boards.
|
||||
|
||||
- [Adafruit Feather nRF52832](https://www.adafruit.com/product/3406)
|
||||
- [Adafruit Feather nRF52840 Express](https://www.adafruit.com/product/4062)
|
||||
- [Adafruit Circuit Playground Bluefruit](https://www.adafruit.com/product/4333)
|
||||
- Adafruit Metro nRF52840 Express
|
||||
- [Electronut Labs Papyr](https://docs.electronut.in/papyr/)
|
||||
- MakerDiary MDK nRF52840 USB Dongle
|
||||
- [Nordic nRF52840DK PCA10056](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK)
|
||||
- [Nordic nRF52840DK PCA10059 ("Dongle")](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-Dongle)
|
||||
- Particle Argon
|
||||
- Particle Boron
|
||||
- Particle Xenon
|
||||
|
||||
UF2 is an easy-to-use bootloader that appears as a flash drive. You can just copy `.uf2`-format
|
||||
application images to the flash drive to load new firmware.
|
||||
See https://github.com/Microsoft/uf2 and https://github.com/adafruit/uf2-samdx1
|
||||
for more information.
|
||||
|
||||
[adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil),
|
||||
a modified version of [Nordic nrfutil](https://github.com/NordicSemiconductor/pc-nrfutil),
|
||||
is required to perform DFU.
|
||||
Install `python3` if it is not installed already and run this command to install adafruit-nrfutil from PyPi:
|
||||
|
||||
```
|
||||
$ pip3 install --user adafruit-nrfutil
|
||||
```
|
||||
|
||||
This repository depends on the following submodules:
|
||||
|
||||
- [tinyusb](https://github.com/hathach/tinyusb)
|
||||
- [nrfx](https://github.com/NordicSemiconductor/nrfx)
|
||||
|
||||
Note that `tinyusb` also includes `nrfx` as a submodule, so you need
|
||||
to initialize and update submodules with the `--recursive`` flag.
|
||||
|
||||
Clone this repo with following commands, or fork it for your own development
|
||||
|
||||
```
|
||||
git clone https://github.com/adafruit/Adafruit_nRF52_Bootloader
|
||||
cd Adafruit_nRF52_Bootloader
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
- DFU over Serial and OTA ( application, Bootloader+SD )
|
||||
- Self-upgradable via Serial and OTA
|
||||
- DFU using UF2 (https://github.com/Microsoft/uf2) (application only)
|
||||
- Auto-enter DFU briefly on startup for DTR auto-reset trick (832 only)
|
||||
|
||||
## How to use
|
||||
|
||||
There are two pins, `DFU` and `FRST` that bootloader will check upon reset/power:
|
||||
|
||||
- `Double Reset` Reset twice within 500 ms will enter DFU with UF2 and CDC support (only works with nRF52840)
|
||||
- `DFU = LOW` and `FRST = HIGH`: Enter bootloader with UF2 and CDC support
|
||||
- `DFU = LOW` and `FRST = LOW`: Enter bootloader with OTA, to upgrade with a mobile application such as Nordic nrfConnect/Toolbox
|
||||
- `DFU = HIGH` and `FRST = LOW`: Factory Reset mode: erase firmware application and its data
|
||||
- `DFU = HIGH` and `FRST = HIGH`: Go to application code if it is present, otherwise enter DFU with UF2
|
||||
- The `GPREGRET` register can also be set to force the bootloader can enter any of above modes (plus a CDC-only mode for Arduino).
|
||||
`GPREGRET` is set by the application before performing a soft reset.
|
||||
|
||||
On the Nordic PCA10056 DK board, `DFU` is connected to **Button1**, and `FRST` is connected to **Button2**.
|
||||
So holding down **Button1** while clicking **RESET** will put the board into USB bootloader mode, with UF2 and CDC support.
|
||||
Holding down **Button2** while clicking **RESET** will put the board into OTA (over-the-air) bootloader mode.
|
||||
|
||||
On the Nordic PCA10059 Dongle board, `DFU` is connected to the white button.
|
||||
`FRST` is connected to pin 1.10. Ground it to pull `FRST` low, as if you had pushed an `FRST` button.
|
||||
There is an adjacent ground pad.
|
||||
|
||||
For other boards, please check the board definition for details.
|
||||
|
||||
### Making your own UF2
|
||||
|
||||
To create your own UF2 DFU update image, simply use the [Python conversion script](https://github.com/Microsoft/uf2/blob/master/utils/uf2conv.py) on a .bin file or .hex file, specifying the family as **0xADA52840**. If using a .bin file with the conversion script you must specify application address with the -b switch, this address depend on the SoftDevice size/version e.g S140 v6 is 0x26000
|
||||
|
||||
To create a UF2 image from a .bin file:
|
||||
```
|
||||
uf2conv.py firmware.bin -c -b 0x26000 -f 0xADA52840
|
||||
```
|
||||
|
||||
To create a UF2 image from a .hex file:
|
||||
```
|
||||
uf2conv.py firmware.hex -c -f 0xADA52840
|
||||
```
|
||||
|
||||
## Burn & Upgrade with pre-built binaries
|
||||
|
||||
You can burn and/or upgrade the bootloader with either a J-link or DFU (serial) to a specific pre-built binary version
|
||||
without the hassle of installing a toolchain and compiling the code.
|
||||
This is preferred if you are not developing/customizing the bootloader.
|
||||
Pre-builtin binaries are available on GitHub [releases](https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases)
|
||||
|
||||
Note: The bootloader can be downgraded. Since the binary release is a merged version of
|
||||
both bootloader and the Nordic SoftDevice, you can freely upgrade/downgrade to any version you like.
|
||||
|
||||
## How to compile and build
|
||||
|
||||
You should only continue if you are looking to develop bootloader for your own.
|
||||
You must have have a J-Link available to "unbrick" your device.
|
||||
|
||||
### Option 1: Build with Makefile
|
||||
|
||||
Prerequisites
|
||||
|
||||
- ARM GCC
|
||||
- Nordic's [nRF5x Command Line Tools](https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Command-Line-Tools)
|
||||
|
||||
To build:
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express all combinehex
|
||||
```
|
||||
|
||||
To flash the bootloader with JLink:
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express flash
|
||||
```
|
||||
|
||||
To upgrade the bootloader using DFU Serial via port /dev/ttyACM0
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express SERIAL=/dev/ttyACM0 dfu-flash
|
||||
```
|
||||
|
||||
To flash SoftDevice (and chip erase):
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express sd
|
||||
```
|
||||
|
||||
To erase all of flash:
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express erase
|
||||
```
|
||||
|
||||
For the list of supported boards, run `make` without `BOARD=` :
|
||||
|
||||
```
|
||||
$ make
|
||||
You must provide a BOARD parameter with 'BOARD='
|
||||
Supported boards are: feather_nrf52840_express feather_nrf52840_express pca10056
|
||||
Makefile:90: *** BOARD not defined. Stop
|
||||
```
|
||||
|
||||
### Common makefile problems
|
||||
|
||||
#### 1. `arm-none-eabi-gcc`: No such file or directory
|
||||
|
||||
If you get the following error ...
|
||||
|
||||
```
|
||||
$ make BOARD=feather_nrf52840_express all
|
||||
Compiling file: main.c
|
||||
/bin/sh: /usr/bin/arm-none-eabi-gcc: No such file or directory
|
||||
make: *** [_build/main.o] Error 127
|
||||
```
|
||||
|
||||
... you may need to pass the location of the GCC ARM toolchain binaries to `make` using
|
||||
the variable `GNU_INSTALL_ROOT` as below:
|
||||
```
|
||||
$ make GNU_INSTALL_ROOT=/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/ BOARD=feather_nrf52832 all
|
||||
```
|
||||
|
||||
_Please note that the path needs a trailing path separator (a `/`)_
|
||||
|
||||
#### 2. `mergehex: No such file or directory`
|
||||
|
||||
Make sure that `mergehex` is available from the command-line. This binary is
|
||||
part of Nordic's nRF5x Command Line Tools.
|
||||
|
||||
#### 3. `make: nrfjprog: No such file or directory`
|
||||
|
||||
Make sure that `nrfjprog` is available from the command-line. This binary is
|
||||
part of Nordic's nRF5x Command Line Tools.
|
||||
|
||||
On POSIX-type systems you can temporarily add the path to `nrfjprog` via a
|
||||
variation on the following command:
|
||||
|
||||
```
|
||||
$ export PATH=$PATH:/location/of/nRF5x-Command-Line-Tools_9_7_2_OSX/nrfjprog
|
||||
```
|
||||
|
||||
### Option 2: Build using Segger Embedded Studio
|
||||
|
||||
For easier debugging you can also use [SES](https://www.segger.com/products/development-tools/embedded-studio/).
|
||||
The project file is located at `src/segger/Adafruit_nRF52_Bootloader.emProject`.
|
||||
|
||||
> **Note**: SES only flashes the bootloader when you click download, not the SoftDevice.
|
||||
You need to flash the SoftDevice beforehand if you haven't already done so.
|
||||
As mentioned above do something like:
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express sd
|
||||
```
|
197
README.md
197
README.md
|
@ -1,196 +1,3 @@
|
|||
# Adafruit nRF52 Bootloader
|
||||
# jebbatime-bootloader
|
||||
Lesser fork of Daniel Thompson's wasp-os bootloader.
|
||||
|
||||
[![Build Status](https://travis-ci.com/adafruit/Adafruit_nRF52_Bootloader.svg?branch=master)](https://travis-ci.com/adafruit/Adafruit_nRF52_Bootloader)
|
||||
|
||||
This is a CDC/DFU/UF2 bootloader for nRF52 boards.
|
||||
|
||||
- [Adafruit Feather nRF52832](https://www.adafruit.com/product/3406)
|
||||
- [Adafruit Feather nRF52840 Express](https://www.adafruit.com/product/4062)
|
||||
- [Adafruit Circuit Playground Bluefruit](https://www.adafruit.com/product/4333)
|
||||
- Adafruit Metro nRF52840 Express
|
||||
- [Electronut Labs Papyr](https://docs.electronut.in/papyr/)
|
||||
- MakerDiary MDK nRF52840 USB Dongle
|
||||
- [Nordic nRF52840DK PCA10056](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK)
|
||||
- [Nordic nRF52840DK PCA10059 ("Dongle")](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-Dongle)
|
||||
- Particle Argon
|
||||
- Particle Boron
|
||||
- Particle Xenon
|
||||
|
||||
UF2 is an easy-to-use bootloader that appears as a flash drive. You can just copy `.uf2`-format
|
||||
application images to the flash drive to load new firmware.
|
||||
See https://github.com/Microsoft/uf2 and https://github.com/adafruit/uf2-samdx1
|
||||
for more information.
|
||||
|
||||
[adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil),
|
||||
a modified version of [Nordic nrfutil](https://github.com/NordicSemiconductor/pc-nrfutil),
|
||||
is required to perform DFU.
|
||||
Install `python3` if it is not installed already and run this command to install adafruit-nrfutil from PyPi:
|
||||
|
||||
```
|
||||
$ pip3 install --user adafruit-nrfutil
|
||||
```
|
||||
|
||||
This repository depends on the following submodules:
|
||||
|
||||
- [tinyusb](https://github.com/hathach/tinyusb)
|
||||
- [nrfx](https://github.com/NordicSemiconductor/nrfx)
|
||||
|
||||
Note that `tinyusb` also includes `nrfx` as a submodule, so you need
|
||||
to initialize and update submodules with the `--recursive`` flag.
|
||||
|
||||
Clone this repo with following commands, or fork it for your own development
|
||||
|
||||
```
|
||||
git clone https://github.com/adafruit/Adafruit_nRF52_Bootloader
|
||||
cd Adafruit_nRF52_Bootloader
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
- DFU over Serial and OTA ( application, Bootloader+SD )
|
||||
- Self-upgradable via Serial and OTA
|
||||
- DFU using UF2 (https://github.com/Microsoft/uf2) (application only)
|
||||
- Auto-enter DFU briefly on startup for DTR auto-reset trick (832 only)
|
||||
|
||||
## How to use
|
||||
|
||||
There are two pins, `DFU` and `FRST` that bootloader will check upon reset/power:
|
||||
|
||||
- `Double Reset` Reset twice within 500 ms will enter DFU with UF2 and CDC support (only works with nRF52840)
|
||||
- `DFU = LOW` and `FRST = HIGH`: Enter bootloader with UF2 and CDC support
|
||||
- `DFU = LOW` and `FRST = LOW`: Enter bootloader with OTA, to upgrade with a mobile application such as Nordic nrfConnect/Toolbox
|
||||
- `DFU = HIGH and `FRST = LOW`: Factory Reset mode: erase firmware application and its data
|
||||
- `DFU = HIGH and `FRST = HIGH`: Go to application code if it is present, otherwise enter DFU with UF2
|
||||
- The `GPREGRET` register can also be set to force the bootloader can enter any of above modes (plus a CDC-only mode for Arduino).
|
||||
`GPREGRET` is set by the application before performing a soft reset.
|
||||
|
||||
On the Nordic PCA10056 DK board, `DFU` is connected to **Button1**, and `FRST` is connected to **Button2**.
|
||||
So holding down **Button1** while clicking **RESET** will put the board into USB bootloader mode, with UF2 and CDC support.
|
||||
Holding down **Button2** while clicking **RESET** will put the board into OTA (over-the-air) bootloader mode.
|
||||
|
||||
On the Nordic PCA10059 Dongle board, `DFU` is connected to the white button.
|
||||
`FRST` is connected to pin 1.10. Ground it to pull `FRST` low, as if you had pushed an `FRST` button.
|
||||
There is an adjacent ground pad.
|
||||
|
||||
For other boards, please check the board definition for details.
|
||||
|
||||
### Making your own UF2
|
||||
|
||||
To create your own UF2 DFU update image, simply use the [Python conversion script](https://github.com/Microsoft/uf2/blob/master/utils/uf2conv.py) on a .bin file or .hex file, specifying the family as **0xADA52840**. If using a .bin file with the conversion script you must specify application address with the -b switch, this address depend on the SoftDevice size/version e.g S140 v6 is 0x26000
|
||||
|
||||
To create a UF2 image from a .bin file:
|
||||
```
|
||||
uf2conv.py firmware.bin -c -b 0x26000 -f 0xADA52840
|
||||
```
|
||||
|
||||
To create a UF2 image from a .hex file:
|
||||
```
|
||||
uf2conv.py firmware.hex -c -f 0xADA52840
|
||||
```
|
||||
|
||||
## Burn & Upgrade with pre-built binaries
|
||||
|
||||
You can burn and/or upgrade the bootloader with either a J-link or DFU (serial) to a specific pre-built binary version
|
||||
without the hassle of installing a toolchain and compiling the code.
|
||||
This is preferred if you are not developing/customizing the bootloader.
|
||||
Pre-builtin binaries are available on GitHub [releases](https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases)
|
||||
|
||||
Note: The bootloader can be downgraded. Since the binary release is a merged version of
|
||||
of both bootloader and the Nordic SoftDevice, you can freely upgrade/downgrade to any version you like.
|
||||
|
||||
## How to compile and build
|
||||
|
||||
You should only continue if you are looking to develop bootloader for your own.
|
||||
You must have have a J-Link available to "unbrick" your device.
|
||||
|
||||
### Option 1: Build with Makefile
|
||||
|
||||
Prerequisites
|
||||
|
||||
- ARM GCC
|
||||
- Nordic's [nRF5x Command Line Tools](http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.tools%2Fdita%2Ftools%2Fnrf5x_command_line_tools%2Fnrf5x_installation.html)
|
||||
|
||||
To build:
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express all combinehex
|
||||
```
|
||||
|
||||
To flash the bootloader with JLink:
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express flash
|
||||
```
|
||||
|
||||
To upgrade the bootloader using DFU Serial via port /dev/ttyACM0
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express SERIAL=/dev/ttyACM0 dfu-flash
|
||||
```
|
||||
|
||||
To flash SoftDevice (and chip erase):
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express sd
|
||||
```
|
||||
|
||||
To erase all of flash:
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express erase
|
||||
```
|
||||
|
||||
For the list of supported boards, run `make` without `BOARD=` :
|
||||
|
||||
```
|
||||
$ make
|
||||
You must provide a BOARD parameter with 'BOARD='
|
||||
Supported boards are: feather_nrf52840_express feather_nrf52840_express pca10056
|
||||
Makefile:90: *** BOARD not defined. Stop
|
||||
```
|
||||
|
||||
### Common makefile problems
|
||||
|
||||
#### 1. `arm-none-eabi-gcc`: No such file or directory
|
||||
|
||||
If you get the following error ...
|
||||
|
||||
```
|
||||
$ make BOARD=feather_nrf52840_express all
|
||||
Compiling file: main.c
|
||||
/bin/sh: /usr/bin/arm-none-eabi-gcc: No such file or directory
|
||||
make: *** [_build/main.o] Error 127
|
||||
```
|
||||
|
||||
... you may need to edit the `Makefile` and update `GNU_INSTALL_ROOT` to point to the root path of your GCC ARM toolchain.
|
||||
|
||||
#### 2. `mergehex: No such file or directory`
|
||||
|
||||
Make sure that `mergehex` is available from the command-line. This binary is
|
||||
part of Nordic's nRF5x Command Line Tools.
|
||||
|
||||
#### 3. `make: nrfjprog: No such file or directory`
|
||||
|
||||
Make sure that `nrfjprog` is available from the command-line. This binary is
|
||||
part of Nordic's nRF5x Command Line Tools.
|
||||
|
||||
On POSIX-type systems you can temporarily add the path to `nrfjprog` via a
|
||||
variation on the following command:
|
||||
|
||||
```
|
||||
$ export PATH=$PATH:/location/of/nRF5x-Command-Line-Tools_9_7_2_OSX/nrfjprog
|
||||
```
|
||||
|
||||
### Option 2: Build using Segger Embedded Studio
|
||||
|
||||
For easier debugging you can also use [SES](https://www.segger.com/products/development-tools/embedded-studio/).
|
||||
The project file is located at `src/segger/Adafruit_nRF52_Bootloader.emProject`.
|
||||
|
||||
> **Note**: SES only flashes the bootloader when you click download, not the SoftDevice.
|
||||
You need to flash the SoftDevice beforehand if you haven't already done so.
|
||||
As mentioned above do something like:
|
||||
|
||||
```
|
||||
make BOARD=feather_nrf52840_express sd
|
||||
```
|
||||
|
|
14
changelog.md
14
changelog.md
|
@ -1,5 +1,19 @@
|
|||
# Adafruit nRF52 Bootloader Changelog
|
||||
|
||||
## 0.3.0 - 2020.01.13
|
||||
|
||||
- Upgrade nrfx to v2 for supporting future nrf mcu such as nrf52833, nrf5340
|
||||
- Upgrade TinyUSB
|
||||
- New boards support
|
||||
- Arduino ble nano 33
|
||||
- Adafruit CLUE
|
||||
- Raytac MDBT50Q-RX dongle
|
||||
- Migrate CI to github Action
|
||||
|
||||
## 0.2.13 - 2019.09.25
|
||||
|
||||
- Fixed button pulldown with Adafruit Circuit Playground Bluefruit, PR #77 thanks to @khanning
|
||||
|
||||
## 0.2.12 - 2019.08.22
|
||||
|
||||
- Fixed block alignment bug also in dfu_sd_image_validate (single & dual banks), PR #71 thanks to @fanoush
|
||||
|
|
2
lib/nrfx
2
lib/nrfx
|
@ -1 +1 @@
|
|||
Subproject commit 096e770ee41e5ad92a2137aa6502cb04d5745e5c
|
||||
Subproject commit b5399066bd7f3dc32ee15510d06ef7137bcacf36
|
|
@ -119,11 +119,23 @@ __STATIC_INLINE void apply_config(nrf_drv_uart_t const * p_instance, nrf_drv_uar
|
|||
nrf_gpio_cfg_input(p_config->pselrxd, NRF_GPIO_PIN_NOPULL);
|
||||
}
|
||||
|
||||
nrf_uarte_config_t uarte_cfg =
|
||||
{
|
||||
.hwfc = (nrf_uarte_hwfc_t) p_config->hwfc,
|
||||
.parity = (nrf_uarte_parity_t) p_config->parity
|
||||
};
|
||||
|
||||
nrf_uart_config_t uart_cfg =
|
||||
{
|
||||
.hwfc = (nrf_uart_hwfc_t) p_config->hwfc,
|
||||
.parity = (nrf_uart_parity_t) p_config->parity
|
||||
};
|
||||
|
||||
CODE_FOR_UARTE
|
||||
(
|
||||
nrf_uarte_baudrate_set(p_instance->reg.p_uarte, (nrf_uarte_baudrate_t)p_config->baudrate);
|
||||
nrf_uarte_configure(p_instance->reg.p_uarte, (nrf_uarte_parity_t)p_config->parity,
|
||||
(nrf_uarte_hwfc_t)p_config->hwfc);
|
||||
// nrf_uarte_configure(p_instance->reg.p_uarte, (nrf_uarte_parity_t)p_config->parity, (nrf_uarte_hwfc_t)p_config->hwfc);
|
||||
nrf_uarte_configure(p_instance->reg.p_uarte, &uarte_cfg);
|
||||
nrf_uarte_txrx_pins_set(p_instance->reg.p_uarte, p_config->pseltxd, p_config->pselrxd);
|
||||
if (p_config->hwfc == NRF_UART_HWFC_ENABLED)
|
||||
{
|
||||
|
@ -142,7 +154,8 @@ __STATIC_INLINE void apply_config(nrf_drv_uart_t const * p_instance, nrf_drv_uar
|
|||
CODE_FOR_UART
|
||||
(
|
||||
nrf_uart_baudrate_set(p_instance->reg.p_uart, p_config->baudrate);
|
||||
nrf_uart_configure(p_instance->reg.p_uart, p_config->parity, p_config->hwfc);
|
||||
// nrf_uart_configure(p_instance->reg.p_uart, p_config->parity, p_config->hwfc);
|
||||
nrf_uart_configure(p_instance->reg.p_uart, &uart_cfg);
|
||||
nrf_uart_txrx_pins_set(p_instance->reg.p_uart, p_config->pseltxd, p_config->pselrxd);
|
||||
if (p_config->hwfc == NRF_UART_HWFC_ENABLED)
|
||||
{
|
||||
|
|
|
@ -44,7 +44,8 @@
|
|||
#include "app_uart.h"
|
||||
#include "nrf_error.h"
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
// nRF has native usb peripheral
|
||||
#ifdef NRF_USBD
|
||||
#include "tusb.h"
|
||||
#endif
|
||||
|
||||
|
@ -121,13 +122,17 @@ static uint32_t send_tx_byte_end(void);
|
|||
*/
|
||||
uint32_t (*send_tx_byte) (void) = send_tx_byte_default;
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
static uint32_t serial_put(char ch)
|
||||
{
|
||||
return tud_cdc_write_char(ch) ? NRF_SUCCESS : NRF_ERROR_NO_MEM;
|
||||
}
|
||||
#ifdef NRF_USBD
|
||||
|
||||
static uint32_t serial_put(char ch)
|
||||
{
|
||||
return tud_cdc_write_char(ch) ? NRF_SUCCESS : NRF_ERROR_NO_MEM;
|
||||
}
|
||||
|
||||
#else
|
||||
#define serial_put app_uart_put
|
||||
|
||||
#define serial_put app_uart_put
|
||||
|
||||
#endif
|
||||
|
||||
static uint32_t send_tx_byte_end(void)
|
||||
|
@ -345,7 +350,7 @@ static bool rx_buffer_overflowed(void)
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
#ifdef NRF_USBD
|
||||
|
||||
static uint32_t slip_uart_open(void)
|
||||
{
|
||||
|
@ -441,7 +446,8 @@ uint32_t hci_slip_open()
|
|||
uint32_t hci_slip_close()
|
||||
{
|
||||
m_current_state = SLIP_OFF;
|
||||
#ifdef NRF52840_XXAA
|
||||
|
||||
#ifdef NRF_USBD
|
||||
return NRF_SUCCESS;
|
||||
#else
|
||||
uint32_t err_code = app_uart_close();
|
||||
|
|
|
@ -40,11 +40,11 @@
|
|||
#define INVALID_OPCODE 0x00 /**< Invalid op code identifier. */
|
||||
|
||||
#ifdef NRF51
|
||||
#define SOC_MAX_WRITE_SIZE 1024 /**< Maximum write size allowed for a single call to \ref sd_flash_write as specified in the SoC API on the nRF51. */
|
||||
#elif defined(NRF52832_XXAA) || defined(NRF52840_XXAA)
|
||||
#define SOC_MAX_WRITE_SIZE 4096 /**< Maximum write size allowed for a single call to \ref sd_flash_write as specified in the SoC API on the nRF52. */
|
||||
#define SOC_MAX_WRITE_SIZE 1024 /**< Maximum write size allowed for a single call to \ref sd_flash_write as specified in the SoC API on the nRF51. */
|
||||
#elif defined(NRF52_SERIES)
|
||||
#define SOC_MAX_WRITE_SIZE 4096 /**< Maximum write size allowed for a single call to \ref sd_flash_write as specified in the SoC API on the nRF52. */
|
||||
#else
|
||||
#error No target defined
|
||||
#error No target defined
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
#include "boards.h"
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
#ifdef NRF_USBD
|
||||
#include "tusb.h"
|
||||
#endif
|
||||
|
||||
|
@ -40,11 +40,11 @@
|
|||
|
||||
#define IRQ_ENABLED 0x01 /**< Field identifying if an interrupt is enabled. */
|
||||
|
||||
/**< Maximum number of interrupts available. */
|
||||
/**< Maximum number of interrupts available. (from IRQn_Type) */
|
||||
#if defined(NRF52832_XXAA)
|
||||
#define MAX_NUMBER_INTERRUPTS 39
|
||||
#elif defined(NRF52840_XXAA)
|
||||
#define MAX_NUMBER_INTERRUPTS 48
|
||||
#define MAX_NUMBER_INTERRUPTS 39
|
||||
#elif defined(NRF52840_XXAA) || defined(NRF52833_XXAA)
|
||||
#define MAX_NUMBER_INTERRUPTS 48
|
||||
#endif
|
||||
|
||||
/**@brief Enumeration for specifying current bootloader status.
|
||||
|
@ -119,17 +119,16 @@ static void wait_for_events(void)
|
|||
|
||||
// Feed all Watchdog just in case application enable it
|
||||
// WDT cannot be disabled once started. It even last through soft reset (NVIC Reset)
|
||||
if ( nrf_wdt_started() )
|
||||
if ( nrf_wdt_started(NRF_WDT) )
|
||||
{
|
||||
for (uint8_t i=0; i<8; i++) nrf_wdt_reload_request_set(i);
|
||||
for (uint8_t i=0; i<8; i++) nrf_wdt_reload_request_set(NRF_WDT, i);
|
||||
}
|
||||
|
||||
// Event received. Process it from the scheduler.
|
||||
app_sched_execute();
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
#ifdef NRF_USBD
|
||||
// skip if usb is not inited ( e.g OTA / finializing sd/bootloader )
|
||||
extern bool usb_inited(void);
|
||||
if ( tusb_inited() )
|
||||
{
|
||||
tud_task();
|
||||
|
@ -194,8 +193,8 @@ static void bootloader_settings_save(bootloader_settings_t * p_settings)
|
|||
}
|
||||
else
|
||||
{
|
||||
nrf_nvmc_page_erase(BOOTLOADER_SETTINGS_ADDRESS);
|
||||
nrf_nvmc_write_words(BOOTLOADER_SETTINGS_ADDRESS, (uint32_t *) p_settings, sizeof(bootloader_settings_t) / 4);
|
||||
nrfx_nvmc_page_erase(BOOTLOADER_SETTINGS_ADDRESS);
|
||||
nrfx_nvmc_words_write(BOOTLOADER_SETTINGS_ADDRESS, (uint32_t *) p_settings, sizeof(bootloader_settings_t) / 4);
|
||||
|
||||
pstorage_callback_handler(&m_bootsettings_handle, PSTORAGE_STORE_OP_CODE, NRF_SUCCESS, (uint8_t *) p_settings, sizeof(bootloader_settings_t));
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ __root const uint32_t m_uicr_bootloader_start_address @ NRF_UICR_BOOT_START_A
|
|||
|
||||
#endif
|
||||
|
||||
#if defined(NRF52832_XXAA) || defined(NRF52840_XXAA)
|
||||
#if defined(NRF52_SERIES)
|
||||
#if defined ( __CC_ARM )
|
||||
|
||||
uint8_t m_mbr_params_page[CODE_PAGE_SIZE] __attribute__((at(BOOTLOADER_MBR_PARAMS_PAGE_ADDRESS))) __attribute__((used)); /**< This variable reserves a codepage for mbr parameters, to ensure the compiler doesn't locate any code or variables at his location. */
|
||||
|
@ -50,7 +50,7 @@ __no_init uint8_t m_mbr_params_page[CODE_PAGE_SIZE] @ BOOTLOADER_MBR_PARAMS_
|
|||
__root const uint32_t m_uicr_mbr_params_page_address @ NRF_UICR_MBR_PARAMS_PAGE_ADDRESS = BOOTLOADER_MBR_PARAMS_PAGE_ADDRESS; /**< This variable ensures that the linker script will write the bootloader start address to the UICR register. This value will be written in the HEX file and thus written to UICR when the bootloader is flashed into the chip. */
|
||||
|
||||
#endif
|
||||
#endif // defined(NRF52832_XXAA) || defined(NRF52840_XXAA)
|
||||
#endif // NRF52_SERIES
|
||||
|
||||
|
||||
void bootloader_util_settings_get(const bootloader_settings_t ** pp_bootloader_settings)
|
||||
|
|
|
@ -151,7 +151,7 @@ static void dfu_prepare_func_app_erase(uint32_t image_size)
|
|||
|
||||
for ( uint32_t i = 0; i < page_count; i++ )
|
||||
{
|
||||
nrf_nvmc_page_erase(DFU_BANK_0_REGION_START + i * CODE_PAGE_SIZE);
|
||||
nrfx_nvmc_page_erase(DFU_BANK_0_REGION_START + i * CODE_PAGE_SIZE);
|
||||
}
|
||||
|
||||
// invoke complete callback
|
||||
|
|
|
@ -47,7 +47,10 @@ enum { BLE_CONN_CFG_HIGH_BANDWIDTH = 1 };
|
|||
#define BLE_HANDLE_MAX 0xFFFF /**< Max handle value is BLE. */
|
||||
|
||||
// limit of 8 chars
|
||||
#define DEVICE_NAME "AdaDFU" /**< Name of device. Will be included in the advertising data. */
|
||||
#ifndef BLEDIS_DEVICE_NAME
|
||||
#define BLEDIS_DEVICE_NAME "AdaDFU"
|
||||
#endif
|
||||
#define DEVICE_NAME BLEDIS_DEVICE_NAME /**< Name of device. Will be included in the advertising data. */
|
||||
|
||||
#define MIN_CONN_INTERVAL (uint16_t)(MSEC_TO_UNITS(10, UNIT_1_25_MS)) /**< Minimum acceptable connection interval (11.25 milliseconds). */
|
||||
#define MAX_CONN_INTERVAL (uint16_t)(MSEC_TO_UNITS(30, UNIT_1_25_MS)) /**< Maximum acceptable connection interval (15 milliseconds). */
|
||||
|
|
|
@ -30,22 +30,20 @@
|
|||
#include "app_util.h"
|
||||
|
||||
#define NRF_UICR_BOOT_START_ADDRESS (NRF_UICR_BASE + 0x14) /**< Register where the bootloader start address is stored in the UICR register. */
|
||||
|
||||
#if defined(NRF52832_XXAA) || defined(NRF52840_XXAA)
|
||||
#define NRF_UICR_MBR_PARAMS_PAGE_ADDRESS (NRF_UICR_BASE + 0x18) /**< Register where the mbr params page is stored in the UICR register. (Only in use in nRF52 MBR).*/
|
||||
#endif
|
||||
|
||||
#define CODE_REGION_1_START SD_SIZE_GET(MBR_SIZE) /**< This field should correspond to the size of Code Region 0, (which is identical to Start of Code Region 1), found in UICR.CLEN0 register. This value is used for compile safety, as the linker will fail if application expands into bootloader. Runtime, the bootloader will use the value found in UICR.CLEN0. */
|
||||
#define SOFTDEVICE_REGION_START MBR_SIZE /**< This field should correspond to start address of the bootloader, found in UICR.RESERVED, 0x10001014, register. This value is used for sanity check, so the bootloader will fail immediately if this value differs from runtime value. The value is used to determine max application size for updating. */
|
||||
#define CODE_PAGE_SIZE 0x1000 /**< Size of a flash codepage. Used for size of the reserved flash space in the bootloader region. Will be runtime checked against NRF_UICR->CODEPAGESIZE to ensure the region is correct. */
|
||||
|
||||
// Flash = 512 KB
|
||||
#if defined(NRF52832_XXAA) || defined(NRF52833_XXAA)
|
||||
|
||||
#if defined(NRF52832_XXAA)
|
||||
|
||||
#define BOOTLOADER_REGION_START 0x00074000 /**< This field should correspond to start address of the bootloader, found in UICR.RESERVED, 0x10001014, register. This value is used for sanity check, so the bootloader will fail immediately if this value differs from runtime value. The value is used to determine max application size for updating. */
|
||||
#define BOOTLOADER_REGION_START 0x00078000 /**< This field should correspond to start address of the bootloader, found in UICR.RESERVED, 0x10001014, register. This value is used for sanity check, so the bootloader will fail immediately if this value differs from runtime value. The value is used to determine max application size for updating. */
|
||||
#define BOOTLOADER_SETTINGS_ADDRESS 0x0007F000 /**< The field specifies the page location of the bootloader settings address. */
|
||||
#define BOOTLOADER_MBR_PARAMS_PAGE_ADDRESS 0x0007E000 /**< The field specifies the page location of the mbr params page address. */
|
||||
|
||||
// Flash = 1024 KB
|
||||
#elif defined(NRF52840_XXAA)
|
||||
|
||||
#define BOOTLOADER_REGION_START 0x000F4000 /**< This field should correspond to start address of the bootloader, found in UICR.RESERVED, 0x10001014, register. This value is used for sanity check, so the bootloader will fail immediately if this value differs from runtime value. The value is used to determine max application size for updating. */
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 55874813f82157b7509729b1a0c66e68f86e2d07
|
||||
Subproject commit 2b5bad7362f96ed376d0cc6e68c5ea1fc00dd4a4
|
569
src/boards.c
569
src/boards.c
|
@ -23,9 +23,12 @@
|
|||
*/
|
||||
|
||||
#include "boards.h"
|
||||
#include "nrf_spi.h"
|
||||
#include "nrf_pwm.h"
|
||||
#include "nrf_wdt.h"
|
||||
#include "app_scheduler.h"
|
||||
#include "app_timer.h"
|
||||
#include "pnvram.h"
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
|
||||
|
@ -39,19 +42,41 @@
|
|||
void neopixel_teardown(void);
|
||||
#endif
|
||||
|
||||
#ifdef ST7789_SPI_DISPLAY
|
||||
void st7789_init(void);
|
||||
void st7789_state(int state);
|
||||
void st7789_teardown(void);
|
||||
#endif
|
||||
|
||||
//------------- IMPLEMENTATION -------------//
|
||||
#if BUTTONS_NUMBER > 0
|
||||
void button_init(uint32_t pin)
|
||||
{
|
||||
nrf_gpio_cfg_sense_input(pin, BUTTON_PULL, NRF_GPIO_PIN_SENSE_LOW);
|
||||
nrf_gpio_cfg_sense_input(pin, BUTTON_PULL, NRF_GPIO_PIN_NOSENSE);
|
||||
#ifdef BUTTON_ENABLE
|
||||
/*
|
||||
* BUTTON_ENABLE is used when a switch is connected to another GPIO pin
|
||||
* rather than the Vcc or ground. In the bootloader we'll just permanently
|
||||
* push the enable pin to whatever value the sense pin thinks is the
|
||||
* active one.
|
||||
*/
|
||||
nrf_gpio_cfg_output(BUTTON_ENABLE);
|
||||
nrf_gpio_pin_write(BUTTON_ENABLE, BUTTON_ACTIVE);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool button_pressed(uint32_t pin)
|
||||
{
|
||||
return (nrf_gpio_pin_read(pin) == 0) ? true : false;
|
||||
return (nrf_gpio_pin_read(pin) == BUTTON_ACTIVE) ? true : false;
|
||||
}
|
||||
#endif
|
||||
|
||||
void board_init(void)
|
||||
{
|
||||
// the watchdog has a long timeout and, when we are running in bootloader
|
||||
// mode, will be fed by the systick handler
|
||||
wdt_init();
|
||||
|
||||
// stop LF clock just in case we jump from application without reset
|
||||
NRF_CLOCK->TASKS_LFCLKSTOP = 1UL;
|
||||
|
||||
|
@ -59,15 +84,21 @@ void board_init(void)
|
|||
NRF_CLOCK->LFCLKSRC = CLOCK_LFCLKSRC_SRC_RC;
|
||||
NRF_CLOCK->TASKS_LFCLKSTART = 1UL;
|
||||
|
||||
#ifdef BUTTON_DFU
|
||||
button_init(BUTTON_DFU);
|
||||
#endif
|
||||
#ifdef BUTTON_FRESET
|
||||
button_init(BUTTON_FRESET);
|
||||
#endif
|
||||
NRFX_DELAY_US(100); // wait for the pin state is stable
|
||||
|
||||
// use PMW0 for LED RED
|
||||
#if LEDS_NUMBER > 0
|
||||
led_pwm_init(LED_PRIMARY, LED_PRIMARY_PIN);
|
||||
#if LEDS_NUMBER > 1
|
||||
#endif
|
||||
#if LEDS_NUMBER > 1
|
||||
led_pwm_init(LED_SECONDARY, LED_SECONDARY_PIN);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// use neopixel for use enumeration
|
||||
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN)
|
||||
|
@ -83,19 +114,30 @@ void board_init(void)
|
|||
// Configure Systick for led blinky
|
||||
NVIC_SetPriority(SysTick_IRQn, 7);
|
||||
SysTick_Config(SystemCoreClock/1000);
|
||||
|
||||
// Bring up the display (if there is one)
|
||||
#ifdef ST7789_SPI_DISPLAY
|
||||
st7789_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
void board_teardown(void)
|
||||
{
|
||||
#ifdef ST7789_SPI_DISPLAY
|
||||
st7789_teardown();
|
||||
#endif
|
||||
|
||||
// Disable systick, turn off LEDs
|
||||
SysTick->CTRL = 0;
|
||||
|
||||
#if LEDS_NUMBER > 0
|
||||
// Disable and reset PWM for LEDs
|
||||
led_pwm_teardown();
|
||||
|
||||
#endif
|
||||
#if defined(LED_NEOPIXEL) || defined(LED_RGB_RED_PIN)
|
||||
neopixel_teardown();
|
||||
#endif
|
||||
|
||||
// Button
|
||||
|
||||
// Stop RTC1 used by app_timer
|
||||
|
@ -110,11 +152,49 @@ void board_teardown(void)
|
|||
}
|
||||
|
||||
static uint32_t _systick_count = 0;
|
||||
#ifdef BUTTON_DFU
|
||||
static uint32_t _long_press_count = 0;
|
||||
#endif
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
_systick_count++;
|
||||
|
||||
#ifdef NRF52832_XXAA
|
||||
pnvram_add_ms(pnvram, 1);
|
||||
#endif
|
||||
#if LEDS_NUMBER > 0
|
||||
led_tick();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Feed the dog... this is a backstop. The *only* reason we are running
|
||||
* the watchdog is to help us recover if the bootloader crashes in some
|
||||
* way that makes it impossible for us to reboot using the button test
|
||||
* code below. This is OK to feed it from a periodic interrupt (even
|
||||
* if there is no button it's better to feed the dog than reboot in
|
||||
* the middle of flashing).
|
||||
*/
|
||||
#ifdef BUTTON_DFU
|
||||
if (!button_pressed(BUTTON_DFU))
|
||||
#endif
|
||||
nrf_wdt_reload_request_set(NRF_WDT, 0);
|
||||
|
||||
/*
|
||||
* Detect and (trivially) debounce a press of the DFU button. When
|
||||
* found try to launch the application regardless of the DFU button
|
||||
* state. We ignore the button press for our first few seconds of life
|
||||
* because makes it harder to accidentally start the application when
|
||||
* recovering from a flat battery.
|
||||
*/
|
||||
#ifdef BUTTON_DFU
|
||||
if (button_pressed(BUTTON_DFU)) {
|
||||
if (_systick_count > 2750 && _long_press_count++ > 50) {
|
||||
NRF_POWER->GPREGRET = BOARD_MAGIC_FORCE_APP_BOOT;
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
} else {
|
||||
_long_press_count = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -122,6 +202,7 @@ uint32_t tusb_hal_millis(void)
|
|||
{
|
||||
return ( ( ((uint64_t)app_timer_cnt_get())*1000*(APP_TIMER_CONFIG_RTC_FREQUENCY+1)) / APP_TIMER_CLOCK_FREQ );
|
||||
}
|
||||
#if LEDS_NUMBER > 0
|
||||
|
||||
void pwm_teardown(NRF_PWM_Type* pwm )
|
||||
{
|
||||
|
@ -251,18 +332,18 @@ void led_state(uint32_t state)
|
|||
case STATE_BLE_CONNECTED:
|
||||
new_rgb_color = 0x0000ff;
|
||||
#ifdef LED_SECONDARY_PIN
|
||||
secondary_cycle_length = 3000;
|
||||
secondary_cycle_length = 300;
|
||||
#else
|
||||
primary_cycle_length = 3000;
|
||||
primary_cycle_length = 300;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case STATE_BLE_DISCONNECTED:
|
||||
new_rgb_color = 0xff00ff;
|
||||
#ifdef LED_SECONDARY_PIN
|
||||
secondary_cycle_length = 300;
|
||||
secondary_cycle_length = 3000;
|
||||
#else
|
||||
primary_cycle_length = 300;
|
||||
primary_cycle_length = 3000;
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
@ -289,6 +370,14 @@ void led_state(uint32_t state)
|
|||
(void) final_color;
|
||||
#endif
|
||||
}
|
||||
#else // LEDS_NUMBER > 0
|
||||
void led_state(uint32_t state)
|
||||
{
|
||||
#ifdef ST7789_SPI_DISPLAY
|
||||
st7789_state(state);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef LED_NEOPIXEL
|
||||
|
||||
|
@ -430,3 +519,463 @@ void neopixel_write (uint8_t *pixels)
|
|||
led_pwm_duty_cycle(LED_RGB_BLUE, pixels[0]);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ST7789_SPI_DISPLAY
|
||||
|
||||
#ifndef BACKLIGHT_PIN_NUMBER
|
||||
#define BACKLIGHT_PIN_NUMBER 14 /* lowest level */
|
||||
#endif
|
||||
|
||||
#define SPIx NRF_SPI0
|
||||
#define SPI_MODE NRF_SPI_MODE_3
|
||||
#define SPI_SCK 2
|
||||
#define SPI_MOSI 3
|
||||
#define DISP_SS 25
|
||||
#define DISP_DC 18
|
||||
#define DISP_RESET 26
|
||||
#define BACKLIGHT BACKLIGHT_PIN_NUMBER
|
||||
|
||||
void spi_init(void)
|
||||
{
|
||||
nrf_gpio_pin_write(SPI_SCK, SPI_MODE >= 2);
|
||||
nrf_gpio_cfg(SPI_SCK, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,
|
||||
NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_S0S1, NRF_GPIO_PIN_NOSENSE);
|
||||
nrf_gpio_pin_clear(SPI_MOSI);
|
||||
nrf_gpio_cfg_output(SPI_MOSI);
|
||||
|
||||
|
||||
nrf_spi_pins_set(SPIx, SPI_SCK, SPI_MOSI, NRF_SPI_PIN_NOT_CONNECTED);
|
||||
nrf_spi_frequency_set(SPIx, NRF_SPI_FREQ_8M);
|
||||
nrf_spi_configure(SPIx, SPI_MODE, NRF_SPI_BIT_ORDER_MSB_FIRST);
|
||||
|
||||
nrf_spi_enable(SPIx);
|
||||
}
|
||||
|
||||
void spi_teardown(void)
|
||||
{
|
||||
/* no need to tear down SCK and MOSI - output pins can be left alone */
|
||||
nrf_spi_event_clear(SPIx, NRF_SPI_EVENT_READY);
|
||||
nrf_spi_disable(SPIx);
|
||||
nrf_gpio_cfg_default(SPI_MOSI);
|
||||
nrf_gpio_cfg_default(SPI_SCK);
|
||||
}
|
||||
|
||||
void spi_write(const uint8_t *data, unsigned len)
|
||||
{
|
||||
const uint8_t *endp = data + len;
|
||||
|
||||
/* paranoid... but worthwhile due to the havoc this could cause */
|
||||
nrf_spi_event_clear(SPIx, NRF_SPI_EVENT_READY);
|
||||
|
||||
/* send first character */
|
||||
nrf_spi_txd_set(SPIx, *data++);
|
||||
|
||||
/* TXD is double buffers so we can xmit and then poll for the event */
|
||||
while (data < endp) {
|
||||
nrf_spi_txd_set(SPIx, *data++);
|
||||
|
||||
while (!nrf_spi_event_check(SPIx, NRF_SPI_EVENT_READY)) {}
|
||||
nrf_spi_event_clear(SPIx, NRF_SPI_EVENT_READY);
|
||||
(void) nrf_spi_rxd_get(SPIx);
|
||||
}
|
||||
|
||||
/* wait for the final character */
|
||||
while (!nrf_spi_event_check(SPIx, NRF_SPI_EVENT_READY)) {}
|
||||
nrf_spi_event_clear(SPIx, NRF_SPI_EVENT_READY);
|
||||
(void) nrf_spi_rxd_get(SPIx);
|
||||
}
|
||||
|
||||
#define NOP 0x00
|
||||
#define SWRESET 0x01
|
||||
#define SLPOUT 0x11
|
||||
#define NORON 0x13
|
||||
#define INVOFF 0x20
|
||||
#define INVON 0x21
|
||||
#define DISPON 0x29
|
||||
#define CASET 0x2a
|
||||
#define RASET 0x2b
|
||||
#define RAMWR 0x2c
|
||||
#define COLMOD 0x3a
|
||||
#define MADCTL 0x36
|
||||
|
||||
struct st7789_cmd {
|
||||
uint8_t cmd;
|
||||
const uint8_t *data;
|
||||
uint8_t len;
|
||||
};
|
||||
|
||||
const static struct st7789_cmd st7789_init_data[] = {
|
||||
{ COLMOD, (uint8_t *) "\x05", 1 }, // MCU will send 16-bit RGB565
|
||||
{ MADCTL, (uint8_t *) "\x00", 1 }, // Left to right, top to bottom
|
||||
//{ INVOFF, NULL }, // Results in odd palette
|
||||
{ INVON, NULL },
|
||||
{ NORON, NULL },
|
||||
{ NOP, NULL },
|
||||
};
|
||||
|
||||
|
||||
static void st7789_send(uint8_t cmd, const uint8_t *data, unsigned len)
|
||||
{
|
||||
nrf_gpio_pin_clear(DISP_SS);
|
||||
|
||||
// this means nop cannot be sent... but helps with big RAMWR dumps
|
||||
if (cmd) {
|
||||
nrf_gpio_pin_clear(DISP_DC);
|
||||
spi_write(&cmd, 1);
|
||||
}
|
||||
|
||||
if (data) {
|
||||
nrf_gpio_pin_set(DISP_DC);
|
||||
spi_write(data, len);
|
||||
}
|
||||
|
||||
nrf_gpio_pin_set(DISP_SS);
|
||||
}
|
||||
|
||||
void st7789_state(int state)
|
||||
{
|
||||
bool topclip = true;
|
||||
bool bottomclip = true;
|
||||
|
||||
switch(state) {
|
||||
case STATE_BOOTLOADER_STARTED:
|
||||
break;
|
||||
case STATE_BLE_DISCONNECTED:
|
||||
topclip = false;
|
||||
/* fallthrough */
|
||||
case STATE_BLE_CONNECTED:
|
||||
bottomclip = false;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t linebuffer[2*240];
|
||||
|
||||
#if defined(_P8_NRF52832_H) || defined(_K9_NRF52832_H)
|
||||
// 1-bit RLE, generated from res/p8dfu.png, 1355 bytes
|
||||
static const uint8_t rle[] = {
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0x9c, 0x8, 0x8, 0x3,
|
||||
0x2b, 0x3, 0xac, 0xd, 0x6, 0x3, 0x2b, 0x3, 0xab, 0xe, 0x6, 0x3,
|
||||
0x2b, 0x3, 0xab, 0x4, 0x8, 0x2, 0x6, 0x3, 0x2b, 0x3, 0xaa, 0x4,
|
||||
0x11, 0x3, 0x2b, 0x3, 0xaa, 0x3, 0x10, 0xb, 0x6, 0x7, 0xb, 0x3,
|
||||
0x3, 0x4, 0x1, 0xb, 0xa4, 0x3, 0x10, 0xb, 0x4, 0xb, 0x9, 0x3,
|
||||
0x1, 0x6, 0x1, 0xb, 0xa4, 0x3, 0x10, 0xb, 0x4, 0xc, 0x8, 0xa,
|
||||
0x1, 0xb, 0xa4, 0x4, 0x11, 0x3, 0xa, 0x2, 0x7, 0x4, 0x7, 0x6,
|
||||
0x7, 0x3, 0xab, 0x5, 0xf, 0x3, 0x14, 0x3, 0x7, 0x4, 0x9, 0x3,
|
||||
0xac, 0x9, 0xa, 0x3, 0x15, 0x3, 0x6, 0x4, 0x9, 0x3, 0xad, 0xa,
|
||||
0x8, 0x3, 0x15, 0x3, 0x6, 0x3, 0xa, 0x3, 0xb0, 0x8, 0x7, 0x3,
|
||||
0xd, 0xb, 0x6, 0x3, 0xa, 0x3, 0xb4, 0x5, 0x6, 0x3, 0xb, 0xd,
|
||||
0x6, 0x3, 0xa, 0x3, 0xb6, 0x4, 0x5, 0x3, 0xa, 0xe, 0x6, 0x3,
|
||||
0xa, 0x3, 0xb7, 0x3, 0x5, 0x3, 0x9, 0x5, 0x7, 0x3, 0x6, 0x3,
|
||||
0xa, 0x3, 0xb7, 0x3, 0x5, 0x3, 0x9, 0x3, 0x9, 0x3, 0x6, 0x3,
|
||||
0xa, 0x3, 0xb7, 0x3, 0x5, 0x3, 0x9, 0x3, 0x9, 0x3, 0x6, 0x3,
|
||||
0xa, 0x3, 0xb6, 0x4, 0x5, 0x3, 0x9, 0x3, 0x8, 0x4, 0x6, 0x3,
|
||||
0xa, 0x3, 0xaa, 0x2, 0x9, 0x4, 0x6, 0x4, 0x8, 0x4, 0x5, 0x6,
|
||||
0x6, 0x3, 0xa, 0x4, 0xa9, 0xf, 0x7, 0x8, 0x4, 0xe, 0x6, 0x3,
|
||||
0xb, 0x8, 0xa4, 0xe, 0x8, 0x8, 0x5, 0x9, 0x1, 0x3, 0x6, 0x3,
|
||||
0xb, 0x8, 0xa6, 0x9, 0xd, 0x6, 0x6, 0x6, 0x3, 0x3, 0x6, 0x3,
|
||||
0xd, 0x6, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xcb, 0x1,
|
||||
0xee, 0x3, 0xec, 0x5, 0xea, 0x7, 0x6e, 0x6, 0x76, 0x7, 0x6b, 0xb,
|
||||
0x74, 0x7, 0x8, 0x1, 0x60, 0xe, 0x2d, 0x8, 0x22, 0x1, 0x1b, 0x7,
|
||||
0x6, 0x2, 0x5f, 0x10, 0x28, 0x7, 0x2, 0x6, 0x1e, 0x3, 0x1b, 0x7,
|
||||
0x4, 0x3, 0x5e, 0x13, 0x24, 0x4, 0xc, 0x4, 0x19, 0x6, 0x1b, 0x7,
|
||||
0x2, 0x4, 0x5e, 0x14, 0x21, 0x3, 0x12, 0x3, 0x16, 0x7, 0x1c, 0xc,
|
||||
0x5e, 0x15, 0x1e, 0x3, 0x16, 0x3, 0x12, 0x7, 0x1f, 0xb, 0x5d, 0x18,
|
||||
0x1b, 0x2, 0x1a, 0x2, 0x10, 0x7, 0x21, 0xa, 0x5d, 0x19, 0x18, 0x3,
|
||||
0x1c, 0x3, 0xc, 0x7, 0x24, 0x9, 0x5d, 0x1a, 0x16, 0x2, 0x11, 0x2,
|
||||
0xd, 0x2, 0xa, 0x7, 0x25, 0x9, 0x5d, 0x1b, 0x15, 0x2, 0x11, 0x2,
|
||||
0xe, 0x2, 0x7, 0x7, 0x26, 0xa, 0x5d, 0x1c, 0x13, 0x2, 0x12, 0x2,
|
||||
0xf, 0x2, 0x5, 0x7, 0x26, 0xb, 0x5e, 0x1b, 0x12, 0x2, 0x25, 0x1,
|
||||
0x3, 0x7, 0x27, 0xc, 0x5e, 0x1c, 0x11, 0x1, 0x26, 0x2, 0x1, 0x7,
|
||||
0x27, 0xd, 0x5e, 0x1d, 0xf, 0x2, 0x27, 0x7, 0x94, 0x1e, 0xe, 0x1,
|
||||
0x27, 0x7, 0x96, 0x1e, 0xc, 0x2, 0x25, 0x7, 0x98, 0x1e, 0xc, 0x1,
|
||||
0x25, 0x8, 0x99, 0x1e, 0xb, 0x1, 0x23, 0x7, 0x1, 0x2, 0x99, 0x1f,
|
||||
0x9, 0x2, 0x22, 0x7, 0x3, 0x1, 0x99, 0x1f, 0x9, 0x2, 0x20, 0x7,
|
||||
0x5, 0x2, 0x99, 0x1f, 0x8, 0x1, 0x20, 0x7, 0x7, 0x1, 0x99, 0x20,
|
||||
0x7, 0x1, 0x1e, 0x7, 0x9, 0x1, 0x9a, 0x1f, 0x7, 0x1, 0x1d, 0x7,
|
||||
0xa, 0x1, 0x9a, 0x20, 0x6, 0x1, 0x1b, 0x7, 0xc, 0x2, 0x9a, 0x1f,
|
||||
0x6, 0x1, 0xf, 0x3, 0x3, 0xc, 0xe, 0x1, 0x9b, 0x1f, 0x5, 0x1,
|
||||
0xf, 0x10, 0x10, 0x1, 0x9b, 0x1f, 0x5, 0x1, 0xf, 0xf, 0x11, 0x1,
|
||||
0x9c, 0x1f, 0x4, 0x1, 0xf, 0xd, 0x13, 0x1, 0x9d, 0x1e, 0x4, 0x2,
|
||||
0x2, 0x3, 0xc, 0xc, 0xb, 0x3, 0x3, 0x1, 0x9d, 0x1f, 0x3, 0x2,
|
||||
0x11, 0x10, 0xc, 0x2, 0x9e, 0x1e, 0x4, 0x1, 0x10, 0x14, 0x9, 0x2,
|
||||
0x9f, 0x1d, 0x4, 0x1, 0xe, 0x19, 0x6, 0x1, 0xa1, 0x1d, 0x3, 0x2,
|
||||
0xd, 0xb, 0x4, 0xd, 0x3, 0x1, 0xa2, 0x1c, 0x3, 0x2, 0xe, 0x3,
|
||||
0xf, 0xd, 0xa3, 0x1c, 0x3, 0x1, 0x23, 0xc, 0xa2, 0x1b, 0x3, 0x2,
|
||||
0x25, 0xc, 0xa0, 0x1a, 0x4, 0x1, 0x28, 0xc, 0x9e, 0x1a, 0x3, 0x2,
|
||||
0x27, 0x2, 0x1, 0x9, 0x84, 0xc, 0xf, 0x19, 0x3, 0x2, 0x27, 0x2,
|
||||
0x4, 0x6, 0x82, 0x3, 0x9, 0x5, 0xd, 0x18, 0x4, 0x1, 0x26, 0x2,
|
||||
0x8, 0x2, 0x82, 0x2, 0xf, 0x4, 0xb, 0x18, 0x3, 0x2, 0x25, 0x2,
|
||||
0x8c, 0x2, 0x11, 0x4, 0xa, 0x17, 0x4, 0x1, 0x24, 0x2, 0x8c, 0x2,
|
||||
0x14, 0x4, 0x9, 0x16, 0x4, 0x2, 0x23, 0x1, 0x8d, 0x2, 0x16, 0x3,
|
||||
0x9, 0x15, 0x5, 0x2, 0x21, 0x2, 0x8d, 0x1, 0x19, 0x3, 0x8, 0x15,
|
||||
0x5, 0x1, 0x20, 0x2, 0x8e, 0x1, 0x1b, 0x2, 0x8, 0x14, 0x5, 0x2,
|
||||
0x1f, 0x1, 0x8f, 0x1, 0x1c, 0x3, 0x7, 0x13, 0x6, 0x2, 0xe, 0x1,
|
||||
0xe, 0x2, 0x8f, 0x2, 0x1c, 0x3, 0x7, 0x12, 0x6, 0x2, 0xe, 0x1,
|
||||
0xd, 0x2, 0x90, 0x2, 0x1e, 0x2, 0x7, 0x11, 0x7, 0x2, 0xd, 0x1,
|
||||
0xd, 0x1, 0x92, 0x1, 0x1f, 0x2, 0x7, 0x10, 0x8, 0x2, 0x19, 0x2,
|
||||
0x92, 0x2, 0x1f, 0x2, 0x7, 0x10, 0x8, 0x2, 0x17, 0x2, 0x93, 0x2,
|
||||
0x20, 0x2, 0x7, 0xf, 0x8, 0x2, 0x16, 0x2, 0x95, 0x2, 0x20, 0x2,
|
||||
0x7, 0xe, 0x9, 0x2, 0x14, 0x2, 0x97, 0x1, 0x21, 0x2, 0x7, 0xd,
|
||||
0xa, 0x2, 0x12, 0x2, 0x98, 0x2, 0x21, 0x2, 0x7, 0xc, 0xb, 0x2,
|
||||
0x10, 0x2, 0x9a, 0x2, 0x21, 0x2, 0x6, 0xc, 0xc, 0x2, 0xe, 0x2,
|
||||
0x9c, 0x2, 0x21, 0x2, 0x6, 0xb, 0xd, 0x2, 0xc, 0x2, 0x9e, 0x3,
|
||||
0x20, 0x2, 0x6, 0xa, 0xe, 0x2, 0xa, 0x2, 0xa1, 0x2, 0x20, 0x2,
|
||||
0x5, 0xa, 0xf, 0x2, 0x8, 0x2, 0xa3, 0x3, 0x1f, 0x1, 0x6, 0x9,
|
||||
0x10, 0x2, 0x5, 0x3, 0xa6, 0x2, 0x1e, 0x2, 0x6, 0x8, 0x11, 0x2,
|
||||
0x3, 0x2, 0xa9, 0x3, 0x1d, 0x2, 0x5, 0x8, 0x12, 0x5, 0xac, 0x3,
|
||||
0x1c, 0x2, 0x5, 0x7, 0xc5, 0x4, 0x1a, 0x1, 0x5, 0x7, 0xc7, 0x4,
|
||||
0x18, 0x2, 0x5, 0x6, 0xca, 0x4, 0x16, 0x2, 0x4, 0x6, 0xcc, 0x4,
|
||||
0x14, 0x2, 0x5, 0x5, 0xcf, 0x4, 0x12, 0x2, 0x4, 0x5, 0xd2, 0x4,
|
||||
0x10, 0x1, 0x5, 0x4, 0xd4, 0x5, 0xd, 0x2, 0x4, 0x4, 0xd7, 0x4,
|
||||
0xc, 0x1, 0x4, 0x4, 0xda, 0x4, 0x9, 0x2, 0x4, 0x3, 0xdc, 0x4,
|
||||
0x7, 0x2, 0x4, 0x2, 0xd2, 0x2, 0xb, 0x3, 0x7, 0x1, 0x4, 0x2,
|
||||
0xd1, 0x6, 0xa, 0x3, 0x5, 0x2, 0x4, 0x1, 0xd1, 0x9, 0x9, 0x2,
|
||||
0x4, 0x2, 0x4, 0x1, 0xd1, 0xb, 0x8, 0x3, 0x3, 0x1, 0xd5, 0xe,
|
||||
0x7, 0x3, 0x2, 0x1, 0xd5, 0x10, 0x7, 0x2, 0x1, 0x2, 0xd4, 0x11,
|
||||
0x7, 0x4, 0xd4, 0x13, 0x5, 0x4, 0xd4, 0x14, 0x5, 0x3, 0xd4, 0x15,
|
||||
0x5, 0x2, 0xd4, 0x15, 0xdb, 0x16, 0xda, 0x16, 0xdc, 0x14, 0xe2, 0xe,
|
||||
0xe5, 0xb, 0xe8, 0x8, 0xea, 0x6, 0xed, 0x2, 0xdb, 0x8, 0xe8, 0x3,
|
||||
0x2, 0x7, 0xe4, 0x1, 0x9, 0x5, 0xe1, 0x1, 0xc, 0x4, 0xdf, 0x1,
|
||||
0xf, 0x3, 0xdd, 0x2, 0xf, 0x2, 0xdd, 0x2, 0xe, 0x2, 0xdf, 0x1,
|
||||
0xe, 0x2, 0xdf, 0x2, 0xd, 0x1, 0xe0, 0x2, 0xc, 0x2, 0xe1, 0x1,
|
||||
0xc, 0x1, 0xe2, 0x2, 0xa, 0x2, 0xe2, 0x2, 0xa, 0x1, 0xe4, 0x1,
|
||||
0x9, 0x2, 0xe4, 0x2, 0x8, 0x2, 0xe5, 0x1, 0x8, 0x1, 0xe6, 0x1,
|
||||
0x7, 0x2, 0xe6, 0x2, 0x6, 0x1, 0xe8, 0x1, 0x6, 0x1, 0xe8, 0x2,
|
||||
0x4, 0x2, 0xe9, 0x1, 0x4, 0x1, 0xea, 0x2, 0x3, 0x1, 0xeb, 0x2,
|
||||
0x2, 0x1, 0xec, 0x2, 0x1, 0x1, 0xec, 0x4, 0xed, 0x2, 0xff, 0x0,
|
||||
0x6d, 0x6, 0xe7, 0xc, 0xe2, 0x10, 0xde, 0x14, 0xdb, 0x16, 0xd9, 0x18,
|
||||
0xd7, 0x1a, 0xd5, 0x1c, 0xd4, 0xb, 0x3, 0xe, 0xd3, 0xc, 0x4, 0xe,
|
||||
0xd2, 0xc, 0x6, 0xc, 0xd1, 0xd, 0x7, 0xc, 0xd0, 0xd, 0x8, 0xb,
|
||||
0xd0, 0xd, 0x9, 0xa, 0xd0, 0xd, 0x4, 0x1, 0x6, 0x8, 0xd0, 0xd,
|
||||
0x4, 0x2, 0x6, 0x7, 0xd0, 0xd, 0x4, 0x3, 0x6, 0x6, 0xd0, 0x6,
|
||||
0x3, 0x4, 0x4, 0x4, 0x5, 0x6, 0xd0, 0x6, 0x4, 0x3, 0x4, 0x3,
|
||||
0x6, 0x6, 0xd0, 0x6, 0x6, 0x1, 0x4, 0x2, 0x6, 0x7, 0xd0, 0x7,
|
||||
0xa, 0x1, 0x6, 0x8, 0xd0, 0x8, 0xf, 0x9, 0xd0, 0xa, 0xb, 0xb,
|
||||
0xd0, 0xb, 0x9, 0xc, 0xd0, 0xc, 0x7, 0xd, 0xd0, 0xc, 0x7, 0xd,
|
||||
0xd0, 0xb, 0x9, 0xc, 0xd0, 0xa, 0xb, 0xb, 0xd0, 0x8, 0xf, 0x9,
|
||||
0xd0, 0x7, 0xa, 0x1, 0x6, 0x8, 0xd0, 0x6, 0x6, 0x1, 0x4, 0x2,
|
||||
0x6, 0x7, 0xd0, 0x6, 0x4, 0x3, 0x4, 0x3, 0x6, 0x6, 0xd0, 0x6,
|
||||
0x3, 0x4, 0x4, 0x4, 0x5, 0x6, 0xd0, 0xd, 0x4, 0x3, 0x6, 0x6,
|
||||
0xd0, 0xd, 0x4, 0x2, 0x6, 0x7, 0xd0, 0xd, 0x4, 0x1, 0x6, 0x8,
|
||||
0xd0, 0xd, 0x9, 0xa, 0xd0, 0xd, 0x8, 0xb, 0xd0, 0xd, 0x7, 0xc,
|
||||
0xd1, 0xc, 0x6, 0xc, 0xd2, 0xc, 0x4, 0xe, 0xd3, 0xb, 0x3, 0xe,
|
||||
0xd4, 0x1c, 0xd5, 0x1a, 0xd7, 0x18, 0xd9, 0x16, 0xdb, 0x14, 0xde, 0x10,
|
||||
0xe2, 0xc, 0xe7, 0x6, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0x85,
|
||||
};
|
||||
#else
|
||||
// 1-bit RLE, generated from res/pinedfu.png, 1085 bytes
|
||||
const uint8_t rle[] = {
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0x14, 0x8, 0x8, 0x3,
|
||||
0x2b, 0x3, 0xac, 0xd, 0x6, 0x3, 0x2b, 0x3, 0xab, 0xe, 0x6, 0x3,
|
||||
0x2b, 0x3, 0xab, 0x4, 0x8, 0x2, 0x6, 0x3, 0x2b, 0x3, 0xaa, 0x4,
|
||||
0x11, 0x3, 0x2b, 0x3, 0xaa, 0x3, 0x10, 0xb, 0x6, 0x7, 0xb, 0x3,
|
||||
0x3, 0x4, 0x1, 0xb, 0xa4, 0x3, 0x10, 0xb, 0x4, 0xb, 0x9, 0x3,
|
||||
0x1, 0x6, 0x1, 0xb, 0xa4, 0x3, 0x10, 0xb, 0x4, 0xc, 0x8, 0xa,
|
||||
0x1, 0xb, 0xa4, 0x4, 0x11, 0x3, 0xa, 0x2, 0x7, 0x4, 0x7, 0x6,
|
||||
0x7, 0x3, 0xab, 0x5, 0xf, 0x3, 0x14, 0x3, 0x7, 0x4, 0x9, 0x3,
|
||||
0xac, 0x9, 0xa, 0x3, 0x15, 0x3, 0x6, 0x4, 0x9, 0x3, 0xad, 0xa,
|
||||
0x8, 0x3, 0x15, 0x3, 0x6, 0x3, 0xa, 0x3, 0xb0, 0x8, 0x7, 0x3,
|
||||
0xd, 0xb, 0x6, 0x3, 0xa, 0x3, 0xb4, 0x5, 0x6, 0x3, 0xb, 0xd,
|
||||
0x6, 0x3, 0xa, 0x3, 0xb6, 0x4, 0x5, 0x3, 0xa, 0xe, 0x6, 0x3,
|
||||
0xa, 0x3, 0xb7, 0x3, 0x5, 0x3, 0x9, 0x5, 0x7, 0x3, 0x6, 0x3,
|
||||
0xa, 0x3, 0xb7, 0x3, 0x5, 0x3, 0x9, 0x3, 0x9, 0x3, 0x6, 0x3,
|
||||
0xa, 0x3, 0xb7, 0x3, 0x5, 0x3, 0x9, 0x3, 0x9, 0x3, 0x6, 0x3,
|
||||
0xa, 0x3, 0xb6, 0x4, 0x5, 0x3, 0x9, 0x3, 0x8, 0x4, 0x6, 0x3,
|
||||
0xa, 0x3, 0xaa, 0x2, 0x9, 0x4, 0x6, 0x4, 0x8, 0x4, 0x5, 0x6,
|
||||
0x6, 0x3, 0xa, 0x4, 0xa9, 0xf, 0x7, 0x8, 0x4, 0xe, 0x6, 0x3,
|
||||
0xb, 0x8, 0xa4, 0xe, 0x8, 0x8, 0x5, 0x9, 0x1, 0x3, 0x6, 0x3,
|
||||
0xb, 0x8, 0xa6, 0x9, 0xd, 0x6, 0x6, 0x6, 0x3, 0x3, 0x6, 0x3,
|
||||
0xd, 0x6, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0x2c, 0x2, 0xed, 0x4,
|
||||
0xa6, 0x1, 0x44, 0x6, 0xa4, 0x3, 0x42, 0x8, 0xa2, 0x5, 0x40, 0xa,
|
||||
0xa0, 0x7, 0x3e, 0xc, 0x9e, 0x7, 0x3e, 0xe, 0x93, 0x1, 0x8, 0x7,
|
||||
0x3e, 0x10, 0x92, 0x2, 0x6, 0x7, 0x3e, 0x12, 0x91, 0x3, 0x4, 0x7,
|
||||
0x3e, 0x14, 0x90, 0x4, 0x2, 0x7, 0x3e, 0x16, 0x8f, 0xc, 0x3e, 0x18,
|
||||
0x8e, 0xb, 0x3f, 0x18, 0x8e, 0xa, 0x42, 0x14, 0x90, 0x9, 0x37, 0x2,
|
||||
0xc, 0x10, 0xc, 0x2, 0x84, 0x9, 0x36, 0x5, 0xc, 0xc, 0xc, 0x5,
|
||||
0x83, 0xa, 0x35, 0x7, 0xc, 0x8, 0xc, 0x7, 0x83, 0xb, 0x33, 0xa,
|
||||
0xc, 0x4, 0xc, 0xa, 0x82, 0xc, 0x32, 0xc, 0x18, 0xc, 0x82, 0xd,
|
||||
0x30, 0xf, 0x14, 0xf, 0xbe, 0x11, 0x10, 0x11, 0xbe, 0xf, 0x14, 0xf,
|
||||
0xbd, 0xe, 0x18, 0xe, 0xbc, 0xc, 0xc, 0x4, 0xc, 0xc, 0xbb, 0xb,
|
||||
0xc, 0x8, 0xc, 0xb, 0xba, 0x9, 0xb, 0xe, 0xb, 0x9, 0xba, 0x7,
|
||||
0xb, 0x12, 0xb, 0x7, 0xb9, 0x6, 0xa, 0x18, 0xa, 0x6, 0xb8, 0x3,
|
||||
0xb, 0x1c, 0xa, 0x4, 0xc4, 0x20, 0xa, 0x2, 0xc2, 0x24, 0xc9, 0x2a,
|
||||
0xc4, 0x2e, 0xbf, 0x34, 0xba, 0x38, 0xb7, 0x3a, 0xab, 0x1, 0xb, 0x38,
|
||||
0xa, 0x2, 0xa0, 0x4, 0xa, 0x34, 0xa, 0x4, 0xa0, 0x6, 0xb, 0x2e,
|
||||
0xb, 0x6, 0xa0, 0x9, 0xa, 0x2a, 0xa, 0x9, 0xa0, 0xb, 0xb, 0x24,
|
||||
0xb, 0xb, 0xa0, 0xd, 0xb, 0x20, 0xb, 0xd, 0xa0, 0xf, 0xb, 0x1c,
|
||||
0xb, 0xf, 0xa0, 0x12, 0xa, 0x18, 0xa, 0x12, 0xa0, 0x14, 0xb, 0x12,
|
||||
0xb, 0x14, 0xa0, 0x16, 0xb, 0xe, 0xb, 0x16, 0xa0, 0x18, 0xc, 0x8,
|
||||
0xc, 0x18, 0xa0, 0x1b, 0xb, 0x4, 0xb, 0x1b, 0xa0, 0x1d, 0x16, 0x1d,
|
||||
0xa0, 0x20, 0x10, 0x20, 0xa0, 0x20, 0x10, 0x20, 0xa0, 0x1f, 0x12, 0x1f,
|
||||
0xa0, 0x1c, 0x17, 0x1d, 0xa0, 0x1a, 0xc, 0x4, 0xb, 0x1b, 0xa0, 0x18,
|
||||
0xc, 0x8, 0xc, 0x18, 0xa0, 0x16, 0xb, 0xf, 0xa, 0x16, 0xa0, 0x13,
|
||||
0xc, 0x12, 0xc, 0x13, 0xa0, 0x11, 0xc, 0x16, 0xb, 0x12, 0xa0, 0xf,
|
||||
0xc, 0x1a, 0xc, 0xf, 0xa0, 0xd, 0xb, 0x20, 0xb, 0xd, 0xa0, 0xa,
|
||||
0xc, 0x24, 0xc, 0xa, 0xa0, 0x8, 0xb, 0x2a, 0xb, 0x8, 0xa0, 0x6,
|
||||
0xb, 0x2e, 0xb, 0x6, 0xa0, 0x4, 0xb, 0x32, 0xb, 0x4, 0xa0, 0x1,
|
||||
0xc, 0x36, 0xc, 0x1, 0xaa, 0x3c, 0xb2, 0x40, 0xa0, 0x2, 0xd, 0x42,
|
||||
0xc, 0x2, 0x92, 0x3, 0xd, 0x3e, 0xd, 0x3, 0x93, 0x5, 0xc, 0x3a,
|
||||
0xc, 0x5, 0x94, 0x7, 0xc, 0x36, 0xc, 0x7, 0x95, 0x9, 0xb, 0x31,
|
||||
0xc, 0x9, 0x96, 0xb, 0xc, 0x2c, 0xc, 0xb, 0x96, 0xe, 0xb, 0x28,
|
||||
0xb, 0xd, 0x98, 0xf, 0xc, 0x22, 0xc, 0xf, 0x98, 0x12, 0xb, 0x1e,
|
||||
0xb, 0x12, 0x99, 0x13, 0xb, 0x19, 0xc, 0x13, 0x9a, 0x15, 0xb, 0x15,
|
||||
0xc, 0x15, 0x9b, 0x17, 0xb, 0x10, 0xb, 0x17, 0x9c, 0x19, 0xb, 0xc,
|
||||
0xb, 0x19, 0x9c, 0x1b, 0xc, 0x6, 0xc, 0x1a, 0x9e, 0x1d, 0xb, 0x2,
|
||||
0xb, 0x1d, 0x9e, 0x1f, 0x14, 0x1f, 0x9f, 0x21, 0xf, 0x20, 0xa0, 0x20,
|
||||
0x10, 0x20, 0xa1, 0x1e, 0x12, 0x1e, 0xa2, 0x1b, 0xb, 0x2, 0xb, 0x1b,
|
||||
0xa3, 0x18, 0xa, 0x7, 0xb, 0x18, 0xa4, 0x15, 0xc, 0xa, 0xb, 0x16,
|
||||
0xa4, 0x14, 0xa, 0x10, 0xa, 0x14, 0xa5, 0x10, 0xb, 0x14, 0xb, 0x10,
|
||||
0xa6, 0xe, 0xa, 0x1a, 0xa, 0xe, 0xa7, 0xa, 0xb, 0x1e, 0xb, 0xa,
|
||||
0xa8, 0x8, 0xb, 0x22, 0xb, 0x8, 0xa9, 0x5, 0xb, 0x26, 0xb, 0x5,
|
||||
0xaa, 0x3, 0xa, 0x2c, 0xa, 0x3, 0xb5, 0x30, 0xbe, 0x34, 0xba, 0x38,
|
||||
0xb7, 0x3a, 0xb8, 0x36, 0xbc, 0x32, 0xc0, 0x2e, 0xc4, 0x2a, 0xc9, 0x24,
|
||||
0xce, 0x20, 0xd2, 0x1c, 0xd6, 0x18, 0xdb, 0x12, 0xe0, 0xe, 0xe4, 0xa,
|
||||
0xe8, 0x6, 0xea, 0x6, 0xea, 0x6, 0xea, 0x6, 0xea, 0x6, 0xea, 0x6,
|
||||
0xea, 0x6, 0xea, 0x6, 0xea, 0x6, 0xea, 0x6, 0xea, 0x6, 0xea, 0x6,
|
||||
0xea, 0x6, 0xea, 0x6, 0xea, 0x6, 0x52, 0x6, 0xe7, 0xc, 0xe2, 0x10,
|
||||
0xde, 0x14, 0xdb, 0x16, 0xd9, 0x18, 0xd7, 0x1a, 0xd5, 0x1c, 0xd4, 0xb,
|
||||
0x3, 0xe, 0xd3, 0xc, 0x4, 0xe, 0xd2, 0xc, 0x6, 0xc, 0xd1, 0xd,
|
||||
0x7, 0xc, 0xd0, 0xd, 0x8, 0xb, 0xd0, 0xd, 0x9, 0xa, 0xd0, 0xd,
|
||||
0x4, 0x1, 0x6, 0x8, 0xd0, 0xd, 0x4, 0x2, 0x6, 0x7, 0xd0, 0xd,
|
||||
0x4, 0x3, 0x6, 0x6, 0xd0, 0x6, 0x3, 0x4, 0x4, 0x4, 0x5, 0x6,
|
||||
0xd0, 0x6, 0x4, 0x3, 0x4, 0x3, 0x6, 0x6, 0xd0, 0x6, 0x6, 0x1,
|
||||
0x4, 0x2, 0x6, 0x7, 0xd0, 0x7, 0xa, 0x1, 0x6, 0x8, 0xd0, 0x8,
|
||||
0xf, 0x9, 0xd0, 0xa, 0xb, 0xb, 0xd0, 0xb, 0x9, 0xc, 0xd0, 0xc,
|
||||
0x7, 0xd, 0xd0, 0xc, 0x7, 0xd, 0xd0, 0xb, 0x9, 0xc, 0xd0, 0xa,
|
||||
0xb, 0xb, 0xd0, 0x8, 0xf, 0x9, 0xd0, 0x7, 0xa, 0x1, 0x6, 0x8,
|
||||
0xd0, 0x6, 0x6, 0x1, 0x4, 0x2, 0x6, 0x7, 0xd0, 0x6, 0x4, 0x3,
|
||||
0x4, 0x3, 0x6, 0x6, 0xd0, 0x6, 0x3, 0x4, 0x4, 0x4, 0x5, 0x6,
|
||||
0xd0, 0xd, 0x4, 0x3, 0x6, 0x6, 0xd0, 0xd, 0x4, 0x2, 0x6, 0x7,
|
||||
0xd0, 0xd, 0x4, 0x1, 0x6, 0x8, 0xd0, 0xd, 0x9, 0xa, 0xd0, 0xd,
|
||||
0x8, 0xb, 0xd0, 0xd, 0x7, 0xc, 0xd1, 0xc, 0x6, 0xc, 0xd2, 0xc,
|
||||
0x4, 0xe, 0xd3, 0xb, 0x3, 0xe, 0xd4, 0x1c, 0xd5, 0x1a, 0xd7, 0x18,
|
||||
0xd9, 0x16, 0xdb, 0x14, 0xde, 0x10, 0xe2, 0xc, 0xe7, 0x6, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0,
|
||||
0xff, 0x0, 0xff, 0x0, 0x85,
|
||||
};
|
||||
#endif
|
||||
|
||||
// draw 240 x 240
|
||||
st7789_send(CASET, (uint8_t *) "\x00\x00\x00\xef", 4);
|
||||
st7789_send(RASET, (uint8_t *) "\x00\x00\x00\xef", 4);
|
||||
st7789_send(RAMWR, NULL, 0);
|
||||
|
||||
int y = 0;
|
||||
uint16_t bp = 0;
|
||||
uint16_t fg = 0xffff;
|
||||
const uint16_t bg = 0;
|
||||
uint16_t color = bg;
|
||||
|
||||
for (int i=0; i<sizeof(rle); i++) {
|
||||
uint8_t rl = rle[i];
|
||||
while (rl) {
|
||||
linebuffer[bp] = color >> 8;
|
||||
linebuffer[bp+1] = color & 0xff;
|
||||
bp += 2;
|
||||
rl -= 1;
|
||||
|
||||
if (bp >= sizeof(linebuffer)) {
|
||||
/* currently we have a single image which we clip to show different modes */
|
||||
if (topclip) {
|
||||
if (y < 48) {
|
||||
memset(linebuffer, 0, sizeof(linebuffer));
|
||||
} else if (y < 76) {
|
||||
#ifdef BUTTON_ON_RIGHT
|
||||
memset(linebuffer+2*(240-54), 0, 54*2);
|
||||
#else
|
||||
memset(linebuffer, 0, 64*2);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (bottomclip) {
|
||||
memset(linebuffer+2*(240-64), 0, 64*2);
|
||||
} else if (y == 179 && state == STATE_BLE_CONNECTED) {
|
||||
fg = 0x18ff;
|
||||
}
|
||||
|
||||
st7789_send(NOP, linebuffer, sizeof(linebuffer));
|
||||
bp = 0;
|
||||
y += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (color == bg)
|
||||
color = fg;
|
||||
else
|
||||
color = bg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void st7789_init(void)
|
||||
{
|
||||
nrf_gpio_pin_set(DISP_SS);
|
||||
nrf_gpio_cfg_output(DISP_SS);
|
||||
spi_init();
|
||||
|
||||
nrf_gpio_cfg_output(DISP_DC);
|
||||
|
||||
/* deliver a reset */
|
||||
nrf_gpio_pin_clear(DISP_RESET);
|
||||
nrf_gpio_cfg_output(DISP_RESET);
|
||||
NRFX_DELAY_MS(10);
|
||||
nrf_gpio_pin_set(DISP_RESET);
|
||||
NRFX_DELAY_MS(125);
|
||||
|
||||
/* initialize the display */
|
||||
st7789_send(SLPOUT, NULL, 0);
|
||||
NRFX_DELAY_MS(10);
|
||||
for (const struct st7789_cmd *i = st7789_init_data; i->cmd != NOP; i++)
|
||||
st7789_send(i->cmd, i->data, i->len);
|
||||
|
||||
/* draw the initial screen content. this will take ~116ms so, with the
|
||||
* delay after the SLPOUT we will have complete the SLPOUT/SLPIN lock
|
||||
* out period during the update.
|
||||
*/
|
||||
st7789_state(STATE_BOOTLOADER_STARTED);
|
||||
|
||||
|
||||
/* enable the display and light the backlight */
|
||||
st7789_send(DISPON, NULL, 0);
|
||||
nrf_gpio_pin_clear(BACKLIGHT);
|
||||
nrf_gpio_cfg_output(BACKLIGHT);
|
||||
}
|
||||
|
||||
void st7789_teardown(void)
|
||||
{
|
||||
nrf_gpio_cfg_default(DISP_DC);
|
||||
nrf_gpio_cfg_default(DISP_RESET);
|
||||
nrf_gpio_cfg_default(BACKLIGHT);
|
||||
|
||||
spi_teardown();
|
||||
nrf_gpio_cfg_default(DISP_SS);
|
||||
}
|
||||
#endif
|
||||
|
||||
void wdt_init(void)
|
||||
{
|
||||
// 1 => keep running during a sleep, stop during SWD debug
|
||||
// 9 => run during sleep and SWD debug (e.g. most robust but
|
||||
// makes debugger attachment difficult)
|
||||
nrf_wdt_behaviour_set(NRF_WDT, 9);
|
||||
|
||||
// timeout after 5 seconds
|
||||
nrf_wdt_reload_value_set(NRF_WDT, 5 * 32768);
|
||||
|
||||
// enable the 0th channel
|
||||
nrf_wdt_reload_request_enable(NRF_WDT, NRF_WDT_RR0);
|
||||
|
||||
// set it running
|
||||
nrf_wdt_task_trigger(NRF_WDT, NRF_WDT_TASK_START);
|
||||
}
|
||||
|
|
17
src/boards.h
17
src/boards.h
|
@ -32,12 +32,17 @@
|
|||
|
||||
#include "board.h"
|
||||
|
||||
#ifndef BUTTON_DFU
|
||||
#if !defined(BUTTON_DFU) && BUTTONS_NUMBER > 0
|
||||
#define BUTTON_DFU BUTTON_1
|
||||
#endif
|
||||
#ifndef BUTTON_FRESET
|
||||
|
||||
#if !defined(BUTTON_FRESET) && BUTTONS_NUMBER > 1
|
||||
#define BUTTON_FRESET BUTTON_2
|
||||
#endif
|
||||
#ifndef BUTTON_ACTIVE
|
||||
/* default to active-low signals */
|
||||
#define BUTTON_ACTIVE 0
|
||||
#endif
|
||||
|
||||
// The primary LED is usually Red but not in all cases.
|
||||
#define LED_PRIMARY 0
|
||||
|
@ -55,6 +60,8 @@
|
|||
#define BOARD_RGB_BRIGHTNESS 0x101010
|
||||
#endif
|
||||
|
||||
#define BOARD_MAGIC_FORCE_APP_BOOT 0x65
|
||||
|
||||
// Helper function
|
||||
#define memclr(buffer, size) memset(buffer, 0, size)
|
||||
#define varclr(_var) memclr(_var, sizeof(*(_var)))
|
||||
|
@ -90,16 +97,14 @@ void led_tick(void);
|
|||
//--------------------------------------------------------------------+
|
||||
// BUTTONS
|
||||
//--------------------------------------------------------------------+
|
||||
// Make sure we have at least two buttons (DFU + FRESET since DFU+FRST=OTA)
|
||||
#if BUTTONS_NUMBER < 2
|
||||
#error "At least two buttons required in the BSP (see 'BUTTONS_NUMBER')"
|
||||
#endif
|
||||
|
||||
void button_init(uint32_t pin);
|
||||
bool button_pressed(uint32_t pin);
|
||||
|
||||
bool is_ota(void);
|
||||
|
||||
void wdt_init(void);
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// DEBUG
|
||||
//--------------------------------------------------------------------+
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Uri Shaked
|
||||
* Copyright (c) 2019 Benjamin Meisels
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _ARAMCON_BADGE_2019_H
|
||||
#define _ARAMCON_BADGE_2019_H
|
||||
|
||||
#define _PINNUM(port, pin) ((port)*32 + (pin))
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 1
|
||||
#define LED_PRIMARY_PIN _PINNUM(1, 11) // Red
|
||||
|
||||
#define LED_NEOPIXEL _PINNUM(0, 8)
|
||||
#define NEOPIXELS_NUMBER 4
|
||||
#define BOARD_RGB_BRIGHTNESS 0x040404
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 2
|
||||
#define BUTTON_1 _PINNUM(0, 2) // left Button
|
||||
#define BUTTON_2 _PINNUM(0, 29) // middle button
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER _PINNUM(0, 28) // SDA
|
||||
#define TX_PIN_NUMBER _PINNUM(0, 3) // SCL
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "ARAMCON Badge Team"
|
||||
#define BLEDIS_MODEL "ARAMCON Badge 2019"
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// USB
|
||||
//--------------------------------------------------------------------+
|
||||
#define USB_DESC_VID 0x239A
|
||||
#define USB_DESC_UF2_PID 0x0079
|
||||
#define USB_DESC_CDC_ONLY_PID 0x0079
|
||||
|
||||
//------------- UF2 -------------//
|
||||
#define UF2_PRODUCT_NAME "ARAMCON Badge 2019"
|
||||
#define UF2_VOLUME_LABEL "ARAMBOOT"
|
||||
#define UF2_BOARD_ID "nrf52840-ARAMCON-Badge-2019"
|
||||
#define UF2_INDEX_URL "https://github.com/aramcon-badge"
|
||||
|
||||
#endif // _ARAMCON_BADGE_2019_H
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _ARDUINOBLE33_NRF52840_H
|
||||
#define _ARDUINOBLE33_NRF52840_H
|
||||
|
||||
#define _PINNUM(port, pin) ((port)*32 + (pin))
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 1 // red LED
|
||||
#define LED_PRIMARY_PIN _PINNUM(0, 24)
|
||||
#define LED_STATE_ON 0
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 2
|
||||
#define BUTTON_1 _PINNUM(1, 11) // D2 switch
|
||||
#define BUTTON_2 _PINNUM(1, 12) // D3 switch
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER _PINNUM(1, 10)
|
||||
#define TX_PIN_NUMBER _PINNUM(1, 3)
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "Arduino"
|
||||
#define BLEDIS_MODEL "Nano 33 BLE"
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// USB
|
||||
//--------------------------------------------------------------------+
|
||||
#define USB_DESC_VID 0x239A
|
||||
#define USB_DESC_UF2_PID 0x0063
|
||||
#define USB_DESC_CDC_ONLY_PID 0x0064
|
||||
|
||||
//------------- UF2 -------------//
|
||||
#define UF2_PRODUCT_NAME "Arduino Nano 33 BLE"
|
||||
#define UF2_VOLUME_LABEL "NANO33BOOT"
|
||||
#define UF2_BOARD_ID "nRF52840-Nano-33"
|
||||
#define UF2_INDEX_URL "https://www.arduino.cc/"
|
||||
|
||||
#endif // _ITSY_NRF52840_H
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -47,7 +47,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLDOWN
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER _PINNUM(0, 30)
|
||||
#define TX_PIN_NUMBER _PINNUM(0, 14)
|
||||
|
@ -70,6 +70,6 @@
|
|||
#define UF2_PRODUCT_NAME "Adafruit Circuit Playground nRF52840"
|
||||
#define UF2_VOLUME_LABEL "CPLAYBTBOOT"
|
||||
#define UF2_BOARD_ID "nRF52840-CircuitPlayground-revD"
|
||||
#define UF2_INDEX_URL "https://www.adafruit.com/product/4300"
|
||||
#define UF2_INDEX_URL "https://www.adafruit.com/product/4333"
|
||||
|
||||
#endif // _CPLAY_NRF52840_H
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _CLUE_NRF52840_H
|
||||
#define _CLUE_NRF52840_H
|
||||
|
||||
#define _PINNUM(port, pin) ((port)*32 + (pin))
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 1
|
||||
#define LED_PRIMARY_PIN _PINNUM(1, 01)
|
||||
#define LED_STATE_ON 1
|
||||
|
||||
#define LED_NEOPIXEL _PINNUM(0, 16)
|
||||
#define NEOPIXELS_NUMBER 1
|
||||
#define BOARD_RGB_BRIGHTNESS 0x040404
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 2
|
||||
#define BUTTON_1 _PINNUM(1, 02) // left button
|
||||
#define BUTTON_2 _PINNUM(1, 10) // right button
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER _PINNUM(0, 09)
|
||||
#define TX_PIN_NUMBER _PINNUM(0, 10)
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "Adafruit Industries"
|
||||
#define BLEDIS_MODEL "Clue nRF52840"
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// USB
|
||||
//--------------------------------------------------------------------+
|
||||
#define USB_DESC_VID 0x239A
|
||||
#define USB_DESC_UF2_PID 0x0071
|
||||
#define USB_DESC_CDC_ONLY_PID 0x0071
|
||||
|
||||
//------------- UF2 -------------//
|
||||
#define UF2_PRODUCT_NAME "Adafruit Clue nRF52840"
|
||||
#define UF2_VOLUME_LABEL "CLUEBOOT"
|
||||
#define UF2_BOARD_ID "nRF52840-Clue-revA"
|
||||
#define UF2_INDEX_URL "https://www.adafruit.com/"
|
||||
|
||||
#endif // _CLUE_NRF52840_H
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _DSD6_NRF52832_H
|
||||
#define _DSD6_NRF52832_H
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 0
|
||||
//#define LED_PRIMARY_PIN 9 // Red
|
||||
//#define LED_SECONDARY_PIN 10 // Blue
|
||||
#define LED_STATE_ON 1
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 1
|
||||
#define BUTTON_1 30
|
||||
//#define BUTTON_2 31
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 22
|
||||
#define TX_PIN_NUMBER 23
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "Desay"
|
||||
#define BLEDIS_MODEL "DS-D6"
|
||||
|
||||
#endif // _DSD6_NRF52832_H
|
|
@ -0,0 +1,2 @@
|
|||
# nrf52 is nrf52832
|
||||
MCU_SUB_VARIANT = nrf52
|
|
@ -48,7 +48,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 7
|
||||
#define TX_PIN_NUMBER 8
|
||||
|
@ -67,24 +67,4 @@
|
|||
#define USB_DESC_VID 0x239A
|
||||
#define USB_DESC_UF2_PID 0x003B
|
||||
|
||||
#define USB_STRING_DESCRIPTORS { \
|
||||
/* 0: is supported language = English */ \
|
||||
TUD_DESC_STRCONV(0x0409), \
|
||||
\
|
||||
/* 1: Manufacturer */ \
|
||||
TUD_DESC_STRCONV('E','l','e','c','t','r','o','n','u','t',' ','L','a','b','s'), \
|
||||
\
|
||||
/* 2: Product */ \
|
||||
TUD_DESC_STRCONV('P','a','p','y','r', ' ', 'D','F','U'), \
|
||||
\
|
||||
/* 3: Serials TODO use chip ID */ \
|
||||
usb_desc_str_serial, \
|
||||
\
|
||||
/* 4: CDC Interface */ \
|
||||
TUD_DESC_STRCONV('P','a','p','y','r',' ','S','e','r','i','a','l'), \
|
||||
\
|
||||
/* 5: MSC Interface */ \
|
||||
TUD_DESC_STRCONV('P','a','p','y','r',' ','U','F','2'), \
|
||||
}
|
||||
|
||||
#endif // PPAPYR_H
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -42,7 +42,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
|
@ -51,10 +51,10 @@
|
|||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "Adafruit Industries"
|
||||
#define BLEDIS_MODEL "Feather nRF52832"
|
||||
#define BLEDIS_MANUFACTURER "Adafruit Industries"
|
||||
#define BLEDIS_MODEL "Feather nRF52832"
|
||||
|
||||
#define UF2_PRODUCT_NAME "Adafruit Feather nRF52832"
|
||||
#define UF2_INDEX_URL "https://www.adafruit.com/product/3406"
|
||||
#define UF2_PRODUCT_NAME "Adafruit Feather nRF52832"
|
||||
#define UF2_INDEX_URL "https://www.adafruit.com/product/3406"
|
||||
|
||||
#endif // _FEATHER_NRF52832_H
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
# nrf52 is nrf52832
|
||||
MCU_SUB_VARIANT = nrf52
|
|
@ -48,7 +48,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
|
@ -56,7 +56,9 @@
|
|||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
//--------------------------------------------------------------------+
|
||||
// BLE OTA
|
||||
//--------------------------------------------------------------------+
|
||||
#define BLEDIS_MANUFACTURER "Adafruit Industries"
|
||||
#define BLEDIS_MODEL "Feather nRF52840 Express"
|
||||
|
||||
|
@ -68,9 +70,9 @@
|
|||
#define USB_DESC_CDC_ONLY_PID 0x002A
|
||||
|
||||
//------------- UF2 -------------//
|
||||
#define UF2_PRODUCT_NAME "Adafruit Feather nRF52840 Express"
|
||||
#define UF2_VOLUME_LABEL "FTHR840BOOT"
|
||||
#define UF2_BOARD_ID "nRF52840-Feather-revD"
|
||||
#define UF2_INDEX_URL "https://www.adafruit.com/product/4062"
|
||||
#define UF2_PRODUCT_NAME "Adafruit Feather nRF52840 Express"
|
||||
#define UF2_VOLUME_LABEL "FTHR840BOOT"
|
||||
#define UF2_BOARD_ID "nRF52840-Feather-revD"
|
||||
#define UF2_INDEX_URL "https://www.adafruit.com/product/4062"
|
||||
|
||||
#endif // _FEATHER_NRF52840_H
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -47,7 +47,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER _PINNUM(0, 25)
|
||||
#define TX_PIN_NUMBER _PINNUM(0, 24)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _K9_NRF52832_H
|
||||
#define _K9_NRF52832_H
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 0
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 1
|
||||
#define BUTTON_1 9
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_NOPULL
|
||||
#define BUTTON_ACTIVE 1
|
||||
//#define BUTTON_ENABLE 10
|
||||
#define BUTTON_ON_RIGHT
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER UART_PIN_DISCONNECTED
|
||||
#define TX_PIN_NUMBER UART_PIN_DISCONNECTED
|
||||
#define CTS_PIN_NUMBER UART_PIN_DISCONNECTED
|
||||
#define RTS_PIN_NUMBER UART_PIN_DISCONNECTED
|
||||
#define HWFC false
|
||||
|
||||
#define ST7789_SPI_DISPLAY
|
||||
#define BACKLIGHT_PIN_NUMBER 22
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "Senbono"
|
||||
#define BLEDIS_MODEL "K9"
|
||||
#define BLEDIS_DEVICE_NAME "K9DFU"
|
||||
|
||||
#endif // _K9_NRF52832_H
|
|
@ -0,0 +1,2 @@
|
|||
# nrf52 is nrf52832
|
||||
MCU_SUB_VARIANT = nrf52
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -48,7 +48,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _NITROGEN_NRF52832_H
|
||||
#define _NITROGEN_NRF52832_H
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 2
|
||||
#define LED_PRIMARY_PIN 29 // Red
|
||||
#define LED_SECONDARY_PIN 28 // Blue
|
||||
#define LED_STATE_ON 1
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 1
|
||||
#define BUTTON_1 27
|
||||
//#define BUTTON_2 19 // GPIO-L
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 15
|
||||
#define TX_PIN_NUMBER 13
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "96Boards"
|
||||
#define BLEDIS_MODEL "Nitrogen"
|
||||
#define BLEDIS_DEVICE_NAME "NitroDFU"
|
||||
|
||||
#endif // _NITROGEN_NRF52832_H
|
|
@ -0,0 +1,2 @@
|
|||
# nrf52 is nrf52832
|
||||
MCU_SUB_VARIANT = nrf52
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
* Copyright (c) 2020 Michael Welling
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _OHS2020_BADGE_H
|
||||
#define _OHS2020_BADGE_H
|
||||
|
||||
#define _PINNUM(port, pin) ((port)*32 + (pin))
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 1
|
||||
#define LED_PRIMARY_PIN _PINNUM(0, 04) // fake LED since we have none
|
||||
#define LED_STATE_ON 1
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 2
|
||||
#define BUTTON_1 _PINNUM(0, 29) // SW2
|
||||
#define BUTTON_2 _PINNUM(0, 03) // SW1
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER _PINNUM(0, 09)
|
||||
#define TX_PIN_NUMBER _PINNUM(0, 10)
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "OSHWA"
|
||||
#define BLEDIS_MODEL "OHS2020 Badge"
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// USB
|
||||
//--------------------------------------------------------------------+
|
||||
#define USB_DESC_VID 0x239A
|
||||
#define USB_DESC_UF2_PID 0x007F
|
||||
#define USB_DESC_CDC_ONLY_PID 0x007F
|
||||
|
||||
//------------- UF2 -------------//
|
||||
#define UF2_PRODUCT_NAME "OHS2020 Badge"
|
||||
#define UF2_VOLUME_LABEL "BADGEBOOT"
|
||||
#define UF2_BOARD_ID "OHS2020-Badge-revA"
|
||||
#define UF2_INDEX_URL "https://2020.oshwa.org/"
|
||||
|
||||
#endif // _OHS2020_BADGE_H
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _P8_NRF52832_H
|
||||
#define _P8_NRF52832_H
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 0
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 1
|
||||
#define BUTTON_1 17
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_NOPULL
|
||||
#define BUTTON_ACTIVE 1
|
||||
#define BUTTON_ON_RIGHT
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 15 /* not connected */
|
||||
#define TX_PIN_NUMBER 11
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
#define ST7789_SPI_DISPLAY
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "COLMI P8"
|
||||
#define BLEDIS_MODEL "P8"
|
||||
#define BLEDIS_DEVICE_NAME "P8DFU"
|
||||
|
||||
#endif // _P8_NRF52832_H
|
|
@ -0,0 +1,2 @@
|
|||
# nrf52 is nrf52832
|
||||
MCU_SUB_VARIANT = nrf52
|
|
@ -48,7 +48,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -48,7 +48,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -48,7 +48,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -42,7 +42,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -45,7 +45,7 @@
|
|||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 20
|
||||
#define TX_PIN_NUMBER 17
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef PCA10100_H
|
||||
#define PCA10100_H
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 2
|
||||
#define LED_PRIMARY_PIN 13
|
||||
#define LED_SECONDARY_PIN 14
|
||||
#define LED_STATE_ON 0
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 2
|
||||
#define BUTTON_1 11
|
||||
#define BUTTON_2 12
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "Nordic"
|
||||
#define BLEDIS_MODEL "PCA10100"
|
||||
|
||||
#define UF2_PRODUCT_NAME "Nordic nRF52833 DK"
|
||||
#define UF2_BOARD_ID "nRF52833-pca10100-v1"
|
||||
#define UF2_INDEX_URL "https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52833-DK"
|
||||
|
||||
#endif // PCA10100_H
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52833
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _PINETIME_NRF52832_H
|
||||
#define _PINETIME_NRF52832_H
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 0
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 1
|
||||
#define BUTTON_1 13
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_NOPULL
|
||||
#define BUTTON_ACTIVE 1
|
||||
#define BUTTON_ENABLE 15
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 17 /* not connected */
|
||||
#define TX_PIN_NUMBER 11
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
#define ST7789_SPI_DISPLAY
|
||||
|
||||
// Used as model string in OTA mode
|
||||
#define BLEDIS_MANUFACTURER "Pine64"
|
||||
#define BLEDIS_MODEL "PineTime"
|
||||
#define BLEDIS_DEVICE_NAME "PineDFU"
|
||||
|
||||
#endif // _PINETIME_NRF52832_H
|
|
@ -0,0 +1,2 @@
|
|||
# nrf52 is nrf52832
|
||||
MCU_SUB_VARIANT = nrf52
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Ha Thach for Adafruit Industries
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef RAYTAC_MDBT50Q_RX_H
|
||||
#define RAYTAC_MDBT50Q_RX_H
|
||||
|
||||
#define _PINNUM(port, pin) ((port)*32 + (pin))
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* LED
|
||||
*------------------------------------------------------------------*/
|
||||
#define LEDS_NUMBER 1
|
||||
#define LED_PRIMARY_PIN _PINNUM(1, 13)
|
||||
#define LED_STATE_ON 0
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* BUTTON
|
||||
*------------------------------------------------------------------*/
|
||||
#define BUTTONS_NUMBER 2
|
||||
|
||||
#define BUTTON_1 _PINNUM(0, 15)
|
||||
#define BUTTON_2 _PINNUM(0, 10)
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* UART (only used by nRF52832) (only used by nRF52832)
|
||||
*------------------------------------------------------------------*/
|
||||
#define RX_PIN_NUMBER 8
|
||||
#define TX_PIN_NUMBER 6
|
||||
#define CTS_PIN_NUMBER 0
|
||||
#define RTS_PIN_NUMBER 0
|
||||
#define HWFC false
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// BLE OTA
|
||||
//--------------------------------------------------------------------+
|
||||
#define BLEDIS_MANUFACTURER "Raytac"
|
||||
#define BLEDIS_MODEL "MDBT50Q-RX"
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// USB
|
||||
//--------------------------------------------------------------------+
|
||||
#define USB_DESC_VID 0x239A
|
||||
#define USB_DESC_UF2_PID 0x0029
|
||||
#define USB_DESC_CDC_ONLY_PID 0x002A
|
||||
|
||||
//------------- UF2 -------------//
|
||||
#define UF2_PRODUCT_NAME "Raytac MDBT50Q-RX"
|
||||
#define UF2_VOLUME_LABEL "MDBT50QBOOT"
|
||||
#define UF2_BOARD_ID "nRF52840-MDBT50Q_RX-verD"
|
||||
#define UF2_INDEX_URL "https://www.raytac.com/product/ins.php?index_id=89"
|
||||
|
||||
#endif // RAYTAC_MDBT50Q_RX_H
|
|
@ -0,0 +1 @@
|
|||
MCU_SUB_VARIANT = nrf52840
|
|
@ -83,7 +83,7 @@
|
|||
*/
|
||||
#define ADAFRUIT_DEVICE_TYPE 0x0052
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
#if defined(NRF52840_XXAA) || defined(NRF52833_XXAA)
|
||||
#define ADAFRUIT_DEV_REV 52840
|
||||
#elif defined NRF52832_XXAA
|
||||
#define ADAFRUIT_DEV_REV 0xADAF
|
||||
|
|
|
@ -44,9 +44,9 @@ void flash_nrf5x_flush (bool need_erase)
|
|||
// - nRF52840 dfu serial/uf2 are USB-based which are DMA and should have no problems.
|
||||
//
|
||||
// Note: MSC uf2 does not erase page in advance like dfu serial
|
||||
if ( need_erase ) nrf_nvmc_page_erase(_fl_addr);
|
||||
if ( need_erase ) nrfx_nvmc_page_erase(_fl_addr);
|
||||
|
||||
nrf_nvmc_write_words(_fl_addr, (uint32_t *) _fl_buf, FLASH_PAGE_SIZE / 4);
|
||||
nrfx_nvmc_words_write(_fl_addr, (uint32_t *) _fl_buf, FLASH_PAGE_SIZE / 4);
|
||||
}
|
||||
|
||||
_fl_addr = FLASH_CACHE_INVALID_ADDR;
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "nrf_nvmc.h"
|
||||
#include "nrfx_nvmc.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
/* Linker script to configure memory regions. */
|
||||
|
||||
SEARCH_DIR(.)
|
||||
GROUP(-lgcc -lc -lnosys)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
/** Flash start address for the bootloader. This setting will also be stored in UICR to allow the
|
||||
* MBR to init the bootloader when starting the system. This value must correspond to
|
||||
* BOOTLOADER_REGION_START found in dfu_types.h. The system is prevented from starting up if
|
||||
* those values do not match. The check is performed in main.c, see
|
||||
* APP_ERROR_CHECK_BOOL(*((uint32_t *)NRF_UICR_BOOT_START_ADDRESS) == BOOTLOADER_REGION_START);
|
||||
*/
|
||||
FLASH (rx) : ORIGIN = 0x74000, LENGTH = 0x7E000-0x74000 /* 40 KB */
|
||||
|
||||
/** Location of mbr params page in flash. */
|
||||
MBR_PARAMS_PAGE (rw) : ORIGIN = 0x0007E000, LENGTH = 0x1000
|
||||
|
||||
/** Location of bootloader setting in flash. */
|
||||
BOOTLOADER_SETTINGS (rw) : ORIGIN = 0x0007F000, LENGTH = 0x1000
|
||||
|
||||
|
||||
|
||||
/** RAM Region for bootloader. */
|
||||
/* Avoid conflict with NOINIT for OTA bond sharing */
|
||||
RAM (rwx) : ORIGIN = 0x20008000, LENGTH = 0x20020000-0x20008000
|
||||
|
||||
/* Location for double reset detection, no init */
|
||||
DBL_RESET (rwx) : ORIGIN = 0x20007F7C, LENGTH = 0x04
|
||||
|
||||
/** Location of non initialized RAM. Non initialized RAM is used for exchanging bond information
|
||||
* from application to bootloader when using buttonluss DFU OTA. */
|
||||
NOINIT (rwx) : ORIGIN = 0x20007F80, LENGTH = 0x80
|
||||
|
||||
|
||||
|
||||
/** Location in UICR where bootloader start address is stored. */
|
||||
UICR_BOOTLOADER (r) : ORIGIN = 0x10001014, LENGTH = 0x04
|
||||
|
||||
/** Location in UICR where mbr params page address is stored. */
|
||||
UICR_MBR_PARAM_PAGE(r) : ORIGIN = 0x10001018, LENGTH = 0x04
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.fs_data_out ALIGN(4):
|
||||
{
|
||||
PROVIDE( __start_fs_data = .);
|
||||
KEEP(*(fs_data))
|
||||
PROVIDE( __stop_fs_data = .);
|
||||
} = 0
|
||||
|
||||
/* Place the bootloader settings page in flash. */
|
||||
.bootloaderSettings(NOLOAD) :
|
||||
{
|
||||
|
||||
} > BOOTLOADER_SETTINGS
|
||||
|
||||
/* Write the bootloader address in UICR. */
|
||||
.uicrBootStartAddress :
|
||||
{
|
||||
KEEP(*(.uicrBootStartAddress))
|
||||
} > UICR_BOOTLOADER
|
||||
|
||||
/* Place the mbr params page in flash. */
|
||||
.mbrParamsPage(NOLOAD) :
|
||||
{
|
||||
|
||||
} > MBR_PARAMS_PAGE
|
||||
|
||||
/* Write the bootloader address in UICR. */
|
||||
.uicrMbrParamsPageAddress :
|
||||
{
|
||||
KEEP(*(.uicrMbrParamsPageAddress))
|
||||
} > UICR_MBR_PARAM_PAGE
|
||||
|
||||
.dbl_reset(NOLOAD) :
|
||||
{
|
||||
|
||||
} > DBL_RESET
|
||||
|
||||
/* No init RAM section in bootloader. Used for bond information exchange. */
|
||||
.noinit(NOLOAD) :
|
||||
{
|
||||
|
||||
} > NOINIT
|
||||
|
||||
/* other placements follow here... */
|
||||
}
|
||||
|
||||
INCLUDE "nrf_common.ld"
|
|
@ -11,7 +11,15 @@ MEMORY
|
|||
* those values do not match. The check is performed in main.c, see
|
||||
* APP_ERROR_CHECK_BOOL(*((uint32_t *)NRF_UICR_BOOT_START_ADDRESS) == BOOTLOADER_REGION_START);
|
||||
*/
|
||||
FLASH (rx) : ORIGIN = 0xF4000, LENGTH = 0xA000 /* 40 KB */
|
||||
FLASH (rx) : ORIGIN = 0xF4000, LENGTH = 0xFE000-0xF4000 /* 40 KB */
|
||||
|
||||
/** Location of mbr params page in flash. */
|
||||
MBR_PARAMS_PAGE (rw) : ORIGIN = 0xFE000, LENGTH = 0x1000
|
||||
|
||||
/** Location of bootloader setting in flash. */
|
||||
BOOTLOADER_SETTINGS (rw) : ORIGIN = 0xFF000, LENGTH = 0x1000
|
||||
|
||||
|
||||
|
||||
/** RAM Region for bootloader. */
|
||||
/* Avoid conflict with NOINIT for OTA bond sharing */
|
||||
|
@ -21,20 +29,14 @@ MEMORY
|
|||
DBL_RESET (rwx) : ORIGIN = 0x20007F7C, LENGTH = 0x04
|
||||
|
||||
/** Location of non initialized RAM. Non initialized RAM is used for exchanging bond information
|
||||
* from application to bootloader when using buttonluss DFU OTA.
|
||||
*/
|
||||
* from application to bootloader when using buttonluss DFU OTA. */
|
||||
NOINIT (rwx) : ORIGIN = 0x20007F80, LENGTH = 0x80
|
||||
|
||||
|
||||
/** Location of bootloader setting in flash. */
|
||||
BOOTLOADER_SETTINGS (rw) : ORIGIN = 0x000FF000, LENGTH = 0x1000
|
||||
|
||||
|
||||
|
||||
/** Location in UICR where bootloader start address is stored. */
|
||||
UICR_BOOTLOADER (r) : ORIGIN = 0x10001014, LENGTH = 0x04
|
||||
|
||||
/** Location of mbr params page in flash. */
|
||||
MBR_PARAMS_PAGE (rw) : ORIGIN = 0x000FE000, LENGTH = 0x1000
|
||||
|
||||
/** Location in UICR where mbr params page address is stored. */
|
||||
UICR_MBR_PARAM_PAGE(r) : ORIGIN = 0x10001018, LENGTH = 0x04
|
||||
}
|
|
@ -11,28 +11,31 @@ MEMORY
|
|||
* those values do not match. The check is performed in main.c, see
|
||||
* APP_ERROR_CHECK_BOOL(*((uint32_t *)NRF_UICR_BOOT_START_ADDRESS) == BOOTLOADER_REGION_START);
|
||||
*/
|
||||
FLASH (rx) : ORIGIN = 0x74000, LENGTH = 0xA000 /* 40 KB */
|
||||
FLASH (rx) : ORIGIN = 0x78000, LENGTH = 0x7E000-0x78000 /* 40 KB */
|
||||
|
||||
/** Location of mbr params page in flash. */
|
||||
MBR_PARAMS_PAGE (rw) : ORIGIN = 0x7E000, LENGTH = 0x1000
|
||||
|
||||
/** Location of bootloader setting in flash. */
|
||||
BOOTLOADER_SETTINGS (rw) : ORIGIN = 0x7F000, LENGTH = 0x1000
|
||||
|
||||
|
||||
|
||||
/** RAM Region for bootloader. */
|
||||
RAM (rwx) : ORIGIN = 0x20003000, LENGTH = 0x20007F7C-0x20003000
|
||||
RAM (rwx) : ORIGIN = 0x20008000, LENGTH = 0x20010000-0x20008000
|
||||
|
||||
/* Location for double reset detection, no init */
|
||||
DBL_RESET (rwx) : ORIGIN = 0x20007F7C, LENGTH = 0x04
|
||||
|
||||
/** Location of non initialized RAM. Non initialized RAM is used for exchanging bond information
|
||||
* from application to bootloader when using buttonluss DFU OTA.
|
||||
*/
|
||||
* from application to bootloader when using buttonluss DFU OTA. */
|
||||
NOINIT (rwx) : ORIGIN = 0x20007F80, LENGTH = 0x80
|
||||
|
||||
/** Location of bootloader setting in flash. */
|
||||
BOOTLOADER_SETTINGS (rw) : ORIGIN = 0x0007F000, LENGTH = 0x1000
|
||||
|
||||
|
||||
/** Location in UICR where bootloader start address is stored. */
|
||||
UICR_BOOTLOADER (r) : ORIGIN = 0x10001014, LENGTH = 0x04
|
||||
|
||||
/** Location of mbr params page in flash. */
|
||||
MBR_PARAMS_PAGE (rw) : ORIGIN = 0x0007E000, LENGTH = 0x1000
|
||||
|
||||
/** Location in UICR where mbr params page address is stored. */
|
||||
UICR_MBR_PARAM_PAGE(r) : ORIGIN = 0x10001018, LENGTH = 0x04
|
||||
}
|
54
src/main.c
54
src/main.c
|
@ -65,10 +65,10 @@
|
|||
#include "pstorage_platform.h"
|
||||
#include "nrf_mbr.h"
|
||||
#include "pstorage.h"
|
||||
#include "nrfx_nvmc.h"
|
||||
|
||||
#include "nrf_nvmc.h"
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
#ifdef NRF_USBD
|
||||
#include "nrf_usbd.h"
|
||||
#include "tusb.h"
|
||||
|
||||
|
@ -103,13 +103,14 @@ void usb_teardown(void);
|
|||
#define DFU_MAGIC_OTA_RESET 0xA8
|
||||
#define DFU_MAGIC_SERIAL_ONLY_RESET 0x4e
|
||||
#define DFU_MAGIC_UF2_RESET 0x57
|
||||
#define DFU_MAGIC_FORCE_APP_BOOT BOARD_MAGIC_FORCE_APP_BOOT // 0x65
|
||||
|
||||
#define DFU_DBL_RESET_MAGIC 0x5A1AD5 // SALADS
|
||||
#define DFU_DBL_RESET_DELAY 500
|
||||
#define DFU_DBL_RESET_DELAY 2000
|
||||
#define DFU_DBL_RESET_MEM 0x20007F7C
|
||||
|
||||
#define BOOTLOADER_VERSION_REGISTER NRF_TIMER2->CC[0]
|
||||
#define DFU_SERIAL_STARTUP_INTERVAL 1000
|
||||
#define DFU_SERIAL_STARTUP_INTERVAL 2000
|
||||
|
||||
// These value must be the same with one in dfu_transport_ble.c
|
||||
#define BLEGAP_EVENT_LENGTH 6
|
||||
|
@ -120,9 +121,12 @@ enum { BLE_CONN_CFG_HIGH_BANDWIDTH = 1 };
|
|||
#define APPDATA_ADDR_START (BOOTLOADER_REGION_START-DFU_APP_DATA_RESERVED)
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
STATIC_ASSERT( APPDATA_ADDR_START == 0xED000);
|
||||
// Flash 1024 KB
|
||||
STATIC_ASSERT( APPDATA_ADDR_START == 0xF4000);
|
||||
|
||||
#else
|
||||
STATIC_ASSERT( APPDATA_ADDR_START == 0x6D000);
|
||||
// Flash 512 KB
|
||||
STATIC_ASSERT( APPDATA_ADDR_START == 0x78000);
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -152,7 +156,9 @@ int main(void)
|
|||
bool sd_inited = (NRF_POWER->GPREGRET == DFU_MAGIC_OTA_APPJUM);
|
||||
|
||||
// Start Bootloader in BLE OTA mode
|
||||
_ota_dfu = (NRF_POWER->GPREGRET == DFU_MAGIC_OTA_APPJUM) || (NRF_POWER->GPREGRET == DFU_MAGIC_OTA_RESET);
|
||||
_ota_dfu = (NRF_POWER->GPREGRET == DFU_MAGIC_OTA_APPJUM) ||
|
||||
(NRF_POWER->GPREGRET == DFU_MAGIC_OTA_RESET) ||
|
||||
(NRF_POWER->RESETREAS & NRF_POWER_RESETREAS_DOG_MASK);
|
||||
|
||||
// Serial only mode
|
||||
bool serial_only_dfu = (NRF_POWER->GPREGRET == DFU_MAGIC_SERIAL_ONLY_RESET);
|
||||
|
@ -161,8 +167,14 @@ int main(void)
|
|||
bool dfu_start = _ota_dfu || serial_only_dfu || (NRF_POWER->GPREGRET == DFU_MAGIC_UF2_RESET) ||
|
||||
(((*dbl_reset_mem) == DFU_DBL_RESET_MAGIC) && (NRF_POWER->RESETREAS & POWER_RESETREAS_RESETPIN_Msk));
|
||||
|
||||
// override the button status (but not GPREGREG or RESETREAS)
|
||||
bool force_app_boot = (NRF_POWER->GPREGRET == DFU_MAGIC_FORCE_APP_BOOT);
|
||||
|
||||
// Clear GPREGRET if it is our values
|
||||
if (dfu_start) NRF_POWER->GPREGRET = 0;
|
||||
if (dfu_start || force_app_boot) {
|
||||
NRF_POWER->GPREGRET = 0;
|
||||
nrf_power_resetreas_clear(NRF_POWER, NRF_POWER_RESETREAS_DOG_MASK);
|
||||
}
|
||||
|
||||
// Save bootloader version to pre-defined register, retrieved by application
|
||||
BOOTLOADER_VERSION_REGISTER = (MK_BOOTLOADER_VERSION);
|
||||
|
@ -188,10 +200,22 @@ int main(void)
|
|||
|
||||
/*------------- Determine DFU mode (Serial, OTA, FRESET or normal) -------------*/
|
||||
// DFU button pressed
|
||||
dfu_start = dfu_start || button_pressed(BUTTON_DFU);
|
||||
#ifdef BUTTON_DFU
|
||||
// DFU button is pressed -> request DFU mode (unless forced to avoid)
|
||||
dfu_start = dfu_start || (!force_app_boot && button_pressed(BUTTON_DFU));
|
||||
#else
|
||||
//
|
||||
// No DFU button so always request DFU mode!
|
||||
dfu_start = dfu_start || !force_app_boot;
|
||||
#endif
|
||||
|
||||
#ifdef BUTTON_FRESET
|
||||
// DFU + FRESET are pressed --> OTA
|
||||
_ota_dfu = _ota_dfu || ( button_pressed(BUTTON_DFU) && button_pressed(BUTTON_FRESET) ) ;
|
||||
#else
|
||||
// No FRESET button so set OTA mode unless a magic reset requested serial mode
|
||||
_ota_dfu = _ota_dfu || !serial_only_dfu;
|
||||
#endif
|
||||
|
||||
bool const valid_app = bootloader_app_is_valid(DFU_BANK_0_REGION_START);
|
||||
|
||||
|
@ -213,6 +237,9 @@ int main(void)
|
|||
// if RST is pressed during this delay --> if will enter dfu
|
||||
NRFX_DELAY_MS(DFU_DBL_RESET_DELAY);
|
||||
#endif
|
||||
} else {
|
||||
/* allow the splash screen to be seen ;-) */
|
||||
NRFX_DELAY_MS(DFU_DBL_RESET_DELAY);
|
||||
}
|
||||
|
||||
(*dbl_reset_mem) = 0;
|
||||
|
@ -243,12 +270,13 @@ int main(void)
|
|||
}
|
||||
}
|
||||
|
||||
#if BUTTONS_NUMBER > 1
|
||||
// Adafruit Factory reset
|
||||
if ( !button_pressed(BUTTON_DFU) && button_pressed(BUTTON_FRESET) )
|
||||
{
|
||||
adafruit_factory_reset();
|
||||
}
|
||||
|
||||
#endif
|
||||
// Reset Board
|
||||
board_teardown();
|
||||
|
||||
|
@ -275,11 +303,11 @@ void adafruit_factory_reset(void)
|
|||
// clear all App Data if any
|
||||
if ( DFU_APP_DATA_RESERVED )
|
||||
{
|
||||
nrf_nvmc_page_erase(APPDATA_ADDR_START);
|
||||
nrfx_nvmc_page_erase(APPDATA_ADDR_START);
|
||||
}
|
||||
|
||||
// Only need to erase the 1st page of Application code to make it invalid
|
||||
nrf_nvmc_page_erase(DFU_BANK_0_REGION_START);
|
||||
nrfx_nvmc_page_erase(DFU_BANK_0_REGION_START);
|
||||
|
||||
// back to normal
|
||||
led_state(STATE_FACTORY_RESET_FINISHED);
|
||||
|
@ -423,7 +451,7 @@ uint32_t proc_soc(void)
|
|||
{
|
||||
pstorage_sys_event_handler(soc_evt);
|
||||
|
||||
#ifdef NRF52840_XXAA
|
||||
#ifdef NRF_USBD
|
||||
extern void tusb_hal_nrf_power_event(uint32_t event);
|
||||
/*------------- usb power event handler -------------*/
|
||||
int32_t usbevt = (soc_evt == NRF_EVT_POWER_USB_DETECTED ) ? NRFX_POWER_USB_EVT_DETECTED:
|
||||
|
|
|
@ -2,13 +2,17 @@
|
|||
#define NRFX_CONFIG_H__
|
||||
|
||||
// Power
|
||||
#define NRFX_POWER_ENABLED 1
|
||||
#define NRFX_POWER_CONFIG_IRQ_PRIORITY 7
|
||||
#define NRFX_POWER_ENABLED 1
|
||||
#define NRFX_POWER_DEFAULT_CONFIG_IRQ_PRIORITY 7
|
||||
|
||||
#define NRFX_CLOCK_ENABLED 0
|
||||
|
||||
#define NRFX_NVMC_ENABLED 1
|
||||
|
||||
// UART
|
||||
#ifdef NRF52832_XXAA
|
||||
#define NRFX_UART_ENABLED 1
|
||||
#define NRFX_UART0_ENABLED 1
|
||||
#define NRFX_UART_ENABLED 1
|
||||
#define NRFX_UART0_ENABLED 1
|
||||
|
||||
#define NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY 7
|
||||
#define NRFX_UART_DEFAULT_CONFIG_HWFC NRF_UART_HWFC_DISABLED
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
* Copyright (C) 2020 Daniel Thompson
|
||||
*/
|
||||
|
||||
#ifndef NPVRAM_H_
|
||||
#define NPVRAM_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
/*! \brief Pseudo Non-Voltatile RAM
|
||||
*
|
||||
* This is a data structure that can be placed in the first available
|
||||
* RAM location. It survives reset but not power down. It can be used
|
||||
* to share information between the bootloader and the main
|
||||
* application.
|
||||
*/
|
||||
struct pnvram {
|
||||
uint32_t header; //!< Validation word - 0x1abe11ed
|
||||
uint32_t offset; //!< Number of seconds since the epoch
|
||||
uint32_t uptime; //!< Device uptime in milliseconds
|
||||
uint32_t reserved[4];
|
||||
uint32_t footer; //!< Validation word - 0x10adab1e
|
||||
};
|
||||
|
||||
#define PNVRAM_HEADER 0x1abe11ed
|
||||
#define PNVRAM_FOOTER 0x10adab1e
|
||||
|
||||
#ifdef NRF52832_XXAA
|
||||
static volatile struct pnvram * const pnvram = (void *) 0x200039c0;
|
||||
#endif
|
||||
|
||||
static inline void pnvram_init(struct pnvram *p)
|
||||
{
|
||||
memset(p, 1, sizeof(*p));
|
||||
|
||||
p->header = PNVRAM_HEADER;
|
||||
p->footer = PNVRAM_FOOTER;
|
||||
}
|
||||
|
||||
static inline bool pnvram_is_valid(volatile struct pnvram * const p)
|
||||
{
|
||||
return p->header == PNVRAM_HEADER && p->footer == PNVRAM_FOOTER;
|
||||
}
|
||||
|
||||
static inline void pnvram_add_ms(volatile struct pnvram * const p, uint32_t ms)
|
||||
{
|
||||
if (pnvram_is_valid(p))
|
||||
p->uptime += ms;
|
||||
}
|
||||
|
||||
#endif /* NPVRAM_H_ */
|
|
@ -66,7 +66,7 @@
|
|||
#define HCI_MEM_POOL_ENABLED 1
|
||||
#define HCI_TX_BUF_SIZE 600 // not used
|
||||
#define HCI_RX_BUF_SIZE 600
|
||||
#define HCI_RX_BUF_QUEUE_SIZE 8 // must be power of 2
|
||||
#define HCI_RX_BUF_QUEUE_SIZE 16 // must be power of 2
|
||||
|
||||
//==========================================================
|
||||
// <e> UART_ENABLED - nrf_drv_uart - UART/UARTE peripheral driver
|
||||
|
|
|
@ -45,38 +45,47 @@ int write_block(uint32_t block_no, uint8_t *data, bool quiet, WriteState *state)
|
|||
// tinyusb callbacks
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
// Invoked when received SCSI_CMD_INQUIRY
|
||||
// Application fill vendor id, product id and revision with string up to 8, 16, 4 characters respectively
|
||||
void tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4])
|
||||
{
|
||||
(void) lun;
|
||||
|
||||
const char vid[] = "Adafruit";
|
||||
const char pid[] = "nRF UF2";
|
||||
const char rev[] = "1.0";
|
||||
|
||||
memcpy(vendor_id , vid, strlen(vid));
|
||||
memcpy(product_id , pid, strlen(pid));
|
||||
memcpy(product_rev, rev, strlen(rev));
|
||||
}
|
||||
|
||||
// Invoked when received Test Unit Ready command.
|
||||
// return true allowing host to read/write this LUN e.g SD card inserted
|
||||
bool tud_msc_test_unit_ready_cb(uint8_t lun)
|
||||
{
|
||||
(void) lun;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Callback invoked when received an SCSI command not in built-in list below
|
||||
// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE
|
||||
// - READ10 and WRITE10 has their own callbacks
|
||||
int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize)
|
||||
{
|
||||
void const* response = NULL;
|
||||
int32_t resplen = 0;
|
||||
memset(buffer, 0, bufsize);
|
||||
uint16_t resplen = 0;
|
||||
|
||||
switch ( scsi_cmd[0] )
|
||||
// most scsi handled is input
|
||||
bool in_xfer = true;
|
||||
|
||||
switch (scsi_cmd[0])
|
||||
{
|
||||
case SCSI_CMD_TEST_UNIT_READY:
|
||||
// Command that host uses to check our readiness before sending other commands
|
||||
resplen = 0;
|
||||
break;
|
||||
|
||||
case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
|
||||
// Host is about to read/write etc ... better not to disconnect disk
|
||||
resplen = 0;
|
||||
break;
|
||||
|
||||
case SCSI_CMD_START_STOP_UNIT:
|
||||
// Host try to eject/safe remove/poweroff us. We could safely disconnect with disk storage, or go into lower power
|
||||
/* scsi_start_stop_unit_t const * start_stop = (scsi_start_stop_unit_t const *) scsi_cmd;
|
||||
// Start bit = 0 : low power mode, if load_eject = 1 : unmount disk storage as well
|
||||
// Start bit = 1 : Ready mode, if load_eject = 1 : mount disk storage
|
||||
start_stop->start;
|
||||
start_stop->load_eject;
|
||||
*/
|
||||
resplen = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
// Set Sense = Invalid Command Operation
|
||||
tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);
|
||||
|
@ -86,13 +95,18 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer,
|
|||
break;
|
||||
}
|
||||
|
||||
// return len must not larger than bufsize
|
||||
if ( resplen > (int32_t)bufsize ) resplen = bufsize;
|
||||
// return resplen must not larger than bufsize
|
||||
if ( resplen > bufsize ) resplen = bufsize;
|
||||
|
||||
// copy response to stack's buffer if any
|
||||
if ( response && resplen )
|
||||
if ( response && (resplen > 0) )
|
||||
{
|
||||
memcpy(buffer, response, resplen);
|
||||
if(in_xfer)
|
||||
{
|
||||
memcpy(buffer, response, resplen);
|
||||
}else
|
||||
{
|
||||
// SCSI output
|
||||
}
|
||||
}
|
||||
|
||||
return resplen;
|
||||
|
@ -161,6 +175,8 @@ void tud_msc_write10_complete_cb(uint8_t lun)
|
|||
}
|
||||
}
|
||||
|
||||
// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size
|
||||
// Application update block count and block size
|
||||
void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size)
|
||||
{
|
||||
(void) lun;
|
||||
|
@ -169,4 +185,26 @@ void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_siz
|
|||
*block_size = 512;
|
||||
}
|
||||
|
||||
// Invoked when received Start Stop Unit command
|
||||
// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage
|
||||
// - Start = 1 : active mode, if load_eject = 1 : load disk storage
|
||||
bool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject)
|
||||
{
|
||||
(void) lun;
|
||||
(void) power_condition;
|
||||
|
||||
if ( load_eject )
|
||||
{
|
||||
if (start)
|
||||
{
|
||||
// load disk storage
|
||||
}else
|
||||
{
|
||||
// unload disk storage
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -58,11 +58,6 @@
|
|||
//------------- Class enabled -------------//
|
||||
#define CFG_TUD_CDC 1
|
||||
#define CFG_TUD_MSC 1
|
||||
#define CFG_TUD_HID_KEYBOARD 0
|
||||
#define CFG_TUD_HID_MOUSE 0
|
||||
#define CFG_TUD_HID_GENERIC 0 // not supported yet
|
||||
#define CFG_TUD_CUSTOM_CLASS 0
|
||||
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* CLASS DRIVER
|
||||
|
@ -72,34 +67,15 @@
|
|||
#define CFG_TUD_CDC_RX_BUFSIZE 1024
|
||||
#define CFG_TUD_CDC_TX_BUFSIZE 1024
|
||||
|
||||
/* TX is sent automatically on every Start of Frame event ~ 1ms.
|
||||
* If not enabled, application must call tud_cdc_flush() periodically
|
||||
* Note: Enabled this could overflow device task, if it does, define
|
||||
* CFG_TUD_TASK_QUEUE_SZ with large value
|
||||
*/
|
||||
#define CFG_TUD_CDC_FLUSH_ON_SOF 0
|
||||
|
||||
// Number of supported Logical Unit Number
|
||||
#define CFG_TUD_MSC_MAXLUN 1
|
||||
|
||||
// Buffer size for each read/write transfer, the more the better
|
||||
#define CFG_TUD_MSC_BUFSIZE (4*1024)
|
||||
|
||||
// Vendor name included in Inquiry response, max 8 bytes
|
||||
#define CFG_TUD_MSC_VENDOR "Adafruit"
|
||||
|
||||
// Product name included in Inquiry response, max 16 bytes
|
||||
#define CFG_TUD_MSC_PRODUCT "Feather nRF52840"
|
||||
|
||||
// Product revision string included in Inquiry response, max 4 bytes
|
||||
#define CFG_TUD_MSC_PRODUCT_REV "1.0"
|
||||
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// USB RAM PLACEMENT
|
||||
//--------------------------------------------------------------------+
|
||||
#define CFG_TUSB_ATTR_USBRAM
|
||||
#define CFG_TUSB_MEM_ALIGN ATTR_ALIGNED(4)
|
||||
#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4)))
|
||||
|
||||
|
||||
#define BREAKPOINT_IGNORE_COUNT(n) \
|
||||
|
|
|
@ -40,13 +40,6 @@
|
|||
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
// from usb_desc.c for dynamic descriptor
|
||||
extern tusb_desc_device_t usb_desc_dev;
|
||||
extern usb_desc_cfg_t usb_desc_cfg;
|
||||
|
||||
// Serial string using unique Device ID
|
||||
extern uint16_t usb_desc_str_serial[1+16];
|
||||
|
||||
/* tinyusb function that handles power event (detected, ready, removed)
|
||||
* We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled. */
|
||||
extern void tusb_hal_nrf_power_event(uint32_t event);
|
||||
|
@ -94,26 +87,9 @@ void usb_init(bool cdc_only)
|
|||
tusb_hal_nrf_power_event(NRFX_POWER_USB_EVT_READY);
|
||||
}
|
||||
|
||||
if ( cdc_only )
|
||||
{
|
||||
// Change PID to CDC only
|
||||
usb_desc_dev.idProduct = USB_DESC_CDC_ONLY_PID;
|
||||
usb_desc_init(cdc_only);
|
||||
|
||||
// Remove MSC interface = reduce total interface + adjust config desc length
|
||||
usb_desc_cfg.config.bNumInterfaces--;
|
||||
usb_desc_cfg.config.wTotalLength -= sizeof(usb_desc_cfg.msc);
|
||||
}
|
||||
|
||||
// Create Serial string descriptor
|
||||
char tmp_serial[17];
|
||||
sprintf(tmp_serial, "%08lX%08lX", NRF_FICR->DEVICEID[1], NRF_FICR->DEVICEID[0]);
|
||||
|
||||
for(uint8_t i=0; i<16; i++)
|
||||
{
|
||||
usb_desc_str_serial[1+i] = tmp_serial[i];
|
||||
}
|
||||
|
||||
// Init tusb stack
|
||||
// Init TinyUSB stack
|
||||
tusb_init();
|
||||
}
|
||||
|
||||
|
@ -124,7 +100,7 @@ void usb_teardown(void)
|
|||
// Abort all transfers
|
||||
|
||||
// Disable pull up
|
||||
nrf_usbd_pullup_disable();
|
||||
nrf_usbd_pullup_disable(NRF_USBD);
|
||||
|
||||
// Disable Interrupt
|
||||
NVIC_DisableIRQ(USBD_IRQn);
|
||||
|
@ -132,7 +108,7 @@ void usb_teardown(void)
|
|||
// disable all interrupt
|
||||
NRF_USBD->INTENCLR = NRF_USBD->INTEN;
|
||||
|
||||
nrf_usbd_disable();
|
||||
nrf_usbd_disable(NRF_USBD);
|
||||
sd_clock_hfclk_release();
|
||||
|
||||
sd_power_usbdetected_enable(false);
|
||||
|
|
|
@ -24,15 +24,6 @@
|
|||
|
||||
#include "usb_desc.h"
|
||||
|
||||
|
||||
/*------------- Interface Numbering -------------*/
|
||||
enum {
|
||||
ITF_NUM_CDC = 0 ,
|
||||
ITF_NUM_CDC_DATA ,
|
||||
ITF_NUM_MSC ,
|
||||
ITF_NUM_TOTAL
|
||||
};
|
||||
|
||||
enum {
|
||||
ITF_STR_LANGUAGE = 0 ,
|
||||
ITF_STR_MANUFACTURER ,
|
||||
|
@ -42,59 +33,16 @@ enum {
|
|||
ITF_STR_MSC
|
||||
};
|
||||
|
||||
/*------------- Endpoint Numbering & Size -------------*/
|
||||
#define _EP_IN(x) (0x80 | (x))
|
||||
#define _EP_OUT(x) (x)
|
||||
|
||||
// CDC
|
||||
#define EP_CDC_NOTIF _EP_IN ( ITF_NUM_CDC+1 )
|
||||
#define EP_CDC_NOTIF_SIZE 8
|
||||
|
||||
#define EP_CDC_OUT _EP_OUT( ITF_NUM_CDC+2 )
|
||||
#define EP_CDC_IN _EP_IN ( ITF_NUM_CDC+2 )
|
||||
|
||||
// Mass Storage
|
||||
#define EP_MSC_OUT _EP_OUT( ITF_NUM_MSC+1 )
|
||||
#define EP_MSC_IN _EP_IN ( ITF_NUM_MSC+1 )
|
||||
|
||||
#define EP_MSC_SIZE 64
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// STRING DESCRIPTORS
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
#ifndef USB_STRING_DESCRIPTORS
|
||||
#define USB_STRING_DESCRIPTORS { \
|
||||
/* 0: is supported language = English */ \
|
||||
TUD_DESC_STRCONV(0x0409), \
|
||||
\
|
||||
/* 1: Manufacturer */ \
|
||||
TUD_DESC_STRCONV('A','d','a','f','r','u','i','t',' ','I','n','d','u','s','t','r','i','e','s'), \
|
||||
\
|
||||
/* 2: Product */ \
|
||||
TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','n','R','F','5','2','8','4','0', ' ', 'D','F','U'), \
|
||||
\
|
||||
/* 3: Serials TODO use chip ID */ \
|
||||
usb_desc_str_serial, \
|
||||
\
|
||||
/* 4: CDC Interface */ \
|
||||
TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','S','e','r','i','a','l'), \
|
||||
\
|
||||
/* 5: MSC Interface */ \
|
||||
TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','U','F','2'), \
|
||||
}
|
||||
#endif
|
||||
// CDC + MSC or CDC only mode
|
||||
static bool _cdc_only = false;
|
||||
|
||||
// Serial is 64-bit DeviceID -> 16 chars len
|
||||
uint16_t usb_desc_str_serial[1+16] = { TUD_DESC_STR_HEADER(16) };
|
||||
|
||||
// array of pointer to string descriptors
|
||||
uint16_t const * const string_desc_arr [] = USB_STRING_DESCRIPTORS;
|
||||
static char desc_str_serial[1+16];
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// Device Descriptor
|
||||
//--------------------------------------------------------------------+
|
||||
tusb_desc_device_t usb_desc_dev =
|
||||
tusb_desc_device_t desc_device =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_device_t),
|
||||
.bDescriptorType = TUSB_DESC_DEVICE,
|
||||
|
@ -118,187 +66,117 @@ tusb_desc_device_t usb_desc_dev =
|
|||
.bNumConfigurations = 0x01
|
||||
};
|
||||
|
||||
// Invoked when received GET DEVICE DESCRIPTOR
|
||||
// Application return pointer to descriptor
|
||||
uint8_t const * tud_descriptor_device_cb(void)
|
||||
{
|
||||
return (uint8_t const *) &desc_device;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// Configuration Descriptor
|
||||
//--------------------------------------------------------------------+
|
||||
usb_desc_cfg_t usb_desc_cfg =
|
||||
|
||||
enum {
|
||||
ITF_NUM_CDC = 0 ,
|
||||
ITF_NUM_CDC_DATA ,
|
||||
ITF_NUM_MSC ,
|
||||
ITF_NUM_TOTAL
|
||||
};
|
||||
|
||||
uint8_t const desc_configuration_cdc_msc[] =
|
||||
{
|
||||
.config =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_configuration_t),
|
||||
.bDescriptorType = TUSB_DESC_CONFIGURATION,
|
||||
.wTotalLength = sizeof(usb_desc_cfg_t),
|
||||
.bNumInterfaces = ITF_NUM_TOTAL,
|
||||
.bConfigurationValue = 1,
|
||||
.iConfiguration = 0x00,
|
||||
.bmAttributes = TUSB_DESC_CONFIG_ATT_BUS_POWER,
|
||||
.bMaxPower = TUSB_DESC_CONFIG_POWER_MA(100)
|
||||
},
|
||||
// Interface count, string index, total length, attribute, power in mA
|
||||
TUD_CONFIG_DESCRIPTOR(ITF_NUM_TOTAL, 0, TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
|
||||
|
||||
// IAD points to CDC Interfaces
|
||||
.cdc =
|
||||
{
|
||||
.iad =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_interface_assoc_t),
|
||||
.bDescriptorType = TUSB_DESC_INTERFACE_ASSOCIATION,
|
||||
// Interface number, string index, EP notification address and size, EP data address (out, in) and size.
|
||||
TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, ITF_STR_CDC, 0x81, 8, 0x02, 0x82, 64),
|
||||
|
||||
.bFirstInterface = ITF_NUM_CDC,
|
||||
.bInterfaceCount = 2,
|
||||
// Interface number, string index, EP Out & EP In address, EP size
|
||||
TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, ITF_STR_MSC, 0x03, 0x83, 64),
|
||||
};
|
||||
|
||||
.bFunctionClass = TUSB_CLASS_CDC,
|
||||
.bFunctionSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL,
|
||||
.bFunctionProtocol = CDC_COMM_PROTOCOL_ATCOMMAND,
|
||||
.iFunction = 0
|
||||
},
|
||||
uint8_t const desc_configuration_cdc_only[] =
|
||||
{
|
||||
// Interface count, string index, total length, attribute, power in mA
|
||||
TUD_CONFIG_DESCRIPTOR(ITF_NUM_TOTAL-1, 0, TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
|
||||
|
||||
//------------- CDC Communication Interface -------------//
|
||||
.comm_itf =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_interface_t),
|
||||
.bDescriptorType = TUSB_DESC_INTERFACE,
|
||||
.bInterfaceNumber = ITF_NUM_CDC,
|
||||
.bAlternateSetting = 0,
|
||||
.bNumEndpoints = 1,
|
||||
.bInterfaceClass = TUSB_CLASS_CDC,
|
||||
.bInterfaceSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL,
|
||||
.bInterfaceProtocol = CDC_COMM_PROTOCOL_ATCOMMAND,
|
||||
.iInterface = ITF_STR_CDC
|
||||
},
|
||||
|
||||
.header =
|
||||
{
|
||||
.bLength = sizeof(cdc_desc_func_header_t),
|
||||
.bDescriptorType = TUSB_DESC_CLASS_SPECIFIC,
|
||||
.bDescriptorSubType = CDC_FUNC_DESC_HEADER,
|
||||
.bcdCDC = 0x0120
|
||||
},
|
||||
|
||||
.call =
|
||||
{
|
||||
.bLength = sizeof(cdc_desc_func_call_management_t),
|
||||
.bDescriptorType = TUSB_DESC_CLASS_SPECIFIC,
|
||||
.bDescriptorSubType = CDC_FUNC_DESC_CALL_MANAGEMENT,
|
||||
.bmCapabilities = { 0 },
|
||||
.bDataInterface = ITF_NUM_CDC+1,
|
||||
},
|
||||
|
||||
.acm =
|
||||
{
|
||||
.bLength = sizeof(cdc_desc_func_acm_t),
|
||||
.bDescriptorType = TUSB_DESC_CLASS_SPECIFIC,
|
||||
.bDescriptorSubType = CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT,
|
||||
.bmCapabilities = { // 0x02
|
||||
.support_line_request = 1,
|
||||
}
|
||||
},
|
||||
|
||||
.union_func =
|
||||
{
|
||||
.bLength = sizeof(cdc_desc_func_union_t), // plus number of
|
||||
.bDescriptorType = TUSB_DESC_CLASS_SPECIFIC,
|
||||
.bDescriptorSubType = CDC_FUNC_DESC_UNION,
|
||||
.bControlInterface = ITF_NUM_CDC,
|
||||
.bSubordinateInterface = ITF_NUM_CDC+1,
|
||||
},
|
||||
|
||||
.ep_notif =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_endpoint_t),
|
||||
.bDescriptorType = TUSB_DESC_ENDPOINT,
|
||||
.bEndpointAddress = EP_CDC_NOTIF,
|
||||
.bmAttributes = { .xfer = TUSB_XFER_INTERRUPT },
|
||||
.wMaxPacketSize = { .size = EP_CDC_NOTIF_SIZE },
|
||||
.bInterval = 0x10
|
||||
},
|
||||
|
||||
//------------- CDC Data Interface -------------//
|
||||
.data_itf =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_interface_t),
|
||||
.bDescriptorType = TUSB_DESC_INTERFACE,
|
||||
.bInterfaceNumber = ITF_NUM_CDC+1,
|
||||
.bAlternateSetting = 0x00,
|
||||
.bNumEndpoints = 2,
|
||||
.bInterfaceClass = TUSB_CLASS_CDC_DATA,
|
||||
.bInterfaceSubClass = 0,
|
||||
.bInterfaceProtocol = 0,
|
||||
.iInterface = 0x00
|
||||
},
|
||||
|
||||
.ep_out =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_endpoint_t),
|
||||
.bDescriptorType = TUSB_DESC_ENDPOINT,
|
||||
.bEndpointAddress = EP_CDC_OUT,
|
||||
.bmAttributes = { .xfer = TUSB_XFER_BULK },
|
||||
.wMaxPacketSize = { .size = CFG_TUD_CDC_EPSIZE },
|
||||
.bInterval = 0
|
||||
},
|
||||
|
||||
.ep_in =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_endpoint_t),
|
||||
.bDescriptorType = TUSB_DESC_ENDPOINT,
|
||||
.bEndpointAddress = EP_CDC_IN,
|
||||
.bmAttributes = { .xfer = TUSB_XFER_BULK },
|
||||
.wMaxPacketSize = { .size = CFG_TUD_CDC_EPSIZE },
|
||||
.bInterval = 0
|
||||
},
|
||||
},
|
||||
|
||||
//------------- Mass Storage-------------//
|
||||
.msc =
|
||||
{
|
||||
.itf =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_interface_t),
|
||||
.bDescriptorType = TUSB_DESC_INTERFACE,
|
||||
.bInterfaceNumber = ITF_NUM_MSC,
|
||||
.bAlternateSetting = 0x00,
|
||||
.bNumEndpoints = 2,
|
||||
.bInterfaceClass = TUSB_CLASS_MSC,
|
||||
.bInterfaceSubClass = MSC_SUBCLASS_SCSI,
|
||||
.bInterfaceProtocol = MSC_PROTOCOL_BOT,
|
||||
.iInterface = ITF_STR_MSC
|
||||
},
|
||||
|
||||
.ep_out =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_endpoint_t),
|
||||
.bDescriptorType = TUSB_DESC_ENDPOINT,
|
||||
.bEndpointAddress = EP_MSC_OUT,
|
||||
.bmAttributes = { .xfer = TUSB_XFER_BULK },
|
||||
.wMaxPacketSize = { .size = EP_MSC_SIZE},
|
||||
.bInterval = 1
|
||||
},
|
||||
|
||||
.ep_in =
|
||||
{
|
||||
.bLength = sizeof(tusb_desc_endpoint_t),
|
||||
.bDescriptorType = TUSB_DESC_ENDPOINT,
|
||||
.bEndpointAddress = EP_MSC_IN,
|
||||
.bmAttributes = { .xfer = TUSB_XFER_BULK },
|
||||
.wMaxPacketSize = { .size = EP_MSC_SIZE },
|
||||
.bInterval = 1
|
||||
}
|
||||
}
|
||||
// Interface number, string index, EP notification address and size, EP data address (out, in) and size.
|
||||
TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, ITF_STR_CDC, 0x81, 8, 0x02, 0x82, 64),
|
||||
};
|
||||
|
||||
|
||||
// tud_desc_set is required by tinyusb stack
|
||||
// since CFG_TUD_DESC_AUTO is enabled, we only need to set string_arr
|
||||
tud_desc_set_t tud_desc_set =
|
||||
// Invoked when received GET CONFIGURATION DESCRIPTOR
|
||||
// Application return pointer to descriptor
|
||||
// Descriptor contents must exist long enough for transfer to complete
|
||||
uint8_t const * tud_descriptor_configuration_cb(uint8_t index)
|
||||
{
|
||||
.device = &usb_desc_dev,
|
||||
.config = &usb_desc_cfg,
|
||||
.string_arr = (uint8_t const **) string_desc_arr,
|
||||
.string_count = sizeof(string_desc_arr)/sizeof(string_desc_arr[0]),
|
||||
(void) index; // for multiple configurations
|
||||
return _cdc_only ? desc_configuration_cdc_only : desc_configuration_cdc_msc;
|
||||
}
|
||||
|
||||
.hid_report =
|
||||
{
|
||||
.generic = NULL,
|
||||
.boot_keyboard = NULL,
|
||||
.boot_mouse = NULL
|
||||
}
|
||||
// Enumerate as CDC + MSC or CDC only
|
||||
void usb_desc_init(bool cdc_only)
|
||||
{
|
||||
_cdc_only = cdc_only;
|
||||
|
||||
if ( cdc_only )
|
||||
{
|
||||
// Change PID to CDC only
|
||||
desc_device.idProduct = USB_DESC_CDC_ONLY_PID;
|
||||
}
|
||||
|
||||
// Create Serial string descriptor
|
||||
sprintf(desc_str_serial, "%08lX%08lX", NRF_FICR->DEVICEID[1], NRF_FICR->DEVICEID[0]);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// STRING DESCRIPTORS
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
// array of pointer to string descriptors
|
||||
char const* string_desc_arr [] =
|
||||
{
|
||||
(const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
|
||||
BLEDIS_MANUFACTURER, // 1: Manufacturer
|
||||
BLEDIS_MODEL, // 2: Product
|
||||
desc_str_serial, // 3: Serials, should use chip ID
|
||||
"nRF Serial", // 4: CDC Interface
|
||||
"nRF UF2", // 5: MSC Interface
|
||||
};
|
||||
|
||||
// up to 64 unicode characters
|
||||
static uint16_t _desc_str[64+1];
|
||||
|
||||
// Invoked when received GET STRING DESCRIPTOR request
|
||||
// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
|
||||
uint16_t const* tud_descriptor_string_cb(uint8_t index)
|
||||
{
|
||||
uint8_t chr_count;
|
||||
|
||||
if ( index == 0)
|
||||
{
|
||||
memcpy(&_desc_str[1], string_desc_arr[0], 2);
|
||||
chr_count = 1;
|
||||
}else
|
||||
{
|
||||
if ( !(index < sizeof(string_desc_arr)/sizeof(string_desc_arr[0])) ) return NULL;
|
||||
|
||||
// Convert ASCII string into UTF-16
|
||||
const char* str = string_desc_arr[index];
|
||||
|
||||
// Cap at max char
|
||||
chr_count = strlen(str);
|
||||
if ( chr_count > 31 ) chr_count = 31;
|
||||
|
||||
for(uint8_t i=0; i<chr_count; i++)
|
||||
{
|
||||
_desc_str[1+i] = str[i];
|
||||
}
|
||||
}
|
||||
|
||||
// first byte is length (including header), second byte is string type
|
||||
_desc_str[0] = (TUSB_DESC_STRING << 8 ) | (2*chr_count + 2);
|
||||
|
||||
return _desc_str;
|
||||
}
|
||||
|
|
|
@ -28,59 +28,18 @@
|
|||
#include "tusb.h"
|
||||
#include "boards.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void usb_desc_init(bool cdc_only);
|
||||
|
||||
#ifndef USB_DESC_VID
|
||||
#define USB_DESC_VID 0x239A
|
||||
#define USB_DESC_VID 0x239A
|
||||
#endif
|
||||
|
||||
#ifndef USB_DESC_UF2_PID
|
||||
#define USB_DESC_UF2_PID 0x0029
|
||||
#define USB_DESC_UF2_PID 0x0029
|
||||
#endif
|
||||
|
||||
#ifndef USB_DESC_CDC_ONLY_PID
|
||||
#define USB_DESC_CDC_ONLY_PID 0x002A
|
||||
#endif
|
||||
|
||||
|
||||
/*------------- Configuration Descriptor -------------*/
|
||||
typedef struct ATTR_PACKED
|
||||
{
|
||||
tusb_desc_configuration_t config;
|
||||
|
||||
//------------- CDC -------------//
|
||||
struct ATTR_PACKED
|
||||
{
|
||||
tusb_desc_interface_assoc_t iad;
|
||||
|
||||
//CDC Control Interface
|
||||
tusb_desc_interface_t comm_itf;
|
||||
cdc_desc_func_header_t header;
|
||||
cdc_desc_func_call_management_t call;
|
||||
cdc_desc_func_acm_t acm;
|
||||
cdc_desc_func_union_t union_func;
|
||||
tusb_desc_endpoint_t ep_notif;
|
||||
|
||||
//CDC Data Interface
|
||||
tusb_desc_interface_t data_itf;
|
||||
tusb_desc_endpoint_t ep_out;
|
||||
tusb_desc_endpoint_t ep_in;
|
||||
}cdc;
|
||||
|
||||
//------------- Mass Storage -------------//
|
||||
struct ATTR_PACKED
|
||||
{
|
||||
tusb_desc_interface_t itf;
|
||||
tusb_desc_endpoint_t ep_out;
|
||||
tusb_desc_endpoint_t ep_in;
|
||||
} msc;
|
||||
} usb_desc_cfg_t;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#define USB_DESC_CDC_ONLY_PID 0x002A
|
||||
#endif
|
||||
|
||||
#endif /* USB_DESC_H_ */
|
||||
|
|
|
@ -11,8 +11,13 @@ travis = False
|
|||
if "TRAVIS" in os.environ and os.environ["TRAVIS"] == "true":
|
||||
travis = True
|
||||
|
||||
success_count = 0
|
||||
fail_count = 0
|
||||
exit_status = 0
|
||||
|
||||
build_format = '| {:30} | {:9} '
|
||||
build_separator = '-' * 54
|
||||
|
||||
all_boards = []
|
||||
for entry in os.scandir("src/boards"):
|
||||
all_boards.append(entry.name)
|
||||
|
@ -21,6 +26,10 @@ for entry in os.scandir("src/boards"):
|
|||
|
||||
total_time = time.monotonic()
|
||||
|
||||
print(build_separator)
|
||||
print((build_format + '| {:5} |').format('Board', 'Result', 'Time'))
|
||||
print(build_separator)
|
||||
|
||||
for board in all_boards:
|
||||
bin_directory = "bin/{}/".format(board)
|
||||
os.makedirs(bin_directory, exist_ok=True)
|
||||
|
@ -28,10 +37,14 @@ for board in all_boards:
|
|||
start_time = time.monotonic()
|
||||
make_result = subprocess.run("make -j 4 BOARD={} combinehex genpkg".format(board), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
build_duration = time.monotonic() - start_time
|
||||
success = "\033[32msucceeded\033[0m"
|
||||
if make_result.returncode != 0:
|
||||
|
||||
if make_result.returncode == 0:
|
||||
success = "\033[32msucceeded\033[0m"
|
||||
success_count += 1
|
||||
else:
|
||||
exit_status = make_result.returncode
|
||||
success = "\033[31mfailed\033[0m"
|
||||
success = "\033[31mfailed\033[0m "
|
||||
fail_count += 1
|
||||
|
||||
for entry in os.scandir("_build-{}".format(board)):
|
||||
for extension in ["zip", "hex"]:
|
||||
|
@ -40,15 +53,18 @@ for board in all_boards:
|
|||
|
||||
if travis:
|
||||
print('travis_fold:start:build-{}\\r'.format(board))
|
||||
print("Build {} took {:.2f}s and {}".format(board, build_duration, success))
|
||||
|
||||
print((build_format + '| {:.2f}s |').format(board, success, build_duration))
|
||||
|
||||
if make_result.returncode != 0:
|
||||
print(make_result.stdout.decode("utf-8"))
|
||||
if travis:
|
||||
print('travis_fold:end:build-{}\\r'.format(board))
|
||||
|
||||
print()
|
||||
|
||||
# Build Summary
|
||||
total_time = time.monotonic() - total_time
|
||||
print("Total build time took {:.2f}s".format(total_time))
|
||||
print(build_separator)
|
||||
print("Build Sumamary: {} \033[32msucceeded\033[0m, {} \033[31mfailed\033[0m and took {:.2f}s".format(success_count, fail_count, total_time))
|
||||
print(build_separator)
|
||||
|
||||
sys.exit(exit_status)
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
# The MIT License (MIT)
|
||||
#
|
||||
# Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
|
||||
#
|
||||
# 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.
|
||||
"""
|
||||
`adafruit_adabot`
|
||||
====================================================
|
||||
|
||||
TODO(description)
|
||||
|
||||
* Author(s): Scott Shawcroft
|
||||
"""
|
||||
import os
|
||||
|
||||
import requests
|
||||
|
||||
|
||||
def _fix_url(url):
|
||||
if url.startswith("/"):
|
||||
url = "https://api.github.com" + url
|
||||
return url
|
||||
|
||||
def _fix_kwargs(kwargs):
|
||||
api_version = "application/vnd.github.scarlet-witch-preview+json;application/vnd.github.hellcat-preview+json"
|
||||
if "headers" in kwargs:
|
||||
if "Accept" in kwargs["headers"]:
|
||||
kwargs["headers"]["Accept"] += ";" + api_version
|
||||
else:
|
||||
kwargs["headers"]["Accept"] = api_version
|
||||
else:
|
||||
kwargs["headers"] = {"Accept": "application/vnd.github.hellcat-preview+json"}
|
||||
if "ADABOT_GITHUB_ACCESS_TOKEN" in os.environ and "auth" not in kwargs:
|
||||
access_token = os.environ["ADABOT_GITHUB_ACCESS_TOKEN"]
|
||||
if "params" in kwargs:
|
||||
kwargs["params"]["access_token"] = access_token
|
||||
else:
|
||||
kwargs["params"] = {"access_token": access_token}
|
||||
if "timeout" not in kwargs:
|
||||
kwargs["timeout"] = 30
|
||||
return kwargs
|
||||
|
||||
def get(url, **kwargs):
|
||||
response = requests.get(_fix_url(url), **_fix_kwargs(kwargs))
|
||||
remaining = int(response.headers["X-RateLimit-Remaining"])
|
||||
if remaining % 100 == 0:
|
||||
print(remaining, "requests remaining this hour")
|
||||
return response
|
||||
|
||||
def post(url, **kwargs):
|
||||
return requests.post(_fix_url(url), **_fix_kwargs(kwargs))
|
||||
|
||||
def put(url, **kwargs):
|
||||
return requests.put(_fix_url(url), **_fix_kwargs(kwargs))
|
||||
|
||||
def patch(url, **kwargs):
|
||||
return requests.patch(_fix_url(url), **_fix_kwargs(kwargs))
|
||||
|
||||
def delete(url, **kwargs):
|
||||
return requests.delete(_fix_url(url), **_fix_kwargs(kwargs))
|
|
@ -0,0 +1,35 @@
|
|||
#! /usr/bin/env python3
|
||||
|
||||
import os
|
||||
import os.path
|
||||
import sys
|
||||
import uritemplate
|
||||
|
||||
sys.path.append("adabot")
|
||||
import github_requests as github
|
||||
|
||||
exit_status = 0
|
||||
|
||||
for dirpath, dirnames, filenames in os.walk("../bin"):
|
||||
if not filenames:
|
||||
continue
|
||||
for filename in filenames:
|
||||
full_filename = os.path.join(dirpath, filename)
|
||||
label = filename.replace("adafruit-circuitpython-", "")
|
||||
url_vars = {}
|
||||
url_vars["name"] = filename
|
||||
url_vars["label"] = label
|
||||
url = uritemplate.expand(os.environ["UPLOAD_URL"], url_vars)
|
||||
headers = {"content-type": "application/octet-stream"}
|
||||
print(url)
|
||||
with open(full_filename, "rb") as f:
|
||||
response = github.post(url, data=f, headers=headers)
|
||||
if not response.ok:
|
||||
if response.status_code == 422 and response.json().get("errors", [{"code":""}])[0]["code"] == "already_exists":
|
||||
print("File already uploaded. Skipping.")
|
||||
continue
|
||||
print("Upload of {} failed with {}.".format(filename, response.status_code))
|
||||
print(response.text)
|
||||
sys.exit(response.status_code)
|
||||
|
||||
sys.exit(exit_status)
|
Loading…
Reference in New Issue